From bd0c4831c9505b63f91d37b879c6d6f8a1ae06b8 Mon Sep 17 00:00:00 2001 From: Lee Calcote Date: Wed, 25 Sep 2024 08:59:38 -0500 Subject: [PATCH] init: cleanup Signed-off-by: Lee Calcote --- ui/components/MesheryResults.js | 504 - ui/components/MesherySMIResults.js | 372 - ui/components/MesherySettings.js | 504 - ui/components/MesherySettingsEnvButtons.js | 323 - .../MesherySettingsPerformanceComponent.js | 345 - ui/components/MesherySnackbarWrapper.js | 369 - ui/components/Modal.js | 400 - ui/components/Modals/ImportModal.js | 40 - ui/components/Modals/Information/InfoModal.js | 522 - ui/components/Modals/Information/styles.js | 121 - ui/components/Modals/PublishModal.js | 59 - ui/components/Navigator.js | 1471 - ui/components/NavigatorExtension.js | 172 - ui/components/NodeDetails.js | 196 - ui/components/NotificationCenter/README.md | 57 - ui/components/NotificationCenter/constants.js | 60 - ui/components/NotificationCenter/filter.js | 47 - ui/components/NotificationCenter/index.js | 603 - ui/components/NotificationCenter/metadata.js | 498 - .../NotificationCenter/notification.js | 455 - .../notificationCenter.style.js | 108 - .../NotificationCenter/shared.style.js | 0 ui/components/PageContext.js | 35 - ui/components/Popup.js | 210 - ui/components/PromptComponent.js | 192 - ui/components/RJSFUtils/common.js | 35 - ui/components/ReactSelectWrapper.js | 206 - ui/components/RemoteComponent.js | 38 - ui/components/SistentWrapper.js | 20 - ui/components/SpacesSwitcher/SpaceSwitcher.js | 351 - ui/components/TroubleshootingComponent.js | 102 - .../TroubleshootingModalComponent.js | 375 - ui/components/TypingFilter/README.md | 131 - ui/components/TypingFilter/index.js | 315 - ui/components/TypingFilter/state.js | 154 - ui/components/TypingFilter/style.js | 54 - ui/components/TypingFilter/utils.js | 56 - ui/components/URLUploader.js | 118 - ui/components/UploadImport.js | 303 - ui/components/User.js | 259 - ui/components/UserPreferences/index.js | 802 - .../UserPreferences/spaces-preferences.js | 130 - ui/components/UserPreferences/style.js | 57 - .../VerticalCarousel/VerticalCarousel.js | 85 - ui/components/ViewSwitch.js | 39 - ui/components/VisibilityMenu/index.js | 104 - ui/components/YamlDialog.js | 83 - .../configuratorComponents/CodeEditor.js | 109 - .../CustomBreadCrumb.js | 78 - .../MeshModel/DesignerDrawerNodeShapes.js | 585 - .../MeshModel/LazyComponentForm.js | 112 - .../MeshModel/NodeIcon.js | 192 - .../MeshModel/hooks/types.js | 36 - .../MeshModel/hooks/useDesignLifecycle.js | 210 - .../configuratorComponents/MeshModel/index.js | 295 - .../MeshModel/styledComponents/AppBar.js | 12 - .../configuratorComponents/MeshModel/utils.js | 30 - .../configuratorComponents/NameToIcon.js | 53 - ui/components/connections/ConnectionChip.js | 366 - ui/components/connections/common/index.js | 52 - ui/components/connections/index.js | 1316 - .../meshSync/RegisterConnectionModal.js | 87 - .../meshSync/Stepper/Notification.js | 52 - .../meshSync/Stepper/StepperContent.js | 473 - .../meshSync/Stepper/StepperContentWrapper.js | 83 - .../connections/meshSync/Stepper/constants.js | 69 - .../connections/meshSync/Stepper/index.js | 116 - ui/components/connections/meshSync/index.js | 607 - ui/components/connections/metadata.js | 377 - ui/components/connections/styles.js | 251 - ui/components/extensions/adapters/adapters.js | 183 - .../extensions/adapters/constants.js | 116 - ui/components/extensions/adapters/index.js | 1 - ui/components/extensions/index.js | 1 - .../mutations/AdapterStatusMutation.js | 26 - .../mutations/OperatorStatusMutation.js | 20 - .../AdapterStatusMutation.graphql.js | 64 - .../AddonStatusMutation.graphql.js | 108 - .../OperatorStatusMutation.graphql.js | 64 - .../graphql/queries/AddonsStatusQuery.js | 17 - .../graphql/queries/CatalogFilterQuery.js | 24 - .../graphql/queries/CatalogPatternQuery.js | 23 - .../graphql/queries/ControlPlanesQuery.js | 23 - .../graphql/queries/DataPlanesQuery.js | 41 - .../graphql/queries/FetchAllResultsQuery.js | 32 - .../graphql/queries/MeshModelSummaryQuery.js | 26 - .../graphql/queries/MeshsyncStatusQuery.js | 18 - .../graphql/queries/NamespaceQuery.js | 16 - .../graphql/queries/NatsStatusQuery.js | 18 - .../graphql/queries/OperatorStatusQuery.js | 19 - .../queries/PerformanceProfilesQuery.js | 39 - .../graphql/queries/PerformanceResultQuery.js | 32 - .../graphql/queries/ResetDatabaseQuery.js | 15 - .../queries/TelemetryComponentsQuery.js | 17 - .../AddonsStatusQuery.graphql.js | 82 - .../CatalogFilterQuery.graphql.js | 131 - .../CatalogPatternQuery.graphql.js | 124 - .../ClusterResourcesQuery.graphql.js | 103 - .../ControlPlanesQuery.graphql.js | 109 - .../__generated__/DataPlanesQuery.graphql.js | 210 - .../DeployMeshSyncQuery.graphql.js | 64 - .../__generated__/DeployNatsQuery.graphql.js | 64 - .../FetchAllResultsQuery.graphql.js | 177 - .../MeshModelSummaryQuery.graphql.js | 104 - .../MeshsyncStatusQuery.graphql.js | 89 - .../__generated__/NamespaceQuery.graphql.js | 75 - .../__generated__/NatsStatusQuery.graphql.js | 89 - .../OperatorStatusQuery.graphql.js | 89 - .../PerformanceProfilesQuery.graphql.js | 226 - .../PerformanceResultQuery.graphql.js | 191 - .../ResetDatabaseQuery.graphql.js | 78 - .../TelemetryComponentsQuery.graphql.js | 89 - .../ClusterResourcesSubscription.js | 26 - .../ConfigurationSubscription.js | 62 - .../subscriptions/EventsSubscription.js | 33 - .../subscriptions/K8sContextSubscription.js | 34 - .../MeshModelSummarySubscription.js | 28 - .../MeshSyncEventsSubscription.js | 28 - .../MesheryControllersStatusSubscription.js | 23 - .../PerformanceProfilesSubscription.js | 41 - .../PerformanceResultSubscription.js | 34 - .../AddonStatusSubscription.graphql.js | 82 - .../BrokerStatusSubscription.graphql.js | 51 - .../ClusterResourcesSubscription.graphql.js | 103 - .../ConfigurationSubscription.graphql.js | 276 - .../ControlPlaneSubscription.graphql.js | 109 - .../DataPlanesSubscription.graphql.js | 210 - .../EventsSubscription.graphql.js | 153 - .../K8sContextSubscription.graphql.js | 170 - .../MeshModelSummarySubscription.graphql.js | 104 - .../MeshSyncEventsSubscription.graphql.js | 99 - .../MeshSyncStatusSubscription.graphql.js | 132 - ...ryControllersStatusSubscription.graphql.js | 96 - ...PerformanceProfilesSubscription.graphql.js | 226 - .../PerformanceResultSubscription.graphql.js | 191 - ui/components/hooks/useKubernetesHook.js | 301 - ui/components/hooks/useTelemetryHook.js | 72 - ui/components/hooks/useTestIDs.js | 7 - ui/components/layout.js | 11 - ui/components/load-test-timer-dialog.js | 59 - ui/components/multi-select-wrapper.js | 223 - ui/components/reusable-tooltip.js | 25 - ui/components/schemas/credentials/grafana.js | 30 - .../schemas/credentials/kubernetes.js | 69 - .../schemas/credentials/prometheus.js | 25 - ui/components/shapes/Octagon.js | 27 - ui/components/shapes/RoundedTriangle.js | 12 - ui/components/subscription/comparatorFns.js | 47 - ui/components/subscription/helpers.js | 35 - ui/components/subscription/index.js | 0 ui/components/subscription/mergeFns.js | 39 - .../subscription/subscriptionhandler.js | 52 - .../telemetry/grafana/GrafanaCharts.js | 130 - .../telemetry/grafana/GrafanaComponent.js | 461 - .../grafana/GrafanaConfigComponent.js | 121 - .../telemetry/grafana/GrafanaCustomChart.js | 892 - .../telemetry/grafana/GrafanaCustomCharts.js | 293 - .../grafana/GrafanaCustomGaugeChart.js | 120 - .../grafana/GrafanaDateRangePicker.js | 765 - .../grafana/GrafanaDisplaySelection.js | 76 - .../grafana/GrafanaMetricsCompare.js | 125 - .../grafana/GrafanaSelectionComponent.js | 391 - .../prometheus/PrometheusComponent.js | 352 - .../prometheus/PrometheusConfigComponent.js | 100 - .../PrometheusSelectionComponent.js | 466 - ui/constants/colors.js | 6 - ui/constants/common.js | 5 - ui/constants/endpoints.js | 12 - ui/constants/navigator.js | 62 - ui/css/disableComponent.styles.js | 25 - ui/css/grid.style.js | 1 - ui/css/icons.styles.js | 69 - ui/jsconfig.json | 17 - ui/lib/chartjs-formatter.js | 765 - ui/lib/data-fetch.js | 66 - ui/lib/event-types.js | 28 - ui/lib/path.js | 8 - ui/lib/prePopulatedOptions.js | 14 - ui/lib/relayEnvironment.js | 54 - ui/lib/store.js | 439 - ui/lib/trueRandom.js | 3 - ui/machines/operationsCenter.js | 87 - ui/machines/registry.js | 6 - ui/machines/validator/designValidator.js | 335 - ui/machines/validator/schemaValidator.js | 102 - .../validator/schemaValidatorWorker.js | 6 - ui/next.config.js | 54 - ui/nodemon.json | 5 - ui/package-lock.json | 27585 ---------------- ui/package.json | 146 - ui/pages/404.js | 29 - ui/pages/_app.js | 838 - ui/pages/_document.js | 137 - ui/pages/api/__coverage__.js | 5 - ui/pages/configuration/catalog.js | 52 - .../configuration/designs/configurator.js | 41 - ui/pages/configuration/designs/index.js | 37 - ui/pages/configuration/filters.js | 37 - ui/pages/connect/[...connection].js | 47 - ui/pages/extension/AccessMesheryModal.js | 125 - ui/pages/extension/[...component].js | 190 - ui/pages/extensions.js | 399 - ui/pages/index.js | 29 - ui/pages/management/adapter.js | 25 - ui/pages/management/connections.js | 24 - ui/pages/management/environments.js | 20 - ui/pages/management/workspaces.js | 20 - ui/pages/performance/index.js | 29 - ui/pages/performance/profiles.js | 29 - ui/pages/performance/results.js | 33 - ui/pages/settings.js | 33 - ui/pages/smi_results.js | 36 - ui/pages/styles/AnimatedFilter.css | 35 - ui/pages/styles/AnimatedMeshPattern.css | 89 - ui/pages/styles/AnimatedMeshSync.css | 92 - ui/pages/styles/AnimatedMeshery.css | 256 - ui/pages/styles/charts.css | 4 - ui/pages/system/connections.js | 47 - ui/pages/user/preferences.js | 72 - ui/playwright.config.js | 94 - ui/public/static/favicon.png | Bin 10968 -> 0 bytes .../fonts/qanelas-soft/QanelasSoftBlack.otf | Bin 106200 -> 0 bytes .../qanelas-soft/QanelasSoftBlackItalic.otf | Bin 142716 -> 0 bytes .../fonts/qanelas-soft/QanelasSoftBold.otf | Bin 102012 -> 0 bytes .../qanelas-soft/QanelasSoftBoldItalic.otf | Bin 138512 -> 0 bytes .../qanelas-soft/QanelasSoftExtraBold.otf | Bin 73236 -> 0 bytes .../QanelasSoftExtraBoldItalic.otf | Bin 123456 -> 0 bytes .../fonts/qanelas-soft/QanelasSoftHeavy.otf | Bin 74084 -> 0 bytes .../qanelas-soft/QanelasSoftHeavyItalic.otf | Bin 121124 -> 0 bytes .../fonts/qanelas-soft/QanelasSoftLight.otf | Bin 108092 -> 0 bytes .../qanelas-soft/QanelasSoftLightItalic.otf | Bin 131836 -> 0 bytes .../fonts/qanelas-soft/QanelasSoftMedium.otf | Bin 102840 -> 0 bytes .../qanelas-soft/QanelasSoftMediumItalic.otf | Bin 139916 -> 0 bytes .../fonts/qanelas-soft/QanelasSoftRegular.otf | Bin 72560 -> 0 bytes .../qanelas-soft/QanelasSoftRegularItalic.otf | Bin 117368 -> 0 bytes .../qanelas-soft/QanelasSoftSemiBold.otf | Bin 89516 -> 0 bytes .../QanelasSoftSemiBoldItalic.otf | Bin 133148 -> 0 bytes .../fonts/qanelas-soft/QanelasSoftThin.otf | Bin 92268 -> 0 bytes .../qanelas-soft/QanelasSoftThinItalic.otf | Bin 118000 -> 0 bytes .../qanelas-soft/QanelasSoftUltraLight.otf | Bin 105280 -> 0 bytes .../QanelasSoftUltraLightItalic.otf | Bin 129656 -> 0 bytes ui/public/static/img/CloneIcon.js | 19 - ui/public/static/img/UndeployIcon.js | 13 - ui/public/static/img/all_mesh.svg | 1 - ui/public/static/img/app_mesh-light.svg | 72 - ui/public/static/img/app_mesh.svg | 52 - ui/public/static/img/artifact-hub-color.svg | 1 - ui/public/static/img/aws-light.svg | 292 - ui/public/static/img/aws.svg | 292 - .../static/img/cilium_service_mesh-light.svg | 16 - ui/public/static/img/cilium_service_mesh.svg | 16 - .../static/img/citrix_service_mesh-light.svg | 1 - .../static/img/citrix_service_mesh-white.svg | 1 - ui/public/static/img/citrix_service_mesh.svg | 1 - ui/public/static/img/citrixservicemesh.svg | 1 - ui/public/static/img/clone-white.svg | 10 - ui/public/static/img/clone.svg | 11 - ui/public/static/img/component-svg/_.txt | 7 - .../kubernetes/cluster-role-binding.svg | 6 - .../component-svg/kubernetes/cluster-role.svg | 6 - .../img/component-svg/kubernetes/core-dns.svg | 2 - .../img/component-svg/kubernetes/cronjob.svg | 9 - .../component-svg/kubernetes/daemonset.svg | 6 - .../img/component-svg/kubernetes/etcd.svg | 2 - .../component-svg/kubernetes/kubernetes.svg | 9 - .../component-svg/kubernetes/matchLabels.svg | 4 - .../component-svg/kubernetes/namespace.svg | 6 - .../img/component-svg/kubernetes/secret.svg | 10 - .../kubernetes/security-account.svg | 5 - .../img/component-svg/kubernetes/volume.svg | 2 - .../static/img/component-svg/meshery.svg | 34 - .../static/img/component-svg/meshsync.svg | 22 - ui/public/static/img/component-svg/nats.svg | 2 - .../img/component-svg/operator-light.svg | 2 - .../component-svg/service-mesh/appmesh.svg | 22 - .../img/component-svg/service-mesh/cilium.svg | 10 - .../img/component-svg/service-mesh/consul.svg | 19 - .../img/component-svg/service-mesh/istio.svg | 13 - .../img/component-svg/service-mesh/kuma.svg | 12 - .../component-svg/service-mesh/linkerd.svg | 13 - .../img/component-svg/service-mesh/nginx.svg | 12 - .../img/component-svg/service-mesh/osm.svg | 23 - .../service-mesh/traefik-mesh.svg | 4 - ui/public/static/img/configuration_trans.svg | 1 - ui/public/static/img/connection-light.svg | 39 - ui/public/static/img/connection.svg | 39 - .../connection-wizard-green.svg | 1 - .../connection-wizard-white.svg | 1 - .../static/img/connection_wizard/nav_icon.png | Bin 3019 -> 0 bytes ui/public/static/img/consul-light.svg | 1 - ui/public/static/img/consul-white.svg | 1 - ui/public/static/img/consul.svg | 1 - ui/public/static/img/dashboard-screenshot.png | Bin 420324 -> 0 bytes ui/public/static/img/designer.png | Bin 393989 -> 0 bytes ui/public/static/img/docker.svg | 1 - ui/public/static/img/docker_compose.svg | 232 - .../img/drawer-icons/application_svg.js | 18 - .../drawer-icons/configuration_hover_svg.js | 10 - .../img/drawer-icons/conformance_hover_svg.js | 39 - .../img/drawer-icons/conformance_svg.js | 36 - .../img/drawer-icons/discuss_forum_svg.js | 46 - .../static/img/drawer-icons/extensions_svg.js | 36 - .../static/img/drawer-icons/filter_svg.js | 22 - .../img/drawer-icons/lifecycle_hover_svg.js | 10 - .../img/drawer-icons/lifecycle_mgmt_svg.js | 7 - .../static/img/drawer-icons/pattern_svg.js | 5 - .../img/drawer-icons/performance-icon_svg.js | 81 - .../img/drawer-icons/performance_hover_svg.js | 11 - .../img/drawer-icons/performance_svg.js | 53 - .../servicemeshinterface-icon-white_svg.js | 23 - .../img/drawer-icons/smp-white-text_svg.js | 5 - ui/public/static/img/environment-light.svg | 6 - ui/public/static/img/environment.svg | 6 - ui/public/static/img/github.svg | 1 - ui/public/static/img/github_black.svg | 1 - ui/public/static/img/grafana_icon.svg | 1 - ui/public/static/img/helm_chart-light.svg | 1 - ui/public/static/img/helm_chart-white.svg | 12 - ui/public/static/img/helm_chart.svg | 1 - ui/public/static/img/istio-light.svg | 1 - ui/public/static/img/istio-white.svg | 1 - ui/public/static/img/istio.svg | 1 - ui/public/static/img/kubernetes.svg | 1 - .../static/img/kubernetes_manifest-light.svg | 1 - ui/public/static/img/kubernetes_manifest.svg | 1 - ui/public/static/img/kuma-light.svg | 1 - ui/public/static/img/kuma-white.svg | 1 - ui/public/static/img/kuma.svg | 1 - ui/public/static/img/linkerd-light.svg | 1 - ui/public/static/img/linkerd-white.svg | 1 - ui/public/static/img/linkerd.svg | 1 - ui/public/static/img/load-test/fortio.svg | 12 - ui/public/static/img/load-test/nighthawk.svg | 1 - ui/public/static/img/load-test/wrk2.svg | 4 - ui/public/static/img/logs.svg | 3 - .../img/meshery-logo-light-text-side.png | Bin 9785 -> 0 bytes .../static/img/meshery-logo-light-text.svg | 37 - ui/public/static/img/meshery-logo-text.png | Bin 2814 -> 0 bytes ui/public/static/img/meshery-logo-text.svg | 37 - ui/public/static/img/meshery-logo.png | Bin 10916 -> 0 bytes .../static/img/meshery-logo/meshery-black.svg | 9 - .../img/meshery-logo/meshery-dark-text.png | Bin 3354 -> 0 bytes .../meshery-logo/meshery-logo-dark-text.png | Bin 16183 -> 0 bytes .../img/meshery-logo/meshery-logo-dark.png | Bin 13032 -> 0 bytes .../meshery-logo/meshery-logo-light-text.png | Bin 15303 -> 0 bytes .../img/meshery-logo/meshery-logo-shadow.svg | 1 - .../meshery-logo/meshery-logo-white-text.png | Bin 31511 -> 0 bytes .../img/meshery-logo/meshery-logo-white.png | Bin 12947 -> 0 bytes .../static/img/meshery-logo/meshery-logo.svg | 1 - .../img/meshery-logo/meshery-text-dark.png | Bin 3398 -> 0 bytes .../img/meshery-logo/meshery-text-white.png | Bin 5728 -> 0 bytes .../static/img/meshery-logo/meshery-white.png | Bin 4058 -> 0 bytes .../static/img/meshery-logo/meshery-white.svg | 9 - ui/public/static/img/meshery-nighthawk.svg | 1 - ui/public/static/img/meshery-operator.svg | 1 - ui/public/static/img/meshery_catalog.svg | 30 - .../static/img/meshmap-snapshot-logo.svg | 35 - ui/public/static/img/meshmap.svg | 27 - ui/public/static/img/meshsync-white.svg | 1 - ui/public/static/img/meshsync.svg | 1 - .../model-categories/dark/analytics-dark.svg | 4 - .../img/model-categories/dark/apps-dark.svg | 12 - .../dark/cloud-native-application-dark.svg | 14 - .../dark/cloud-native-network-dark.svg | 12 - .../model-categories/dark/database-dark.svg | 4 - .../dark/database-storage-dark.svg | 4 - .../dark/machine-learning-dark.svg | 20 - .../dark/observability-analysis-dark.svg | 16 - .../dark/orchestration-management-dark.svg | 4 - .../img/model-categories/dark/other-dark.svg | 3 - .../model-categories/dark/platform-dark.svg | 4 - .../dark/provisioning-dark.svg | 6 - .../model-categories/dark/runtime-dark.svg | 13 - .../model-categories/dark/serverless-dark.svg | 16 - .../img/model-categories/dark/tools-dark.svg | 10 - .../label-green/analytics-label-green.svg | 11 - ...app-definition-development-label-green.svg | 17 - .../cloud-native-application-label-green.svg | 37 - .../cloud-native-network-label-green.svg | 17 - .../label-green/database-label-green.svg | 11 - .../database-storage-label-green.svg | 11 - .../machine-learning-label-green.svg | 33 - .../observability-analysis-label-green.svg | 27 - .../orchestration-management-label-green.svg | 11 - .../label-green/other-label-green.svg | 10 - .../label-green/platform-label-green.svg | 11 - .../label-green/provisioning-label-green.svg | 12 - .../label-green/runtime-label-green.svg | 24 - .../label-green/serverless-label-green.svg | 21 - .../label-green/tools-label-green.svg | 10 - .../label/analytics-label.svg | 11 - .../app-definition-development-label.svg | 17 - .../label/cloud-native-application-label.svg | 19 - .../label/cloud-native-network-label.svg | 17 - .../label/cloud-native-storage-label.svg | 11 - .../model-categories/label/database-label.svg | 11 - .../label/machine-learning-label.svg | 29 - .../label/observability-analysis-label.svg | 21 - .../label/orchestration-management-label.svg | 11 - .../model-categories/label/other-label.svg | 4 - .../model-categories/label/platform-label.svg | 11 - .../label/provisioning-label.svg | 16 - .../model-categories/label/runtime-label.svg | 24 - .../label/security-compliance-label.svg | 15 - .../label/serverless-label.svg | 21 - .../label/service-mesh-label.svg | 17 - .../model-categories/label/tools-label.svg | 10 - .../label/uncategorized-label.svg | 10 - .../light/analytics-light.svg | 4 - .../img/model-categories/light/apps-light.svg | 12 - .../light/cloud-native-application-light.svg | 14 - .../light/cloud-native-network-light.svg | 12 - .../model-categories/light/database-light.svg | 4 - .../light/database-storage-light.svg | 4 - .../light/machine-learning-light.svg | 20 - .../light/observability-analysis-light.svg | 16 - .../light/orchestration-management-light.svg | 4 - .../model-categories/light/other-light.svg | 3 - .../model-categories/light/platform-light.svg | 4 - .../light/provisioning-light.svg | 6 - .../model-categories/light/runtime-light.svg | 13 - .../light/serverless-light.svg | 16 - .../model-categories/light/tools-light.svg | 10 - .../white/analytics-white.svg | 4 - .../img/model-categories/white/apps-white.svg | 12 - .../white/cloud-native-application-white.svg | 14 - .../white/cloud-native-network-white.svg | 12 - .../white/database-storage-white.svg | 4 - .../model-categories/white/database-white.svg | 4 - .../white/machine-learning-white.svg | 26 - .../white/observability-analysis-white.svg | 16 - .../white/orchestration-management-white.svg | 4 - .../model-categories/white/other-white.svg | 3 - .../model-categories/white/platform-white.svg | 4 - .../white/provisioning-white.svg | 6 - .../model-categories/white/runtime-white.svg | 13 - .../white/serverless-white.svg | 16 - .../model-categories/white/tools-white.svg | 10 - ui/public/static/img/nats-icon-color.svg | 1 - .../static/img/network_service_mesh-light.svg | 1 - .../static/img/network_service_mesh-white.svg | 1 - ui/public/static/img/network_service_mesh.svg | 1 - ui/public/static/img/networkservicemesh.svg | 1 - ui/public/static/img/nginx-light.svg | 1 - ui/public/static/img/nginx.svg | 1 - .../static/img/nginx_service_mesh-light.svg | 1 - ui/public/static/img/nginx_service_mesh.svg | 1 - ui/public/static/img/nighthawk-logo.svg | 1 - ui/public/static/img/nighthawk-logo_white.svg | 1 - ui/public/static/img/octarine-light.svg | 1 - ui/public/static/img/octarine-white.svg | 1 - ui/public/static/img/octarine.svg | 1 - .../static/img/open_service_mesh-light.svg | 1 - .../static/img/open_service_mesh-white.svg | 1 - ui/public/static/img/open_service_mesh.svg | 1 - ui/public/static/img/openservicemesh.svg | 1 - ui/public/static/img/pattcolor.svg | 1 - ui/public/static/img/pattern_trans.svg | 1 - ui/public/static/img/performance.svg | 1 - ui/public/static/img/private.svg | 4 - .../img/prometheus_logo_orange_circle.svg | 1 - ui/public/static/img/public.svg | 4 - ui/public/static/img/published.svg | 11 - ui/public/static/img/service-mesh-pattern.png | Bin 71088 -> 0 bytes ui/public/static/img/service-mesh.svg | 1 - ui/public/static/img/smc-checklist.svg | 1 - .../static/img/smi-conformance-no-trim.svg | 86 - .../static/img/smi-conformance-small.svg | 39 - ui/public/static/img/smi-white.svg | 1 - ui/public/static/img/smi.png | Bin 2810 -> 0 bytes ui/public/static/img/smp-dark.svg | 1 - ui/public/static/img/terminal.svg | 8 - ui/public/static/img/traefik_mesh-light.svg | 23 - ui/public/static/img/traefik_mesh.svg | 1 - ui/public/static/img/web-applications.svg | 1 - ui/public/static/img/web-filters.svg | 1 - ui/public/static/img/workspace-light.svg | 16 - ui/public/static/img/workspace.svg | 16 - ...mespace_discovery_relationship_policy.wasm | Bin 135804 -> 0 bytes ui/public/static/style/index.css | 10 - ui/relay.config.js | 12 - ui/remote-component.config.js | 154 - ui/rtk-query/ability.js | 43 - ui/rtk-query/connection.js | 104 - ui/rtk-query/design.js | 135 - ui/rtk-query/environments.js | 116 - ui/rtk-query/filter.js | 81 - ui/rtk-query/index.js | 21 - ui/rtk-query/mesh.js | 11 - ui/rtk-query/meshModel.js | 197 - ui/rtk-query/meshsync.js | 62 - ui/rtk-query/notificationCenter.js | 204 - ui/rtk-query/orgRoles.js | 15 - ui/rtk-query/organization.js | 26 - ui/rtk-query/performance-profile.js | 86 - ui/rtk-query/providerRoles.js | 15 - ui/rtk-query/schema.js | 14 - ui/rtk-query/system.js | 24 - ui/rtk-query/user.js | 87 - ui/rtk-query/userKeys.js | 26 - ui/rtk-query/utils.js | 23 - ui/rtk-query/webhook.js | 15 - ui/rtk-query/workspace.js | 135 - ui/store/hooks.js | 8 - ui/store/index.js | 13 - ui/store/slices/events.js | 226 - ui/store/slices/globalEnvironmentContext.js | 112 - ui/tests/e2e/auth.setup.js | 39 - ui/tests/e2e/connections.spec.js | 227 - ui/tests/e2e/custom-playwright-reporter.js | 148 - ui/tests/e2e/dashboard.spec.js | 29 - ui/tests/e2e/delays.js | 8 - ui/tests/e2e/env.js | 51 - ui/tests/e2e/fixtures/pages.js | 86 - ui/tests/e2e/fixtures/performancePage.js | 101 - ui/tests/e2e/indexui.spec.js | 25 - ui/tests/e2e/reporterSummary.md | 26 - ui/tests/e2e/service_mesh_lifecycle.spec.js | 74 - ui/tests/e2e/service_mesh_performance.spec.js | 62 - ui/tests/e2e/settings.spec.js | 89 - ui/tests/e2e/userpreference.spec.js | 86 - ui/tests/e2e/utils/fetch.js | 35 - ui/tests/e2e/utils/inspectXstate.js | 57 - ui/tests/e2e/utils/waitFor.js | 24 - ui/tests/samples/helmCharts.js | 11 - ui/tests/samples/kubernetsManifests.js | 11 - ui/tests/samples/seededDesigns.js | 71 - ui/tests/seed-data/Datadog agent on k8's | 206 - .../seed-data/Design With Validation Errors | 546 - ui/themes/app.js | 694 - ui/themes/configurationTableTheme.js | 89 - ui/themes/hooks.js | 49 - ui/themes/index.js | 14 - ui/themes/rjsf.js | 443 - ui/ui.config.js | 5 - ui/ui_dev_server.js | 51 - ui/utils/Elements.js | 35 - ui/utils/Enum.js | 119 - ui/utils/ExtensionPointSchemaValidator.js | 147 - ui/utils/PascalCaseToKebab.js | 18 - ui/utils/TooltipButton.js | 12 - ui/utils/URLValidator.js | 14 - ui/utils/camelCaseToSentanceCase.js | 3 - ui/utils/can.js | 19 - ui/utils/charts.js | 38 - ui/utils/context/dynamicContext.js | 23 - ui/utils/context/schemaSet.js | 4 - ui/utils/custom-column.js | 152 - ui/utils/custom-filter.js | 174 - ui/utils/custom-search.js | 150 - ui/utils/cypress-gql/graphql-test-utils.js | 22 - ui/utils/data-table.js | 124 - ui/utils/debounce.js | 17 - ui/utils/dimension.js | 52 - ui/utils/disabledComponents.js | 79 - ui/utils/fallback.js | 7 - ui/utils/fileDownloader.js | 40 - ui/utils/hooks/useMeshModelComponents.js | 212 - ui/utils/hooks/useNotification.js | 113 - .../hooks/usePreventUserFromLeavingPage.js | 43 - ui/utils/hooks/useStateCB.js | 31 - ui/utils/k8s-utils.js | 254 - ui/utils/lightenOrDarkenColor.js | 37 - ui/utils/multi-ctx.js | 177 - ui/utils/nameMapper.js | 53 - ui/utils/normalizeURI.js | 14 - ui/utils/objects.js | 49 - ui/utils/permission_constants.js | 413 - ui/utils/responsive-column.js | 50 - ui/utils/theme.js | 0 ui/utils/utils.js | 445 - ui/utils/versionSort.js | 152 - ui/utils/webApis.js | 66 - ui/utils/workloadFilter.js | 31 - ui/utils/zIndex.js | 16 - 575 files changed, 72493 deletions(-) delete mode 100644 ui/components/MesheryResults.js delete mode 100644 ui/components/MesherySMIResults.js delete mode 100644 ui/components/MesherySettings.js delete mode 100644 ui/components/MesherySettingsEnvButtons.js delete mode 100644 ui/components/MesherySettingsPerformanceComponent.js delete mode 100644 ui/components/MesherySnackbarWrapper.js delete mode 100644 ui/components/Modal.js delete mode 100644 ui/components/Modals/ImportModal.js delete mode 100644 ui/components/Modals/Information/InfoModal.js delete mode 100644 ui/components/Modals/Information/styles.js delete mode 100644 ui/components/Modals/PublishModal.js delete mode 100644 ui/components/Navigator.js delete mode 100644 ui/components/NavigatorExtension.js delete mode 100644 ui/components/NodeDetails.js delete mode 100644 ui/components/NotificationCenter/README.md delete mode 100644 ui/components/NotificationCenter/constants.js delete mode 100644 ui/components/NotificationCenter/filter.js delete mode 100644 ui/components/NotificationCenter/index.js delete mode 100644 ui/components/NotificationCenter/metadata.js delete mode 100644 ui/components/NotificationCenter/notification.js delete mode 100644 ui/components/NotificationCenter/notificationCenter.style.js delete mode 100644 ui/components/NotificationCenter/shared.style.js delete mode 100644 ui/components/PageContext.js delete mode 100644 ui/components/Popup.js delete mode 100644 ui/components/PromptComponent.js delete mode 100644 ui/components/RJSFUtils/common.js delete mode 100644 ui/components/ReactSelectWrapper.js delete mode 100644 ui/components/RemoteComponent.js delete mode 100644 ui/components/SistentWrapper.js delete mode 100644 ui/components/SpacesSwitcher/SpaceSwitcher.js delete mode 100644 ui/components/TroubleshootingComponent.js delete mode 100644 ui/components/TroubleshootingModalComponent.js delete mode 100644 ui/components/TypingFilter/README.md delete mode 100644 ui/components/TypingFilter/index.js delete mode 100644 ui/components/TypingFilter/state.js delete mode 100644 ui/components/TypingFilter/style.js delete mode 100644 ui/components/TypingFilter/utils.js delete mode 100644 ui/components/URLUploader.js delete mode 100644 ui/components/UploadImport.js delete mode 100644 ui/components/User.js delete mode 100644 ui/components/UserPreferences/index.js delete mode 100644 ui/components/UserPreferences/spaces-preferences.js delete mode 100644 ui/components/UserPreferences/style.js delete mode 100644 ui/components/VerticalCarousel/VerticalCarousel.js delete mode 100644 ui/components/ViewSwitch.js delete mode 100644 ui/components/VisibilityMenu/index.js delete mode 100644 ui/components/YamlDialog.js delete mode 100644 ui/components/configuratorComponents/CodeEditor.js delete mode 100644 ui/components/configuratorComponents/CustomBreadCrumb.js delete mode 100644 ui/components/configuratorComponents/MeshModel/DesignerDrawerNodeShapes.js delete mode 100644 ui/components/configuratorComponents/MeshModel/LazyComponentForm.js delete mode 100644 ui/components/configuratorComponents/MeshModel/NodeIcon.js delete mode 100644 ui/components/configuratorComponents/MeshModel/hooks/types.js delete mode 100644 ui/components/configuratorComponents/MeshModel/hooks/useDesignLifecycle.js delete mode 100644 ui/components/configuratorComponents/MeshModel/index.js delete mode 100644 ui/components/configuratorComponents/MeshModel/styledComponents/AppBar.js delete mode 100644 ui/components/configuratorComponents/MeshModel/utils.js delete mode 100644 ui/components/configuratorComponents/NameToIcon.js delete mode 100644 ui/components/connections/ConnectionChip.js delete mode 100644 ui/components/connections/common/index.js delete mode 100644 ui/components/connections/index.js delete mode 100644 ui/components/connections/meshSync/RegisterConnectionModal.js delete mode 100644 ui/components/connections/meshSync/Stepper/Notification.js delete mode 100644 ui/components/connections/meshSync/Stepper/StepperContent.js delete mode 100644 ui/components/connections/meshSync/Stepper/StepperContentWrapper.js delete mode 100644 ui/components/connections/meshSync/Stepper/constants.js delete mode 100644 ui/components/connections/meshSync/Stepper/index.js delete mode 100644 ui/components/connections/meshSync/index.js delete mode 100644 ui/components/connections/metadata.js delete mode 100644 ui/components/connections/styles.js delete mode 100644 ui/components/extensions/adapters/adapters.js delete mode 100644 ui/components/extensions/adapters/constants.js delete mode 100644 ui/components/extensions/adapters/index.js delete mode 100644 ui/components/extensions/index.js delete mode 100644 ui/components/graphql/mutations/AdapterStatusMutation.js delete mode 100644 ui/components/graphql/mutations/OperatorStatusMutation.js delete mode 100644 ui/components/graphql/mutations/__generated__/AdapterStatusMutation.graphql.js delete mode 100644 ui/components/graphql/mutations/__generated__/AddonStatusMutation.graphql.js delete mode 100644 ui/components/graphql/mutations/__generated__/OperatorStatusMutation.graphql.js delete mode 100644 ui/components/graphql/queries/AddonsStatusQuery.js delete mode 100644 ui/components/graphql/queries/CatalogFilterQuery.js delete mode 100644 ui/components/graphql/queries/CatalogPatternQuery.js delete mode 100644 ui/components/graphql/queries/ControlPlanesQuery.js delete mode 100644 ui/components/graphql/queries/DataPlanesQuery.js delete mode 100644 ui/components/graphql/queries/FetchAllResultsQuery.js delete mode 100644 ui/components/graphql/queries/MeshModelSummaryQuery.js delete mode 100644 ui/components/graphql/queries/MeshsyncStatusQuery.js delete mode 100644 ui/components/graphql/queries/NamespaceQuery.js delete mode 100644 ui/components/graphql/queries/NatsStatusQuery.js delete mode 100644 ui/components/graphql/queries/OperatorStatusQuery.js delete mode 100644 ui/components/graphql/queries/PerformanceProfilesQuery.js delete mode 100644 ui/components/graphql/queries/PerformanceResultQuery.js delete mode 100644 ui/components/graphql/queries/ResetDatabaseQuery.js delete mode 100644 ui/components/graphql/queries/TelemetryComponentsQuery.js delete mode 100644 ui/components/graphql/queries/__generated__/AddonsStatusQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/CatalogFilterQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/CatalogPatternQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/ClusterResourcesQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/ControlPlanesQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/DataPlanesQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/DeployMeshSyncQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/DeployNatsQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/FetchAllResultsQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/MeshModelSummaryQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/MeshsyncStatusQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/NamespaceQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/NatsStatusQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/OperatorStatusQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/PerformanceProfilesQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/PerformanceResultQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/ResetDatabaseQuery.graphql.js delete mode 100644 ui/components/graphql/queries/__generated__/TelemetryComponentsQuery.graphql.js delete mode 100644 ui/components/graphql/subscriptions/ClusterResourcesSubscription.js delete mode 100644 ui/components/graphql/subscriptions/ConfigurationSubscription.js delete mode 100644 ui/components/graphql/subscriptions/EventsSubscription.js delete mode 100644 ui/components/graphql/subscriptions/K8sContextSubscription.js delete mode 100644 ui/components/graphql/subscriptions/MeshModelSummarySubscription.js delete mode 100644 ui/components/graphql/subscriptions/MeshSyncEventsSubscription.js delete mode 100644 ui/components/graphql/subscriptions/MesheryControllersStatusSubscription.js delete mode 100644 ui/components/graphql/subscriptions/PerformanceProfilesSubscription.js delete mode 100644 ui/components/graphql/subscriptions/PerformanceResultSubscription.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/AddonStatusSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/BrokerStatusSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/ClusterResourcesSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/ConfigurationSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/ControlPlaneSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/DataPlanesSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/EventsSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/K8sContextSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/MeshModelSummarySubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/MeshSyncEventsSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/MeshSyncStatusSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/MesheryControllersStatusSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/PerformanceProfilesSubscription.graphql.js delete mode 100644 ui/components/graphql/subscriptions/__generated__/PerformanceResultSubscription.graphql.js delete mode 100644 ui/components/hooks/useKubernetesHook.js delete mode 100644 ui/components/hooks/useTelemetryHook.js delete mode 100644 ui/components/hooks/useTestIDs.js delete mode 100644 ui/components/layout.js delete mode 100644 ui/components/load-test-timer-dialog.js delete mode 100644 ui/components/multi-select-wrapper.js delete mode 100644 ui/components/reusable-tooltip.js delete mode 100644 ui/components/schemas/credentials/grafana.js delete mode 100644 ui/components/schemas/credentials/kubernetes.js delete mode 100644 ui/components/schemas/credentials/prometheus.js delete mode 100644 ui/components/shapes/Octagon.js delete mode 100644 ui/components/shapes/RoundedTriangle.js delete mode 100644 ui/components/subscription/comparatorFns.js delete mode 100644 ui/components/subscription/helpers.js delete mode 100644 ui/components/subscription/index.js delete mode 100644 ui/components/subscription/mergeFns.js delete mode 100644 ui/components/subscription/subscriptionhandler.js delete mode 100644 ui/components/telemetry/grafana/GrafanaCharts.js delete mode 100644 ui/components/telemetry/grafana/GrafanaComponent.js delete mode 100644 ui/components/telemetry/grafana/GrafanaConfigComponent.js delete mode 100644 ui/components/telemetry/grafana/GrafanaCustomChart.js delete mode 100644 ui/components/telemetry/grafana/GrafanaCustomCharts.js delete mode 100644 ui/components/telemetry/grafana/GrafanaCustomGaugeChart.js delete mode 100644 ui/components/telemetry/grafana/GrafanaDateRangePicker.js delete mode 100644 ui/components/telemetry/grafana/GrafanaDisplaySelection.js delete mode 100644 ui/components/telemetry/grafana/GrafanaMetricsCompare.js delete mode 100644 ui/components/telemetry/grafana/GrafanaSelectionComponent.js delete mode 100644 ui/components/telemetry/prometheus/PrometheusComponent.js delete mode 100644 ui/components/telemetry/prometheus/PrometheusConfigComponent.js delete mode 100644 ui/components/telemetry/prometheus/PrometheusSelectionComponent.js delete mode 100644 ui/constants/colors.js delete mode 100644 ui/constants/common.js delete mode 100644 ui/constants/endpoints.js delete mode 100644 ui/constants/navigator.js delete mode 100644 ui/css/disableComponent.styles.js delete mode 100644 ui/css/grid.style.js delete mode 100644 ui/css/icons.styles.js delete mode 100644 ui/jsconfig.json delete mode 100644 ui/lib/chartjs-formatter.js delete mode 100644 ui/lib/data-fetch.js delete mode 100644 ui/lib/event-types.js delete mode 100644 ui/lib/path.js delete mode 100644 ui/lib/prePopulatedOptions.js delete mode 100644 ui/lib/relayEnvironment.js delete mode 100644 ui/lib/store.js delete mode 100644 ui/lib/trueRandom.js delete mode 100644 ui/machines/operationsCenter.js delete mode 100644 ui/machines/registry.js delete mode 100644 ui/machines/validator/designValidator.js delete mode 100644 ui/machines/validator/schemaValidator.js delete mode 100644 ui/machines/validator/schemaValidatorWorker.js delete mode 100644 ui/next.config.js delete mode 100644 ui/nodemon.json delete mode 100644 ui/package-lock.json delete mode 100644 ui/package.json delete mode 100644 ui/pages/404.js delete mode 100644 ui/pages/_app.js delete mode 100644 ui/pages/_document.js delete mode 100644 ui/pages/api/__coverage__.js delete mode 100644 ui/pages/configuration/catalog.js delete mode 100644 ui/pages/configuration/designs/configurator.js delete mode 100644 ui/pages/configuration/designs/index.js delete mode 100644 ui/pages/configuration/filters.js delete mode 100644 ui/pages/connect/[...connection].js delete mode 100644 ui/pages/extension/AccessMesheryModal.js delete mode 100644 ui/pages/extension/[...component].js delete mode 100644 ui/pages/extensions.js delete mode 100644 ui/pages/index.js delete mode 100644 ui/pages/management/adapter.js delete mode 100644 ui/pages/management/connections.js delete mode 100644 ui/pages/management/environments.js delete mode 100644 ui/pages/management/workspaces.js delete mode 100644 ui/pages/performance/index.js delete mode 100644 ui/pages/performance/profiles.js delete mode 100644 ui/pages/performance/results.js delete mode 100644 ui/pages/settings.js delete mode 100644 ui/pages/smi_results.js delete mode 100644 ui/pages/styles/AnimatedFilter.css delete mode 100644 ui/pages/styles/AnimatedMeshPattern.css delete mode 100644 ui/pages/styles/AnimatedMeshSync.css delete mode 100644 ui/pages/styles/AnimatedMeshery.css delete mode 100644 ui/pages/styles/charts.css delete mode 100644 ui/pages/system/connections.js delete mode 100644 ui/pages/user/preferences.js delete mode 100644 ui/playwright.config.js delete mode 100644 ui/public/static/favicon.png delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftBlack.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftBlackItalic.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftBold.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftBoldItalic.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftExtraBold.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftExtraBoldItalic.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftHeavy.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftHeavyItalic.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftLight.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftLightItalic.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftMedium.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftMediumItalic.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftRegular.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftRegularItalic.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftSemiBold.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftSemiBoldItalic.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftThin.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftThinItalic.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftUltraLight.otf delete mode 100644 ui/public/static/fonts/qanelas-soft/QanelasSoftUltraLightItalic.otf delete mode 100644 ui/public/static/img/CloneIcon.js delete mode 100644 ui/public/static/img/UndeployIcon.js delete mode 100644 ui/public/static/img/all_mesh.svg delete mode 100644 ui/public/static/img/app_mesh-light.svg delete mode 100644 ui/public/static/img/app_mesh.svg delete mode 100644 ui/public/static/img/artifact-hub-color.svg delete mode 100644 ui/public/static/img/aws-light.svg delete mode 100644 ui/public/static/img/aws.svg delete mode 100644 ui/public/static/img/cilium_service_mesh-light.svg delete mode 100644 ui/public/static/img/cilium_service_mesh.svg delete mode 100644 ui/public/static/img/citrix_service_mesh-light.svg delete mode 100644 ui/public/static/img/citrix_service_mesh-white.svg delete mode 100644 ui/public/static/img/citrix_service_mesh.svg delete mode 100644 ui/public/static/img/citrixservicemesh.svg delete mode 100644 ui/public/static/img/clone-white.svg delete mode 100644 ui/public/static/img/clone.svg delete mode 100644 ui/public/static/img/component-svg/_.txt delete mode 100644 ui/public/static/img/component-svg/kubernetes/cluster-role-binding.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/cluster-role.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/core-dns.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/cronjob.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/daemonset.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/etcd.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/kubernetes.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/matchLabels.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/namespace.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/secret.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/security-account.svg delete mode 100644 ui/public/static/img/component-svg/kubernetes/volume.svg delete mode 100644 ui/public/static/img/component-svg/meshery.svg delete mode 100644 ui/public/static/img/component-svg/meshsync.svg delete mode 100644 ui/public/static/img/component-svg/nats.svg delete mode 100644 ui/public/static/img/component-svg/operator-light.svg delete mode 100644 ui/public/static/img/component-svg/service-mesh/appmesh.svg delete mode 100644 ui/public/static/img/component-svg/service-mesh/cilium.svg delete mode 100644 ui/public/static/img/component-svg/service-mesh/consul.svg delete mode 100644 ui/public/static/img/component-svg/service-mesh/istio.svg delete mode 100644 ui/public/static/img/component-svg/service-mesh/kuma.svg delete mode 100644 ui/public/static/img/component-svg/service-mesh/linkerd.svg delete mode 100644 ui/public/static/img/component-svg/service-mesh/nginx.svg delete mode 100644 ui/public/static/img/component-svg/service-mesh/osm.svg delete mode 100644 ui/public/static/img/component-svg/service-mesh/traefik-mesh.svg delete mode 100644 ui/public/static/img/configuration_trans.svg delete mode 100644 ui/public/static/img/connection-light.svg delete mode 100644 ui/public/static/img/connection.svg delete mode 100644 ui/public/static/img/connection_wizard/connection-wizard-green.svg delete mode 100644 ui/public/static/img/connection_wizard/connection-wizard-white.svg delete mode 100644 ui/public/static/img/connection_wizard/nav_icon.png delete mode 100644 ui/public/static/img/consul-light.svg delete mode 100644 ui/public/static/img/consul-white.svg delete mode 100644 ui/public/static/img/consul.svg delete mode 100644 ui/public/static/img/dashboard-screenshot.png delete mode 100644 ui/public/static/img/designer.png delete mode 100644 ui/public/static/img/docker.svg delete mode 100644 ui/public/static/img/docker_compose.svg delete mode 100644 ui/public/static/img/drawer-icons/application_svg.js delete mode 100644 ui/public/static/img/drawer-icons/configuration_hover_svg.js delete mode 100644 ui/public/static/img/drawer-icons/conformance_hover_svg.js delete mode 100644 ui/public/static/img/drawer-icons/conformance_svg.js delete mode 100644 ui/public/static/img/drawer-icons/discuss_forum_svg.js delete mode 100644 ui/public/static/img/drawer-icons/extensions_svg.js delete mode 100644 ui/public/static/img/drawer-icons/filter_svg.js delete mode 100644 ui/public/static/img/drawer-icons/lifecycle_hover_svg.js delete mode 100644 ui/public/static/img/drawer-icons/lifecycle_mgmt_svg.js delete mode 100644 ui/public/static/img/drawer-icons/pattern_svg.js delete mode 100644 ui/public/static/img/drawer-icons/performance-icon_svg.js delete mode 100644 ui/public/static/img/drawer-icons/performance_hover_svg.js delete mode 100644 ui/public/static/img/drawer-icons/performance_svg.js delete mode 100644 ui/public/static/img/drawer-icons/servicemeshinterface-icon-white_svg.js delete mode 100644 ui/public/static/img/drawer-icons/smp-white-text_svg.js delete mode 100644 ui/public/static/img/environment-light.svg delete mode 100644 ui/public/static/img/environment.svg delete mode 100644 ui/public/static/img/github.svg delete mode 100644 ui/public/static/img/github_black.svg delete mode 100644 ui/public/static/img/grafana_icon.svg delete mode 100644 ui/public/static/img/helm_chart-light.svg delete mode 100644 ui/public/static/img/helm_chart-white.svg delete mode 100644 ui/public/static/img/helm_chart.svg delete mode 100644 ui/public/static/img/istio-light.svg delete mode 100644 ui/public/static/img/istio-white.svg delete mode 100644 ui/public/static/img/istio.svg delete mode 100644 ui/public/static/img/kubernetes.svg delete mode 100644 ui/public/static/img/kubernetes_manifest-light.svg delete mode 100644 ui/public/static/img/kubernetes_manifest.svg delete mode 100644 ui/public/static/img/kuma-light.svg delete mode 100644 ui/public/static/img/kuma-white.svg delete mode 100644 ui/public/static/img/kuma.svg delete mode 100644 ui/public/static/img/linkerd-light.svg delete mode 100644 ui/public/static/img/linkerd-white.svg delete mode 100644 ui/public/static/img/linkerd.svg delete mode 100644 ui/public/static/img/load-test/fortio.svg delete mode 100644 ui/public/static/img/load-test/nighthawk.svg delete mode 100644 ui/public/static/img/load-test/wrk2.svg delete mode 100644 ui/public/static/img/logs.svg delete mode 100644 ui/public/static/img/meshery-logo-light-text-side.png delete mode 100644 ui/public/static/img/meshery-logo-light-text.svg delete mode 100644 ui/public/static/img/meshery-logo-text.png delete mode 100644 ui/public/static/img/meshery-logo-text.svg delete mode 100644 ui/public/static/img/meshery-logo.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-black.svg delete mode 100644 ui/public/static/img/meshery-logo/meshery-dark-text.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-logo-dark-text.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-logo-dark.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-logo-light-text.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-logo-shadow.svg delete mode 100644 ui/public/static/img/meshery-logo/meshery-logo-white-text.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-logo-white.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-logo.svg delete mode 100644 ui/public/static/img/meshery-logo/meshery-text-dark.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-text-white.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-white.png delete mode 100644 ui/public/static/img/meshery-logo/meshery-white.svg delete mode 100644 ui/public/static/img/meshery-nighthawk.svg delete mode 100644 ui/public/static/img/meshery-operator.svg delete mode 100644 ui/public/static/img/meshery_catalog.svg delete mode 100644 ui/public/static/img/meshmap-snapshot-logo.svg delete mode 100644 ui/public/static/img/meshmap.svg delete mode 100644 ui/public/static/img/meshsync-white.svg delete mode 100644 ui/public/static/img/meshsync.svg delete mode 100644 ui/public/static/img/model-categories/dark/analytics-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/apps-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/cloud-native-application-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/cloud-native-network-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/database-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/database-storage-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/machine-learning-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/observability-analysis-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/orchestration-management-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/other-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/platform-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/provisioning-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/runtime-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/serverless-dark.svg delete mode 100644 ui/public/static/img/model-categories/dark/tools-dark.svg delete mode 100644 ui/public/static/img/model-categories/label-green/analytics-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/app-definition-development-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/cloud-native-application-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/cloud-native-network-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/database-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/database-storage-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/machine-learning-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/observability-analysis-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/orchestration-management-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/other-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/platform-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/provisioning-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/runtime-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/serverless-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label-green/tools-label-green.svg delete mode 100644 ui/public/static/img/model-categories/label/analytics-label.svg delete mode 100644 ui/public/static/img/model-categories/label/app-definition-development-label.svg delete mode 100644 ui/public/static/img/model-categories/label/cloud-native-application-label.svg delete mode 100644 ui/public/static/img/model-categories/label/cloud-native-network-label.svg delete mode 100644 ui/public/static/img/model-categories/label/cloud-native-storage-label.svg delete mode 100644 ui/public/static/img/model-categories/label/database-label.svg delete mode 100644 ui/public/static/img/model-categories/label/machine-learning-label.svg delete mode 100644 ui/public/static/img/model-categories/label/observability-analysis-label.svg delete mode 100644 ui/public/static/img/model-categories/label/orchestration-management-label.svg delete mode 100644 ui/public/static/img/model-categories/label/other-label.svg delete mode 100644 ui/public/static/img/model-categories/label/platform-label.svg delete mode 100644 ui/public/static/img/model-categories/label/provisioning-label.svg delete mode 100644 ui/public/static/img/model-categories/label/runtime-label.svg delete mode 100644 ui/public/static/img/model-categories/label/security-compliance-label.svg delete mode 100644 ui/public/static/img/model-categories/label/serverless-label.svg delete mode 100644 ui/public/static/img/model-categories/label/service-mesh-label.svg delete mode 100644 ui/public/static/img/model-categories/label/tools-label.svg delete mode 100644 ui/public/static/img/model-categories/label/uncategorized-label.svg delete mode 100644 ui/public/static/img/model-categories/light/analytics-light.svg delete mode 100644 ui/public/static/img/model-categories/light/apps-light.svg delete mode 100644 ui/public/static/img/model-categories/light/cloud-native-application-light.svg delete mode 100644 ui/public/static/img/model-categories/light/cloud-native-network-light.svg delete mode 100644 ui/public/static/img/model-categories/light/database-light.svg delete mode 100644 ui/public/static/img/model-categories/light/database-storage-light.svg delete mode 100644 ui/public/static/img/model-categories/light/machine-learning-light.svg delete mode 100644 ui/public/static/img/model-categories/light/observability-analysis-light.svg delete mode 100644 ui/public/static/img/model-categories/light/orchestration-management-light.svg delete mode 100644 ui/public/static/img/model-categories/light/other-light.svg delete mode 100644 ui/public/static/img/model-categories/light/platform-light.svg delete mode 100644 ui/public/static/img/model-categories/light/provisioning-light.svg delete mode 100644 ui/public/static/img/model-categories/light/runtime-light.svg delete mode 100644 ui/public/static/img/model-categories/light/serverless-light.svg delete mode 100644 ui/public/static/img/model-categories/light/tools-light.svg delete mode 100644 ui/public/static/img/model-categories/white/analytics-white.svg delete mode 100644 ui/public/static/img/model-categories/white/apps-white.svg delete mode 100644 ui/public/static/img/model-categories/white/cloud-native-application-white.svg delete mode 100644 ui/public/static/img/model-categories/white/cloud-native-network-white.svg delete mode 100644 ui/public/static/img/model-categories/white/database-storage-white.svg delete mode 100644 ui/public/static/img/model-categories/white/database-white.svg delete mode 100644 ui/public/static/img/model-categories/white/machine-learning-white.svg delete mode 100644 ui/public/static/img/model-categories/white/observability-analysis-white.svg delete mode 100644 ui/public/static/img/model-categories/white/orchestration-management-white.svg delete mode 100644 ui/public/static/img/model-categories/white/other-white.svg delete mode 100644 ui/public/static/img/model-categories/white/platform-white.svg delete mode 100644 ui/public/static/img/model-categories/white/provisioning-white.svg delete mode 100644 ui/public/static/img/model-categories/white/runtime-white.svg delete mode 100644 ui/public/static/img/model-categories/white/serverless-white.svg delete mode 100644 ui/public/static/img/model-categories/white/tools-white.svg delete mode 100644 ui/public/static/img/nats-icon-color.svg delete mode 100644 ui/public/static/img/network_service_mesh-light.svg delete mode 100644 ui/public/static/img/network_service_mesh-white.svg delete mode 100644 ui/public/static/img/network_service_mesh.svg delete mode 100644 ui/public/static/img/networkservicemesh.svg delete mode 100644 ui/public/static/img/nginx-light.svg delete mode 100644 ui/public/static/img/nginx.svg delete mode 100644 ui/public/static/img/nginx_service_mesh-light.svg delete mode 100644 ui/public/static/img/nginx_service_mesh.svg delete mode 100644 ui/public/static/img/nighthawk-logo.svg delete mode 100644 ui/public/static/img/nighthawk-logo_white.svg delete mode 100644 ui/public/static/img/octarine-light.svg delete mode 100644 ui/public/static/img/octarine-white.svg delete mode 100644 ui/public/static/img/octarine.svg delete mode 100644 ui/public/static/img/open_service_mesh-light.svg delete mode 100644 ui/public/static/img/open_service_mesh-white.svg delete mode 100644 ui/public/static/img/open_service_mesh.svg delete mode 100644 ui/public/static/img/openservicemesh.svg delete mode 100644 ui/public/static/img/pattcolor.svg delete mode 100644 ui/public/static/img/pattern_trans.svg delete mode 100644 ui/public/static/img/performance.svg delete mode 100644 ui/public/static/img/private.svg delete mode 100644 ui/public/static/img/prometheus_logo_orange_circle.svg delete mode 100644 ui/public/static/img/public.svg delete mode 100644 ui/public/static/img/published.svg delete mode 100644 ui/public/static/img/service-mesh-pattern.png delete mode 100644 ui/public/static/img/service-mesh.svg delete mode 100644 ui/public/static/img/smc-checklist.svg delete mode 100644 ui/public/static/img/smi-conformance-no-trim.svg delete mode 100644 ui/public/static/img/smi-conformance-small.svg delete mode 100644 ui/public/static/img/smi-white.svg delete mode 100644 ui/public/static/img/smi.png delete mode 100644 ui/public/static/img/smp-dark.svg delete mode 100644 ui/public/static/img/terminal.svg delete mode 100644 ui/public/static/img/traefik_mesh-light.svg delete mode 100644 ui/public/static/img/traefik_mesh.svg delete mode 100644 ui/public/static/img/web-applications.svg delete mode 100644 ui/public/static/img/web-filters.svg delete mode 100644 ui/public/static/img/workspace-light.svg delete mode 100644 ui/public/static/img/workspace.svg delete mode 100644 ui/public/static/namespace_discovery_relationship_policy.wasm delete mode 100644 ui/public/static/style/index.css delete mode 100644 ui/relay.config.js delete mode 100644 ui/remote-component.config.js delete mode 100644 ui/rtk-query/ability.js delete mode 100644 ui/rtk-query/connection.js delete mode 100644 ui/rtk-query/design.js delete mode 100644 ui/rtk-query/environments.js delete mode 100644 ui/rtk-query/filter.js delete mode 100644 ui/rtk-query/index.js delete mode 100644 ui/rtk-query/mesh.js delete mode 100644 ui/rtk-query/meshModel.js delete mode 100644 ui/rtk-query/meshsync.js delete mode 100644 ui/rtk-query/notificationCenter.js delete mode 100644 ui/rtk-query/orgRoles.js delete mode 100644 ui/rtk-query/organization.js delete mode 100644 ui/rtk-query/performance-profile.js delete mode 100644 ui/rtk-query/providerRoles.js delete mode 100644 ui/rtk-query/schema.js delete mode 100644 ui/rtk-query/system.js delete mode 100644 ui/rtk-query/user.js delete mode 100644 ui/rtk-query/userKeys.js delete mode 100644 ui/rtk-query/utils.js delete mode 100644 ui/rtk-query/webhook.js delete mode 100644 ui/rtk-query/workspace.js delete mode 100644 ui/store/hooks.js delete mode 100644 ui/store/index.js delete mode 100644 ui/store/slices/events.js delete mode 100644 ui/store/slices/globalEnvironmentContext.js delete mode 100644 ui/tests/e2e/auth.setup.js delete mode 100644 ui/tests/e2e/connections.spec.js delete mode 100644 ui/tests/e2e/custom-playwright-reporter.js delete mode 100644 ui/tests/e2e/dashboard.spec.js delete mode 100644 ui/tests/e2e/delays.js delete mode 100644 ui/tests/e2e/env.js delete mode 100644 ui/tests/e2e/fixtures/pages.js delete mode 100644 ui/tests/e2e/fixtures/performancePage.js delete mode 100644 ui/tests/e2e/indexui.spec.js delete mode 100644 ui/tests/e2e/reporterSummary.md delete mode 100644 ui/tests/e2e/service_mesh_lifecycle.spec.js delete mode 100644 ui/tests/e2e/service_mesh_performance.spec.js delete mode 100644 ui/tests/e2e/settings.spec.js delete mode 100644 ui/tests/e2e/userpreference.spec.js delete mode 100644 ui/tests/e2e/utils/fetch.js delete mode 100644 ui/tests/e2e/utils/inspectXstate.js delete mode 100644 ui/tests/e2e/utils/waitFor.js delete mode 100644 ui/tests/samples/helmCharts.js delete mode 100644 ui/tests/samples/kubernetsManifests.js delete mode 100644 ui/tests/samples/seededDesigns.js delete mode 100644 ui/tests/seed-data/Datadog agent on k8's delete mode 100644 ui/tests/seed-data/Design With Validation Errors delete mode 100644 ui/themes/app.js delete mode 100644 ui/themes/configurationTableTheme.js delete mode 100644 ui/themes/hooks.js delete mode 100644 ui/themes/index.js delete mode 100644 ui/themes/rjsf.js delete mode 100644 ui/ui.config.js delete mode 100644 ui/ui_dev_server.js delete mode 100644 ui/utils/Elements.js delete mode 100644 ui/utils/Enum.js delete mode 100644 ui/utils/ExtensionPointSchemaValidator.js delete mode 100644 ui/utils/PascalCaseToKebab.js delete mode 100644 ui/utils/TooltipButton.js delete mode 100644 ui/utils/URLValidator.js delete mode 100644 ui/utils/camelCaseToSentanceCase.js delete mode 100644 ui/utils/can.js delete mode 100644 ui/utils/charts.js delete mode 100644 ui/utils/context/dynamicContext.js delete mode 100644 ui/utils/context/schemaSet.js delete mode 100644 ui/utils/custom-column.js delete mode 100644 ui/utils/custom-filter.js delete mode 100644 ui/utils/custom-search.js delete mode 100644 ui/utils/cypress-gql/graphql-test-utils.js delete mode 100644 ui/utils/data-table.js delete mode 100644 ui/utils/debounce.js delete mode 100644 ui/utils/dimension.js delete mode 100644 ui/utils/disabledComponents.js delete mode 100644 ui/utils/fallback.js delete mode 100644 ui/utils/fileDownloader.js delete mode 100644 ui/utils/hooks/useMeshModelComponents.js delete mode 100644 ui/utils/hooks/useNotification.js delete mode 100644 ui/utils/hooks/usePreventUserFromLeavingPage.js delete mode 100644 ui/utils/hooks/useStateCB.js delete mode 100644 ui/utils/k8s-utils.js delete mode 100644 ui/utils/lightenOrDarkenColor.js delete mode 100644 ui/utils/multi-ctx.js delete mode 100644 ui/utils/nameMapper.js delete mode 100644 ui/utils/normalizeURI.js delete mode 100644 ui/utils/objects.js delete mode 100644 ui/utils/permission_constants.js delete mode 100644 ui/utils/responsive-column.js delete mode 100644 ui/utils/theme.js delete mode 100644 ui/utils/utils.js delete mode 100644 ui/utils/versionSort.js delete mode 100644 ui/utils/webApis.js delete mode 100644 ui/utils/workloadFilter.js delete mode 100644 ui/utils/zIndex.js diff --git a/ui/components/MesheryResults.js b/ui/components/MesheryResults.js deleted file mode 100644 index 9fc7730ae3f..00000000000 --- a/ui/components/MesheryResults.js +++ /dev/null @@ -1,504 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { withStyles } from '@material-ui/core/styles'; -import { NoSsr, TableRow, TableCell, IconButton } from '@material-ui/core'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import MUIDataTable from 'mui-datatables'; -import Moment from 'react-moment'; -import MoreHorizIcon from '@material-ui/icons/MoreHoriz'; -import { updateResultsSelection, clearResultsSelection, updateProgress } from '../lib/store'; -import TableSortLabel from '@material-ui/core/TableSortLabel'; -import dataFetch from '../lib/data-fetch'; -import CustomToolbarSelect from './CustomToolbarSelect'; -import MesheryChart from './MesheryChart'; -import GrafanaCustomCharts from './telemetry/grafana/GrafanaCustomCharts'; -import MesheryResultDialog from './MesheryResultDialog'; -import { withNotify } from '../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../lib/event-types'; - -const styles = (theme) => ({ - grid: { padding: theme.spacing(2) }, - tableHeader: { fontWeight: 'bolder', fontSize: 18 }, - chartContent: { - // minHeight: window.innerHeight * 0.7, - }, -}); - -class MesheryResults extends Component { - constructor(props) { - super(props); - // const {results_selection} = props; - this.state = { - page: 0, - search: '', - sortOrder: '', - // pageMap: { - // 0: '', - // }, - count: 0, - pageSize: 10, - results: [], - // startKey: '', - - // results_selection, - - selectedRowData: null, - }; - } - - // static getDerivedStateFromProps(props, state){ - // const { results_selection } = props; - // return { results_selection }; - // } - - componentDidMount = () => { - const { page, pageSize, search, sortOrder } = this.state; - this.fetchResults(page, pageSize, search, sortOrder); - }; - - fetchResults = (page, pageSize, search, sortOrder) => { - const self = this; - let query = ''; - if (typeof search === 'undefined' || search === null) { - search = ''; - } - if (typeof sortOrder === 'undefined' || sortOrder === null) { - sortOrder = ''; - } - query = `?page=${page}&pagesize=${pageSize}&search=${encodeURIComponent( - search, - )}&order=${encodeURIComponent(sortOrder)}`; - self.props.updateProgress({ showProgress: true }); - - const endpoint = self.props.endpoint || '/api/perf/profile/result'; - dataFetch( - `${endpoint}${query}`, - { - method: 'GET', - credentials: 'include', - }, - (result) => { - self.props.updateProgress({ showProgress: false }); - if (typeof result !== 'undefined') { - this.setState({ - results: result.results, - search, - sortOrder, - page: result.page, - pageSize: result.page_size, - count: result.total_count, - }); - } - }, - self.handleError, - ); - }; - - handleError = (error) => { - this.props.updateProgress({ showProgress: false }); - // console.log(`error fetching results: ${error}`); - const notify = this.props.notify; - notify({ - message: `There was an error fetching results: ${error}`, - event_type: EVENT_TYPES.ERROR, - details: error.toString(), - }); - }; - - resetSelectedRowData() { - const self = this; - return () => { - self.setState({ selectedRowData: null }); - }; - } - - render() { - const { classes, results_selection, user } = this.props; - const { results, page, count, pageSize, selectedRowData } = this.state; - const self = this; - const resultsForDisplay = []; - results.forEach((record) => { - const row = { - name: record.name, - mesh: record.mesh, - test_start_time: record.runner_results.StartTime, - qps: record.runner_results.ActualQPS.toFixed(1), - duration: (record.runner_results.ActualDuration / 1000000000).toFixed(1), - threads: record.runner_results.NumThreads, - }; - if ( - record.runner_results.DurationHistogram && - record.runner_results.DurationHistogram.Percentiles - ) { - record.runner_results.DurationHistogram.Percentiles.forEach(({ Percentile, Value }) => { - row[`p${Percentile}`.replace('.', '_')] = Value.toFixed(3); - }); - } else { - row.p50 = 0; - row.p75 = 0; - row.p90 = 0; - row.p99 = 0; - row.p99_9 = 0; - } - resultsForDisplay.push(row); - // console.log(`adding custom row: ${JSON.stringify(row)}`); - }); - - const columns = [ - { - name: 'name', - label: 'Name', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: ({ index, ...column }, sortColumn) => { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - }, - }, - { - name: 'mesh', - label: 'Mesh', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: ({ index, ...column }, sortColumn) => { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - }, - }, - { - name: 'test_start_time', - label: 'Start Time', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: ({ index, ...column }, sortColumn) => { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - customBodyRender: (value) => {value}, - }, - }, - { - name: 'qps', - label: 'QPS', - options: { - filter: false, - sort: false, - searchable: false, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - }, - }, - { - name: 'duration', - label: 'Duration', - options: { - filter: false, - sort: false, - searchable: false, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - }, - }, - - { - name: 'p50', - label: 'P50', - options: { - filter: false, - sort: false, - searchable: false, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - }, - }, - - { - name: 'p99_9', - label: 'P99.9', - options: { - filter: false, - sort: false, - searchable: false, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - }, - }, - { - name: 'Details', - options: { - filter: false, - sort: false, - searchable: false, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - customBodyRender: (value, tableMeta) => ( - - self.setState({ selectedRowData: self.state.results[tableMeta.rowIndex] }) - } - > - - - ), - }, - }, - ]; - - columns.forEach((column, idx) => { - if (column.name === this.state.sortOrder.split(' ')[0]) { - columns[idx].options.sortDirection = this.state.sortOrder.split(' ')[1]; - } - }); - - const rowsSelected = []; - Object.keys(results_selection).forEach((pg) => { - if (parseInt(pg) !== page) { - Object.keys(results_selection[parseInt(pg)]).forEach((ind) => { - const val = (parseInt(pg) + 1) * pageSize + parseInt(ind) + 1; - rowsSelected.push(val); - }); - } else { - Object.keys(results_selection[page]).forEach((ind) => { - const val = parseInt(ind); - rowsSelected.push(val); - }); - } - }); - // console.log(`selected rows after adjustments: ${JSON.stringify(rowsSelected)}`); - const options = { - filter: false, - sort: !(user && user.user_id === 'meshery'), - search: !(user && user.user_id === 'meshery'), - filterType: 'textField', - responsive: 'standard', - resizableColumns: true, - selectableRows: true, - serverSide: true, - count, - rowsPerPage: pageSize, - rowsPerPageOptions: [10, 20, 25], - fixedHeader: true, - page, - rowsSelected, - print: false, - download: false, - onRowsSelect: (currentRowsSelected, allRowsSelected) => { - // const rs = self.props.results_selection; - const res = {}; - allRowsSelected.forEach(({ dataIndex }) => { - if (dataIndex < self.state.pageSize) { - if (typeof res[dataIndex] !== 'undefined') { - delete res[dataIndex]; - } else { - res[dataIndex] = self.state.results[dataIndex]; - } - } - }); - - self.props.updateResultsSelection({ page, results: res }); - }, - - onTableChange: (action, tableState) => { - const sortInfo = tableState.announceText ? tableState.announceText.split(' : ') : []; - let order = ''; - if (tableState.activeColumn) { - order = `${columns[tableState.activeColumn].name} desc`; - } - - switch (action) { - case 'changePage': - self.fetchResults( - tableState.page, - self.state.pageSize, - self.state.search, - self.state.sortOrder, - ); - break; - case 'changeRowsPerPage': - self.fetchResults( - self.state.page, - tableState.rowsPerPage, - self.state.search, - self.state.sortOrder, - ); - break; - case 'search': - if (self.searchTimeout) { - clearTimeout(self.searchTimeout); - } - self.searchTimeout = setTimeout(() => { - if (self.state.search !== tableState.searchText) { - self.fetchResults( - self.state.page, - self.state.pageSize, - tableState.searchText !== null ? tableState.searchText : '', - self.state.sortOrder, - ); - } - }, 500); - break; - case 'sort': - if (sortInfo.length === 2) { - if (sortInfo[1] === 'ascending') { - order = `${columns[tableState.activeColumn].name} asc`; - } else { - order = `${columns[tableState.activeColumn].name} desc`; - } - } - if (order !== this.state.sortOrder) { - self.fetchResults(self.state.page, self.state.pageSize, self.state.search, order); - } - break; - } - }, - customToolbarSelect: (selectedRows, displayData, setSelectedRows) => ( - - ), - expandableRows: true, - renderExpandableRow: (rowData, rowMeta) => { - const row = self.state.results[rowMeta.dataIndex].runner_results; - const boardConfig = self.state.results[rowMeta.dataIndex].server_board_config; - const serverMetrics = self.state.results[rowMeta.dataIndex].server_metrics; - const startTime = new Date(row.StartTime); - const endTime = new Date(startTime.getTime() + row.ActualDuration / 1000000); - const colSpan = rowData.length + 1; - return ( - - -
- -
- {boardConfig && boardConfig !== null && Object.keys(boardConfig).length > 0 && ( -
- -
- )} -
-
- ); - }, - }; - - return ( - - {selectedRowData && selectedRowData !== null && Object.keys(selectedRowData).length > 0 && ( - - )} - Performance Test Results - ) - } - data={resultsForDisplay} - columns={columns} - options={options} - /> - - ); - } -} -MesheryResults.propTypes = { classes: PropTypes.object.isRequired }; - -const mapDispatchToProps = (dispatch) => ({ - // updateMeshResults: bindActionCreators(updateMeshResults, dispatch), - updateResultsSelection: bindActionCreators(updateResultsSelection, dispatch), - clearResultsSelection: bindActionCreators(clearResultsSelection, dispatch), - updateProgress: bindActionCreators(updateProgress, dispatch), -}); -const mapStateToProps = (state) => { - const startKey = state.get('results').get('startKey'); - const results = state.get('results').get('results').toArray(); - const results_selection = state.get('results_selection').toObject(); - const user = state.get('user')?.toObject(); - if (typeof results !== 'undefined') { - return { - startKey, - results, - results_selection, - user, - }; - } - return { results_selection, user }; -}; - -export default withStyles(styles)( - connect(mapStateToProps, mapDispatchToProps)(withNotify(MesheryResults)), -); diff --git a/ui/components/MesherySMIResults.js b/ui/components/MesherySMIResults.js deleted file mode 100644 index f3af93b2644..00000000000 --- a/ui/components/MesherySMIResults.js +++ /dev/null @@ -1,372 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { withStyles } from '@material-ui/core/styles'; -import { TableRow, TableCell, Table, TableBody, TableHead, Tooltip } from '@material-ui/core'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import MUIDataTable from 'mui-datatables'; -import Moment from 'react-moment'; -import { updateProgress } from '../lib/store'; -import dataFetch from '../lib/data-fetch'; -import { withNotify } from '../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../lib/event-types'; - -const styles = (theme) => ({ - grid: { padding: theme.spacing(2) }, - secondaryTable: { - borderRadius: 10, - backgroundColor: theme.palette.secondary.elevatedComponents2, - }, - tableHeader: { - fontWeight: 'bolder', - fontSize: 18, - }, -}); - -class MesherySMIResults extends Component { - constructor(props) { - super(props); - this.state = { - smi_page: 0, - smi_pageSize: 10, - smi_search: '', - smi_sortOrder: '', - smi_results: [], - count: 0, - }; - } - - componentDidMount = () => { - const { smi_page, smi_pageSize, smi_search, smi_sortOrder } = this.state; - this.fetchSMIResults(smi_page, smi_pageSize, smi_search, smi_sortOrder); - }; - - fetchSMIResults = (page, pageSize, search, sortOrder) => { - const self = this; - let query = ''; - if (typeof search === 'undefined' || search === null) { - search = ''; - } - if (typeof sortOrder === 'undefined' || sortOrder === null) { - sortOrder = ''; - } - - query = `?page=${page}&pagesize=${pageSize}&search=${encodeURIComponent( - search, - )}&order=${encodeURIComponent(sortOrder)}`; - dataFetch( - `/api/smi/results${query}`, - { - method: 'GET', - credentials: 'include', - }, - (result) => { - if (typeof result !== 'undefined' && result.results) { - self.setState({ smi_results: result }); - self.setState({ count: result?.total_count }); - self.setState({ smi_pageSize: result?.page_size }); - } - }, - () => self.handleError('Could not fetch SMI results.'), - ); - }; - - handleError = (error) => { - this.props.updateProgress({ showProgress: false }); - // console.log(`error fetching results: ${error}`); - const notify = this.props.notify; - notify({ - message: `There was an error fetching results: ${error}`, - event_type: EVENT_TYPES.ERROR, - details: error.toString(), - }); - }; - - resetSelectedRowData() { - const self = this; - return () => { - self.setState({ selectedRowData: null }); - }; - } - - render() { - const self = this; - const { classes, user } = this.props; - const { smi_pageSize, smi_results, count } = this.state; - - const smi_resultsForDisplay = []; - if (smi_results && smi_results?.results) { - smi_results?.results?.map((val) => { - smi_resultsForDisplay.push([ - val.id, - val.date, - val.mesh_name, - val.mesh_version, - val.passing_percentage, - val.status, - ]); - }); - } - const smi_columns = [ - { - name: 'ID', - label: 'ID', - options: { - sort: true, - searchable: true, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - customBodyRender: (value) => ( - -
{value.slice(0, 5) + '...'}
-
- ), - }, - }, - { - name: 'Date', - label: 'Date', - options: { - sort: true, - searchable: true, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - customBodyRender: (value) => {value}, - }, - }, - { - name: 'Service Mesh', - label: 'Service Mesh', - options: { - sort: true, - searchable: true, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - }, - }, - { - name: 'Service Mesh Version', - label: 'Service Mesh Version', - options: { - sort: true, - searchable: true, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - }, - }, - { - name: '% Passed', - label: '% Passed', - options: { - sort: true, - searchable: true, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - }, - }, - { - name: 'status', - label: 'Status', - options: { - sort: true, - searchable: true, - customHeadRender: ({ index, ...column }) => { - return ( - - {column.label} - - ); - }, - }, - }, - ]; - - const smi_options = { - sort: !(user && user.user_id === 'meshery'), - search: !(user && user.user_id === 'meshery'), - filter: false, - expandableRows: true, - selectableRows: 'none', - serverSide: true, - count, - rowsPerPage: smi_pageSize, - rowsPerPageOptions: [10, 20, 25], - fixedHeader: true, - print: false, - download: false, - renderExpandableRow: (rowData, rowMeta) => { - const column = [ - 'Specification', - 'Assertions', - 'Time', - 'Version', - 'Capability', - 'Result', - 'Reason', - ]; - const data = smi_results?.results[rowMeta.dataIndex]?.more_details?.map((val) => { - return [ - val.smi_specification, - val.assertions, - val.time, - val.smi_version, - val.capability, - val.status, - val.reason, - ]; - }); - const colSpan = rowData.length + 1; - return ( - - -
- - - - {column.map((val) => ( - - {val} - - ))} - - - - {data?.map((row) => ( - - {row?.map((val) => { - if (val && val.match(/[0-9]+m[0-9]+.+[0-9]+s/i) != null) { - const time = val.split(/m|s/); - return ( - - {time[0] + 'm ' + parseFloat(time[1]).toFixed(1) + 's'} - - ); - } else { - return ( - - {val} - - ); - } - })} - - ))} - -
-
-
-
- ); - }, - onTableChange: (action, tableState) => { - const sortInfo = tableState.announceText ? tableState.announceText.split(' : ') : []; - let order = ''; - if (tableState.activeColumn) { - order = `${smi_columns[tableState.activeColumn].name} desc`; - } - - switch (action) { - case 'changePage': - self.fetchSMIResults( - tableState.page, - self.state.smi_pageSize, - self.state.smi_search, - self.state.smi_sortOrder, - ); - break; - case 'changeRowsPerPage': - self.fetchSMIResults( - self.state.smi_page, - tableState.rowsPerPage, - self.state.smi_search, - self.state.smi_sortOrder, - ); - break; - case 'search': - if (self.searchTimeout) { - clearTimeout(self.searchTimeout); - } - self.searchTimeout = setTimeout(() => { - if (self.state.search !== tableState.searchText) { - self.fetchSMIResults( - self.state.smi_page, - self.state.smi_pageSize, - tableState.searchText !== null ? tableState.searchText : '', - self.state.smi_sortOrder, - ); - } - }, 500); - break; - case 'sort': - if (sortInfo.length === 2) { - if (sortInfo[1] === 'ascending') { - order = `${smi_columns[tableState.activeColumn].name} asc`; - } else { - order = `${smi_columns[tableState.activeColumn].name} desc`; - } - } - if (order !== this.state.sortOrder) { - self.fetchSMIResults( - self.state.smi_page, - self.state.smi_pageSize, - self.state.smi_search, - order, - ); - } - break; - } - }, - }; - - return ( - <> - Service Mesh Interface Conformance Results - } - data={smi_resultsForDisplay} - columns={smi_columns} - options={smi_options} - /> - - ); - } -} -MesherySMIResults.propTypes = { classes: PropTypes.object.isRequired }; - -const mapDispatchToProps = (dispatch) => ({ - updateProgress: bindActionCreators(updateProgress, dispatch), -}); -const mapStateToProps = (state) => { - const user = state.get('user')?.toObject(); - return { user }; -}; - -export default withStyles(styles)( - connect(mapStateToProps, mapDispatchToProps)(withNotify(MesherySMIResults)), -); diff --git a/ui/components/MesherySettings.js b/ui/components/MesherySettings.js deleted file mode 100644 index 51a6bd8ee81..00000000000 --- a/ui/components/MesherySettings.js +++ /dev/null @@ -1,504 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { withStyles } from '@material-ui/core/styles'; -import { withRouter } from 'next/router'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import Tabs from '@material-ui/core/Tabs'; -import Tab from '@material-ui/core/Tab'; -import { AppBar, Paper, Typography } from '@material-ui/core'; -import { CustomTooltip } from '@layer5/sistent'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faArrowLeft, faPoll, faDatabase, faFileInvoice } from '@fortawesome/free-solid-svg-icons'; -import { faMendeley } from '@fortawesome/free-brands-svg-icons'; -import Link from 'next/link'; -import GrafanaComponent from './telemetry/grafana/GrafanaComponent'; -import MeshAdapterConfigComponent from './MeshAdapterConfigComponent'; -import PrometheusComponent from './telemetry/prometheus/PrometheusComponent'; -import { updateProgress } from '../lib/store'; -import PromptComponent from './PromptComponent'; -import { iconMedium } from '../css/icons.styles'; -import MeshModelComponent from './MeshModelRegistry/MeshModelComponent'; -import DatabaseSummary from './DatabaseSummary'; -import { - getComponentsDetail, - getMeshModels, - getRelationshipsDetail, - getMeshModelRegistrants, -} from '../api/meshmodel'; -import { withNotify } from '../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../lib/event-types'; -import CAN from '@/utils/can'; -import { keys } from '@/utils/permission_constants'; -import { REGISTRY, METRICS, ADAPTERS, RESET, GRAFANA, PROMETHEUS } from '@/constants/navigator'; -import { removeDuplicateVersions } from './MeshModelRegistry/helper'; -import DefaultError from './General/error-404'; -const styles = (theme) => ({ - wrapperClss: { - flexGrow: 1, - maxWidth: '100%', - height: 'auto', - }, - tab: { - width: '25%', - minWidth: 40, - paddingLeft: 0, - paddingRight: 0, - '&.Mui-selected': { - color: theme.palette.type === 'dark' ? '#00B39F' : theme.palette.primary, - }, - }, - tabs: { - width: '100%', - '& .MuiTabs-indicator': { - backgroundColor: theme.palette.type === 'dark' ? '#00B39F' : theme.palette.primary, - }, - }, - icon: { - display: 'inline', - verticalAlign: 'text-top', - width: theme.spacing(1.75), - marginLeft: theme.spacing(0.5), - }, - - iconText: { - display: 'inline', - verticalAlign: 'middle', - }, - backToPlay: { margin: theme.spacing(2) }, - link: { cursor: 'pointer' }, - container: { - display: 'flex', - justifyContent: 'center', - marginTop: theme.spacing(2), - }, - paper: { - maxWidth: '90%', - margin: 'auto', - overflow: 'hidden', - }, - topToolbar: { - marginBottom: '2rem', - display: 'flex', - justifyContent: 'space-between', - paddingLeft: '1rem', - maxWidth: '90%', - }, - dashboardSection: { - backgroundColor: theme.palette.secondary.elevatedComponents, - padding: theme.spacing(2), - borderRadius: 4, - height: '100%', - }, - cardHeader: { fontSize: theme.spacing(2) }, - card: { - height: '100%', - marginTop: theme.spacing(2), - }, - cardContent: { height: '100%' }, - boxWrapper: { - display: 'flex', - justifyContent: 'center', - alignItems: 'end', - flexDirection: 'row', - flexWrap: 'wrap', - height: '60vh', - borderRadius: 0, - color: 'white', - ['@media (max-width: 455px)']: { - width: '100%', - }, - zIndex: 5, - }, - box: { - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - flexDirection: 'column', - width: 300, - height: 300, - backgroundColor: theme.palette.secondary.dark, - border: '0px solid #000', - boxShadow: theme.shadows[5], - margin: theme.spacing(2), - cursor: 'pointer', - }, -}); - -function TabContainer(props) { - return ( - - {props.children} - - ); -} - -TabContainer.propTypes = { children: PropTypes.node.isRequired }; - -const settingsRouter = (router) => { - const { query, push: pushRoute, route } = router; - - const selectedSettingsCategory = query.settingsCategory; - const selectedTab = query.tab; - - const handleChangeSettingsCategory = (settingsCategory) => { - if (query.settingsCategory === settingsCategory) { - return; - } - pushRoute( - `${route}?settingsCategory=${settingsCategory || query.settingsCategory}`, - undefined, - { shallow: true }, - ); - }; - - const handleChangeSelectedTab = (tab) => { - if (query.tab === tab) { - return; - } - pushRoute(`${route}?settingsCategory=${selectedSettingsCategory}&tab=${tab}`, undefined, { - shallow: true, - }); - }; - - const handleChangeSelectedTabCustomCategory = (settingsCategory, tab) => { - if (query.tab === tab) { - return; - } - pushRoute(`${route}?settingsCategory=${settingsCategory}&tab=${tab}`, undefined, { - shallow: true, - }); - }; - - return { - selectedSettingsCategory, - selectedTab, - handleChangeSettingsCategory, - handleChangeSelectedTab, - handleChangeSelectedTabCustomCategory, - }; -}; - -//TODO: Tabs are hardcoded everywhere -class MesherySettings extends React.Component { - constructor(props) { - super(props); - const { k8sconfig, meshAdapters, grafana, prometheus, router } = props; - - const { selectedSettingsCategory, selectedTab } = settingsRouter(router); - this._isMounted = false; - this.state = { - completed: {}, - k8sconfig, - meshAdapters, - grafana, - prometheus, - tabVal: selectedSettingsCategory || ADAPTERS, - subTabVal: selectedTab || GRAFANA, - modelsCount: 0, - componentsCount: 0, - relationshipsCount: 0, - registrantCount: 0, - isMeshConfigured: k8sconfig.clusterConfigured, - - // Array of scanned prometheus urls - scannedPrometheus: [], - // Array of scanned grafan urls - scannedGrafana: [], - }; - this.systemResetPromptRef = React.createRef(); - } - - static getDerivedStateFromProps(props, state) { - let st = {}; - if ( - JSON.stringify(props.k8sconfig) !== JSON.stringify(state.k8sconfig) || - JSON.stringify(props.meshAdapters) !== JSON.stringify(state.meshAdapters) - ) { - st = { - k8sconfig: props.k8sconfig, - meshAdapters: props.meshAdapters, - grafana: props.grafana, - prometheus: props.prometheus, - }; - } - const compare = (arr1, arr2) => arr1.every((val, ind) => val === arr2[ind]); - - if ( - props.telemetryUrls.grafana.length !== state.scannedGrafana.length || - !compare(props.telemetryUrls.grafana, state.scannedGrafana) - ) { - st.scannedGrafana = props.telemetryUrls.grafana; - } - - if ( - props.telemetryUrls.prometheus.length !== state.scannedPrometheus.length || - !compare(props.telemetryUrls.prometheus, state.scannedPrometheus) - ) { - st.scannedPrometheus = props.telemetryUrls.prometheus; - } - return st; - } - - componentDidUpdate(prevProps, prevState) { - const { selectedSettingsCategory } = settingsRouter(this.props.router); - - if (selectedSettingsCategory && selectedSettingsCategory !== prevState.tabVal) { - this.setState({ tabVal: selectedSettingsCategory }); - } - } - - async componentDidMount() { - try { - const modelsResponse = await getMeshModels(); - const componentsResponse = await getComponentsDetail(); - const relationshipsResponse = await getRelationshipsDetail(); - const registrantResponce = await getMeshModelRegistrants(); - - const modelsCount = removeDuplicateVersions(modelsResponse.models).length; - const componentsCount = componentsResponse.total_count; - const relationshipsCount = relationshipsResponse.total_count; - const registrantCount = registrantResponce.total_count; - - this.setState({ - modelsCount, - componentsCount, - relationshipsCount, - registrantCount, - }); - } catch (error) { - console.error(error); - } - } - - handleError = (msg) => (error) => { - this.props.updateProgress({ showProgress: false }); - const notify = this.props.notify; - notify({ - message: `${msg}: ${error}`, - event_type: EVENT_TYPES.ERROR, - details: error.toString(), - }); - }; - - handleChange = (val) => { - const self = this; - const { - handleChangeSettingsCategory, - handleChangeSelectedTab, - handleChangeSelectedTabCustomCategory, - } = settingsRouter(this.props.router); - return (event, newVal) => { - if (val === 'tabVal') { - if (newVal === METRICS) { - handleChangeSelectedTabCustomCategory(newVal, GRAFANA); - self.setState({ tabVal: newVal, subTabVal: GRAFANA }); - } else { - handleChangeSettingsCategory(newVal); - self.setState({ tabVal: newVal }); - } - } else if (val === 'subTabVal') { - handleChangeSelectedTab(newVal); - self.setState({ subTabVal: newVal }); - } - }; - }; - - render() { - const { classes } = this.props; - const { tabVal, subTabVal, k8sconfig, meshAdapters } = this.state; - let backToPlay = ''; - if (k8sconfig.clusterConfigured === true && meshAdapters.length > 0) { - backToPlay = ( -
- -
- - You are ready to manage cloud native infrastructure -
- -
- ); - } - return ( - <> - {CAN(keys.VIEW_SETTINGS.action, keys.VIEW_SETTINGS.subject) ? ( -
- - - - } - label="Adapters" - data-cy="tabServiceMeshes" - value={ADAPTERS} - disabled={ - !CAN( - keys.VIEW_CLOUD_NATIVE_INFRASTRUCTURE.action, - keys.VIEW_CLOUD_NATIVE_INFRASTRUCTURE.subject, - ) - } - /> - - - } - label="Metrics" - // tab="tabMetrics" - value={METRICS} - disabled={!CAN(keys.VIEW_METRICS.action, keys.VIEW_METRICS.subject)} - /> - - - } - label="Registry" - // tab="registry" - value={REGISTRY} - disabled={!CAN(keys.VIEW_REGISTRY.action, keys.VIEW_REGISTRY.subject)} - /> - - - } - label="Reset" - // tab="systemReset" - value={RESET} - // disabled={!CAN(keys.VIEW_SYSTEM_RESET.action, keys.VIEW_SYSTEM_RESET.subject)} TODO: uncomment when key get seeded - /> - - - - {tabVal === ADAPTERS && - CAN( - keys.VIEW_CLOUD_NATIVE_INFRASTRUCTURE.action, - keys.VIEW_CLOUD_NATIVE_INFRASTRUCTURE.subject, - ) && ( - - - - )} - {tabVal === METRICS && CAN(keys.VIEW_METRICS.action, keys.VIEW_METRICS.subject) && ( - - - - - Grafana - -
- } - /> - - Prometheus - - - } - /> - - - {subTabVal === GRAFANA && ( - - - - )} - {subTabVal === PROMETHEUS && ( - - - - )} - - )} - {tabVal === REGISTRY && CAN(keys.VIEW_REGISTRY.action, keys.VIEW_REGISTRY.subject) && ( - - - - - - - - )} - {tabVal === RESET && ( - - - - )} - {backToPlay} - - - ) : ( - - )} - - ); - } -} - -const mapStateToProps = (state) => { - const k8sconfig = state.get('k8sConfig'); - const meshAdapters = state.get('meshAdapters').toJS(); - const grafana = state.get('grafana').toJS(); - const prometheus = state.get('prometheus').toJS(); - const selectedK8sContexts = state.get('selectedK8sContexts'); - const telemetryUrls = state.get('telemetryURLs').toJS(); - return { - k8sconfig, - meshAdapters, - grafana, - prometheus, - selectedK8sContexts, - telemetryUrls, - }; -}; - -const mapDispatchToProps = (dispatch) => ({ - updateProgress: bindActionCreators(updateProgress, dispatch), -}); - -MesherySettings.propTypes = { classes: PropTypes.object }; - -export default withStyles(styles, { withTheme: true })( - connect(mapStateToProps, mapDispatchToProps)(withRouter(withNotify(MesherySettings))), -); diff --git a/ui/components/MesherySettingsEnvButtons.js b/ui/components/MesherySettingsEnvButtons.js deleted file mode 100644 index 19f5555f74d..00000000000 --- a/ui/components/MesherySettingsEnvButtons.js +++ /dev/null @@ -1,323 +0,0 @@ -import { - Button, - Typography, - FormGroup, - TextField, - InputAdornment, - Tooltip, - makeStyles, - Grid, - Box, -} from '@material-ui/core'; -import React from 'react'; -import { useRef } from 'react'; -import AddIconCircleBorder from '../assets/icons/AddIconCircleBorder'; -import PromptComponent from './PromptComponent'; -import CloudUploadIcon from '@material-ui/icons/CloudUpload'; -import { promisifiedDataFetch } from '../lib/data-fetch'; -import { updateProgress } from '../lib/store'; -import { useNotification } from '../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../lib/event-types'; -import { CONNECTION_STATES } from '../utils/Enum'; -import { TootltipWrappedConnectionChip, ConnectionStateChip } from './connections/ConnectionChip'; -import useKubernetesHook from './hooks/useKubernetesHook'; -import { keys } from '@/utils/permission_constants'; -import useTestIDsGenerator from './hooks/useTestIDs'; -import CAN from '@/utils/can'; - -const styles = makeStyles((theme) => ({ - ctxIcon: { - display: 'inline', - verticalAlign: 'text-top', - width: theme.spacing(2.5), - marginLeft: theme.spacing(0.5), - }, - chip: { - height: '50px', - fontSize: '15px', - position: 'relative', - top: theme.spacing(0.5), - [theme.breakpoints.down('md')]: { fontSize: '12px' }, - }, -})); -// Add links to docs -const MesherySettingsEnvButtons = () => { - let k8sfileElementVal = ''; - let formData = new FormData(); - const ref = useRef(null); - const { notify } = useNotification(); - - let contextsRef = useRef(); - - const testIDs = useTestIDsGenerator('connection'); - - const handleConfigSnackbars = (ctxs) => { - updateProgress({ showProgress: false }); - for (let ctx of ctxs.errored_contexts) { - const msg = `Failed to add cluster "${ctx.name}" at ${ctx.server}`; - notify({ message: msg, event_type: EVENT_TYPES.ERROR, details: ctx.error.toString() }); - } - }; - - const handleError = (msg) => (error) => { - updateProgress({ showProgress: false }); - notify({ - message: `${msg}: ${error}`, - event_type: EVENT_TYPES.ERROR, - details: error.toString(), - }); - }; - - const handleChange = () => { - const field = document.getElementById('k8sfile'); - const textField = document.getElementById('k8sfileLabelText'); - if (field instanceof HTMLInputElement) { - if (field.files.length < 1) return; - const name = field.files[0].name; - const formdata = new FormData(); - formdata.append('k8sfile', field.files[0]); - textField.value = name; - formData = formdata; - } - }; - - const uploadK8SConfig = async () => { - return await promisifiedDataFetch('/api/system/kubernetes', { - method: 'POST', - body: formData, - }); - }; - - const showUploadedContexts = async (inputFileName) => { - const modal = ref.current; - const registeredContexts = contextsRef.current.registered_contexts; - const connectedContexts = contextsRef.current.connected_contexts; - const ignoredContexts = contextsRef.current.ignored_contexts; - if ( - registeredContexts.length === 0 && - connectedContexts.length == 0 && - ignoredContexts.length == 0 - ) { - notify({ - message: `No reachable contexts found in the uploaded kube config "${inputFileName}". `, - event_type: EVENT_TYPES.WARNING, - showInNotificationCenter: true, - }); - return; - } - await modal.show({ - title: `Available contexts in "${inputFileName}".`, - subtitle: ( - <> - - - ), - options: ['OK'], - }); - }; - - const handleClick = async () => { - const modal = ref.current; - let response = await modal.show({ - title: 'Add Kubernetes Cluster(s)', - subtitle: ( - <> -
- Upload your kubeconfig - commonly found at ~/.kube/config - - - { - document.querySelector('#k8sfile')?.click(); - }} - data-testid={testIDs('uploadKubeConfig')} - margin="normal" - InputProps={{ - readOnly: true, - endAdornment: ( - - - - ), - }} - /> - -
- - ), - options: ['IMPORT', 'CANCEL'], - showInfoIcon: - 'If your config has not been autodetected, you can manually upload your kubeconfig file (or any number of kubeconfig files). By default, Meshery will attempt to connect to and deploy Meshery Operator to each reachable context contained in the imported kubeconfig files. [See Managing Kubernetes Clusters for more information](https://docs.meshery.io/installation/kubernetes).', - }); - - if (response === 'IMPORT') { - if (formData.get('k8sfile') === null) { - handleError('No file selected')('Please select a valid kube config'); - return; - } - - const inputFileName = formData.get('k8sfile').name; - const invalidExtensions = /^.*\.(jpg|gif|jpeg|pdf|png|svg)$/i; - - if (invalidExtensions.test(inputFileName)) { - handleError('Invalid file selected')('Please select a valid kube config'); - return; - } - - uploadK8SConfig() - .then((obj) => { - contextsRef.current = obj; - showUploadedContexts(inputFileName); - handleConfigSnackbars(obj); - }) - .catch((err) => { - handleError('failed to upload kubernetes config')(err); - }); - formData.delete('k8sfile'); - } - }; - - return ( -
- - -
- ); -}; - -const ShowDiscoveredContexts = ({ - registeredContexts, - connectedContexts, - ignoredContexts, - dataTestid, -}) => { - const ping = useKubernetesHook(); - - return ( - - {registeredContexts.length > 0 && ( - - )} - {connectedContexts.length > 0 && ( - - )} - {ignoredContexts.length > 0 && ( - - - - )} - - ); -}; - -const K8sConnectionItems = ({ status, contexts, ping }) => { - const classes = styles(); - return ( - - {contexts.map((context) => ( - - - -
- { - ping(context.name, context.server, context.connection_id); - }} - iconSrc={'/static/img/kubernetes.svg'} - /> -
-
-
- - - -
- ))} -
- ); -}; -export default MesherySettingsEnvButtons; diff --git a/ui/components/MesherySettingsPerformanceComponent.js b/ui/components/MesherySettingsPerformanceComponent.js deleted file mode 100644 index 47282c921cf..00000000000 --- a/ui/components/MesherySettingsPerformanceComponent.js +++ /dev/null @@ -1,345 +0,0 @@ -/* eslint-disable */ -import React from 'react'; -import PropTypes from 'prop-types'; -import Button from '@material-ui/core/Button'; -import SaveOutlinedIcon from '@material-ui/icons/SaveOutlined'; -import { withStyles } from '@material-ui/core/styles'; -import { Autocomplete } from '@material-ui/lab'; -import Grid from '@material-ui/core/Grid'; -import { - NoSsr, - Tooltip, - IconButton, - CircularProgress, - FormControl, - RadioGroup, - FormControlLabel, - Radio, -} from '@material-ui/core'; -import dataFetch from '../lib/data-fetch'; -import TextField from '@material-ui/core/TextField'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { updateLoadTestPref, updateProgress } from '../lib/store'; -import { durationOptions } from '../lib/prePopulatedOptions'; -import { ctxUrl } from '../utils/multi-ctx'; -import { withNotify } from '../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../lib/event-types'; - -const loadGenerators = ['fortio', 'wrk2', 'nighthawk']; - -const styles = (theme) => ({ - root: { - padding: theme.spacing(10), - }, - buttons: { - display: 'flex', - justifyContent: 'flex-end', - }, - button: { - marginTop: theme.spacing(3), - marginLeft: theme.spacing(1), - }, - margin: { - margin: theme.spacing(1), - }, - radio: { - '&.Mui-checked': { - color: theme.palette.type === 'dark' ? '#00B39F' : theme.palette.primary, - }, - }, -}); - -class MesherySettingsPerformanceComponent extends React.Component { - constructor(props) { - super(props); - const { qps, c, t, gen } = props; - this.state = { - qps, - c, - t, - tValue: t, - gen, - blockRunTest: false, - tError: '', - }; - } - - handleChange = (name) => (event) => { - if (name === 'qps' || name === 'c') { - this.setState({ [name]: parseInt(event.target.value) }); - } else { - this.setState({ [name]: event.target.value }); - } - }; - - handleDurationChange = (event, newValue) => { - this.setState({ tValue: newValue }); - if (newValue !== null) { - this.setState({ tError: '' }); - } - }; - - handleInputDurationChange = (event, newValue) => { - this.setState({ t: newValue }); - }; - - handleSubmit = () => { - const { t } = this.state; - - let err = false; - let tNum = 0; - try { - tNum = parseInt(t.substring(0, t.length - 1)); - } catch (ex) { - err = true; - } - - if ( - t === '' || - !( - t.toLowerCase().endsWith('h') || - t.toLowerCase().endsWith('m') || - t.toLowerCase().endsWith('s') - ) || - err || - tNum <= 0 - ) { - this.setState({ tError: 'error-autocomplete-value' }); - return; - } - - this.submitPerfPreference(); - }; - - submitPerfPreference = () => { - const { qps, c, t, gen } = this.state; - - const loadTestPrefs = { - qps, - c, - t, - gen, - }; - const requestBody = JSON.stringify({ loadTestPrefs: loadTestPrefs }); - - this.setState({ blockRunTest: true }); // to block the button - this.props.updateProgress({ showProgress: true }); - const self = this; - dataFetch( - ctxUrl('/api/user/prefs', this.props.selectedK8sContexts), - { - credentials: 'same-origin', - method: 'POST', - credentials: 'include', - headers: { - 'Content-Type': 'application/json;charset=UTF-8', - }, - body: requestBody, - }, - (result) => { - this.props.updateProgress({ showProgress: false }); - if (typeof result !== 'undefined') { - const notify = this.props.notify; - notify({ message: 'Preferences saved', event_type: EVENT_TYPES.SUCCESS }); - this.props.updateLoadTestPref({ - loadTestPref: { - qps: self.state.qps, - c: self.state.c, - t: self.state.t, - gen: self.state.gen, - }, - }); - this.setState({ blockRunTest: false }); - } - }, - self.handleError('There was an error saving your preferences'), - ); - }; - - componentDidMount() { - this.getLoadTestPrefs(); - } - - getLoadTestPrefs = () => { - const self = this; - dataFetch( - ctxUrl('/api/user/prefs', this.props.selectedK8sContexts), - { - credentials: 'same-origin', - method: 'GET', - credentials: 'include', - }, - (result) => { - if (typeof result !== 'undefined') { - this.setState({ - qps: result.loadTestPrefs.qps, - c: result.loadTestPrefs.c, - t: result.loadTestPrefs.t, - gen: result.loadTestPrefs.gen, - }); - } - }, - () => { - !qps || !t || !c ? self.handleError('There was an error fetching your preferences') : {}; - }, - ); - }; - - handleError = (msg) => { - const self = this; - return (error) => { - self.setState({ blockRunTest: false }); - let finalMsg = msg; - if (typeof error === 'string') { - finalMsg = `${msg}: ${error}`; - } - const notify = self.props.notify; - notify({ message: finalMsg, event_type: EVENT_TYPES.ERROR, details: error.toString() }); - }; - }; - - render() { - const { classes } = this.props; - const { blockRunTest, qps, t, c, gen, tValue, tError } = this.state; - - return ( - - -
- - - - - - - - - - - ( - - )} - /> - - - - - - - {loadGenerators.map((lg) => ( - - } - label={lg} - /> - ))} - - - - -
- -
-
-
-
- ); - } -} - -MesherySettingsPerformanceComponent.propTypes = { - classes: PropTypes.object.isRequired, -}; - -const mapDispatchToProps = (dispatch) => ({ - updateLoadTestPref: bindActionCreators(updateLoadTestPref, dispatch), - updateProgress: bindActionCreators(updateProgress, dispatch), -}); - -const mapStateToProps = (state) => { - const loadTestPref = state.get('loadTestPref').toJS(); - const selectedK8sContexts = state.get('selectedK8sContexts'); - - return { - ...loadTestPref, - selectedK8sContexts, - }; -}; - -export default withStyles(styles)( - connect(mapStateToProps, mapDispatchToProps)(withNotify(MesherySettingsPerformanceComponent)), -); diff --git a/ui/components/MesherySnackbarWrapper.js b/ui/components/MesherySnackbarWrapper.js deleted file mode 100644 index e747c1130d8..00000000000 --- a/ui/components/MesherySnackbarWrapper.js +++ /dev/null @@ -1,369 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import PropTypes from 'prop-types'; -import classNames from 'classnames'; -import CheckCircleIcon from '@material-ui/icons/CheckCircle'; -import ErrorIcon from '@material-ui/icons/Error'; -import InfoIcon from '@material-ui/icons/Info'; -import DoneIcon from '@material-ui/icons/Done'; -import IconButton from '@material-ui/core/IconButton'; -import Grid from '@material-ui/core/Grid'; -import { SnackbarContent } from 'notistack'; -import WarningIcon from '@material-ui/icons/Warning'; -import { withStyles } from '@material-ui/core/styles'; -import Collapse from '@material-ui/core/Collapse'; -import Paper from '@material-ui/core/Paper'; -import Typography from '@material-ui/core/Typography'; -import Card from '@material-ui/core/Card'; -import CardActions from '@material-ui/core/CardActions'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { EVENT_TYPES } from '../lib/event-types'; -import ReplyIcon from '@material-ui/icons/Reply'; -import { - TwitterShareButton, - LinkedinShareButton, - FacebookShareButton, - TwitterIcon, - LinkedinIcon, - FacebookIcon, -} from 'react-share'; -import { ClickAwayListener, Fade, Popper } from '@material-ui/core'; -import moment from 'moment'; - -const variantIcon = { - [EVENT_TYPES.SUCCESS.type]: CheckCircleIcon, - [EVENT_TYPES.WARNING.type]: WarningIcon, - [EVENT_TYPES.ERROR.type]: ErrorIcon, - [EVENT_TYPES.DEFAULT.type]: InfoIcon, - [EVENT_TYPES.INFO.type]: InfoIcon, -}; - -const variantHoverColor = { - [EVENT_TYPES.SUCCESS.type]: 'iconSuccess', - [EVENT_TYPES.WARNING.type]: 'iconWarning', - [EVENT_TYPES.ERROR.type]: 'iconError', - [EVENT_TYPES.INFO.type]: 'iconInfo', - [EVENT_TYPES.DEFAULT.type]: 'iconInfo', -}; - -const styles = (theme) => ({ - [EVENT_TYPES.SUCCESS.type]: { color: '#6fbf73' }, - [EVENT_TYPES.ERROR.type]: { color: '#ff1744' }, - [EVENT_TYPES.INFO.type]: { color: '#2196f3' }, - [EVENT_TYPES.WARNING.type]: { color: '#ffc400' }, - [EVENT_TYPES.DEFAULT.type]: { color: '#edeff1' }, - iconColor: { color: 'rgba(102, 102, 102, 1)' }, - iconSuccess: { '&:hover': { color: '#6fbf73' } }, - iconError: { '&:hover': { color: '#ff1744' } }, - iconInfo: { '&:hover': { color: '#2196f3' } }, - iconWarning: { '&:hover': { color: '#ffc400' } }, - icon: { fontSize: 20 }, - iconVariant: { - opacity: 0.9, - marginRight: theme.spacing(1), - }, - message: { - display: 'flex', - alignItems: 'center', - }, - timestamp: { - color: '#ebeff1', - fontSize: '0.8rem', - fontStyle: 'italic', - }, - snackbarContent: { [theme.breakpoints.up('sm')]: { minWidth: '344px !important' } }, - snackbarContentBorder: { - border: '1px solid rgba(102, 102, 102, 1)', - }, - card: { - backgroundColor: 'rgba(50, 50, 50)', - width: '100%', - }, - actionRoot: { padding: '8px 8px 8px 16px' }, - icons: { marginLeft: 'auto' }, - expand: { - padding: '8px 8px', - transform: 'rotate(0deg)', - transition: theme.transitions.create('transform', { - duration: theme.transitions.duration.shortest, - }), - }, - expandOpen: { transform: 'rotate(180deg)' }, - collapse: { padding: 16 }, - checkIcon: { - fontSize: 20, - color: '#b3b3b3', - paddingRight: 4, - }, - button: { - padding: 0, - textTransform: 'none', - }, - share: { - transform: 'scaleX(-1)', - }, - popper: { - width: 500, - }, - paper: { - padding: theme.spacing(1), - }, - shareIcon: { - margin: theme.spacing(0.4), - }, -}); - -const generateMsgForMesh = (name) => { - return `I deployed ${name} service mesh with one-click using @mesheryio!\nManage your infrastructure with Meshery`; -}; - -const generateMsgForSampleApp = (name) => { - return `I deployed ${name} with one-click using @mesheryio!\nManage your infrastructure with Meshery`; -}; - -const generateMsgForAppsPatt = (name) => { - return `I deployed ${name} [design | application] in a single-click using @mesheryio!\nFind design patterns like mine in the Meshery Catalog - https://meshery.io/catalog`; -}; - -const getDefaultMessage = (message) => { - const msg = `" ${message} " - Manage your infrastructure with Meshery - `; - return msg; -}; - -const formatTimestamp = (utcTimestamp) => { - const currentUtcTimestamp = moment.utc().valueOf(); - - const timediff = currentUtcTimestamp - utcTimestamp; - if (timediff >= 24 * 60 * 60 * 1000) { - return moment(utcTimestamp).local().format('YYYY-MM-DD HH:mm'); - } - return moment(utcTimestamp).fromNow(); -}; - -function MesherySnackbarWrapper(props) { - const { - classes, - className, - message, - onClose, - eventType, - details, - cause, - remedy, - errorCode, - componentType, - componentName, - expand, - timestamp, - } = props; - const variant = eventType.type; - const Icon = variantIcon[variant]; - const ERROR_DOC_LINK = 'https://docs.meshery.io/reference/error-codes'; - const [expanded, setExpanded] = useState(false); - const [cardHover, setCardHover] = useState(false); - const [socialExpand, setSocialExpand] = useState(false); - const [anchorEl, setAnchorEl] = useState(null); - const [socialMessage, setSocialMessage] = useState(''); - const [highlight, setHighlight] = useState(false); - - const handleExpandClick = () => { - setExpanded(!expanded); - }; - - const handleSocialExpandClick = (e) => { - setAnchorEl(e.currentTarget); - e.stopPropagation(); - setSocialExpand((socialExpand) => !socialExpand); - }; - useEffect(() => { - if (expand && !expanded) { - handleExpandClick(); - setHighlight(true); - setTimeout(() => { - setHighlight(false); - }, 3000); - } - if (componentType === 'adapter') { - if (message?.includes('mesh installed')) { - setSocialMessage( - generateMsgForMesh( - componentName[0].toUpperCase() + componentName.substring(1).toLowerCase(), - ), - ); - return; - } - if (message.includes('application installed')) { - const name = message?.split(' ')[0]; - setSocialMessage( - generateMsgForSampleApp(name[0].toUpperCase() + name.substring(1).toLowerCase()), - ); - return; - } - setSocialMessage(getDefaultMessage(message)); - return; - } - if (componentType === 'core' && message?.includes('deployed')) { - const designName = message?.split(':')[1]; - setSocialMessage(generateMsgForAppsPatt(designName)); - } - }, [expand]); - return ( - - - - - -
- -
-

{message}

-

{formatTimestamp(timestamp)}

-
-
-
- - - setCardHover(true)} - onMouseLeave={() => setCardHover(false)} - > - - - - {variant === EVENT_TYPES.SUCCESS.type && ( - handleSocialExpandClick(e)} - > - setCardHover(false)} - onMouseLeave={() => setCardHover(true)} - /> - - )} - - setCardHover(false)} - onMouseLeave={() => setCardHover(true)} - /> - - -
-
- - - - DETAILS - - {details} - - {variant === EVENT_TYPES.ERROR.type && ( - <> - {cause && ( - - - PROBABLE CAUSE - - {cause} - - )} - {remedy && ( - - - SUGGESTED REMEDIATION - - {remedy} - - )} - {componentName && ( - - - ERROR CODE - - - {' '} - {errorCode}{' '} - - - )} - - )} - -
- - {({ TransitionProps }) => ( - setSocialExpand(false)}> - - - - - - - - - - - - - - - )} - -
-
-
- ); -} - -MesherySnackbarWrapper.propTypes = { - classes: PropTypes.object.isRequired, - className: PropTypes.string, - message: PropTypes.node, - onClose: PropTypes.func, - eventType: PropTypes.object.isRequired, - details: PropTypes.string, - expand: PropTypes.string.isRequired, -}; - -export default withStyles(styles)(MesherySnackbarWrapper); diff --git a/ui/components/Modal.js b/ui/components/Modal.js deleted file mode 100644 index bd07395ba3b..00000000000 --- a/ui/components/Modal.js +++ /dev/null @@ -1,400 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import { - IconButton, - Menu, - MenuItem, - Tooltip, - Button, - Typography, - CircularProgress, -} from '@material-ui/core'; -import { Dialog, DialogActions, makeStyles } from '@material-ui/core'; -import { CustomTextTooltip } from './MesheryMeshInterface/PatternService/CustomTextTooltip'; -import CloseIcon from '@material-ui/icons/Close'; -import InfoOutlinedIcon from '@material-ui/icons/InfoOutlined'; -import RJSFWrapper from './MesheryMeshInterface/PatternService/RJSF_wrapper'; -import { ArrowDropDown } from '@material-ui/icons'; -import { getSchema } from './MesheryMeshInterface/PatternService/helper'; -import { Snackbar } from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; -import { ModalBody, ModalFooter, PrimaryActionButtons } from '@layer5/sistent'; - -const useStyles = makeStyles((theme) => ({ - '@keyframes rotateCloseIcon': { - from: { - transform: 'rotate(0deg)', - }, - to: { - transform: 'rotate(90deg)', - }, - }, - infoIcon: { - position: 'absolute', - right: 10, - color: theme.palette.type === 'dark' ? '#00B39F' : '#607d8b', - }, - modalHeader: { - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - paddingBottom: 10, - padding: '0 .5rem', - paddingTop: 10, - backgroundColor: theme.palette.secondary.mainBackground, - }, - modelHeader: { - fontSize: '1rem', - color: '#fff', - }, - iconStyle: { - color: '#fff', - '&:hover': { - backgroundColor: 'transparent !important', - animation: '$rotateCloseIcon 1s', - }, - }, - iconContainer: { - // transition: 'all .3s', - }, - submitButton: { - backgroundColor: theme.palette.secondary.focused, - color: '#fff', - textTransform: 'uppercase', - }, - iconPatt: { - display: 'flex', - alignItems: 'center', - marginRight: theme.spacing(1), - }, - btnText: { - textTransform: 'uppercase', - }, - toolTip: { - textDecoration: 'underline', - color: theme.palette.secondary.link2, - }, - dialogAction: { - display: 'flex', - justifyContent: 'center', - padding: '0.5rem 1rem', - }, - snackbar: { - backgroundColor: theme.palette.secondary.elevatedComponents, - }, - leftHeaderIcon: { - paddingLeft: '0.45rem', - }, -})); - -const SchemaVersion = ({ schema_array, type, schemaChangeHandler }) => { - const [anchorEl, setAnchorEl] = React.useState(null); - const open = Boolean(anchorEl); - const handleClose = () => { - setAnchorEl(null); - }; - return ( -
- - setAnchorEl(e.currentTarget)}> - - - - - {schema_array.map((version, index) => ( - { - schemaChangeHandler(version); - handleClose(); - }} - > - {version} - - ))} - -
- ); -}; - -/** - * Renders common dialog component. - * - * @param {Object} props - Component props. - * @param {boolean} props.open - Determines whether the modal is open or not. - * @param {string} props.title - The title of the modal. - * @param {Function} props.handleClose - Function to handle the close event of the modal. - * @param {Function} props.onChange - Function to handle the change event of the form fields in the modal. - * @param {Object} props.schema - The JSON schema for the form fields. - * @param {Object} props.formData - The form data object. - * @param {Array} props.schema_array - An array of schema versions. - * @param {string} props.type - The selected schema version. - * @param {Function} props.schemaChangeHandler - Function to handle the change of the schema version. - * @param {Function} props.handleSubmit - Function to handle the submit event of the modal. - * @param {Object} props.payload - The payload for the submit event. - * @param {Object} props.showInfoIcon - Determines whether to show the info icon adjacent to the modal button. - * @param {string} props.submitBtnText - The text for the submit button. - * @param {Object} props.uiSchema - The UI schema for the form fields. - */ - -// Meshery extensions also uses this modal -function Modal(props) { - const { - open, - title, - handleClose, - schema, - schema_array, - type, - schemaChangeHandler, - handleSubmit, - showInfoIcon, - submitBtnText, - leftHeaderIcon, - submitBtnIcon, - uiSchema = {}, - RJSFWrapperComponent = null, - initialData = {}, - } = props; - const classes = useStyles(); - - const [canNotSubmit, setCanNotSubmit] = useState(false); - const [snackbar, setSnackbar] = useState(false); - const formStateRef = useRef({}); - const formRef = React.createRef(); - const [loadingSchema, setLoadingSchema] = useState(true); - - const handleFormSubmit = () => { - if (formRef.current && formRef.current.validateForm()) { - handleClose(); - handleSubmit(formRef.current.state.formData); - } - }; - - useEffect(() => { - setCanNotSubmit(false); - const handleDesignNameCheck = () => { - const designName = title?.toLowerCase(); - const forbiddenWords = ['untitled design', 'Untitled', 'lfx']; - - for (const word of forbiddenWords) { - if (designName?.includes(word)) { - setSnackbar({ - severity: 'warning', - message: `Design name should not contain Untitled Design, Untitled, LFX`, - open: true, - }); - setCanNotSubmit(true); - break; - } - } - }; - handleDesignNameCheck(); - }, [title]); - - const handleFormChange = (data) => { - formStateRef.current = data; - }; - - useEffect(() => { - if (schema) { - setLoadingSchema(false); - } - }, [schema]); - - return ( - <> - -
- - {leftHeaderIcon ? leftHeaderIcon : null} - - - {title} - {schema_array?.length < 1 && ( - - )} - - - - -
- - {loadingSchema ? ( -
- -
- ) : ( - - )} - - - - {showInfoIcon && ( - - - - - - )} - - {snackbar && ( - setSnackbar(null)} - > - setSnackbar(null)} - severity={snackbar.severity} - > - {snackbar.message} - - - )} -
- - ); -} - -export default React.memo(Modal); - -function RJSFModalWrapper({ - handleClose, - schema, - uiSchema = {}, - initialData = {}, - handleSubmit, - title, - submitBtnText, - helpText, -}) { - const formRef = useRef(); - const classes = useStyles(); - const formStateRef = useRef(); - const [canNotSubmit, setCanNotSubmit] = useState(false); - const [snackbar, setSnackbar] = useState(false); - const [loadingSchema, setLoadingSchema] = useState(true); - - useEffect(() => { - setCanNotSubmit(false); - const handleDesignNameCheck = () => { - const designName = title?.toLowerCase(); - const forbiddenWords = ['untitled design', 'Untitled', 'lfx']; - - for (const word of forbiddenWords) { - if (designName?.includes(word)) { - setSnackbar({ - severity: 'warning', - message: `Design name should not contain Untitled Design, Untitled, LFX`, - open: true, - }); - setCanNotSubmit(true); - break; - } - } - }; - handleDesignNameCheck(); - }, [title]); - - const handleFormChange = (data) => { - formStateRef.current = data; - }; - - useEffect(() => { - setLoadingSchema(!schema); - }, [schema]); - - const handleFormSubmit = () => { - if (formRef.current && formRef.current.validateForm()) { - handleSubmit(formRef.current.state.formData); - handleClose(); - } - }; - - return ( - <> - - {loadingSchema ? ( -
- -
- ) : ( - - )} -
- - - - {snackbar && ( - setSnackbar(null)} - > - setSnackbar(null)} - severity={snackbar.severity} - > - {snackbar.message} - - - )} - - ); -} - -export { RJSFModalWrapper }; diff --git a/ui/components/Modals/ImportModal.js b/ui/components/Modals/ImportModal.js deleted file mode 100644 index 391f423be82..00000000000 --- a/ui/components/Modals/ImportModal.js +++ /dev/null @@ -1,40 +0,0 @@ -import React, { useRef } from 'react'; -import useStyles from '../MesheryPatterns/Cards.styles'; -import RJSFModal from '../Modal'; -import { Button } from '@material-ui/core'; -import { capitalize } from 'lodash'; - -// might also expect RJSFWrapperComponent from extensions -// NOTE: Use modal from sistent -export default function ImportModal(props) { - const { importType, handleSubmit, handleClose, rjsfSchema, uiSchema } = props; - const classes = useStyles(); - const data = useRef(null); - - return ( - - - - ); -} diff --git a/ui/components/Modals/Information/InfoModal.js b/ui/components/Modals/Information/InfoModal.js deleted file mode 100644 index 6797ad0d3f9..00000000000 --- a/ui/components/Modals/Information/InfoModal.js +++ /dev/null @@ -1,522 +0,0 @@ -/* eslint-disable react/display-name */ -import React, { useEffect, useRef, useState } from 'react'; -import CloseIcon from '@material-ui/icons/Close'; -import PatternIcon from '../../../assets/icons/Pattern'; -import { Typography, IconButton, Button, Grid, Avatar, Tooltip, Box } from '@material-ui/core'; -import useStyles, { - ActionContainer, - CreatAtContainer, - CopyLinkButton, - VisibilityTag, - ResourceName, -} from './styles'; -import { iconMedium, iconSmall } from '../../../css/icons.styles'; -import { getDesignVersion, getSharableCommonHostAndprotocolLink } from '../../../utils/utils'; -import moment from 'moment'; -import Application from '../../../public/static/img/drawer-icons/application_svg.js'; -import { useSnackbar } from 'notistack'; -import Filter from '../../../public/static/img/drawer-icons/filter_svg.js'; -import { PATTERN_ENDPOINT, FILTER_ENDPOINT } from '../../../constants/endpoints'; -import { useNotification } from '../../../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../../../lib/event-types'; -import axios from 'axios'; -import _ from 'lodash'; -import RJSFWrapper from '../../MesheryMeshInterface/PatternService/RJSF_wrapper'; -import CircularProgress from '@mui/material/CircularProgress'; -import { Provider } from 'react-redux'; -import { store } from '../../../store'; -import { useGetUserByIdQuery } from '../../../rtk-query/user.js'; -import { ErrorBoundary } from '../../General/ErrorBoundary'; -import { getUnit8ArrayForDesign } from '@/utils/utils'; -import ServiceMesheryIcon from '@/assets/icons/ServiceMesheryIcon'; -import { - Modal, - ModalFooter, - ModalButtonPrimary, - ModalButtonSecondary, - ModalBody, -} from '@layer5/sistent'; -import TooltipButton from '@/utils/TooltipButton'; -import { keys } from '@/utils/permission_constants'; -import CAN from '@/utils/can'; -import { filterEmptyFields } from '@/utils/objects'; -import { VIEW_VISIBILITY, VisibilityMenu } from '@/components/VisibilityMenu'; -import { Lock, Public } from '@material-ui/icons'; - -const APPLICATION_PLURAL = 'applications'; -const FILTER_PLURAL = 'filters'; -const PATTERN_PLURAL = 'patterns'; - -const InfoModal_ = React.memo((props) => { - const { - infoModalOpen, - handleInfoModalClose, - resourceOwnerID, - dataName, - selectedResource, - currentUser, - patternFetcher, - formSchema, - handlePublish, - meshModels = [], - isReadOnly = false, - } = props; - - const formRef = React.createRef(); - const formStateRef = useRef(); - const [isCatalogDataEqual, setIsCatalogDataEqual] = useState(false); - const [dataIsUpdated, setDataIsUpdated] = useState(false); - const [visibility, setVisibility] = useState(selectedResource?.visibility); - const [saveFormLoading, setSaveFormLoading] = useState(false); - const [uiSchema, setUiSchema] = useState({}); - const { notify } = useNotification(); - const classes = useStyles(); - const formatDate = (date) => { - return moment(date).utc().format('MMMM Do YYYY'); - }; - const currentUserID = currentUser?.id; - const isAdmin = currentUser?.role_names?.includes('admin') || false; - const { data: resourceUserProfile } = useGetUserByIdQuery(resourceOwnerID); - const { enqueueSnackbar, closeSnackbar } = useSnackbar(); - const isOwner = currentUserID === resourceOwnerID; - const handleCopy = () => { - navigator.clipboard.writeText(getSharableCommonHostAndprotocolLink(selectedResource)); - enqueueSnackbar(`Link to "${selectedResource.name}" is copied to clipboard`, { - variant: 'info', - action: (key) => ( - closeSnackbar(key)} - > - - - ), - }); - }; - - const handleSubmit = () => { - setSaveFormLoading(true); - const compatibilityStore = _.uniqBy(meshModels, (model) => _.toLower(model.displayName)) - ?.filter((model) => - formStateRef.current?.compatibility?.some( - (comp) => _.toLower(comp) === _.toLower(model.displayName), - ), - ) - ?.map((model) => model.name); - - let body = null; - let modifiedData = { - ...formStateRef.current, - type: formStateRef.current?.type?.toLowerCase(), - compatibility: compatibilityStore, - }; - if (dataName === PATTERN_PLURAL) { - body = JSON.stringify({ - pattern_data: { - catalog_data: modifiedData, - pattern_file: getUnit8ArrayForDesign(selectedResource.pattern_file), - id: selectedResource.id, - visibility: visibility, - }, - save: true, - }); - } else if (dataName === FILTER_PLURAL) { - setSaveFormLoading(true); - let config = ''; - if (selectedResource?.filter_resource && selectedResource?.filter_resource !== '') { - config = JSON.parse(selectedResource.filter_resource).settings.config; // send the config in order to prevent over-write of the config - } - body = JSON.stringify({ - filter_data: { - catalog_data: modifiedData, - id: selectedResource.id, - name: selectedResource.name, - filter_file: selectedResource.filter_file, - }, - config: config, - save: true, - }); - } - - axios - .post(dataName === PATTERN_PLURAL ? PATTERN_ENDPOINT : FILTER_ENDPOINT, body) - .then(() => { - setSaveFormLoading(false); - notify({ - message: `${selectedResource.name} data saved successfully`, - event_type: EVENT_TYPES.SUCCESS, - }); - patternFetcher()(); - handleInfoModalClose(); - }) - .catch((error) => { - setSaveFormLoading(false); - const errorMessage = error.response?.data?.message || error.message; - - notify({ - message: `Error while saving ${selectedResource.name} data: ${errorMessage}`, - event_type: EVENT_TYPES.ERROR, - }); - - console.error('Error while saving pattern data', error); - }); - }; - function normalizeCompatibility(arr) { - return ( - arr?.map((item) => { - if (typeof item === 'string') { - return item.toLowerCase().split('-').join(' '); - } - return item; - }) || [] - ); - } - - // Function to compare objects while normalizing case in compatibility array - function isEqualIgnoringCase(obj1, obj2) { - // Check each property one by one - const isEqualPatternCaveats = obj1.pattern_caveats === obj2.pattern_caveats; - const isEqualPatternInfo = obj1.pattern_info === obj2.pattern_info; - const isEqualType = obj1.type?.toLowerCase() === obj2.type?.toLowerCase(); - - // Normalize and compare compatibility array - const normalizedCompat1 = normalizeCompatibility(obj1.compatibility); - const normalizedCompat2 = normalizeCompatibility(obj2.compatibility); - const isEqualCompatibility = _.isEqual(normalizedCompat1, normalizedCompat2); - - // Return true only if all properties are equal - return isEqualPatternCaveats && isEqualPatternInfo && isEqualType && isEqualCompatibility; - } - const handleFormChange = (data) => { - formStateRef.current = data; - setIsCatalogDataEqual(isEqualIgnoringCase(selectedResource?.catalog_data, data)); - }; - - useEffect(() => { - if (selectedResource?.catalog_data && Object.keys(selectedResource?.catalog_data).length > 0) { - if (meshModels) { - const compatibilitySet = new Set( - (selectedResource?.catalog_data?.compatibility || []).map((comp) => comp.toLowerCase()), - ); - - const filteredCompatibilityArray = _.uniq( - meshModels - .filter((obj) => { - const modelName = obj.name.toLowerCase(); - return compatibilitySet.has(modelName); - }) - .map((obj) => obj.displayName), - ); - - let modifiedData = { - ...selectedResource.catalog_data, - type: _.startCase(selectedResource?.catalog_data?.type), - compatibility: filteredCompatibilityArray, - }; - formStateRef.current = filterEmptyFields(modifiedData); - formStateRef.current.compatibility = filteredCompatibilityArray; - } - } else { - formStateRef.current = filterEmptyFields(selectedResource?.catalog_data); - } - }, [selectedResource?.catalog_data, meshModels]); - - useEffect(() => { - if (formSchema) { - const newUiSchema = { ...formSchema.uiSchema }; - - // if (!isAdmin) { - // selectedResource?.visibility === 'private' ? null : ( - // currentUserID !== resourceOwnerID && - // (newUiSchema['ui:readonly'] = currentUserID !== resourceOwnerID)); - // } - - if (isReadOnly) { - newUiSchema['ui:readonly'] = true; - } - - setUiSchema(newUiSchema); - } - }, [resourceOwnerID, formSchema, currentUserID]); - - const renderIcon = () => { - if (dataName === PATTERN_PLURAL) { - return ; - } - if (dataName === APPLICATION_PLURAL) { - return ; - } - if (dataName === FILTER_PLURAL) { - return ; - } - }; - - const shouldRenderSaveButton = () => { - if (!isAdmin) { - const isPrivate = selectedResource?.visibility === 'private'; - - const renderByPermission = isPrivate ? true : isPublished ? false : isOwner; - return renderByPermission; - } - return true; - }; - - const handlePublishController = () => { - formRef.current.state.schema['required'] = formSchema.rjsfSchema.required; - if (formRef.current && formRef.current.validateForm()) { - setSaveFormLoading(true); - handleInfoModalClose(); - handlePublish(formRef.current.state.formData); - setSaveFormLoading(false); - } - }; - - const isPublished = selectedResource?.visibility === 'published'; - const [imageError, setImageError] = useState(false); - const version = getDesignVersion(selectedResource); - - const handleError = () => { - setImageError(true); - }; - return ( -
- - - - - - - {selectedResource?.name} - - - - Created - - {formatDate(selectedResource?.created_at)} - - - - - - Updated - - {formatDate(selectedResource?.updated_at)} - - - - {version === '' ? null : ( - - - Version - {version} - - - )} - - - - - - - - - - - - - {!isPublished && isOwner ? ( - { - setVisibility(value); - setDataIsUpdated(value != selectedResource?.visibility); - }} - enabled={true} - options={[ - [VIEW_VISIBILITY.PUBLIC, Public], - [VIEW_VISIBILITY.PRIVATE, Lock], - ]} - /> - ) : ( - {selectedResource?.visibility} - )} - - - {dataName === APPLICATION_PLURAL && formSchema ? null : ( - - - - )} - - - - - - - - Copy Link - - - - {isPublished ? 'Published' : 'Publish to Catalog'} - - - {saveFormLoading ? ( - - - - ) : ( - 'Save' - )} - - - - -
- ); -}); - -const OwnerChip = ({ userProfile }) => { - const classes = useStyles(); - return ( - - - - {userProfile ? ( - `${userProfile?.first_name} ${userProfile?.last_name}` - ) : ( - - - - )} - - - ); -}; - -const InfoModal = (props) => { - return ( - null} - onError={(e) => console.error('Error in Info modal', e)} - > - - - - - ); -}; - -export default InfoModal; diff --git a/ui/components/Modals/Information/styles.js b/ui/components/Modals/Information/styles.js deleted file mode 100644 index 0de281aad95..00000000000 --- a/ui/components/Modals/Information/styles.js +++ /dev/null @@ -1,121 +0,0 @@ -import { Box, styled, Button, Typography } from '@material-ui/core'; -import { makeStyles } from '@material-ui/core/styles'; - -export const CreatAtContainer = styled(Typography)(({ isBold }) => ({ - fontWeight: isBold ? 'bold' : '', - whiteSpace: 'wrap', - fontSize: '0.8rem', -})); - -export const ActionContainer = styled(Box)({ - width: '100%', - display: 'flex', - gap: '1rem', - justifyContent: 'end', -}); - -export const CopyLinkButton = styled(Button)(({ theme }) => ({ - color: theme.palette.secondary.primaryModalText, -})); - -export const VisibilityTag = styled(`div`)(({ theme }) => ({ - border: `0.5px solid ${theme.palette.secondary.textMain}`, - color: theme.palette.secondary.textMain, - borderRadius: '0.2rem', - paddingInline: '0.2rem', - paddingBlock: '0.2rem', - fontSize: '0.7rem', - textTransform: 'uppercase', - textAlign: 'center', - marginLeft: '0.5rem', -})); - -export const ResourceName = styled(Typography)(() => ({ - fontFamily: 'Qanelas Soft, sans-serif', - textAlign: 'left', - marginTop: '0.5rem', - overflow: 'hidden', - textOverflow: 'ellipsis', - maxWidth: '10rem', -})); - -const useStyles = makeStyles((theme) => ({ - dialogBox: { - '& .MuiDialog-paper': { - maxWidth: '820px', - }, - }, - dialogTitle: { - backgroundColor: theme.palette.secondary.mainBackground, - justifyContent: 'space-between', - flexDirection: 'row', - alignItems: 'center', - padding: '12px 20px', - gap: '146px', - color: '#FFFFFF', - textAlign: 'center', - textOverflow: 'ellipsis', - '& h2': { - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - }, - }, - - text: { - fontFamily: 'Qanelas Soft, sans-serif', - display: 'flex', - flexDirection: 'column', - '&.MuiTypography-root': { - fontFamily: 'Qanelas Soft, sans-serif', - }, - }, - textHeader: { - fontFamily: 'Qanelas Soft, sans-serif', - textAlign: 'center', - }, - rjsfInfoModalForm: { - marginLeft: '-1rem', - marginTop: '-1rem', - maxWidth: '39rem', - }, - copyButton: { - '&:hover': { - color: theme.palette.secondary.link2, - }, - }, - submitButton: { - backgroundColor: theme.palette.secondary.focused, - color: '#fff', - }, - visibilityGridItem: { - display: 'flex', - alignItems: 'center', - justifyContent: 'flex-end', - }, - img: { - marginLeft: '0.5rem', - marginTop: '-0.35rem', - filter: theme.palette.secondary.img, - height: '2rem', - width: '4.44rem', - }, - chip: { - padding: '1rem .5rem', - // backgroundColor: "red", - }, - chipIcon: { - width: '2rem', - }, - // TODO this style needs to be refactored and applied to all modal globally - closing: { - transform: 'rotate(-90deg)', - '&:hover': { - transform: 'rotate(90deg)', - transition: 'all .3s ease-in', - cursor: 'pointer', - }, - }, -})); - -export default useStyles; diff --git a/ui/components/Modals/PublishModal.js b/ui/components/Modals/PublishModal.js deleted file mode 100644 index 9740f6d0d37..00000000000 --- a/ui/components/Modals/PublishModal.js +++ /dev/null @@ -1,59 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import Modal from '../Modal'; -import PublicIcon from '@material-ui/icons/Public'; -import _ from 'lodash'; -import { getMeshModels } from '../../api/meshmodel'; -import { modifyRJSFSchema } from '../../utils/utils'; -import dataFetch from '../../lib/data-fetch'; - -// This modal is used in Meshery Extensions also -export default function PublishModal(props) { - const { open, title, handleClose, handleSubmit } = props; - const [publishSchema, setPublishSchema] = useState({}); - - useEffect(() => { - dataFetch( - '/api/schema/resource/publish', - { - method: 'GET', - credentials: 'include', - }, - async (result) => { - try { - const { models } = await getMeshModels(); - const modelNames = _.uniq(models?.map((model) => model.displayName)); - modelNames.sort(); - - // Modify the schema using the utility function - const modifiedSchema = modifyRJSFSchema( - result.rjsfSchema, - 'properties.compatibility.items.enum', - modelNames, - ); - - setPublishSchema({ rjsfSchema: modifiedSchema, uiSchema: result.uiSchema }); - } catch (err) { - console.error(err); - setPublishSchema(result); - } - }, - ); - }, []); - - return ( - } - showInfoIcon={{ - text: 'Upon submitting your catalog item, an approval flow will be initiated.', - link: 'https://docs.meshery.io/concepts/catalog', - }} - /> - ); -} diff --git a/ui/components/Navigator.js b/ui/components/Navigator.js deleted file mode 100644 index aa1f9572584..00000000000 --- a/ui/components/Navigator.js +++ /dev/null @@ -1,1471 +0,0 @@ -import React from 'react'; -import classNames from 'classnames'; -import { withStyles } from '@material-ui/core/styles'; -import Divider from '@material-ui/core/Divider'; -import Drawer from '@material-ui/core/Drawer'; -import List from '@material-ui/core/List'; -import ListItem from '@material-ui/core/ListItem'; -import Grow from '@material-ui/core/Grow'; -import ListItemIcon from '@material-ui/core/ListItemIcon'; -import ListItemText from '@material-ui/core/ListItemText'; -import NoSsr from '@material-ui/core/NoSsr'; -import RemoveIcon from '@material-ui/icons/Remove'; -import Zoom from '@material-ui/core/Zoom'; -import Link from 'next/link'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { withRouter } from 'next/router'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import HelpIcon from '@material-ui/icons/Help'; -import DashboardIcon from '@material-ui/icons/Dashboard'; -import LifecycleIcon from '../public/static/img/drawer-icons/lifecycle_mgmt_svg'; -import PerformanceIcon from '../public/static/img/drawer-icons/performance_svg'; -import ExtensionIcon from '../public/static/img/drawer-icons/extensions_svg'; -import FilterIcon from '../public/static/img/drawer-icons/filter_svg'; -import PatternIcon from '../public/static/img/drawer-icons/pattern_svg'; -import LifecycleHover from '../public/static/img/drawer-icons/lifecycle_hover_svg'; -import PerformanceHover from '../public/static/img/drawer-icons/performance_hover_svg'; -import ConfigurationHover from '../public/static/img/drawer-icons/configuration_hover_svg'; -import ConfigurationIcon from '../assets/icons/ConfigurationIcon'; -import DocumentIcon from '../assets/icons/DocumentIcon'; -import SlackIcon from '../assets/icons/SlackIcon'; -import GithubIcon from '../assets/icons/GithubIcon'; -import ChatIcon from '../assets/icons/ChatIcon'; -import ServiceMeshIcon from '../assets/icons/ServiceMeshIcon'; -import OpenInNewIcon from '@material-ui/icons/OpenInNew'; -import { - faAngleLeft, - faCaretDown, - faExternalLinkAlt, - faDigitalTachograph, -} from '@fortawesome/free-solid-svg-icons'; -import { - updatepagetitle, - updatebetabadge, - toggleDrawer, - setAdapter, - updateCapabilities, -} from '../lib/store'; -import { ButtonGroup, IconButton } from '@material-ui/core'; -import { CatalogIcon, CustomTooltip } from '@layer5/sistent'; -import { UsesSistent } from './SistentWrapper'; -import ExtensionPointSchemaValidator from '../utils/ExtensionPointSchemaValidator'; -import dataFetch from '../lib/data-fetch'; -import { Collapse } from '@material-ui/core'; -import { - cursorNotAllowed, - disabledStyle, - disabledStyleWithOutOpacity, -} from '../css/disableComponent.styles'; -import { CapabilitiesRegistry } from '../utils/disabledComponents'; -import { - DESIGN, - CONFIGURATION, - DASHBOARD, - CATALOG, - FILTER, - LIFECYCLE, - SERVICE_MESH, - PERFORMANCE, - PROFILES, - TOGGLER, - CONNECTION, - ENVIRONMENT, - WORKSPACE, -} from '../constants/navigator'; -import { iconSmall } from '../css/icons.styles'; -import CAN from '@/utils/can'; -import { keys } from '@/utils/permission_constants'; -import { CustomTextTooltip } from './MesheryMeshInterface/PatternService/CustomTextTooltip'; - -const styles = (theme) => ({ - root: { - '& svg': { - width: '1.21rem', - height: '1.21rem', - }, - }, - categoryHeader: { - paddingTop: 16, - paddingBottom: 16, - }, - categoryHeaderPrimary: { color: theme.palette.common.white }, - item: { - paddingTop: 4, - paddingBottom: 4, - color: 'rgba(255, 255, 255, 0.7)', - fill: '#fff', - '&:hover': { - '& $expandMoreIcon': { - opacity: 1, - transition: 'opacity 200ms ease-in', - }, - }, - }, - itemCategory: { - backgroundColor: '#263238', - boxShadow: '0 -1px 0 #404854 inset', - paddingTop: '1.325rem', - paddingBottom: '1.325rem', - }, - firebase: { - top: 0, - position: 'sticky', - zIndex: 5, - }, - link: { - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - width: '100%', - height: '30px', - }, - - itemActionable: { '&:hover': { backgroundColor: 'rgb(0, 187, 166, 0.5)' } }, - itemActiveItem: { - color: '#4fc3f7', - fill: '#4fc3f7', - }, - itemPrimary: { - color: 'inherit', - fontSize: theme.typography.fontSize, - '&$textDense': { fontSize: theme.typography.fontSize }, - }, - textDense: {}, - divider: { - marginTop: theme.spacing(1), - marginBottom: theme.spacing(1), - }, - mainLogo: { - marginRight: theme.spacing(1), - marginTop: theme.spacing(1), - marginLeft: theme.spacing(-1), - width: 40, - height: 40, - borderRadius: 'unset', - }, - mainLogoText: { - marginLeft: theme.spacing(0.5), - marginTop: theme.spacing(1), - width: 170, - borderRadius: 'unset', - }, - mainLogoCollapsed: { - marginRight: theme.spacing(1), - marginTop: theme.spacing(1), - marginLeft: theme.spacing(-0.5), - width: 40, - height: 40, - borderRadius: 'unset', - }, - mainLogoTextCollapsed: { - marginLeft: theme.spacing(1), - marginTop: theme.spacing(1), - width: 170, - borderRadius: 'unset', - }, - settingsIcon: { marginLeft: theme.spacing(2) }, - cursorPointer: { cursor: 'pointer' }, - listIcon: { - minWidth: theme.spacing(3.5), - paddingTop: theme.spacing(0.5), - textAlign: 'center', - display: 'inline-table', - paddingRight: theme.spacing(0.5), - marginLeft: theme.spacing(0.8), - }, - listIcon1: { - minWidth: theme.spacing(3.5), - paddingTop: theme.spacing(0.5), - textAlign: 'center', - display: 'inline-table', - paddingRight: theme.spacing(0.5), - opacity: 0.5, - }, - listIconSlack: { - minWidth: theme.spacing(3.5), - paddingTop: theme.spacing(0.5), - textAlign: 'center', - display: 'inline-table', - marginLeft: theme.spacing(-0.1), - paddingRight: theme.spacing(0.5), - opacity: 0.5, - }, - nested1: { paddingLeft: theme.spacing(3) }, - nested2: { paddingLeft: theme.spacing(5) }, - icon: { width: theme.spacing(2.5) }, - istioIcon: { width: theme.spacing(1.8) }, - isHidden: { - opacity: 0, - transition: 'opacity 200ms ease-in-out', - }, - isDisplayed: { - opacity: 1, - transition: 'opacity 200ms ease-in-out', - }, - sidebarCollapsed: { - transition: theme.transitions.create('width', { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.leavingScreen, - }), - overflowX: 'hidden', - width: theme.spacing(8) + 4, - }, - sidebarExpanded: { - width: '256px', - overflowX: 'hidden', - transition: theme.transitions.create('width', { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.enteringScreen, - }), - }, - fixedSidebarFooter: { - display: 'flex', - flexDirection: 'column', - marginTop: 'auto', - marginBottom: '0.5rem', - }, - collapseButtonWrapper: { - boxShadow: - '0.5px 0px 0px 0px rgb(0 0 0 / 20%), 1.5px 0px 0px 0px rgb(0 0 0 / 14%), 2.5px 1px 3px 0px rgb(0 0 0 / 12%)', - borderRadius: '0 5px 5px 0', - position: 'fixed', - cursor: 'pointer', - display: 'flex', - justifyContent: 'center', - bottom: '12%', - left: '257px', - zIndex: '1400', - width: 'auto', - transition: 'left 195ms', - '&:hover': { - opacity: 1, - background: 'transparent', - }, - '&:focus': { - opacity: 1, - background: 'transparent', - }, - }, - collapseButtonWrapperRotated: { - backgroundColor: '#515b60', - color: '#ffffff', - position: 'fixed', - borderRadius: '0 5px 5px 0', - cursor: 'pointer', - bottom: '12%', - left: '49px', - zIndex: '1400', - width: 'auto', - transition: 'left 225ms', - transform: 'rotate(180deg)', - display: 'flex', - justifyContent: 'center', - - '&:hover': { opacity: 1 }, - '&:focus': { opacity: 1 }, - }, - noPadding: { - paddingLeft: '16px', - paddingRight: '16px', - }, - drawerIcons: { - height: '1.21rem', - width: '1.21rem', - fontSize: '1.21rem', - }, - avatarGroup: { '& .MuiAvatarGroup-avatar': { border: 'none' } }, - marginLeft: { - padding: '5px', - '& > li': { - padding: '0', - }, - }, - rightMargin: { marginRight: 8 }, - btnGrpMarginRight: { - marginRight: 4, - alignItems: 'center', - }, - helpIcon: { - color: '#fff', - opacity: '0.7', - transition: 'opacity 200ms linear', - '&:hover': { - opacity: 1, - background: 'transparent', - }, - '&:focus': { - opacity: 1, - background: 'transparent', - }, - }, - extraPadding: { - // paddingTop : 4, - // paddingBottom : 4, - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - }, - restrictPointer: { pointerEvents: 'none' }, - expandMoreIcon: { - opacity: 0, - cursor: 'pointer', - transform: 'translateX(3px)', - '&:hover': { color: '#4fc3f7' }, - }, - collapsed: { transform: 'rotate(180deg) translateX(-0.8px)' }, - collapsedHelpButton: { - height: '1.45rem', - marginTop: '-4px', - transform: 'translateX(0px)', - }, - rightTranslate: { transform: 'translateX(0.5px)' }, - hideScrollbar: { - overflow: 'hidden auto', - 'scrollbar-width': 'none', - '-ms-overflow-style': 'none', - '&::-webkit-scrollbar': { - display: 'none', - }, - }, - disabled: disabledStyle, - disableLogo: disabledStyleWithOutOpacity, - cursorNotAllowed: cursorNotAllowed, -}); - -const drawerIconsStyle = { height: '1.21rem', width: '1.21rem', fontSize: '1.45rem', ...iconSmall }; -const externalLinkIconStyle = { width: '1.11rem', fontSize: '1.11rem' }; - -const getNavigatorComponents = (/** @type {CapabilitiesRegistry} */ capabilityRegistryObj) => [ - { - id: DASHBOARD, - icon: , - hovericon: , - href: '/', - title: 'Dashboard', - show: capabilityRegistryObj.isNavigatorComponentEnabled([DASHBOARD]), - link: true, - submenu: true, - }, - { - id: LIFECYCLE, - icon: , - hovericon: , - title: 'Lifecycle', - link: true, - href: '/management/connections', - show: capabilityRegistryObj.isNavigatorComponentEnabled([LIFECYCLE]), - submenu: true, - children: [ - { - id: CONNECTION, - href: '/management/connections', - title: 'Connections', - show: capabilityRegistryObj.isNavigatorComponentEnabled([LIFECYCLE, CONNECTION]), - link: true, - permission: { - action: keys.VIEW_CONNECTIONS.action, - subject: keys.VIEW_CONNECTIONS.subject, - }, - }, - { - id: ENVIRONMENT, - href: '/management/environments', - title: 'Environments', - show: capabilityRegistryObj.isNavigatorComponentEnabled([LIFECYCLE, ENVIRONMENT]), - link: true, - permission: { - action: keys.VIEW_ENVIRONMENTS.action, - subject: keys.VIEW_ENVIRONMENTS.subject, - }, - }, - { - id: WORKSPACE, - href: '/management/workspaces', - title: 'Workspaces', - show: capabilityRegistryObj.isNavigatorComponentEnabled([LIFECYCLE, WORKSPACE]), - link: true, - permission: { - action: keys.VIEW_WORKSPACE.action, - subject: keys.VIEW_WORKSPACE.subject, - }, - }, - { - id: SERVICE_MESH, - href: '/management/adapter', - title: 'Adapters', - link: true, - icon: , - show: true, - permission: { - action: keys.VIEW_CLOUD_NATIVE_INFRASTRUCTURE.action, - subject: keys.VIEW_CLOUD_NATIVE_INFRASTRUCTURE.subject, - }, - }, - ], - }, - { - id: CONFIGURATION, - icon: , - hovericon: , - href: '/configuration/designs', - title: 'Configuration', - show: capabilityRegistryObj.isNavigatorComponentEnabled([CONFIGURATION]), - link: true, - submenu: true, - children: [ - { - id: CATALOG, - icon: ( - - - - ), - href: '/configuration/catalog', - title: 'Catalog', - show: capabilityRegistryObj.isNavigatorComponentEnabled([CONFIGURATION, CATALOG]), - link: true, - isBeta: true, - permission: { - action: keys.VIEW_CATALOG.action, - subject: keys.VIEW_CATALOG.subject, - }, - }, - { - id: FILTER, - icon: , - href: '/configuration/filters', - title: 'Filters', - show: capabilityRegistryObj.isNavigatorComponentEnabled([CONFIGURATION, FILTER]), - link: true, - isBeta: true, - permission: { - action: keys.VIEW_FILTERS.action, - subject: keys.VIEW_FILTERS.subject, - }, - }, - { - id: DESIGN, - icon: , - href: '/configuration/designs', - title: 'Designs', - show: capabilityRegistryObj.isNavigatorComponentEnabled([CONFIGURATION, DESIGN]), - link: true, - isBeta: true, - permission: { - action: keys.VIEW_DESIGNS.action, - subject: keys.VIEW_DESIGNS.subject, - }, - }, - ], - }, - { - id: PERFORMANCE, - icon: , - hovericon: , - href: '/performance', - title: 'Performance', - show: capabilityRegistryObj.isNavigatorComponentEnabled([PERFORMANCE]), - link: true, - submenu: true, - children: [ - { - id: PROFILES, - icon: , - href: '/performance/profiles', - title: 'Profiles', - show: capabilityRegistryObj.isNavigatorComponentEnabled([PERFORMANCE, PROFILES]), - link: true, - permission: { - action: keys.VIEW_PERFORMANCE_PROFILES.action, - subject: keys.VIEW_PERFORMANCE_PROFILES.subject, - }, - }, - ], - }, - { - id: 'Extensions', - icon: , - hovericon: , - title: 'Extensions', - show: capabilityRegistryObj.isNavigatorComponentEnabled(['Extensions']), - width: 12, - link: true, - href: '/extensions', - submenu: false, - permission: { - action: keys.VIEW_EXTENSIONS.action, - subject: keys.VIEW_EXTENSIONS.subject, - }, - }, -]; - -const ExternalLinkIcon = ( - -); - -const externlinks = [ - { - id: 'doc', - href: 'https://docs.meshery.io', - title: 'Documentation', - icon: , - external_icon: ExternalLinkIcon, - }, - { - id: 'community', - href: 'https://slack.meshery.io', - title: 'Community', - icon: ( - - ), - external_icon: ExternalLinkIcon, - }, - { - id: 'forum', - href: 'http://discuss.meshery.io', - title: 'Discussion Forum', - icon: , - external_icon: ExternalLinkIcon, - }, - { - id: 'issues', - href: 'https://github.com/meshery/meshery/issues/new/choose', - title: 'Issues', - icon: , - external_icon: ExternalLinkIcon, - }, -]; - -class Navigator_ extends React.Component { - constructor(props) { - super(props); - const { meshAdapters } = props; - this.state = { - path: '', - meshAdapters, - mts: new Date(), - - // ExtensionPointSchemaValidator will return a navigator schema - // decoder which in turn will return an empty array when there is no content - // passed into it - navigator: ExtensionPointSchemaValidator('navigator')(), - showHelperButton: false, - openItems: [], - hoveredId: null, - /** @type {CapabilitiesRegistry} */ - capabilitiesRegistryObj: null, - versionDetail: { - build: '', - latest: '', - outdated: false, - commitsha: '', - release_channel: 'NA', - }, - navigatorComponents: [], - }; - } - - isServiceMeshActive() { - return this.state.meshAdapters.length > 0; - } - - componentId = 'navigator'; - - componentDidMount() { - this.fetchCapabilities(); - this.fetchVersionDetails(); - } - - fetchCapabilities() { - dataFetch( - '/api/provider/capabilities', - { - method: 'GET', - credentials: 'include', - }, - (result) => { - if (result) { - const capabilitiesRegistryObj = new CapabilitiesRegistry(result); - const navigatorComponents = this.createNavigatorComponents(capabilitiesRegistryObj); - - this.setState({ - navigator: ExtensionPointSchemaValidator('navigator')(result?.extensions?.navigator), - capabilitiesRegistryObj, - navigatorComponents, - }); - this.props.updateCapabilities({ capabilitiesRegistry: result }); - } - }, - (err) => console.error(err), - ); - } - - fetchVersionDetails() { - dataFetch( - '/api/system/version', - { - method: 'GET', - credentials: 'include', - }, - (result) => { - if (typeof result !== 'undefined') { - this.setState({ versionDetail: result }); - } else { - this.setState({ - versionDetail: { - build: 'Unknown', - latest: 'Unknown', - outdated: false, - commitsha: 'Unknown', - }, - }); - } - }, - (err) => console.error(err), - ); - } - - createNavigatorComponents(capabilityRegistryObj) { - return getNavigatorComponents(capabilityRegistryObj); - } - - /** - * @param {import("../utils/ExtensionPointSchemaValidator").NavigatorSchema[]} children - * @param {number} depth - */ - renderNavigatorExtensions(children, depth) { - const { classes, isDrawerCollapsed } = this.props; - const { path } = this.state; - if (children && children.length > 0) { - return ( - - {children.map(({ id, icon, href, title, children, show: showc }) => { - if (typeof showc !== 'undefined' && !showc) { - return ''; - } - return ( - - - {this.extensionPointContent(icon, href, title, isDrawerCollapsed)} - - {this.renderNavigatorExtensions(children, depth + 1)} - - ); - })} - - ); - } - } - - extensionPointContent(icon, href, name, drawerCollapsed) { - const { classes } = this.props; - - let content = ( -
- - - { - e.target.style.transform = 'translate(-20%, -25%)'; - e.target.style.top = '0'; - e.target.style.right = '0'; - }} - onMouseOut={(e) => { - e.target.style.transform = 'translate(0, 0)'; - e.target.style.top = 'auto'; - e.target.style.right = 'auto'; - }} - /> - - - - {name} - -
- ); - - if (href) { - content = ( - - this.props.updateExtensionType('navigator')} - > - {content} - - - ); - } - - return content; - } - updatenavigatorComponentsMenus() { - const self = this; - const { navigatorComponents } = this.state; - navigatorComponents.forEach((cat, ind) => { - if (cat.id === LIFECYCLE) { - cat.children.forEach((catc, ind1) => { - if (catc.id == SERVICE_MESH) { - return; - } - const icon = self.pickIcon(catc.id, catc.href); - navigatorComponents[ind].children[ind1].icon = icon; - - const cr = self.fetchChildren(catc.id); - navigatorComponents[ind].children[ind1].children = cr; - }); - } - - if (cat.id === 'Configuration') { - let show = false; - cat.children?.forEach((ch) => { - if (ch.id === 'Designs') { - const idx = self.props.capabilitiesRegistry?.capabilities?.findIndex( - (cap) => cap.feature === 'persist-meshery-patterns', - ); - if (idx != -1) { - ch.show = true; - show = true; - } - } - }); - - cat.show = show; - } - - //To Toggle Catalog Extension - if (cat.id === CONFIGURATION) { - cat.children?.forEach((ch) => { - if (ch.id === CATALOG) { - ch.show = this.props.catalogVisibility; - } - }); - } - }); - } - updateAdaptersLink() { - const { navigatorComponents } = this.state; - navigatorComponents.forEach((cat, ind) => { - if (cat.id === LIFECYCLE) { - cat.children.forEach((catc, ind1) => { - if ( - typeof navigatorComponents[ind].children[ind1].children[0] !== 'undefined' && - typeof navigatorComponents[ind].children[ind1].children[0].href !== 'undefined' - ) { - const val = true; - const newhref = `${navigatorComponents[ind].children[ind1].children[0].href}`; - navigatorComponents[ind].children[ind1].link = val; - navigatorComponents[ind].children[ind1].href = newhref; - } - }); - } - }); - } - - static getDerivedStateFromProps(props, state) { - const { meshAdapters, meshAdaptersts } = props; - const path = window.location.pathname; - const st = {}; - if (meshAdaptersts > state.mts) { - st.meshAdapters = meshAdapters; - st.mts = meshAdaptersts; - } - - const fetchNestedPathAndTitle = (path, title, href, children, isBeta) => { - if (href === path) { - props.updatepagetitle({ title }); - props.updatebetabadge({ isBeta }); - return; - } - if (children && children.length > 0) { - children.forEach(({ title, href, children, isBeta }) => { - fetchNestedPathAndTitle(path, title, href, children, isBeta); - }); - } - }; - - state.navigatorComponents.forEach(({ title, href, children, isBeta }) => { - fetchNestedPathAndTitle(path, title, href, children, isBeta); - }); - st.path = path; - return st; - } - - /** - * @param {String} category - * - * Format and return the meshadapters - * - * @returns {Array<{id : Number, icon : JSX.Element, href : String, title : String, link : Boolean, show : Boolean}>} children - */ - fetchChildren(category) { - const { meshAdapters } = this.state; - const children = []; - category = category.toLowerCase(); - meshAdapters.forEach((adapter) => { - let aName = adapter.name.toLowerCase(); - if (category !== aName) { - return; - } - children.push({ - id: adapter.adapter_location, - icon: , - href: `/management?adapter=${adapter.adapter_location}`, - title: `Management - ${adapter.adapter_location}`, - link: true, - show: true, - }); - }); - return children; - } - - /** - * @param {String} aName - * - * @returns {JSX.Element} image to display - */ - pickIcon(aName, href) { - aName = aName.toLowerCase(); - const { classes } = this.props; - let image = '/static/img/meshery-logo.png'; - let filter = - window.location.pathname === href - ? 'invert(50%) sepia(78%) saturate(2392%) hue-rotate(160deg) brightness(93%) contrast(101%)' - : ''; - let logoIcon = ; - if (aName) { - image = '/static/img/' + aName + '-light.svg'; - logoIcon = ; - } - return logoIcon; - } - - /** - * Changes the route to "/" - */ - handleTitleClick = () => { - this.props.router.push('/'); - }; - - /** - * @param {number} id - * @param {Boolean link - * - * Changes the route to "/management" - */ - handleAdapterClick(id, link) { - const { setAdapter } = this.props; - setAdapter({ selectedAdapter: id }); - if (id != -1 && !link) { - this.props.router.push('/management'); - } - } - - toggleMiniDrawer = () => { - const { toggleDrawer, isDrawerCollapsed } = this.props; - toggleDrawer({ isDrawerCollapsed: !isDrawerCollapsed }); - }; - - toggleSpacing = () => { - const { showHelperButton } = this.state; - this.setState({ showHelperButton: !showHelperButton }); - }; - - /** - * @param {number} id - * - * Removes id from openitems if present - * Adds id in openitems if not present already - */ - toggleItemCollapse = (itemId) => { - const isItemOpen = this.state.openItems.includes(itemId); - const activeItems = [...this.state.openItems]; - if (isItemOpen) { - this.setState({ openItems: activeItems.filter((item) => item !== itemId) }); - } else { - activeItems.push(itemId); - this.setState({ openItems: [itemId] }); - } - }; - - /** - * @param {String} idname - * @param {Array<{id : Number, icon : JSX.Element, href : String, title : String, link : Boolean, show : Boolean}>} children - * @param {Number} depth - * - * Renders children of the menu - * - * @returns {JSX.Element} - */ - renderChildren(idname, children, depth) { - const { classes, isDrawerCollapsed } = this.props; - const { path } = this.state; - - if (idname != LIFECYCLE && children && children.length > 0) { - return ( - - {children.map( - ({ - id: idc, - title: titlec, - icon: iconc, - href: hrefc, - show: showc, - link: linkc, - children: childrenc, - permission: permissionc, - }) => { - if (typeof showc !== 'undefined' && !showc) { - return ''; - } - return ( -
- - {this.linkContent(iconc, titlec, hrefc, linkc, isDrawerCollapsed)} - - {this.renderChildren(idname, childrenc, depth + 1)} -
- ); - }, - )} -
- ); - } - if (idname == LIFECYCLE) { - if (children && children.length > 0) { - return ( - - {children.map( - ({ - id: idc, - title: titlec, - icon: iconc, - href: hrefc, - show: showc, - link: linkc, - children: childrenc, - permission: permissionc, - }) => { - if (typeof showc !== 'undefined' && !showc) { - return ''; - } - return ( -
- this.handleAdapterClick(idc, linkc)} - disabled={permissionc ? !CAN(permissionc.action, permissionc.subject) : false} - > - {this.linkContent(iconc, titlec, hrefc, linkc, isDrawerCollapsed)} - - {this.renderChildren(idname, childrenc, depth + 1)} -
- ); - }, - )} -
- ); - } - if (children && children.length === 1) { - this.updateAdaptersLink(); - } - } - return ''; - } - - /** - * @param {JSX.Element} iconc - * @param {String} titlec - * @param {String} hrefc - * @param {Boolean} linkc - * @param {Boolean} drawerCollapsed - * - * @return {JSX.Element} content - */ - linkContent(iconc, titlec, hrefc, linkc, drawerCollapsed) { - const { classes } = this.props; - let linkContent = ( -
- - {iconc} - - - {titlec} - -
- ); - if (linkc) { - linkContent = {linkContent}; - } - return linkContent; - } - - /** - * getMesheryVersionText returs a well formatted version text - * - * If the meshery is running latest version then and is using "edge" channel - * then it will just show "edge-latest". However, if the meshery is on edge and - * is running an outdated version then it will return "edge-$version". - * - * If on stable channel, then it will always show "stable-$version" - */ - getMesheryVersionText() { - const { build, outdated, release_channel } = this.state.versionDetail; - - // If the version is outdated then no matter what the - // release channel is, specify the build which gets covered in the default case - - if (release_channel === 'edge' && outdated) return `${build}`; - //if it is not outdated which means running on latest, return edge-latest - - if (release_channel === 'edge' && !outdated) return `${release_channel}-latest`; - - if (release_channel === 'stable') return `${release_channel}-${build}`; - - return `${build}`; - } - - /** - * versionUpdateMsg returns the appropriate message - * based on the meshery's current running version and latest available - * version. - * - * @returns {React.ReactNode} react component to display - */ - versionUpdateMsg() { - const { outdated, latest } = this.state.versionDetail; - - if (outdated) - return ( - - {'Update available '} - - - - - - - ); - - return Running latest; - } - - /** - * openReleaseNotesInNew returns the appropriate link to the release note - * based on the meshery's current running channel and version. - * - * @returns {React.ReactNode} react component to display - */ - openReleaseNotesInNew() { - const { release_channel, build } = this.state.versionDetail; - - if (release_channel === 'edge') - return ( - - - - ); - - return ( - - - - ); - } - - render() { - const { classes, isDrawerCollapsed, ...other } = this.props; - const { path, showHelperButton, navigatorComponents } = this.state; - this.updatenavigatorComponentsMenus(); - - const Title = ( -
- - - - - {/* Meshery */} - -
- ); - const Menu = ( - - {navigatorComponents.map( - ({ - id: childId, - title, - icon, - href, - show, - link, - children, - hovericon, - submenu, - permission, - }) => { - // if (typeof show !== "undefined" && !show) { - // return ""; - // } - return ( -
- this.toggleItemCollapse(childId)} - onMouseOver={() => - isDrawerCollapsed ? this.setState({ hoveredId: childId }) : null - } - onMouseLeave={() => - !submenu || !this.state.openItems.includes(childId) - ? this.setState({ hoveredId: false }) - : null - } - disabled={permission ? !CAN(permission.action, permission.subject) : false} - > - -
- - {isDrawerCollapsed && - (this.state.hoveredId === childId || - (this.state.openItems.includes(childId) && submenu)) ? ( -
- - this.toggleItemCollapse(childId)} - style={{ marginLeft: '20%', marginBottom: '0.4rem' }} - > - {hovericon} - - -
- ) : ( - {icon} - )} -
- - {title} - -
- - this.toggleItemCollapse(childId)} - className={classNames(classes.expandMoreIcon, { - [classes.collapsed]: this.state.openItems.includes(childId), - })} - style={isDrawerCollapsed || !children ? { opacity: 0 } : {}} - /> -
- - {this.renderChildren(childId, children, 1)} - -
- ); - }, - )} - {this.state.navigator && this.state.navigator.length ? ( - - - {this.renderNavigatorExtensions(this.state.navigator, 1)} - - ) : null} - -
- ); - const HelpIcons = ( - - {externlinks.map(({ id, icon, title, href }, index) => { - return ( - - - - - - {icon} - - - - - - ); - })} - - - - - - - - - ); - const Version = ( - - {isDrawerCollapsed ? ( -
{this.state.versionDetail.build}
- ) : ( - - - {this.getMesheryVersionText()} {' '} - {this.openReleaseNotesInNew()} - {this.versionUpdateMsg()} - - - )} -
- ); - - const Chevron = ( -
-
- -
-
- ); - - return ( - - - {Title} - {Menu} -
- {Chevron} - {HelpIcons} - {Version} -
-
-
- ); - } -} - -const mapDispatchToProps = (dispatch) => ({ - updatepagetitle: bindActionCreators(updatepagetitle, dispatch), - updatebetabadge: bindActionCreators(updatebetabadge, dispatch), - toggleDrawer: bindActionCreators(toggleDrawer, dispatch), - setAdapter: bindActionCreators(setAdapter, dispatch), - updateCapabilities: bindActionCreators(updateCapabilities, dispatch), -}); - -const mapStateToProps = (state) => { - const meshAdapters = state.get('meshAdapters').toJS(); - const meshAdaptersts = state.get('meshAdaptersts'); - const path = state.get('page').get('path'); - const isDrawerCollapsed = state.get('isDrawerCollapsed'); - const capabilitiesRegistry = state.get('capabilitiesRegistry'); - const organization = state.get('organization'); - const keys = state.get('keys'); - const catalogVisibility = state.get('catalogVisibility'); - return { - meshAdapters, - meshAdaptersts, - path, - isDrawerCollapsed, - capabilitiesRegistry, - organization, - keys, - catalogVisibility, - }; -}; - -export const NavigatorWithRedux = withStyles(styles)( - connect(mapStateToProps, mapDispatchToProps)(withRouter(Navigator_)), -); - -export const Navigator = NavigatorWithRedux; - -export default Navigator; diff --git a/ui/components/NavigatorExtension.js b/ui/components/NavigatorExtension.js deleted file mode 100644 index c5938c2eacb..00000000000 --- a/ui/components/NavigatorExtension.js +++ /dev/null @@ -1,172 +0,0 @@ -import React from 'react'; -import { connect } from 'react-redux'; -import { - createUseRemoteComponent, - getDependencies, - createRequires, -} from '@paciolan/remote-component'; -import { bindActionCreators } from 'redux'; -import { updateLoadTestData, setK8sContexts } from '../lib/store'; -import GrafanaCustomCharts from './telemetry/grafana/GrafanaCustomCharts'; -import MesheryPerformanceComponent from './MesheryPerformance'; -import dataFetch from '../lib/data-fetch'; -import PatternServiceForm from './MesheryMeshInterface/PatternServiceForm'; -import PatternServiceFormCore from './MesheryMeshInterface/PatternServiceFormCore'; -import RJSFWrapper from './MesheryMeshInterface/PatternService/RJSF_wrapper'; -import { createRelayEnvironment, subscriptionClient } from '../lib/relayEnvironment'; -import LoadingScreen from './LoadingComponents/LoadingComponent'; -import usePreventUserFromLeavingPage from '../utils/hooks/usePreventUserFromLeavingPage'; -import { getK8sClusterIdsFromCtxId } from '../utils/multi-ctx'; -import ConfirmationModal, { SelectDeploymentTarget } from './ConfirmationModal'; -import { getComponentsinFile, generateValidatePayload } from '../utils/utils'; -import UploadImport from './UploadImport'; -import InfoModal from '../components/Modals/Information/InfoModal'; -import ConfigurationSubscription from '../components/graphql/subscriptions/ConfigurationSubscription'; -import PromptComponent from './PromptComponent'; -import { CapabilitiesRegistry } from '../utils/disabledComponents'; -import { useNotification } from '../utils/hooks/useNotification'; -import Modal, { RJSFModalWrapper } from './Modal'; -import ExportModal from './ExportModal'; -import { MDEditor } from './Markdown'; -import { FormatStructuredData } from './DataFormatter'; -import { useFilterK8sContexts } from './hooks/useKubernetesHook'; -import { useDynamicComponent } from '@/utils/context/dynamicContext'; -import { ValidateDesign } from './DesignLifeCycle/ValidateDesign'; -import { DryRunDesign } from './DesignLifeCycle/DryRun'; -import { DeployStepper, UnDeployStepper } from './DesignLifeCycle/DeployStepper'; -import { designValidationMachine } from 'machines/validator/designValidator'; -import Troubleshoot from './TroubleshootingComponent'; -import CAN from '@/utils/can'; -import { mesheryEventBus } from '@/utils/can'; -import { ThemeTogglerCore } from '@/themes/hooks'; -import RJSFForm from './MesheryMeshInterface/PatternService/RJSF'; - -const requires = createRequires(getDependencies); -const useRemoteComponent = createUseRemoteComponent({ requires }); -function NavigatorExtension({ - grafana, - prometheus, - updateLoadTestData, - url, - isDrawerCollapsed, - selectedK8sContexts, - k8sconfig, - capabilitiesRegistry, -}) { - const [loading, err, RemoteComponent] = useRemoteComponent(url); - console.log(err); - if (loading) { - return ; - } - - if (err != null) { - return ( -
-

Uh-oh!😔 Please pardon our mesh.

-
- {err.toString()} -
-
- -
-
- ); - //
Unknown Error: {err.toString()}
; - } - - const getSelectedK8sClusters = () => { - return getK8sClusterIdsFromCtxId(selectedK8sContexts, k8sconfig); - }; - - return ( - - ); -} - -const mapStateToProps = (st) => { - const grafana = st.get('grafana').toJS(); - const prometheus = st.get('prometheus').toJS(); - const isDrawerCollapsed = st.get('isDrawerCollapsed'); - const selectedK8sContexts = st.get('selectedK8sContexts'); - const k8sconfig = st.get('k8sConfig'); - const capabilitiesRegistry = st.get('capabilitiesRegistry'); - - return { - grafana, - prometheus, - isDrawerCollapsed, - selectedK8sContexts, - k8sconfig, - capabilitiesRegistry, - }; -}; - -const mapDispatchToProps = (dispatch) => ({ - updateLoadTestData: bindActionCreators(updateLoadTestData, dispatch), - setK8sContexts: bindActionCreators(setK8sContexts, dispatch), -}); - -export default connect(mapStateToProps, mapDispatchToProps)(NavigatorExtension); diff --git a/ui/components/NodeDetails.js b/ui/components/NodeDetails.js deleted file mode 100644 index dd6d5b3fefa..00000000000 --- a/ui/components/NodeDetails.js +++ /dev/null @@ -1,196 +0,0 @@ -import React from 'react'; -import { NoSsr, TableCell } from '@material-ui/core'; -// import { createTheme } from '@material-ui/core/styles'; -import MUIDataTable from 'mui-datatables'; -import TableSortLabel from '@material-ui/core/TableSortLabel'; - -function NodeDetails(props) { - const chartData = props.result; - - const columns = [ - { - name: 'hostname', - label: 'Hostname', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn) { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - }, - }, - { - name: 'cpu', - label: 'CPU', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn) { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - }, - }, - { - name: 'memory', - label: 'Memory', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn) { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - }, - }, - { - name: 'arch', - label: 'Arch', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn) { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - }, - }, - { - name: 'os', - label: 'OS', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn) { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - }, - }, - { - name: 'kubeletVersion', - label: 'Kubelet Version', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn) { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - }, - }, - { - name: 'containerRuntime', - label: 'Container Runtime', - options: { - filter: false, - sort: true, - searchable: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn) { - return ( - sortColumn(index)}> - - {column.label} - - - ); - }, - }, - }, - ]; - - let data = []; - - const options = { - filter: false, - selectableRows: 'none', - }; - - let server = chartData?.kubernetes?.server_version; - - chartData?.kubernetes?.nodes.map((node) => { - let arr = []; - let m = node?.allocatable_memory; - const mem = (String(m).slice(0, String(m).length - 2) * 0.000001024).toPrecision(5); - arr.push(node?.hostname); - arr.push(node?.allocatable_cpu); - arr.push(mem + 'Gi'); - arr.push(node?.architecture); - arr.push(node?.operating_system); - arr.push(node?.kubelet_version); - arr.push(node?.container_runtime_version); - - data.push(arr); - }); - - return ( - - Kubernetes Server Version: {server}} - data={data} - options={options} - columns={columns} - /> - - ); -} - -export default NodeDetails; diff --git a/ui/components/NotificationCenter/README.md b/ui/components/NotificationCenter/README.md deleted file mode 100644 index b9919df1fc4..00000000000 --- a/ui/components/NotificationCenter/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# Bulk Operations in Notification Center - -## Introduction - -Bulk operations in the Notification Center allow users to perform actions like deleting multiple notifications or changing the status of multiple notifications in a batch. This documentation outlines the key features and functionality of bulk operations, including the restriction of performing only one bulk operation at a time, the disabling of buttons during ongoing operations, and the display of a loading icon to indicate ongoing activity. - -## Features - -### 1. Single Bulk Operation at a Time - -To maintain system stability and prevent conflicts, the Notification Center enforces a rule that allows users to initiate only one bulk operation at a time. This means that if a bulk operation is already in progress, any attempt to start another operation will be blocked until the ongoing operation is completed or canceled. - -### 2. Disabled Buttons During Ongoing Operations - -When a bulk operation is initiated, such as deleting or changing the status of notifications, all relevant action buttons are automatically disabled. This prevents users from accidentally triggering additional operations that might interfere with the ongoing one. Disabled buttons ensure the user's actions are synchronized with the current state of notifications. - -### 3. Loading Icon Indicator - -While a bulk operation is in progress, a loading icon is displayed to provide feedback to the user. This visual indicator assures users that their request is being processed, and it also reinforces the idea that actions cannot be performed until the operation completes or is canceled. - -## How It Works - -### Initiating a Bulk Operation - -1. Users select the notifications they want to include in the bulk operation. This is typically done by checking checkboxes next to each notification. - -2. After selecting notifications, users trigger the desired bulk operation (e.g., delete or change status) by clicking the corresponding action button. - -3. Once initiated, the bulk operation begins processing the selected notifications. - -## Further Enchacements - -To ensure a seamless user experience with bulk operations in the Notification Center, consider the following best practices: - -1. Provide clear and concise messaging to inform users about the progress and outcome of the bulk operation. - -2. Implement error handling to gracefully handle any issues that may arise during the operation and communicate errors to the user. - -3. Consider offering a confirmation dialog before initiating a bulk operation to prevent accidental actions. - -# Metadata Formatter Documentation - -When an event is received from the server, it adheres to a fixed schema containing information that is valuable for presentation to the user. This information typically includes details such as the description, date, user_id, system_id, action, and acted-upon resources. Additionally, sometimes there may be a detailed traceback, a summary, or a comprehensive error log, all of which are dynamically generated data encapsulated within the metadata of the event. Presenting this structured data in a user-friendly manner is a crucial task because it contains valuable insights into ongoing operations. - -To accomplish this task, we employ metadata formatters that transform structured data into visually appealing formats. There are currently two types of formatters in use: - -1. **Metadata Specific Formatters**: These formatters are specifically designed for particular types of metadata, such as Error and DryRunResponse. Metadata Specific Formatters are implemented as React components that take the metadata as input and render it within the component. - -2. **Dynamic Formatter**: Since metadata can vary significantly in structure, it is not practical to create a specific formatter for each kind. Dynamic formatters analyze the schema's structure and apply custom-defined rules for formatting: - -## The Metadata Specific Formatter - -Certain metadata, such as Kubernetes responses and Errors, hold high importance and have dedicated renderers. These dedicated renderers can still utilize the dynamic formatter to format specific parts of the response, such as _DryRunResponse_. - -## Reusability - -While this system was initially developed for our events and notification center, the components it comprises are highly reusable and can be employed in other contexts where dynamic formatting of structured data is required. diff --git a/ui/components/NotificationCenter/constants.js b/ui/components/NotificationCenter/constants.js deleted file mode 100644 index f7baa7a5788..00000000000 --- a/ui/components/NotificationCenter/constants.js +++ /dev/null @@ -1,60 +0,0 @@ -import { NOTIFICATIONCOLORS } from '../../themes'; -import AlertIcon from '../../assets/icons/AlertIcon'; -import ErrorIcon from '../../assets/icons/ErrorIcon.js'; -import { Colors } from '../../themes/app'; -import ReadIcon from '../../assets/icons/ReadIcon'; -import { InfoIcon } from '@layer5/sistent'; - -export const SEVERITY = { - INFO: 'informational', - ERROR: 'error', - WARNING: 'warning', - SUCCESS: 'success', -}; - -// This class is required to add to any svg or button that opens notification center -// To prevent the clickaway listner from blocking it -export const NOTIFICATION_CENTER_TOGGLE_CLASS = 'toggle-notification-center'; - -export const SEVERITY_TO_NOTIFICATION_TYPE_MAPPING = { - [SEVERITY.INFO]: 'info', - [SEVERITY.ERROR]: 'error', - [SEVERITY.WARNING]: 'warning', - [SEVERITY.SUCCESS]: 'success', -}; - -export const STATUS = { - READ: 'read', - UNREAD: 'unread', -}; - -export const STATUS_STYLE = { - [STATUS.READ]: { - icon: ReadIcon, - color: Colors.charcoal, - darkColor: '#BCC7CC', - }, -}; - -export const SEVERITY_STYLE = { - [SEVERITY.INFO]: { - icon: InfoIcon, - color: NOTIFICATIONCOLORS.INFO, - darkColor: NOTIFICATIONCOLORS.INFO, - }, - [SEVERITY.ERROR]: { - icon: ErrorIcon, - color: NOTIFICATIONCOLORS.ERROR, - darkColor: NOTIFICATIONCOLORS.ERROR_DARK, - }, - [SEVERITY.WARNING]: { - icon: AlertIcon, - color: NOTIFICATIONCOLORS.WARNING, - darkColor: NOTIFICATIONCOLORS.WARNING, - }, - [SEVERITY.SUCCESS]: { - icon: InfoIcon, - color: NOTIFICATIONCOLORS.SUCCESS, - darkColor: NOTIFICATIONCOLORS.SUCCESS, - }, -}; diff --git a/ui/components/NotificationCenter/filter.js b/ui/components/NotificationCenter/filter.js deleted file mode 100644 index 8a25fae5d21..00000000000 --- a/ui/components/NotificationCenter/filter.js +++ /dev/null @@ -1,47 +0,0 @@ -import { useGetEventFiltersQuery } from '../../rtk-query/notificationCenter'; -import { withErrorBoundary } from '../General/ErrorBoundary'; -import TypingFilter from '../TypingFilter'; -import { SEVERITY, STATUS } from './constants'; - -const useFilterSchema = () => { - const { data } = useGetEventFiltersQuery(); - - return { - SEVERITY: { - value: 'severity', - description: 'Filter by severity', - values: Object.values(SEVERITY), - }, - - STATUS: { - value: 'status', - description: 'Filter by status', - values: Object.values(STATUS), - multiple: false, - }, - - ACTION: { - value: 'action', - values: data?.action || [], - description: 'Filter by type', - }, - - AUTHOR: { - value: 'author', - description: 'Filter by any user or system', - }, - - CATEGORY: { - value: 'category', - description: 'Filter by category', - values: data?.category || [], - }, - }; -}; - -const Filter = withErrorBoundary(({ handleFilter }) => { - const filterSchema = useFilterSchema(); - return ; -}); - -export default Filter; diff --git a/ui/components/NotificationCenter/index.js b/ui/components/NotificationCenter/index.js deleted file mode 100644 index c7da7340b44..00000000000 --- a/ui/components/NotificationCenter/index.js +++ /dev/null @@ -1,603 +0,0 @@ -import React, { useContext, useEffect, useRef, useState } from 'react'; -import IconButton from '@material-ui/core/IconButton'; -import { Provider, useDispatch, useSelector } from 'react-redux'; -import NoSsr from '@material-ui/core/NoSsr'; -import { - Drawer, - Divider, - ClickAwayListener, - Typography, - alpha, - Chip, - Button, - Badge, - CircularProgress, - Box, - useTheme, - Tooltip, - Checkbox, - Collapse, -} from '@material-ui/core'; -import Filter from './filter'; -import BellIcon from '../../assets/icons/BellIcon.js'; -import { iconMedium } from '../../css/icons.styles'; -import { - NOTIFICATION_CENTER_TOGGLE_CLASS, - SEVERITY, - SEVERITY_STYLE, - STATUS, - STATUS_STYLE, -} from './constants'; -import classNames from 'classnames'; -import Notification from './notification'; -import { store } from '../../store'; -import { DarkBackdrop, useNavNotificationIconStyles, useStyles } from './notificationCenter.style'; -import { - closeNotificationCenter, - loadEvents, - loadNextPage, - selectAreAllEventsChecked, - selectCheckedEvents, - selectEvents, - selectSeverity, - toggleNotificationCenter, - updateCheckAllEvents, -} from '../../store/slices/events'; -import { - useDeleteEventsMutation, - useGetEventsSummaryQuery, - useLazyGetEventsQuery, - useUpdateEventsMutation, -} from '../../rtk-query/notificationCenter'; -import _ from 'lodash'; -import DoneIcon from '../../assets/icons/DoneIcon'; -import { ErrorBoundary, withErrorBoundary } from '../General/ErrorBoundary'; -import { hasClass } from '../../utils/Elements'; -import ReadIcon from '../../assets/icons/ReadIcon'; -import UnreadIcon from '../../assets/icons/UnreadIcon'; -import DeleteIcon from '../../assets/icons/DeleteIcon'; -import { useNotification } from '../../utils/hooks/useNotification'; -import { useActorRef } from '@xstate/react'; -import { operationsCenterActor } from 'machines/operationsCenter'; -import { useSelectorRtk } from '@/store/hooks'; - -export const NotificationCenterContext = React.createContext({ - drawerAnchorEl: null, - setDrawerAnchor: () => {}, - toggleButtonRef: null, - operationsCenterActorRef: null, -}); - -export const NotificationCenterProvider = ({ children }) => { - const [drawerAnchorEl, setDrawerAnchor] = useState(null); - const toggleButtonRef = useRef(null); - const { notify } = useNotification(); - const operationsCenterActorRef = useActorRef(operationsCenterActor, { - input: { - notify, - }, - }); - return ( - - {children} - - - ); -}; - -const getSeverityCount = (count_by_severity_level, severity) => { - return count_by_severity_level.find((item) => item.severity === severity)?.count || 0; -}; - -const EmptyState = () => { - const theme = useTheme().palette.secondary; - return ( - - - - {' '} - No notifications to show{' '} - - - ); -}; - -const NavbarNotificationIcon = withErrorBoundary(() => { - const { data } = useGetEventsSummaryQuery(); - const count_by_severity_level = data?.count_by_severity_level || []; - - const currentTopSeverity = - getSeverityCount(count_by_severity_level, SEVERITY.ERROR) > 0 - ? SEVERITY.ERROR - : getSeverityCount(count_by_severity_level, SEVERITY.WARNING) > 0 - ? SEVERITY.WARNING - : null; - const currentSeverityStyle = currentTopSeverity ? SEVERITY_STYLE[currentTopSeverity] : null; - const topSeverityCount = getSeverityCount(count_by_severity_level, currentTopSeverity); - const classes = useNavNotificationIconStyles({ - badgeColor: currentSeverityStyle?.color, - }); - if (currentTopSeverity) { - return ( - - - - ); - } - return ; -}); - -const NotificationCountChip = withErrorBoundary( - ({ classes, notificationStyle, count, type, handleClick, severity }) => { - const theme = useTheme(); - const selectedSeverity = useSelector(selectSeverity); - const darkColor = notificationStyle?.darkColor || notificationStyle?.color; - const chipStyles = { - fill: theme.palette.type === 'dark' ? darkColor : notificationStyle?.color, - height: '20px', - width: '20px', - }; - count = Number(count).toLocaleString('en', { useGrouping: true }); - return ( - - - - ); - }, -); - -const Header = withErrorBoundary(({ handleFilter, handleClose }) => { - const { data } = useGetEventsSummaryQuery(); - const { count_by_severity_level, total_count } = data || { - count_by_severity_level: [], - total_count: 0, - }; - const classes = useStyles(); - const onClickSeverity = (severity) => { - handleFilter({ - severity: [severity], - status: STATUS.UNREAD, - }); - }; - - const onClickStatus = (status) => { - handleFilter({ - status: status, - }); - }; - - const unreadCount = - total_count - count_by_severity_level.reduce((acc, item) => acc + item.count, 0); - return ( -
-
-
- -
- Notifications -
-
- {Object.values(SEVERITY).map((severity) => ( - onClickSeverity(severity)} - notificationStyle={SEVERITY_STYLE[severity]} - type={`Unread ${severity}(s)`} - count={getSeverityCount(count_by_severity_level, severity)} - /> - ))} - onClickStatus(STATUS.READ)} - type={STATUS.READ} - severity={STATUS.READ} - count={unreadCount} - /> -
-
- ); -}); - -const Loading = () => { - return ( - - - - ); -}; - -const BulkActions = () => { - const checkedEvents = useSelector(selectCheckedEvents); - const noEventsPresent = useSelector((state) => selectEvents(state).length === 0); - const [deleteEvents, { isLoading: isDeleting }] = useDeleteEventsMutation(); - const [updateEvents, { isLoading: isUpdatingStatus }] = useUpdateEventsMutation(); - - // stores which update is currently going on , usefull to know which action is going - // if multiple updates can be triggered from same mutator , only single bulk action is allowed at a time - const [curentOngoingUpdate, setCurrentOngoingUpdate] = useState(null); - const isActionInProgress = isDeleting || isUpdatingStatus; - - const dispatch = useDispatch(); - const areAllEventsChecked = useSelector(selectAreAllEventsChecked); - const handleCheckboxChange = (_e, v) => { - dispatch(updateCheckAllEvents(v)); - }; - const resetSelection = () => { - dispatch(updateCheckAllEvents(false)); - }; - - const handleDelete = () => { - deleteEvents({ - ids: checkedEvents.map((e) => e.id), - }).then(resetSelection); - }; - - const handleChangeStatus = (status) => { - setCurrentOngoingUpdate(status); - updateEvents({ - ids: checkedEvents.map((e) => e.id), - updatedFields: { - status, - }, - }).then(resetSelection); - }; - - const BulkActionButton = ({ isLoading, isDisabled, tooltip, Icon, onClick }) => { - const disabled = isDisabled || isActionInProgress; - if (isLoading) { - return ( -
- -
- ); - } - return ( - - - - - - ); - }; - - if (noEventsPresent) { - return null; - } - - return ( - - - - - 0}> - - - handleChangeStatus(STATUS.READ)} - /> - handleChangeStatus(STATUS.UNREAD)} - /> - - - - ); -}; - -const EventsView = withErrorBoundary(({ handleLoadNextPage, isFetching, hasMore }) => { - const events = useSelector(selectEvents); - // const page = useSelector((state) => state.events.current_view.page); - const lastEventRef = useRef(null); - const intersectionObserver = useRef( - new IntersectionObserver( - (entries) => { - if (isFetching && !hasMore) { - return; - } - const firstEntry = entries[0]; - if (firstEntry.isIntersecting) { - handleLoadNextPage(); - } - }, - { threshold: 1 }, - ), - ); - - useEffect(() => { - const currentObserver = intersectionObserver.current; - if (lastEventRef.current) { - currentObserver.observe(lastEventRef.current); - } - return () => { - if (lastEventRef.current) { - currentObserver.unobserve(lastEventRef.current); - } - }; - }, [lastEventRef.current]); - - return ( - <> - {events.map((event, idx) => ( -
- -
- ))} - - {events.length === 0 && } - -
- {isFetching && hasMore && } - - ); -}); - -const CurrentFilterView = withErrorBoundary(({ handleFilter }) => { - const currentFilters = useSelector((state) => state.events.current_view.filters); - const onDelete = (key, value) => { - const newFilters = { - ...currentFilters, - [key]: - typeof currentFilters[key] === 'string' - ? null - : currentFilters[key].filter((item) => item !== value), - }; - handleFilter(newFilters); - }; - - const Chips = ({ type, value }) => { - if (typeof value === 'string') { - return ( - onDelete(type, value)} /> - ); - } - - if (_.isArray(value) && value.length > 0) { - return ( -
- {value.map((item) => ( - onDelete(type, item)} /> - ))} -
- ); - } - - return null; - }; - - return ( -
- {Object.entries(currentFilters).map(([key, value]) => { - if (value && value?.length > 0) { - return ( -
- - {' '} - {key}: - - -
- ); - } - })} -
- ); -}); - -const NotificationCenterDrawer = () => { - const dispatch = useDispatch(); - const { - toggleButtonRef, - drawerAnchorEl: anchorEl, - setDrawerAnchor: setAnchorEl, - } = useContext(NotificationCenterContext); - const isNotificationCenterOpen = useSelector((state) => state.events.isNotificationCenterOpen); - const [fetchEvents, { isFetching }] = useLazyGetEventsQuery(); - const hasMore = useSelector((state) => state.events.current_view.has_more); - - useEffect(() => { - dispatch( - loadEvents(fetchEvents, 0, { - status: STATUS.UNREAD, - }), - ); - }, []); - - const loadMore = () => { - dispatch(loadNextPage(fetchEvents)); - }; - - const handleClose = () => { - if (!isNotificationCenterOpen) { - return; - } - dispatch(closeNotificationCenter()); - setAnchorEl(null); - }; - const classes = useStyles(); - // const { showFullNotificationCenter } = props; - const open = Boolean(anchorEl) || isNotificationCenterOpen; - - const handleFilter = (filters) => { - dispatch(loadEvents(fetchEvents, 0, filters)); - }; - const drawerRef = useRef(); - const clickwayHandler = (e) => { - // checks if event has occured/bubbled up from clicking inside notificationcenter or on the bell icon - if (drawerRef.current.contains(e.target) || toggleButtonRef.current.contains(e.target)) { - return; - } - // check for element with toggle class - if (hasClass(e.target, NOTIFICATION_CENTER_TOGGLE_CLASS)) { - return; - } - // check for svg icon (special case) , not checking the toggle class as it is not added to svg - if (e.target?.className?.baseVal?.includes('MuiSvgIcon')) { - return; - } - handleClose(); - }; - - return ( - <> - - - } - classes={{ - paper: classes.notificationDrawer, - paperAnchorRight: isNotificationCenterOpen ? classes.fullView : classes.peekView, - }} - > -
-
-
-
- -
- - - - -
-
-
-
-
-
- - ); -}; - -const NotificationDrawerButton_ = () => { - const classes = useStyles(); - const { setDrawerAnchor, toggleButtonRef } = useContext(NotificationCenterContext); - const dispatch = useDispatch(); - const handleToggle = () => { - dispatch(toggleNotificationCenter()); - }; - return ( -
- { - e.preventDefault(); - setDrawerAnchor(e.currentTarget); - }} - onMouseLeave={(e) => { - e.preventDefault(); - setDrawerAnchor(null); - }} - > - - -
- ); -}; - -export const NotificationDrawerButton = () => { - return ( - - - - ); -}; - -const NotificationCenter = (props) => { - const isOpen = useSelectorRtk((state) => state.events.isNotificationCenterOpen); - - if (!isOpen) { - return null; - } - - return ( - - null} - onError={(e) => console.error('Error in NotificationCenter', e)} - > - - - - - - ); -}; - -export default NotificationCenter; diff --git a/ui/components/NotificationCenter/metadata.js b/ui/components/NotificationCenter/metadata.js deleted file mode 100644 index 310abc858f9..00000000000 --- a/ui/components/NotificationCenter/metadata.js +++ /dev/null @@ -1,498 +0,0 @@ -import React, { useEffect, useState } from 'react'; -import { Typography, Grid, Box, styled, List, ListItem } from '@layer5/sistent'; -import { Launch as LaunchIcon } from '@material-ui/icons'; -import { alpha } from '@mui/material'; -import { SEVERITY_STYLE, SEVERITY } from '../NotificationCenter/constants'; -import { - FormatStructuredData, - SectionBody, - reorderObjectProperties, - TextWithLinks, -} from '../DataFormatter'; -import { isEmptyAtAllDepths } from '../../utils/objects'; -import { canTruncateDescription } from './notification'; -import { FormatDryRunResponse } from '../DesignLifeCycle/DryRun'; -import { formatDryRunResponse } from 'machines/validator/designValidator'; -import { DeploymentSummaryFormatter } from '../DesignLifeCycle/DeploymentSummary'; - -const StyledDetailBox = styled(Box)(({ theme, severityColor, bgOpacity }) => ({ - padding: theme.spacing(2), - backgroundColor: alpha(severityColor, bgOpacity), - border: `1px solid ${theme.palette.divider}`, - display: 'flex', -})); - -const DryRunResponse = ({ response }) => { - return ; -}; - -const TitleLink = ({ href, children, ...props }) => { - return ( - - - {children} - - - - - - ); -}; - -const UnsuccessfulEntityWithError = ({ modelName, error }) => { - const entityTypesAndQuantities = {}; - error.name.forEach((name, idx) => { - if (name === modelName) { - entityTypesAndQuantities[error.entityType[idx]] = - entityTypesAndQuantities[error.entityType[idx]] + 1 || 1; - } - }); - - const isEntityFile = - modelName.includes('.yaml') || modelName.includes('.yml') || modelName.includes('.json'); - const message = `Import did not occur for ${Object.entries(entityTypesAndQuantities) - .map(([key, value]) => `${value} ${value > 1 ? 'entities' : 'entity'} of type ${key}`) - .join(', ')}.`; - if (isEntityFile) { - return ( - <> - - Import process for file {modelName} encountered error - - - - ); - } - - return ( - <> - {message} - - - ); -}; - -const imageCache = {}; - -const checkImageExists = async (url) => { - try { - const response = await fetch(url); - return response.ok; - } catch (error) { - return false; - } -}; - -const ComponentWithIcon = ({ component }) => { - const { DisplayName, Metadata, Model, Version } = component; - const modelname = Model; - const kind = Metadata.toLowerCase(); - - const paths = [ - `ui/public/static/img/meshmodels/${modelname}/color/${modelname}-color.svg`, - `ui/public/static/img/meshmodels/${modelname}/white/${modelname}-white.svg`, - `ui/public/static/img/meshmodels/${modelname}/color/${kind}-color.svg`, - `ui/public/static/img/meshmodels/${modelname}/white/${kind}-white.svg`, - ]; - - const [finalPath, setFinalPath] = useState( - 'ui/public/static/img/meshmodels/meshery-core/color/meshery-core-color.svg', - ); - - useEffect(() => { - const loadImages = async () => { - if (imageCache[modelname]) { - setFinalPath(imageCache[modelname]); - return; - } - - for (const path of paths) { - const exists = await checkImageExists(path); - if (exists) { - imageCache[modelname] = path; - setFinalPath(path); - return; - } - } - }; - - loadImages(); - }, [modelname, paths]); - - const version = Version - ? Version.startsWith('v') - ? Version - : `v${Version}` - : 'Version not available'; - - return ( - - -
- {DisplayName} -
-
- - - {DisplayName} - - - {version} - - -
- ); -}; - -const RelationshipDetail = ({ relationship }) => { - const { Kind, Subtype, Selectors, RelationshipType } = relationship; - - const renderSelectors = (selectors) => { - return selectors.map((selector, index) => { - return ( -
- - - Kind of {Kind}, sub type {Subtype} and type {RelationshipType} - - - - - FROM - - {selector.allow.from.map((f, idx) => ( - - {`${f.kind}`} - - ))} - - - - TO - - {selector.allow.to.map((t, idx) => ( - - {`${t.kind}`} - - ))} - - - -
- ); - }); - }; - - return {Selectors && Selectors.length > 0 && renderSelectors(Selectors)}; -}; - -export const ErrorMetadataFormatter = ({ metadata, event }) => { - const longDescription = metadata?.LongDescription || []; - const probableCause = metadata?.ProbableCause || []; - const suggestedRemediation = metadata?.SuggestedRemediation || []; - const errorCode = metadata?.error_code || ''; - const code = metadata?.Code || ''; - const formattedErrorCode = errorCode ? `${errorCode}-${code}` : code; - const errorLink = `https://docs.meshery.io/reference/error-codes#${formattedErrorCode}`; - const ErrorDetailsObjectFormatter = ({ heading, value }) => { - return ( - - - {heading} - - - {value.map((error, idx) => ( - - - {error} - - - ))} - - - ); - }; - return ( - -
- {formattedErrorCode} - {event?.description && } -
- , - }} - /> -
-
- - 0 ? 6 : 12}> - ( - - ), - }} - /> - - 0 ? 6 : 12}> - ( - - ), - }} - /> - - -
- ); -}; - -const EmptyState = ({ event }) => { - return ( - - {' '} - { - - }{' '} - - ); -}; - -const ModelImportedSection = ({ modelDetails }) => { - if (typeof modelDetails !== 'object' || Array.isArray(modelDetails)) { - return null; - } - - return ( - <> - {Object.keys(modelDetails).map((modelName, index) => { - const detail = modelDetails[modelName]; - const isEntityFile = - modelName.includes('.yaml') || modelName.includes('.yml') || modelName.includes('.json'); - - const isMultipleComponents = - Array.isArray(detail.Components) && detail.Components.length > 1; - const isMultipleRelationships = - Array.isArray(detail.Relationships) && detail.Relationships.length > 1; - const hasComponents = Array.isArray(detail.Components) && detail.Components.length > 0; - const hasRelationships = - Array.isArray(detail.Relationships) && detail.Relationships.length > 0; - const hasErrors = Array.isArray(detail.Errors) && detail.Errors.length > 0; - - return ( - - - - {isEntityFile ? 'FILE NAME:' : 'MODEL:'}{' '} - - {modelName} - - {hasComponents && ( - <> - - - - {isMultipleComponents ? 'COMPONENTS:' : 'COMPONENT:'} - - - {detail.Components.map((component, idx) => ( - - - - ))} - - - )} - {hasRelationships && ( - <> - - - - {isMultipleRelationships ? 'RELATIONSHIPS:' : 'RELATIONSHIP:'} - - - {detail.Relationships.map((relationship, idx) => ( - - - - ))} - - - )} - {hasErrors && - detail.Errors.map((error, idx) => ( - - - - - - ))} - - ); - })} - - ); -}; - -const ModelImportMessages = ({ message }) => ( - - {`SUMMARY: `} - {message} - -); - -export const FormattedMetadata = ({ event }) => { - const PropertyFormatters = { - doc: (value) => Doc, - ShortDescription: (value) => , - error: (value) => , - dryRunResponse: (value) => , - DownloadLink: (value) => ( - - Download - - ), - ViewLink: (value) => ( - View - ), - ModelImportMessage: (value) => - value && ( - - - - ), - - ModelDetails: (value) => - value && ( - - - - ), - }; - - const EventTypeFormatters = { - deploy: DeploymentSummaryFormatter, - undeploy: DeploymentSummaryFormatter, - }; - - if (EventTypeFormatters[event.action]) { - const Formatter = EventTypeFormatters[event.action]; - return ; - } - - if (!event || !event.metadata || isEmptyAtAllDepths(event.metadata)) { - return ; - } - - const metadata = { - ...event.metadata, - ShortDescription: - event.metadata.error || !canTruncateDescription(event.description || '') - ? null - : event.description, - }; - - const order = [ - 'doc', - 'ShortDescription', - 'LongDescription', - 'Summary', - 'SuggestedRemediation', - 'DownloadLink', - 'ViewLink', - 'ModelImportMessage', - 'ModelDetails', - ]; - const hasImportedModelName = !!metadata.ImportedModelName; - const orderedMetadata = hasImportedModelName - ? reorderObjectProperties({ ...metadata, ShortDescription: null }, order) // Exclude ShortDescription - : reorderObjectProperties(metadata, order); - return ( - - ); -}; diff --git a/ui/components/NotificationCenter/notification.js b/ui/components/NotificationCenter/notification.js deleted file mode 100644 index 2b355b05394..00000000000 --- a/ui/components/NotificationCenter/notification.js +++ /dev/null @@ -1,455 +0,0 @@ -import * as React from 'react'; -import { - Avatar, - Box, - Button, - Collapse, - Grid, - Hidden, - IconButton, - Popover, - Slide, - Tooltip, - Typography, - alpha, - useTheme, -} from '@material-ui/core'; -import { makeStyles } from '@material-ui/core'; -import { SEVERITY_STYLE, STATUS } from './constants'; -import { iconLarge, iconMedium } from '../../css/icons.styles'; -import { MoreVert as MoreVertIcon } from '@material-ui/icons'; -import FacebookIcon from '../../assets/icons/FacebookIcon'; -import LinkedInIcon from '../../assets/icons/LinkedInIcon'; -import TwitterIcon from '../../assets/icons/TwitterIcon'; -import ShareIcon from '../../assets/icons/ShareIcon'; -import DeleteIcon from '../../assets/icons/DeleteIcon'; -import moment from 'moment'; -import { - useUpdateStatusMutation, - useDeleteEventMutation, -} from '../../rtk-query/notificationCenter'; -import { useDispatch, useSelector } from 'react-redux'; -import { - selectEventById, - selectIsEventVisible, - updateIsEventChecked, -} from '../../store/slices/events'; -import { useGetUserByIdQuery } from '../../rtk-query/user'; -import { FacebookShareButton, LinkedinShareButton, TwitterShareButton } from 'react-share'; -import ReadIcon from '../../assets/icons/ReadIcon'; -import UnreadIcon from '../../assets/icons/UnreadIcon'; -import { - ErrorBoundary, - withErrorBoundary, - withSuppressedErrorBoundary, -} from '../General/ErrorBoundary'; -import { FormattedMetadata } from './metadata'; -import theme from '../../themes/app'; -import { truncate } from 'lodash'; -import { Checkbox } from '@layer5/sistent'; -import { UsesSistent } from '../SistentWrapper'; - -const useStyles = makeStyles(() => ({ - root: (props) => ({ - width: '100%', - borderRadius: '0.25rem', - border: `0.1rem solid ${props.notificationColor}`, - borderLeftWidth: props.status === STATUS.UNREAD ? '0.5rem' : '0.1rem', - marginBlock: '0.5rem', - }), - - summary: (props) => ({ - paddingBlock: '0.5rem', - paddingInline: '0.25rem', - cursor: 'pointer', - backgroundColor: alpha(props.notificationColor, 0.2), - }), - - gridItem: { - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - }, - - message: { - overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', - overflowWrap: 'break-word', - // max of min of 20rem or 50vw - maxWidth: 'min(25rem, 50vw)', - width: '100%', - }, - expanded: { - paddingBlock: '0.75rem', - paddingInline: '0.2rem', - [theme.breakpoints.down('md')]: { - padding: '0.5rem', - }, - }, - actorAvatar: { - display: 'flex', - justifyContent: 'center', - alignItems: 'start', - paddingTop: '1rem', - }, - - descriptionHeading: { - fontWeight: 'bolder !important', - textTransform: 'uppercase', - fontSize: '0.9rem', - }, -})); - -export const eventPreventDefault = (e) => { - e.preventDefault(); -}; - -export const eventstopPropagation = (e) => { - e.stopPropagation(); -}; - -export const MAX_NOTIFICATION_DESCRIPTION_LENGTH = 45; - -export const canTruncateDescription = (description) => { - return description.length > MAX_NOTIFICATION_DESCRIPTION_LENGTH; -}; - -const AvatarStack = ({ avatars, direction }) => { - const theme = useTheme(); - return ( - - {avatars.map((avatar, index) => ( - -
- -
-
- ))} -
- ); -}; - -const useMenuStyles = makeStyles((theme) => { - return { - paper: { - color: theme.palette.secondary.iconMain, - boxShadow: theme.shadows[4], - borderRadius: '0.25', - paddingInline: '0.5rem', - paddingBlock: '0.25rem', - width: '12.5rem', - }, - - list: { - display: 'flex', - flexDirection: 'column', - gridGap: '0.5rem', - marginBlock: '0.5rem', - borderRadius: '0.25rem', - backgroundColor: theme.palette.secondary.honeyComb, - '&:hover': { - backgroundColor: alpha(theme.palette.secondary.link2, 0.25), - }, - }, - - listItem: { - display: 'flex', - gridGap: '0.5rem', - alignItems: 'center', - justifyContent: 'space-around', - }, - socialListItem: { - display: 'flex', - backgroundColor: alpha(theme.palette.secondary.honeyComb, 0.25), - alignItems: 'center', - justifyContent: 'space-around', - padding: '.65rem', - }, - - button: { - height: '100%', - width: '100%', - display: 'flex', - alignItems: 'center', - justifyContent: 'start', - }, - }; -}); - -const formatTimestamp = (utcTimestamp) => { - const currentUtcTimestamp = moment.utc().valueOf(); - - const timediff = currentUtcTimestamp - moment(utcTimestamp).valueOf(); - - if (timediff >= 24 * 60 * 60 * 1000) { - return moment(utcTimestamp).local().format('MMM DD, YYYY'); - } - return moment(utcTimestamp).fromNow(); -}; - -const BasicMenu = withSuppressedErrorBoundary(({ event }) => { - const classes = useMenuStyles(); - const [anchorEl, setAnchorEl] = React.useState(null); - const open = Boolean(anchorEl); - - const handleClick = (event) => { - event.stopPropagation(); - setAnchorEl(event.currentTarget); - }; - const handleClose = (e) => { - e.stopPropagation(); - setAnchorEl(null); - }; - - const [isSocialShareOpen, setIsSocialShareOpen] = React.useState(false); - const toggleSocialShare = (e) => { - e.stopPropagation(); - setIsSocialShareOpen((prev) => !prev); - }; - - const theme = useTheme(); - return ( -
e.stopPropagation()}> - - - - - -
- - - - - - - - - - - - - - - - -
- - - -
-
-
- ); -}); - -export const DeleteEvent = ({ event }) => { - const classes = useMenuStyles(); - const [deleteEventMutation] = useDeleteEventMutation(); - const theme = useTheme(); - const handleDelete = (e) => { - e.stopPropagation(); - deleteEventMutation({ id: event.id }); - }; - return ( -
- -
- ); -}; - -export const ChangeStatus = ({ event }) => { - const classes = useMenuStyles(); - const newStatus = event.status === STATUS.READ ? STATUS.UNREAD : STATUS.READ; - const [updateStatusMutation] = useUpdateStatusMutation(); - const theme = useTheme(); - - const updateStatus = (e) => { - e.stopPropagation(); - updateStatusMutation({ id: event.id, status: newStatus }); - }; - return ( -
- -
- ); -}; - -export const Notification = withErrorBoundary(({ event_id }) => { - const event = useSelector((state) => selectEventById(state, event_id)); - const isVisible = useSelector((state) => selectIsEventVisible(state, event.id)); - const severityStyles = SEVERITY_STYLE[event.severity]; - const classes = useStyles({ - notificationColor: severityStyles?.color, - status: event?.status, - }); - const theme = useTheme(); - const dispatch = useDispatch(); - const [expanded, setExpanded] = React.useState(false); - const handleExpandClick = (e) => { - e.stopPropagation(); - setExpanded(!expanded); - }; - - const { data: user } = useGetUserByIdQuery(event.user_id || ''); - - const userName = `${user?.first_name || ''} ${user?.last_name || ''}`; - const userAvatarUrl = user?.avatar_url || ''; - - const handleSelectEvent = (e, value) => { - e.stopPropagation(); - dispatch( - updateIsEventChecked({ - id: event.id, - value, - }), - ); - }; - - const eventActors = [ - ...(event.user_id && user - ? [{ name: userName, avatar_url: userAvatarUrl, tooltip: userName }] - : []), - ...(event.system_id - ? [ - { - name: 'Meshery', - avatar_url: '/static/img/meshery-logo.png', - tooltip: `System ID: ${event.system_id}`, - }, - ] - : []), - ]; - - return ( - -
- - - - - - - - - - {truncate(event.description, { - length: MAX_NOTIFICATION_DESCRIPTION_LENGTH, - })} - - - - - {formatTimestamp(event.created_at)} - - - - - - - - - - - - - - - - -
-
- ); -}); - -export default Notification; diff --git a/ui/components/NotificationCenter/notificationCenter.style.js b/ui/components/NotificationCenter/notificationCenter.style.js deleted file mode 100644 index 1cabddebe3f..00000000000 --- a/ui/components/NotificationCenter/notificationCenter.style.js +++ /dev/null @@ -1,108 +0,0 @@ -import { makeStyles, styled } from '@material-ui/core'; - -export const DarkBackdrop = styled('div')(({ open }) => ({ - position: 'fixed', - top: 0, - left: 0, - right: 0, - bottom: 0, - backgroundColor: 'rgba(0, 0, 0, 0.5)', // Adjust the opacity as needed - display: open ? 'block' : 'none', // Show only when anchored to mobile - zIndex: '1202', // Ensure it's behind the container -})); -export const useStyles = makeStyles((theme) => ({ - sidelist: { - width: '45rem', - maxWidth: '95vw', - }, - notificationButton: { - height: '100%', - '&:hover': { - color: theme.palette.secondary.whiteIcon, - }, - }, - notificationDrawer: { - backgroundColor: theme.palette.secondary.drawer, - display: 'flex', - flexDirection: 'column', - justifyContent: 'space-between', - boxShadow: theme.shadows[2], - zIndex: 1205, - }, - drawerButton: { - padding: '0.45rem', - margin: '0.2rem', - backgroundColor: theme.palette.secondary.dark, - color: '#FFFFFF', - '&:hover': { - backgroundColor: '#FFFFFF', - color: theme.palette.secondary.dark, - }, - }, - fullView: { - right: 0, - transition: '0.3s ease-in-out !important', - }, - peekView: { - right: '-42.8rem', - transition: '0.3s ease-in-out !important', - }, - - container: { - padding: '1.25rem', - }, - header: { - display: 'flex', - gap: '0.5rem', - justifyContent: 'space-between', - alignItems: 'center', - height: '5.65rem', - flexWrap: 'wrap', - background: theme.palette.secondary.headerColor, - }, - title: { - display: 'flex', - alignItems: 'center', - gap: '0.5rem', - }, - titleBellIcon: { - width: '2.25rem', - height: '2.25rem', - borderRadius: '100%', - backgroundColor: 'black', - display: 'flex', - padding: '0.2rem', - justifyContent: 'center', - alignItems: 'center', - cursor: 'pointer', - }, - // Aggregrate Level Chips - severityChip: { - borderRadius: '0.25rem', - display: 'flex', - gap: '0.45rem', - justifyContent: 'start', - alignItems: 'center', - fontSize: '.95rem', - fontWeight: 600, - cursor: 'pointer', - }, - // Aggregrate Level Chips - severityChips: { - display: 'flex', - flexWrap: 'wrap', - gap: '0.75rem', - alignItems: 'center', - }, - notification: { - margin: theme.spacing(0.5, 1), - }, -})); - -export const useNavNotificationIconStyles = makeStyles(() => ({ - root: (props) => ({ - '& .MuiBadge-badge': { - backgroundColor: props.badgeColor, - }, - }), -})); diff --git a/ui/components/NotificationCenter/shared.style.js b/ui/components/NotificationCenter/shared.style.js deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/ui/components/PageContext.js b/ui/components/PageContext.js deleted file mode 100644 index f6a305d6585..00000000000 --- a/ui/components/PageContext.js +++ /dev/null @@ -1,35 +0,0 @@ -import { SheetsRegistry } from 'jss'; -import { createTheme } from '@material-ui/core/styles'; - -// a theme with custom primary and secondary color. -// it's optional. -const theme = createTheme({}); - -function createPageContext() { - return { - theme, - // this is needed in order to deduplicate the injection of CSS in the page. - sheetsManager: new Map(), - // this is needed in order to inject the critical CSS. - sheetsRegistry: new SheetsRegistry(), - // the standard class name generator. - // generateClassName: createGenerateClassName(), - }; -} - -let pageContext; - -export default function getPageContext() { - // make sure to create a new context for every server-side request so that data - // isn't shared between connections (which would be bad). - if (!process.browser) { - return createPageContext(); - } - - // reuse context on the client-side. - if (!pageContext) { - pageContext = createPageContext(); - } - - return pageContext; -} diff --git a/ui/components/Popup.js b/ui/components/Popup.js deleted file mode 100644 index ef7519609fb..00000000000 --- a/ui/components/Popup.js +++ /dev/null @@ -1,210 +0,0 @@ -import { Button, Grid, IconButton, Typography, useTheme } from '@material-ui/core'; -import { makeStyles } from '@material-ui/core/styles'; -import CloseIcon from '@material-ui/icons/Close'; -import { useRouter } from 'next/router'; -import React, { useEffect, useState } from 'react'; -import { connect } from 'react-redux'; -import Cookies from 'universal-cookie'; -import { mesheryExtensionRoute } from '../pages/_app'; -import { Colors } from '@/themes/app'; - -const styles = makeStyles((theme) => ({ - paper: { - position: 'fixed', - width: 450, - backgroundColor: theme.palette.secondary.mainBackground, - border: '0px solid #000', - boxShadow: theme.shadows[5], - padding: theme.spacing(1, 2, 3, 4), - right: 0, - bottom: 0, - borderRadius: 10, - ['@media (max-width: 455px)']: { - width: '100%', - }, - zIndex: 1201, - }, - grid: { - width: '100%', - }, - designerImg: { - height: '205px', - width: 'auto', - margin: 'auto', - boxShadow: - '1px 2px 2px hsl(173deg, 100%, 35% , 0.133), \ - 2px 4px 4px hsl(173deg, 100%, 35% , 0.133), \ - 3px 6px 6px hsl(173deg, 100%, 35% , 0.133)', - }, - header: { - paddingBottom: '0.5rem', - paddingTop: '0.6rem', - fontWeight: 'bold', - color: '#F6F8F8', - ['@media (max-width: 455px)']: { - fontSize: '1rem', - }, - }, - closeButtonContainer: { - display: 'flex', - justifyContent: 'flex-end', - whiteSpace: 'nowrap', - alignItems: 'center', - color: '#F6F8F8', - }, - caption: { - lineHeight: '1.2', - paddingBottom: '15px', - fontSize: '.85rem', - textAlign: 'center', - color: '#F6F8F8', - }, - imgWrapper: { - padding: '0px 10px 15px 0', - display: 'flex', - }, - headerWrapper: { - marginBottom: 12, - display: 'flex', - justifyContent: 'space-between', - }, - popupPrimaryBtn: { - backgroundColor: Colors.keppelGreen, - }, -})); - -const isMesheryExtensionRegisteredUser = (capabilitiesRegistry) => { - if (!capabilitiesRegistry) { - return false; - } - - return ( - capabilitiesRegistry.extensions?.navigator?.length > 0 && - capabilitiesRegistry.extensions.navigator.find((ext) => ext.title === 'Kanvas') - ); -}; - -export function MesheryExtensionEarlyAccessCardPopup({ capabilitiesRegistry }) { - const [isOpen, setIsOpen] = useState(false); - const cookies = new Cookies('registered'); - - const closeCallback = () => { - cookies.set('registered', 'true', { path: '/' }); - }; - - useEffect(() => { - // cookies return string and not boolean thus truthy,falsy doesnt work as intended - const isAlreadyRegistered = cookies.get('registered') && cookies.get('registered') === 'true'; - - if (isAlreadyRegistered) { - return; - } - - const timer = setTimeout(() => { - setIsOpen(true); - }, 10000); // 10sec waiting time - - return () => clearTimeout(timer); - }, []); - - if (isOpen) { - return ( - { - setIsOpen(false); - closeCallback(); - }} - capabilitiesRegistry={capabilitiesRegistry} - /> - ); - } else { - return <>; - } -} - -export function MesheryExtensionEarlyAccessCard({ - rootStyle = {}, - closeForm = () => {}, - capabilitiesRegistry, -}) { - const signUpText = 'Sign up'; - const signupHeader = 'Get early access to Kanvas!'; - const classes = styles(); - const [buttonText, setButtonText] = useState(signUpText); - const [title, setTitle] = useState(signupHeader); - const { push } = useRouter(); - const theme = useTheme(); - const popupImageSrc = - theme.palette.type === 'dark' ? '/static/img/aws.svg' : '/static/img/aws-light.svg'; - - const handleButtonClick = (e) => { - if (buttonText === signUpText) { - window.open('https://layer5.io/cloud-native-management/kanvas', '_blank'); - } else { - push(mesheryExtensionRoute); - } - e.stopPropagation(); - }; - - useState(() => { - const isMesheryExtensionUser = isMesheryExtensionRegisteredUser(capabilitiesRegistry); - if (isMesheryExtensionUser) { - setTitle('Collaborative management enabled'); - setButtonText('Open Kanvas'); - } else { - setTitle(signupHeader); - setButtonText(signUpText); - } - }, [capabilitiesRegistry]); - - return ( -
-
- - {title} - - -
- - - -
-
- -
- -
- - - Friends don't let friends GitOps alone. Visually design and collaborate in real-time - with other Meshery users. - - -
- - - -
-
- ); -} - -const mapStateToProps = (state) => ({ - capabilitiesRegistry: state.get('capabilitiesRegistry'), -}); - -export default connect(mapStateToProps)(MesheryExtensionEarlyAccessCardPopup); diff --git a/ui/components/PromptComponent.js b/ui/components/PromptComponent.js deleted file mode 100644 index 2166780685b..00000000000 --- a/ui/components/PromptComponent.js +++ /dev/null @@ -1,192 +0,0 @@ -import React from 'react'; -import { - withStyles, - Typography, - DialogContentText, - FormControlLabel, - Checkbox, -} from '@material-ui/core'; -import theme from '../themes/app'; -import { - Box, - Modal, - ModalBody, - ModalButtonPrimary, - ModalButtonSecondary, - ModalFooter, -} from '@layer5/sistent'; -import { UsesSistent } from './SistentWrapper'; - -const styles = (theme) => ({ - title: { - textAlign: 'center', - minWidth: 400, - padding: '10px', - color: '#fff', - backgroundColor: - theme.palette.type === 'dark' ? theme.palette.secondary.headerColor : '#396679', - }, - subtitle: { - minWidth: 400, - overflowWrap: 'anywhere', - textAlign: 'center', - padding: '5px', - color: theme.palette.secondary.text, - }, - actions: { - display: 'flex', - justifyContent: 'space-evenly', - }, - - button1: { - margin: theme.spacing(0.5), - padding: theme.spacing(1), - borderRadius: 5, - backgroundColor: '#e0e0e0', - color: 'rgba(0, 0, 0, 0.87)', - '&:hover': { - backgroundColor: '#d5d5d5', - boxShadow: - '0px 2px 4px -1px rgb(0 0 0 / 20%), 0px 4px 5px 0px rgb(0 0 0 / 14%), 0px 1px 10px 0px rgb(0 0 0 / 12%)', - }, - minWidth: 100, - }, - resetButton: { - backgroundColor: '#8F1F00', - '&:hover': { - backgroundColor: '#B32700', - }, - }, - checkboxLabelStyle: { - fontSize: '1rem', - }, - checkbox: { - color: theme.palette.secondary.focused, - '&$checked': { - color: theme.palette.secondary.focused, - }, - }, -}); - -export const PROMPT_VARIANTS = { - WARNING: 'warning', - DANGER: 'danger', - SUCCESS: 'success', - CONFIRMATION: 'confirmation', -}; - -class PromptComponent extends React.Component { - constructor(props) { - super(props); - this.state = { - show: false, - title: '', - subtitle: '', - options: [], - isChecked: false, - showCheckbox: false, - showInfoIcon: null, - }; - this.promiseInfo = {}; - this.variant = this.props.variant; - } - - show = async (passed) => { - return new Promise((resolve, reject) => { - this.promiseInfo = { resolve, reject }; - this.variant = passed.variant; - this.setState({ - title: passed.title, - subtitle: passed.subtitle, - options: passed.options, - showCheckbox: !!passed.showCheckbox, - show: true, - showInfoIcon: passed.showInfoIcon || null, - }); - }); - }; - - hide = () => { - this.setState({ show: false }); - }; - - handleCheckboxChange = () => { - this.setState((prevState) => ({ - isChecked: !prevState.isChecked, - })); - }; - - getCheckboxState = () => { - return this.state.isChecked; - }; - - render() { - const { show, options, title, subtitle, isChecked, showCheckbox, showInfoIcon } = this.state; - const { classes } = this.props; - const { resolve } = this.promiseInfo; - return ( -
- - - {subtitle !== '' && ( - - - {subtitle} - - {showCheckbox && ( - - } - label={Do not show again} - /> - )} - - )} - - - {options.length > 1 && ( - { - this.hide(); - resolve(options[1]); - }} - key={options[1]} - > - - {' '} - {options[1]}{' '} - - - )} - { - this.hide(); - resolve(options[0]); - }} - key={options[0]} - promptVariant={this.variant} - style={this.variant && { backgroundColor: theme.palette.secondary[this.variant] }} - type="submit" - variant="contained" - > - - {options[0]}{' '} - - - - - - -
- ); - } -} - -export default withStyles(styles)(PromptComponent); diff --git a/ui/components/RJSFUtils/common.js b/ui/components/RJSFUtils/common.js deleted file mode 100644 index fae3581a935..00000000000 --- a/ui/components/RJSFUtils/common.js +++ /dev/null @@ -1,35 +0,0 @@ -export const selectCompSchema = (enums, description, title, name, multiSelect = false) => { - const intermediary = - multiSelect === true ? getMultiselectSchema(enums) : getSingleSelectSchema(enums); - - return { - properties: { - [name]: { - description: description, - ...intermediary, - title: title, - uniqueItems: true, - 'x-rjsf-grid-area': 12, - }, - }, - required: [name], - type: 'object', - }; -}; - -const getSingleSelectSchema = (enums) => { - return { - enum: enums, - }; -}; - -const getMultiselectSchema = (enums) => { - return { - items: { - enum: enums, - type: 'string', - }, - minItems: 1, - type: 'array', - }; -}; diff --git a/ui/components/ReactSelectWrapper.js b/ui/components/ReactSelectWrapper.js deleted file mode 100644 index 2ff5f00b774..00000000000 --- a/ui/components/ReactSelectWrapper.js +++ /dev/null @@ -1,206 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import classNames from 'classnames'; -import CreateSelect from 'react-select/creatable'; -import { withStyles } from '@material-ui/core/styles'; -import Typography from '@material-ui/core/Typography'; -import NoSsr from '@material-ui/core/NoSsr'; -import TextField from '@material-ui/core/TextField'; -import Paper from '@material-ui/core/Paper'; -import Chip from '@material-ui/core/Chip'; -import MenuItem from '@material-ui/core/MenuItem'; -import CancelIcon from '@material-ui/icons/Cancel'; - -const styles = () => ({ - input: { display: 'flex' }, - valueContainer: { - display: 'flex', - flex: 1, - alignItems: 'center', - overflow: 'hidden', - }, - placeholder: { - position: 'absolute', - left: 16, - fontSize: 16, - }, - paper: { - zIndex: 9999, - width: '100%', - position: 'absolute', - }, - noOptionsMessage: { - padding: '0.2rem', - marginLeft: '0.8rem', - }, -}); - -function NoOptionsMessage(props) { - return ( - - {props.children} - - ); -} - -function inputComponent({ inputRef, ...props }) { - return
; -} - -function Control(props) { - return ( - - ); -} - -function Option(props) { - return ( - - {props.children} - - ); -} - -function Placeholder(props) { - return ( - - {props.children} - - ); -} - -function SingleValue(props) { - return ( - - {props.children} - - ); -} - -function ValueContainer(props) { - return
{props.children}
; -} - -function MultiValue(props) { - return ( - } - /> - ); -} - -function Menu(props) { - return ( - - {props.children} - - ); -} - -const components = { - Control, - Menu, - MultiValue, - NoOptionsMessage, - Option, - Placeholder, - SingleValue, - ValueContainer, -}; - -// NOTE: This is a wrapper for react-select -// It is used to customize the look and feel of the react-select component -// NOTE: Migrate to functional component and move to sistent -class ReactSelectWrapper extends React.Component { - render() { - const { - classes, - theme, - label, - placeholder, - onChange, - onInputChange, - value, - options, - error, - isMulti = false, - noOptionsMessage = 'Type to create a new Environment', - } = this.props; - - const selectStyles = { - input: (base) => ({ - ...base, - color: theme.palette.text.primary, - '& input': { font: 'inherit' }, - }), - }; - - return ( -
- - noOptionsMessage} - /> - -
- ); - } -} - -ReactSelectWrapper.propTypes = { - classes: PropTypes.object.isRequired, - theme: PropTypes.object.isRequired, - label: PropTypes.string.isRequired, - onChange: PropTypes.func.isRequired, - onInputChange: PropTypes.func.isRequired, - value: PropTypes.object.isRequired, - options: PropTypes.array.isRequired, - error: PropTypes.bool.isRequired, - isMulti: PropTypes.bool, - noOptionsMessage: PropTypes.string, -}; -export default withStyles(styles, { withTheme: true })(ReactSelectWrapper); diff --git a/ui/components/RemoteComponent.js b/ui/components/RemoteComponent.js deleted file mode 100644 index 2fca24c9827..00000000000 --- a/ui/components/RemoteComponent.js +++ /dev/null @@ -1,38 +0,0 @@ -import React from 'react'; -import { - createUseRemoteComponent, - getDependencies, - createRequires, -} from '@paciolan/remote-component'; -// import CircularProgress from "@material-ui/core/CircularProgress"; -import LoadingScreen from './LoadingComponents/LoadingComponent'; - -const requires = createRequires(getDependencies); - -const useRemoteComponent = createUseRemoteComponent({ requires }); - -const RemoteComponent = ({ url, loaderType }) => { - const [loading, err, RemoteComponent] = useRemoteComponent(url.url); - if (loading) { - if (loaderType === 'circular') { - return ''; - } else { - return ( - - ); - } - } - if (err != null) { - /* Debugging log */ - console.error(`Extension Error: ${err.toString()}`); - return <>; - } - - return ( -
- -
- ); -}; - -export default RemoteComponent; diff --git a/ui/components/SistentWrapper.js b/ui/components/SistentWrapper.js deleted file mode 100644 index ff53a01e91c..00000000000 --- a/ui/components/SistentWrapper.js +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; -import { useTheme } from '@material-ui/core/styles'; -import { SistentThemeProviderWithoutBaseLine } from '@layer5/sistent'; - -export const UsesSistent = ({ children }) => { - const theme = useTheme(); - const mode = theme.palette.type; - if (mode === 'dark') { - return ( - - {children} - - ); - } - return ( - - {children} - - ); -}; diff --git a/ui/components/SpacesSwitcher/SpaceSwitcher.js b/ui/components/SpacesSwitcher/SpaceSwitcher.js deleted file mode 100644 index f169aff8b5e..00000000000 --- a/ui/components/SpacesSwitcher/SpaceSwitcher.js +++ /dev/null @@ -1,351 +0,0 @@ -import { useGetOrgsQuery } from '@/rtk-query/organization'; -import { useNotification } from '@/utils/hooks/useNotification'; -import { EVENT_TYPES } from '../../lib/event-types'; -import React, { useEffect, useState } from 'react'; -import { - Button, - FormControl, - FormControlLabel, - FormGroup, - Grid, - MenuItem, - NoSsr, - styled, - TextField, - Typography, - withStyles, - Select, -} from '@material-ui/core'; -import { setKeys, setOrganization, setWorkspace } from '../../lib/store'; -import { connect, Provider } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import styles from './../UserPreferences/style'; -import { store } from '../../store'; -import { withRouter } from 'next/router'; -import OrgOutlinedIcon from '@/assets/icons/OrgOutlinedIcon'; -import { iconXLarge } from 'css/icons.styles'; -import { useGetWorkspacesQuery } from '@/rtk-query/workspace'; -import { useGetCurrentAbilities } from '@/rtk-query/ability'; -import theme from '@/themes/app'; -// import WorkspaceOutlinedIcon from '@/assets/icons/WorkspaceOutlined'; -import { useDynamicComponent } from '@/utils/context/dynamicContext'; -import { UsesSistent } from '../SistentWrapper'; -import _ from 'lodash'; -export const SlideInMenu = styled('div')(() => ({ - width: 0, - overflow: 'hidden', - transition: 'width 2s ease-in' /* Set transition properties */, -})); - -export const SlideInMenuOpen = styled('div')(() => ({ - width: `${(props) => (props.open ? 'auto' : '0')}`, - overflow: 'visible', - transition: ' width 1s ease', -})); - -export const StyledMenuItem = styled(MenuItem)(({ theme }) => ({ - display: 'flex', - flexDirection: 'row', - alignItems: 'center', - textAlign: 'center', - fill: theme.palette.secondary.text, -})); -export const StyledSelect = styled(Select)(() => ({ - paddingTop: '0.5rem', - backgroundColor: 'transparent', - '& .OrgClass': { - display: 'none', - }, - '& svg': { - fill: '#eee', - }, -})); - -export const StyledTextField = styled(TextField)(({ theme }) => ({ - width: '40%', - display: 'flex', - marginBottom: '1.125rem', // 18px converted to rem - marginRight: '0.625rem', // 10px converted to rem - marginTop: '0.5rem', // 8px converted to rem - '& .MuiInput-underline:after': { - borderBottomColor: theme.palette.type === 'dark' ? '#00B39F' : theme.palette.primary, // change the color here - }, - '& .MuiInput': { - fontFamily: 'Qanelas Soft, sans-serif', - }, -})); - -export const StyledHeader = styled(Typography)(({ theme }) => ({ - paddingLeft: theme.spacing(2), - fontSize: '1.25rem', - [theme.breakpoints.up('sm')]: { fontSize: '1.65rem' }, -})); -export const StyledBetaHeader = styled('sup')(() => ({ - color: '#EEEEEE', - fontWeight: '300', - fontSize: '0.8125rem', -})); - -function OrgMenu(props) { - const { - data: orgsResponse, - isSuccess: isOrgsSuccess, - isError: isOrgsError, - error: orgsError, - } = useGetOrgsQuery({}); - let orgs = orgsResponse?.organizations || []; - let uniqueOrgs = _.uniqBy(orgs, 'id'); - const { organization, setOrganization, open } = props; - const [skip, setSkip] = React.useState(true); - const { notify } = useNotification(); - useGetCurrentAbilities(organization, props.setKeys, skip); - useEffect(() => { - if (isOrgsError) { - notify({ - message: `There was an error fetching available data ${orgsError?.data}`, - event_type: EVENT_TYPES.ERROR, - }); - } - }, [isOrgsError, notify, orgsError]); - - const handleOrgSelect = (e) => { - const id = e.target.value; - const selected = orgs.find((org) => org.id === id); - setOrganization({ organization: selected }); - setSkip(false); - }; - return ( - - {isOrgsSuccess && orgs && open && ( - - - - - - - {uniqueOrgs?.map((org) => ( - - - {org.name} - - ))} - - - - } - /> - - - - )} - - ); -} - -export function WorkspaceSwitcher({ organization, open, workspace, setWorkspace }) { - const [orgId, setOrgId] = useState(''); - const { data: workspacesData, isError: isWorkspacesError } = useGetWorkspacesQuery( - { - page: 0, - pagesize: 10, - search: '', - order: '', - orgId: orgId, - }, - { - skip: !orgId ? true : false, - }, - ); - - const handleWorkspaceSelect = (e) => { - const id = e.target.value; - const selected = workspacesData.workspaces.find((org) => org.id === id); - setWorkspace({ workspace: selected }); - }; - - useEffect(() => { - setOrgId(organization?.id); - }, [organization]); - - if (!organization || !workspace) { - return null; - } - - return ( - - {!isWorkspacesError && workspace && ( -
- - - - - - {workspacesData?.workspaces?.map((works) => ( - - {works.name} - - ))} - - - - } - /> - - -
- )} -
- ); -} - -export const FileNameInput = ({ - fileName, - handleFileNameChange, - handleFocus, - activateWalkthrough, -}) => { - return ( - activateWalkthrough && activateWalkthrough()} - /> - ); -}; - -function DefaultHeader({ title, isBeta }) { - return ( - - {title} - {isBeta ? BETA : ''} - - ); -} - -function SpaceSwitcher(props) { - const [orgOpen, setOrgOpen] = useState(false); - // const [workspaceOpen, setWorkspaceOpen] = useState(false); - const { DynamicComponent } = useDynamicComponent(); - return ( - - - -
- - / - {/* / - - / */} -
- {!DynamicComponent && } -
- - - - ); -} - -const mapStateToProps = (state) => { - const organization = state.get('organization'); - const workspace = state.get('workspace'); - return { - organization, - workspace, - }; -}; - -const mapDispatchToProps = (dispatch) => ({ - setOrganization: bindActionCreators(setOrganization, dispatch), - setWorkspace: bindActionCreators(setWorkspace, dispatch), - setKeys: bindActionCreators(setKeys, dispatch), -}); - -export default withStyles(styles)( - connect(mapStateToProps, mapDispatchToProps)(withRouter(SpaceSwitcher)), -); diff --git a/ui/components/TroubleshootingComponent.js b/ui/components/TroubleshootingComponent.js deleted file mode 100644 index ca1f4694bcc..00000000000 --- a/ui/components/TroubleshootingComponent.js +++ /dev/null @@ -1,102 +0,0 @@ -import * as React from 'react'; -import Button from '@material-ui/core/Button'; -import TroubleshootingModal from './TroubleshootingModalComponent'; -import { RJSFModalWrapper } from './Modal'; -import { Modal, helpAndSupportModalSchema, helpAndSupportModalUiSchema } from '@layer5/sistent'; -import { useNotification } from '@/utils/hooks/useNotification'; -import { useGetLoggedInUserQuery } from '@/rtk-query/user'; -import SupportIcon from '@/assets/icons/support'; -import { EVENT_TYPES } from 'lib/event-types'; -import { UsesSistent } from './SistentWrapper'; -import { useSupportWebHookMutation } from '@/rtk-query/webhook'; - -const Troubleshoot = (props) => { - const [open, setOpen] = React.useState(true); - const [openForm, setOpenForm] = React.useState(false); - const { notify } = useNotification(); - const [triggerWebhook] = useSupportWebHookMutation(); - const handleOpen = () => { - setOpen(true); - }; - - const { data: userData } = useGetLoggedInUserQuery(); - - const handleOpenForm = () => { - setOpenForm(true); - }; - - const handleSupportFormClose = () => { - setOpenForm(false); - }; - - const handleSupportFormSubmission = async (data) => { - triggerWebhook({ - body: { - memberFormOne: { - ...data, - firstname: userData?.first_name, - lastname: userData?.last_name, - email: userData?.email, - }, - }, - type: 'support', - }) - .unwrap() - .then(() => { - notify({ - message: - 'Your response has been recorded. We will endeavor to promptly contact you with a suitable solution', - event_type: EVENT_TYPES.SUCCESS, - }); - }) - .catch(() => { - notify({ - message: 'Sorry we are unable to submit your request', - event_type: EVENT_TYPES.ERROR, - }); - }); - }; - - return ( -
- - - - - } - > - - - -
- ); -}; - -export default Troubleshoot; diff --git a/ui/components/TroubleshootingModalComponent.js b/ui/components/TroubleshootingModalComponent.js deleted file mode 100644 index c9af0243d5b..00000000000 --- a/ui/components/TroubleshootingModalComponent.js +++ /dev/null @@ -1,375 +0,0 @@ -import * as React from 'react'; -import Typography from '@material-ui/core/Typography'; -import { Modal } from '@material-ui/core'; -import InfoIcon from '@material-ui/icons/Info'; -import Accordion from '@material-ui/core/Accordion'; -import AccordionDetails from '@material-ui/core/AccordionDetails'; -import AccordionSummary from '@material-ui/core/AccordionSummary'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import CloseIcon from '@material-ui/icons/Close'; -import { makeStyles, Paper } from '@material-ui/core'; -import { IconButton } from '@material-ui/core'; - -const useStyles = makeStyles((theme) => ({ - '@keyframes rotateCloseIcon': { - from: { - transform: 'rotate(0deg)', - }, - to: { - transform: 'rotate(360deg)', - }, - }, - paper: { - top: '50%', - left: '50%', - width: '47.5%', - position: 'absolute', - borderRadius: '10px', - overflow: 'hidden', - transform: 'translate(-50%,-50%)', - backgroundColor: 'transparent', - outline: 'none', - [theme.breakpoints.down(1350)]: { - width: '70%', - }, - }, - headerContainer: { - display: 'flex', - alignItems: 'center', - }, - headerText: { - flexShrink: 0, - margin: 10, - fontSize: '1rem', - }, - infoIcon: { - color: theme.palette.type === 'dark' ? '#00B39F' : '#607d8b', - }, - footerText: { - color: '#EDEDED', - fontSize: '.85rem', - textDecoration: 'italics', - fontFamily: 'Qanelas Soft, sans-serif', - }, - modalHeader: { - display: 'flex', - justifyContent: 'space-between', - alignItems: 'center', - paddingBottom: 10, - padding: '0 .5rem', - paddingTop: 10, - backgroundColor: theme.palette.secondary.mainBackground, - }, - modalFooter: { - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - paddingBottom: 10, - padding: '0 .5rem', - paddingTop: 10, - backgroundColor: theme.palette.secondary.mainBackground, - }, - modalContent: { - backgroundColor: 'transparent', - }, - details: { - display: 'block', - }, - modelHeader: { - fontSize: '1rem', - color: '#fff', - }, - iconStyle: { - color: '#fff', - }, - iconContainer: { - transition: 'all .3s', - '&:hover': { - backgroundColor: 'transparent !important', - animation: '$rotateCloseIcon 1s', - }, - }, - accordionContainer: { - margin: '0 !important', - borderBottom: '1px solid #ccc', - }, - accordionSummary: { - '&.Mui-expanded': { - backgroundColor: theme.palette.type === 'dark' ? '#303030' : '#f1f1f1', - }, - }, - accDetailHead: { - color: theme.palette.type == 'dark' ? 'f1f1f1' : '#444', - fontFamily: 'Qanelas Soft, sans-serif', - }, - troubleshootListitem: { - fontSize: '0.9rem', - marginBottom: '1rem', - }, - keyStyleContainer: { - display: 'inline-block', - padding: '0.1rem 0.5rem', - background: theme.palette.secondary.elevatedComponent, - // boxShadow: "0 1px 5px rgba(0,0,0,0.1)", - margin: '0.3rem', - borderRadius: '5px', - boxShadow: - 'rgba(0, 0, 0, 0.17) 0px -0px 0px -5px inset, rgba(0, 0, 0, 0.15) 0px 0px 0px -3px inset, rgba(0, 0, 0, 0.1) 0px 4px 30px 0px inset, rgba(0, 0, 0, 0.06) 0px 2px 1px, rgba(0, 0, 0, 0.09) 0px 0px 2px, rgba(0, 0, 0, 0.09) 0px 8px 4px, rgba(0, 0, 0, 0.1) 0px 1px 0px, rgba(0, 0, 0, 0.1) 0px -2px 0px', - }, - accDetailsContainer: { - flexDirection: 'column', - }, - troubleshootHelpLink: { - color: theme.palette.type == 'dark' ? '#00B39F' : 'rgb(57, 102, 121)', - fontWeight: 'bold', - textDecoration: 'none', - }, - contactHelpLink: { - color: '#EDEDED', - fontWeight: 'bold', - textDecoration: 'none', - }, - threadPara: { - fontSize: '1.1rem', - textAlign: 'center', - marginTop: '0', - fontStyle: 'italic', - }, - outbtn: { - margin: '0px 8px', - }, -})); - -const TroubleshootingModal = (props) => { - const classes = useStyles(); - const [expanded, setExpanded] = React.useState(false); - const [missingData, setMissingData] = React.useState( - !!props.viewHeaderErrorMessage?.includes('data missing'), - ); - const handleChange = (panel) => (event, isExpanded) => { - setExpanded(isExpanded ? panel : false); - if (missingData) { - setMissingData(false); - } - }; - - const handleClose = () => props?.setOpen(false); - - return ( - - -
-
- - - Meshmap Troubleshooting Guide - - - - -
- - } - aria-controls="panel1bh-content" - id="panel1bh-header" - className={classes.accordionSummary} - > -
- - - Stale Data - -
-
- - - Browser - -
    - -
  • - Run
    CTRL
    + -
    SHIFT
    + -
    R
    or -
    CMD
    + -
    OPTION
    + -
    E
    to force reload if you are - getting stale copy of the component due to caching. -
  • -
  • - Use Incognito or Private browsing mode. If you are still getting stale copy of - the component, try opening a incognito tab -
  • -
    -
-
-
- - } - aria-controls="panel2bh-content" - id="panel2bh-header" - className={classes.accordionSummary} - > -
- - - Missing Data - -
-
- - - Meshery Database - -
    - -
  • - Verify MeshSync data is being received. Run{' '} - kubectl get svc -n meshery. Docker Desktop: VPNkit commonly fails - to assign an IP address to Meshery Broker (MeshSync). Verify that the Meshery - Broker service has external IP address assigned. -
  • -
  • - Confirm that your machine's firewall isn't getting in the way. -
  • -
  • - Dump Meshery Database. Run rm -rf ~/.meshery/config. -
  • -
    -
-
-
- - } - aria-controls="panel3bh-content" - id="panel3bh-header" - className={classes.accordionSummary} - > -
- - - Incompatibility - -
-
- - - GraphQL/Golang Plugin - -
    - -
  • - Building: Ensure that go.mod in the{' '} - meshery/meshery repository is identical to the go.mod{' '} - in the layer5labs/meshery-extensions repository are identical. -
  • -
  • - Loading: Confirm that the plugin version offered by Meshery - Cloud (at{' '} - - https://meshery.layer5.io/capabilities - - ), from which MeshMap files are retreived, matches the plugin{' '} - version that Meshery Server is using as the filesystem reference in{' '} - ~/.meshery/provider/Meshery/vx.x.x/. -
  • -
    -
-
-
- - } - aria-controls="panel4bh-content" - id="panel4bh-header" - className={classes.accordionSummary} - > -
- - - Additional Resources - -
-
- - - Troubleshooting Tips - - - -
-
- - Need help? Contact us via{' '} - - email - {' '} - or{' '} - - community forum - - . - -
-
-
-
- ); -}; - -export default TroubleshootingModal; diff --git a/ui/components/TypingFilter/README.md b/ui/components/TypingFilter/README.md deleted file mode 100644 index bb78b469ca4..00000000000 --- a/ui/components/TypingFilter/README.md +++ /dev/null @@ -1,131 +0,0 @@ -# TypingFilter Component - -The `TypingFilter` component is a customizable React component that enables real-time filtering and selection based on user input. -It provides a user-friendly interface for filtering data in your application. - -## Table of Contents - -- [Usage](#usage) -- [Props](#props) -- [Examples](#examples) - -## Usage - -The `TypingFilter` component is designed to provide an interactive filtering experience in your application. Here's how you can use it: - -```javascript -import React from 'react'; -import TypingFilter from './path-to-TypingFilter'; - -function MyComponent() { - // Define a filter schema that describes the available filter options. - const filterSchema = { - // Define your filter categories here - // Example: - SEVERITY: { - value: 'severity', - description: 'Filter by severity', - values: ['Low', 'Medium', 'High'], - multiple: true, // default - }, - // Add more filter categories as needed - }; - - // Define a callback function to handle filter changes. - const handleFilterChange = (filteredData) => { - // Implement your logic to react to the filtered data. - // This function will be called when the user applies a filter. ( on presing enter in input) - console.log('Filtered data:', filteredData); - }; - - return ( -
- - {/* Your other components */} -
- ); -} - -export default MyComponent; -``` - -## Props - -The `TypingFilter` component accepts the following props: - -- `filterSchema` (object, required): An object that defines available filter options. Each property of this object represents a filter category with the following properties: - - - `value` (string, required): The filter name used for filtering within the category. - - `description` (string, required): Description of the filter category. - - `type` (string, optional): The data type of the filter (e.g., "string", "number"). - - `values` (array, optional): Possible values for the filter. - -- `handleFilter` (function, required): A callback function that is called when the user applies a filter. This function receives the filtered data as an argument. - -- `autoFilter` (boolean,optional) : A boolean to indicate if the filter should be applied automatically (on user input) . - -# Finite State Machine (FSM) for `TypingFilter` Component - -This README provides an overview of the Finite State Machine (FSM) implementation used to manage the state of the `TypingFilter` component. -The FSM is responsible for handling user interactions, such as selecting filters, entering values, and clearing the filter, within the component. - -## Table of Contents - -- [Overview](#overview) -- [State Definitions](#state-definitions) -- [Reducers](#reducers) -- [State Transitions](#state-transitions) -- [Initial State Handling](#initial-state-handling) - -## Overview - -The FSM implementation within the `TypingFilter` component ensures that user interactions are correctly processed and managed, resulting in a smooth and intuitive filtering experience. - -## State Definitions - -The FSM code defines three sets of constants to represent important elements within the state management: - -### 1. `FILTERING_STATE` - -Defines the possible states that the `TypingFilter` component can be in. These states include: - -- `IDLE`: Represents the initial state when the component is not actively filtering. -- `SELECTING_FILTER`: Indicates that the user is selecting a filter. -- `SELECTING_VALUE`: Indicates that the user is entering a filter value. - -### 2. `FILTER_EVENTS` - -Represents the events that trigger state transitions within the FSM. Some of the events include: - -- `START`: Initiates the filtering process. -- `SELECT`: Indicates the selection of a filter. -- `INPUT_CHANGE`: Represents a change in the filter input. -- `CLEAR`: Clears the filter. -- `EXIT`: Exits the filtering process. - -### 3. `Delimiter` - -Defines delimiters used to separate filter and value entries within the component. Delimiters include: - -- `FILTER`: Separates multiple filters. -- `FILTER_VALUE`: Separates filters from their corresponding values. - -## Reducers - -The FSM implementation includes two key reducer functions: - -### 1. `commonReducer` - -This common reducer function handles events that are common across all states. It includes logic to handle "CLEAR" and "EXIT" events, which reset the component's state and clear any entered values. - -### 2. `filterSelectionReducer` - -The `filterSelectionReducer` is a specific reducer used to manage transitions between "SELECTING_FILTER" and "SELECTING_VALUE" states. It handles events related to selecting filters and entering values. The logic ensures that delimiters are appropriately added or removed when the user interacts with the filter. - -## State Transitions - -State transitions are managed based on user actions and the current state of the component. For example, when the user selects a filter, the state transitions from "SELECTING_FILTER" to "SELECTING_VALUE." When the user inputs values or clears the filter, the state transitions are managed accordingly. - -## Initial State Handling - -The FSM implementation includes handling for the initial state, where it listens for the "START" event to transition from "IDLE" to "SELECTING_FILTER." This ensures that the filtering process is initiated when the user interacts with the component. diff --git a/ui/components/TypingFilter/index.js b/ui/components/TypingFilter/index.js deleted file mode 100644 index 14c5abdf141..00000000000 --- a/ui/components/TypingFilter/index.js +++ /dev/null @@ -1,315 +0,0 @@ -import { - ClickAwayListener, - Divider, - Fade, - IconButton, - InputAdornment, - List, - Popper, - TextField, - Typography, - useTheme, -} from '@material-ui/core'; -import ContentFilterIcon from '../../assets/icons/ContentFilterIcon'; -import { useEffect, useReducer, useRef, useState } from 'react'; -import CrossCircleIcon from '../../assets/icons/CrossCircleIcon'; -import clsx from 'clsx'; -import { useStyles, useFilterStyles } from './style'; -import { FILTERING_STATE, FILTER_EVENTS, filterReducer } from './state'; -import { getFilters, getCurrentFilterAndValue } from './utils'; - -const Filters = ({ filterStateMachine, dispatchFilterMachine, filterSchema }) => { - const classes = useFilterStyles(); - const selectFilter = (filter) => { - dispatchFilterMachine({ - type: FILTER_EVENTS.SELECT, - payload: { - value: filter, - }, - }); - }; - - const { filter: currentFilter } = getCurrentFilterAndValue(filterStateMachine); - const matchingFilters = currentFilter - ? Object.values(filterSchema).filter((filter) => filter.value.startsWith(currentFilter)) - : Object.values(filterSchema); - return ( - - {matchingFilters.length == 0 && ( -
- - Sorry we dont currently support this filter - -
- )} - {matchingFilters.map((filter) => { - return ( - <> -
selectFilter(filter.value)} - > - - {filter.value}: - - - {filter.description} - -
- - - ); - })} -
- ); -}; - -const FilterValueSuggestions = ({ filterStateMachine, dispatchFilterMachine, filterSchema }) => { - const classes = useFilterStyles(); - - const selectValue = (value) => { - dispatchFilterMachine({ - type: FILTER_EVENTS.SELECT, - payload: { - value, - }, - }); - }; - const { filter, value } = getCurrentFilterAndValue(filterStateMachine); - const currentFilter = Object.values(filterSchema).find((f) => f.value == filter); - const suggestions = currentFilter?.values?.filter((v) => v.startsWith(value)) || []; - - return ( - - {suggestions.length == 0 && ( -
- - No results available - -
- )} - {suggestions.map((value) => { - return ( - <> -
selectValue(value)} - > - - {value} - -
- - - ); - })} -
- ); -}; - -/** - * Filter Schema Object - * - * The `filterSchema` object defines available filter options for the TypingFilter component. - * It provides information about different filter categories, their descriptions, and possible values. - * - * @typedef {object} FilterSchema - * @property {object} [CATEGORY_NAME] - An object representing a filter category. - * @property {string} [CATEGORY_NAME.value] - The filter name used for filtering within the category. - * @property {string} [CATEGORY_NAME.description] - Description of the filter category. - * @property {string} [CATEGORY_NAME.type] - The data type of the filter (optional). - * @property {string[]} [CATEGORY_NAME.values] - Possible values for the filter (optional). - * - * @example - * // Example filter schema with multiple filter categories - * const filterSchema = { - * SEVERITY: { - * value: "severity", - * description: "Filter by severity", - * values: ["Low", "Medium", "High"], - * }, - * STATUS: { - * value: "status", - * description: "Filter by status", - * type: "string", - * values: ["Open", "Closed", "In Progress"], - * }, - * CUSTOM_FILTER: { - * value: "custom", - * description: "Custom filter description", - * type: "number", - * }, - * // Add more filter categories as needed - * }; - */ - -/** - * TypingFilter Component - * - * A component for real-time filtering and selection with typing. It provides a user-friendly - * interface for filtering data based on user input. - * - * @component - * @param {object} props - Component props. - * @param {FilterSchema} filterSchema - The schema defining available filter options. - * @param {function} handleFilter - A callback function to handle filter changes. - * @param {boolean} autoFilter - A boolean to indicate if the filter should be applied automatically (on user input) . - * @returns {JSX.Element} - A React JSX element representing the TypingFilter component. - */ -const TypingFilter = ({ filterSchema, handleFilter, autoFilter = false }) => { - const theme = useTheme(); - const classes = useStyles(); - const [anchorEl, setAnchorEl] = useState(null); - const isPopperOpen = Boolean(anchorEl); - const inputFieldRef = useRef(null); - const [filteringState, dispatch] = useReducer(filterReducer, { - context: { - value: '', - prevValue: [''], - }, - state: FILTERING_STATE.IDLE, - }); - - const handleFilterChange = (e) => { - if (!anchorEl) { - setAnchorEl(e.currentTarget); - } - - if (e.target.value === '') { - return dispatch({ - type: FILTER_EVENTS.CLEAR, - }); - } - - dispatch({ - type: FILTER_EVENTS.INPUT_CHANGE, - payload: { - value: e.target.value, - }, - }); - }; - - const handleClear = () => { - dispatch({ - type: FILTER_EVENTS.EXIT, - }); - - handleFilter({}); - }; - - const handleFocus = (e) => { - setAnchorEl(e.currentTarget); - dispatch({ type: 'START' }); - }; - - const handleClickAway = (e) => { - if (inputFieldRef.current.contains(e.target)) { - return; - } - - setAnchorEl(null); - }; - - //add enter event listener to the input fieldse - //add esc event listener to the input fields - useEffect(() => { - if (!inputFieldRef.current) { - return; - } - - const handleKeyDown = (e) => { - if (e.key == 'Enter') { - handleFilter(getFilters(e.target.value, filterSchema)); - setAnchorEl(null); - } - }; - inputFieldRef?.current?.addEventListener('keydown', handleKeyDown); - return () => { - inputFieldRef?.current?.removeEventListener('keydown', handleKeyDown); - }; - }, [inputFieldRef.current]); - - useEffect(() => { - if (autoFilter && filteringState.state == FILTERING_STATE.SELECTING_FILTER) { - handleFilter(getFilters(filteringState.context.value, filterSchema)); - } - }, [filteringState.state]); - - return ( -
- - {' '} - {' '} - - ), - endAdornment: ( - - - {filteringState.state !== FILTERING_STATE.IDLE && ( - - )} - - - ), - }} - /> - - - {({ TransitionProps }) => { - return ( - - -
- {filteringState.state == FILTERING_STATE.SELECTING_FILTER && ( - - )} - {filteringState.state == FILTERING_STATE.SELECTING_VALUE && ( - - )} -
-
-
- ); - }} -
-
- ); -}; - -export default TypingFilter; diff --git a/ui/components/TypingFilter/state.js b/ui/components/TypingFilter/state.js deleted file mode 100644 index 3700e3c36c6..00000000000 --- a/ui/components/TypingFilter/state.js +++ /dev/null @@ -1,154 +0,0 @@ -export const FILTERING_STATE = { - IDLE: 'idle', - SELECTING_FILTER: 'selecting_filter', - SELECTING_VALUE: 'selecting_value', -}; - -export const FILTER_EVENTS = { - START: 'start', - SELECT: 'select_filter', - SELECT_FILTER: 'select_filter', - INPUT_CHANGE: 'input_change', - SELECT_FILTER_VALUE: 'select_filter_value', - CLEAR: 'clear', - EXIT: 'exit', -}; - -export const Delimiter = { - FILTER: ' ', - FILTER_VALUE: ':', -}; - -const commonReducer = (stateMachine, action) => { - const { context } = stateMachine; - switch (action.type) { - case FILTER_EVENTS.CLEAR: - return { - state: FILTERING_STATE.SELECTING_FILTER, - context: { - ...context, - value: '', - prevValue: [''], - }, - }; - - case FILTER_EVENTS.EXIT: - return { - state: FILTERING_STATE.IDLE, - context: { - ...context, - value: '', - prevValue: [''], - }, - }; - - default: - return stateMachine; - } -}; - -const filterSelectionReducer = (stateMachine, action, nextState, nextValue) => { - const { state, context } = stateMachine; - const nextDelimiter = - nextState == FILTERING_STATE.SELECTING_FILTER ? Delimiter.FILTER : Delimiter.FILTER_VALUE; - const prevDelimiter = - nextDelimiter == Delimiter.FILTER_VALUE ? Delimiter.FILTER : Delimiter.FILTER_VALUE; - const prevState = nextState; // same beccuase the prevState is the same as the nextState ( as we have only two states) - switch (action.type) { - // Select a filter and move to start entring its value - case FILTER_EVENTS.SELECT: { - const newValue = nextValue(context.prevValue.at(-1), action.payload.value); // ":" is used to separate the filter and its value) - return { - state: nextState, - context: { - ...context, - value: newValue + nextDelimiter, - prevValue: [...context.prevValue, newValue], - }, - }; - } - //" " is used to separate multiple filters - case FILTER_EVENTS.INPUT_CHANGE: - // prevent transition when the the filter/value is empty - if (action.payload.value.endsWith(nextDelimiter) && context.value.endsWith(prevDelimiter)) { - return stateMachine; - } - - // prevent adding multiple delimeters together - if (action.payload.value.endsWith(prevDelimiter) && context.value.endsWith(prevDelimiter)) { - return stateMachine; - } - - if (action.payload.value == context.prevValue.at(-1)) { - return { - state: prevState, - context: { - ...context, - prevValue: context.prevValue.slice(0, -1), - value: action.payload.value, - }, - }; - } - - if (action.payload.value.endsWith(nextDelimiter)) { - const newValue = action.payload.value; - return { - state: nextState, - context: { - ...context, - value: action.payload.value, - prevValue: [...context.prevValue, newValue.slice(0, -1)], - }, - }; - } - - return { - state, // stay in the same state - context: { - ...context, - value: action.payload.value, - }, - }; - default: - return commonReducer(stateMachine, action); - } -}; - -export const filterReducer = (stateMachine, action) => { - const { state } = stateMachine; - switch (state) { - // Initial State - case FILTERING_STATE.IDLE: - switch (action.type) { - // Start the filter process - case 'START': - return { - ...stateMachine, - state: FILTERING_STATE.SELECTING_FILTER, - }; - default: - return stateMachine; - } - - case FILTERING_STATE.SELECTING_FILTER: - // return filterSelectionReducer(stateMachine, action); - return filterSelectionReducer( - stateMachine, - action, - FILTERING_STATE.SELECTING_VALUE, - (prevValue, value) => prevValue + Delimiter.FILTER + value, - ); - - case FILTERING_STATE.SELECTING_VALUE: - return filterSelectionReducer( - stateMachine, - action, - FILTERING_STATE.SELECTING_FILTER, - (prevValue, value) => prevValue + Delimiter.FILTER_VALUE + value, - ); - - // runs for all states - default: - return stateMachine; - } -}; diff --git a/ui/components/TypingFilter/style.js b/ui/components/TypingFilter/style.js deleted file mode 100644 index 1cad5f137b6..00000000000 --- a/ui/components/TypingFilter/style.js +++ /dev/null @@ -1,54 +0,0 @@ -import { makeStyles, alpha } from '@material-ui/core'; - -export const useStyles = makeStyles((theme) => ({ - root: { - position: 'relative', - backgroundColor: theme.palette.secondary.elevatedComponents, - }, - input: { - width: '100%', - marginBottom: '.1rem', - '& .MuiOutlinedInput-root': { - borderRadius: '6px', - backgroundColor: theme.palette.secondary.searchBackground, - '& fieldset': { - borderRadius: '6px', - border: `2px solid ${theme.palette.secondary.searchBorder}`, - }, - }, - }, - - dropDown: { - backgroundColor: theme.palette.secondary.searchBackground, - borderRadius: '6px', - boxShadow: - '0px 2px 4px 0px rgba(0, 0, 0, 0.20), 0px 1px 10px 0px rgba(0, 0, 0, 0.12), 0px 4px 5px 0px rgba(0, 0, 0, 0.14)', - border: `2px solid ${theme.palette.secondary.searchBorder}`, - marginTop: '0.2rem', - }, -})); - -export const useFilterStyles = makeStyles((theme) => ({ - item: { - fontFamily: 'Qanelas Soft, sans-serif', - display: 'flex', - gap: '0.3rem', - margin: '0.3rem', - padding: '0.3rem', - paddingInline: '3rem', - borderRadius: '6px', - cursor: 'pointer', - '&:hover': { - backgroundColor: alpha(theme.palette.secondary.link2, 0.25), - }, - }, - - label: { - fontWeight: 500, - color: theme.palette.secondary.icon, - }, - description: { - fontWeight: 400, - color: theme.palette.secondary.number, - }, -})); diff --git a/ui/components/TypingFilter/utils.js b/ui/components/TypingFilter/utils.js deleted file mode 100644 index a7ff1aef530..00000000000 --- a/ui/components/TypingFilter/utils.js +++ /dev/null @@ -1,56 +0,0 @@ -import { Delimiter } from './state'; - -// returns the filter object from the filterSchema -const getFilterByValue = (value, filterSchema) => { - return Object.values(filterSchema).find((filter) => filter.value == value); -}; - -/** - * Parses a filter string and returns a filter object. - * - * @param {string} filterString - The input filter string of the form "type:value type2:value2 type:value2". - * @returns {Object} - The filter object with types as keys and arrays of values as values. - */ -export const getFilters = (filterString, filterSchema) => { - const filters = {}; - const filterValuePairs = filterString.split(Delimiter.FILTER); - filterValuePairs.forEach((filterValuePair) => { - const [filter, value] = filterValuePair.split(Delimiter.FILTER_VALUE); - - if (getFilterByValue(filter, filterSchema)?.multiple == false) { - filters[filter] = value; - return; - } - - if (filter && value) { - filters[filter] = filters[filter] || []; - if (!filters[filter].includes(value)) { - filters[filter].push(value); - } - } - }); - - return filters; -}; - -// return a filter string of form "type:value type2:value2 type:value2" -// from a filter object of form { type : {values} , type2 : {values} } -export const getFilterString = (filters) => { - return Object.entries(filters).reduce((filterString, [filter, values]) => { - return ( - filterString + - [...values].map((value) => `${filter}${Delimiter.FILTER_VALUE}${value}`).join(' ') - ); - }, ''); -}; - -export const getCurrentFilterAndValue = (filteringState) => { - const { context } = filteringState; - const currentFilterValue = context.value.split(Delimiter.FILTER).at(-1); - const currentFilter = currentFilterValue.split(Delimiter.FILTER_VALUE)?.[0] || ''; - const currentValue = currentFilterValue.split(Delimiter.FILTER_VALUE)?.[1] || ''; - return { - filter: currentFilter, - value: currentValue, - }; -}; diff --git a/ui/components/URLUploader.js b/ui/components/URLUploader.js deleted file mode 100644 index be3fe0661be..00000000000 --- a/ui/components/URLUploader.js +++ /dev/null @@ -1,118 +0,0 @@ -import React, { useEffect } from 'react'; -import LinkIcon from '@material-ui/icons/Link'; -import { Tooltip, IconButton, TextField, Button, Grid } from '@material-ui/core'; -import { withStyles } from '@material-ui/core/styles'; -// import { createTheme } from '@material-ui/core/styles'; -import { URLValidator } from '../utils/URLValidator'; - -// const getMuiTheme = () => createTheme({ -// palette : { -// primary : { -// main : "#607d8b" -// } -// }, -// overrides : { -// MuiGrid : { -// input : { -// color : '#607d8b' -// } -// }, -// } -// }) - -const styles = (theme) => ({ - paper: { - position: 'absolute', - width: 600, - backgroundColor: theme.palette.background.paper, - border: '0px solid #000', - boxShadow: theme.shadows[5], - padding: theme.spacing(2, 4, 3), - top: '50%', - left: '50%', - transform: `translate(-50%, -50%)`, - borderRadius: 10, - }, - grid: { - width: '100%', - }, -}); -import GenericModal from './GenericModal'; - -const URLUploader = ({ onSubmit, classes }) => { - const [open, setOpen] = React.useState(false); - const [input, setInput] = React.useState(); - const [isError, setIsError] = React.useState(false); - - useEffect(() => { - if (input) { - setIsError(!URLValidator(input)); - } - }, [input]); - - const handleOpen = () => { - setOpen(true); - }; - - const handleClose = () => { - setOpen(false); - }; - - const handleSubmit = () => { - onSubmit(input); - handleClose(); - }; - - return ( - <> -
- } - /> - - - ); -}; - -export default withStyles(styles)(URLUploader); diff --git a/ui/components/UploadImport.js b/ui/components/UploadImport.js deleted file mode 100644 index 0c2eca50bc2..00000000000 --- a/ui/components/UploadImport.js +++ /dev/null @@ -1,303 +0,0 @@ -import React, { useEffect } from 'react'; -import { TextField, Button, Grid, NativeSelect, Divider, Typography } from '@material-ui/core'; -import { createTheme, MuiThemeProvider, useTheme, withStyles } from '@material-ui/core/styles'; -import { URLValidator } from '../utils/URLValidator'; -import { Dialog, DialogActions, DialogContent, DialogTitle } from '@material-ui/core'; -import { promisifiedDataFetch } from '../lib/data-fetch'; - -const getMuiTheme = () => - createTheme({ - palette: { - primary: { - main: '#607d8b', - }, - secondary: { - main: '#666666', - }, - }, - overrides: { - MuiGrid: { - input: { - color: '#607d8b', - }, - }, - }, - }); - -const getDarkMuiTheme = () => - createTheme({ - palette: { - type: 'dark', - primary: { - main: '#607d8b', - }, - }, - overrides: { - MuiGrid: { - input: { - color: '#607d8b', - }, - }, - MuiFormLabel: { - root: { - '&$focused': { - color: '#00B39F', - }, - }, - }, - }, - }); - -const styles = (theme) => ({ - upload: { - paddingLeft: '0.7rem', - paddingTop: '8px', - }, - title: { - textAlign: 'center', - minWidth: 500, - padding: '15px', - color: '#fff', - backgroundColor: theme.palette.type === 'dark' ? '#202020' : '#396679', - }, - heading: { - color: theme.palette.type === 'dark' ? '#fff' : '#607d8b', - }, - selectType: { - color: theme.palette.type === 'dark' ? '#fff' : '#607d8b', - marginRight: '1.2rem', - }, - button: { - backgroundColor: theme.palette.type === 'dark' ? '#00B39F' : '#607d8b', - '&:hover': { - backgroundColor: theme.palette.type === 'dark' ? '#00B39F' : '#607d8b', - }, - color: '#fff', - }, -}); - -function UploadImport(props) { - const { - handleUpload, - handleUrlUpload, - configuration, - isFilter, - open, - handleClose, - classes, - fetch, - } = props; // hack, to remove, please............ - const [input, setInput] = React.useState(); - const [name, setName] = React.useState(''); - const [config, setConfig] = React.useState(''); - const [isError, setIsError] = React.useState(false); - const [fileType, setFileType] = React.useState(); - const [sourceType, setSourceType] = React.useState(); - const [supportedTypes, setSupportedTypes] = React.useState(); - const theme = useTheme(); - const isDesign = configuration === 'patterns'; - useEffect(() => { - if (isDesign) { - (async () => { - setSupportedTypes(await promisifiedDataFetch('/api/pattern/types')); - })(); - } - }, []); - - const handleFileType = (index) => { - if (isDesign) { - setFileType(supportedTypes?.[index]?.supported_extensions); - setSourceType(supportedTypes?.[index]?.design_type); - } - }; - - useEffect(() => { - if (input) { - setIsError(!URLValidator(input)); - } - }, [input]); - - useEffect(() => { - if (isDesign) { - setFileType(supportedTypes?.[0]?.supported_extensions); - setSourceType(supportedTypes?.[0]?.design_type); - } - }, [open]); - - const handleSubmit = async () => { - await handleUrlUpload(input, sourceType, { name, config }); - handleClose(); - }; - - const handleUploader = async (input) => { - await handleUpload(input, sourceType, { name, config }); - fetch?.(); - handleClose(); - }; - - return ( - <> - - - ); -} - -export default withStyles(styles)(UploadImport); diff --git a/ui/components/User.js b/ui/components/User.js deleted file mode 100644 index 878245eeffd..00000000000 --- a/ui/components/User.js +++ /dev/null @@ -1,259 +0,0 @@ -import React, { useState, useRef } from 'react'; -import { Avatar } from '@layer5/sistent'; -import ClickAwayListener from '@material-ui/core/ClickAwayListener'; -import Grow from '@material-ui/core/Grow'; -import IconButton from '@material-ui/core/IconButton'; -import MenuItem from '@material-ui/core/MenuItem'; -import MenuList from '@material-ui/core/MenuList'; -import NoSsr from '@material-ui/core/NoSsr'; -import Paper from '@material-ui/core/Paper'; -import Popper from '@material-ui/core/Popper'; -import Link from 'next/link'; -import { useRouter } from 'next/router'; -import { Provider, connect } from 'react-redux'; -import { store } from '../store'; -import { bindActionCreators } from 'redux'; -import { useGetLoggedInUserQuery, useLazyGetTokenQuery } from '@/rtk-query/user'; -import { updateUser } from '../lib/store'; -import ExtensionPointSchemaValidator from '../utils/ExtensionPointSchemaValidator'; -import { styled } from '@mui/material/styles'; -import { useNotification } from '@/utils/hooks/useNotification'; -import { EVENT_TYPES } from 'lib/event-types'; -import CAN from '@/utils/can'; -import { keys } from '@/utils/permission_constants'; -import { Button } from '@material-ui/core'; - -const LinkDiv = styled('div')(() => ({ - display: 'inline-flex', - width: '100%', - height: '30px', - alignItems: 'self-end', -})); - -function exportToJsonFile(jsonData, filename) { - let dataStr = JSON.stringify(jsonData); - let dataUri = 'data:application/json;charset=utf-8,' + encodeURIComponent(dataStr); - - let exportFileDefaultName = filename; - - let linkElement = document.createElement('a'); - linkElement.setAttribute('href', dataUri); - linkElement.setAttribute('download', exportFileDefaultName); - linkElement.click(); - linkElement.remove(); -} - -/** - * Extension Point: Avatar behavior for User Modes - * Insert custom logic here to handle Single User mode, Anonymous User mode, Multi User mode behavior. - */ -const User = (props) => { - const [userLoaded, setUserLoaded] = useState(false); - const [account, setAccount] = useState([]); - const capabilitiesLoadedRef = useRef(false); - const { notify } = useNotification(); - const [anchorEl, setAnchorEl] = useState(null); - const router = useRouter(); - - const { - data: userData, - isSuccess: isGetUserSuccess, - isError: isGetUserError, - error: getUserError, - } = useGetLoggedInUserQuery(); - const [triggerGetToken, { isError: isTokenError, error: tokenError }] = useLazyGetTokenQuery(); - - const { capabilitiesRegistry } = props; - - const getProfileUrl = () => { - return (account || [])?.find((item) => item.title === 'Profile')?.href; - }; - - const goToProfile = () => { - const profileUrl = getProfileUrl(); - if (profileUrl) { - window.location = profileUrl; - return; - } - }; - - const handleOpen = (event) => { - setAnchorEl(event.currentTarget); - }; - - const handleClose = () => { - setAnchorEl(null); - }; - - const handleLogout = () => { - window.location = '/user/logout'; - }; - - const handlePreference = () => { - router.push('/user/preferences'); - }; - - const handleGetToken = () => { - triggerGetToken() - .unwrap() - .then((data) => { - exportToJsonFile(data, 'auth.json'); - }); - }; - - if (!userLoaded && isGetUserSuccess) { - props.updateUser({ user: userData }); - setUserLoaded(true); - } else if (isGetUserError) { - notify({ - message: 'Error fetching user', - event_type: EVENT_TYPES.ERROR, - details: getUserError?.data, - }); - } - - if (isTokenError) { - notify({ - message: 'Error fetching token', - event_type: EVENT_TYPES.ERROR, - details: tokenError?.data, - }); - } - - if (!capabilitiesLoadedRef.current && capabilitiesRegistry) { - capabilitiesLoadedRef.current = true; - setAccount(ExtensionPointSchemaValidator('account')(capabilitiesRegistry?.extensions?.account)); - } - - /** - * @param {import("../utils/ExtensionPointSchemaValidator").AccountSchema[]} children - */ - function renderAccountExtension(children) { - if (children && children.length > 0) { - return ( - <> - {children.map(({ id, href, title, show: showc }) => { - if (typeof showc !== 'undefined' && !showc) { - return ''; - } - return ( - - - {extensionPointContent(href, title)} - - - ); - })} - - ); - } - } - - function extensionPointContent(href, name) { - const content = {name}; - if (href) { - return ( - props.updateExtensionType(name)} href={href}> - {content} - - ); - } - - return content; - } - - const { color, iconButtonClassName, avatarClassName, classes } = props; - - const open = Boolean(anchorEl); - - if (userData?.status == 'anonymous') { - const url = `${capabilitiesRegistry?.provider_url}/login?anonymousUserID=${userData?.id}&redirect=${window.location.pathname}`; - - return ( - - - - ); - } - - return ( -
- -
- - - -
-
- - {({ TransitionProps, placement }) => ( - - - - - {account && account.length ? renderAccountExtension(account) : null} - {!account?.length && ( - - Get Token - - )} - Preferences - Logout - - - - - )} - -
-
-
- ); -}; - -const UserProvider = (props) => { - return ( - - - - ); -}; - -const mapDispatchToProps = (dispatch) => ({ - updateUser: bindActionCreators(updateUser, dispatch), -}); - -const mapStateToProps = (state) => ({ - capabilitiesRegistry: state.get('capabilitiesRegistry'), -}); - -export default connect(mapStateToProps, mapDispatchToProps)(UserProvider); diff --git a/ui/components/UserPreferences/index.js b/ui/components/UserPreferences/index.js deleted file mode 100644 index 4e5581224ac..00000000000 --- a/ui/components/UserPreferences/index.js +++ /dev/null @@ -1,802 +0,0 @@ -//import useState from "react" -import React, { useState, useEffect } from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { withRouter } from 'next/router'; -import { withStyles } from '@material-ui/core/styles'; -import CopyIcon from '../../assets/icons/CopyIcon'; -import _ from 'lodash'; -import { - Typography, - Grid, - FormControl, - FormLabel, - FormGroup, - FormControlLabel, - Switch, - IconButton, - Card, - CardContent, - CardHeader, - Box, -} from '@material-ui/core'; -import { CustomTooltip } from '@layer5/sistent'; -import NoSsr from '@material-ui/core/NoSsr'; -import { updateUser, updateProgress, toggleCatalogContent } from '../../lib/store'; -import Tabs from '@material-ui/core/Tabs'; -import Tab from '@material-ui/core/Tab'; -import { Paper } from '@material-ui/core'; -import SettingsRemoteIcon from '@material-ui/icons/SettingsRemote'; -import SettingsCellIcon from '@material-ui/icons/SettingsCell'; -import ExtensionSandbox from '../ExtensionSandbox'; -import RemoteComponent from '../RemoteComponent'; -import ExtensionPointSchemaValidator from '../../utils/ExtensionPointSchemaValidator'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faTachometerAlt } from '@fortawesome/free-solid-svg-icons'; -import MesherySettingsPerformanceComponent from '../MesherySettingsPerformanceComponent'; -import { iconMedium } from '../../css/icons.styles'; -import { EVENT_TYPES } from '../../lib/event-types'; -import { useNotification } from '../../utils/hooks/useNotification'; -import { useWindowDimensions } from '@/utils/dimension'; -import { - useGetProviderCapabilitiesQuery, - useGetUserPrefQuery, - useUpdateUserPrefMutation, - useUpdateUserPrefWithContextMutation, -} from '@/rtk-query/user'; -import { ThemeTogglerCore } from '@/themes/hooks'; - -const styles = (theme) => ({ - statsWrapper: { - // padding : theme.spacing(2), - maxWidth: '100%', - height: 'auto', - borderTopLeftRadius: 0, - borderTopRightRadius: 0, - borderBottomLeftRadius: 3, - borderBottomRightRadius: 3, - }, - paperRoot: { - flexGrow: 1, - maxWidth: '100%', - marginLeft: 0, - borderTopLeftRadius: 3, - borderTopRightRadius: 3, - }, - tabs: { - width: '100%', - marginLeft: 0, - '& .MuiTabs-indicator': { - backgroundColor: theme.palette.type === 'dark' ? '#00B39F' : theme.palette.primary, - }, - }, - tab: { - width: '42%', - // maxWidth: 'min(33%, 200px)', - // minWidth: '50px', - margin: 0, - '&.Mui-selected': { - color: theme.palette.type === 'dark' ? '#00B39F' : theme.palette.primary, - }, - }, - icon: { - display: 'inline', - verticalAlign: 'text-top', - width: theme.spacing(1.75), - marginLeft: theme.spacing(0.5), - }, - iconText: { - display: 'inline', - verticalAlign: 'middle', - }, - backToPlay: { margin: theme.spacing(2) }, - link: { cursor: 'pointer' }, - formContainer: { - display: 'flex', - 'flex-wrap': 'wrap', - 'justify-content': 'space-evenly', - padding: 50, - }, - formGrp: { - padding: 20, - border: '1.5px solid #969696', - display: 'flex', - width: '70%', - }, - formLegend: { fontSize: 20 }, - formLegendSmall: { fontSize: 16 }, - switchBase: { - color: '#647881', - '&$checked': { color: '#00b39f' }, - '&$checked + $track': { backgroundColor: 'rgba(0,179,159,0.5)' }, - }, - track: { backgroundColor: 'rgba(100,120,129,0.5)' }, - checked: {}, - tabLabel: { - [theme.breakpoints.up('sm')]: { - fontSize: '1em', - }, - [theme.breakpoints.between('xs', 'sm')]: { - fontSize: '0.8em', - }, - }, - hideScrollbar: { - overflowX: 'auto', - '&::-webkit-scrollbar': { - display: 'none', - }, - '&::-moz-scrollbar': { - display: 'none', - }, - }, - card: { - border: '1px solid rgba(0,179,159,0.3)', - margin: '20px 0px', - backgroundColor: theme.palette.type === 'dark' ? '#293B43' : '#C9DBE3', - // display: 'flex', - // flexWrap: 'wrap', - }, - box: { - width: '100%', - display: 'flex', - justifyContent: 'space-between', - whiteSpace: 'nowrap', - paddingRight: '10px', - }, - gridCapabilityHeader: { - backgroundColor: theme.palette.type === 'dark' ? '#293B43' : '#7493A1', - }, - gridExtensionHeader: { - backgroundColor: theme.palette.type === 'dark' ? '#293B43 ' : '#C9DBE3', - }, - gridExtensionItem: { - backgroundColor: theme.palette.type === 'dark' ? '#3D4F57 ' : '#E7EFF3', - }, - line: { - border: '1px solid rgba(116,147,161, 0.3)', - width: '100%', - margin: '30px 0', - }, - root: { - width: '100%', - paddingLeft: theme.spacing(15), - paddingRight: theme.spacing(15), - paddingBottom: theme.spacing(10), - paddingTop: theme.spacing(5), - }, -}); - -const ThemeToggler = ({ classes }) => { - const Component = ({ mode, toggleTheme }) => { - return ( -
- - Dark Mode -
- ); - }; - - return ; -}; - -const UserPreference = (props) => { - const [anonymousStats, setAnonymousStats] = useState(props.anonymousStats); - const [perfResultStats, setPerfResultStats] = useState(props.perfResultStats); - const [tabVal, setTabVal] = useState(0); - const [userPrefs, setUserPrefs] = useState(ExtensionPointSchemaValidator('user_prefs')()); - const [providerType, setProviderType] = useState(''); - const [catalogContent, setCatalogContent] = useState(true); - const [extensionPreferences, setExtensionPreferences] = useState({}); - const [capabilitiesLoaded, setCapabilitiesLoaded] = useState(false); - const { width } = useWindowDimensions(); - const [value, setValue] = useState(0); - const [providerInfo, setProviderInfo] = useState({}); - - const { - data: userData, - isSuccess: isUserDataFetched, - isError: isUserDataError, - error: userDataError, - } = useGetUserPrefQuery(); - - const { data: capabilitiesData, isSuccess: isCapabilitiesDataFetched } = - useGetProviderCapabilitiesQuery(); - - const [updateUserPref] = useUpdateUserPrefMutation(); - const [updateUserPrefWithContext] = useUpdateUserPrefWithContextMutation(); - - const { notify } = useNotification(); - - const handleValChange = (event, newVal) => { - setValue(newVal); - }; - - const handleCatalogContentToggle = () => { - props.toggleCatalogContent({ catalogVisibility: !catalogContent }); - - setCatalogContent(!catalogContent); - handleCatalogPreference(!catalogContent); - }; - - const handleCatalogPreference = (catalogContent) => { - let body = Object.assign({}, extensionPreferences); - body['catalogContent'] = catalogContent; - updateUserPref({ usersExtensionPreferences: body }) - .unwrap() - .then(() => { - notify({ - message: `Catalog Content was ${catalogContent ? 'enab' : 'disab'}led`, - event_type: EVENT_TYPES.SUCCESS, - }); - }) - .catch(() => { - handleError('There was an error sending your preference'); - }); - }; - - const handleToggle = (name) => () => { - if (name === 'anonymousUsageStats') { - setAnonymousStats(!anonymousStats); - handleChange(name, !anonymousStats); - } else { - setPerfResultStats(!perfResultStats); - handleChange(name, !perfResultStats); - } - }; - - const handleError = (name) => () => { - props.updateProgress({ showProgress: false }); - - notify({ message: name, event_type: EVENT_TYPES.ERROR }); - }; - - const handleChange = (name, resultState) => { - let val = resultState, - msg; - if (name === 'anonymousUsageStats') { - msg = val - ? 'Sending anonymous usage statistics was enabled' - : 'Sending anonymous usage statistics was disabled'; - } else { - msg = val - ? 'Sending anonymous performance results was enabled' - : 'Sending anonymous performance results was disabled'; - } - - const requestBody = JSON.stringify({ - anonymousUsageStats: name === 'anonymousUsageStats' ? val : anonymousStats, - anonymousPerfResults: name === 'anonymousPerfResults' ? val : perfResultStats, - }); - - props.updateProgress({ showProgress: true }); - updateUserPrefWithContext({ body: requestBody }) - .unwrap() - .then((result) => { - props.updateProgress({ showProgress: false }); - if (typeof result !== 'undefined') { - notify({ message: msg, event_type: val ? EVENT_TYPES.SUCCESS : EVENT_TYPES.INFO }); - } - }) - .catch(() => { - handleError('There was an error sending your preference'); - }); - }; - - const handleTabValChange = (event, newVal) => { - setTabVal(newVal); - }; - - useEffect(() => { - if (props.capabilitiesRegistry && !capabilitiesLoaded) { - setCapabilitiesLoaded(true); // to prevent re-compute - setUserPrefs( - ExtensionPointSchemaValidator('user_prefs')( - props.capabilitiesRegistry?.extensions?.user_prefs, - ), - ); - setProviderType(props.capabilitiesRegistry?.provider_type); - } - }, [props.capabilitiesRegistry]); - - useEffect(() => { - if (isUserDataFetched && userData) { - setExtensionPreferences(userData?.usersExtensionPreferences); - setCatalogContent(userData?.usersExtensionPreferences?.catalogContent); - } else if (isUserDataError) { - console.error(userDataError); - } - }, [isUserDataFetched, userData]); - - useEffect(() => { - if (isCapabilitiesDataFetched && capabilitiesData) { - setProviderInfo(capabilitiesData); - } - }, [isCapabilitiesDataFetched, capabilitiesData]); - - function convertToTitleCase(str) { - const words = str.split('_'); - for (let i = 0; i < words.length; i++) { - words[i] = words[i].charAt(0).toUpperCase() + words[i].slice(1); - } - return words.join(' '); - } - - const RemoteProviderInfoTab = () => { - const [copied, setCopied] = useState(false); - const copyToClipboard = (text) => { - navigator.clipboard - .writeText(text) - .then(() => { - setCopied(true); - - setTimeout(() => { - setCopied(false); - }, 2000); - }) - .catch((error) => { - console.error('error copying to clipboard:', error); - }); - }; - - return ( - -
- Provider Information - - {providerInfo && - Object.entries(providerInfo).map( - ([providerName, provider], index) => - (index < 2 || index === 3) && ( - - - - {convertToTitleCase(providerName)} - - } - /> - - {' '} - - - {provider} - - - - - - ), - )} - - {providerInfo && - Object.entries(providerInfo).map( - ([providerName, provider], index) => - (index === 2 || index === 5) && ( - - - {convertToTitleCase(providerName)} - - } - /> - - {' '} - - - {provider} - - - - copyToClipboard(provider)} - style={{ padding: '0.25rem', float: 'right' }} - > - - - - - - - ), - )} - - - - Description - - } - /> - - -
    - {providerInfo.provider_description && - providerInfo.provider_description.map((desc, index) => ( -
  • - {desc} -
  • - ))} -
-
-
-
- -
- - Capabilities - - - - - - Feature - - - - - Endpoint - - - {providerInfo.capabilities && - providerInfo.capabilities.map((capability, index) => ( - <> - - {capability.feature} - - - {capability.endpoint} - - - ))} - -
- - Extensions - - {providerInfo.extensions && - Object.entries(providerInfo.extensions).map(([extensionName, extension], index) => ( -
- {convertToTitleCase(extensionName)} - - - - Component - - - - - Type - - - - - {extension[0].component} - - - {convertToTitleCase(extension[0].type)} - - -
- ))} -
-
- ); - }; - - const handleUpdateUserPref = (key, value) => { - const updates = _.set(_.cloneDeep(userData), key, value); - updateUserPrefWithContext(updates); - }; - return ( - - - - - } - label={General} - /> - - - } - label={Performance} - /> - - {/* NOTE: This tab's appearance is logical hence it must be put at last here! Otherwise added logic will need to be added for tab numbers!*/} - {userPrefs && providerType != 'local' && ( - - } - label={Remote Provider} - /> - - )} - - - - {tabVal === 0 && ( - <> -
- - - Extensions - - - - } - labelPlacement="end" - label="Meshery Catalog Content" - /> - - -
-
- - - Analytics and Improvement Program - - - - } - labelPlacement="end" - label="Send Anonymous Usage Statistics" - /> - - } - labelPlacement="end" - label="Send Anonymous Performance Results" - /> - - -
- -
- - - Theme - - - - - } - labelPlacement="end" - /> - - -
- - )} - {tabVal === 1 && } - {tabVal === 2 && userPrefs && providerType !== 'local' && ( - <> - - - Details} - /> - - - Plugins} - /> - - - - {value === 0 && } - - {value === 1 && ( - RemoteComponent({ url })} /> - )} - - - )} -
-
- ); -}; - -const mapDispatchToProps = (dispatch) => ({ - updateUser: bindActionCreators(updateUser, dispatch), - updateProgress: bindActionCreators(updateProgress, dispatch), - toggleCatalogContent: bindActionCreators(toggleCatalogContent, dispatch), -}); - -const mapStateToProps = (state) => { - const selectedK8sContexts = state.get('selectedK8sContexts'); - const catalogVisibility = state.get('catalogVisibility'); - const capabilitiesRegistry = state.get('capabilitiesRegistry'); - return { - selectedK8sContexts, - catalogVisibility, - capabilitiesRegistry, - }; -}; - -export default withStyles(styles)( - connect(mapStateToProps, mapDispatchToProps)(withRouter(UserPreference)), -); diff --git a/ui/components/UserPreferences/spaces-preferences.js b/ui/components/UserPreferences/spaces-preferences.js deleted file mode 100644 index 3c77b48b3fb..00000000000 --- a/ui/components/UserPreferences/spaces-preferences.js +++ /dev/null @@ -1,130 +0,0 @@ -import React, { useEffect } from 'react'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { withRouter } from 'next/router'; -import { FormGroup, FormControlLabel, Grid } from '@material-ui/core'; -import NoSsr from '@material-ui/core/NoSsr'; -import { setOrganization, setKeys } from '../../lib/store'; -import { EVENT_TYPES } from '../../lib/event-types'; -import { useNotification } from '../../utils/hooks/useNotification'; -import { useGetOrgsQuery } from '../../rtk-query/organization'; -import OrgIcon from '../../assets/icons/OrgIcon'; -import ErrorBoundary from '../ErrorBoundary'; -import { Provider } from 'react-redux'; -import { store } from '../../store'; -import { withStyles } from '@material-ui/core'; -import { Select, MenuItem, FormControl, FormLabel } from '@material-ui/core'; -import styles from './style'; -import theme from '../../themes/app'; -import { useGetCurrentAbilities } from '../../rtk-query/ability'; - -const SpacesPreferences = (props) => { - const { - data: orgsResponse, - isSuccess: isOrgsSuccess, - isError: isOrgsError, - error: orgsError, - } = useGetOrgsQuery({}); - let orgs = orgsResponse?.organizations || []; - const { organization, setOrganization, classes } = props; - const [skip, setSkip] = React.useState(true); - - const { notify } = useNotification(); - - useGetCurrentAbilities(organization, props.setKeys, skip); - - useEffect(() => { - if (isOrgsError) { - notify({ - message: `There was an error fetching available data ${orgsError?.data}`, - event_type: EVENT_TYPES.ERROR, - }); - } - }, [orgsError]); - - const handleOrgSelect = (e) => { - const id = e.target.value; - const selected = orgs.find((org) => org.id === id); - setOrganization({ organization: selected }); - setSkip(false); - }; - - return ( - - <> - {isOrgsSuccess && orgs && ( -
- - - Spaces - - - - - - - - } - /> - - -
- )} - -
- ); -}; - -const mapDispatchToProps = (dispatch) => ({ - setOrganization: bindActionCreators(setOrganization, dispatch), - setKeys: bindActionCreators(setKeys, dispatch), -}); - -const mapStateToProps = (state) => { - const organization = state.get('organization'); - return { - organization, - }; -}; - -const SpacesPreferencesWithErrorBoundary = (props) => { - return ( - - null} - onError={(e) => console.error('Error in Spaces Prefs Component', e)} - > - - - - - - ); -}; - -export default withStyles(styles)( - connect(mapStateToProps, mapDispatchToProps)(withRouter(SpacesPreferencesWithErrorBoundary)), -); diff --git a/ui/components/UserPreferences/style.js b/ui/components/UserPreferences/style.js deleted file mode 100644 index ad74f14db66..00000000000 --- a/ui/components/UserPreferences/style.js +++ /dev/null @@ -1,57 +0,0 @@ -const styles = (theme) => ({ - orgSelect: { - '&.Mui-focused .MuiOutlinedInput-notchedOutline': { - borderColor: 'transparent !important', - }, - width: '85%', - backgroundColor: theme.palette.primary, - color: theme.palette.secondary.text, - '@media (max-width: 368px)': { - width: '180px', - }, - position: 'relative', - overflow: 'hidden', - '& svg': { - backgroundColor: theme.palette.white, - fill: theme.palette.charcoal, - float: 'right', - top: '0', - right: '0', - height: '100%', - }, - }, - selectItem: { - width: '100%', - '& svg': { - backgroundColor: 'inherit', - }, - }, - org: { - marginLeft: '10px', - overflow: 'hidden', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - }, - orgIconWrapper: { - width: '32px', - height: '100%', - position: 'relative', - }, - formControlWrapper: { - padding: 20, - border: '1.5px solid #969696', - display: 'flex', - width: '70%', - }, - formLabelWrapper: { - fontSize: 20, - }, - formContainerWrapper: { - display: 'flex', - 'flex-wrap': 'wrap', - 'justify-content': 'space-evenly', - padding: 50, - }, -}); - -export default styles; diff --git a/ui/components/VerticalCarousel/VerticalCarousel.js b/ui/components/VerticalCarousel/VerticalCarousel.js deleted file mode 100644 index a7b499eca61..00000000000 --- a/ui/components/VerticalCarousel/VerticalCarousel.js +++ /dev/null @@ -1,85 +0,0 @@ -/* eslint-disable no-unused-vars */ -import React, { createRef, useCallback, useEffect } from 'react'; -import Slider from 'react-slick'; -import { Grid } from '@material-ui/core'; -// const VerticalCarousel = ({ -// item, -// setActiveIndex -// }) => { -// -// const handleClick = (direction) => { -// if(direction === "prev") setActiveIndex(prev => prev -1) -// if(direction === "next") setActiveIndex(prev => prev + 1) -// return -// } -// -// return ( -//
-// handleClick('prev')} -// style={{position: "absolute", top:"-3rem" , zIndex: 3, marginLeft: "auto", marginRight: "auto", left: 0, right: 0, textAlign:"center"}} -// > -// -// -// handleClick('next')} -// style={{position: "absolute", bottom:"2rem" , zIndex: 3, marginLeft: "auto", marginRight: "auto", left: 0, right: 0, textAlign:"center"}} -// > -// -// -// {item} -//
-// ); -// } -// -// VerticalCarousel.propTypes = { -// data: PropTypes.array.isRequired, -// leadingText: PropTypes.string.isRequired, -// }; - -const VerticalCarousel = ({ handleAfterSlideChange, slides, sliderRef }) => { - // const scroll = useCallback( - // y => { - // if (y > 0) { - // return sliderRef?.current?.slickNext(); - // } else { - // return sliderRef?.current?.slickPrev(); - // } - // }, - // [sliderRef] - // ); - - // useEffect(() => { - // document.getElementById("carousel-div").addEventListener("wheel", e => { - // e.preventDefault() - // scroll(e.deltaY); - // }); - // }, [scroll]); - - const settings = { - // dots : true, - infinite: false, - slidesToShow: 1, - arrows: true, - // slidesToScroll : 1, - // adaptiveHeight : true, - // centerMode : true, - // centerPadding : "0px", - vertical: true, - // verticalSwiping : true, - // swipeToSlide : true, - afterChange: handleAfterSlideChange, - }; - - return ( - <> - - - {slides}{' '} - - - - ); -}; - -export default VerticalCarousel; diff --git a/ui/components/ViewSwitch.js b/ui/components/ViewSwitch.js deleted file mode 100644 index 9a42ecc3c01..00000000000 --- a/ui/components/ViewSwitch.js +++ /dev/null @@ -1,39 +0,0 @@ -import { ToggleButton } from '@layer5/sistent'; -import GridOnIcon from '@material-ui/icons/GridOn'; -import TableChartIcon from '@material-ui/icons/TableChart'; -import { makeStyles } from '@material-ui/core/styles'; - -const useStyles = makeStyles((theme) => ({ - toggleButton: { - border: 'none', - }, - icon: { - color: theme.palette.secondary.iconMain, - }, -})); - -function ViewSwitch({ view, changeView }) { - const classes = useStyles(); - return ( - { - changeView(view === 'grid' ? 'table' : 'grid'); - }} - aria-label="Switch View" - sx={{ - border: 'none', - }} - > - {view === 'grid' ? ( - - ) : ( - - )} - - ); -} - -export default ViewSwitch; diff --git a/ui/components/VisibilityMenu/index.js b/ui/components/VisibilityMenu/index.js deleted file mode 100644 index a2607a006d5..00000000000 --- a/ui/components/VisibilityMenu/index.js +++ /dev/null @@ -1,104 +0,0 @@ -import React from 'react'; -import { styled, Menu, MenuItem, Button } from '@material-ui/core'; -import { useState } from 'react'; -import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; -import { iconMedium } from '../../css/icons.styles'; - -export const VIEW_VISIBILITY = { - PUBLIC: 'public', - PRIVATE: 'private', -}; - -const StyledMenu = styled(Menu)(({ theme }) => ({ - '& .MuiPaper-root': { - backgroundColor: theme.palette.secondary.menuBg, - color: theme.palette.secondary.titleText, - border: `1px solid ${theme.palette.secondary.border}`, - borderRadius: '0.25rem', - padding: '0rem', - }, - '& .MuiMenuItem-root': { - fontSize: '.9rem', - padding: '0.5rem', - '&:hover': { - backgroundColor: theme.palette.secondary.menuSelectedBg, - }, - }, - //selected - '& .Mui-selected': { - backgroundColor: theme.palette.secondary.menuSelectedBg, - }, - '& .MuiList-padding': { - padding: '0px', - }, -})); -const StyledMenuWrapper = styled('div')(({ theme }) => ({ - paddingBlock: '0.15rem', - paddingInline: '0.5rem', - borderRadius: '0.25rem', - border: '1px solid #666', - background: theme.palette.secondary.menuBg, - textTransform: 'uppercase', - color: theme.palette.secondary.text, - display: 'flex', - gap: '0.5rem', -})); -const StyledMenuItem = styled(MenuItem)(({ theme }) => ({ - textTransform: 'capitalize', - color: theme.palette.secondary.iconMain, -})); -export const VisibilityMenu = ({ value, onChange, options, enabled }) => { - const [anchorEl, setAnchorEl] = useState(null); - const open = Boolean(anchorEl); - const close = () => { - setAnchorEl(null); - }; - const handleOpen = (e) => { - if (!enabled) return; - setAnchorEl(e.currentTarget); - }; - const handleChange = (value) => { - onChange(value); - close(); - }; - return ( - <> - - - - {options.map(([visibility, Icon], index) => ( - handleChange(visibility)}> - - {visibility} - - ))} - - - ); -}; diff --git a/ui/components/YamlDialog.js b/ui/components/YamlDialog.js deleted file mode 100644 index baa55aceceb..00000000000 --- a/ui/components/YamlDialog.js +++ /dev/null @@ -1,83 +0,0 @@ -import { - Dialog, - DialogActions, - DialogContent, - Divider, - IconButton, - Tooltip, -} from '@layer5/sistent'; -import useStyles from './MesheryPatterns/Cards.styles'; -import { UnControlled as CodeMirror } from 'react-codemirror2'; -import FullscreenExit from '@material-ui/icons/FullscreenExit'; -import DeleteIcon from '@material-ui/icons/Delete'; -import Fullscreen from '@material-ui/icons/Fullscreen'; -import Save from '@material-ui/icons/Save'; -import { StyledDialog, YamlDialogTitleText } from './MesheryPatterns/style'; - -const YAMLDialog = ({ - fullScreen, - name, - toggleFullScreen, - config_file, - setYaml, - deleteHandler, - updateHandler, - isReadOnly = false, -}) => { - const classes = useStyles(); - return ( - - - - {name} - - - - {fullScreen ? : } - - - - - - setYaml(val)} - /> - - - {isReadOnly ? null : ( - - - - - - - - - - - - - )} - - ); -}; - -export default YAMLDialog; diff --git a/ui/components/configuratorComponents/CodeEditor.js b/ui/components/configuratorComponents/CodeEditor.js deleted file mode 100644 index 17b39810452..00000000000 --- a/ui/components/configuratorComponents/CodeEditor.js +++ /dev/null @@ -1,109 +0,0 @@ -import { Card, CardContent, makeStyles } from '@material-ui/core'; -import { useEffect, useState } from 'react'; -import { UnControlled as CodeMirror } from 'react-codemirror2'; - -const useStyles = makeStyles((theme) => ({ - cardRoot: { - position: 'sticky', - }, - codeMirror: { - '& .CodeMirror': { - minHeight: '300px', - height: ({ scrollPos }) => getDynamicVh(scrollPos), - }, - }, - wrapper: { - [theme.breakpoints.up('md')]: { - top: ({ scrollPos }) => - scrollPos >= 106 ? 106 : window.scrollY > 0 ? 208 - scrollPos : 'auto', - position: ({ fullWidth }) => (fullWidth ? 'inherit' : 'fixed'), - minWidth: ({ fullWidth }) => (fullWidth ? undefined : 'calc(50% - 175px)'), - maxWidth: ({ fullWidth }) => (fullWidth ? undefined : 'calc(50% - 175px)'), - }, - }, - icon: { - position: 'absolute', - right: '24px', - bottom: '30px', - color: '#fff', - zIndex: 11, - backgroundColor: 'rgb(255,255,255,0.05)', - }, -})); - -export default function CodeEditor({ yaml, saveCodeEditorChanges, fullWidth, onChange }) { - const [style, setStyle] = useState(67); - const classes = useStyles({ scrollPos: style, fullWidth }); - - useEffect(() => { - window.addEventListener('scroll', handleScroll); - - return () => { - window.removeEventListener('scroll', () => {}); - }; - }, []); - - const handleScroll = () => { - setStyle(window.scrollY); - }; - - return ( -
- - - { - onChange(a, b, c); - }} - onBlur={(a) => saveCodeEditorChanges(a)} - style={{ - '& .CodeMirror': { - minHeight: '300px', - height: '54vh', - }, - }} - /> - - -
- ); -} - -/** - * Provides dynamic height according to scroll calculations - * - * @param {DoubleRange} scrollPos - * @returns dynamically calcultaed height in vh - */ -function getDynamicVh(scrollPos) { - if (window.scrollY === 0) { - return '67vh'; - } - const per = getScrollPercentage(); - const threshold = 0.06; - const vh = 67 + 15 * (per / threshold); // calc(67vh) - if (per < threshold) { - return scrollPos > 106 ? `${vh}vh` : '67vh'; - } else if (per > 0.95) { - return 'calc(100vh - 232px)'; - } else { - return '82vh'; - } -} - -function getScrollPercentage() { - return window.scrollY / (document.body.scrollHeight - window.innerHeight); -} diff --git a/ui/components/configuratorComponents/CustomBreadCrumb.js b/ui/components/configuratorComponents/CustomBreadCrumb.js deleted file mode 100644 index 018014ffccc..00000000000 --- a/ui/components/configuratorComponents/CustomBreadCrumb.js +++ /dev/null @@ -1,78 +0,0 @@ -import { ClickAwayListener, withStyles } from '@material-ui/core'; -import React, { useEffect, useState } from 'react'; - -const styles = (theme) => ({ - designWrapper: { - width: '100%', - color: '#fff', - position: 'fixed', - top: 80, - // left: 0, - backgroundColor: theme.palette.type === 'dark' ? '#222222' : '#477E96', - zIndex: '1', - marginLeft: '4px', - padding: '4px 50px', - transform: 'translateX(-40px)', - }, - span: { - // marginLeft: 300, - color: '#fff', - fontStyle: 'italic', - '&:hover': { - cursor: 'pointer', - textDecoration: 'underline', - }, - }, - input: { - background: 'transparent', - border: 'none', - color: '#fff', - textDecoration: 'underline', - '&:focus': { - outline: 'none', - border: 'none', - }, - }, -}); - -function CustomBreadCrumb({ title, onBack, titleChangeHandler, classes }) { - const [editing, setEditing] = useState(false); - const [name, setName] = useState(title); - - useEffect(() => { - const timer = setTimeout(() => { - titleChangeHandler(name.trim()); - }, 400); - - return () => clearTimeout(timer); - }, [name]); - - useEffect(() => { - setName(title); - }, [title]); - - const handleInputChange = (event) => { - setName(event.target.value); - }; - - return ( -
- {'> '} - - Designs - - {' > '} - - {editing ? ( - setEditing(false)}> - - - ) : ( - setEditing(true)}> - {title} - - )} -
- ); -} -export default withStyles(styles)(CustomBreadCrumb); diff --git a/ui/components/configuratorComponents/MeshModel/DesignerDrawerNodeShapes.js b/ui/components/configuratorComponents/MeshModel/DesignerDrawerNodeShapes.js deleted file mode 100644 index 9fa812f04d4..00000000000 --- a/ui/components/configuratorComponents/MeshModel/DesignerDrawerNodeShapes.js +++ /dev/null @@ -1,585 +0,0 @@ -import React from 'react'; - -export function TriangleShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function RoundTriangleShape({ color, styles }) { - return ( - - - - ); -} - -export function PentagonShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function RoundPentagonShape({ color, styles }) { - return ( - - - - ); -} -export function RoundRectangleShape({ color, styles }) { - return ( - - - - ); -} -export function RectangleShape({ color, styles }) { - return ( - - - - ); -} - -export function TallRoundRectangleShape({ color, styles }) { - return ( - - - - ); -} - -export function BottomRoundRectangleShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function CutRectangle({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function CircleShape({ color, styles }) { - return ( - - - - ); -} - -export function CylinderShape({ color, styles }) { - return ( - - - - - - ); -} - -export function TagShape({ color, styles }) { - return ( - - - - - - - ); -} - -export function RoundTagShape({ color, styles }) { - return ( - - - - - - - ); -} - -export function StarShape({ color, styles }) { - return ( - - - - - - - - - - - ); -} - -export function VeeShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function HexagonShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function RoundHexagonShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function ConcaveHexagonShape({ color, styles }) { - return ( - - - - - - - - - - - ); -} - -export function HeptagonShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function RoundHeptagonShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function OctagonShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function RoundOctagonShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function PolygonShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function RhomboidShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function RightRhomboidShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function DiamondShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function RoundDiamondShape({ color, styles }) { - return ( - - - - - - - - - - - - - - - - ); -} - -export function BarrelShape({ color, styles }) { - return ( - - - - - - - - - - - ); -} - -export function XWingShape({ color }) { - return ( - - - - - - - ); -} diff --git a/ui/components/configuratorComponents/MeshModel/LazyComponentForm.js b/ui/components/configuratorComponents/MeshModel/LazyComponentForm.js deleted file mode 100644 index fc8dd6c8ba9..00000000000 --- a/ui/components/configuratorComponents/MeshModel/LazyComponentForm.js +++ /dev/null @@ -1,112 +0,0 @@ -import { - Accordion, - AccordionDetails, - AccordionSummary, - CircularProgress, - makeStyles, -} from '@material-ui/core'; -import Typography from '@material-ui/core/Typography'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import { isEmpty } from 'lodash'; -import React from 'react'; -import { getMeshModelComponent } from '../../../api/meshmodel'; -import { iconMedium } from '../../../css/icons.styles'; -import PatternServiceForm from '../../MesheryMeshInterface/PatternServiceForm'; -// eslint-disable-next-line no-unused-vars -import * as Types from '../MeshModel/hooks/types'; -import { useNotification } from '../../../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../../../lib/event-types'; -// import { isEmptyObj } from "../../utils/utils"; -// import PatternServiceForm from "./PatternServiceForm"; - -const useStyles = makeStyles((theme) => ({ - accordionRoot: { - width: '100%', - marginBottom: 8, - }, - heading: { - fontSize: theme.typography.pxToRem(15), - fontWeight: theme.typography.fontWeightRegular, - }, -})); - -/** - * - * @param {{ - * component: Types.ComponentDefinition - * }} param0 - * @returns - */ -export default function LazyComponentForm({ component, disabled, ...otherprops }) { - const classes = useStyles(); - const [expanded, setExpanded] = React.useState(false); - const [schemaSet, setSchemaSet] = React.useState({}); - const { notify } = useNotification(); - - async function expand(state) { - if (!state) { - setExpanded(false); - return; - } - - setExpanded(true); - const { - component: { vesion: apiVersion, kind }, - model, - } = component; - const { - name: modelName, - model: { version }, - } = model; - try { - if (isEmpty(schemaSet)) { - const res = await getMeshModelComponent(modelName, kind, version, apiVersion); - if (res.components[0]) { - setSchemaSet({ - workload: JSON.parse(res.components[0].component.schema), // has to be removed - }); - } else { - throw new Error('found null in component definition'); - } - } - } catch (error) { - notify({ - message: `error getting schema: ${error?.message}`, - event_type: EVENT_TYPES.ERROR, - details: error.toString(), - }); - } - } - return ( -
- !disabled && expand(!expanded)}> - }> - - {component.displayName}{' '} - {disabled && (contains invalid schema)} - - - - {isEmpty(schemaSet) ? ( - - ) : ( - - )} - - -
- ); -} - -function LazyAccordionDetails(props) { - if (!props.expanded) return ; - - // @ts-ignore // LEE: This behavior is more like what we need - https://codesandbox.io/s/upbeat-tesla-uchsb?file=/src/MyAccordion.js - return {props.children}; -} diff --git a/ui/components/configuratorComponents/MeshModel/NodeIcon.js b/ui/components/configuratorComponents/MeshModel/NodeIcon.js deleted file mode 100644 index f0bdf17b746..00000000000 --- a/ui/components/configuratorComponents/MeshModel/NodeIcon.js +++ /dev/null @@ -1,192 +0,0 @@ -import { getWebAdress } from '../../../utils/webApis'; -import clsx from 'clsx'; -import { getComponentMetadata, getStyleOverrides } from './utils'; -import { - CircleShape, - RectangleShape, - RoundPentagonShape, - RoundRectangleShape, - RoundTriangleShape, - TallRoundRectangleShape, - CylinderShape, - TagShape, - RoundTagShape, - StarShape, - VeeShape, - HexagonShape, - RoundHexagonShape, - ConcaveHexagonShape, - HeptagonShape, - RoundHeptagonShape, - OctagonShape, - RoundOctagonShape, - PentagonShape, - TriangleShape, - CutRectangle, - PolygonShape, - RhomboidShape, - RightRhomboidShape, - RoundDiamondShape, - DiamondShape, - BarrelShape, - BottomRoundRectangleShape, -} from './DesignerDrawerNodeShapes'; - -const NODE_ICON_WRAPPER_CLASS = 'node-icon-wrapper-svg'; - -export function ShapeOfSVG({ color, shape, styles }) { - switch (shape) { - case 'circle': - return ; - case 'triangle': - return ; - case 'round-triangle': - return ; - case 'pentagon': - return ; - case 'round-pentagon': - return ; - case 'round-rectangle': - return ; - case 'rectangle': - return ; - case 'tall-round-rectangle': - return ; - case 'bottom-round-rectangle': - return ; - case 'cut-rectangle': - return ; - // todos, rn, defaulted by diamond, why not adding default? - // because the shapes may go unnoticed later in time - case 'diamond': - return ; - case 'round-diamond': - return ; - case 'cylinder': - return ; - case 'tag': - return ; - case 'round-tag': - return ; - case 'star': - return ; - case 'vee': - return ; - case 'hexagon': - return ; - case 'round-hexagon': - return ; - case 'concave-hexagon': - return ; - case 'heptagon': - return ; - case 'round-heptagon': - return ; - case 'octagon': - return ; - case 'round-octagon': - return ; - case 'polygon': - return ; - case 'rhomboid': - return ; - case 'right-rhomboid': - return ; - case 'barrel': - return ; - default: - return null; - } -} - -function getSvgUrl(url) { - if (!url) { - return '/static/img/model-categories/dark/other-dark.svg'; - } - - if (url.startsWith('http')) { - return url; - } - - return getWebAdress() + '/' + url; -} - -function styleProps(metadata) { - if (metadata.shape === 'no-shape') { - return { - height: 40, - width: 40, - }; - } - - return { - height: 25, - width: 25, - x: 7.5, - y: 7.5, - ...getStyleOverrides(metadata?.styleOverrides), - }; -} - -export default function GetNodeIcon({ metadata, otherOverrides = {}, className }) { - if (!metadata?.svgColor || !metadata?.svgWhite || !metadata?.svgColor) { - return ( - - ); - } - if (metadata?.svgComplete) { - return ( - // wrapping in svg important for onDragStart function - - - - ); - } - /** - * Converts a set of input styles to SVG-compatible styles. - * @param {object} inputStyle - The input style object to be converted. - * @param {string} color - The color to be used for the SVG stroke. - * @returns {object} An object containing SVG-compatible style properties. - */ - function convertToSvgStyle(inputStyle, color) { - const svgStyle = { - stroke: color, // Use the specified color for the SVG stroke - fillOpacity: inputStyle['background-opacity'], // Map 'background-opacity' to 'fillOpacity' - strokeWidth: inputStyle['border-width'], // Map 'border-width' to 'strokeWidth' - //Add more styles as per requirement... - }; - return svgStyle; - } - - const componentMetadata = getComponentMetadata(metadata); - const styles = styleProps(componentMetadata); - const styleOverrides = getStyleOverrides(metadata?.styleOverrides); - const customStyles = convertToSvgStyle(styleOverrides, componentMetadata.primaryColor); - return ( - <> - - - {styles['background-image'] !== 'none' && componentMetadata.svgColor && ( - - )} - - - ); -} diff --git a/ui/components/configuratorComponents/MeshModel/hooks/types.js b/ui/components/configuratorComponents/MeshModel/hooks/types.js deleted file mode 100644 index 9b90d393023..00000000000 --- a/ui/components/configuratorComponents/MeshModel/hooks/types.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * @typedef {object} ComponentDefinition - * @property {string} kind - * @property {string} apiVersion - * @property {string} displayName - * @property {string} format - * @property {object} metadata - * @property {string} metadata.genealogy - * @property {boolean} metadata.isCustomResource - * @property {boolean} metadata.isNamespaced - * @property {string} metadata.logoURL - * @property {string} metadata.model - * @property {string} metadata.modelDisplayName - * @property {string} metadata.primaryColor - * @property {boolean} metadata.published - * @property {string} metadata.secondaryColor - * @property {string} metadata.shape - * @property {string} metadata.styleOverrides - * @property {string} metadata.subCategory - * @property {string} metadata.svgColor - * @property {string} metadata.svgComplete - * @property {string} metadata.svgWhite - * @property {object} model - * @property {string} model.name - * @property {string} model.version - * @property {string} model.displayName - * @property {object} model.category - * @property {string} model.category.name - * @property {null} model.category.metadata - * @property {object} model.metadata - * @property {string} model.metadata.svgColor - * @property {string} model.metadata.svgWhite - * @property {string} schema - */ - -export const Types = {}; diff --git a/ui/components/configuratorComponents/MeshModel/hooks/useDesignLifecycle.js b/ui/components/configuratorComponents/MeshModel/hooks/useDesignLifecycle.js deleted file mode 100644 index 24316b2c1c7..00000000000 --- a/ui/components/configuratorComponents/MeshModel/hooks/useDesignLifecycle.js +++ /dev/null @@ -1,210 +0,0 @@ -import { useEffect, useState } from 'react'; -import jsYaml from 'js-yaml'; -// eslint-disable-next-line no-unused-vars -import * as Types from './types'; -import { promisifiedDataFetch } from '../../../../lib/data-fetch'; -import { useNotification } from '../../../../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../../../../lib/event-types'; -import { getUnit8ArrayForDesign } from '@/utils/utils'; - -export default function useDesignLifecycle() { - const [designId, setDesignId] = useState(); - const [designJson, setDesignJson] = useState({ - name: 'Untitled Design', - components: [], - schemaVersion: 'designs.meshery.io/v1beta1', - }); - const [designYaml, setDesignyaml] = useState(''); - const { notify } = useNotification(); - - useEffect( - function updateDesignYamlFromJson() { - setDesignyaml(jsYaml.dump(designJson)); - }, - [designJson], - ); - - /** - * - * @param {Types.ComponentDefinition} componentDefinition - */ - function onSettingsChange(componentDefinition, formReference) { - const { - component, - schemaVersion, - version, - model: { - name: modelName, - registrant: modelRegistrant, - version: modelVersion, - category: modelCategory, - }, - } = componentDefinition; - - /** - * Handles actual design-json change in response to form-data change - * @param {*} formData - */ - return function handledesignJsonChange(formData) { - const referKey = formReference.current.referKey; - const { name, namespace, labels, annotations, ...configuration } = formData; - const newInput = { - id: referKey, - schemaVersion, - version, - component, - displayName: name, - model: { - name: modelName, - version: modelVersion, - category: modelCategory, - registrant: modelRegistrant, - }, - configuration: { - metadata: { - labels, - annotations, - namespace, - }, - ...configuration, - }, - }; - setDesignJson((prev) => { - let newestKey = false; - const currentJson = - prev.components?.map((val) => { - if (val.id == referKey) { - newestKey = true; - return newInput; - } - return val; - }) || []; - if (!newestKey) { - currentJson.push(newInput); - } - - return { ...prev, components: [...currentJson] }; - }); - }; - } - - function onSubmit() {} - - function onDelete() {} - - function designSave() { - promisifiedDataFetch('/api/pattern', { - body: JSON.stringify({ - pattern_data: { - name: designJson.name, - pattern_file: getUnit8ArrayForDesign(designYaml), - }, - save: true, - }), - method: 'POST', - }) - .then((data) => { - setDesignId(data[0].id); - notify({ - message: `"${designJson.name}" saved successfully`, - event_type: EVENT_TYPES.SUCCESS, - }); - }) - .catch((err) => { - notify({ - message: `failed to save design file`, - event_type: EVENT_TYPES.ERROR, - details: err.toString(), - }); - }); - } - - async function designUpdate() { - try { - await promisifiedDataFetch('/api/pattern', { - body: JSON.stringify({ - pattern_data: { - name: designJson.name, - pattern_file: getUnit8ArrayForDesign(designYaml), - id: designId, - }, - }), - method: 'POST', - }); - notify({ - message: `"${designJson.name}" updated successfully`, - event_type: EVENT_TYPES.SUCCESS, - }); - } catch (err) { - notify({ - message: `failed to update design file`, - event_type: EVENT_TYPES.ERROR, - details: err.toString(), - }); - } - } - - async function designDelete() { - try { - await promisifiedDataFetch('/api/pattern/' + designId, { method: 'DELETE' }); - notify({ message: `Design "${designJson.name}" Deleted`, event_type: EVENT_TYPES.SUCCESS }); - setDesignId(undefined); - setDesignJson({ - name: 'Untitled Design', - components: [], - schemaVersion: 'designs.meshery.io/v1beta1', - }); - } catch (err) { - return notify({ - message: `failed to delete design file`, - event_type: EVENT_TYPES.ERROR, - details: err.toString(), - }); - } - } - - const updateDesignName = (name) => { - setDesignJson((prev) => ({ ...prev, name: name })); - }; - - const loadDesign = async (design_id) => { - try { - const data = await promisifiedDataFetch('/api/pattern/' + design_id); - setDesignId(design_id); - setDesignJson(jsYaml.load(data.pattern_file)); - } catch (err) { - notify({ - message: `failed to load design file`, - event_type: EVENT_TYPES.ERROR, - details: err.toString(), - }); - } - }; - - const updateDesignData = ({ yamlData }) => { - try { - const designData = jsYaml.load(yamlData); - setDesignJson(designData); - } catch (err) { - notify({ - message: `Invalid Yaml Data`, - event_type: EVENT_TYPES.ERROR, - details: err.toString(), - }); - } - }; - return { - designJson, - onSettingsChange, - onSubmit, - onDelete, - designYaml, - designSave, - designUpdate, - designId, - designDelete, - updateDesignName, - loadDesign, - updateDesignData, - }; -} diff --git a/ui/components/configuratorComponents/MeshModel/index.js b/ui/components/configuratorComponents/MeshModel/index.js deleted file mode 100644 index c6860b5e565..00000000000 --- a/ui/components/configuratorComponents/MeshModel/index.js +++ /dev/null @@ -1,295 +0,0 @@ -import { - Avatar, - CircularProgress, - FormControl, - Grid, - IconButton, - MenuItem, - NoSsr, - TextField, - Toolbar, - Tooltip, -} from '@material-ui/core'; -import React, { useEffect, useRef, useState } from 'react'; -import AppBarComponent from './styledComponents/AppBar'; - -import DeleteIcon from '@material-ui/icons/Delete'; -import SaveIcon from '@material-ui/icons/Save'; -import { AvatarGroup } from '@mui/material'; -import { iconMedium } from '../../../css/icons.styles'; -import { useMeshModelComponents } from '../../../utils/hooks/useMeshModelComponents'; -import { getWebAdress } from '../../../utils/webApis'; -import CodeEditor from '../CodeEditor'; -import LazyComponentForm from './LazyComponentForm'; -import useDesignLifecycle from './hooks/useDesignLifecycle'; -import { useRouter } from 'next/router'; -import { ArrowBack } from '@material-ui/icons'; -import TooltipButton from '../../../utils/TooltipButton'; -import { SaveAs as SaveAsIcon } from '@mui/icons-material'; -import CAN from '@/utils/can'; -import { keys } from '@/utils/permission_constants'; - -export default function DesignConfigurator() { - const [selectedCategory, setSelectedCategory] = useState(null); - const [selectedModel, setSelectedModel] = useState(null); - const { models, meshmodelComponents, getModelFromCategory, getComponentsFromModel, categories } = - useMeshModelComponents(); - const { - onSettingsChange, - designSave, - designUpdate, - designYaml, - designJson, - designId, - designDelete, - updateDesignName, - loadDesign, - updateDesignData, - } = useDesignLifecycle(); - const formReference = useRef(); - - const router = useRouter(); - const { design_id } = router.query; - - useEffect( - function loadDesignOnMount() { - if (design_id) { - loadDesign(design_id); - } - }, - [design_id], - ); - - function handleCategoryChange(event) { - setSelectedCategory(event.target.value); - getModelFromCategory(event.target.value); - } - - function handleModelChange(event) { - if (event.target.value) { - getComponentsFromModel(event.target.value); - setSelectedModel(event.target.value); - } - } - - return ( - - - router.back()}> - - - - - -
- {/* Category Selector */} - - { - if (!selected || selected.length === 0) { - return Select Category; - } - - return selected; - }, - displayEmpty: true, - }} - InputProps={{ disableUnderline: true }} - labelId="category-selector" - id="category-selector" - value={selectedCategory} - onChange={handleCategoryChange} - fullWidth - > - {categories.map((cat) => ( - - {cat.name} - - ))} - - - - {/* Model Selector */} - {selectedCategory && ( - - { - if (!selected || selected.length === 0) { - return Select Model; - } - - return removeHyphenAndCapitalise(selected); - }, - displayEmpty: true, - }} - InputProps={{ disableUnderline: true }} - labelId="model-selector" - id="model-selector" - value={selectedModel} - onChange={handleModelChange} - fullWidth - > - {models?.[selectedCategory] ? ( - models[selectedCategory].map(function renderModels(model, idx) { - return ( - - {model.displayName} - - ); - }) - ) : ( - - )} - - - )} -
- - {/* Action Toolbar */} - updateDesignName(e.target.value)} - /> - - - - - - - {designId && ( - <> - - - - - - - - - - - - )} -
-
- - {meshmodelComponents?.[selectedModel] && ( - - {meshmodelComponents[selectedModel]?.[0]?.components?.map( - function ShowRjsfComponentsLazily(trimmedComponent, idx) { - const hasInvalidSchema = !!trimmedComponent.metadata?.hasInvalidSchema; - return ( - - ); - }, - )} - - )} - - { - updateDesignData({ yamlData: update }); - }} - saveCodeEditorChanges={(args) => { - console.log('onSave', args); - }} - fullWidth={!(selectedCategory && selectedModel)} - /> - {designJson?.services && Object.keys(designJson.services).length > 0 && ( - - {Object.values(designJson.services).map( - function renderAvatarFromServices(service, idx) { - const metadata = service.traits?.['meshmodel-metadata']; - if (metadata) { - const { primaryColor, svgWhite } = metadata; - return ( - { - console.log('TODO: write function to highlight things on editor'); - }} - /> - ); - } - }, - )} - - )} - - -
- ); -} - -function RenderModelNull({ selectedCategory, models }) { - if (!selectedCategory) { - return Select a Category First; - } - - if (!models?.[selectedCategory]) { - return ; - } -} - -function removeHyphenAndCapitalise(str) { - if (!str) { - return ''; - } - - return str - .split('-') - .filter((word) => word) - .map((word) => word[0].toUpperCase() + word.substring(1)) - .join(' '); -} diff --git a/ui/components/configuratorComponents/MeshModel/styledComponents/AppBar.js b/ui/components/configuratorComponents/MeshModel/styledComponents/AppBar.js deleted file mode 100644 index 90c0912d878..00000000000 --- a/ui/components/configuratorComponents/MeshModel/styledComponents/AppBar.js +++ /dev/null @@ -1,12 +0,0 @@ -import { AppBar, styled } from '@material-ui/core'; - -const AppBarComponent = styled(AppBar)(({ theme }) => { - return { - marginBottom: 16, - backgroundColor: theme.palette.secondary.appBar, - borderRadius: '8px', - color: theme.palette.secondary.text, - }; -}); - -export default AppBarComponent; diff --git a/ui/components/configuratorComponents/MeshModel/utils.js b/ui/components/configuratorComponents/MeshModel/utils.js deleted file mode 100644 index 07124c0d3c3..00000000000 --- a/ui/components/configuratorComponents/MeshModel/utils.js +++ /dev/null @@ -1,30 +0,0 @@ -import { JsonParse } from '../../../utils/utils'; - -export function getComponentMetadata(metadata) { - const cleanedMeta = { ...metadata }; - - // for the older designs where metadata is stored in css styles, replace the svgWhite with it - if (cleanedMeta['background-image']) { - cleanedMeta.svgWhite = cleanedMeta['background-image']; - } - - return Object.assign( - { - // default assignments - shape: 'circle', // shape should be small case - primaryColor: '#00B39F', - secondaryColor: '#b2e8e2', - svgColor: 'static/img/component-svg/meshery.svg', - svgWhite: 'static/img/component-svg/meshery.svg', - }, - cleanedMeta, - ); -} - -export function getStyleOverrides(stringifiedOverrides) { - if (stringifiedOverrides) { - return JsonParse(stringifiedOverrides); - } - - return {}; -} diff --git a/ui/components/configuratorComponents/NameToIcon.js b/ui/components/configuratorComponents/NameToIcon.js deleted file mode 100644 index 55fc23ac7a0..00000000000 --- a/ui/components/configuratorComponents/NameToIcon.js +++ /dev/null @@ -1,53 +0,0 @@ -import { - AddCircle, - BuildRounded, - DirectionsCar, - Filter, - SimCard, - SupervisedUserCircle, - TouchApp, -} from '@material-ui/icons'; -import ExploreIcon from '@material-ui/icons/Explore'; -import FileCopyIcon from '@material-ui/icons/FileCopy'; -import ListAltIcon from '@material-ui/icons/ListAlt'; -import LockIcon from '@material-ui/icons/Lock'; -import React from 'react'; - -/** - * nameToIcon returns icons for the rjsf form titles - * - * @param {string} name Tooltip name - * @param {string} color default value is primary - * @returns CustomIconButton - */ -export default function NameToIcon({ name, color = '#607D8B', ...other }) { - const CustomIcon = ({ Icon }) => ; - - switch (name) { - //core - case 'Application': - return ; - case 'Kubernetes Service': - return ; - // Istio - case 'AuthorizationPolicy': - return ; - case 'DestinationRule': - return ; - case 'EnvoyFilter': - return ; - case 'Gateway': - return ; - case 'PeerAuthentication': - return ; - case 'Sidecar': - return ; - case 'VirtualService': - return ; - case 'WorkloadEntry': - return ; - // default - default: - return ; - } -} diff --git a/ui/components/connections/ConnectionChip.js b/ui/components/connections/ConnectionChip.js deleted file mode 100644 index 95f01b9a1b5..00000000000 --- a/ui/components/connections/ConnectionChip.js +++ /dev/null @@ -1,366 +0,0 @@ -import { Chip, MenuItem, Tooltip, makeStyles, Avatar } from '@material-ui/core'; -import classNames from 'classnames'; -import CheckCircleIcon from '@mui/icons-material/CheckCircle'; -import AssignmentTurnedInIcon from '@mui/icons-material/AssignmentTurnedIn'; -import ExploreIcon from '@mui/icons-material/Explore'; -import RemoveCircleIcon from '@mui/icons-material/RemoveCircle'; -import DeleteForeverIcon from '@mui/icons-material/DeleteForever'; -import HandymanIcon from '@mui/icons-material/Handyman'; -import BadgeAvatars from '../CustomAvatar'; -import { notificationColors } from '../../themes'; -import DisconnectIcon from '../../assets/icons/disconnect'; -import NotInterestedRoundedIcon from '@mui/icons-material/NotInterestedRounded'; -import { CONNECTION_STATES, CONTROLLER_STATES } from '../../utils/Enum'; -import theme from '../../themes/app'; - -const useChipStyles = makeStyles(() => ({ - Chip: { - width: '13rem', - maxWidth: '13rem', - minWidth: '9rem', - textAlign: 'left', - cursor: 'pointer', - '& .MuiChip-label': { - flexGrow: 1, - }, - overflow: 'hidden', - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - }, - icon: { - width: '1.5rem', - height: '1.5rem', - }, -})); - -export const _ConnectionChip = ({ handlePing, onDelete, iconSrc, status, title, width }) => { - const classes = useChipStyles(); - const chipStyle = { width }; - return ( - // - { - e.stopPropagation(); // Prevent event propagation - handlePing(); // Call your custom handler - }} - onDelete={onDelete} - avatar={ - status ? ( - - - - - - ) : ( - - - - ) - } - variant="filled" - className={classes.Chip} - data-cy="chipContextName" - style={chipStyle} - /> - // - ); -}; - -export const TootltipWrappedConnectionChip = (props) => { - return ( - - <> - <_ConnectionChip {...props} /> - - - ); -}; -const styles = makeStyles((theme) => ({ - statusCip: { - minWidth: '142px !important', - maxWidth: 'max-content !important', - display: 'flex !important', - justifyContent: 'flex-start !important', - borderRadius: '3px !important', - padding: '6px 8px', - '& .MuiChip-label': { - paddingTop: '3px', - fontWeight: '400', - }, - '& .MuiSvgIcon-root': { - marginLeft: '0px !important', - }, - '&:hover': { - boxShadow: '0px 1px 2px 0px rgba(0, 0, 0, 0.25)', - }, - }, - helpIcon: { - color: '#fff', - opacity: '0.7', - transition: 'opacity 200ms linear', - '&:hover': { - opacity: 1, - background: 'transparent', - }, - '&:focus': { - opacity: 1, - background: 'transparent', - }, - }, - ignored: { - '& .MuiChip-label': { - color: `${theme.palette.secondary.default}`, - }, - background: `${theme.palette.secondary.default}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.default} !important`, - }, - }, - connected: { - '& .MuiChip-label': { - color: theme.palette.secondary.success, - }, - background: `${theme.palette.secondary.success}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.success} !important`, - }, - }, - registered: { - '& .MuiChip-label': { - color: theme.palette.secondary.primary, - }, - background: `${theme.palette.secondary.primary}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.primary} !important`, - }, - }, - discovered: { - '& .MuiChip-label': { - color: notificationColors.info, - }, - background: `${notificationColors.info}30 !important`, - '& .MuiSvgIcon-root': { - color: `${notificationColors.info} !important`, - }, - }, - deleted: { - '& .MuiChip-label': { - color: theme.palette.secondary.error, - }, - background: `${theme.palette.secondary.lightError}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.error} !important`, - }, - }, - maintenance: { - '& .MuiChip-label': { - color: theme.palette.secondary.warning, - }, - background: `${theme.palette.secondary.warning}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.warning} !important`, - }, - }, - disconnected: { - '& .MuiChip-label': { - color: notificationColors.lightwarning, - }, - background: `${notificationColors.lightwarning}30 !important`, - '& .MuiSvgIcon-root': { - color: `${notificationColors.lightwarning} !important`, - }, - }, - notfound: { - '& .MuiChip-label': { - color: theme.palette.secondary.text, - }, - background: `${theme.palette.secondary.disableButtonBg}60 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.iconMain} !important`, - }, - }, -})); - -const DiscoveredStateChip = ({ value }) => { - const classes = styles(); - return ( - - } - label={value} - // helpIcon={} - /> - {/* */} - - ); -}; - -const RegisteredStateChip = ({ value }) => { - const classes = styles(); - return ( - - } - label={value} - // helpIcon={} - /> - {/* */} - - ); -}; - -const ConnectedStateChip = ({ value }) => { - const classes = styles(); - return ( - - } - label={value} - // helpIcon={} - /> - {/* */} - - ); -}; - -const DisconnectedStateChip = ({ value }) => { - const classes = styles(); - return ( - - } - label={value} - // helpIcon={} - /> - - ); -}; - -const IgnoredStateChip = ({ value }) => { - const classes = styles(); - return ( - - } - label={value} - // helpIcon={} - /> - {/* */} - - ); -}; - -const DeletedStateChip = ({ value }) => { - const classes = styles(); - return ( - - } - label={value} - // helpIcon={} - /> - {/* */} - - ); -}; - -const MaintainanceStateChip = ({ value }) => { - const classes = styles(); - return ( - - } - label={value} - // helpIcon={} - /> - {/* */} - - ); -}; - -const NotFoundStateChip = ({ value }) => { - const classes = styles(); - return ( - - } - label={value} - // helpIcon={} - /> - {/* */} - - ); -}; - -// const HelpToolTip = ({ classes, value }) => { -// const url = `https://docs.meshery.io/concepts/connections#${value}`; -// const onClick = () => (e) => { -// e.preventDefault(); -// e.stopPropagation(); -// window.open(url, '_blank'); -// }; -// return ( -// -// -// -// -// -// ); -// }; - -const Default = ({ value }) => { - const classes = styles(); - - return ( - - } - label={value} - /> - - ); -}; - -function getStatusChip(status) { - switch (status) { - case 'ignored': - return ; - case 'connected': - return ; - case 'registered': - return ; - case 'discovered': - return ; - case 'deleted': - return ; - case 'maintenance': - return ; - case 'disconnected': - return ; - case 'not found': - return ; - default: - return ; - } -} - -export const ConnectionStateChip = ({ status }) => { - return getStatusChip(status); -}; diff --git a/ui/components/connections/common/index.js b/ui/components/connections/common/index.js deleted file mode 100644 index fd81d2532bb..00000000000 --- a/ui/components/connections/common/index.js +++ /dev/null @@ -1,52 +0,0 @@ -import { CustomTextTooltip } from '@/components/MesheryMeshInterface/PatternService/CustomTextTooltip'; -import { Grid, TableCell, TableSortLabel, Typography } from '@material-ui/core'; - -export const SortableTableCell = ({ index, columnData, columnMeta, onSort, icon, tooltip }) => { - return ( - - - - - {columnData.label} - - {icon ? ( - - - {icon} - - - ) : ( - '' - )} - - - - - ); -}; - -export const DefaultTableCell = ({ columnData, icon, tooltip }) => { - return ( - - - - - {columnData.label} - - {icon ? ( - - - {icon} - - - ) : ( - '' - )} - - - - ); -}; diff --git a/ui/components/connections/index.js b/ui/components/connections/index.js deleted file mode 100644 index 34c4a9acd19..00000000000 --- a/ui/components/connections/index.js +++ /dev/null @@ -1,1316 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { - NoSsr, - TableCell, - Button, - FormControl, - Select, - TableContainer, - Table, - Grid, - TableRow, - IconButton, - Typography, - Popover, - AppBar, - Tabs, - Tab, - MenuItem, - Box, - Chip, -} from '@material-ui/core'; -import { - CustomColumnVisibilityControl, - CustomTooltip, - SearchBar, - UniversalFilter, -} from '@layer5/sistent'; -import { withStyles } from '@material-ui/core/styles'; -import DeleteForeverIcon from '@mui/icons-material/DeleteForever'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import MoreVertIcon from '@material-ui/icons/MoreVert'; -import { updateProgress } from '../../lib/store'; -import { useNotification } from '../../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../../lib/event-types'; -// import CustomColumnVisibilityControl from '../../utils/custom-column'; -// import SearchBar from '../../utils/custom-search'; -import { ResponsiveDataTable } from '@layer5/sistent'; -import useStyles from '../../assets/styles/general/tool.styles'; -import Modal from '../Modal'; -import { iconMedium } from '../../css/icons.styles'; -import PromptComponent, { PROMPT_VARIANTS } from '../PromptComponent'; -import resetDatabase from '../graphql/queries/ResetDatabaseQuery'; -import MesherySettingsEnvButtons from '../MesherySettingsEnvButtons'; -import styles from './styles'; -import MeshSyncTable from './meshSync'; -import ConnectionIcon from '../../assets/icons/Connection'; -import MeshsyncIcon from '../../assets/icons/Meshsync'; -import classNames from 'classnames'; -import CheckCircleIcon from '@mui/icons-material/CheckCircle'; -import RemoveCircleIcon from '@mui/icons-material/RemoveCircle'; -import SyncIcon from '@mui/icons-material/Sync'; -import AssignmentTurnedInIcon from '@mui/icons-material/AssignmentTurnedIn'; -import ExploreIcon from '@mui/icons-material/Explore'; -import { - CONNECTION_KINDS, - CONNECTION_STATES, - CONNECTION_STATE_TO_TRANSITION_MAP, -} from '../../utils/Enum'; -import FormatConnectionMetadata from './metadata'; -import useKubernetesHook from '../hooks/useKubernetesHook'; -import theme from '../../themes/app'; -import { TootltipWrappedConnectionChip } from './ConnectionChip'; -import { DefaultTableCell, SortableTableCell } from './common'; -import { getColumnValue, getVisibilityColums } from '../../utils/utils'; -import HandymanIcon from '@mui/icons-material/Handyman'; -import NotInterestedRoundedIcon from '@mui/icons-material/NotInterestedRounded'; -import DisconnectIcon from '../../assets/icons/disconnect'; -import { updateVisibleColumns } from '../../utils/responsive-column'; -import { useWindowDimensions } from '../../utils/dimension'; -// import UniversalFilter from '../../utils/custom-filter'; -import MultiSelectWrapper from '../multi-select-wrapper'; -import { - useGetEnvironmentsQuery, - useAddConnectionToEnvironmentMutation, - useRemoveConnectionFromEnvironmentMutation, - useSaveEnvironmentMutation, -} from '../../rtk-query/environments'; -import ErrorBoundary from '../ErrorBoundary'; -import CAN from '@/utils/can'; -import { keys } from '@/utils/permission_constants'; -import DefaultError from '../General/error-404/index'; -import { useGetConnectionsQuery, useUpdateConnectionMutation } from '@/rtk-query/connection'; -import { useGetSchemaQuery } from '@/rtk-query/schema'; -import { CustomTextTooltip } from '../MesheryMeshInterface/PatternService/CustomTextTooltip'; -import InfoOutlinedIcon from '@/assets/icons/InfoOutlined'; -import { DeleteIcon } from '@layer5/sistent'; -import { withRouter } from 'next/router'; -import { UsesSistent } from '../SistentWrapper'; -import { formatDate } from '../DataFormatter'; -import { getFallbackImageBasedOnKind } from '@/utils/fallback'; - -const ACTION_TYPES = { - FETCH_CONNECTIONS: { - name: 'FETCH_CONNECTIONS', - error_msg: 'Failed to fetch connections', - }, - UPDATE_CONNECTION: { - name: 'UPDATE_CONNECTION', - error_msg: 'Failed to update connection', - }, - DELETE_CONNECTION: { - name: 'DELETE_CONNECTION', - error_msg: 'Failed to delete connection', - }, - FETCH_CONNECTION_STATUS_TRANSITIONS: { - name: 'FETCH_CONNECTION_STATUS_TRANSITIONS', - error_msg: 'Failed to fetch connection transitions', - }, - FETCH_ENVIRONMENT: { - name: 'FETCH_ENVIRONMENT', - error_msg: 'Failed to fetch environment', - }, - CREATE_ENVIRONMENT: { - name: 'CREATE_ENVIRONMENT', - error_msg: 'Failed to create environment', - }, -}; - -/** - * Parent Component for Connection Component - * - * @important - * - Keep the component's responsibilities focused on connection management. Avoid adding unrelated functionality and state. - */ - -function ConnectionManagementPage(props) { - const [createConnectionModal, setCreateConnectionModal] = useState({ - open: false, - }); - - const { data: schemaResponse } = useGetSchemaQuery({ - schemaName: 'helmRepo', - }); - - const createConnection = schemaResponse ?? {}; - - const handleCreateConnectionModalOpen = () => { - setCreateConnectionModal({ open: true }); - }; - - const handleCreateConnectionModalClose = () => { - setCreateConnectionModal({ open: false }); - }; - - const handleCreateConnectionSubmit = () => {}; - - return ( - <> - - {createConnectionModal.open && ( - - )} - - ); -} -function Connections(props) { - const { - classes, - updateProgress, - /*onOpenCreateConnectionModal,*/ operatorState, - selectedK8sContexts, - k8sconfig, - connectionMetadataState, - meshsyncControllerState, - organization, - } = props; - const modalRef = useRef(null); - const [page, setPage] = useState(0); - const [pageSize, setPageSize] = useState(); - const [search, setSearch] = useState(''); - const [sortOrder, setSortOrder] = useState(''); - const [rowsExpanded, setRowsExpanded] = useState([]); - const [rowData, setSelectedRowData] = useState({}); - const [anchorEl, setAnchorEl] = React.useState(null); - const [_operatorState] = useState(operatorState || []); - const [tab, setTab] = useState(0); - const ping = useKubernetesHook(); - const { width } = useWindowDimensions(); - const [isSearchExpanded, setIsSearchExpanded] = useState(false); - const [statusFilter, setStatusFilter] = useState(); - const [kindFilter, setKindFilter] = useState(); - const [selectedFilters, setSelectedFilters] = useState({ status: 'All', kind: 'All' }); - - const [useUpdateConnectionMutator] = useUpdateConnectionMutation(); - const [addConnectionToEnvironmentMutator] = useAddConnectionToEnvironmentMutation(); - const [removeConnectionFromEnvMutator] = useRemoveConnectionFromEnvironmentMutation(); - const [saveEnvironmentMutator] = useSaveEnvironmentMutation(); - - // lock for not allowing multiple updates at the same time - // needs to be a ref because it needs to be shared between renders - // and useState loses reactivity when down table custom cells - const updatingConnection = useRef(false); - - const { - data: connectionData, - isError: isConnectionError, - error: connectionError, - refetch: getConnections, - } = useGetConnectionsQuery({ - page: page, - pagesize: pageSize, - search: search, - order: sortOrder, - status: statusFilter ? JSON.stringify([statusFilter]) : '', - kind: kindFilter ? JSON.stringify([kindFilter]) : '', - }); - - const { - data: environmentsResponse, - isSuccess: isEnvironmentsSuccess, - isError: isEnvironmentsError, - error: environmentsError, - } = useGetEnvironmentsQuery( - { orgId: organization?.id }, - { - skip: !organization?.id, - }, - ); - let environments = environmentsResponse?.environments || []; - - const modifiedConnections = connectionData?.connections.map((connection) => { - return { - ...connection, - nextStatus: - connection.nextStatus === undefined && - connectionMetadataState[connection.kind]?.transitions, - kindLogo: connection.kindLogo === undefined && connectionMetadataState[connection.kind]?.icon, - }; - }); - - const connections = modifiedConnections?.filter((connection) => { - if (selectedFilters.status === 'All' && selectedFilters.kind === 'All') { - return true; - } - return ( - (statusFilter === null || connection.status === statusFilter) && - (kindFilter === null || connection.kind === kindFilter) - ); - }); - - const addConnectionToEnvironment = async ( - environmentId, - environmentName, - connectionId, - connectionName, - ) => { - return addConnectionToEnvironmentMutator({ environmentId, connectionId }) - .unwrap() - .then(() => { - notify({ - message: `Connection: ${connectionName} assigned to environment: ${environmentName}`, - event_type: EVENT_TYPES.SUCCESS, - }); - }) - .catch((err) => { - notify({ - message: `${ACTION_TYPES.UPDATE_CONNECTION.error_msg}: ${err.error}`, - event_type: EVENT_TYPES.ERROR, - details: err.toString(), - }); - }); - }; - - const removeConnectionFromEnvironment = async ( - environmentId, - environmentName, - connectionId, - connectionName, - ) => { - return removeConnectionFromEnvMutator({ environmentId, connectionId }) - .unwrap() - .then(() => { - notify({ - message: `Connection: ${connectionName} removed from environment: ${environmentName}`, - event_type: EVENT_TYPES.SUCCESS, - }); - }) - .catch((err) => { - notify({ - message: `${ACTION_TYPES.UPDATE_CONNECTION.error_msg}: ${err.error}`, - event_type: EVENT_TYPES.ERROR, - details: err.toString(), - }); - }); - }; - - const saveEnvironment = async (connectionId, connectionName, environmentName) => { - return saveEnvironmentMutator({ - body: { - name: environmentName, - organization_id: organization?.id, - }, - }) - .unwrap() - .then((resp) => { - notify({ - message: `Environment "${resp.name}" created`, - event_type: EVENT_TYPES.SUCCESS, - }); - environments = [...environments, resp]; - addConnectionToEnvironment(resp.id, resp.name, connectionId, connectionName); - }) - .catch((err) => { - notify({ - message: `${ACTION_TYPES.CREATE_ENVIRONMENT.error_msg}: ${err.error}`, - event_type: EVENT_TYPES.ERROR, - details: err.toString(), - }); - }); - }; - - const open = Boolean(anchorEl); - const _operatorStateRef = useRef(_operatorState); - _operatorStateRef.current = _operatorState; - const meshSyncResetRef = useRef(null); - const { notify } = useNotification(); - const StyleClass = useStyles(); - const url = `https://docs.meshery.io/concepts/logical/connections#states-and-the-lifecycle-of-connections`; - const envUrl = `https://docs.meshery.io/concepts/logical/environments`; - - const icons = { - [CONNECTION_STATES.IGNORED]: () => , - [CONNECTION_STATES.CONNECTED]: () => , - [CONNECTION_STATES.REGISTERED]: () => , - [CONNECTION_STATES.DISCOVERED]: () => , - [CONNECTION_STATES.DELETED]: () => , - [CONNECTION_STATES.MAINTENANCE]: () => , - [CONNECTION_STATES.DISCONNECTED]: () => ( - - ), - [CONNECTION_STATES.NOTFOUND]: () => , - }; - - const handleEnvironmentSelect = async ( - connectionId, - connName, - assignedEnvironments, - selectedEnvironments, - unSelectedEnvironments, - ) => { - if (updatingConnection.current) { - return; - } - - updatingConnection.current = true; - - try { - let newlySelectedEnvironments = selectedEnvironments.filter((env) => { - return !assignedEnvironments.some((assignedEnv) => assignedEnv.value === env.value); - }); - - for (let environment of newlySelectedEnvironments) { - let envName = environment.label; - let environmentId = environment.value || ''; - let isNew = environment.__isNew__ || false; - - if (isNew) { - await saveEnvironment(connectionId, connName, envName); - return; - } - - addConnectionToEnvironment(environmentId, envName, connectionId, connName); - } - for (let environment of unSelectedEnvironments) { - let envName = environment.label; - let environmentId = environment.value || ''; - - await removeConnectionFromEnvironment(environmentId, envName, connectionId, connName); - } - } finally { - getConnections(); - updatingConnection.current = false; - } - }; - let colViews = [ - ['name', 'xs'], - ['environments', 'm'], - ['kind', 'm'], - ['type', 's'], - ['sub_type', 'na'], - ['created_at', 'na'], - ['status', 'xs'], - ['Actions', 'xs'], - ]; - - const columns = [ - { - name: 'id', - label: 'ID', - options: { - display: false, - }, - }, - { - name: 'metadata.server_location', - label: 'Server Location', - options: { - display: false, - }, - }, - { - name: 'metadata.server', - label: 'Server', - options: { - display: false, - }, - }, - { - name: 'name', - label: 'Name', - options: { - sort: true, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - customBodyRender: (value, tableMeta) => { - const server = - getColumnValue(tableMeta.rowData, 'metadata.server', columns) || - getColumnValue(tableMeta.rowData, 'metadata.server_location', columns); - const name = getColumnValue(tableMeta.rowData, 'metadata.name', columns); - const kind = getColumnValue(tableMeta.rowData, 'kind', columns); - return ( - <> - - handleDeleteConnection( - getColumnValue(tableMeta.rowData, 'id', columns), - getColumnValue(tableMeta.rowData, 'kind', columns), - ) - } - handlePing={() => { - // e.stopPropagation(); - if (getColumnValue(tableMeta.rowData, 'kind', columns) === 'kubernetes') { - ping( - getColumnValue(tableMeta.rowData, 'metadata.name', columns), - getColumnValue(tableMeta.rowData, 'metadata.server', columns), - getColumnValue(tableMeta.rowData, 'id', columns), - ); - } - }} - iconSrc={`/${ - getColumnValue(tableMeta.rowData, 'kindLogo', columns) || - getFallbackImageBasedOnKind(kind) - }`} - width="12rem" - /> - {kind == 'kubernetes' && ( - - - - - - - - )} - - ); - }, - }, - }, - { - name: 'environments', - label: 'Environments', - options: { - sort: false, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ ...column }) { - return ( - - { - e.stopPropagation(); - }} - /> - - } - tooltip={`Meshery Environments allow you to logically group related Connections and their associated Credentials. [Learn more](${envUrl})`} - /> - ); - }, - customBodyRender: (value, tableMeta) => { - const getOptions = () => { - return environments.map((env) => ({ label: env.name, value: env.id })); - }; - let cleanedEnvs = value?.map((env) => ({ label: env.name, value: env.id })) || []; - let updatingEnvs = updatingConnection.current; - console.log('cleanedEnvs', updatingEnvs); - return ( - isEnvironmentsSuccess && ( -
e.stopPropagation()}> - - - - handleEnvironmentSelect( - getColumnValue(tableMeta.rowData, 'id', columns), - getColumnValue(tableMeta.rowData, 'name', columns), - cleanedEnvs, - selected, - unselected, - ) - } - options={getOptions()} - value={cleanedEnvs} - placeholder={`Assigned Environments`} - isSelectAll={true} - menuPlacement={'bottom'} - disabled={ - !CAN( - keys.ASSIGN_CONNECTIONS_TO_ENVIRONMENT.action, - keys.ASSIGN_CONNECTIONS_TO_ENVIRONMENT.subject, - ) - } - /> - - -
- ) - ); - }, - }, - }, - { - name: 'kind', - label: 'Kind', - options: { - sort: true, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - }, - }, - { - name: 'type', - label: 'Category', - options: { - sort: true, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - }, - }, - { - name: 'sub_type', - label: 'Sub Category', - options: { - sort: true, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - }, - }, - { - name: 'updated_at', - label: 'Updated At', - options: { - sort: true, - sortThirdClickReset: true, - display: false, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - }, - }, - { - name: 'created_at', - label: 'Discovered At', - options: { - sort: true, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - customBodyRender: function CustomBody(value) { - const renderValue = formatDate(value); - return ( - - - {renderValue} - - - ); - }, - }, - }, - { - name: 'status', - label: 'Status', - options: { - sort: true, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - icon={ - - { - e.stopPropagation(); - }} - /> - - } - tooltip={`Every connection can be in one of the states at any given point of time. Eg: Connected, Registered, Discovered, etc. It allow users more control over whether the discovered infrastructure is to be managed or not (registered for use or not). [Learn more](${url})`} - /> - ); - }, - customBodyRender: function CustomBody(value, tableMeta) { - const nextStatusCol = getColumnValue(tableMeta.rowData, 'nextStatus', columns); - const originalNextStatus = nextStatusCol && nextStatusCol[value]; - let nextStatus = []; - if (originalNextStatus !== undefined) { - nextStatus = Object.values(originalNextStatus); - nextStatus.push(value); - } else { - nextStatus.push(value); - } - const disabled = - value === 'deleted' - ? true - : !CAN(keys.CHANGE_CONNECTION_STATE.action, keys.CHANGE_CONNECTION_STATE.subject); - return ( - <> - - - - - ); - }, - }, - }, - { - name: 'Actions', - label: 'Actions', - options: { - filter: false, - sort: false, - searchable: false, - customHeadRender: function CustomHead({ ...column }) { - return ( - - {column.label} - - ); - }, - customBodyRender: function CustomBody(_, tableMeta) { - return ( -
- {getColumnValue(tableMeta.rowData, 'kind', columns) === - CONNECTION_KINDS.KUBERNETES ? ( - handleActionMenuOpen(e, tableMeta)} - > - - - ) : ( - '-' - )} -
- ); - }, - }, - }, - { - name: 'nextStatus', - label: 'nextStatus', - options: { - display: false, - }, - }, - { - name: 'kindLogo', - label: 'kindLogo', - options: { - display: false, - }, - }, - { - name: 'metadata.name', - label: 'Name', - options: { - display: false, - }, - }, - ]; - - const options = { - filter: false, - viewColumns: false, - search: false, - responsive: 'standard', - resizableColumns: true, - serverSide: true, - count: connectionData?.total_count, - rowsPerPage: pageSize, - fixedHeader: true, - page, - print: false, - download: false, - textLabels: { - selectedRows: { - text: 'connection(s) selected', - }, - }, - customToolbarSelect: (selected) => ( - - ), - enableNestedDataAccess: '.', - onTableChange: (action, tableState) => { - const sortInfo = tableState.announceText ? tableState.announceText.split(' : ') : []; - let order = ''; - if (tableState.activeColumn) { - order = `${columns[tableState.activeColumn].name} desc`; - } - switch (action) { - case 'changePage': - setPage(tableState.page.toString()); - break; - case 'changeRowsPerPage': - setPageSize(tableState.rowsPerPage.toString()); - break; - case 'sort': - if (sortInfo.length == 2) { - if (sortInfo[1] === 'ascending') { - order = `${columns[tableState.activeColumn].name} asc`; - } else { - order = `${columns[tableState.activeColumn].name} desc`; - } - } - if (order !== sortOrder) { - setSortOrder(order); - } - break; - } - }, - expandableRows: true, - expandableRowsHeader: false, - expandableRowsOnClick: true, - rowsExpanded: rowsExpanded, - isRowExpandable: () => { - return true; - }, - onRowExpansionChange: (_, allRowsExpanded) => { - setRowsExpanded(allRowsExpanded.slice(-1).map((item) => item.index)); - }, - renderExpandableRow: (rowData, tableMeta) => { - const colSpan = rowData.length; - const connection = connections && connections[tableMeta.rowIndex]; - return ( - - - - - - - - - - - - - - - - -
-
-
- ); - }, - }; - - const [tableCols, updateCols] = useState(columns); - - const [columnVisibility, setColumnVisibility] = useState(() => { - let showCols = updateVisibleColumns(colViews, width); - // Initialize column visibility based on the original columns' visibility - const initialVisibility = {}; - columns.forEach((col) => { - initialVisibility[col.name] = showCols[col.name]; - }); - return initialVisibility; - }); - - useEffect(() => { - updateCols(columns); - if (isEnvironmentsError) { - notify({ - message: `${ACTION_TYPES.FETCH_ENVIRONMENT.error_msg}: ${environmentsError}`, - event_type: EVENT_TYPES.ERROR, - details: environmentsError.toString(), - }); - } - - if (isConnectionError) { - notify({ - message: `${ACTION_TYPES.FETCH_CONNECTIONS.error_msg}: ${connectionError}`, - event_type: EVENT_TYPES.ERROR, - details: connectionError.toString(), - }); - } - }, [environmentsError, connectionError, isEnvironmentsSuccess]); - - const handleError = (action) => (error) => { - updateProgress({ showProgress: false }); - notify({ - message: `${action.error_msg}: ${error}`, - event_type: EVENT_TYPES.ERROR, - details: error.toString(), - }); - }; - - const UpdateConnectionStatus = (connectionKind, requestBody) => { - useUpdateConnectionMutator({ - connectionKind: connectionKind, - connectionPayload: requestBody, - }) - .unwrap() - .then(() => { - notify({ - message: `Connection status updated successfully`, - event_type: EVENT_TYPES.SUCCESS, - }); - }) - .catch((err) => { - notify({ - message: `${ACTION_TYPES.UPDATE_CONNECTION.error_msg}: ${err.error}`, - event_type: EVENT_TYPES.ERROR, - details: err.toString(), - }); - }); - }; - - const handleStatusChange = async (e, connectionId, connectionKind) => { - e.stopPropagation(); - let response = await modalRef.current.show({ - title: `Connection Status Transition`, - subtitle: `Are you sure that you want to transition the connection status to ${e.target.value.toUpperCase()}?`, - options: ['Confirm', 'Cancel'], - showInfoIcon: `Learn more about the [lifecycle of connections and the behavior of state transitions](https://docs.meshery.io/concepts/logical/connections) in Meshery Docs.`, - // variant: PROMPT_VARIANTS.CONFIRMATION, - }); - if (response === 'Confirm') { - const requestBody = JSON.stringify({ - [connectionId]: e.target.value, - }); - UpdateConnectionStatus(connectionKind, requestBody); - } - }; - - const handleDeleteConnection = async (connectionId, connectionKind) => { - if (connectionId) { - let response = await modalRef.current.show({ - title: `Delete Connection`, - subtitle: `Are you sure that you want to delete the connection?`, - options: ['Delete', 'Cancel'], - showInfoIcon: `Learn more about the [lifecycle of connections and the behavior of state transitions](https://docs.meshery.io/concepts/logical/connections) in Meshery Docs.`, - variant: PROMPT_VARIANTS.DANGER, - }); - if (response === 'Delete') { - const requestBody = JSON.stringify({ - [connectionId]: CONNECTION_STATES.DELETED, - }); - UpdateConnectionStatus(connectionKind, requestBody); - } - } - }; - - const handleDeleteConnections = async (selected) => { - if (selected) { - let response = await modalRef.current.show({ - title: `Delete Connections`, - subtitle: `Are you sure that you want to delete the connections?`, - options: ['Delete', 'Cancel'], - showInfoIcon: `Learn more about the [lifecycle of connections and the behavior of state transitions](https://docs.meshery.io/concepts/logical/connections) in Meshery Docs.`, - variant: PROMPT_VARIANTS.DANGER, - }); - if (response === 'Delete') { - // let bulkConnections = {} - // selected.data.map(({ index }) => { - // bulkConnections = { - // ...bulkConnections, - // [connections[index].id]: CONNECTION_STATES.DELETED - // }; - // }) - // const requestBody = JSON.stringify(bulkConnections); - // updateConnectionStatus(requestBody); - selected.data.map(({ index }) => { - const requestBody = JSON.stringify({ - [connections[index].id]: CONNECTION_STATES.DELETED, - }); - UpdateConnectionStatus(connections[index].kind, requestBody); - }); - } - } - }; - - const handleActionMenuOpen = (event, tableMeta) => { - event.stopPropagation(); - setAnchorEl(event.currentTarget); - setSelectedRowData(tableMeta); - }; - - const handleActionMenuClose = () => { - setAnchorEl(null); - }; - - const handleFlushMeshSync = (index) => { - return async () => { - handleActionMenuClose(); - let response = await meshSyncResetRef.current.show({ - title: `Flush MeshSync data for ${connections[index].metadata?.name} ?`, - subtitle: `Are you sure to Flush MeshSync data for “${connections[index].metadata?.name}”? Fresh MeshSync data will be repopulated for this context, if MeshSync is actively running on this cluster.`, - options: ['PROCEED', 'CANCEL'], - variant: PROMPT_VARIANTS.WARNING, - }); - if (response === 'PROCEED') { - updateProgress({ showProgress: true }); - resetDatabase({ - selector: { - clearDB: 'true', - ReSync: 'true', - hardReset: 'false', - }, - k8scontextID: connections[index].metadata?.id, - }).subscribe({ - next: (res) => { - updateProgress({ showProgress: false }); - if (res.resetStatus === 'PROCESSING') { - notify({ message: `Database reset successful.`, event_type: EVENT_TYPES.SUCCESS }); - } - }, - error: handleError('Database is not reachable, try restarting server.'), - }); - } - }; - }; - - const filters = { - status: { - name: 'Status', - options: [ - { label: 'Connected', value: 'connected' }, - { label: 'Registered', value: 'registered' }, - { label: 'Discovered', value: 'discovered' }, - { label: 'Ignored', value: 'ignored' }, - { label: 'Deleted', value: 'deleted' }, - { label: 'Maintenance', value: 'maintenance' }, - { label: 'Disconnected', value: 'disconnected' }, - { label: 'Not Found', value: 'not found' }, - ], - }, - kind: { - name: 'Kind', - options: Object.entries(CONNECTION_KINDS).map(([key, value]) => ({ label: key, value })), - }, - }; - - const handleApplyFilter = () => { - const statusFilter = selectedFilters.status === 'All' ? null : selectedFilters.status; - const kindFilter = selectedFilters.kind === 'All' ? null : selectedFilters.kind; - - setKindFilter(kindFilter); - setStatusFilter(statusFilter); - }; - return ( - - {CAN(keys.VIEW_CONNECTIONS.action, keys.VIEW_CONNECTIONS.subject) ? ( - <> - - { - e.stopPropagation(); - setTab(newTab); - }} - indicatorColor="primary" - textColor="primary" - variant="fullWidth" - sx={{ - height: '10%', - }} - > - - Connections - - {/* */} -
- } - /> - - MeshSync - - - } - /> - - - {tab === 0 && ( -
-
- {/*
- -
*/} - -
- -
- { - setSearch(value); - }} - placeholder="Search Connections..." - expanded={isSearchExpanded} - setExpanded={setIsSearchExpanded} - /> - - - - -
-
-
- )} - {tab === 0 && CAN(keys.VIEW_CONNECTIONS.action, keys.VIEW_CONNECTIONS.subject) && ( - - - - )} - {tab === 1 && ( - - )} - - - -
- - - -
-
-
- - - ) : ( - - )} - - ); -} - -const mapDispatchToProps = (dispatch) => ({ - updateProgress: bindActionCreators(updateProgress, dispatch), -}); - -const mapStateToProps = (state) => { - const k8sconfig = state.get('k8sConfig'); - const selectedK8sContexts = state.get('selectedK8sContexts'); - const operatorState = state.get('operatorState'); - const connectionMetadataState = state.get('connectionMetadataState'); - const meshsyncControllerState = state.get('controllerState'); - const organization = state.get('organization'); - - return { - k8sconfig, - selectedK8sContexts, - operatorState, - connectionMetadataState, - meshsyncControllerState, - organization, - }; -}; - -const ConnectionManagementPageWithErrorBoundary = (props) => { - return ( - - null} - onError={(e) => console.error('Error in Connection Management', e)} - > - - - - ); -}; - -// @ts-ignore -export default withStyles(styles)( - connect( - mapStateToProps, - mapDispatchToProps, - )(withRouter(ConnectionManagementPageWithErrorBoundary)), -); diff --git a/ui/components/connections/meshSync/RegisterConnectionModal.js b/ui/components/connections/meshSync/RegisterConnectionModal.js deleted file mode 100644 index bc5d1b37fa0..00000000000 --- a/ui/components/connections/meshSync/RegisterConnectionModal.js +++ /dev/null @@ -1,87 +0,0 @@ -import React from 'react'; -import { DialogContent, Dialog } from '@material-ui/core'; - -import theme from '../../../themes/app.js'; -import CustomizedSteppers from './Stepper/index.js'; - -import { useCancelConnectionRegisterMutation } from '@/rtk-query/connection.js'; -import { useDeleteMeshsyncResourceMutation } from '@/rtk-query/meshsync.js'; -import { useNotification } from '@/utils/hooks/useNotification.js'; -import { EVENT_TYPES } from 'lib/event-types.js'; - -const RegisterConnectionModal = ({ - openRegistrationModal, - connectionData, - handleRegistrationModalClose, -}) => { - const [sharedData, setSharedData] = React.useState(null); - const { notify } = useNotification(); - const [cancelConnection] = useCancelConnectionRegisterMutation(); - const [deleteMeshsyncResource] = useDeleteMeshsyncResourceMutation(); - - const cancelConnectionRegister = (id) => { - cancelConnection({ body: JSON.stringify({ id }) }) - .unwrap() - .then(() => { - notify({ - message: 'Connection registration cancelled.', - event_type: EVENT_TYPES.INFO, - }); - }); - }; - const handleClose = () => { - handleRegistrationModalClose(); - cancelConnectionRegister(sharedData?.connection?.id); - }; - - const handleRegistrationComplete = (resourceId) => { - deleteMeshsyncResource({ resourceId: resourceId }) - .unwrap() - .then(() => { - notify({ - message: 'Connection registered successfully!', - event_type: EVENT_TYPES.SUCCESS, - }); - }) - .catch((error) => { - notify({ - message: `Failed to register connection: ${error}`, - event_type: EVENT_TYPES.ERROR, - }); - }); - }; - - return ( -
- - - - - -
- ); -}; - -export default RegisterConnectionModal; diff --git a/ui/components/connections/meshSync/Stepper/Notification.js b/ui/components/connections/meshSync/Stepper/Notification.js deleted file mode 100644 index 6f87357b978..00000000000 --- a/ui/components/connections/meshSync/Stepper/Notification.js +++ /dev/null @@ -1,52 +0,0 @@ -// Notification.js -import React from 'react'; -import { Grid, Typography, Button } from '@material-ui/core'; - -const Notification = ({ type, message, retry, onRetry }) => { - return ( -
- - - {type === 'success' ? 'Success' : 'Verification Failed'} - - - {message} - - - - {retry && ( - - )} - -
- ); -}; - -export default Notification; diff --git a/ui/components/connections/meshSync/Stepper/StepperContent.js b/ui/components/connections/meshSync/Stepper/StepperContent.js deleted file mode 100644 index 62bb866d36f..00000000000 --- a/ui/components/connections/meshSync/Stepper/StepperContent.js +++ /dev/null @@ -1,473 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react'; -import OutlinedInput from '@mui/material/OutlinedInput'; -import InputLabel from '@mui/material/InputLabel'; -import FormControl from '@mui/material/FormControl'; -import { Checkbox, MenuItem, ListItemText, Select, Typography } from '@material-ui/core'; - -import { - ConnectionDetailContent, - FinishContent, - CredentialDetailContent, - SelectConnectionTypeContent, -} from './constants'; -import StepperContent from './StepperContentWrapper'; -import RJSFWrapper from '../../../MesheryMeshInterface/PatternService/RJSF_wrapper'; -import dataFetch from '../../../../lib/data-fetch'; -import { Box } from '@mui/material'; -import { selectCompSchema } from '../../../RJSFUtils/common'; -import { JsonParse, randomPatternNameGenerator } from '../../../../utils/utils'; -import Notification from './Notification'; - -const CONNECTION_TYPES = ['Prometheus Connection', 'Grafana Connection']; - -const schema = selectCompSchema( - CONNECTION_TYPES, - 'Select one of the available Connection type', - 'Select type of Connection to register', - 'selectedConnectionType', -); -export const SelectConnection = ({ setSharedData, handleNext }) => { - const formRef = useRef(); - - const registerConnection = (componentName) => { - dataFetch( - '/api/integrations/connections/register', - { - method: 'POST', - credentials: 'include', - body: JSON.stringify({ - kind: componentName, - status: 'initialize', - }), - }, - (result) => { - let schemaObj = { - connection: JsonParse(result?.connection?.schema), - credential: JsonParse(result?.credential?.schema), - }; - // formConnectionIdRef.current = result.id; - setSharedData((prevState) => ({ - ...prevState, - connection: result, - schemas: schemaObj, - kind: componentName.toLowerCase(), - })); - handleNext(); - }, - ); - }; - - const handleCallback = () => { - handleNext(); - }; - - const handleChange = (data) => { - if (data.selectedConnectionType) { - const selectedConnectionType = data.selectedConnectionType; - // The selectedConnectionType is the concatentaion of connectionType, ' ' and 'Connection' suffix. - // Therefore, when initiating connection we are removing ' ' and suffix so that correct schema is retrieved. - registerConnection(selectedConnectionType?.slice(0, selectedConnectionType.indexOf(' '))); - } - }; - - return ( - - - - ); -}; - -export const ConnectionDetails = ({ sharedData, setSharedData, handleNext }) => { - const formRef = React.createRef(); - const [selectedEndpoint, setSelectedEndpoint] = useState(null); - // stores selected endpoint just before dropdown is closed - const [prevSelectedEndpoint, setPrevSelectedEndpoint] = useState(null); - - useEffect(() => { - ConnectionDetailContent.title = `Connecting to ${sharedData?.kind}`; - }, [sharedData?.connection]); - - const handleCallback = () => { - handleNext(); - }; - - const cancelCallback = () => { - sharedData.onClose(); - }; - - const handleSelectEndpoint = (e) => { - setSharedData((prevState) => ({ - ...prevState, - componentForm: { - name: randomPatternNameGenerator(), - url: e.target.value, - }, - })); - - setSelectedEndpoint(e.target.value); - setPrevSelectedEndpoint(e.target.value); - }; - - const handleClose = () => { - if (prevSelectedEndpoint === selectedEndpoint) { - setSelectedEndpoint(null); - setPrevSelectedEndpoint(null); - } - }; - - const handleChange = (data) => { - setSharedData((prevState) => ({ - ...prevState, - componentForm: data, - })); - }; - const isDisabledNextButton = - sharedData?.componentForm && - sharedData?.componentForm['name'] !== undefined && - sharedData?.componentForm && - sharedData?.componentForm['url'] !== undefined - ? false - : true; - return ( - - {sharedData?.capabilities && ( - - - Select from the discovered endpoints - - - - )} -

-OR-

-

Enter the {sharedData.kind} service URL

- -
- ); -}; - -export const CredentialDetails = ({ sharedData, handleNext, handleRegistrationComplete }) => { - const [existingCredentials, setExistingCredentials] = useState([]); - const [selectedCredential, setSelectedCredential] = useState(null); - const [prevSelectedCredential, setPrevSelectedCredential] = useState(null); - const [formState, setFormState] = useState(null); - const [skipCredentialVerification, setSkipCredentialVerification] = useState(false); - const [disableVerify, setDisableVerify] = useState(true); - const [isSuccess, setIsSuccess] = React.useState(null); - const formRef = React.createRef(); - useEffect(() => { - getchExistingCredential(); - }, []); - - useEffect(() => { - CredentialDetailContent.title = `Credential for ${sharedData?.kind}`; - }, [sharedData.kind]); - - const getchExistingCredential = () => { - dataFetch( - '/api/integrations/credentials', - { - method: 'GET', - credentials: 'include', - }, - (result) => { - setExistingCredentials(result?.credentials); - }, - (error) => { - console.error('Error fetching existing credentials:', error); - }, - ); - }; - - const verifyConnection = () => { - let credential = {}; - if (selectedCredential === null) { - credential = formState; - } else { - credential = { - secret: selectedCredential?.secret?.secret, - name: selectedCredential?.name, - }; - credential.id = selectedCredential?.id; - } - - dataFetch( - '/api/integrations/connections/register', - { - method: 'POST', - credentials: 'include', - body: JSON.stringify({ - skip_credential_verification: skipCredentialVerification, - kind: sharedData?.kind, // this is "kind" column of the current row which is selected in the meshsync table. i.e. the entry against which registration process has been invoked. - name: sharedData?.componentForm?.name, // This name is from the name field in schema - type: sharedData?.connection?.connection?.model?.category?.name?.toLowerCase(), - sub_type: sharedData?.connection?.connection?.model?.subCategory?.toLowerCase(), - metadata: sharedData?.componentForm, - credential_secret: credential, - id: sharedData?.connection?.id, - status: 'register', - }), - }, - (result) => { - if (result === '') { - setIsSuccess(true); - connectToConnection(); - } else { - setIsSuccess(false); - } - }, - (error) => { - console.error('Error verifying connection:', error); - setIsSuccess(false); - }, - ); - }; - - const connectToConnection = () => { - let credential = {}; - if (selectedCredential === null) { - credential = formState; - } else { - credential = { - name: selectedCredential?.name, - secret: selectedCredential?.secret?.secret, - }; - credential.id = selectedCredential?.id; - } - - dataFetch( - '/api/integrations/connections/register', - { - method: 'POST', - credentials: 'include', - body: JSON.stringify({ - kind: sharedData?.kind, // this is "kind" column of the current row which is selected in the meshsync table. i.e. the entry against which registration process has been invoked. - name: sharedData?.componentForm?.name, // This name is from the name field in schema - type: sharedData?.connection?.connection?.model?.category?.name?.toLowerCase(), - sub_type: sharedData?.connection?.connection?.model?.subCategory?.toLowerCase(), - metadata: sharedData?.componentForm, - credential_secret: credential, - id: sharedData?.connection?.id, - status: 'connect', - }), - }, - (result) => { - if (result !== undefined && result !== null && result === '') { - setIsSuccess(true); - } else { - setIsSuccess(false); - } - }, - (error) => { - console.error('Error connecting to connection:', error); - setIsSuccess(false); - }, - ); - }; - - const handleCallback = () => { - if (isSuccess === null || isSuccess === false) { - verifyConnection(); - } else { - handleNext(); - handleRegistrationComplete(); - } - }; - - const cancelCallback = () => { - sharedData.onClose(); - }; - - const handleSelectCredential = (e) => { - const id = e.target.value; - const credential = existingCredentials.find((credential) => credential.id === id); - setSelectedCredential(credential); - setPrevSelectedCredential(id); - }; - - const handleChange = (data) => { - setFormState(data); - }; - - const handleClose = () => { - if (prevSelectedCredential === selectedCredential?.id) { - setSelectedCredential(null); - setPrevSelectedCredential(null); - } - }; - - useEffect(() => { - if (selectedCredential !== null || (formState !== null && formState['secret']) !== undefined) { - setDisableVerify(false); - } else { - setDisableVerify(true); - } - }, [selectedCredential, formState]); - - return ( - - - Select an existing credential to use for this connection - - - - Select existing credential - - - -

-OR-

-

Configure a new credential to use for this connection

- - - - { - setSkipCredentialVerification(e.target.checked); - setDisableVerify(!e.target.checked); - }} - /> - - - - {isSuccess !== null && ( - verifyConnection()} - /> - )} -
- ); -}; - -export const Finish = ({ sharedData }) => { - const cancelCallback = () => { - sharedData.onClose(); - }; - - return ( - - ); -}; diff --git a/ui/components/connections/meshSync/Stepper/StepperContentWrapper.js b/ui/components/connections/meshSync/Stepper/StepperContentWrapper.js deleted file mode 100644 index e2bd0cd4b4c..00000000000 --- a/ui/components/connections/meshSync/Stepper/StepperContentWrapper.js +++ /dev/null @@ -1,83 +0,0 @@ -import React from 'react'; -import { Box, Typography, Divider, Button } from '@material-ui/core'; -import { useStyles } from '../../../Connect/styles'; - -const ContentHeader = ({ title }) => ( - <> - - {title} - - - -); - -const StepperContent = ({ - title, - children, - subtitle, - tips, - btnText, - cancel, - handleCallback, - cancelCallback, - disabled, -}) => { - const classes = useStyles(); - return ( - -
- - {subtitle && ( - - {subtitle} - - )} - {children} - {tips && ( - - {tips} - - )} -
- - {cancel && ( - - )} - - {btnText && ( - - )} - -
- ); -}; - -export default StepperContent; diff --git a/ui/components/connections/meshSync/Stepper/constants.js b/ui/components/connections/meshSync/Stepper/constants.js deleted file mode 100644 index e9154c0cf53..00000000000 --- a/ui/components/connections/meshSync/Stepper/constants.js +++ /dev/null @@ -1,69 +0,0 @@ -import FinishFlagIcon from '../../../../assets/icons/FinishFlagIcon'; -import { ConnectionDetails, CredentialDetails, Finish, SelectConnection } from './StepperContent'; -import ConnectionIcon from '../../../../assets/icons/Connection'; -import CredentialIcon from '../../../../assets/icons/CredentialIcon'; - -export const registerConnectionSteps = [ - 'Select Connection type', - 'Connection Details', - 'Credential Details', - 'Finish', -]; - -export const registerConnectionIcons = { - 1: , - 2: , - 3: , - 4: , -}; - -export const registerConnectionContent = { - 1: { - component: , - props: ['handleNext', 'sharedData', 'setSharedData'], - }, - 2: { - component: , - props: ['handleNext', 'sharedData', 'setSharedData'], - }, - 3: { - component: , - props: ['handleNext', 'sharedData', 'setSharedData', 'handleRegistrationComplete'], - }, - 4: { - component: , - props: ['sharedData', 'setSharedData'], - }, -}; - -export const ConnectionStepperTips = [ - 'GitOps is more fun with friends. Invite one today.', - 'Meshery works with multiple Kubernetes clusters. Connect each of yours by uploading your kubeconfig and letting Meshery do the rest.', - 'Import your Docker Compose, Helm Chart, and Kubernetes mainfests. Let Meshery visualize and deploy them.', -]; - -export const SelectConnectionTypeContent = { - title: 'Select type of Connection to register.', - tips: 'Establish a connection by registering the resource.', - btnText: '', - cancel: false, -}; -export const ConnectionDetailContent = { - title: '', - tips: 'Establish a Connection by registering the resource.', - btnText: 'Next', - cancel: true, -}; - -export const CredentialDetailContent = { - title: '', - tips: '', - btnText: 'Verify Connection', - cancel: true, -}; - -export const FinishContent = { - title: 'Connection Created', - subtitle: 'Congratulations 🎉, you have registered a new connection.', - btnText: 'Finish', -}; diff --git a/ui/components/connections/meshSync/Stepper/index.js b/ui/components/connections/meshSync/Stepper/index.js deleted file mode 100644 index aa43d07c859..00000000000 --- a/ui/components/connections/meshSync/Stepper/index.js +++ /dev/null @@ -1,116 +0,0 @@ -import * as React from 'react'; -import Step from '@material-ui/core/Step'; -import StepLabel from '@material-ui/core/StepLabel'; -import { ColorlibConnector, useStyles, useColorlibStepIconStyles } from '../../../Connect/styles'; -import TipsCarousel from '../../../General/TipsCarousel'; -import { - ConnectionStepperTips, - registerConnectionContent, - registerConnectionIcons, - registerConnectionSteps, -} from './constants'; -import Stepper from '@material-ui/core/Stepper'; -import clsx from 'clsx'; - -function StepperIcon(props) { - const classes = useColorlibStepIconStyles(); - const { active, completed, stepIcons } = props; - - const iconComponent = stepIcons[String(props.icon)]; - - const additionalProps = { - fill: completed ? 'white' : 'currentColor', - }; - - return ( -
- {React.cloneElement(iconComponent, additionalProps)} -
- ); -} - -/* eslint-disable */ - -export default function CustomizedSteppers({ - sharedData, - setSharedData, - connectionData, - onClose, - handleRegistrationComplete, -}) { - const stepData = { - stepContent: registerConnectionContent, - stepIcons: registerConnectionIcons, - steps: registerConnectionSteps, - }; - const { stepContent, stepIcons, steps } = stepData; - const classes = useStyles(); - const [activeStep, setActiveStep] = React.useState(0); - - React.useEffect(() => { - setSharedData({ - metadata: connectionData.metadata, - capabilities: connectionData.capabilities, - kind: connectionData.kind, - }); - }, [connectionData]); - - React.useEffect(() => { - setSharedData((prevState) => ({ - ...prevState, - onClose: onClose, - })); - }, [sharedData]); - const ActiveStepContent = stepContent[String(activeStep + 1)].component; - - const handleNext = () => { - setActiveStep((prevActiveStep) => prevActiveStep + 1); - }; - - const stepProps = stepContent[String(activeStep + 1)]?.props?.reduce((props, propName) => { - props[propName] = propName === 'handleNext' ? handleNext : eval(propName); - return props; - }, {}); - - return ( -
-
- } - classes={{ root: classes.stepperContainer }} - > - {steps.map((label) => ( - - } - classes={{ label: classes.customLabelStyle }} - > - {label} - - - ))} - -
-
- - {React.cloneElement(ActiveStepContent, stepProps)} -
-
- ); -} diff --git a/ui/components/connections/meshSync/index.js b/ui/components/connections/meshSync/index.js deleted file mode 100644 index f7ed95b64cc..00000000000 --- a/ui/components/connections/meshSync/index.js +++ /dev/null @@ -1,607 +0,0 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { - TableCell, - Tooltip, - TableContainer, - Table, - Grid, - TableRow, - FormControl, - Select, - MenuItem, - Chip, -} from '@material-ui/core'; -import Moment from 'react-moment'; -import { useNotification } from '../../../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../../../lib/event-types'; -import { - CustomColumnVisibilityControl, - ResponsiveDataTable, - SearchBar, - UniversalFilter, -} from '@layer5/sistent'; -import useStyles from '../../../assets/styles/general/tool.styles'; -import { MeshSyncDataFormatter } from '../metadata'; -import { getK8sClusterIdsFromCtxId } from '../../../utils/multi-ctx'; -import { DefaultTableCell, SortableTableCell } from '../common'; -import { - JsonParse, - camelcaseToSnakecase, - getColumnValue, - getVisibilityColums, -} from '../../../utils/utils'; -import RegisterConnectionModal from './RegisterConnectionModal'; -import classNames from 'classnames'; -import AssignmentTurnedInIcon from '@mui/icons-material/AssignmentTurnedIn'; -import ExploreIcon from '@mui/icons-material/Explore'; -import { CONNECTION_STATES, MESHSYNC_STATES } from '../../../utils/Enum'; -import { updateVisibleColumns } from '../../../utils/responsive-column'; -import { useWindowDimensions } from '../../../utils/dimension'; -import { FormatId } from '../../DataFormatter'; -import { - useGetMeshSyncResourceKindsQuery, - useGetMeshSyncResourcesQuery, -} from '@/rtk-query/meshsync'; -import { UsesSistent } from '@/components/SistentWrapper'; - -const ACTION_TYPES = { - FETCH_MESHSYNC_RESOURCES: { - name: 'FETCH_MESHSYNC_RESOURCES', - error_msg: 'Failed to fetch meshsync resources', - }, -}; - -export default function MeshSyncTable(props) { - const { classes, updateProgress, selectedK8sContexts, k8sconfig } = props; - const callbackRef = useRef(); - const [openRegistrationModal, setRegistrationModal] = useState(false); - const [page, setPage] = useState(0); - const [pageSize, setPageSize] = useState(10); - const [search, setSearch] = useState(''); - const [sortOrder, setSortOrder] = useState(''); - const [rowsExpanded, setRowsExpanded] = useState([]); - const [selectedKind, setSelectedKind] = useState(''); - - const [isSearchExpanded, setIsSearchExpanded] = useState(false); - const [selectedFilters, setSelectedFilters] = useState({ kind: 'All' }); - const [registerConnection, setRegisterConnection] = useState({ - metadata: {}, - kind: '', - }); - const StyleClass = useStyles(); - const { width } = useWindowDimensions(); - - const icons = { - [MESHSYNC_STATES.REGISTER]: () => , - [MESHSYNC_STATES.DISCOVERED]: () => , - }; - - const { notify } = useNotification(); - - const handleRegistrationModalClose = () => { - setRegistrationModal(false); - }; - - const { - data: meshSyncData, - isError: isError, - error: meshSyncError, - } = useGetMeshSyncResourcesQuery({ - page: page, - pagesize: pageSize, - search: search, - order: sortOrder, - kind: selectedKind, - clusterIds: JSON.stringify(getK8sClusterIdsFromCtxId(selectedK8sContexts, k8sconfig)), - }); - if (isError) { - if (isError) { - notify({ - message: 'Error fetching MeshSync Resources', - event_type: EVENT_TYPES.ERROR, - details: meshSyncError?.data, - }); - } - } - const { data: allKinds } = useGetMeshSyncResourceKindsQuery({ - page: page, - pagesize: 'all', - search: search, - order: sortOrder, - clusterIds: JSON.stringify(getK8sClusterIdsFromCtxId(selectedK8sContexts, k8sconfig)), - }); - const availableKinds = allKinds?.kinds || []; - - const meshSyncResources = meshSyncData?.resources || []; - - let colViews = [ - ['metadata.name', 'xs'], - ['apiVersion', 'xs'], - ['kind', 'm'], - ['cluster_id', 'na'], - ['pattern_resources', 'na'], - ['metadata.creationTimestamp', 'l'], - ['status', 'xs'], - ['metadata', 'na'], - ]; - - const columns = [ - { - name: 'metadata.name', - label: 'Name', - options: { - customHeadRender: function CustomHead({ ...column }) { - return ; - }, - customBodyRender: (value) => { - const maxCharLength = 30; - const shouldTruncate = value?.length > maxCharLength; - - return ( - -
- {shouldTruncate ? `${value.slice(0, maxCharLength)}...` : value} -
-
- ); - }, - }, - }, - { - name: 'apiVersion', - label: 'API version', - options: { - sort: true, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - }, - }, - { - name: 'kind', - label: 'Kind', - options: { - sort: true, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - }, - }, - { - name: 'cluster_id', - label: 'Cluster ID', - options: { - sort: true, - sortThirdClickReset: true, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - customBodyRender: (value) => , - }, - }, - { - name: 'pattern_resources', - label: 'Pattern resources', - options: { - sort: true, - sortThirdClickReset: true, - display: false, - customHeadRender: function CustomHead({ index, ...column }, sortColumn, columnMeta) { - return ( - sortColumn(index)} - /> - ); - }, - customBodyRender: (value) => { - const maxCharLength = 30; - const shouldTruncate = value?.length > maxCharLength; - - return ( - -
- {shouldTruncate ? `${value.slice(0, maxCharLength)}...` : value} -
-
- ); - }, - }, - }, - { - name: 'metadata.creationTimestamp', - label: 'Discovered At', - options: { - customHeadRender: function CustomHead({ ...column }) { - return ; - }, - customBodyRender: function CustomBody(value) { - return ( - - {value} - - } - placement="top" - arrow - interactive - > - {value} - - ); - }, - }, - }, - { - name: 'status', - label: 'Status', - options: { - sort: false, - customHeadRender: function CustomHead({ ...column }) { - return ; - }, - customBodyRender: function CustomBody(value, tableMeta) { - const componentMetadata = getColumnValue( - tableMeta.rowData, - 'component_metadata', - columns, - ); - const DISCOVERED = { - DISCOVERED: MESHSYNC_STATES.DISCOVERED, - }; - const meshSyncStates = - componentMetadata?.capabilities?.connection === true ? MESHSYNC_STATES : DISCOVERED; - const disabled = - componentMetadata?.capabilities?.connection === true && - value !== CONNECTION_STATES.REGISTERED - ? false - : true; - return ( - <> - - - - - ); - }, - }, - }, - { - name: 'component_metadata', - label: 'Component Metadata', - options: { - display: false, - }, - }, - { - name: 'id', - label: 'Resource ID', - options: { - display: false, - }, - }, - { - name: 'metadata', - label: 'Metadata', - options: { - display: false, - }, - }, - ]; - - const options = { - filter: false, - viewColumns: false, - search: false, - responsive: 'standard', - // resizableColumns: true, - serverSide: true, - selectableRows: 'none', - count: meshSyncData?.total_count, - rowsPerPage: pageSize, - fixedHeader: true, - page, - print: false, - download: false, - textLabels: { - selectedRows: { - text: 'connection(s) selected', - }, - }, - // customToolbarSelect: (selected) => ( - // - // ), - enableNestedDataAccess: '.', - onTableChange: (action, tableState) => { - const sortInfo = tableState.announceText ? tableState.announceText.split(' : ') : []; - let order = ''; - const columnName = camelcaseToSnakecase(columns[tableState.activeColumn]?.name); - if (tableState.activeColumn) { - order = `${columnName} desc`; - } - switch (action) { - case 'changePage': - setPage(tableState.page.toString()); - break; - case 'changeRowsPerPage': - setPageSize(tableState.rowsPerPage.toString()); - break; - case 'sort': - if (sortInfo.length == 2) { - if (sortInfo[1] === 'ascending') { - order = `${columnName} asc`; - } else { - order = `${columnName} desc`; - } - } - if (order !== sortOrder) { - setSortOrder(order); - } - break; - } - }, - expandableRows: true, - expandableRowsHeader: false, - expandableRowsOnClick: true, - rowsExpanded: rowsExpanded, - isRowExpandable: () => { - return true; - }, - onRowExpansionChange: (_, allRowsExpanded) => { - setRowsExpanded(allRowsExpanded.slice(-1).map((item) => item.index)); - // setShowMore(false); - }, - renderExpandableRow: (rowData) => { - const colSpan = rowData.length; - const columnName = 'metadata'; // Name of the column containing the metadata - const columnIndex = columns.findIndex((column) => column.name === columnName); - - // Access the metadata value using the column index - const metadata = rowData[columnIndex]; - - return ( - - - - - - - - - - - - - - - - -
-
-
- ); - }, - }; - - const handleError = (action) => (error) => { - updateProgress({ showProgress: false }); - notify({ - message: `${action.error_msg}: ${error}`, - event_type: EVENT_TYPES.ERROR, - details: error.toString(), - }); - }; - - useEffect(() => { - if (meshSyncError) { - handleError(ACTION_TYPES.FETCH_MESHSYNC_RESOURCES)(meshSyncError); - } - }, [meshSyncError]); - - const filters = { - kind: { - name: 'Kind', - options: [ - ...availableKinds.map((kind) => ({ - value: kind, - label: kind, - })), - ], - }, - }; - - const handleApplyFilter = () => { - const columnName = Object.keys(selectedFilters)[0]; - const columnValue = selectedFilters[columnName]; - - // Check if the selected value is "All" - const newSelectedKind = columnValue === 'All' ? '' : columnValue; - setSelectedKind(newSelectedKind); - }; - - const [tableCols, updateCols] = useState(columns); - - const [columnVisibility, setColumnVisibility] = useState(() => { - let showCols = updateVisibleColumns(colViews, width); - // Initialize column visibility based on the original columns' visibility - const initialVisibility = {}; - columns.forEach((col) => { - initialVisibility[col.name] = showCols[col.name]; - }); - return initialVisibility; - }); - - useEffect(() => { - updateCols(columns); - }, []); - - return ( - <> -
-
{/* */}
- -
- { - setSearch(value); - }} - expanded={isSearchExpanded} - setExpanded={setIsSearchExpanded} - placeholder="Search Connections..." - /> - - - - -
-
-
- - - - - - ); -} diff --git a/ui/components/connections/metadata.js b/ui/components/connections/metadata.js deleted file mode 100644 index f9a7a005f67..00000000000 --- a/ui/components/connections/metadata.js +++ /dev/null @@ -1,377 +0,0 @@ -import React from 'react'; -import { Grid, List, ListItem, ListItemText, Box } from '@material-ui/core'; -import { makeStyles } from '@material-ui/core/styles'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { updateProgress } from '../../lib/store'; - -import { - FormatId, - FormatStructuredData, - FormattedDate, - KeyValue, - Link, - createColumnUiSchema, -} from '../DataFormatter'; -import useKubernetesHook, { - useControllerStatus, - useMesheryOperator, - useMeshsSyncController, - useNatsController, -} from '../hooks/useKubernetesHook'; -import { TootltipWrappedConnectionChip } from './ConnectionChip'; -import { CONTROLLER_STATES } from '../../utils/Enum'; -import { formatToTitleCase } from '../../utils/utils'; - -const DISABLED = 'DISABLED'; -const KUBERNETES = 'kubernetes'; -const MESHERY = 'meshery'; - -const useKubernetesStyles = makeStyles((theme) => ({ - root: { - textTransform: 'none', - }, - operationButton: { - [theme?.breakpoints?.down(1180)]: { - marginRight: '25px', - }, - }, - icon: { width: theme.spacing(2.5) }, - operatorIcon: { width: theme.spacing(2.5), filter: theme.palette.secondary.brightness }, - column: { - margin: theme.spacing(2), - padding: theme.spacing(2), - background: `${theme.palette.secondary.default}10`, - }, - heading: { textAlign: 'center' }, - configBoxContainer: { - [theme?.breakpoints?.down(1050)]: { - flexGrow: 0, - maxWidth: '100%', - flexBasis: '100%', - }, - [theme?.breakpoints?.down(1050)]: { - flexDirection: 'column', - }, - }, - clusterConfiguratorWrapper: { padding: theme.spacing(5), display: 'flex' }, - contentContainer: { - [theme?.breakpoints?.down(1050)]: { - flexDirection: 'column', - }, - flexWrap: 'noWrap', - }, - fileInputStyle: { display: 'none' }, - topToolbar: { - margin: '1rem 0', - paddingLeft: '1rem', - maxWidth: '90%', - }, - button: { - padding: theme.spacing(1), - borderRadius: 5, - }, - grey: { - background: 'WhiteSmoke', - padding: theme.spacing(2), - borderRadius: 'inherit', - }, - subtitle: { - minWidth: 400, - overflowWrap: 'anywhere', - textAlign: 'left', - padding: '5px', - }, - text: { - width: '80%', - wordWrap: 'break-word', - }, - table: { - marginTop: theme.spacing(1.5), - }, - uploadCluster: { - overflow: 'hidden', - }, - OperatorSwitch: { - pointerEvents: 'auto', - }, -})); - -const customIdFormatter = (title, id) => } />; -const customDateFormatter = (title, date) => ( - } /> -); - -const DefaultPropertyFormatters = { - id: (value) => customIdFormatter('Id', value), - uid: (value) => customIdFormatter('Uid', value), - server_id: (value) => customIdFormatter('Server Id', value), - created_at: (value) => customDateFormatter('Created At', value), - updated_at: (value) => customDateFormatter('Updated At', value), - creation_timestamp: (value) => customDateFormatter('Creation Timestamp', value), - creationTimestamp: (value) => customDateFormatter('Creation Timestamp', value), - last_seen: (value) => customDateFormatter('Last Seen', value), - last_reconciled: (value) => customDateFormatter('Last Reconciled', value), - last_applied: (value) => customDateFormatter('Last Applied', value), - last_updated: (value) => customDateFormatter('Last Updated', value), -}; - -const KubernetesMetadataFormatter = ({ meshsyncControllerState, connection, metadata }) => { - const classes = useKubernetesStyles(); - - const pingKubernetes = useKubernetesHook(); - const { ping: pingMesheryOperator } = useMesheryOperator(); - const { ping: pingMeshSync } = useMeshsSyncController(); - const { ping: pingNats } = useNatsController(); - const { getControllerStatesByConnectionID } = useControllerStatus(meshsyncControllerState); - - const handleKubernetesClick = () => { - pingKubernetes(metadata.name, metadata.server, connection.id); - }; - - const handleNATSClick = () => { - pingNats({ connectionID: connection.id }); - }; - - const handleOperatorClick = () => { - pingMesheryOperator({ connectionID: connection.id }); - }; - - const handleMeshSyncClick = () => { - pingMeshSync({ connectionID: connection.id }); - }; - - const { operatorState, meshSyncState, natsState, operatorVersion, meshSyncVersion, natsVersion } = - getControllerStatesByConnectionID(connection.id); - - return ( - - -
- - - - - handleKubernetesClick(connection.id)} - /> - - - - - - - - - - - - - - - - - - - } - /> - - - } - /> - - - - - - - {metadata.server}} - /> - - - - -
-
- -
- - - - - - - - - - {(meshSyncState || natsState) && ( - <> - - - - - - - - - - - handleNATSClick()} - iconSrc="/static/img/nats-icon-color.svg" - /> - - - - - )} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- ); -}; - -const MesheryMetadataFormatter = ({ connection }) => { - const metadata = connection.metadata || {}; - const uiSchema = createColumnUiSchema({ - metadata, - numCols: { - xs: 2, - md: 4, - }, - }); - - return ( - - ); -}; - -export const MeshSyncDataFormatter = ({ metadata }) => { - const uiSchema = createColumnUiSchema({ - metadata, - numCols: { - xs: 3, - md: 5, - }, - }); - - return ( - - ); -}; - -const FormatConnectionMetadata = (props) => { - const { connection, meshsyncControllerState } = props; - const formatterByKind = { - [KUBERNETES]: () => ( - - ), - [MESHERY]: () => , - default: () => ( - - ), - }; - const formatter = formatterByKind[connection.kind] || formatterByKind.default; - return ( - - {formatter()} - - ); -}; - -const mapDispatchToProps = (dispatch) => ({ - updateProgress: bindActionCreators(updateProgress, dispatch), -}); - -const mapStateToProps = () => ({}); - -export default connect(mapStateToProps, mapDispatchToProps)(FormatConnectionMetadata); diff --git a/ui/components/connections/styles.js b/ui/components/connections/styles.js deleted file mode 100644 index 5784ae09b5e..00000000000 --- a/ui/components/connections/styles.js +++ /dev/null @@ -1,251 +0,0 @@ -import { alpha } from '@material-ui/core'; -import { Colors } from '../../themes/app'; -import { CONNECTION_STATES } from '../../utils/Enum'; -import { notificationColors } from '../../themes'; - -const styles = (theme) => ({ - grid: { padding: theme.spacing(2) }, - tableHeader: { - fontWeight: 'bolder', - fontSize: 18, - }, - muiRow: { - '& .MuiTableCell-root': { - // textTransform: 'capitalize', - }, - }, - statusSelect: { - '& .MuiSelect-select.MuiSelect-select': { - padding: '0', - }, - }, - createButton: { - display: 'flex', - justifyContent: 'flex-start', - alignItems: 'center', - whiteSpace: 'nowrap', - }, - viewSwitchButton: { - justifySelf: 'flex-end', - marginLeft: 'auto', - paddingLeft: '1rem', - }, - chipFormControl: { - minWidth: '100%', - '& .MuiSelect-icon': { - marginRight: '10px !important', - }, - }, - statusChip: { - minWidth: '145px !important', - width: '100% !important', - display: 'flex !important', - justifyContent: 'flex-start !important', - textTransform: 'capitalize', - borderRadius: '0 !important', - padding: '6px 8px', - '& .MuiChip-label': { - paddingTop: '3px', - fontWeight: '400', - }, - '&:hover': { - boxShadow: '0px 1px 2px 0px rgba(0, 0, 0, 0.25)', - cursor: 'pointer', - }, - }, - appBar: { - marginBottom: '3rem', - }, - capitalize: { - // textTransform: 'capitalize', - }, - lowecase: { - textTransform: 'lowecase', - }, - expandedRows: { - background: `${theme.palette.secondary.default}10`, - }, - contentContainer: { - [theme.breakpoints.down(1050)]: { - flexDirection: 'column', - }, - flexWrap: 'noWrap', - }, - innerTableWrapper: { - background: `linear-gradient(90deg, ${theme.palette.secondary.innertableBg1} 0.04%, ${theme.palette.secondary.innertableBg2} 100.04%)`, - borderRadius: 0, - padding: '0', - }, - innerTableContainer: { - background: theme.palette.secondary.innertableBg1, - margin: '10px 10px 10px 13px', - borderLeft: `9px solid ${theme.palette.secondary.pinball}`, - borderRadius: '10px 0 0 10px', - width: 'calc(100% - 23px)', - border: 'none', - overflowX: 'hidden', - }, - noGutter: { - padding: '0', - }, - showMore: { - color: Colors.keppelGreen, - cursor: 'pointer', - }, - bulkAction: { - display: 'flex', - justifyContent: 'flex-end', - width: '100%', - }, - centerContent: { - display: 'flex', - justifyContent: 'center', - }, - tab: { - minWidth: 40, - paddingLeft: 0, - paddingRight: 0, - '&.Mui-selected': { - color: theme.palette.type === 'dark' ? '#00B39F' : theme.palette.primary, - }, - }, - tabs: { - height: '55px', - '& .MuiTabs-indicator': { - backgroundColor: theme.palette.type === 'dark' ? '#00B39F' : theme.palette.primary, - }, - }, - iconText: { - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - }, - list: { - display: 'flex', - flexDirection: 'column', - gridGap: '0.5rem', - marginBlock: '0.5rem', - borderRadius: '0.25rem', - backgroundColor: theme.palette.secondary.honeyComb, - }, - listButton: { - '&:hover': { - backgroundColor: alpha(theme.palette.secondary.link2, 0.25), - }, - }, - listItem: { - display: 'flex', - gridGap: '0.5rem', - alignItems: 'center', - justifyContent: 'space-around', - }, - button: { - width: '100%', - justifyContent: 'flex-start', - '&:hover': { - backgroundColor: 'transparent', - }, - }, - listContainer: { - width: '100%', - justifyContent: 'flex-start', - display: 'flex', - alignItems: 'center', - }, - - /** Connection status select colors according to the status */ - ignored: { - '& .MuiChip-label': { - color: `${theme.palette.secondary.default}`, - }, - background: `${theme.palette.secondary.default}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.default} !important`, - }, - }, - connected: { - '& .MuiChip-label': { - color: theme.palette.secondary.success, - }, - background: `${theme.palette.secondary.success}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.success} !important`, - }, - }, - registered: { - '& .MuiChip-label': { - color: theme.palette.secondary.primary, - }, - background: `${theme.palette.secondary.primary}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.primary} !important`, - }, - }, - register: { - '& .MuiChip-label': { - color: theme.palette.secondary.primary, - }, - background: `${theme.palette.secondary.primary}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.primary} !important`, - }, - }, - discovered: { - '& .MuiChip-label': { - color: notificationColors.info, - }, - background: `${notificationColors.info}30 !important`, - '& .MuiSvgIcon-root': { - color: `${notificationColors.info} !important`, - }, - }, - deleted: { - '& .MuiChip-label': { - color: theme.palette.secondary.error, - }, - background: `${theme.palette.secondary.lightError}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.error} !important`, - }, - }, - maintenance: { - '& .MuiChip-label': { - color: theme.palette.secondary.warning, - }, - background: `${theme.palette.secondary.warning}30 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.warning} !important`, - }, - }, - disconnected: { - '& .MuiChip-label': { - color: notificationColors.lightwarning, - }, - background: `${notificationColors.lightwarning}30 !important`, - '& .MuiSvgIcon-root': { - color: `${notificationColors.lightwarning} !important`, - }, - }, - notfound: { - '& .MuiChip-label': { - color: theme.palette.secondary.text, - }, - background: `${theme.palette.secondary.disableButtonBg}60 !important`, - '& .MuiSvgIcon-root': { - color: `${theme.palette.secondary.iconMain} !important`, - }, - }, -}); - -export default styles; - -export const CONNECTION_STATE_COLORS = { - [CONNECTION_STATES.CONNECTED]: '#00B39F', - [CONNECTION_STATES.REGISTERED]: '#00B39F', - [CONNECTION_STATES.DISCOVERED]: '#FFC107', - [CONNECTION_STATES.IGNORED]: '#FFC107', - [CONNECTION_STATES.DELETED]: '#FF1744', - [CONNECTION_STATES.MAINTENANCE]: '#FFC107', - [CONNECTION_STATES.DISCONNECTED]: '#FFC107', - [CONNECTION_STATES.NOTFOUND]: '#FFC107', -}; diff --git a/ui/components/extensions/adapters/adapters.js b/ui/components/extensions/adapters/adapters.js deleted file mode 100644 index 48845b5936c..00000000000 --- a/ui/components/extensions/adapters/adapters.js +++ /dev/null @@ -1,183 +0,0 @@ -import { isNil, isUndefined } from 'lodash'; -import { useEffect, useState } from 'react'; -import { withRouter } from 'next/router'; -import { extensionStyles as styles } from '../../../css/icons.styles'; -import { Grid, Typography, Switch } from '@material-ui/core'; -import { withStyles } from '@material-ui/core/styles'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { updateProgress } from '../../../lib/store'; -import { ADAPTER_STATUS, adaptersList } from './constants'; -import changeAdapterState from '../../graphql/mutations/AdapterStatusMutation'; -import { LARGE_6_MED_12_GRID_STYLE } from '../../../css/grid.style'; -import { promisifiedDataFetch } from '../../../lib/data-fetch'; -import { useNotification } from '../../../utils/hooks/useNotification'; -import { EVENT_TYPES } from '../../../lib/event-types'; - -const Adapters = ({ updateProgress, classes }) => { - // States. - const [availableAdapters, setAvailableAdapters] = useState(adaptersList); - - // Hooks. - const { notify } = useNotification(); - - // useEffects. - useEffect(() => { - handleAdapterSync(); - }, []); - - // Handlers. - const handleAdapterSync = async (showLoader = true) => { - showLoader && updateProgress({ showProgress: true }); - - promisifiedDataFetch('/api/system/sync', { - method: 'GET', - credentials: 'include', - }) - .then((result) => { - showLoader && updateProgress({ showProgress: false }); - - if (!isUndefined(result)) { - // Deep copying to avoid mutability. - // Ref: https://developer.mozilla.org/en-US/docs/Web/API/structuredClone - let currentAdaptersList = structuredClone(adaptersList); - - result.meshAdapters.forEach((element) => { - const adapterId = element.name; - if (adapterId && currentAdaptersList[adapterId]) { - currentAdaptersList[adapterId].enabled = true; - currentAdaptersList[adapterId].url = element.adapter_location; - } - }); - setAvailableAdapters(currentAdaptersList); - } - }) - .catch(() => handleError('Unable to fetch list of adapters.')); - }; - - const handleAdapterDeployment = (payload, msg, selectedAdapter, adapterId) => { - updateProgress({ showProgress: true }); - - changeAdapterState((response, errors) => { - updateProgress({ showProgress: false }); - - if (!isNil(errors)) { - // Toggle the switch to its previous state if the request fails. - setAvailableAdapters({ - ...availableAdapters, - [adapterId]: { ...selectedAdapter, enabled: !selectedAdapter.enabled }, - }); - handleError(msg); - } else { - const actionText = payload.status.toLowerCase(); - notify({ - message: `${selectedAdapter.name} adapter ${actionText}`, - event_type: EVENT_TYPES.SUCCESS, - }); - } - }, payload); - }; - - const handleError = (msg) => (error) => { - updateProgress({ showProgress: false }); - notify({ message: msg, event_type: EVENT_TYPES.ERROR, details: error.toString() }); - }; - - const handleToggle = (selectedAdapter, adapterId) => { - setAvailableAdapters({ - ...availableAdapters, - [adapterId]: { ...selectedAdapter, enabled: !selectedAdapter.enabled }, - }); - let payload = {}, - msg = ''; - if (!selectedAdapter.enabled) { - payload = { - status: ADAPTER_STATUS.ENABLED, - adapter: selectedAdapter.label, - targetPort: selectedAdapter.defaultPort, - }; - msg = 'Unable to deploy adapter'; - } else { - payload = { - status: ADAPTER_STATUS.DISABLED, - adapter: selectedAdapter.label, - targetPort: selectedAdapter.defaultPort, - }; - msg = 'Unable to undeploy adapter'; - } - handleAdapterDeployment(payload, msg, selectedAdapter, adapterId); - }; - - // Render. - return ( - <> - {Object.entries(availableAdapters).map(([adapterId, adapter]) => ( - -
- - Meshery Adapter for {adapter.name} - - - - -
- {adapter.description} -
-
- - - - - Open Adapter docs - - - -
- handleToggle(adapter, adapterId)} - name="OperatorSwitch" - color="primary" - classes={{ - switchBase: classes.switchBase, - track: classes.track, - checked: classes.checked, - }} - /> -
-
-
-
- ))} - - ); -}; - -const mapDispatchToProps = (dispatch) => ({ - updateProgress: bindActionCreators(updateProgress, dispatch), -}); - -export default withStyles(styles)(connect(() => {}, mapDispatchToProps)(withRouter(Adapters))); diff --git a/ui/components/extensions/adapters/constants.js b/ui/components/extensions/adapters/constants.js deleted file mode 100644 index a4c6917aeb3..00000000000 --- a/ui/components/extensions/adapters/constants.js +++ /dev/null @@ -1,116 +0,0 @@ -const adaptersDescription = (adapterName) => { - return `Deploy the Meshery Adapter for ${adapterName} in order to enable deeper lifecycle management of ${adapterName}.`; -}; - -/* - * adaptersList.name -> name of the adapter to display on the card. - * adaptersList.label -> used as a payload for adapter deployment (like an adapterId). - */ -export const adaptersList = { - ISTIO: { - name: 'Istio', - label: 'meshery-istio', - imageSrc: '/static/img/istio.svg', - description: adaptersDescription('Istio'), - defaultPort: 10000, - enabled: false, - url: '', - }, - LINKERD: { - name: 'Linkerd', - label: 'meshery-linkerd', - imageSrc: '/static/img/linkerd.svg', - description: adaptersDescription('Linkerd'), - defaultPort: 10001, - enabled: false, - url: '', - }, - CONSUL: { - name: 'Consul', - label: 'meshery-consul', - imageSrc: '/static/img/consul.svg', - description: adaptersDescription('Consul'), - defaultPort: 10002, - enabled: false, - url: '', - }, - NETWORK_SERVICE_MESH: { - name: 'Network Service Mesh', - label: 'meshery-nsm', - imageSrc: '/static/img/networkservicemesh.svg', - description: adaptersDescription('Network Service Mesh'), - defaultPort: 10004, - enabled: false, - url: '', - }, - APP_MESH: { - name: 'App Mesh', - label: 'meshery-app-mesh', - imageSrc: '/static/img/app_mesh.svg', - description: adaptersDescription('App Mesh'), - defaultPort: 10005, - enabled: false, - url: '', - }, - TRAEFIK_MESH: { - name: 'Traefik Mesh', - label: 'meshery-traefik-mesh', - imageSrc: '/static/img/traefik_mesh.svg', - description: adaptersDescription('Traefik Mesh'), - defaultPort: 10006, - enabled: false, - url: '', - }, - KUMA: { - name: 'Kuma', - label: 'meshery-kuma', - imageSrc: '/static/img/kuma.svg', - description: adaptersDescription('Kuma'), - defaultPort: 10007, - enabled: false, - url: '', - }, - // TODO: Need to add icon for this. - // "meshery-cpx": { - // name: "Meshery Cpx", - // label: "meshery-cpx", - // imageSrc: "/static/img/", - // description: adaptersDescription("Meshery CPX"), - // defaultPort: 10008, - // enabled: false, - // url: "", - // }, - - NGINX_SERVICE_MESH: { - name: 'NGINX Service Mesh', - label: 'meshery-nginx-sm', - imageSrc: '/static/img/nginx.svg', - description: adaptersDescription('NGINX Service Mesh'), - defaultPort: 10010, - enabled: false, - url: '', - }, - CILIUM_SERVICE_MESH: { - name: 'Cilium Service Mesh', - label: 'meshery-cilium', - imageSrc: '/static/img/cilium_service_mesh.svg', - description: adaptersDescription('Cilium Service Mesh'), - defaultPort: 10012, - enabled: false, - url: '', - }, - NIGHTHAWK: { - name: 'Nighthawk', - label: 'meshery-nighthawk', - imageSrc: '/static/img/nighthawk-logo.svg', - description: adaptersDescription('Performance Characterization by Meshery Nighthawk'), - defaultPort: 10013, - enabled: false, - url: '', - }, -}; - -export const ADAPTER_STATUS = { - ENABLED: 'ENABLED', - DISABLED: 'DISABLED', -}; diff --git a/ui/components/extensions/adapters/index.js b/ui/components/extensions/adapters/index.js deleted file mode 100644 index 64b02a16272..00000000000 --- a/ui/components/extensions/adapters/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as Adapters } from './adapters'; diff --git a/ui/components/extensions/index.js b/ui/components/extensions/index.js deleted file mode 100644 index d8623c33dea..00000000000 --- a/ui/components/extensions/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from './adapters'; diff --git a/ui/components/graphql/mutations/AdapterStatusMutation.js b/ui/components/graphql/mutations/AdapterStatusMutation.js deleted file mode 100644 index cc6f3ef274a..00000000000 --- a/ui/components/graphql/mutations/AdapterStatusMutation.js +++ /dev/null @@ -1,26 +0,0 @@ -import { graphql, commitMutation } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function changeAdapterState(onComplete, variables) { - const environment = createRelayEnvironment({}); - const vars = { - input: { - targetStatus: variables.status, - targetPort: variables.targetPort, - adapter: variables.adapter, - }, - }; - - const adapterStatusMutation = graphql` - mutation AdapterStatusMutation($input: AdapterStatusInput) { - adapterStatus: changeAdapterStatus(input: $input) - } - `; - - commitMutation(environment, { - mutation: adapterStatusMutation, - variables: vars, - onCompleted: onComplete, - onError: (error) => console.log(`An error occured:`, error), - }); -} diff --git a/ui/components/graphql/mutations/OperatorStatusMutation.js b/ui/components/graphql/mutations/OperatorStatusMutation.js deleted file mode 100644 index d1617783cad..00000000000 --- a/ui/components/graphql/mutations/OperatorStatusMutation.js +++ /dev/null @@ -1,20 +0,0 @@ -import { graphql, commitMutation } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function changeOperatorState(onComplete, variables) { - const environment = createRelayEnvironment({}); - const vars = { input: { targetStatus: variables.status, contextID: variables.contextID } }; - - const operatorStatusMutation = graphql` - mutation OperatorStatusMutation($input: OperatorStatusInput) { - operatorStatus: changeOperatorStatus(input: $input) - } - `; - - commitMutation(environment, { - mutation: operatorStatusMutation, - variables: vars, - onCompleted: onComplete, - onError: (error) => console.log(`An error occured:`, error), - }); -} diff --git a/ui/components/graphql/mutations/__generated__/AdapterStatusMutation.graphql.js b/ui/components/graphql/mutations/__generated__/AdapterStatusMutation.graphql.js deleted file mode 100644 index d73ea8ad07c..00000000000 --- a/ui/components/graphql/mutations/__generated__/AdapterStatusMutation.graphql.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "input" - } -], -v1 = [ - { - "alias": "adapterStatus", - "args": [ - { - "kind": "Variable", - "name": "input", - "variableName": "input" - } - ], - "kind": "ScalarField", - "name": "changeAdapterStatus", - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "AdapterStatusMutation", - "selections": (v1/*: any*/), - "type": "Mutation", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "AdapterStatusMutation", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "910bac5b935be9f44edf2e0b45186c89", - "id": null, - "metadata": {}, - "name": "AdapterStatusMutation", - "operationKind": "mutation", - "text": "mutation AdapterStatusMutation(\n $input: AdapterStatusInput\n) {\n adapterStatus: changeAdapterStatus(input: $input)\n}\n" - } -}; -})(); - -node.hash = "3d97311fb835925f575991945093af8e"; - -module.exports = node; diff --git a/ui/components/graphql/mutations/__generated__/AddonStatusMutation.graphql.js b/ui/components/graphql/mutations/__generated__/AddonStatusMutation.graphql.js deleted file mode 100644 index c7279e9a503..00000000000 --- a/ui/components/graphql/mutations/__generated__/AddonStatusMutation.graphql.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * @flow - */ - -/* eslint-disable */ - -'use strict'; - -import type { ConcreteRequest } from 'relay-runtime'; -export type MeshType = - | 'ALL_MESH' - | 'APP_MESH' - | 'CITRIX_SERVICE_MESH' - | 'CONSUL' - | 'INVALID_MESH' - | 'ISTIO' - | 'KUMA' - | 'LINKERD' - | 'NETWORK_SERVICE_MESH' - | 'NGINX_SERVICE_MESH' - | 'OCTARINE' - | 'OPEN_SERVICE_MESH' - | 'TANZU' - | 'TRAEFIK_MESH' - | '%future added value'; -export type Status = - | 'CONNECTED' - | 'DISABLED' - | 'ENABLED' - | 'PROCESSING' - | 'UNKNOWN' - | '%future added value'; -export type AddonStatusInput = {| - selector?: ?MeshType, - targetStatus: Status, -|}; -export type AddonStatusMutationVariables = {| - input?: ?AddonStatusInput, -|}; -export type AddonStatusMutationResponse = {| - +addonstate: Status, -|}; -export type AddonStatusMutation = {| - variables: AddonStatusMutationVariables, - response: AddonStatusMutationResponse, -|}; -/* -mutation AddonStatusMutation( - $input: AddonStatusInput -) { - addonstate: changeAddonStatus(input: $input) -} -*/ - -const node: ConcreteRequest = (function () { - var v0 = [ - { - defaultValue: null, - kind: 'LocalArgument', - name: 'input', - }, - ], - v1 = [ - { - alias: 'addonstate', - args: [ - { - kind: 'Variable', - name: 'input', - variableName: 'input', - }, - ], - kind: 'ScalarField', - name: 'changeAddonStatus', - storageKey: null, - }, - ]; - return { - fragment: { - argumentDefinitions: (v0: any), - kind: 'Fragment', - metadata: null, - name: 'AddonStatusMutation', - selections: (v1: any), - type: 'Mutation', - abstractKey: null, - }, - kind: 'Request', - operation: { - argumentDefinitions: (v0: any), - kind: 'Operation', - name: 'AddonStatusMutation', - selections: (v1: any), - }, - params: { - cacheID: '4f11c7d338b4a51b255fae5554424d74', - id: null, - metadata: {}, - name: 'AddonStatusMutation', - operationKind: 'mutation', - text: 'mutation AddonStatusMutation(\n $input: AddonStatusInput\n) {\n addonstate: changeAddonStatus(input: $input)\n}\n', - }, - }; -})(); -// prettier-ignore -(node/*: any*/).hash = 'eaed3737aff98e45fc02f51c97601092'; - -module.exports = node; diff --git a/ui/components/graphql/mutations/__generated__/OperatorStatusMutation.graphql.js b/ui/components/graphql/mutations/__generated__/OperatorStatusMutation.graphql.js deleted file mode 100644 index f2b279f42cc..00000000000 --- a/ui/components/graphql/mutations/__generated__/OperatorStatusMutation.graphql.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "input" - } -], -v1 = [ - { - "alias": "operatorStatus", - "args": [ - { - "kind": "Variable", - "name": "input", - "variableName": "input" - } - ], - "kind": "ScalarField", - "name": "changeOperatorStatus", - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "OperatorStatusMutation", - "selections": (v1/*: any*/), - "type": "Mutation", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "OperatorStatusMutation", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "86d68e3b96cd8684338daf88a6f49ab5", - "id": null, - "metadata": {}, - "name": "OperatorStatusMutation", - "operationKind": "mutation", - "text": "mutation OperatorStatusMutation(\n $input: OperatorStatusInput\n) {\n operatorStatus: changeOperatorStatus(input: $input)\n}\n" - } -}; -})(); - -node.hash = "fc306fe156aa1a0f9984281666bd7693"; - -module.exports = node; diff --git a/ui/components/graphql/queries/AddonsStatusQuery.js b/ui/components/graphql/queries/AddonsStatusQuery.js deleted file mode 100644 index de75c119504..00000000000 --- a/ui/components/graphql/queries/AddonsStatusQuery.js +++ /dev/null @@ -1,17 +0,0 @@ -import { fetchQuery, graphql } from 'relay-runtime'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchAvailableAddons(variables) { - const environment = createRelayEnvironment({}); - const vars = { filter: variables }; - - const AddonsStatusQueryNode = graphql` - query AddonsStatusQuery($filter: ServiceMeshFilter) { - addonsState: getAvailableAddons(filter: $filter) { - name - owner - } - } - `; - return fetchQuery(environment, AddonsStatusQueryNode, vars); -} diff --git a/ui/components/graphql/queries/CatalogFilterQuery.js b/ui/components/graphql/queries/CatalogFilterQuery.js deleted file mode 100644 index 5e6a401f006..00000000000 --- a/ui/components/graphql/queries/CatalogFilterQuery.js +++ /dev/null @@ -1,24 +0,0 @@ -import { fetchQuery, graphql } from 'relay-runtime'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchCatalogFilter(variables) { - const environment = createRelayEnvironment({}); - - const CatalogFilterQueryNode = graphql` - query CatalogFilterQuery($selector: CatalogSelector!) { - catalogFilters: fetchFilterCatalogContent(selector: $selector) { - id - name - user_id - filter_file - filter_resource - visibility - catalog_data - created_at - updated_at - } - } - `; - - return fetchQuery(environment, CatalogFilterQueryNode, variables); -} diff --git a/ui/components/graphql/queries/CatalogPatternQuery.js b/ui/components/graphql/queries/CatalogPatternQuery.js deleted file mode 100644 index d33db6d87d9..00000000000 --- a/ui/components/graphql/queries/CatalogPatternQuery.js +++ /dev/null @@ -1,23 +0,0 @@ -import { fetchQuery, graphql } from 'relay-runtime'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchCatalogPattern(variables) { - const environment = createRelayEnvironment({}); - - const CatalogPatternQueryNode = graphql` - query CatalogPatternQuery($selector: CatalogSelector!) { - catalogPatterns: fetchPatternCatalogContent(selector: $selector) { - id - name - user_id - pattern_file - visibility - catalog_data - created_at - updated_at - } - } - `; - - return fetchQuery(environment, CatalogPatternQueryNode, variables); -} diff --git a/ui/components/graphql/queries/ControlPlanesQuery.js b/ui/components/graphql/queries/ControlPlanesQuery.js deleted file mode 100644 index f21e66cee5d..00000000000 --- a/ui/components/graphql/queries/ControlPlanesQuery.js +++ /dev/null @@ -1,23 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchControlPlanes(variables) { - const environment = createRelayEnvironment({}); - const vars = { filter: variables }; - - const ControlPlanesQueryNode = graphql` - query ControlPlanesQuery($filter: ServiceMeshFilter) { - controlPlanesState: getControlPlanes(filter: $filter) { - name - members { - name - version - component - namespace - } - } - } - `; - - return fetchQuery(environment, ControlPlanesQueryNode, vars); -} diff --git a/ui/components/graphql/queries/DataPlanesQuery.js b/ui/components/graphql/queries/DataPlanesQuery.js deleted file mode 100644 index 5efcd9a5470..00000000000 --- a/ui/components/graphql/queries/DataPlanesQuery.js +++ /dev/null @@ -1,41 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchDataPlanes(variables) { - const environment = createRelayEnvironment({}); - const vars = { - filter: variables, - }; - - const DataPlanesQueryNode = graphql` - query DataPlanesQuery($filter: ServiceMeshFilter) { - dataPlanesState: getDataPlanes(filter: $filter) { - name - proxies { - controlPlaneMemberName - containerName - image - status { - containerStatusName - image - state - lastState - ready - restartCount - started - imageID - containerID - } - ports { - name - containerPort - protocol - } - resources - } - } - } - `; - - return fetchQuery(environment, DataPlanesQueryNode, vars); -} diff --git a/ui/components/graphql/queries/FetchAllResultsQuery.js b/ui/components/graphql/queries/FetchAllResultsQuery.js deleted file mode 100644 index d9c0d3057a3..00000000000 --- a/ui/components/graphql/queries/FetchAllResultsQuery.js +++ /dev/null @@ -1,32 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchAllResults(variables) { - const environment = createRelayEnvironment({}); - const vars = { selector: variables.selector }; - - const FetchAllResultsQueryNode = graphql` - query FetchAllResultsQuery($selector: PageFilter!) { - fetchAllResults(selector: $selector) { - page - page_size - total_count - results { - meshery_id - name - mesh - performance_profile - test_id - server_metrics - test_start_time - created_at - user_id - updated_at - runner_results - } - } - } - `; - - return fetchQuery(environment, FetchAllResultsQueryNode, vars); -} diff --git a/ui/components/graphql/queries/MeshModelSummaryQuery.js b/ui/components/graphql/queries/MeshModelSummaryQuery.js deleted file mode 100644 index 8ea71107f46..00000000000 --- a/ui/components/graphql/queries/MeshModelSummaryQuery.js +++ /dev/null @@ -1,26 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -// not in use -export default function fetchMeshModelSummary(selector) { - const environment = createRelayEnvironment({}); - - const vars = { selector: selector }; - - const MeshModelSummaryQueryNode = graphql` - query MeshModelSummaryQuery($selector: MeshModelSummarySelector!) { - meshmodelSummary: getMeshModelSummary(selector: $selector) { - components { - name - count - } - relationships { - name - count - } - } - } - `; - - return fetchQuery(environment, MeshModelSummaryQueryNode, vars); -} diff --git a/ui/components/graphql/queries/MeshsyncStatusQuery.js b/ui/components/graphql/queries/MeshsyncStatusQuery.js deleted file mode 100644 index bef1a241d56..00000000000 --- a/ui/components/graphql/queries/MeshsyncStatusQuery.js +++ /dev/null @@ -1,18 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function MeshsyncStatusQuery(vars = { connectionID: vars.connectionID }) { - const environment = createRelayEnvironment({}); - - const MeshsyncStatusQueryNode = graphql` - query MeshsyncStatusQuery($connectionID: String!) { - controller: getMeshsyncStatus(connectionID: $connectionID) { - name - version - status - } - } - `; - - return fetchQuery(environment, MeshsyncStatusQueryNode, vars); -} diff --git a/ui/components/graphql/queries/NamespaceQuery.js b/ui/components/graphql/queries/NamespaceQuery.js deleted file mode 100644 index 31b2998708a..00000000000 --- a/ui/components/graphql/queries/NamespaceQuery.js +++ /dev/null @@ -1,16 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchAvailableNamespaces(vars) { - const environment = createRelayEnvironment({}); - - const NamespaceQueryNode = graphql` - query NamespaceQuery($k8sClusterIDs: [String!]) { - namespaces: getAvailableNamespaces(k8sClusterIDs: $k8sClusterIDs) { - namespace - } - } - `; - - return fetchQuery(environment, NamespaceQueryNode, vars); -} diff --git a/ui/components/graphql/queries/NatsStatusQuery.js b/ui/components/graphql/queries/NatsStatusQuery.js deleted file mode 100644 index 79963e985e0..00000000000 --- a/ui/components/graphql/queries/NatsStatusQuery.js +++ /dev/null @@ -1,18 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function NatsStatusQuery(vars) { - const environment = createRelayEnvironment({}); - - const NatsStatusQueryNode = graphql` - query NatsStatusQuery($connectionID: String!) { - controller: getNatsStatus(connectionID: $connectionID) { - name - version - status - } - } - `; - - return fetchQuery(environment, NatsStatusQueryNode, vars); -} diff --git a/ui/components/graphql/queries/OperatorStatusQuery.js b/ui/components/graphql/queries/OperatorStatusQuery.js deleted file mode 100644 index 47bb8cb1b36..00000000000 --- a/ui/components/graphql/queries/OperatorStatusQuery.js +++ /dev/null @@ -1,19 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchMesheryOperatorStatus(variables) { - const environment = createRelayEnvironment({}); - const vars = { connectionID: variables.connectionID }; - - const OperatorStatusQueryNode = graphql` - query OperatorStatusQuery($connectionID: String!) { - operator: getOperatorStatus(connectionID: $connectionID) { - status - controller - connectionID - } - } - `; - - return fetchQuery(environment, OperatorStatusQueryNode, vars); -} diff --git a/ui/components/graphql/queries/PerformanceProfilesQuery.js b/ui/components/graphql/queries/PerformanceProfilesQuery.js deleted file mode 100644 index 4f15f692f70..00000000000 --- a/ui/components/graphql/queries/PerformanceProfilesQuery.js +++ /dev/null @@ -1,39 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchPerformanceProfiles(variables) { - const environment = createRelayEnvironment({}); - const vars = { selector: variables.selector }; - - const PerformanceProfilesQueryNode = graphql` - query PerformanceProfilesQuery($selector: PageFilter!) { - getPerformanceProfiles(selector: $selector) { - page - page_size - total_count - profiles { - concurrent_request - created_at - duration - endpoints - id - last_run - load_generators - name - qps - total_results - updated_at - user_id - request_body - request_cookies - request_headers - content_type - service_mesh - metadata - } - } - } - `; - - return fetchQuery(environment, PerformanceProfilesQueryNode, vars); -} diff --git a/ui/components/graphql/queries/PerformanceResultQuery.js b/ui/components/graphql/queries/PerformanceResultQuery.js deleted file mode 100644 index a08f925b988..00000000000 --- a/ui/components/graphql/queries/PerformanceResultQuery.js +++ /dev/null @@ -1,32 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchPerformanceResults(variables) { - const environment = createRelayEnvironment({}); - const vars = { selector: variables.selector, profileID: variables.profileID }; - - const PerformanceResultQueryNode = graphql` - query PerformanceResultQuery($selector: PageFilter!, $profileID: String!) { - fetchResults(selector: $selector, profileID: $profileID) { - page - page_size - total_count - results { - meshery_id - name - mesh - performance_profile - test_id - server_metrics - test_start_time - created_at - user_id - updated_at - runner_results - } - } - } - `; - - return fetchQuery(environment, PerformanceResultQueryNode, vars); -} diff --git a/ui/components/graphql/queries/ResetDatabaseQuery.js b/ui/components/graphql/queries/ResetDatabaseQuery.js deleted file mode 100644 index 83a67a04cdb..00000000000 --- a/ui/components/graphql/queries/ResetDatabaseQuery.js +++ /dev/null @@ -1,15 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function resetDatabase(variables) { - const environment = createRelayEnvironment({}); - const vars = { selector: variables.selector, k8scontextID: variables.k8scontextID }; - - const ResetDatabaseQueryNode = graphql` - query ResetDatabaseQuery($selector: ReSyncActions!, $k8scontextID: String!) { - resetStatus: resyncCluster(selector: $selector, k8scontextID: $k8scontextID) - } - `; - - return fetchQuery(environment, ResetDatabaseQueryNode, vars); -} diff --git a/ui/components/graphql/queries/TelemetryComponentsQuery.js b/ui/components/graphql/queries/TelemetryComponentsQuery.js deleted file mode 100644 index a6502cd11f4..00000000000 --- a/ui/components/graphql/queries/TelemetryComponentsQuery.js +++ /dev/null @@ -1,17 +0,0 @@ -import { fetchQuery, graphql } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export default function fetchTelemetryCompsQuery(variables) { - const environment = createRelayEnvironment({}); - - const TelemetryComponentsQueryNode = graphql` - query TelemetryComponentsQuery($contexts: [String!]) { - telemetryComps: fetchTelemetryComponents(contexts: $contexts) { - name - spec - status - } - } - `; - return fetchQuery(environment, TelemetryComponentsQueryNode, variables); -} diff --git a/ui/components/graphql/queries/__generated__/AddonsStatusQuery.graphql.js b/ui/components/graphql/queries/__generated__/AddonsStatusQuery.graphql.js deleted file mode 100644 index a359d9096a4..00000000000 --- a/ui/components/graphql/queries/__generated__/AddonsStatusQuery.graphql.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @generated SignedSource<<1282ae0224439164af34f0d4fba4a71a>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "filter" - } -], -v1 = [ - { - "alias": "addonsState", - "args": [ - { - "kind": "Variable", - "name": "filter", - "variableName": "filter" - } - ], - "concreteType": "AddonList", - "kind": "LinkedField", - "name": "getAvailableAddons", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "owner", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "AddonsStatusQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "AddonsStatusQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "49f96950f100465ccdab36e9903b9281", - "id": null, - "metadata": {}, - "name": "AddonsStatusQuery", - "operationKind": "query", - "text": "query AddonsStatusQuery(\n $filter: ServiceMeshFilter\n) {\n addonsState: getAvailableAddons(filter: $filter) {\n name\n owner\n }\n}\n" - } -}; -})(); - -node.hash = "9cbf0a827a321dead7e3e6d0c2e9cbe7"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/CatalogFilterQuery.graphql.js b/ui/components/graphql/queries/__generated__/CatalogFilterQuery.graphql.js deleted file mode 100644 index 9da043c7fa4..00000000000 --- a/ui/components/graphql/queries/__generated__/CatalogFilterQuery.graphql.js +++ /dev/null @@ -1,131 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" - } -], -v1 = [ - { - "alias": "catalogFilters", - "args": [ - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "CatalogFilter", - "kind": "LinkedField", - "name": "fetchFilterCatalogContent", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "user_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "filter_file", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "filter_resource", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "visibility", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "catalog_data", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updated_at", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "CatalogFilterQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "CatalogFilterQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "2178c2622b2e672bcf288e1004c939a0", - "id": null, - "metadata": {}, - "name": "CatalogFilterQuery", - "operationKind": "query", - "text": "query CatalogFilterQuery(\n $selector: CatalogSelector!\n) {\n catalogFilters: fetchFilterCatalogContent(selector: $selector) {\n id\n name\n user_id\n filter_file\n filter_resource\n visibility\n catalog_data\n created_at\n updated_at\n }\n}\n" - } -}; -})(); - -node.hash = "391a34d0da3dfd429e7a8a335e07930b"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/CatalogPatternQuery.graphql.js b/ui/components/graphql/queries/__generated__/CatalogPatternQuery.graphql.js deleted file mode 100644 index 53cb69e7497..00000000000 --- a/ui/components/graphql/queries/__generated__/CatalogPatternQuery.graphql.js +++ /dev/null @@ -1,124 +0,0 @@ -/** - * @generated SignedSource<<250f6fec42f64cdf2df9bd2be3190563>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" - } -], -v1 = [ - { - "alias": "catalogPatterns", - "args": [ - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "CatalogPattern", - "kind": "LinkedField", - "name": "fetchPatternCatalogContent", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "user_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "pattern_file", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "visibility", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "catalog_data", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updated_at", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "CatalogPatternQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "CatalogPatternQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "5819e3c1959f0e6ce5329f2a222a499d", - "id": null, - "metadata": {}, - "name": "CatalogPatternQuery", - "operationKind": "query", - "text": "query CatalogPatternQuery(\n $selector: CatalogSelector!\n) {\n catalogPatterns: fetchPatternCatalogContent(selector: $selector) {\n id\n name\n user_id\n pattern_file\n visibility\n catalog_data\n created_at\n updated_at\n }\n}\n" - } -}; -})(); - -node.hash = "3662bdbf1b55f72dec9757315e54e8ab"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/ClusterResourcesQuery.graphql.js b/ui/components/graphql/queries/__generated__/ClusterResourcesQuery.graphql.js deleted file mode 100644 index dc2ef7ef748..00000000000 --- a/ui/components/graphql/queries/__generated__/ClusterResourcesQuery.graphql.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "k8scontextIDs" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "namespace" - } -], -v1 = [ - { - "alias": "clusterResources", - "args": [ - { - "kind": "Variable", - "name": "k8scontextIDs", - "variableName": "k8scontextIDs" - }, - { - "kind": "Variable", - "name": "namespace", - "variableName": "namespace" - } - ], - "concreteType": "ClusterResources", - "kind": "LinkedField", - "name": "getClusterResources", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "Resource", - "kind": "LinkedField", - "name": "resources", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "kind", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "count", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "ClusterResourcesQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "ClusterResourcesQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "be4502eb8686b7ba1ab73d914f75e299", - "id": null, - "metadata": {}, - "name": "ClusterResourcesQuery", - "operationKind": "query", - "text": "query ClusterResourcesQuery(\n $k8scontextIDs: [String!]\n $namespace: String!\n) {\n clusterResources: getClusterResources(k8scontextIDs: $k8scontextIDs, namespace: $namespace) {\n resources {\n kind\n count\n }\n }\n}\n" - } -}; -})(); - -node.hash = "df3b0056c596c2f025a87ac56962fc6e"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/ControlPlanesQuery.graphql.js b/ui/components/graphql/queries/__generated__/ControlPlanesQuery.graphql.js deleted file mode 100644 index bccd5165176..00000000000 --- a/ui/components/graphql/queries/__generated__/ControlPlanesQuery.graphql.js +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "filter" - } -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null -}, -v2 = [ - { - "alias": "controlPlanesState", - "args": [ - { - "kind": "Variable", - "name": "filter", - "variableName": "filter" - } - ], - "concreteType": "ControlPlane", - "kind": "LinkedField", - "name": "getControlPlanes", - "plural": true, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "ControlPlaneMember", - "kind": "LinkedField", - "name": "members", - "plural": true, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "version", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "component", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "namespace", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "ControlPlanesQuery", - "selections": (v2/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "ControlPlanesQuery", - "selections": (v2/*: any*/) - }, - "params": { - "cacheID": "2a087a7971334b86b29d478c175cd336", - "id": null, - "metadata": {}, - "name": "ControlPlanesQuery", - "operationKind": "query", - "text": "query ControlPlanesQuery(\n $filter: ServiceMeshFilter\n) {\n controlPlanesState: getControlPlanes(filter: $filter) {\n name\n members {\n name\n version\n component\n namespace\n }\n }\n}\n" - } -}; -})(); - -node.hash = "82f1d5dbf1eec9d253f34bc6b6a7e6f4"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/DataPlanesQuery.graphql.js b/ui/components/graphql/queries/__generated__/DataPlanesQuery.graphql.js deleted file mode 100644 index b28cc2700da..00000000000 --- a/ui/components/graphql/queries/__generated__/DataPlanesQuery.graphql.js +++ /dev/null @@ -1,210 +0,0 @@ -/** - * @generated SignedSource<<9bbed48895609893de91588cdca94029>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "filter" - } -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null -}, -v2 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "image", - "storageKey": null -}, -v3 = [ - { - "alias": "dataPlanesState", - "args": [ - { - "kind": "Variable", - "name": "filter", - "variableName": "filter" - } - ], - "concreteType": "DataPlane", - "kind": "LinkedField", - "name": "getDataPlanes", - "plural": true, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "Container", - "kind": "LinkedField", - "name": "proxies", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "controlPlaneMemberName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "containerName", - "storageKey": null - }, - (v2/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "Container_Status", - "kind": "LinkedField", - "name": "status", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "containerStatusName", - "storageKey": null - }, - (v2/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "state", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "lastState", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "ready", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "restartCount", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "started", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "imageID", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "containerID", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Container_Port", - "kind": "LinkedField", - "name": "ports", - "plural": true, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "containerPort", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "protocol", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "resources", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "DataPlanesQuery", - "selections": (v3/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "DataPlanesQuery", - "selections": (v3/*: any*/) - }, - "params": { - "cacheID": "b2b75c4ae9ac1a89e28f4d4454fe6a1f", - "id": null, - "metadata": {}, - "name": "DataPlanesQuery", - "operationKind": "query", - "text": "query DataPlanesQuery(\n $filter: ServiceMeshFilter\n) {\n dataPlanesState: getDataPlanes(filter: $filter) {\n name\n proxies {\n controlPlaneMemberName\n containerName\n image\n status {\n containerStatusName\n image\n state\n lastState\n ready\n restartCount\n started\n imageID\n containerID\n }\n ports {\n name\n containerPort\n protocol\n }\n resources\n }\n }\n}\n" - } -}; -})(); - -node.hash = "972da366246c7024e36e973fb98f27a5"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/DeployMeshSyncQuery.graphql.js b/ui/components/graphql/queries/__generated__/DeployMeshSyncQuery.graphql.js deleted file mode 100644 index 21e3812aa50..00000000000 --- a/ui/components/graphql/queries/__generated__/DeployMeshSyncQuery.graphql.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "k8scontextID" - } -], -v1 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "k8scontextID", - "variableName": "k8scontextID" - } - ], - "kind": "ScalarField", - "name": "deployMeshsync", - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "DeployMeshSyncQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "DeployMeshSyncQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "0fabd55f7b3f104df0c380e8296c421b", - "id": null, - "metadata": {}, - "name": "DeployMeshSyncQuery", - "operationKind": "query", - "text": "query DeployMeshSyncQuery(\n $k8scontextID: String!\n) {\n deployMeshsync(k8scontextID: $k8scontextID)\n}\n" - } -}; -})(); - -node.hash = "ade80c586a9696106576404cbf968aaf"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/DeployNatsQuery.graphql.js b/ui/components/graphql/queries/__generated__/DeployNatsQuery.graphql.js deleted file mode 100644 index 2dcbc26fba3..00000000000 --- a/ui/components/graphql/queries/__generated__/DeployNatsQuery.graphql.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @generated SignedSource<<5a4a6bd490e55d9afa0faa4b6ebc99a9>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "k8scontextID" - } -], -v1 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "k8scontextID", - "variableName": "k8scontextID" - } - ], - "kind": "ScalarField", - "name": "connectToNats", - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "DeployNatsQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "DeployNatsQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "76180bca9f0c5921831b5c004d7e2679", - "id": null, - "metadata": {}, - "name": "DeployNatsQuery", - "operationKind": "query", - "text": "query DeployNatsQuery(\n $k8scontextID: String!\n) {\n connectToNats(k8scontextID: $k8scontextID)\n}\n" - } -}; -})(); - -node.hash = "36be030e0bed096e2cfaef1101bfaa27"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/FetchAllResultsQuery.graphql.js b/ui/components/graphql/queries/__generated__/FetchAllResultsQuery.graphql.js deleted file mode 100644 index 8517af09f66..00000000000 --- a/ui/components/graphql/queries/__generated__/FetchAllResultsQuery.graphql.js +++ /dev/null @@ -1,177 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" - } -], -v1 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "PerfPageResult", - "kind": "LinkedField", - "name": "fetchAllResults", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page_size", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "total_count", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "MesheryResult", - "kind": "LinkedField", - "name": "results", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "meshery_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "mesh", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "performance_profile", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "test_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "server_metrics", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "test_start_time", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "user_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updated_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "runner_results", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "FetchAllResultsQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "FetchAllResultsQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "0770a3af73084b2362bfb7bad68fbeb4", - "id": null, - "metadata": {}, - "name": "FetchAllResultsQuery", - "operationKind": "query", - "text": "query FetchAllResultsQuery(\n $selector: PageFilter!\n) {\n fetchAllResults(selector: $selector) {\n page\n page_size\n total_count\n results {\n meshery_id\n name\n mesh\n performance_profile\n test_id\n server_metrics\n test_start_time\n created_at\n user_id\n updated_at\n runner_results\n }\n }\n}\n" - } -}; -})(); - -node.hash = "0aede14fffa5004109535cbff9b07687"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/MeshModelSummaryQuery.graphql.js b/ui/components/graphql/queries/__generated__/MeshModelSummaryQuery.graphql.js deleted file mode 100644 index ce01bc28654..00000000000 --- a/ui/components/graphql/queries/__generated__/MeshModelSummaryQuery.graphql.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" - } -], -v1 = [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "count", - "storageKey": null - } -], -v2 = [ - { - "alias": "meshmodelSummary", - "args": [ - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "MeshModelSummary", - "kind": "LinkedField", - "name": "getMeshModelSummary", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "MeshModelComponent", - "kind": "LinkedField", - "name": "components", - "plural": true, - "selections": (v1/*: any*/), - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "MeshModelRelationship", - "kind": "LinkedField", - "name": "relationships", - "plural": true, - "selections": (v1/*: any*/), - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "MeshModelSummaryQuery", - "selections": (v2/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "MeshModelSummaryQuery", - "selections": (v2/*: any*/) - }, - "params": { - "cacheID": "fb8718ecc59096bb7a68d0479193aaab", - "id": null, - "metadata": {}, - "name": "MeshModelSummaryQuery", - "operationKind": "query", - "text": "query MeshModelSummaryQuery(\n $selector: MeshModelSummarySelector!\n) {\n meshmodelSummary: getMeshModelSummary(selector: $selector) {\n components {\n name\n count\n }\n relationships {\n name\n count\n }\n }\n}\n" - } -}; -})(); - -node.hash = "830ea0f72a52a2f3419b0796d9b3a562"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/MeshsyncStatusQuery.graphql.js b/ui/components/graphql/queries/__generated__/MeshsyncStatusQuery.graphql.js deleted file mode 100644 index 06d4fd55e54..00000000000 --- a/ui/components/graphql/queries/__generated__/MeshsyncStatusQuery.graphql.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * @generated SignedSource<<89d91dbbc41da00eed2c37155a5b5bed>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "connectionID" - } -], -v1 = [ - { - "alias": "controller", - "args": [ - { - "kind": "Variable", - "name": "connectionID", - "variableName": "connectionID" - } - ], - "concreteType": "OperatorControllerStatus", - "kind": "LinkedField", - "name": "getMeshsyncStatus", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "version", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "status", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "MeshsyncStatusQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "MeshsyncStatusQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "1b2cb7cffaec7ee51423e6f26c1e6ae4", - "id": null, - "metadata": {}, - "name": "MeshsyncStatusQuery", - "operationKind": "query", - "text": "query MeshsyncStatusQuery(\n $connectionID: String!\n) {\n controller: getMeshsyncStatus(connectionID: $connectionID) {\n name\n version\n status\n }\n}\n" - } -}; -})(); - -node.hash = "a9ff2d13ffaf332f9be4ca12e09bd7f9"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/NamespaceQuery.graphql.js b/ui/components/graphql/queries/__generated__/NamespaceQuery.graphql.js deleted file mode 100644 index 1e2ba4d6091..00000000000 --- a/ui/components/graphql/queries/__generated__/NamespaceQuery.graphql.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * @generated SignedSource<<690faf7517990831cec356b0bf8f28bd>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "k8sClusterIDs" - } -], -v1 = [ - { - "alias": "namespaces", - "args": [ - { - "kind": "Variable", - "name": "k8sClusterIDs", - "variableName": "k8sClusterIDs" - } - ], - "concreteType": "NameSpace", - "kind": "LinkedField", - "name": "getAvailableNamespaces", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "namespace", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "NamespaceQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "NamespaceQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "0e85918419a43e5791cd5a51e7f6896e", - "id": null, - "metadata": {}, - "name": "NamespaceQuery", - "operationKind": "query", - "text": "query NamespaceQuery(\n $k8sClusterIDs: [String!]\n) {\n namespaces: getAvailableNamespaces(k8sClusterIDs: $k8sClusterIDs) {\n namespace\n }\n}\n" - } -}; -})(); - -node.hash = "04f74232907aa0ba765bd0f8db6c427c"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/NatsStatusQuery.graphql.js b/ui/components/graphql/queries/__generated__/NatsStatusQuery.graphql.js deleted file mode 100644 index 738fb8ab1e9..00000000000 --- a/ui/components/graphql/queries/__generated__/NatsStatusQuery.graphql.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * @generated SignedSource<<49e3869624d07be085d19ab99c102219>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "connectionID" - } -], -v1 = [ - { - "alias": "controller", - "args": [ - { - "kind": "Variable", - "name": "connectionID", - "variableName": "connectionID" - } - ], - "concreteType": "OperatorControllerStatus", - "kind": "LinkedField", - "name": "getNatsStatus", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "version", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "status", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "NatsStatusQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "NatsStatusQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "f232d0001a24e998f5d993786cfed5f6", - "id": null, - "metadata": {}, - "name": "NatsStatusQuery", - "operationKind": "query", - "text": "query NatsStatusQuery(\n $connectionID: String!\n) {\n controller: getNatsStatus(connectionID: $connectionID) {\n name\n version\n status\n }\n}\n" - } -}; -})(); - -node.hash = "10628d273554398f8d127aaa764a94fd"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/OperatorStatusQuery.graphql.js b/ui/components/graphql/queries/__generated__/OperatorStatusQuery.graphql.js deleted file mode 100644 index bd26becba79..00000000000 --- a/ui/components/graphql/queries/__generated__/OperatorStatusQuery.graphql.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * @generated SignedSource<<72371de5e888cd09251acd22c1310b50>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "connectionID" - } -], -v1 = [ - { - "alias": "operator", - "args": [ - { - "kind": "Variable", - "name": "connectionID", - "variableName": "connectionID" - } - ], - "concreteType": "MesheryControllersStatusListItem", - "kind": "LinkedField", - "name": "getOperatorStatus", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "status", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "controller", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "connectionID", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "OperatorStatusQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "OperatorStatusQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "1edf459162cb7e0a916856a8bb8649e2", - "id": null, - "metadata": {}, - "name": "OperatorStatusQuery", - "operationKind": "query", - "text": "query OperatorStatusQuery(\n $connectionID: String!\n) {\n operator: getOperatorStatus(connectionID: $connectionID) {\n status\n controller\n connectionID\n }\n}\n" - } -}; -})(); - -node.hash = "519b77a47c22930c9d148d1e4f4011cb"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/PerformanceProfilesQuery.graphql.js b/ui/components/graphql/queries/__generated__/PerformanceProfilesQuery.graphql.js deleted file mode 100644 index c3730e4188e..00000000000 --- a/ui/components/graphql/queries/__generated__/PerformanceProfilesQuery.graphql.js +++ /dev/null @@ -1,226 +0,0 @@ -/** - * @generated SignedSource<<58aed683b96a4b759cb5180b0d61e55b>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" - } -], -v1 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "PerfPageProfiles", - "kind": "LinkedField", - "name": "getPerformanceProfiles", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page_size", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "total_count", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "PerfProfile", - "kind": "LinkedField", - "name": "profiles", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "concurrent_request", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "duration", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endpoints", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "last_run", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "load_generators", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "qps", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "total_results", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updated_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "user_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "request_body", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "request_cookies", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "request_headers", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "content_type", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "service_mesh", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "metadata", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "PerformanceProfilesQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "PerformanceProfilesQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "05fcaffb37eda9d52f8bd45bd8da5550", - "id": null, - "metadata": {}, - "name": "PerformanceProfilesQuery", - "operationKind": "query", - "text": "query PerformanceProfilesQuery(\n $selector: PageFilter!\n) {\n getPerformanceProfiles(selector: $selector) {\n page\n page_size\n total_count\n profiles {\n concurrent_request\n created_at\n duration\n endpoints\n id\n last_run\n load_generators\n name\n qps\n total_results\n updated_at\n user_id\n request_body\n request_cookies\n request_headers\n content_type\n service_mesh\n metadata\n }\n }\n}\n" - } -}; -})(); - -node.hash = "a901902df4422ec63fa999ca605a644b"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/PerformanceResultQuery.graphql.js b/ui/components/graphql/queries/__generated__/PerformanceResultQuery.graphql.js deleted file mode 100644 index b2e7f5e1758..00000000000 --- a/ui/components/graphql/queries/__generated__/PerformanceResultQuery.graphql.js +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @generated SignedSource<<9aed7c29919008bbe111bee947e721bf>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "profileID" -}, -v1 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" -}, -v2 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "profileID", - "variableName": "profileID" - }, - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "PerfPageResult", - "kind": "LinkedField", - "name": "fetchResults", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page_size", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "total_count", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "MesheryResult", - "kind": "LinkedField", - "name": "results", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "meshery_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "mesh", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "performance_profile", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "test_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "server_metrics", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "test_start_time", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "user_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updated_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "runner_results", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": [ - (v0/*: any*/), - (v1/*: any*/) - ], - "kind": "Fragment", - "metadata": null, - "name": "PerformanceResultQuery", - "selections": (v2/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": [ - (v1/*: any*/), - (v0/*: any*/) - ], - "kind": "Operation", - "name": "PerformanceResultQuery", - "selections": (v2/*: any*/) - }, - "params": { - "cacheID": "cb5e2072afbc31af649ca22bc7e5d4d6", - "id": null, - "metadata": {}, - "name": "PerformanceResultQuery", - "operationKind": "query", - "text": "query PerformanceResultQuery(\n $selector: PageFilter!\n $profileID: String!\n) {\n fetchResults(selector: $selector, profileID: $profileID) {\n page\n page_size\n total_count\n results {\n meshery_id\n name\n mesh\n performance_profile\n test_id\n server_metrics\n test_start_time\n created_at\n user_id\n updated_at\n runner_results\n }\n }\n}\n" - } -}; -})(); - -node.hash = "e42d1c8529e951f7ad055eab6db359b8"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/ResetDatabaseQuery.graphql.js b/ui/components/graphql/queries/__generated__/ResetDatabaseQuery.graphql.js deleted file mode 100644 index 03a29cbc715..00000000000 --- a/ui/components/graphql/queries/__generated__/ResetDatabaseQuery.graphql.js +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "k8scontextID" -}, -v1 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" -}, -v2 = [ - { - "alias": "resetStatus", - "args": [ - { - "kind": "Variable", - "name": "k8scontextID", - "variableName": "k8scontextID" - }, - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "kind": "ScalarField", - "name": "resyncCluster", - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": [ - (v0/*: any*/), - (v1/*: any*/) - ], - "kind": "Fragment", - "metadata": null, - "name": "ResetDatabaseQuery", - "selections": (v2/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": [ - (v1/*: any*/), - (v0/*: any*/) - ], - "kind": "Operation", - "name": "ResetDatabaseQuery", - "selections": (v2/*: any*/) - }, - "params": { - "cacheID": "37b0c2d517499c337bd4bdfa2ef79380", - "id": null, - "metadata": {}, - "name": "ResetDatabaseQuery", - "operationKind": "query", - "text": "query ResetDatabaseQuery(\n $selector: ReSyncActions!\n $k8scontextID: String!\n) {\n resetStatus: resyncCluster(selector: $selector, k8scontextID: $k8scontextID)\n}\n" - } -}; -})(); - -node.hash = "54a9344cc4d95023f5082936dc95d05d"; - -module.exports = node; diff --git a/ui/components/graphql/queries/__generated__/TelemetryComponentsQuery.graphql.js b/ui/components/graphql/queries/__generated__/TelemetryComponentsQuery.graphql.js deleted file mode 100644 index 2eb18caa067..00000000000 --- a/ui/components/graphql/queries/__generated__/TelemetryComponentsQuery.graphql.js +++ /dev/null @@ -1,89 +0,0 @@ -/** - * @generated SignedSource<<359e3faf308f403ed9207a13856d700b>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "contexts" - } -], -v1 = [ - { - "alias": "telemetryComps", - "args": [ - { - "kind": "Variable", - "name": "contexts", - "variableName": "contexts" - } - ], - "concreteType": "TelemetryComp", - "kind": "LinkedField", - "name": "fetchTelemetryComponents", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "spec", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "status", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "TelemetryComponentsQuery", - "selections": (v1/*: any*/), - "type": "Query", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "TelemetryComponentsQuery", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "5c359a9d5b083eb5aba9b7bfe49663c9", - "id": null, - "metadata": {}, - "name": "TelemetryComponentsQuery", - "operationKind": "query", - "text": "query TelemetryComponentsQuery(\n $contexts: [String!]\n) {\n telemetryComps: fetchTelemetryComponents(contexts: $contexts) {\n name\n spec\n status\n }\n}\n" - } -}; -})(); - -node.hash = "ec7907a52eb8925b7e063038d08beb85"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/ClusterResourcesSubscription.js b/ui/components/graphql/subscriptions/ClusterResourcesSubscription.js deleted file mode 100644 index 004a4406099..00000000000 --- a/ui/components/graphql/subscriptions/ClusterResourcesSubscription.js +++ /dev/null @@ -1,26 +0,0 @@ -import { graphql, requestSubscription } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -export const clusterResourcesSubscription = graphql` - subscription ClusterResourcesSubscription($k8scontextIDs: [String!], $namespace: String!) { - clusterResources: subscribeClusterResources( - k8scontextIDs: $k8scontextIDs - namespace: $namespace - ) { - resources { - kind - count - } - } - } -`; - -export default function subscribeClusterResources(dataCB, variables) { - const environment = createRelayEnvironment({}); - return requestSubscription(environment, { - subscription: clusterResourcesSubscription, - variables: variables, - onNext: dataCB, - onError: (error) => console.log(`Cluster Resources Subscription error:`, error), - }); -} diff --git a/ui/components/graphql/subscriptions/ConfigurationSubscription.js b/ui/components/graphql/subscriptions/ConfigurationSubscription.js deleted file mode 100644 index 8af30b19a9f..00000000000 --- a/ui/components/graphql/subscriptions/ConfigurationSubscription.js +++ /dev/null @@ -1,62 +0,0 @@ -import { graphql, requestSubscription } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -const configurationSubscription = graphql` - subscription ConfigurationSubscription( - $patternSelector: PageFilter! - $filterSelector: PageFilter! - ) { - configuration: subscribeConfiguration( - patternSelector: $patternSelector - filterSelector: $filterSelector - ) { - patterns { - page - page_size - total_count - patterns { - id - name - user_id - pattern_file - visibility - catalog_data - canSupport - errmsg - created_at - updated_at - type { - String - Valid - } - } - } - filters { - page - page_size - total_count - filters { - id - name - filter_file - filter_resource - visibility - catalog_data - user_id - created_at - updated_at - } - } - } - } -`; - -export default function ConfigurationSubscription(onNext, variables) { - const environment = createRelayEnvironment({}); - return requestSubscription(environment, { - subscription: configurationSubscription, - variables: variables, - onNext: onNext, - onError: (error) => console.log('ERROR OCCURED IN CONFIGURATION SUBCRIPTION', error), - }); -} diff --git a/ui/components/graphql/subscriptions/EventsSubscription.js b/ui/components/graphql/subscriptions/EventsSubscription.js deleted file mode 100644 index d01adc01af4..00000000000 --- a/ui/components/graphql/subscriptions/EventsSubscription.js +++ /dev/null @@ -1,33 +0,0 @@ -import { graphql, requestSubscription } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -const eventsSubscription = graphql` - subscription EventsSubscription { - event: subscribeEvents { - id - userID - actedUpon - operationID - systemID - status - severity - action - category - description - metadata - createdAt - updatedAt - deletedAt - } - } -`; - -export default function subscribeEvents(dataCB) { - const environment = createRelayEnvironment({}); - - return requestSubscription(environment, { - subscription: eventsSubscription, - onNext: dataCB, - onError: (error) => console.log(`An error occured:`, error), - }); -} diff --git a/ui/components/graphql/subscriptions/K8sContextSubscription.js b/ui/components/graphql/subscriptions/K8sContextSubscription.js deleted file mode 100644 index dd0fe14fd90..00000000000 --- a/ui/components/graphql/subscriptions/K8sContextSubscription.js +++ /dev/null @@ -1,34 +0,0 @@ -import { graphql, requestSubscription } from 'relay-runtime'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -const k8sContextSubscription = graphql` - subscription K8sContextSubscription($selector: PageFilter!) { - k8sContext: subscribeK8sContext(selector: $selector) { - total_count - contexts { - id - name - server - owner - created_by - meshery_instance_id - kubernetes_server_id - deployment_type - updated_at - created_at - version - connection_id - } - } - } -`; - -export default function subscribeK8sContext(dataCB, variables) { - const environment = createRelayEnvironment({}); - return requestSubscription(environment, { - subscription: k8sContextSubscription, - variables: variables, - onNext: dataCB, - onError: (error) => console.log('K8sContextSubscription: An error occured:', error), - }); -} diff --git a/ui/components/graphql/subscriptions/MeshModelSummarySubscription.js b/ui/components/graphql/subscriptions/MeshModelSummarySubscription.js deleted file mode 100644 index 98148a57437..00000000000 --- a/ui/components/graphql/subscriptions/MeshModelSummarySubscription.js +++ /dev/null @@ -1,28 +0,0 @@ -import { graphql, requestSubscription } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -// not in use -export const meshmodelSummarySubscription = graphql` - subscription MeshModelSummarySubscription($selector: MeshModelSummarySelector!) { - meshmodelSummary: subscribeMeshModelSummary(selector: $selector) { - components { - name - count - } - relationships { - name - count - } - } - } -`; - -export default function subscribeClusterResources(dataCB, variables) { - const environment = createRelayEnvironment({}); - return requestSubscription(environment, { - subscription: meshmodelSummarySubscription, - variables: variables, - onNext: dataCB, - onError: (error) => console.log(`MeshModel Subscription error:`, error), - }); -} diff --git a/ui/components/graphql/subscriptions/MeshSyncEventsSubscription.js b/ui/components/graphql/subscriptions/MeshSyncEventsSubscription.js deleted file mode 100644 index 426f69c32f0..00000000000 --- a/ui/components/graphql/subscriptions/MeshSyncEventsSubscription.js +++ /dev/null @@ -1,28 +0,0 @@ -// import { graphql, requestSubscription } from 'react-relay'; -// import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -// const meshSyncEventsSubscription = graphql` -// subscription MeshSyncEventsSubscription( -// $connectionIDs: [String!] -// $eventTypes: [MeshSyncEventType!] -// ) { -// meshsyncevents: subscribeMeshSyncEvents( -// connectionIDs: $connectionIDs -// eventTypes: $eventTypes -// ) { -// type -// object -// connectionID -// } -// } -// `; - -// export default function subscribeMeshSyncEvents(dataCB, variables) { -// const environment = createRelayEnvironment({}); -// return requestSubscription(environment, { -// subscription: meshSyncEventsSubscription, -// variables: variables, -// onNext: dataCB, -// onError: (error) => console.log(`An error occured:`, error), -// }); -// } diff --git a/ui/components/graphql/subscriptions/MesheryControllersStatusSubscription.js b/ui/components/graphql/subscriptions/MesheryControllersStatusSubscription.js deleted file mode 100644 index 34fdb97c542..00000000000 --- a/ui/components/graphql/subscriptions/MesheryControllersStatusSubscription.js +++ /dev/null @@ -1,23 +0,0 @@ -import { graphql, requestSubscription } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -const mesheryControllersStatusSubscription = graphql` - subscription MesheryControllersStatusSubscription($connectionIDs: [String!]) { - subscribeMesheryControllersStatus(connectionIDs: $connectionIDs) { - connectionID - controller - status - version - } - } -`; - -export default function subscribeMesheryControllersStatus(dataCB, variables) { - const environment = createRelayEnvironment({}); - return requestSubscription(environment, { - subscription: mesheryControllersStatusSubscription, - variables: { connectionIDs: variables }, - onNext: dataCB, - onError: (error) => console.log(`An error occured:`, error), - }); -} diff --git a/ui/components/graphql/subscriptions/PerformanceProfilesSubscription.js b/ui/components/graphql/subscriptions/PerformanceProfilesSubscription.js deleted file mode 100644 index f52810676ea..00000000000 --- a/ui/components/graphql/subscriptions/PerformanceProfilesSubscription.js +++ /dev/null @@ -1,41 +0,0 @@ -import { graphql, requestSubscription } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -const performanceProfilesSubscription = graphql` - subscription PerformanceProfilesSubscription($selector: PageFilter!) { - subscribePerfProfiles(selector: $selector) { - page - page_size - total_count - profiles { - concurrent_request - created_at - duration - endpoints - id - last_run - load_generators - name - qps - total_results - updated_at - user_id - request_body - request_cookies - request_headers - content_type - service_mesh - metadata - } - } - } -`; -export default function subscribePerformanceProfiles(dataCB, variables) { - const environment = createRelayEnvironment({}); - return requestSubscription(environment, { - subscription: performanceProfilesSubscription, - variables: variables, - onNext: dataCB, - onError: (error) => console.log(`requestSubscription error:`, error), - }); -} diff --git a/ui/components/graphql/subscriptions/PerformanceResultSubscription.js b/ui/components/graphql/subscriptions/PerformanceResultSubscription.js deleted file mode 100644 index bf239067572..00000000000 --- a/ui/components/graphql/subscriptions/PerformanceResultSubscription.js +++ /dev/null @@ -1,34 +0,0 @@ -import { graphql, requestSubscription } from 'react-relay'; -import { createRelayEnvironment } from '../../../lib/relayEnvironment'; - -const performanceResultSubscription = graphql` - subscription PerformanceResultSubscription($selector: PageFilter!, $profileID: String!) { - subscribePerfResults(selector: $selector, profileID: $profileID) { - page - page_size - total_count - results { - meshery_id - name - mesh - performance_profile - test_id - server_metrics - test_start_time - created_at - user_id - updated_at - runner_results - } - } - } -`; -export default function subscribePerformanceProfiles(dataCB, variables) { - const environment = createRelayEnvironment({}); - return requestSubscription(environment, { - subscription: performanceResultSubscription, - variables: variables, - onNext: dataCB, - onError: (error) => console.log(`requestSubscription error:`, error), - }); -} diff --git a/ui/components/graphql/subscriptions/__generated__/AddonStatusSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/AddonStatusSubscription.graphql.js deleted file mode 100644 index 2b4703a045d..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/AddonStatusSubscription.graphql.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "filter" - } -], -v1 = [ - { - "alias": "addonsState", - "args": [ - { - "kind": "Variable", - "name": "filter", - "variableName": "filter" - } - ], - "concreteType": "AddonList", - "kind": "LinkedField", - "name": "listenToAddonState", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "owner", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "AddonStatusSubscription", - "selections": (v1/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "AddonStatusSubscription", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "b7f42d3b9c1ab13f1d78c3048eb9a5db", - "id": null, - "metadata": {}, - "name": "AddonStatusSubscription", - "operationKind": "subscription", - "text": "subscription AddonStatusSubscription(\n $filter: ServiceMeshFilter\n) {\n addonsState: listenToAddonState(filter: $filter) {\n name\n owner\n }\n}\n" - } -}; -})(); - -node.hash = "7cef73e9bfdcc63d12dfe54d2a0f3fbf"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/BrokerStatusSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/BrokerStatusSubscription.graphql.js deleted file mode 100644 index 5028f760ed0..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/BrokerStatusSubscription.graphql.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "subscribeBrokerConnection", - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": [], - "kind": "Fragment", - "metadata": null, - "name": "BrokerStatusSubscription", - "selections": (v0/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": [], - "kind": "Operation", - "name": "BrokerStatusSubscription", - "selections": (v0/*: any*/) - }, - "params": { - "cacheID": "3eaadbc18fa2fc8430e387a3059fafa9", - "id": null, - "metadata": {}, - "name": "BrokerStatusSubscription", - "operationKind": "subscription", - "text": "subscription BrokerStatusSubscription {\n subscribeBrokerConnection\n}\n" - } -}; -})(); - -node.hash = "c3d1793f9ca896edd7ce6ec58cb79a59"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/ClusterResourcesSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/ClusterResourcesSubscription.graphql.js deleted file mode 100644 index a82c28690ad..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/ClusterResourcesSubscription.graphql.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * @generated SignedSource<<7e25c5992afac17ee968aebd9882822f>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "k8scontextIDs" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "namespace" - } -], -v1 = [ - { - "alias": "clusterResources", - "args": [ - { - "kind": "Variable", - "name": "k8scontextIDs", - "variableName": "k8scontextIDs" - }, - { - "kind": "Variable", - "name": "namespace", - "variableName": "namespace" - } - ], - "concreteType": "ClusterResources", - "kind": "LinkedField", - "name": "subscribeClusterResources", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "Resource", - "kind": "LinkedField", - "name": "resources", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "kind", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "count", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "ClusterResourcesSubscription", - "selections": (v1/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "ClusterResourcesSubscription", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "d3c5e48d338830a81ec808ac6acf5d8a", - "id": null, - "metadata": {}, - "name": "ClusterResourcesSubscription", - "operationKind": "subscription", - "text": "subscription ClusterResourcesSubscription(\n $k8scontextIDs: [String!]\n $namespace: String!\n) {\n clusterResources: subscribeClusterResources(k8scontextIDs: $k8scontextIDs, namespace: $namespace) {\n resources {\n kind\n count\n }\n }\n}\n" - } -}; -})(); - -node.hash = "2722cb19adcd7e786a91856efcff3e1c"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/ConfigurationSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/ConfigurationSubscription.graphql.js deleted file mode 100644 index 49e7bd4216c..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/ConfigurationSubscription.graphql.js +++ /dev/null @@ -1,276 +0,0 @@ -/** - * @generated SignedSource<<913da5338e44a21198d54b3ae19dedf4>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "filterSelector" -}, -v1 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "patternSelector" -}, -v2 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page", - "storageKey": null -}, -v3 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page_size", - "storageKey": null -}, -v4 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "total_count", - "storageKey": null -}, -v5 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null -}, -v6 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null -}, -v7 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "user_id", - "storageKey": null -}, -v8 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "visibility", - "storageKey": null -}, -v9 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "catalog_data", - "storageKey": null -}, -v10 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_at", - "storageKey": null -}, -v11 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updated_at", - "storageKey": null -}, -v12 = [ - { - "alias": "configuration", - "args": [ - { - "kind": "Variable", - "name": "filterSelector", - "variableName": "filterSelector" - }, - { - "kind": "Variable", - "name": "patternSelector", - "variableName": "patternSelector" - } - ], - "concreteType": "ConfigurationPage", - "kind": "LinkedField", - "name": "subscribeConfiguration", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "PatternPageResult", - "kind": "LinkedField", - "name": "patterns", - "plural": false, - "selections": [ - (v2/*: any*/), - (v3/*: any*/), - (v4/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "PatternResult", - "kind": "LinkedField", - "name": "patterns", - "plural": true, - "selections": [ - (v5/*: any*/), - (v6/*: any*/), - (v7/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "pattern_file", - "storageKey": null - }, - (v8/*: any*/), - (v9/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "canSupport", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "errmsg", - "storageKey": null - }, - (v10/*: any*/), - (v11/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "NullString", - "kind": "LinkedField", - "name": "type", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "String", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "Valid", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "FilterPage", - "kind": "LinkedField", - "name": "filters", - "plural": false, - "selections": [ - (v2/*: any*/), - (v3/*: any*/), - (v4/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "FilterResult", - "kind": "LinkedField", - "name": "filters", - "plural": true, - "selections": [ - (v5/*: any*/), - (v6/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "filter_file", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "filter_resource", - "storageKey": null - }, - (v8/*: any*/), - (v9/*: any*/), - (v7/*: any*/), - (v10/*: any*/), - (v11/*: any*/) - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": [ - (v0/*: any*/), - (v1/*: any*/) - ], - "kind": "Fragment", - "metadata": null, - "name": "ConfigurationSubscription", - "selections": (v12/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": [ - (v1/*: any*/), - (v0/*: any*/) - ], - "kind": "Operation", - "name": "ConfigurationSubscription", - "selections": (v12/*: any*/) - }, - "params": { - "cacheID": "114d3745286afe9f521748a330799adc", - "id": null, - "metadata": {}, - "name": "ConfigurationSubscription", - "operationKind": "subscription", - "text": "subscription ConfigurationSubscription(\n $patternSelector: PageFilter!\n $filterSelector: PageFilter!\n) {\n configuration: subscribeConfiguration(patternSelector: $patternSelector, filterSelector: $filterSelector) {\n patterns {\n page\n page_size\n total_count\n patterns {\n id\n name\n user_id\n pattern_file\n visibility\n catalog_data\n canSupport\n errmsg\n created_at\n updated_at\n type {\n String\n Valid\n }\n }\n }\n filters {\n page\n page_size\n total_count\n filters {\n id\n name\n filter_file\n filter_resource\n visibility\n catalog_data\n user_id\n created_at\n updated_at\n }\n }\n }\n}\n" - } -}; -})(); - -node.hash = "7aa8cbbbeec029fbf5f68fff16f3888b"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/ControlPlaneSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/ControlPlaneSubscription.graphql.js deleted file mode 100644 index edd79b05a0c..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/ControlPlaneSubscription.graphql.js +++ /dev/null @@ -1,109 +0,0 @@ -/** - * @generated SignedSource<<7750a72ddbd04f3e1b53bcfecef98966>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "filter" - } -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null -}, -v2 = [ - { - "alias": "controlPlanesState", - "args": [ - { - "kind": "Variable", - "name": "filter", - "variableName": "filter" - } - ], - "concreteType": "ControlPlane", - "kind": "LinkedField", - "name": "listenToControlPlaneState", - "plural": true, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "ControlPlaneMember", - "kind": "LinkedField", - "name": "members", - "plural": true, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "version", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "component", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "namespace", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "ControlPlaneSubscription", - "selections": (v2/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "ControlPlaneSubscription", - "selections": (v2/*: any*/) - }, - "params": { - "cacheID": "e552aaa57cd93a93a1bd7bf1a9a27e57", - "id": null, - "metadata": {}, - "name": "ControlPlaneSubscription", - "operationKind": "subscription", - "text": "subscription ControlPlaneSubscription(\n $filter: ServiceMeshFilter\n) {\n controlPlanesState: listenToControlPlaneState(filter: $filter) {\n name\n members {\n name\n version\n component\n namespace\n }\n }\n}\n" - } -}; -})(); - -node.hash = "615008f1bb16f855507fa1c841187200"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/DataPlanesSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/DataPlanesSubscription.graphql.js deleted file mode 100644 index bfd565985ba..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/DataPlanesSubscription.graphql.js +++ /dev/null @@ -1,210 +0,0 @@ -/** - * @generated SignedSource<<1458eea8e467b84cf49388a342747d93>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "filter" - } -], -v1 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null -}, -v2 = { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "image", - "storageKey": null -}, -v3 = [ - { - "alias": "dataPlanesState", - "args": [ - { - "kind": "Variable", - "name": "filter", - "variableName": "filter" - } - ], - "concreteType": "DataPlane", - "kind": "LinkedField", - "name": "listenToDataPlaneState", - "plural": true, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "Container", - "kind": "LinkedField", - "name": "proxies", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "controlPlaneMemberName", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "containerName", - "storageKey": null - }, - (v2/*: any*/), - { - "alias": null, - "args": null, - "concreteType": "Container_Status", - "kind": "LinkedField", - "name": "status", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "containerStatusName", - "storageKey": null - }, - (v2/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "state", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "lastState", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "ready", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "restartCount", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "started", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "imageID", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "containerID", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Container_Port", - "kind": "LinkedField", - "name": "ports", - "plural": true, - "selections": [ - (v1/*: any*/), - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "containerPort", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "protocol", - "storageKey": null - } - ], - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "resources", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "DataPlanesSubscription", - "selections": (v3/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "DataPlanesSubscription", - "selections": (v3/*: any*/) - }, - "params": { - "cacheID": "03f925b1e68b869edfc542bbdd97bd47", - "id": null, - "metadata": {}, - "name": "DataPlanesSubscription", - "operationKind": "subscription", - "text": "subscription DataPlanesSubscription(\n $filter: ServiceMeshFilter\n) {\n dataPlanesState: listenToDataPlaneState(filter: $filter) {\n name\n proxies {\n controlPlaneMemberName\n containerName\n image\n status {\n containerStatusName\n image\n state\n lastState\n ready\n restartCount\n started\n imageID\n containerID\n }\n ports {\n name\n containerPort\n protocol\n }\n resources\n }\n }\n}\n" - } -}; -})(); - -node.hash = "a2c93006a260dea20ca515d042492692"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/EventsSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/EventsSubscription.graphql.js deleted file mode 100644 index c277811dfbc..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/EventsSubscription.graphql.js +++ /dev/null @@ -1,153 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "alias": "event", - "args": null, - "concreteType": "Event", - "kind": "LinkedField", - "name": "subscribeEvents", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "userID", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "actedUpon", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "operationID", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "systemID", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "status", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "severity", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "action", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "category", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "description", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "metadata", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "createdAt", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updatedAt", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "deletedAt", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": [], - "kind": "Fragment", - "metadata": null, - "name": "EventsSubscription", - "selections": (v0/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": [], - "kind": "Operation", - "name": "EventsSubscription", - "selections": (v0/*: any*/) - }, - "params": { - "cacheID": "dfb0d28db01886a2b8877f52db0fd0c6", - "id": null, - "metadata": {}, - "name": "EventsSubscription", - "operationKind": "subscription", - "text": "subscription EventsSubscription {\n event: subscribeEvents {\n id\n userID\n actedUpon\n operationID\n systemID\n status\n severity\n action\n category\n description\n metadata\n createdAt\n updatedAt\n deletedAt\n }\n}\n" - } -}; -})(); - -node.hash = "b6a9380e1fcb5b6b417ef482bb98ab7b"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/K8sContextSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/K8sContextSubscription.graphql.js deleted file mode 100644 index b99b94c1a11..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/K8sContextSubscription.graphql.js +++ /dev/null @@ -1,170 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" - } -], -v1 = [ - { - "alias": "k8sContext", - "args": [ - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "K8sContextsPage", - "kind": "LinkedField", - "name": "subscribeK8sContext", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "total_count", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "K8sContext", - "kind": "LinkedField", - "name": "contexts", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "server", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "owner", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_by", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "meshery_instance_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "kubernetes_server_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "deployment_type", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updated_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "version", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "connection_id", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "K8sContextSubscription", - "selections": (v1/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "K8sContextSubscription", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "6c554db6a024337ed225dbb949aa970f", - "id": null, - "metadata": {}, - "name": "K8sContextSubscription", - "operationKind": "subscription", - "text": "subscription K8sContextSubscription(\n $selector: PageFilter!\n) {\n k8sContext: subscribeK8sContext(selector: $selector) {\n total_count\n contexts {\n id\n name\n server\n owner\n created_by\n meshery_instance_id\n kubernetes_server_id\n deployment_type\n updated_at\n created_at\n version\n connection_id\n }\n }\n}\n" - } -}; -})(); - -node.hash = "8b7ae007f5dced76f0d0b1b3c90a4525"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/MeshModelSummarySubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/MeshModelSummarySubscription.graphql.js deleted file mode 100644 index 9508191b216..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/MeshModelSummarySubscription.graphql.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" - } -], -v1 = [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "count", - "storageKey": null - } -], -v2 = [ - { - "alias": "meshmodelSummary", - "args": [ - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "MeshModelSummary", - "kind": "LinkedField", - "name": "subscribeMeshModelSummary", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "concreteType": "MeshModelComponent", - "kind": "LinkedField", - "name": "components", - "plural": true, - "selections": (v1/*: any*/), - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "MeshModelRelationship", - "kind": "LinkedField", - "name": "relationships", - "plural": true, - "selections": (v1/*: any*/), - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "MeshModelSummarySubscription", - "selections": (v2/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "MeshModelSummarySubscription", - "selections": (v2/*: any*/) - }, - "params": { - "cacheID": "458b92d09a21e56a16ddbc316c2f1596", - "id": null, - "metadata": {}, - "name": "MeshModelSummarySubscription", - "operationKind": "subscription", - "text": "subscription MeshModelSummarySubscription(\n $selector: MeshModelSummarySelector!\n) {\n meshmodelSummary: subscribeMeshModelSummary(selector: $selector) {\n components {\n name\n count\n }\n relationships {\n name\n count\n }\n }\n}\n" - } -}; -})(); - -node.hash = "f9ce6171759cd696ee275c65c930974b"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/MeshSyncEventsSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/MeshSyncEventsSubscription.graphql.js deleted file mode 100644 index 345c191754c..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/MeshSyncEventsSubscription.graphql.js +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @generated SignedSource<<451b18fba5c3680f231918922efe6cf9>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "connectionIDs" - }, - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "eventTypes" - } -], -v1 = [ - { - "alias": "meshsyncevents", - "args": [ - { - "kind": "Variable", - "name": "connectionIDs", - "variableName": "connectionIDs" - }, - { - "kind": "Variable", - "name": "eventTypes", - "variableName": "eventTypes" - } - ], - "concreteType": "MeshSyncEvent", - "kind": "LinkedField", - "name": "subscribeMeshSyncEvents", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "type", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "object", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "connectionID", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "MeshSyncEventsSubscription", - "selections": (v1/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "MeshSyncEventsSubscription", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "29cb26069b69c2858bb31abe76540d9f", - "id": null, - "metadata": {}, - "name": "MeshSyncEventsSubscription", - "operationKind": "subscription", - "text": "subscription MeshSyncEventsSubscription(\n $connectionIDs: [String!]\n $eventTypes: [MeshSyncEventType!]\n) {\n meshsyncevents: subscribeMeshSyncEvents(connectionIDs: $connectionIDs, eventTypes: $eventTypes) {\n type\n object\n connectionID\n }\n}\n" - } -}; -})(); - -node.hash = "422c02f316080b9b8d43a562f696a3d4"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/MeshSyncStatusSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/MeshSyncStatusSubscription.graphql.js deleted file mode 100644 index aae18625ef6..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/MeshSyncStatusSubscription.graphql.js +++ /dev/null @@ -1,132 +0,0 @@ -/** - * @generated SignedSource<<16aa4fb154990d0451a4d469d4e27328>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "k8scontextIDs" - } -], -v1 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "k8scontextIDs", - "variableName": "k8scontextIDs" - } - ], - "concreteType": "OperatorControllerStatusPerK8sContext", - "kind": "LinkedField", - "name": "listenToMeshSyncEvents", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "contextID", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "OperatorControllerStatus", - "kind": "LinkedField", - "name": "OperatorControllerStatus", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "status", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "version", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "Error", - "kind": "LinkedField", - "name": "error", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "code", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "description", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "MeshSyncStatusSubscription", - "selections": (v1/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "MeshSyncStatusSubscription", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "cbe09d18ad6045c56617e15888916d4a", - "id": null, - "metadata": {}, - "name": "MeshSyncStatusSubscription", - "operationKind": "subscription", - "text": "subscription MeshSyncStatusSubscription(\n $k8scontextIDs: [String!]\n) {\n listenToMeshSyncEvents(k8scontextIDs: $k8scontextIDs) {\n contextID\n OperatorControllerStatus {\n name\n status\n version\n error {\n code\n description\n }\n }\n }\n}\n" - } -}; -})(); - -node.hash = "ad82236368e06dbae0e9f6008f6dc032"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/MesheryControllersStatusSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/MesheryControllersStatusSubscription.graphql.js deleted file mode 100644 index fdcc86baed3..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/MesheryControllersStatusSubscription.graphql.js +++ /dev/null @@ -1,96 +0,0 @@ -/** - * @generated SignedSource<<23f539688b80e52960ef747e8e37a964>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "connectionIDs" - } -], -v1 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "connectionIDs", - "variableName": "connectionIDs" - } - ], - "concreteType": "MesheryControllersStatusListItem", - "kind": "LinkedField", - "name": "subscribeMesheryControllersStatus", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "connectionID", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "controller", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "status", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "version", - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "MesheryControllersStatusSubscription", - "selections": (v1/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "MesheryControllersStatusSubscription", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "534d4b9391826e634ad2ab05b1a30e75", - "id": null, - "metadata": {}, - "name": "MesheryControllersStatusSubscription", - "operationKind": "subscription", - "text": "subscription MesheryControllersStatusSubscription(\n $connectionIDs: [String!]\n) {\n subscribeMesheryControllersStatus(connectionIDs: $connectionIDs) {\n connectionID\n controller\n status\n version\n }\n}\n" - } -}; -})(); - -node.hash = "57fdebbc7ad327ad4b1607c9fa7df9e2"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/PerformanceProfilesSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/PerformanceProfilesSubscription.graphql.js deleted file mode 100644 index 5763c4e1805..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/PerformanceProfilesSubscription.graphql.js +++ /dev/null @@ -1,226 +0,0 @@ -/** - * @generated SignedSource<> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = [ - { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" - } -], -v1 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "PerfPageProfiles", - "kind": "LinkedField", - "name": "subscribePerfProfiles", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page_size", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "total_count", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "PerfProfile", - "kind": "LinkedField", - "name": "profiles", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "concurrent_request", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "duration", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "endpoints", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "last_run", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "load_generators", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "qps", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "total_results", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updated_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "user_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "request_body", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "request_cookies", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "request_headers", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "content_type", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "service_mesh", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "metadata", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Fragment", - "metadata": null, - "name": "PerformanceProfilesSubscription", - "selections": (v1/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": (v0/*: any*/), - "kind": "Operation", - "name": "PerformanceProfilesSubscription", - "selections": (v1/*: any*/) - }, - "params": { - "cacheID": "5f6c02d0e3a568b9f4be8793665cb275", - "id": null, - "metadata": {}, - "name": "PerformanceProfilesSubscription", - "operationKind": "subscription", - "text": "subscription PerformanceProfilesSubscription(\n $selector: PageFilter!\n) {\n subscribePerfProfiles(selector: $selector) {\n page\n page_size\n total_count\n profiles {\n concurrent_request\n created_at\n duration\n endpoints\n id\n last_run\n load_generators\n name\n qps\n total_results\n updated_at\n user_id\n request_body\n request_cookies\n request_headers\n content_type\n service_mesh\n metadata\n }\n }\n}\n" - } -}; -})(); - -node.hash = "4444030b4fe1fdb502b3e6036ccf6fd1"; - -module.exports = node; diff --git a/ui/components/graphql/subscriptions/__generated__/PerformanceResultSubscription.graphql.js b/ui/components/graphql/subscriptions/__generated__/PerformanceResultSubscription.graphql.js deleted file mode 100644 index 8a320a5e87f..00000000000 --- a/ui/components/graphql/subscriptions/__generated__/PerformanceResultSubscription.graphql.js +++ /dev/null @@ -1,191 +0,0 @@ -/** - * @generated SignedSource<<350308d6f756916bb1283003d2b046b5>> - * @lightSyntaxTransform - * @nogrep - */ - -/* eslint-disable */ - -'use strict'; - -var node = (function(){ -var v0 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "profileID" -}, -v1 = { - "defaultValue": null, - "kind": "LocalArgument", - "name": "selector" -}, -v2 = [ - { - "alias": null, - "args": [ - { - "kind": "Variable", - "name": "profileID", - "variableName": "profileID" - }, - { - "kind": "Variable", - "name": "selector", - "variableName": "selector" - } - ], - "concreteType": "PerfPageResult", - "kind": "LinkedField", - "name": "subscribePerfResults", - "plural": false, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "page_size", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "total_count", - "storageKey": null - }, - { - "alias": null, - "args": null, - "concreteType": "MesheryResult", - "kind": "LinkedField", - "name": "results", - "plural": true, - "selections": [ - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "meshery_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "name", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "mesh", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "performance_profile", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "test_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "server_metrics", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "test_start_time", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "created_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "user_id", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "updated_at", - "storageKey": null - }, - { - "alias": null, - "args": null, - "kind": "ScalarField", - "name": "runner_results", - "storageKey": null - } - ], - "storageKey": null - } - ], - "storageKey": null - } -]; -return { - "fragment": { - "argumentDefinitions": [ - (v0/*: any*/), - (v1/*: any*/) - ], - "kind": "Fragment", - "metadata": null, - "name": "PerformanceResultSubscription", - "selections": (v2/*: any*/), - "type": "Subscription", - "abstractKey": null - }, - "kind": "Request", - "operation": { - "argumentDefinitions": [ - (v1/*: any*/), - (v0/*: any*/) - ], - "kind": "Operation", - "name": "PerformanceResultSubscription", - "selections": (v2/*: any*/) - }, - "params": { - "cacheID": "fa344fe9e839347da9809ab6a307034a", - "id": null, - "metadata": {}, - "name": "PerformanceResultSubscription", - "operationKind": "subscription", - "text": "subscription PerformanceResultSubscription(\n $selector: PageFilter!\n $profileID: String!\n) {\n subscribePerfResults(selector: $selector, profileID: $profileID) {\n page\n page_size\n total_count\n results {\n meshery_id\n name\n mesh\n performance_profile\n test_id\n server_metrics\n test_start_time\n created_at\n user_id\n updated_at\n runner_results\n }\n }\n}\n" - } -}; -})(); - -node.hash = "4cd62dfb1b40f60dbc14b2ad7ffea32e"; - -module.exports = node; diff --git a/ui/components/hooks/useKubernetesHook.js b/ui/components/hooks/useKubernetesHook.js deleted file mode 100644 index 1e4d7dd70b1..00000000000 --- a/ui/components/hooks/useKubernetesHook.js +++ /dev/null @@ -1,301 +0,0 @@ -import { useDispatch, useSelector } from 'react-redux'; -import { updateProgress } from '../../lib/store'; -import { useNotification } from '../../utils/hooks/useNotification'; -import { errorHandlerGenerator, successHandlerGenerator } from '../ConnectionWizard/helpers/common'; -import { pingKubernetes } from '../ConnectionWizard/helpers/kubernetesHelpers'; -import { pingMesheryOperator } from '../ConnectionWizard/helpers/mesheryOperator'; -import { EVENT_TYPES } from '../../lib/event-types'; -import MeshsyncStatusQuery from '../graphql/queries/MeshsyncStatusQuery'; -import { useEffect, useState } from 'react'; -import fetchMesheryOperatorStatus from '../graphql/queries/OperatorStatusQuery'; -import NatsStatusQuery from '../graphql/queries/NatsStatusQuery'; -import { CONTROLLERS, CONTROLLER_STATES } from '../../utils/Enum'; -import _ from 'lodash'; - -export default function useKubernetesHook() { - const { notify } = useNotification(); - const dispatch = useDispatch(); - const ping = (name, server, connectionID) => { - dispatch(updateProgress({ showProgress: true })); - pingKubernetes( - successHandlerGenerator(notify, `Kubernetes context ${name} at ${server} pinged`, () => - dispatch(updateProgress({ showProgress: false })), - ), - errorHandlerGenerator(notify, `Kubernetes context ${name} at ${server} not reachable`, () => - dispatch(updateProgress({ showProgress: false })), - ), - connectionID, - ); - }; - - return ping; -} -const handleErrorGenerator = (dispatch, notify) => (message, error) => { - dispatch(updateProgress({ showProgress: false })); - console.error(message, error); - notify({ - message: message, - details: error, - event_type: EVENT_TYPES.ERROR, - }); -}; - -const handleSuccessGenerator = (dispatch, notify) => (message) => { - dispatch(updateProgress({ showProgress: false })); - notify({ - message: message, - event_type: EVENT_TYPES.SUCCESS, - }); -}; - -const handleInfoGenerator = (notify) => (message) => { - notify({ - message: message, - event_type: EVENT_TYPES.INFO, - }); -}; - -export function useMesheryOperator() { - const { notify } = useNotification(); - const dispatch = useDispatch(); - const handleError = handleErrorGenerator(dispatch, notify); - const handleSuccess = handleSuccessGenerator(dispatch, notify); - - const ping = ({ connectionID }) => { - dispatch(updateProgress({ showProgress: true })); - pingMesheryOperator( - connectionID, - () => handleSuccess(`Meshery Operator pinged`), - (err) => handleError(`Meshery Operator not reachable`, err), - ); - }; - - return { ping }; -} -export function useMeshsSyncController() { - const { notify } = useNotification(); - const dispatch = useDispatch(); - - const handleError = handleErrorGenerator(dispatch, notify); - const handleSuccess = handleSuccessGenerator(dispatch, notify); - - // takes connectionID as input not the contextID - const ping = ({ connectionID, subscribe = false, onSuccess, onError }) => { - dispatch(updateProgress({ showProgress: true })); - - const subscription = MeshsyncStatusQuery({ connectionID: connectionID }).subscribe({ - next: (res) => { - dispatch(updateProgress({ showProgress: false })); - - if (res.controller.name === 'MeshSync' && res.controller.status.includes('Connected')) { - let publishEndpoint = res.controller.status.substring('Connected'.length); - handleSuccess( - `MeshSync was pinged. ${ - publishEndpoint != '' ? `Publishing to ${publishEndpoint}` : '' - }`, - ); - } else if ( - res.controller.name === 'MeshSync' && - !res.controller.status.includes('Unknown') - ) { - handleError('MeshSync is not publishing to Meshery Broker'); - } else { - handleError('MeshSync could not be reached'); - } - onSuccess && onSuccess(res); - - !subscribe && subscription && subscription?.unsubscribe(); - }, - error: (err) => { - dispatch(updateProgress({ showProgress: false })); - handleError('MeshSync status could not be retrieved', err); - onError && onError(err); - !subscribe && subscription && subscription?.unsubscribe(); - }, - }); - - return subscription; - }; - - return { ping }; -} - -export const useGetOperatorInfoQuery = ({ connectionID }) => { - const { notify } = useNotification(); - const dispatch = useDispatch(); - - const handleError = handleErrorGenerator(dispatch, notify); - // const handleSuccess = handleSuccessGenerator(dispatch, notify); - const handleInfo = handleInfoGenerator(notify); - const [isLoading, setIsLoading] = useState(false); - - useEffect(() => { - setIsLoading(true); - dispatch(updateProgress({ showProgress: true })); - handleInfo('Fetching Meshery Operator status'); - // react-realy fetchQuery function returns a "Observable". To start a request subscribe needs to be called. - // The data is stored into the react-relay store, the data is retrieved by subscribing to the relay store. - // This subscription only subscribes to the fetching of the query and not to any subsequent changes to data in the relay store. - const tempSubscription = fetchMesheryOperatorStatus({ connectionID: connectionID }).subscribe({ - next: () => { - setIsLoading(false); - - dispatch(updateProgress({ showProgress: false })); - // const [isReachable, operatorInfo] = getOperatorStatusFromQueryResult(res); - // setOperatorInfo({ - // isReachable, - // ...operatorInfo, - // meshSyncStatus: operatorInfo.MeshSync ? operatorInfo.MeshSync.status : '', - // meshSyncVersion: operatorInfo.MeshSync ? operatorInfo.MeshSync.version : '', - // NATSVersion: operatorInfo.MesheryBroker ? operatorInfo.MesheryBroker.version : '', - // natsStatus: operatorInfo.MesheryBroker ? operatorInfo.MesheryBroker.status : '', - // }); - }, - error: () => { - setIsLoading(false); - handleError('Meshery Operator status could not be retrieved'); - }, - }); - return () => { - setIsLoading(false); - dispatch(updateProgress({ showProgress: false })); - tempSubscription?.unsubscribe(); - }; - }, []); - - return { - isLoading, - }; -}; - -export const useNatsController = () => { - const { notify } = useNotification(); - const dispatch = useDispatch(); - - const handleError = handleErrorGenerator(dispatch, notify); - const handleSuccess = handleSuccessGenerator(dispatch, notify); - - const ping = ({ connectionID, subscribe = false, onSuccess, onError }) => { - dispatch(updateProgress({ showProgress: true })); - const subscription = NatsStatusQuery({ connectionID }).subscribe({ - next: (res) => { - dispatch(updateProgress({ showProgress: false })); - - if ( - res.controller.name === 'MesheryBroker' && - res.controller.status.includes('Connected') - ) { - let runningEndpoint = res.controller.status.substring('Connected'.length); - handleSuccess( - `Broker was pinged. ${runningEndpoint != '' ? `Running at ${runningEndpoint}` : ''}`, - ); - } else { - handleError( - 'Meshery Broker could not be reached', - 'Meshery Server is not connected to Meshery Broker', - ); - } - - onSuccess && - onSuccess({ - rawResponse: res, - isReachable: true, - natsStatus: res.controller.status, - NATSVersion: res.controller.version, - }); - - !subscribe && subscription?.unsubscribe(); - }, - error: (err) => { - onError && onError(err); - handleError('NATS status could not be retrieved', err); - !subscribe && subscription?.unsubscribe(); - }, - }); - - return subscription; - }; - - return { - ping, - }; -}; - -export const useControllerStatus = (controllerState) => { - const getContextStatus = (connectionID) => { - const defaultState = { - operatorState: CONTROLLER_STATES.DISABLED, - operatorVersion: 'Not Available', - meshSyncState: CONTROLLER_STATES.DISABLED, - meshSyncVersion: 'Not Available', - natsState: CONTROLLER_STATES.DISABLED, - natsVersion: 'Not Available', - }; - - const controller = controllerState?.filter((op) => op.connectionID === connectionID); - if (!controller) { - return defaultState; - } - - function getMeshSyncStats() { - if (!controller) return defaultState; - const meshsyncController = controller?.find( - (ctlr) => ctlr?.controller === CONTROLLERS.MESHSYNC, - ); - // meshsync is at 1st idx - if (meshsyncController) { - return { - meshSyncState: meshsyncController?.status, - meshSyncVersion: meshsyncController?.version, - }; - } - } - - function getBrokerStats() { - if (!controller) return defaultState; - const brokerController = controller?.find((ctlr) => ctlr?.controller === CONTROLLERS.BROKER); - if (brokerController) { - return { - natsState: brokerController?.status, - natsVersion: brokerController?.version, - }; - } - } - - function getOperatorStatus(connectionID) { - const operator = controllerState?.find( - (op) => op.connectionID === connectionID && op.controller === CONTROLLERS.OPERATOR, - ); - if (!operator) { - return defaultState; - } - - return { - operatorState: operator.status, - operatorVersion: operator?.version, - }; - } - - const actualOperatorState = { - ...getOperatorStatus(connectionID), - ...getMeshSyncStats(), - ...getBrokerStats(), - }; - - return _.merge(defaultState, actualOperatorState); - }; - - return { - getControllerStatesByConnectionID: getContextStatus, - }; -}; - -export const useFilterK8sContexts = (k8sContexts, predicate) => { - const meshsyncControllerState = useSelector((state) => state.get('controllerState')); - const { getControllerStatesByConnectionID } = useControllerStatus(meshsyncControllerState); - - return k8sContexts.filter((ctx) => { - const operatorsStatus = getControllerStatesByConnectionID(ctx.connection_id); - return predicate({ ...operatorsStatus, context: ctx }); - }); -}; diff --git a/ui/components/hooks/useTelemetryHook.js b/ui/components/hooks/useTelemetryHook.js deleted file mode 100644 index 4dad8694b44..00000000000 --- a/ui/components/hooks/useTelemetryHook.js +++ /dev/null @@ -1,72 +0,0 @@ -import { CONNECTION_KINDS } from '@/utils/Enum'; -import { useNotification } from '@/utils/hooks/useNotification'; -import dataFetch from 'lib/data-fetch'; -import { EVENT_TYPES } from 'lib/event-types'; -import { updateProgress } from 'lib/store'; -import { useDispatch } from 'react-redux'; - -export function useTelemetryHook(connectionType) { - switch (connectionType) { - case CONNECTION_KINDS.PROMETHEUS: - return PingPrometheus(); - case CONNECTION_KINDS.GRAFANA: - return PingGrafana(); - } -} - -function PingPrometheus() { - const { notify } = useNotification(); - const dispatch = useDispatch(); - const ping = (name, server, connectionID) => { - dispatch(updateProgress({ showProgress: true })); - dataFetch( - `/api/telemetry/metrics/ping/${connectionID}`, - { - credentials: 'include', - }, - (result) => { - if (typeof result !== 'undefined') { - notify({ - message: `Prometheus connection "${name}" pinged at ${server}`, - event_type: EVENT_TYPES.SUCCESS, - }); - } - }, - self.handleError, - ); - dispatch(updateProgress({ showProgress: false })); - }; - return ping; -} - -function PingGrafana() { - const { notify } = useNotification(); - const dispatch = useDispatch(); - const ping = (name, server, connectionID) => { - dispatch(updateProgress({ showProgress: true })); - dataFetch( - `/api/telemetry/metrics/grafana/ping/${connectionID}`, - { - credentials: 'include', - }, - (result) => { - if (typeof result !== 'undefined') { - notify({ - message: `Grafana connection "${name}" pinged at ${server}`, - event_type: EVENT_TYPES.SUCCESS, - }); - } - }, - self.handleError, - ); - dispatch(updateProgress({ showProgress: false })); - }; - return ping; -} - -export function withTelemetryHook(Component, telemetryConnType) { - return function CompWrappedWithTelemetryHook(props) { - const ping = useTelemetryHook(telemetryConnType); - return ; - }; -} diff --git a/ui/components/hooks/useTestIDs.js b/ui/components/hooks/useTestIDs.js deleted file mode 100644 index c8ce63aa15f..00000000000 --- a/ui/components/hooks/useTestIDs.js +++ /dev/null @@ -1,7 +0,0 @@ -import { useMemo } from 'react'; - -const useTestIDsGenerator = (prefix) => { - return useMemo(() => (identifier) => `${prefix}-${identifier}`, [prefix]); -}; - -export default useTestIDsGenerator; diff --git a/ui/components/layout.js b/ui/components/layout.js deleted file mode 100644 index 7f2eba5b038..00000000000 --- a/ui/components/layout.js +++ /dev/null @@ -1,11 +0,0 @@ -import Header from './Header'; - -const layoutStyle = { margin: 20, padding: 20, border: '1px solid #DDD' }; - -const Layout = (props) => ( -
-
- {props.children} -
-); -export default Layout; diff --git a/ui/components/load-test-timer-dialog.js b/ui/components/load-test-timer-dialog.js deleted file mode 100644 index af72af09f70..00000000000 --- a/ui/components/load-test-timer-dialog.js +++ /dev/null @@ -1,59 +0,0 @@ -import React, { useState, useEffect } from 'react'; -import { NoSsr } from '@material-ui/core'; - -let ReactCountdownClock; -if (typeof window !== 'undefined') { - ReactCountdownClock = require('react-countdown-clock'); -} - -const LoadTestTimerDialog = ({ countDownComplete, t, open }) => { - const [dur, setDur] = useState(0); - - useEffect(() => { - let tNum = 0; - try { - tNum = parseInt(t.substring(0, t.length - 1)); - } catch (ex) { - console.error('Unexpected Error'); - } - - switch (t.substring(t.length - 1, t.length).toLowerCase()) { - case 'h': - setDur(tNum * 60 * 60); - break; - case 'm': - setDur(tNum * 60); - break; - default: - setDur(tNum); - } - }, [t]); - - if (!open) { - return null; - } - - return ( - -
- -
-
- ); -}; - -export default LoadTestTimerDialog; diff --git a/ui/components/multi-select-wrapper.js b/ui/components/multi-select-wrapper.js deleted file mode 100644 index 6f1157e0df7..00000000000 --- a/ui/components/multi-select-wrapper.js +++ /dev/null @@ -1,223 +0,0 @@ -import { useState } from 'react'; -import { components } from 'react-select'; -import CreatableSelect from 'react-select/creatable'; -import theme, { Colors } from '../themes/app'; -import { MenuItem } from '@material-ui/core'; -import { Paper } from '@material-ui/core'; -import { FormControlLabel } from '@material-ui/core'; -import { Checkbox } from '@layer5/sistent'; -import { UsesSistent } from './SistentWrapper'; - -const MultiSelectWrapper = (props) => { - const [selectInput, setSelectInput] = useState(''); - const allOption = { value: '*' }; - - const filterOptions = (options, input) => - options?.filter(({ label }) => label?.toLowerCase().includes(input.toLowerCase())); - - const comparator = (v1, v2) => { - if (v1.value === '*') return 1; - else if (v2.value === '*') return -1; - - return v1.label?.localeCompare(v2.label); - }; - - let filteredOptions = filterOptions(props.options, selectInput).sort(comparator); - let filteredSelectedOptions = filterOptions(props.value, selectInput).sort(comparator); - - const Option = (props) => { - return ( - - 0 ? ( - - { - if (input) input.indeterminate = true; - }} - style={{ - padding: '0', - }} - /> - - ) : ( - - {}} - style={{ - padding: '0', - }} - /> - - ) - } - label={{props.label}} - /> - - ); - }; - - const CustomInput = (props) => { - return selectInput.length === 0 ? ( - - {props.children} - - ) : ( -
- - {props.children} - -
- ); - }; - - const Menu = (props) => { - return ( - - {props.children} - - ); - }; - - const customFilterOption = ({ value, label }, input) => - (value !== '*' && label?.toLowerCase().includes(input.toLowerCase())) || - (value === '*' && filteredOptions?.length > 0); - - const onInputChange = (inputValue, event) => { - if (event.action === 'input-change') setSelectInput(inputValue); - else if (event.action === 'menu-close' && selectInput !== '') setSelectInput(''); - }; - - const onKeyDown = (e) => { - if ((e.key === ' ' || e.key === 'Enter') && !selectInput) e.preventDefault(); - }; - - const handleChange = (selected) => { - if ( - selected.length > 0 && - (selected[selected.length - 1].value === allOption.value || - JSON.stringify(filteredOptions.sort(comparator)) === - JSON.stringify(selected.sort(comparator))) - ) { - setSelectInput(''); - return props.onChange( - [ - ...(props.value ?? []), - ...props.options.filter( - ({ label }) => - label?.toLowerCase().includes(selectInput?.toLowerCase()) && - (props.value ?? []).filter((opt) => opt.label === label).length === 0, - ), - ].sort(comparator), - [], - ); - } else if ( - selected.length > 0 && - selected[selected.length - 1].value !== allOption.value && - JSON.stringify(selected.sort(comparator)) !== JSON.stringify(filteredOptions.sort(comparator)) - ) { - let filteredUnselectedOptions = filteredSelectedOptions.filter( - (opts) => !selected.some((sel) => sel.value === opts.value), - ); - setSelectInput(''); - return props.onChange(selected, filteredUnselectedOptions); - } else { - setSelectInput(''); - return props.onChange( - [ - ...props.value.filter( - ({ label }) => !label.toLowerCase().includes(selectInput?.toLowerCase()), - ), - ], - filteredSelectedOptions.length == 1 ? filteredSelectedOptions : props.options, - ); - } - }; - - const customStyles = { - multiValueLabel: (def) => ({ - ...def, - backgroundColor: 'lightgray', - }), - multiValueRemove: (def) => ({ - ...def, - backgroundColor: 'lightgray', - }), - valueContainer: (base) => ({ - ...base, - maxHeight: '65px', - overflow: 'auto', - }), - control: (base) => ({ - ...base, - backgroundColor: base.backgroundColor2, - borderColor: Colors.keppelGreen, - color: Colors.keppelGreen, - boxShadow: 'none', - '&:hover': { - borderColor: Colors.keppelGreen, - }, - '&$focused': { - borderColor: '#00B39F', - }, - }), - menu: (base) => ({ - ...base, - backgroundColor: base.backgroundColor2, - }), - }; - - return ( - ({ - ...selectTheme, - colors: { - ...selectTheme.colors, - backgroundColor2: - theme.palette.type === 'dark' ? theme.palette.secondary.mainBackground : '#fff', - }, - })} - isMulti - closeMenuOnSelect={false} - tabSelectsValue={false} - backspaceRemovesValue={false} - hideSelectedOptions={false} - isDisabled={props.updating} - blurInputOnSelect={false} - /> - ); -}; - -export default MultiSelectWrapper; diff --git a/ui/components/reusable-tooltip.js b/ui/components/reusable-tooltip.js deleted file mode 100644 index f3f238d89e5..00000000000 --- a/ui/components/reusable-tooltip.js +++ /dev/null @@ -1,25 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { Tooltip } from '@mui/material'; - -const ReusableTooltip = ({ title, children, onClick, placement }) => { - return ( - - {children} - - ); -}; - -ReusableTooltip.propTypes = { - title: PropTypes.string.isRequired, - children: PropTypes.node.isRequired, - onClick: PropTypes.func, - placement: PropTypes.string, -}; - -ReusableTooltip.defaultProps = { - onClick: () => {}, - // placement: "top", -}; - -export default ReusableTooltip; diff --git a/ui/components/schemas/credentials/grafana.js b/ui/components/schemas/credentials/grafana.js deleted file mode 100644 index 7858b0d60ea..00000000000 --- a/ui/components/schemas/credentials/grafana.js +++ /dev/null @@ -1,30 +0,0 @@ -export const grafanaSchema = { - type: 'object', - title: 'Grafana', - properties: { - credentialName: { - title: 'Credential Name', - type: 'string', - description: 'Name of your credential', - }, - secret: { - type: 'object', - title: 'Credential Secret', - description: 'Credential secret for the Grafana instance', - properties: { - grafanaURL: { - type: 'string', - title: 'URL', - description: 'URL of the Grafana instance', - }, - grafanaAPIKey: { - type: 'string', - title: 'API Key', - description: 'API Key for the Grafana instance', - }, - }, - required: ['grafanaURL', 'grafanaAPIKey'], - }, - }, - required: ['credentialName'], -}; diff --git a/ui/components/schemas/credentials/kubernetes.js b/ui/components/schemas/credentials/kubernetes.js deleted file mode 100644 index 424cda2d9f2..00000000000 --- a/ui/components/schemas/credentials/kubernetes.js +++ /dev/null @@ -1,69 +0,0 @@ -export const kubernetesSchema = { - type: 'object', - title: 'Kubernetes', - properties: { - credentialName: { - title: 'Credential Name', - type: 'string', - description: 'Name of your credential', - }, - secret: { - type: 'object', - title: 'Credential Secret', - description: 'Credential secret for the Kubernetes cluster', - properties: { - clusterName: { - type: 'string', - title: 'Cluster Name', - description: 'Name of the Kubernetes cluster', - }, - clusterServerURL: { - type: 'string', - title: 'Server URL', - description: 'URL of the Kubernetes cluster', - }, - auth: { - type: 'object', - title: 'Auth', - description: 'Kubernetes cluster authentication', - properties: { - clusterUserName: { - type: 'string', - title: 'User Name', - description: 'Name of the Kubernetes cluster user', - }, - clusterToken: { - type: 'string', - title: 'Token', - description: 'Token of the Kubernetes cluster user', - }, - clusterClientCertificateData: { - type: 'string', - title: 'Client Certificate Data', - description: 'Certificate data of the Kubernetes cluster', - }, - clusterClientKeyData: { - type: 'string', - title: 'Client Key Data', - description: 'Client Key data of the Kubernetes cluster', - }, - clusterCertificateAuthorityData: { - type: 'string', - title: 'Certificate Authority Data', - description: 'Certificate Authority data of the Kubernetes cluster', - }, - }, - required: [ - 'clusterUserName', - 'clusterToken', - 'clusterClientCertificateData', - 'clusterClientKeyData', - 'clusterCertificateAuthorityData', - ], - }, - }, - required: ['clusterName', 'clusterServerURL'], - }, - }, - required: ['credentialName'], -}; diff --git a/ui/components/schemas/credentials/prometheus.js b/ui/components/schemas/credentials/prometheus.js deleted file mode 100644 index e4d487f3f12..00000000000 --- a/ui/components/schemas/credentials/prometheus.js +++ /dev/null @@ -1,25 +0,0 @@ -export const prometheusSchema = { - type: 'object', - title: 'Prometheus', - properties: { - credentialName: { - title: 'Credential Name', - type: 'string', - description: 'Name of your credential', - }, - secret: { - type: 'object', - title: 'Credential Secret', - description: 'Credential secret for the Prometheus instance', - properties: { - prometheusURL: { - type: 'string', - title: 'URL', - description: 'URL of the Prometheus instance', - }, - }, - required: ['prometheusURL'], - }, - }, - required: ['credentialName'], -}; diff --git a/ui/components/shapes/Octagon.js b/ui/components/shapes/Octagon.js deleted file mode 100644 index 6dfd450c730..00000000000 --- a/ui/components/shapes/Octagon.js +++ /dev/null @@ -1,27 +0,0 @@ -export default function RedOctagonSvg({ fill, ...otherProps }) { - return ( -
- - - -
- ); -} diff --git a/ui/components/shapes/RoundedTriangle.js b/ui/components/shapes/RoundedTriangle.js deleted file mode 100644 index 35e7982c000..00000000000 --- a/ui/components/shapes/RoundedTriangle.js +++ /dev/null @@ -1,12 +0,0 @@ -export function RoundedTriangleShape({ color }) { - return ( - - - - ); -} diff --git a/ui/components/subscription/comparatorFns.js b/ui/components/subscription/comparatorFns.js deleted file mode 100644 index 4cea34f7026..00000000000 --- a/ui/components/subscription/comparatorFns.js +++ /dev/null @@ -1,47 +0,0 @@ -import _ from 'lodash'; -import { isControllerObjectEqual } from './helpers'; - -export function isMeshSyncSubscriptionDataUpdated(currentState, newData) { - if (!currentState) { - return true; - } - - const oldData = currentState.find((data) => data.contextID === newData.contextID); - if (!oldData) { - return true; - } - - return !_.isEqual(oldData, newData); -} - -export function isOperatorStateSubscriptionDataUpdated(currentState, newData) { - if (!currentState) { - return true; - } - - const oldData = currentState.find((data) => data.contextID === newData.contextID); - if (!oldData) { - return true; - } - - return !_.isEqual(oldData, newData); -} - -export function isMesheryControllerStateSubscriptionDataUpdated(currentState, newData) { - if (!currentState) { - return true; - } - - const oldData = currentState.filter((data) => { - for (let newControllerData of newData) { - if (isControllerObjectEqual(newControllerData, data)) { - return true; - } - } - return false; - }); - if (!oldData) { - return true; - } - return !_.isEqual(oldData, newData); -} diff --git a/ui/components/subscription/helpers.js b/ui/components/subscription/helpers.js deleted file mode 100644 index dcae973ff17..00000000000 --- a/ui/components/subscription/helpers.js +++ /dev/null @@ -1,35 +0,0 @@ -import subscribeMesheryControllersStatus from '../graphql/subscriptions/MesheryControllersStatusSubscription'; -import { isMesheryControllerStateSubscriptionDataUpdated } from './comparatorFns'; -import { mergeMesheryController } from './mergeFns'; - -// export const MESHSYNC_EVENT_SUBSCRIPTION = 'MESHSYNC_EVENT_SUBSCRIPTION'; -// export const OPERATOR_EVENT_SUBSCRIPTION = 'OPERATOR_EVENT_SUBSCRIPTION'; -export const MESHERY_CONTROLLER_SUBSCRIPTION = 'MESHERY_CONTROLLER_SUBSCRIPTION'; - -export const fnMapping = { - // MESHSYNC_EVENT_SUBSCRIPTION : { - // eventName : "listenToMeshSyncEvents", - // comparatorFn : isMeshSyncSubscriptionDataUpdated, - // subscriptionFn : subscribeMeshSyncStatusEvents, - // mergeFn : mergeMeshSyncSubscription - // }, - MESHERY_CONTROLLER_SUBSCRIPTION: { - eventName: 'subscribeMesheryControllersStatus', - subscriptionFn: subscribeMesheryControllersStatus, - mergeFn: mergeMesheryController, - comparatorFn: isMesheryControllerStateSubscriptionDataUpdated, - }, - // OPERATOR_EVENT_SUBSCRIPTION: { - // eventName: 'operator', - // comparatorFn: isOperatorStateSubscriptionDataUpdated, - // subscriptionFn: subscribeOperatorStatusEvents, - // mergeFn: mergeOperatorStateSubscription, - // }, -}; - -export function isControllerObjectEqual(oldController, newController) { - return ( - newController.contextId === oldController.contextId && - newController.controller === oldController.controller - ); -} diff --git a/ui/components/subscription/index.js b/ui/components/subscription/index.js deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/ui/components/subscription/mergeFns.js b/ui/components/subscription/mergeFns.js deleted file mode 100644 index fef770b7e41..00000000000 --- a/ui/components/subscription/mergeFns.js +++ /dev/null @@ -1,39 +0,0 @@ -import { isControllerObjectEqual } from './helpers'; - -export function mergeMeshSyncSubscription(currentState, newData) { - if (!currentState) { - return [newData]; - } - - return [...currentState.filter((data) => data.contextID !== newData.contextID), newData]; -} - -export function mergeOperatorStateSubscription(currentState, newData) { - // the merger function for both are same - return mergeMeshSyncSubscription(currentState, newData); -} - -export function mergeMesheryController(currentState, newData) { - if (!currentState) { - return newData; - } - const merged = [ - ...currentState.filter((data) => { - for (let newControllerData of newData) { - if (isControllerObjectEqual(newControllerData, data)) { - console.log( - 'CONTROLLER INSIDE MERGE LOOP: ', - newControllerData.controller, - data.controller, - newControllerData?.status, - data?.status, - ); - return false; - } - } - return true; - }), - ...newData, - ]; - return merged; -} diff --git a/ui/components/subscription/subscriptionhandler.js b/ui/components/subscription/subscriptionhandler.js deleted file mode 100644 index 2a346329672..00000000000 --- a/ui/components/subscription/subscriptionhandler.js +++ /dev/null @@ -1,52 +0,0 @@ -import { fnMapping } from './helpers'; - -/** - * A GraphQL subscription controller - */ -export class GQLSubscription { - subscription; - state; - callbackFunction; - connectionIDs; - type; - - constructor({ type, connectionIDs, callbackFunction }) { - this.type = type; - this.connectionIDs = connectionIDs || []; - this.callbackFunction = callbackFunction; - } - - setState = (newState) => { - this.state = newState; - }; - - initSubscription = () => { - if (!this.type) { - throw new Error('Subscription Type is Empty, initialise a subscription in a constructor'); - } - - this.updateSubscription(this.connectionIDs); - }; - - doCallback = (data) => { - // assuming the data is in stream and contextId being the key to the data - data = data[fnMapping[this.type].eventName]; - if (fnMapping[this.type]?.comparatorFn(this.state, data)) { - // returns true if data is updated - this.setState(fnMapping[this.type].mergeFn(this.state, data)); - - this.callbackFunction(this.state); - } - }; - - flushSubscription = () => { - if (this.subscription) { - this.subscription.dispose(); - } - }; - - updateSubscription = (connectionIDs) => { - this.flushSubscription(); - this.subscription = fnMapping[this.type].subscriptionFn(this.doCallback, connectionIDs); - }; -} diff --git a/ui/components/telemetry/grafana/GrafanaCharts.js b/ui/components/telemetry/grafana/GrafanaCharts.js deleted file mode 100644 index ebea4504430..00000000000 --- a/ui/components/telemetry/grafana/GrafanaCharts.js +++ /dev/null @@ -1,130 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { withStyles } from '@material-ui/core/styles'; -import { NoSsr, Grid, ExpansionPanelDetails, Typography } from '@material-ui/core'; -import ExpandMoreIcon from '@material-ui/icons/ExpandMore'; -import LazyLoad from 'react-lazyload'; -import GrafanaDateRangePicker from './GrafanaDateRangePicker'; -import { ExpansionPanel, ExpansionPanelSummary } from '../../ExpansionPanels'; - -const grafanaStyles = (theme) => ({ - wrapper: { width: '100%' }, - column: { flexBasis: '33.33%' }, - heading: { fontSize: theme.typography.pxToRem(15) }, - secondaryHeading: { fontSize: theme.typography.pxToRem(15), color: theme.palette.text.secondary }, - dateRangePicker: { - display: 'flex', - justifyContent: 'flex-end', - marginRight: theme.spacing(1), - marginBottom: theme.spacing(2), - }, - iframe: { minHeight: theme.spacing(55), minWidth: theme.spacing(55) }, -}); - -class GrafanaCharts extends Component { - constructor(props) { - super(props); - - const startDate = new Date(); - startDate.setMinutes(startDate.getMinutes() - 5); - this.state = { - startDate, - from: 'now-5m', - endDate: new Date(), - to: 'now', - liveTail: true, - refresh: '10s', - }; - } - - updateDateRange = (from, startDate, to, endDate, liveTail, refresh) => { - this.setState({ - from, - startDate, - to, - endDate, - liveTail, - refresh, - }); - }; - - render() { - const { from, startDate, to, endDate, liveTail, refresh } = this.state; - const { classes, boardPanelConfigs } = this.props; - let { grafanaURL } = this.props; - if (grafanaURL.endsWith('/')) { - grafanaURL = grafanaURL.substring(0, grafanaURL.length - 1); - } - return ( - - -
-
- -
- {boardPanelConfigs.map((config, ind) => ( - // - - }> -
- - {config.board.title} - -
-
- - {config.templateVars && config.templateVars.length > 0 - ? `Template variables: ${config.templateVars.join(' ')}` - : ''} - -
-
- - - {config.panels.map((panel, ind) => ( - - - `, - }} - /> - {/* End Google Tag Manager (noscript) */} - -
- - - - ); - } -} - -MesheryDocument.getInitialProps = (ctx) => { - // resolution order - // - // on the server: - // 1. app.getInitialProps - // 2. page.getInitialProps - // 3. document.getInitialProps - // 4. app.render - // 5. page.render - // 6. document.render - // - // on the server with error: - // 1. document.getInitialProps - // 2. app.render - // 3. page.render - // 4. document.render - // - // on the client - // 1. app.getInitialProps - // 2. page.getInitialProps - // 3. app.render - // 4. page.render - - // render app and page and get the context of the page with collected side effects. - let pageContext; - const page = ctx.renderPage((Component) => { - const WrappedComponent = (props) => { - pageContext = props.pageContext; - return ; - }; - - WrappedComponent.propTypes = { - pageContext: PropTypes.object.isRequired, - }; - - return WrappedComponent; - }); - - let css; - // it might be undefined, e.g. after an error. - if (pageContext) { - css = pageContext.sheetsRegistry.toString(); - } - return { - ...page, - pageContext, - // styles fragment is rendered after the app and page rendering finish. - styles: ( - - Asset 3 \ No newline at end of file diff --git a/ui/public/static/img/app_mesh-light.svg b/ui/public/static/img/app_mesh-light.svg deleted file mode 100644 index 9c524b0c8c2..00000000000 --- a/ui/public/static/img/app_mesh-light.svg +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/app_mesh.svg b/ui/public/static/img/app_mesh.svg deleted file mode 100644 index 3a5c312df31..00000000000 --- a/ui/public/static/img/app_mesh.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/public/static/img/artifact-hub-color.svg b/ui/public/static/img/artifact-hub-color.svg deleted file mode 100644 index b6ee08e70b6..00000000000 --- a/ui/public/static/img/artifact-hub-color.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/aws-light.svg b/ui/public/static/img/aws-light.svg deleted file mode 100644 index 5338a4a46d1..00000000000 --- a/ui/public/static/img/aws-light.svg +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/aws.svg b/ui/public/static/img/aws.svg deleted file mode 100644 index 748975ea442..00000000000 --- a/ui/public/static/img/aws.svg +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/cilium_service_mesh-light.svg b/ui/public/static/img/cilium_service_mesh-light.svg deleted file mode 100644 index c336ca9676c..00000000000 --- a/ui/public/static/img/cilium_service_mesh-light.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/cilium_service_mesh.svg b/ui/public/static/img/cilium_service_mesh.svg deleted file mode 100644 index fc30aa90aef..00000000000 --- a/ui/public/static/img/cilium_service_mesh.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/citrix_service_mesh-light.svg b/ui/public/static/img/citrix_service_mesh-light.svg deleted file mode 100644 index 07b9d7dd07c..00000000000 --- a/ui/public/static/img/citrix_service_mesh-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/citrix_service_mesh-white.svg b/ui/public/static/img/citrix_service_mesh-white.svg deleted file mode 100644 index 339f6062968..00000000000 --- a/ui/public/static/img/citrix_service_mesh-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/citrix_service_mesh.svg b/ui/public/static/img/citrix_service_mesh.svg deleted file mode 100644 index 2efea0a1b57..00000000000 --- a/ui/public/static/img/citrix_service_mesh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/citrixservicemesh.svg b/ui/public/static/img/citrixservicemesh.svg deleted file mode 100644 index 2efea0a1b57..00000000000 --- a/ui/public/static/img/citrixservicemesh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/clone-white.svg b/ui/public/static/img/clone-white.svg deleted file mode 100644 index 8d83b1d96d3..00000000000 --- a/ui/public/static/img/clone-white.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui/public/static/img/clone.svg b/ui/public/static/img/clone.svg deleted file mode 100644 index aa7fb67268b..00000000000 --- a/ui/public/static/img/clone.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/component-svg/_.txt b/ui/public/static/img/component-svg/_.txt deleted file mode 100644 index 050238bef96..00000000000 --- a/ui/public/static/img/component-svg/_.txt +++ /dev/null @@ -1,7 +0,0 @@ -This is information txt - -The svgs are used as component svgs in Meshery and Meshery-Extensions - -1. The alternate version of these svgs are available in the ../img folder - -The svgs written here will mostly be of solid background instead of transparent diff --git a/ui/public/static/img/component-svg/kubernetes/cluster-role-binding.svg b/ui/public/static/img/component-svg/kubernetes/cluster-role-binding.svg deleted file mode 100644 index f358464ceea..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/cluster-role-binding.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/kubernetes/cluster-role.svg b/ui/public/static/img/component-svg/kubernetes/cluster-role.svg deleted file mode 100644 index cb3820de594..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/cluster-role.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/kubernetes/core-dns.svg b/ui/public/static/img/component-svg/kubernetes/core-dns.svg deleted file mode 100644 index 504ebd76a95..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/core-dns.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/kubernetes/cronjob.svg b/ui/public/static/img/component-svg/kubernetes/cronjob.svg deleted file mode 100644 index aef1997c492..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/cronjob.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/kubernetes/daemonset.svg b/ui/public/static/img/component-svg/kubernetes/daemonset.svg deleted file mode 100644 index b65784743a2..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/daemonset.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/kubernetes/etcd.svg b/ui/public/static/img/component-svg/kubernetes/etcd.svg deleted file mode 100644 index fb76c6c3064..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/etcd.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/kubernetes/kubernetes.svg b/ui/public/static/img/component-svg/kubernetes/kubernetes.svg deleted file mode 100644 index c65e39f6e7a..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/kubernetes.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/kubernetes/matchLabels.svg b/ui/public/static/img/component-svg/kubernetes/matchLabels.svg deleted file mode 100644 index 8bc2470c846..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/matchLabels.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/component-svg/kubernetes/namespace.svg b/ui/public/static/img/component-svg/kubernetes/namespace.svg deleted file mode 100644 index 39b0bf66e36..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/namespace.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/ui/public/static/img/component-svg/kubernetes/secret.svg b/ui/public/static/img/component-svg/kubernetes/secret.svg deleted file mode 100644 index 0f7d102021f..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/secret.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/kubernetes/security-account.svg b/ui/public/static/img/component-svg/kubernetes/security-account.svg deleted file mode 100644 index 0181dd931fd..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/security-account.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/kubernetes/volume.svg b/ui/public/static/img/component-svg/kubernetes/volume.svg deleted file mode 100644 index 1705bfb1f34..00000000000 --- a/ui/public/static/img/component-svg/kubernetes/volume.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/meshery.svg b/ui/public/static/img/component-svg/meshery.svg deleted file mode 100644 index d589d8efcbd..00000000000 --- a/ui/public/static/img/component-svg/meshery.svg +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/component-svg/meshsync.svg b/ui/public/static/img/component-svg/meshsync.svg deleted file mode 100644 index ff73e431f5a..00000000000 --- a/ui/public/static/img/component-svg/meshsync.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/component-svg/nats.svg b/ui/public/static/img/component-svg/nats.svg deleted file mode 100644 index dcb812b0225..00000000000 --- a/ui/public/static/img/component-svg/nats.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/operator-light.svg b/ui/public/static/img/component-svg/operator-light.svg deleted file mode 100644 index 7fda35d2955..00000000000 --- a/ui/public/static/img/component-svg/operator-light.svg +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/service-mesh/appmesh.svg b/ui/public/static/img/component-svg/service-mesh/appmesh.svg deleted file mode 100644 index c6801b602c1..00000000000 --- a/ui/public/static/img/component-svg/service-mesh/appmesh.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/component-svg/service-mesh/cilium.svg b/ui/public/static/img/component-svg/service-mesh/cilium.svg deleted file mode 100644 index e96ec12e01c..00000000000 --- a/ui/public/static/img/component-svg/service-mesh/cilium.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui/public/static/img/component-svg/service-mesh/consul.svg b/ui/public/static/img/component-svg/service-mesh/consul.svg deleted file mode 100644 index 2ff9f846cf8..00000000000 --- a/ui/public/static/img/component-svg/service-mesh/consul.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/service-mesh/istio.svg b/ui/public/static/img/component-svg/service-mesh/istio.svg deleted file mode 100644 index 9324ab0939a..00000000000 --- a/ui/public/static/img/component-svg/service-mesh/istio.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/public/static/img/component-svg/service-mesh/kuma.svg b/ui/public/static/img/component-svg/service-mesh/kuma.svg deleted file mode 100644 index 326a877ad4f..00000000000 --- a/ui/public/static/img/component-svg/service-mesh/kuma.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/ui/public/static/img/component-svg/service-mesh/linkerd.svg b/ui/public/static/img/component-svg/service-mesh/linkerd.svg deleted file mode 100644 index 37ac12d6a8d..00000000000 --- a/ui/public/static/img/component-svg/service-mesh/linkerd.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/ui/public/static/img/component-svg/service-mesh/nginx.svg b/ui/public/static/img/component-svg/service-mesh/nginx.svg deleted file mode 100644 index 2d2de5e6870..00000000000 --- a/ui/public/static/img/component-svg/service-mesh/nginx.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/ui/public/static/img/component-svg/service-mesh/osm.svg b/ui/public/static/img/component-svg/service-mesh/osm.svg deleted file mode 100644 index 8e10db51a15..00000000000 --- a/ui/public/static/img/component-svg/service-mesh/osm.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/component-svg/service-mesh/traefik-mesh.svg b/ui/public/static/img/component-svg/service-mesh/traefik-mesh.svg deleted file mode 100644 index 0161e8ab348..00000000000 --- a/ui/public/static/img/component-svg/service-mesh/traefik-mesh.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/configuration_trans.svg b/ui/public/static/img/configuration_trans.svg deleted file mode 100644 index 4cff214e724..00000000000 --- a/ui/public/static/img/configuration_trans.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/connection-light.svg b/ui/public/static/img/connection-light.svg deleted file mode 100644 index 563221e2e4a..00000000000 --- a/ui/public/static/img/connection-light.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/connection.svg b/ui/public/static/img/connection.svg deleted file mode 100644 index 563221e2e4a..00000000000 --- a/ui/public/static/img/connection.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/connection_wizard/connection-wizard-green.svg b/ui/public/static/img/connection_wizard/connection-wizard-green.svg deleted file mode 100644 index 9d8a45ef262..00000000000 --- a/ui/public/static/img/connection_wizard/connection-wizard-green.svg +++ /dev/null @@ -1 +0,0 @@ -connection-wizard-green \ No newline at end of file diff --git a/ui/public/static/img/connection_wizard/connection-wizard-white.svg b/ui/public/static/img/connection_wizard/connection-wizard-white.svg deleted file mode 100644 index a5dfa29da0f..00000000000 --- a/ui/public/static/img/connection_wizard/connection-wizard-white.svg +++ /dev/null @@ -1 +0,0 @@ -connection-wizard-white \ No newline at end of file diff --git a/ui/public/static/img/connection_wizard/nav_icon.png b/ui/public/static/img/connection_wizard/nav_icon.png deleted file mode 100644 index fb105b4d0ebc7c3474e49b1038e7ec68264e30ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3019 zcmV;+3pDhJP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt010qNS#tmY3labT3lag+-G2N4000McNliru

T1FDVR{eu)48 z3cg81K~#9!<()f->&h9&RT~TfcMAqpt_|C{61YhtFkEoJm8vCdWl$GzP;qgU1w)E^ zy_GAc2n54IYE?<&!cBTJd$?V|Wr_>`TZ|s_lt!A7*C#nso%Pt7-#osTzM1jhDa%;% z_wTC=Fu@!VW|+vIidE-GurEu3IR-s7>j}?z#&d7jGi(@=J@$zC4qz)s*a?;Q*kgyt zaigA*BEz{XN31Y(`h>BBU6j{qD68?-Ri^#rs!>C{G0;`X5IP+1T@A|yBNn|L+#URc z8*QuKRwE8Re(H2WYh=lHldIom`KafT|K_U%oQlL+{l|ADc%YJEOIn_TJ zz|S~iWr-eZSVr6@d(0^MmZ?0FdU4}u(kBMsXJmM?c*aPc*4#kum`^`&2bP+4W z;zltyeeenY+St-cyUzrH-=N$^4=(2BtlqAjzk7^ClV)6F(%5L+`zW_Tt=A#2@O`z% zj+-jHAv>{Xl(|V`XU8u&OMS$#Yf86wOvVXC@=cORBifwST0iCQ;xjepq2>7PsR zck7Up9=x`65B`iF0=+YMJ9L-uZqO~j+oHRJcY$sN-X7f*ygj-lco%dx@V4mI;N8$& zz}ula0Pl)!4{w9cgYUY5cSpB{?~X2lcNVqoUh<6Zg6<654!sjR2}nrN&+WJD+aKWJ zpZGgctP#S$FSspw3wYv_m>kHJpe!jou>USXjHp*|dvqgsG9?FcW1!XO^xqY!at1gC zcY)pjPXdxj&~@klaFcv@=iqM8weZ9zK0FeVOG|W`UJ~>P?h0KAPeO7dAp%U{k+{W# zkKvIJ9#Uio`T}={F2R$OfPjPu0UY2HKmSV|`VA?35|9%CJfr|_2>StdiO#_P`qQ_+ z<#-f5U%eDci+(^re3H`nk)s2^k9~lC}r}BbZ`7C;d5FUvu<;S2G z@H@9ToUU^eW9&Zv#f&VAP7$k>U!do!o7V&!I`E@waQEom=U=(?ETRLz4nFb8j->F) z)qN0!pnwki-gQeI{~TEh2r6{ohIRf8W_359-z;8n_m57d5`r3?jy?U3#^90Afy*PK zUkuUd>h`JGLe@s34!}_=X)ovt&OOng7pt3!IlA%>2IwwRh@GPQI3R#0tXvWO#H{W@ z!r!olN2awBzR&`@M?_D#5mljI1l`T*^(#Vt)^O`H0kTeZ}&sBr&<>=&5o&tK65eCOoA1JP{>GU?jul0fI82O&W|9M{!@kWTX%esE#z#lizXx=W9Al zhh8oYSLh#>KeMiR$D%{O6b7=c)9!|hG~a1aIeTYQ zXHQWUN;OnwM<`!0>z&qXsqK4st6lg{HNBTiYr|pTAg2)S`g$qU)5!& zhCMb%GY5=!^N(6jXV@}8Rao2s0$zL>q!ujl)Phjq=z@U6jT?;AYyN|mRkDIOO8sQA z+i;&Hb8j7FVLEw~t`7G&@q79Adm4O0siOlpB? zLW%#-==<|! zUDVyIUcVTm3_6B)55C79yI=kxpsRGZE>V<6zu`}|dz<=3pYhwTa)B2j)aq`N^x!L| z;x9iMx}texN-iXXuhrd6o?D7jF4cR1?+v^NHfRGC_5S)49;eKDfbSJNkF*?GZveR} zOjhUcJ%clWrmG=(rachKG5j6CnGD*rCVA|J6V?b^J*{u_PE8>pS&;OXzx?OrzajS6 zBSnay&nLP^w`)cfKDy^qouJz`p)0!hLV3fvXC1^icmyF>2`uTQS-4}6FhE@3T0YIS6%9=Efz!pzPSUqNuJixp%dM3E~*Ng9y==^p*y!~)^qRYgv;F1Bhpbl2u*>rC9{GH;CC zY}FScG_RlJ!O@qcc+=IW>VrS#x?hPi3(wAl}*|IH5en_UaOn#nDe7re-YT$%9?w+iy@oT zm}k6^JK)6_JvV<)_F?2SGSk2N!n14`?LOe{2FVRse(~!s{d=`+l*x`dyNm2-5ietm zv6LM0(tY7=-`cAlEz7WW#eZ0asZ1Sk#%ZNrc&(|NIJ~HK)k}cN9Dc`#DhkzbpDSvI zSaI;M1&C3HntbYx+4WjbwdWNBu305UK#F)c7SEip7yFf}?fF*-9jD=;uRFfeKS$xr|Q N002ovPDHLkV1oQEw=w_# diff --git a/ui/public/static/img/consul-light.svg b/ui/public/static/img/consul-light.svg deleted file mode 100644 index 0bc08c26301..00000000000 --- a/ui/public/static/img/consul-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/consul-white.svg b/ui/public/static/img/consul-white.svg deleted file mode 100644 index d5f23bd2048..00000000000 --- a/ui/public/static/img/consul-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/consul.svg b/ui/public/static/img/consul.svg deleted file mode 100644 index 37f5d696b22..00000000000 --- a/ui/public/static/img/consul.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/dashboard-screenshot.png b/ui/public/static/img/dashboard-screenshot.png deleted file mode 100644 index 7da89040e28a1d7209d6eb8a02c92e18229f606e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420324 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

u?~`GHOoHAjBywECJAt-91_YVByQ4%jrac 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

(BYH z6wrP7L7d~zOQ0^h&FOi+P>QJ4^ovX=V0Ov!n=j13KhNc6S-6k?1rKb@3A|gtePXeN zbmZShX%Rq`CLolD@}>G50u<9A#)*9#5XY5^mf&FlE~5$PmZ1ZtC{94U<-N=?UJE|90?#uU@#OY!GHu5^Yz)*??A!*MudpTWbi=1 z>4J8mWUHsV0I3F~LiI{=8df+**rfVW3)hiFp|c6;P|vyiE&;**w>KpE(f{8$1&)2Y zS$_X=>dl*z5M7xh;j}KWyE}2f1&SFGR=gr*2)W-|aFAbg!S3(|{;Hms;y&0`s$JO# zqM(G%#`Vn}gkhA?%IRYePYrS`Xq(OcRz=+x z0bm5|kb(vg=g41k5LXX`=%>&d0qwV0O>*ohq&$M)NCTUlo4Xwxe&gb*&-aYy>%w#p z_kw@1Sar42wp4g%xkJ&j=808AG_?J&|M9KtZBL}wW*Jk3Miq2td zY*`JtLV487WNewod*a7;1QSTvx)VhTNN?eP6{VhR{6pKn6}3914oH4m$;0vhok=Yu zyRQz}q}_%iIDBWLiD+)f(E$ydxzJ_A>snJ>Z0s`tAV5ds+Tjp7wkIIY$W@JREsr=D zIrOC8^a0|NY}P9v0I<+U&~wXiqy?-Wg*fPfV(b|pRls1NtI`6b{lvikGXs7QUg#iU zgTrgktal|gF3#_kBcNoPK&hFj5vY}lFi(Sfd=CPYGz^q>gnLOBeE6{WbkG1;8l=qt zJrTX(XCPl(#_VB%k|P30j7t`sA!ZMO`~iu1hm?H5)18ix1Z&Ql zx!A?Lv^o2l!kC%&zqLYQCopRoAWQ%vO4;4r9f(Nm^d;rsrvW_T5vWFK|2CxQWE!}0 z&_vE0D%oLAx0{bTBZJ~ma75d^JyzaIy5YzyVtVJvqJUvN#s1ikfTqz(TXr`h));4b zLIZ#7-0RbCI6Ezo_dZ;Jf6OEKU1k~%i*LSSgE^ClRiQ8#j%hz$uIdB-_-R;Lxwk8g z2V-Zus6TxRAnjA?KfPZ(;5$4S>;Bbbm?Pxzv+(%U9MBumD_4ZR+_O64-RCQs+hsIR zNCInFI6-6iw{Q13daC&l>hxWvv(H>-$+2(Vqyz6B;a3OxHD3XR?ESrXbD)~sRaU-P z?X}$V$=wD5SaHl#g)61W>V>M2)! zRv%7CcDnZyy!VZcC zm!yIC(bCcqWTg*0XSUtvt1sW09v?JZVf=-w-2_1CqiyebNQ44@Kx(y~(slANO{T*@ zkt=G)95D=BoST~)R2c^1P$uwK--k;10F`C?ATAas0mZy>hXIhevU~@E;b#2lGcTM* zS~@##tE)2rB|YTjOFECGK_*ajpa3)~dk^7iaHZM#`Al$wz7G_0R{_;`W!1PoyeiMqQc*lPHAbJGJ%>uMJ@JAFM$+xuMm6SLE{u?bk_ zdL5Wo1N?_3vP@G}Q zGI2PeG9GN)IgGZZybedsl5S4qxl`j3fpNK4>T>v41bvztu&!OVSJ*I_;!gg%?pbCG3yzXB-D8-mCp(3QS1B)0S?PdRRM1je0

gA(Xh2G!W{`tOWaBTvPSb>c*xDk7!F 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�y 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

t+Y( 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 F`9DFq@ag~n diff --git a/ui/public/static/img/docker.svg b/ui/public/static/img/docker.svg deleted file mode 100644 index 6b5e601c7ec..00000000000 --- a/ui/public/static/img/docker.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/docker_compose.svg b/ui/public/static/img/docker_compose.svg deleted file mode 100644 index c24fa9feed4..00000000000 --- a/ui/public/static/img/docker_compose.svg +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/drawer-icons/application_svg.js b/ui/public/static/img/drawer-icons/application_svg.js deleted file mode 100644 index bcde222d47f..00000000000 --- a/ui/public/static/img/drawer-icons/application_svg.js +++ /dev/null @@ -1,18 +0,0 @@ - const Application = ({ color, fill, className, ...rest }) => ( - - - - - - - - ); - - - export default Application; diff --git a/ui/public/static/img/drawer-icons/configuration_hover_svg.js b/ui/public/static/img/drawer-icons/configuration_hover_svg.js deleted file mode 100644 index a1bd3024509..00000000000 --- a/ui/public/static/img/drawer-icons/configuration_hover_svg.js +++ /dev/null @@ -1,10 +0,0 @@ -import ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown'; - -const ConfigurationHover = ({ fill, className, ...rest }) => ( - <> - - - -) - -export default ConfigurationHover; \ No newline at end of file diff --git a/ui/public/static/img/drawer-icons/conformance_hover_svg.js b/ui/public/static/img/drawer-icons/conformance_hover_svg.js deleted file mode 100644 index bda670bf77b..00000000000 --- a/ui/public/static/img/drawer-icons/conformance_hover_svg.js +++ /dev/null @@ -1,39 +0,0 @@ -import ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown'; -const st0 = { opacity: 0.6 } -const st1 = { opacity: 0.8 } -const style = { enableBackground: "new 0 0 22 20"} -const ConformanceHover = ({ fill, className, ...rest }) => ( - <> - - - - - - - - - - - - -) - -export default ConformanceHover; \ No newline at end of file diff --git a/ui/public/static/img/drawer-icons/conformance_svg.js b/ui/public/static/img/drawer-icons/conformance_svg.js deleted file mode 100644 index afad1e16029..00000000000 --- a/ui/public/static/img/drawer-icons/conformance_svg.js +++ /dev/null @@ -1,36 +0,0 @@ -const st0 = { opacity: 0.6 } -const st1 = { opacity: 0.8 } -const style = { enableBackground: "new 0 0 22 20"} - -const Conformance = ({ fill, className, ...rest }) => ( - - - - - - - - - - -) - -export default Conformance; \ No newline at end of file diff --git a/ui/public/static/img/drawer-icons/discuss_forum_svg.js b/ui/public/static/img/drawer-icons/discuss_forum_svg.js deleted file mode 100644 index 578c1f4c74d..00000000000 --- a/ui/public/static/img/drawer-icons/discuss_forum_svg.js +++ /dev/null @@ -1,46 +0,0 @@ -const DiscussIcon = (props) => ( - - {"Discourse_logo"} - - - - - - - -) - -export default DiscussIcon diff --git a/ui/public/static/img/drawer-icons/extensions_svg.js b/ui/public/static/img/drawer-icons/extensions_svg.js deleted file mode 100644 index 33d1d28c349..00000000000 --- a/ui/public/static/img/drawer-icons/extensions_svg.js +++ /dev/null @@ -1,36 +0,0 @@ -const st0 = { opacity: 0.9, fill: ":#FFFFFF" } -const st1 = { opacity: 0.7, fill: ":#FFFFFF" } -const ExtensionIcon = (props) => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -) - -export default ExtensionIcon; \ No newline at end of file diff --git a/ui/public/static/img/drawer-icons/filter_svg.js b/ui/public/static/img/drawer-icons/filter_svg.js deleted file mode 100644 index 58afa47996b..00000000000 --- a/ui/public/static/img/drawer-icons/filter_svg.js +++ /dev/null @@ -1,22 +0,0 @@ -const Filter = ({ fill, height, width, ...rest }) => ( - - - - - - - - - - - - -) - -export default Filter; \ No newline at end of file diff --git a/ui/public/static/img/drawer-icons/lifecycle_hover_svg.js b/ui/public/static/img/drawer-icons/lifecycle_hover_svg.js deleted file mode 100644 index 2ac22bac86f..00000000000 --- a/ui/public/static/img/drawer-icons/lifecycle_hover_svg.js +++ /dev/null @@ -1,10 +0,0 @@ -import ArrowDropDownIcon from '@material-ui/icons/ArrowDropDown'; -import Lifecycle from './lifecycle_mgmt_svg'; -const LifecycleHover = () => ( - <> - - - -) - -export default LifecycleHover; \ No newline at end of file diff --git a/ui/public/static/img/drawer-icons/lifecycle_mgmt_svg.js b/ui/public/static/img/drawer-icons/lifecycle_mgmt_svg.js deleted file mode 100644 index 76b4621be5b..00000000000 --- a/ui/public/static/img/drawer-icons/lifecycle_mgmt_svg.js +++ /dev/null @@ -1,7 +0,0 @@ -const Lifecycle = ({ fill, className, ...rest }) => ( - - - -) - -export default Lifecycle; \ No newline at end of file diff --git a/ui/public/static/img/drawer-icons/pattern_svg.js b/ui/public/static/img/drawer-icons/pattern_svg.js deleted file mode 100644 index 26f5193dcd4..00000000000 --- a/ui/public/static/img/drawer-icons/pattern_svg.js +++ /dev/null @@ -1,5 +0,0 @@ -const Pattern = ({ fill, className, ...rest }) => ( - pattern_trans -) - -export default Pattern; \ No newline at end of file diff --git a/ui/public/static/img/drawer-icons/performance-icon_svg.js b/ui/public/static/img/drawer-icons/performance-icon_svg.js deleted file mode 100644 index 9c44eb62788..00000000000 --- a/ui/public/static/img/drawer-icons/performance-icon_svg.js +++ /dev/null @@ -1,81 +0,0 @@ -const cls1 = { opacity: 0.4 }; -const cls2 = { fill: "#fff" }; -const cls3 = { opacity: 0.8 }; -const cls4 = { opacity: 0.2 }; -const cls5 = { opacity: 0.6 }; - -const Performance = ({ fill, className, ...rest }) => ( - - - smp-white - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default Performance; diff --git a/ui/public/static/img/drawer-icons/performance_hover_svg.js b/ui/public/static/img/drawer-icons/performance_hover_svg.js deleted file mode 100644 index 8912b42e9ba..00000000000 --- a/ui/public/static/img/drawer-icons/performance_hover_svg.js +++ /dev/null @@ -1,11 +0,0 @@ -import ArrowDropDownIcon from "@material-ui/icons/ArrowDropDown"; -import PerformanceIcon from "./performance_svg"; -const drawerIconsStyle = { height: "1.21rem", width: "1.21rem", fontSize: "1.0rem", transform: "scale(1.5)" }; -const PerformanceHover = () => ( - <> - - - -); - -export default PerformanceHover; diff --git a/ui/public/static/img/drawer-icons/performance_svg.js b/ui/public/static/img/drawer-icons/performance_svg.js deleted file mode 100644 index 521f2a3f0e6..00000000000 --- a/ui/public/static/img/drawer-icons/performance_svg.js +++ /dev/null @@ -1,53 +0,0 @@ -const Performance = ({ fill, className, ...rest }) => ( - - meshery-button-2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -); - -export default Performance; diff --git a/ui/public/static/img/drawer-icons/servicemeshinterface-icon-white_svg.js b/ui/public/static/img/drawer-icons/servicemeshinterface-icon-white_svg.js deleted file mode 100644 index 1f3edeb53b1..00000000000 --- a/ui/public/static/img/drawer-icons/servicemeshinterface-icon-white_svg.js +++ /dev/null @@ -1,23 +0,0 @@ -const st0 = { opacity: 0.6 }; -const st1 = { opacity: 0.8 }; -const style = { enableBackground: "new 0 0 22 20" }; - -const Service = ({ fill, className, ...rest }) => ( - - servicemeshinterface-icon-white - - - - - - -) - -export default Service; \ No newline at end of file diff --git a/ui/public/static/img/drawer-icons/smp-white-text_svg.js b/ui/public/static/img/drawer-icons/smp-white-text_svg.js deleted file mode 100644 index 5436f96699a..00000000000 --- a/ui/public/static/img/drawer-icons/smp-white-text_svg.js +++ /dev/null @@ -1,5 +0,0 @@ -const SMP = ({ fill, className, ...rest }) => ( -meshery-button-2 -) - -export default SMP; \ No newline at end of file diff --git a/ui/public/static/img/environment-light.svg b/ui/public/static/img/environment-light.svg deleted file mode 100644 index aa3d4fed484..00000000000 --- a/ui/public/static/img/environment-light.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/ui/public/static/img/environment.svg b/ui/public/static/img/environment.svg deleted file mode 100644 index aa3d4fed484..00000000000 --- a/ui/public/static/img/environment.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/ui/public/static/img/github.svg b/ui/public/static/img/github.svg deleted file mode 100644 index 0d8b2e532f4..00000000000 --- a/ui/public/static/img/github.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/github_black.svg b/ui/public/static/img/github_black.svg deleted file mode 100644 index 3acd78417d2..00000000000 --- a/ui/public/static/img/github_black.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/grafana_icon.svg b/ui/public/static/img/grafana_icon.svg deleted file mode 100644 index b50e40bae64..00000000000 --- a/ui/public/static/img/grafana_icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/helm_chart-light.svg b/ui/public/static/img/helm_chart-light.svg deleted file mode 100644 index 1d5b32ecce5..00000000000 --- a/ui/public/static/img/helm_chart-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/helm_chart-white.svg b/ui/public/static/img/helm_chart-white.svg deleted file mode 100644 index 8c5748fd8b9..00000000000 --- a/ui/public/static/img/helm_chart-white.svg +++ /dev/null @@ -1,12 +0,0 @@ - - helm_chart-svg - - - - - - - - diff --git a/ui/public/static/img/helm_chart.svg b/ui/public/static/img/helm_chart.svg deleted file mode 100644 index ce0e5649d03..00000000000 --- a/ui/public/static/img/helm_chart.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/istio-light.svg b/ui/public/static/img/istio-light.svg deleted file mode 100644 index 03ca307c57a..00000000000 --- a/ui/public/static/img/istio-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/istio-white.svg b/ui/public/static/img/istio-white.svg deleted file mode 100644 index c70d93b6d40..00000000000 --- a/ui/public/static/img/istio-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/istio.svg b/ui/public/static/img/istio.svg deleted file mode 100644 index 9dc8f717827..00000000000 --- a/ui/public/static/img/istio.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/kubernetes.svg b/ui/public/static/img/kubernetes.svg deleted file mode 100644 index 94fc3711a64..00000000000 --- a/ui/public/static/img/kubernetes.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/kubernetes_manifest-light.svg b/ui/public/static/img/kubernetes_manifest-light.svg deleted file mode 100644 index 94fc3711a64..00000000000 --- a/ui/public/static/img/kubernetes_manifest-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/kubernetes_manifest.svg b/ui/public/static/img/kubernetes_manifest.svg deleted file mode 100644 index 94fc3711a64..00000000000 --- a/ui/public/static/img/kubernetes_manifest.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/kuma-light.svg b/ui/public/static/img/kuma-light.svg deleted file mode 100644 index 1d7c81f7561..00000000000 --- a/ui/public/static/img/kuma-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/kuma-white.svg b/ui/public/static/img/kuma-white.svg deleted file mode 100644 index 7933400ab7f..00000000000 --- a/ui/public/static/img/kuma-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/kuma.svg b/ui/public/static/img/kuma.svg deleted file mode 100644 index 9623ec900a4..00000000000 --- a/ui/public/static/img/kuma.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/linkerd-light.svg b/ui/public/static/img/linkerd-light.svg deleted file mode 100644 index ed9eac2f3d5..00000000000 --- a/ui/public/static/img/linkerd-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/linkerd-white.svg b/ui/public/static/img/linkerd-white.svg deleted file mode 100644 index 6660e1f6ffa..00000000000 --- a/ui/public/static/img/linkerd-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/linkerd.svg b/ui/public/static/img/linkerd.svg deleted file mode 100644 index f906f7151be..00000000000 --- a/ui/public/static/img/linkerd.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/load-test/fortio.svg b/ui/public/static/img/load-test/fortio.svg deleted file mode 100644 index dc23af85df0..00000000000 --- a/ui/public/static/img/load-test/fortio.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/ui/public/static/img/load-test/nighthawk.svg b/ui/public/static/img/load-test/nighthawk.svg deleted file mode 100644 index 4cb895e1534..00000000000 --- a/ui/public/static/img/load-test/nighthawk.svg +++ /dev/null @@ -1 +0,0 @@ -nighthawk-logo \ No newline at end of file diff --git a/ui/public/static/img/load-test/wrk2.svg b/ui/public/static/img/load-test/wrk2.svg deleted file mode 100644 index cb736c81a3d..00000000000 --- a/ui/public/static/img/load-test/wrk2.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/logs.svg b/ui/public/static/img/logs.svg deleted file mode 100644 index 31b407137fc..00000000000 --- a/ui/public/static/img/logs.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/ui/public/static/img/meshery-logo-light-text-side.png b/ui/public/static/img/meshery-logo-light-text-side.png deleted file mode 100644 index 3d7309e329d62caad19453f69596bdada7a26829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9785 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 Vuv5YB2>1s`Lj|T>rt~88{{VfuaGd}E diff --git a/ui/public/static/img/meshery-logo-light-text.svg b/ui/public/static/img/meshery-logo-light-text.svg deleted file mode 100644 index c9feeb3966c..00000000000 --- a/ui/public/static/img/meshery-logo-light-text.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/meshery-logo-text.png b/ui/public/static/img/meshery-logo-text.png deleted file mode 100644 index d969c35a91acb124a77370fc79b05c439868c30d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2814 zcmZ`*dpMM78-Fo5Cdn}y+KSm6qLEB9Oj}Hh!z+fUs2pa;L<~Ed!^o*gu{+2ZWqTW+ znsyvgvC1I~Dus57p@SA9*&Jd%heo9Oo>$*@eb@KLcU=$9`@YZbzVF}td+z(bCTle`?@FQ3XLaGi1xgl684$9QRVpmW>K( zZs=CBj+r+XCa?b?m8E|0Iw!mmyXa&b(eu|o^YhGqX+4y9#>{hAJG#WDT)#76mN?e7 z_U~JqKiq5%l90)Z<3z83C&jIyjoeG_`i67iA*{9!`(E~4Ow4kVXGs-T5|Ef_f^d`=F`;>iSZ2Ag$mSoU z-0;e=O}L+IrpfgFrIzuEOM@+236BnYE~qjUv614DBlAVUZGsosCYbq>nbVSh-|t9S zbsk>rY$bd;^)l^1uKdXB^RZ$Q?YzJN*&BG~x#}Qu!bQurRSjtwKQ0LG9z;q_*U(Gn z&rnrgr9aFbjBU77bY2CPhHH!d8LP`9vllQ;w|K5eCb9jIfy^ZQ_$ny|wm%wP+u1Gn zESx=1Aod(8mTHR<1k2KSrbMMh4LQDTsaqfy&Pu$+$**<0cm_z4s}qE@lugG`znDeJ z-`*Wl{e00vrYEW!=aHBV^$E`~AfS?n@~N2|<69r4xOkNQ#z15px+K&>4g^eT0lnfA z%>wf(?8}n7KMbYBst>EdnJMLfN;6ZPNHs+Bs9HF6ZoY9uca8YjBNFToe*&0=pIXi* zv*}oV{Go5J#UMwd^A&#rBWbvm=6N#vtvTPaJ*zpEK!|)ofG^)GRKYT<#p&A#S9YBQMzd*D%fEj1!j%Qx zF&urkK0`Xs%9Ti~2Y||s(k)#17G5XqXP*@0nF2ig{pJ_#jM$eGfCh<~zmHu7&c2M^ z^9^MZa9i7U!XyoRx}-b*=0Fc>8EVeQ*6mgjZ4OW^X^BoAHSYv=DxpPf6{d(#JUhbc zJUm?Sge1R=N1i=3IO5u>H#A`+@=054`jB$#C=nEi1D@hsdzIH&e8v0A^2ruAq|kye zu(q;}j{Np0vg}4r$#=4+YkxNV@e8<%$pXE<#AAw3b_)j0_jJ5hqKxq*WVfSD$uk+e{uZOuhsD0gn5`a^# zHp#x9UdHO4m5fOB%G&+6qIO_0_Oa(~ic{6Ukjihqd9d~E_o^_ODh6)o9&~bBxXaC+ zM@gVOHp4x~qBY_{iepn6{~`Acyy(!CHH`%p54(6FrU0i3&qmld3qkYf-p#uaCIy9o z%K+8XwRRi?v=7PgM21m+%JAY9Cm&MvqPUnD9um zzuGjuJOhFxuFuOo%LWFcBReWaga%WWSNNpdtXM4hFy^g{v@m3XyT5JOm|7!>ivqYI z$)=rir)R)5cVJ)-#b0Z#G*R9L0$$CN1Fg(u2GgU@X1J#+7I<;fHNxlOJW)W*-*Rmy7UQo;d`g}@$ zA09s{F$MzQkiW+a4Bv9)NBS37AZl^(?w6S3%Ai%0MfR%?hJZ;m!FvS?Oimn+iq5{T z0Y-H1tyki*e2x0yDeS4|+lcPf5jL%FPBMEQFdBuV>L6F{Fk_4~p$xm@|KQ6Pf5bDI z!f0K%);&g3#x~Y?eh$^SNs8^&xa09oFSD}hg)IE>IqFe{c)bo%!V%p*CfH`Yh+cg! zDK5|uL|%uKglm6PNBf{~5`v|yT`*4Y1KOe0K}X&1DF6kE?5vJ)*P<=N_oH8HUJXFg ztLX~fS}UkSu0VlJ%={Ari{Ki*Hn)3XW@Vaas>k08xb*`c=kWF=dX-5NAoADcD+u{i zApp;%0P#2T_+IRx_q`b_eG1}Sb9C+~7h(V1xarh>yA2q}KLGOUVm#SjJ;C^IGSx1EMm-5L~*hC(c}bl!iX9o z-xUOd{V#gp(3K$Ypb=@XG%>lk{Pu#%2JpIro?u{&`i{$ztV=G`2N#rKcRkW_FB8Y1 z*3&Sep-#)0r_*YpxGvv~aCN0B9hG3##~j#pO>0gbe7{1v$OE(rD}-6^*S3XhSmsSij#qorwU_>F>Q61st?+ol61) zlkxn zxC5^h{fSoDUlUVCMT>k@FZ`;B@KMj)yf+w=ZH z?9v|{ygoc{N)LK2_I;4N1N|89yZce}npAD??xaQOK~%jlIV*{slbJ4m - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/meshery-logo.png b/ui/public/static/img/meshery-logo.png deleted file mode 100644 index e4788cba5afbd70f59db3db97291768db9c53521..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10916 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 diff --git a/ui/public/static/img/meshery-logo/meshery-black.svg b/ui/public/static/img/meshery-logo/meshery-black.svg deleted file mode 100644 index ffa8c28e5a7..00000000000 --- a/ui/public/static/img/meshery-logo/meshery-black.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/ui/public/static/img/meshery-logo/meshery-dark-text.png b/ui/public/static/img/meshery-logo/meshery-dark-text.png deleted file mode 100644 index 5c7ca8887361397c1ef768a1506b7c1aaf73c2e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3354 zcmeHKeKb|+8sC+!DXTH#mL{c-+f|P98V5BZG10l`OyMAHpEbN<3B}2`PS-G|TPvmG zJw!x~J}H}=5M?xB??kQ=g=xm|E#}DQ@p0c{{ex3n^h~dRuTlU%FcElpCD97f>`G8$uhk1bnxr_cu+aE_rP9)C`wkFJ-QsvH~ZM~ z4-iE3Hi9^lKoB!{=}aF%oZ=9~z!8ElOCyN2Co;<&&GCk@!#B=cb36Nmg@v~rU5(8x zS$Q{tB4TWv-J;^Z@9iI`sjW*%&vZTlODif9FI+krc;e&7@!R*Qb#Km;V)G^6@@)1k zSy-yyi6<*g*pguc0Wc@9e@R5N0Fxk81$GCxs@+T0tXlrp0jc|Yf>3L;+qc&_vVFLt zBRY4#))~i(o6g2ZFSzdBZag-0)t3C)WkvbxfC!r%5Lmm3b_HC}Txyt?bTk=876E(C20wqKYYDPe^TmSxTyZJuE?j? z0oVS)P%iMnd`aXq%X%XgX9=HMsp|3e3||ASZlpyC5WeoxnV;G=?|mgP{4k1Hn5WLu z@||!+gLO5p(WJPkh?aL>lL*Mph`L-LV>Hr|tgH|Ge0qCvlLce+s1m5d>0Bxy|H_l< z+8Q7zp=K+kc>?k;a5|q#=*em0HTJrg@{v@l%LBO=0B;xc#C%6Yf0XPK2~cPytrSaK zP+Y3Sv)DfL;IV} z8ZA{rqeIA^&Q{K;wsBg1LFsNgmUfIH{ZEqR-S>pj*H=~yfAyAG*r z+=&PX&$g&p%Z0ZrXdMxUb|7nF}} zMO^YwgY~centV;@h+N*Dlx^Md+=`}3!Br~Onk>9iRr3PmfjdmIE@L9n*`=PID1zT< z@5$zpv=}y+`)cyh7t`6SR-3BJL&^7@(CV>^WZ!kVxn$5YEc2=RRA6vsAzQl7&p_IE zF{t4&U|ROAe~sWYww$?19e-Ic6C{4u-@K^^OuwFGsFHxS1`YQ#ahy-}dDSE9%adJU znXwC)o zj7H4)&rKGCZtJahEbh#o?t+#=l2f_EPN+r8^P~FOGWe(k zlB3{!E7ro6JQQ1Xr8(wf6Px#e0%moQri*Y~(n@`g{!Vokubl$sb^e%4%KNm3v2KNQ ziWKz1-Byu{wCR9~g{aB#Ezr&l1@vc~FjQml&{$;9`>W-yC>EC4GZBf;aE8dj&ji*l zug>IxHafJt;LVzz-Yr zR0kBNHJGO3ikj5E;$nsAP~GjY%?(Xw@tYK}ar@J}AK$ z_+>LGiVLR7W}2ocm8`jlL%7~?XSt&15ziNUE&}O{jHN3LWjsdXp--?PXwiSD3lhK; z<~Dv|Zg}%k*kf@%gSs1C9V>l+oo}drC(OSif*oppF`tPrflEJz%41OptPgj`e0aAj ztC$ZblNF6$;#ylSl;?5DssiBC99Nlax<0K7%a|EjFdYO}yfcizH^JF2d2SsRw2^iW zXnQ?dO8G`Ff~txnu4vV-t+PS;lS&cJG0o02C3|}C!tNeS>Vh}2BTKIuy%^oBi#4nf z%e+|3GrhdWJ_qsPQ5cX41C?5s2_Fr^TN;+1DDRA) zp{Wa`e#^9H8tK|3c@^1A@#AV>njM*2zwMSP1z zggUs64bvA!^}Pxcen0aN_(%YY;d`b?ln4(O5!}&}ApNzN?}#qbgk6?{`i+Y&n<(>{ z{baLPXLR#TWdOf2&4Tsev5-tf+~4u;g9FllT32*&hk87|xJ=#1gW|zw+TP@$d{~Xs zmU3{c<=ob~w_`#V$&{KaR6{kB;UDd6vrS|zdEfw$GDWrn|POmklP zNBR)@lMDW_FpzJ`_84;5-t$I*_0SP;4-0&c3ZR)!D8vI{#4+ONa}4#344n;)%{V*F q48LM?IA$D9-6K)n{}=>?_y+hz{eOe9_uvbq;&$AF`wFd&#Qz66$M|Oe diff --git a/ui/public/static/img/meshery-logo/meshery-logo-dark-text.png b/ui/public/static/img/meshery-logo/meshery-logo-dark-text.png deleted file mode 100644 index be9f077a4f6f41b2edab2fed09eb75c81fc63d70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16183 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 diff --git a/ui/public/static/img/meshery-logo/meshery-logo-dark.png b/ui/public/static/img/meshery-logo/meshery-logo-dark.png deleted file mode 100644 index 92282c895ee65825e624558eef1517176f18c1b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13032 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

8AJHXh=aGPh?|E_vmrZPp%W&2;?n|8UDMnt2BCn zjdZOq;$nGC5pK$>bI1U8{Ji}W8>2j1D<_n{z$k3jyA!aKRe)MGUM_+Gx; zANHOn9$M3gPscX>kaGeQE-WjR6waL}Q9Y#7fo)}WZQ2%Elg}aVuyyd*NQXyZin;N8 z0D`684lv1DoJ+vED5jf89yla%fkrH=+nWd|v!5O>eY384SBIVuy?F%PYi)N2tEbrL z?$i3#?0C2dqaw4$XIeVN1PE<7AQDByz^;d3jVQdn&^G!)`qM!px{&1Zg?5M7$&j74VN=t7&t{%dBIzmFKDfj;Gv&qh4W>@fl40{TjV_Y)gi) zm$^-)@S5q;;X%de``LM^Kz@|h{;4cI6kc0s3uTBrd$?s0o65q1j-`dR84SAPF-upz zhd3rv&1p=<*dIU}EVu6pPSHcMhv|Hn@}Yx0O|{FXFF}eZ(hoFA4Fo0YBXc!-QvJ`Q zL-AHVqQ7aF=xwO^#X|xHTw@xVJ1p6-Q-`2nT$Qbn7zhV@YfH;`por7k{q2to4ud`; zqC7)~e8_l}GzG5VPc-6k`s85AjaHeJ9*3Q)7bVH{1*bTR)Pf~&B)qkGUe0-hzh-(m zOquG47(?|@iIx~gzQQTP=Xq+4fL(I0dFcd=bR&0YDJTKeiswG!qtpOhv~>&FRBnL4 zIj5#%JsCMngDGelTen#M1V=sHCohYa+e4CIc6@6P`xqU*2K6sg?m0hUua7FK<~y8J zVGl|&1#5DJ9(gFEu$5iKDUI3++c*jE1dTh1(iEqQ0h-UNAL^mI$BF`uv#lg?@2#vM z0ad~lOWvvNp&>~<(LS%%&~pO3oHyc-Q23#J3rklL_Y9YGim?rn92wVWPHS;RN1MNw z%tP^4L~1RLZwcXT{=x^aq%P{3*u4+eFv?hv5*B`cAG+{c^zc8uWG341de8ZMH&t*i z51@s-6Fhbxv&b$5aL3vAna4?xO(IG9_<1eTV08FfsDJ)_WBHPd1lb`HQ{6^HHX2f2 zcq)LGR~#I^@&|Wb{)=OJ*yT_6OaQ8*W108yF2>YwoGN4of%+@|wgI>=W%#Rn_<6VPIQ z4&iN{vhO z!m-iAVEKNLeZMX#fjl^11sxxpD>A}cdMc>B3_?vT?WF#CPmDYI2N#P~A4$n=6<`f= z_+S0=Q36-b^`z<8Rs!3z60Z7WPVB+Dz3tI z&L}d@z}6x0Q$>6$DP4v5IxXH^{Uc|Hw_H72CPbi`MK+0Vozsys*pu#&S%pfZvGOc( zL)2ZjQEWCZu`6!1|AQQu4XcV-uNT~%BtDZ+fkEvSZcvBj!oMT}X@_H|cj<4)h>##< zCkCckO*glOgC?>#)PP=ql~E~zUw;W;cVa_htGw3MWs4tB2ivWpsL;3J{>UDnTvNIi z0#EQ`)k&n_EC&yyOEiYs*H2`=#Bf6$Y{Ut4Vh<$2go}h^XVd`# z#6CZ7NqPeD@c`l9aTrFxqjQ;bps3Fy(w9ap-3mZOe!uO)(mC7QEUc5*)EbO0rtpUN`Rx=KC;Vq)*td$R1l4H<4IQwDeIQz8`Yz^g<>&vJDT4MN-Y(LdwC~_!`7hb!VS1K=1xK^FovRqAhz(P=wR05*RUU0) z;qCOe>E~fmwJ~2^G7r#BAP2qGh?u|uyNKkg*kA0unPD z5_frVKl$U&VVEUvt7yt8dt=pSaCq?<)=3Gof5P>-sCIUg>&pAuT$pveCYZ{9(u^Y{ zqoJDAHb|Iw;M7wAskKc~SyqqbbvYkSc>kWLoVrrGx%_f;^Or{jJ7_staqHhI{@>^S z_XZNzc`tq0?>iou-;G&`ek6(?Wbfy6($U8WYd93;73F2*6=W0@E-5ITls|q_K}A|# n{-nJ8yXu7O|82lEPssI3;Qx6*#TX#8bzfbQ;kiOByPN+DTWJWN diff --git a/ui/public/static/img/meshery-logo/meshery-logo-light-text.png b/ui/public/static/img/meshery-logo/meshery-logo-light-text.png deleted file mode 100644 index 8864d41224ad15e2d007bbdd0c957da3e179447d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15303 zcmch-3pA9`_cuO7VMN4((q$Ay^SG1}U0f%ZiDob^54lBnlw5Kxkvmhlq#=?^$y|sg zk4uzG)MzTvj6zf*5-Ez@-$&p7@4x=P^&YN2j)(r{Bt{0X$|Ms;J2BZ7Y+{Dl}ymuns&*_66 z`&f~d_6GGLT+!v72HSh;K7UCEe32`?u|C8q)2#81ez%dkG~by`AgHTdKKOi+St3xR~`KVzW^h zbm`%(f{98q!5kVzU7|Oji#N3^x$a_|E9O}Teh0UMp)9^kt`FB*{*^5qA`SgLy zXOPAEqrFknx%vW4f2+Ex7<9VuW6TwQsjP!eWP9$p$CU>K>*(ue+sLjfmvf|e|lZHgbF-|1e#0M_T=_Ef{o>KNm8 z`_qqHwCuSW^$oZ%0s77B_Up=zeud|5)Q<<;mMXL!IESc&(}#CukDINrt=*vKQZ-S? zp9*%bdfp;Zs8*fVEun)fj;SC|w{0xU73D_sT{8h${7eScVEq|? z#D474*U9ig^t?_Akph&p51s2HGl$oBzsCRAx`*iaqg@8MWA5zmWt#vBfx1Zh*Nv^y^x#>m(pfyyCfyu%m? z{U-korf)*ZXcZ9xn6jUY#&R;4Z95_;9~7kZsw_bj8>40VYKRwPu|^NG?$#bB3zk>i z^8&>tZ_3c7IvG1G4jZ%0UT!0K^^3+Oey}j#h$E;uz$wXrL>w{4fg?dfdwFu;8>c1@NFHO*3ZL|`hBv#&#MG*CJ8=E+OMMg5oebs5 zk(r9R^&9140xo5j3o+Xc2L;*_M~y~Yv08xw$v4?1^ftYqKs#diY`p%;?G&tm+Y4zH z(8p<`fLhskOJQ@Zt-=N_{fmv#_s#cprSql39`vke$hzlkDlC|d79FgEW){4ccRi1@ zCl2{fxmpy%a)lidC#=>UvFG0Yo$t^4)I|iXIqd#&8h`8x%3sd(#Gcu_Y-7km>401u zh5DDZr78+`-16kBu%JT$?eONVSC4RD6tdYwT^-I)@ob!FisT#RVk<9c{q|T>=cs>I z`InINuYw$E(N-k6Z+Gt&^;i6$-3j>U(;k_ST`4{lGcRWx1!wf- zjJl|Kl+j9L*oz%m#gN?|fPi^SExLqoUcJ*k{k3eII8D20gGr>4#6g7iJ_(>Bf9K|6^3UD?K#T zxr`^hm2JWp9@#|A7W;Jff`2E+7)o|NuP&=)O*G+1Gl0+{foqXgcpaSaJU%j}yNE_l zSGEIL#+$&Vs-E#YiV%Zv!;9Xg{1Qv58gd-{h6;JVv>aa z1v{39hCg;=i%@Tgya`j zokuD~*V`xsxOeSb@4Lhy7=kx(#A{Fh_ITo(tDjT?%_h~tYG2xOZ(6NM)<(+IBZe^# zedvU1&YSF!p(K0++ziGzX7P$IFwAa4+D5eF$R|Kvf0xt+ZOhl`b`7>WO+h^z@jlA% z$^c$#v$i8lMv2DYqmu{T@{Kz6-GKc_S=Em~OFJrW^Who2YH@`0TQY}$?%j|yEqEuB z09PnPr<_?8$qhJyj5@1j-US${eOsG09} z2Ax*MQMLe8aMav?b9y13&T7&{z@2o$39wdJlgfs=G-O5XsE(XsI*g+-H5;n>=BrcESt=EM&3XZMnCLP{F4 zQoO+pY#&y_7Zc6!heKsT;(X~4hFJyVYy^a?ZoolDq5u(Tbyn-T1C*u{T*0i@&4qP7 z-zmhuNABmtfmlaz9=rF;pZI2Wzg;=)4UzDOHz>z;peIZL^7y>76L7|kY(gn?*cjM| zl(|f&wrtnct8fJkvs24#xLx}_ACS3ITQpR~)31*=4;Ry7h=gu>n=VSm_L*p!O_^q2 zhg!8~bT8DKmnwd@StT0C>^-i5a4v98NSRcjm;YtD*Plc=*|pCWLd{lZ`#Ju|x9>CE z3+Z5qy-f{x%r8D4@{LdEldu3y>NFpSymJLT8pmT?`_w!i*kH-(;$r!e{@w^@{catL z1biZldyydUi@D_sjM6HV7=pUzR@%wZ}EmL&xSIU7;*{hpanD|}C;O2(G@{&Uw6Pc1uaAolofA5|vs%Q~a6+eq&0 zp>SkFjlq&3xA`DX$wh5yT|s&qgx(4R&h%SfLU+QVsm=o$y`eJj=SOz*TeB14JT_$E z-*cw#0X^ZV328QH^r8v6txi|w*;yoR<`y5ieE;LjVp#OU&b{AM?2SOyNf%c-&3?jx zCr$2UM;(|y@gPreaXH>V|t9uEa=dX=vz=>m>RH_OnBg?X7h zTW6UHkD&L;v7-2-5B$td_t&aH5A3n^CZx^4g`M|dUH)9lfve8r{FY1+wJ%YJ&LBf! z(<`n+L0UdY08NBBICSwnoPu?XPk2k-=ZV~6?~Kjm?cL0V?xqiq%>|oLcd=ZsTVeM# zo7AX*HHl21ePbTAhdYvf#`7)ig&}z1I8=DxcbMs6o>Bt7@j#aM_uIw}#y3sWzrr{7 zd0pNVvA^L@oZ)Z>ID@u7+FAE|xWp_6-BO~}2E$hw z#C?j$tsg@7f1b|oz}1>BeBDPxoTb?Y{ktzw@|a$#LbT}Nu7|frHf+)y9e4+q0tptL z7(d<s2^_*=G(uO@H&3SxsKGC`>>%sE0`blThj# zJHnhRUjSpD(=` zwOC$A@7010H*B$#C6Y#cSG8BSJ;H_tjcH~`^4pjX9D)tl^`!gEv+wKM-b?muVGzJ? z!KndA@@K-pVXG6Mhjx`u-yWBM-EAL2!%S>IU2_iptM1)xS;2`mmY@-3W%A1=r-o0Y zfG+8ISqD3C(6hKk!W)=X?D{=gTLs;{eqtr6$ z>0P;qj5E&LnA=bdhcZh6^M`(4&mDIvj753d|4Ar?LT^ay?658{u7B!9gM>QE^~+vY z3Bx&6@fRu2tDHDC+#+c64afOl)aA%5qDACR->f#+a-EjmpYaoye+RgcuIvgv%1+(M z8rF^|c~K=imQzJPaOX9Nd;2uE7mxU$!|1eIna3=GifHCU5^j!G4rSFp8DZ37@{a z3Ls)E!2J%8&?xv82pF>Va`Y&o?TcgO?B^8+G0e)KV&;7P!LK3fbOzQ+ls;_8eGrbA zU47d%|A$E@e6h|jLs}^)-%Bl6Ntf|*#Tk`Be(_fJC{tPA<(f6|JSAGLBK&hRwPe6P z~9m zRNr7J&sb+1MMiD^Y#eH7GWu{g6#E#?FruMu`x2beV0+gIgeglxb()nMbd;q>$iAjpd!q<{f*2vOmIHrYz*il@v^dw zBr1UtZEw1J;F6}NX^6J@{!^2#;=Uv4Z8jh-JGCLl_({m3wof@G@#T%A>l+M?ZtGgB zQ}yo7s!c9lw(Biet0R4R%jEAyX4voB{tFFTs-YoH$!MveFE;1bGdFGX=f92GnWriU zpvRE))LS=#&}qfqEBC_YPS6~myQD#_oRSZvflZj0=CY&~_}P$ydw2CIGPNN@C3@4b zJ;v&X*6esae$2*h$OB+!k*OcP)vUaAaEOwSS%{M=rQK20ZPFHZv|td*?0$TuKUh$7 zkh;9S;;g9+6yv*zon=FH5P$aoc%-?s-9f6ksoS_+;9eldngp6>a9@UdaZ*K&AFSGD zxou3$F_o#T7u4hI5WS%+xhXabxvH{|UQ&skiW?Q1l1{|RO3D9x=B=HuHfJl27>Eej z?{UfxEQBSVRc=ic(Tp-ek)ddrT_~gwbWKD&{JT!>5GMFSrxgJl6!>-Z>YX(;X|cg3 zg|DxDQ8PFmoYp7GARHF?Ed6lt>yb4ARXycu^@m}H4R!t!oqiH!4&8f~R-P`j$?&8< zoFBY#qSvTG_s!|X;>l6{m#w&}HPFZ~p94F)gA=V`gzh)oS6sx`QK+e>9lNEO5Zf@&Ia4+m`$YvIPPTo^GGB)BR8IVJYVP%8#dAMW`w6JRJsq>f_5xxSwsZN$jo)+v9^${0$McmafAm%N z{jjChn%N!^Gwc9J9zS&EqS;U1{+93!B&mt@|D2vw<}J~uV~i0WMJ0^8794RxxO;Ouey5huExo|Yj+?b(^vKjpUa${ zy`?0V`qdy|O984*h3$^u;0oR1nOiaNfEoQN((0C#9zne-E;iNLS=CdQ_U`uu)dfp2 zg}4MLQ*1@hj;U^n;{+Dv%IK(jrjV)5-GR;p&{yB*vav>$C%>n~DatX;15X*#4k8?{ zEtV%?UCZ*n*afaxpVeIdE_7h3jLuQd6bdn*A~lCB>oI!l&z2(v=~w zS|N@Jsqecd^Le_x?(C4!5%t}bBiq22)(*kVYDIscHS)ctaZpgvSfI@o3@?wHB* zc;|0u36d#GH({wA*|&adbP~sMMznW$wsSY0;(PG@4b8y}%2FMiVM!Z^ihUwh7(-F0 zcMczDmGr$Hiq(Tt%EvnFsSS#jKaMt6#+;e4u}N68u2%6f+g#=JhD5wbX-tF$uf-h; zXl;sd?s~C!V!zt!>pYJ){y0}qm9m5~@bxfc=!dhtrP%TL*Zrio5$gMms-Y@Deigzb z47C7Kp8GU5usxZp^n1`(xPFkKmGd{y#8mx5@Y)_lK*W*FFYfcl5y8^b=Ag)y`%w&$ z(&X)V(l}}?q}>O4(h0LdM$bMTo3oa(k}_1Ew1~%Vg2`uU((luV{c*95z3(2|#%BoJ z9M2YUJkKlc_Qz4c2+C3~ELv;3)8p(jRVB`lWlB1M2wF@4UA#;uenkcFib!}Lm3TZh z>7n7Ii7-Ns-=Ye)SB%w=sEdJ$JJqEHlzRB8{bpl-%Zh-jp;%FvOdr!BQ&EWNyeNJ% z{suCxc7G7zXMXfY(Z3pH=@?9YWE5$IQYE^D$=HAdE+(g@a(1aIe`!Aiy?L|*h=^E@BVIO1Bzu}Ppx6U z*N{fBqVk=7qgu!c>}|`TD=%0}i8-M#)ec9!3JvwHsGI<+XT^M2gxdiJ=)y1G?~!K9 zGnA2jqe4i%yke!(j@VtI)F&>XX-#!swft3~SVNdxF&0K5zAjPXy)*=}2}Xc1au@Xu zNK`{gBXt#Z8-nR=AHK+xS3rZ*egcwX`{xit`Okpx53E2GvU_&as;0igYFcvS@gxXnqgQn0+lL0BeWQosjq%r%_v~ zFQxGzRE);l0u0tJco_k^koan+Q4%$f(pV2E?a1DkxNel*rsWxELwuilx*U4Rn#a-! z>hpDlUE8wwgPYg~naZ9cA^FfaYo1D1F0RBNF|p7sW8efLROJ-@XHfSrbDm3AZcvm) z4Ax#iXK+Q5_n+(N31p0El&k`H5_X8$rtkU7j#@jtDb9`(t&7C>f0 znbUm32AhGsvddGoj8^Lv(;!>`(M6a1R$j=oM7;i$K;W^#IoAR?r`Mw~Uz zvL^o4-4nCPn5M>4s&>-6KUQ%Z94t}7CzhgTdVhcw->MDh_WDTF^U~w$me#k|b#McSYLRzB? z3tm2}pzTv~4sgGqg*ubbh8HGeZdjwy;J@Xmhn2GT!scVWgEk+nkD+kwQ|eQl5K(03 zZ0_{?Wc4Dz2>6-iEOD%qcI(CZB%@(L80RUlF@E+%cyOx|Soi1N*XOJctKsBhWs$G7YSlDXN`8|X1B=ep^3Y68$xcRK_{_0RCM5a!s|0Ec>#T>s!>^3w^aney{ZM<<47nvdkdp!#n1X{_QsprF=5!Y(Vl`Lr?&R zg$2Bjh>^qNKw z7@t!)l4Khk=3EC28UZ}P({SMYy#pv_`t$MlrE5pBQ*LEIO2)L0XS5D(PkJ~s_V6QAlXA>iL2f?^U(k_-vxRbb_DuFC%-iSf30f356OAA z%wj1&&~L^6)D10{3}mvDl|AR4URb+ssIuUlzUpKi9Y{nOb@SzjHZ(gPpyAU9K*7kwHC>uFD;&Dp!6KE*4C9Vr@7j>lP ztdaeyC;H9K5b>P7d6S@@)QPiFMurmbbYa_CahIUcXd4#Y>t>^Kp7PR~S zR?K}pcDsv9p>{8sKje+PIof)Y1zb%RMq(t+g^cu(l}|;$oq5_Xy9$iMl(I{K{Pcv! z-Xx<4eU*DN`b02wiFsPLqo~IpH*)TdEc?wViL4yciV?omH!r&KW2UPUn45HPAFmi- zSI&xCj03&2b}}`{(fl?fvn!|_CW|{>3T{Sy2n*TkcUgp`W7i#LOpCQMh_+PE-uMHQ z@gv3uwn^_fDr@zvgrWS9`O#$6T4(Z8jt7D(dp$Vp8*`WO@-l_Z&ds2Co{l@L z1p~ee8ZX5;2le~CXbTZ2U%gwtbmieJmt=^?nvddTqE3zp>h@=zgRGrN9^NI!=Znt7 ztisyIyv#0tLpwAPqv&&SyYmY%wFVd8K!q@VF`Z`o^n2?#Us^u{b>OzL(+6YKi2G|= zL02IJUw+?i8a;!nNPPx}RaNI@e@VREbx4vz{l%Y9hf~hfykP-p>BBls;-YU1gLk)O zUHQXkD`S3i1j!RXByVuzKYrWn9>u#L@5_Ow%uDBx)~Z!&ZO<_R)#+1qj^LE)V?qUV zoHf71mmcshB7!bB>=s#ro5m9lWbF2K7Xf|DWocOSY)z#LcnOCU4laCIvg{zHs(?l! zzcZKj!lHgPl~&+w9QWKcg$;#muV2LOQ*Cs<11vC?jbPDvz6-NW$Fs;yA}hjsFRisD zYh=B{ENaTB48m>Be}nJduOtu(wNJ!u+**~jVxC;v3FZF6$^h< zD$_mjx32d@pt0xVJXa}s%g@PB;WA2Q9!Q@c^j$Lmrv@CipSC$z49FY2m$usrG@<5s z2buc9KOZfOt1*<^iQ!{HAbf|dt^%?Z;Z16yVZ$0+oU=Z~Wa zyRWH5m>2lRPZ+a%Hkq~Yr5nOdZ)3j!MSx)yp`gHfX-R*~V^ifgNe!Kc$d1CL(tw7BDc%*VR&gsql zJ;iKTRLseF>_YEMtUF5QY0YV*f1%kDe*&HNo}2jRp~QyioQ3CAdjk8S)Jth}v0?j} zjk;Dx;)IhzUM?-o5-b?XGtM_60{52Gy0zp*zIb|Znrj4`A6)O>SCjZ>gLohz>%3m) zu10(@O{jBua4GiBhDxOudZ{DXt^kQx>=W%?6ZR}pWNnSoqnBenKKZVXSju$~uO=yj z!ryUjge?9H=c48fGS|z0$J8s7VWkrEWB1{kzL&nSXszkPs=)AzvZN+)DpNPV-st!= z@dV--k3X?1Xg&k`9j9r$qS(2Z-}|(Ozr4Uu*6@r-4XvBf{f?_No>L?bg}7WW>b(%6 z6@Zx8A8h3C6F3CK`R25-W|nM*Ex$2h(Zh^7+pe?54)tlzG#(7Ys~2cVC|I1Ho$_N}xwXSf!xg6y7qU5dp@5bluxri||f9`c69rZcp zw%jTsQ{OY4S^w$cS5PtfF*xnsDKp}9et9!vHIX|SR1OU#l)M;FSgLNO+1#iYtug#{ zDjRB@3?J@|_Cq*0VqYnsD`CIe-aq_LGmzjB?OWi@`W`ZX{pe&}zEndYnsJoScaC!V zqyOb%KvSi@ia;M*sn;v{wz(_#d-Kp8T4g%Hmg*3h<9Po#8Ed9Zp?uI&luW(&a^D^2xn#L*Y7#*u z`(Gw(*z$u=aI>4Sr1LLPd=JoiW^ojEsmV|B&)T}u&P_goiNEi6y6v?m+O7uuSwUV# z&Ob$huB!#vq-x|A;?BA*oGU_oG-U@+VEBb7%f$ac931z7o0ZwAiR6f@oI+mCelenn zAVOJtOe>@rt-^9He$Q{5+}vh4ntq$Oxi^GC2y!1u8P-Hbv-jAfV2{28ne)Ls59fsn z7N9EeEux!*aE4!?cc72PI;(M?YjJX7qcXlyj}cJtLwOC!n5{Ibs;iKXbqv*EUw{^w=`mj=6*-8M}WvJu8~t^Q1X^`i+L#up<5PN^NZ!!bh>g;zuc#9P;e6p*p|%`%W#x9Gi8!`lV&A>vy{H3bV}zp(o*UVbR7d*UYgp zgGm2_Efi#ksbLMS#i0cQMkkW@`Chhm&fRjr&W<<`3;xSnS3|MOKIkO!lQOLNtNhI1 zbQL4;7>@b~66^)>2dBh^OF_G<{lEE{fqaizsLTjhgCy^26&Uk6bZ)0Ai=cS?q)jRb zd7pq+fu-zIFd><5O+Fq2Q`Y&m@H`Yy98Yjo7UY=@@b!u6OVSaIv02q(;Lr3<1#>$%L$V9+ zv6|4%VG@qwBuH)0sFB~!n+#?4Ort%hjzhD3trR7Li1XIMen|YbyJ+%zBRhw+Dnyo7 zaM8ic<9um!AvI8g5rF#2ER&cZ=l#qb?GE6eVeU%zau}mc!}Ax3+F&8HTZXN;Cv7Ln zrhB=to zfaps}kGhSVfF13oV9>t>Ce>A=m1xBGn#dsOuA27jMEOq zQS+ePxpDLFH#I<0Og;RnWVe28GEN{CPk&|+%9b=_*asO2!yAsDGPgAV8S8wn7^9(w zO2t@Td`c?nok_2sPH!^>@kwq<#9|{j<*~_A9Ga!Ta&dIps|>pG*!HWYoWWv%W=zs} zj(Q9q{F`-9Rjsy1m{-YDp%(SdpJI-Ryp|puJ@?Kpx^m&nN6<5n#PxG=q38C5^OOpb z2DYX_J|!6B?G+QS6leaU{mf3dXSgk)w@z*DOVz861!yZ*(H<@I_G_HC+@1>LJITjr4B z`oG~yhS=kvziJ_kJ9OyDfMhj8@E;-2o_p9YYkifhj3HJ$<#Y_({^WyS`g%OW=dxi@ zmus^CayOx8?$CpLI6z*sSvzk9;Q@pFn6q7{%S~jHEf36iL44wMwe}q>%W$ z&5ehqTgS0-5B=941AqHmHa}Kp1xp#xu2XxaN78%2Gh4-tL6cg|m%GEXgb*_vcf27V z1guLEpFGNxLbBn>957T3OG^M=)w7lv*^1Q*-TxAu-;aU=!r=A3@4l0;h>X{$e za39k4sVQUuF9n}^)x$_K+Ax9!kHY!IkrRzf=)GbrE|^>a2^s;0;8dhV-HfXZct)bR zvWIC48seyQfK1vYcY`^cX}>Y?RlDI;SXA6mkf)^1()L^V!)xJh*Yv8%VJK^Rids|O zAF`N?BqENMiR9#1IO5>B0}2a>6MtpeT-b7kcTpvY!|0=;rJ!V@I^+NS6Z-X7neS1YsoL?BP#< zC2}|6U)_||dcT!vzLAvrCxC$5O~k9h56YH0?69W=J`|VIey1y2f`f{xbIdkp#0_Wy zQLrTHXw6qze$yI?y$LttW1M)rOj-6$7U7m!34eKnA^Z^I-)T)e&B-hR>Sk729MLrd zP%|O6F%6Fv2U^!BtU2+Il^#qMah&26yDk(Ip}SH`FawKg2>c=mi4Muzt&_Hl!+0qFLb|eu~vzt!P@Fb&=`Gsv4`5wjpMhYXl z6Y&->xgORs2Z=8Q-?~qKumG8>V^$m!7&{59-6g*uGnL1Vw;9UY72H-gY&D_pp~ENu&}Kh71-uHH-QP^jexTV2U)qw zgm!1e`34o0qF|A561-^-9%Fi?*^8^ZsLuS)^)KX%&`W>=`R9N1-f8#-_IpaK=-@lB$iipIWFh$a|KvS z!f~9JX}7Sg3=njVxt(ZM43!z9H92>k5qUabwO(NHwi6yr6|C0Wps3-ehnCzu+S7Lp z)|jZv#0u!J5pW7IdAGcdk&q+&sX|MJ0ibm@&R~W;m`GnGweS3L_!ww~qsBqS_n|C4 z`@;xDFua9tSP6YF0_2e7eU&TkmZ|W~hw_5q&4D?PqA{=y5#lWuBry`&HZ=FTlWBJdYdEYF%ew~an1>NE{Em2#Y1O|fH1`5 zzMo(PX-&+ojoAT+d;)$MPMJ38vR&skwK1E7U97S>^Q zj2qL6VW|p82t!pxbL7{YP-CT!@%bXn&a$IAEJ$LQ2NUqad?gn|1oIT@2$QJq{RJ?I z0Nb_*5c3y!hJGog<@82l%-n-Jt2f$Wg_kfi=ly37k&%EtwWb^oS|pEM93#;bFc73g zMo2S~ntF9v_E--A`66cvmhc126>D`beyjuLm|Au$?5G4_yzBn*U(4EH&&p!N0`@vx zfxyyp8?Xin)sn|pG+pH&jBt;lSKkC*d6%@nv2BmSS;Obk#(~1r5b{1Hq*7Xto^*#g zO{RNAJc}20Q?rrNK{VY3==(w(#T~$%c+4NR?*q*s5_f89fAry)M{>uU;%vCev+D)K zV>Wu#zh`=dB^5ixnD@4kz;I!=fY6AF8};%GuXa5Vx56`9HPk5F&pm$2hcRouj`6!A zykN&4KPo%KH51#pgjGFfJybo?Jz1j(YpSxU-8(t3LfJsg>!xgeJynZn6PgC z@c5%?ep>;_5{9F6k>TDEhw0nn7AW@5$S&U zwWIyznd-TZZEp)!>KkijgCp5#R{sOV@&8v-H0Alp`TL*KALw6qFZuI6e)5j~Sykaz)!$ETrM?cnHlA*U3B%x~Omy@C%9i#qww7DDkCt_)6R`sSS>}xHw;Dgj`%6Thb~7^lQ#*q&#_cF;NGf zG-k*B@^p5LH?{Ox3b|qirhPQZHu>11-!h3$g6+9qzMS=f=WIXiGXSsYkDvN!^Cx~$ z5*=mFofh?TN3t}ru-3p;@srZR9S5JV6*t8~kG_Hgo^>mp-uAaNN-RG}DD^XK_>CrS zYFxwB8VpOLd&R?ZQjdr-)oc2v=PDJMMDTmfk{Eq>Spd002Gd+)vrPmJy*aY*8lR+Q z!~ODZL5~--lnkLI>3yGM4!EtG--brw$lTuAHdnAKu1=hsPzgaf9e~iOXc_9vxZw@C>?4TQE&3L3N3hyHJ5oN-Ux6e+!&L zvhu15ftANix4kSUhrVp)78Nmu@6|#_j}+6s(M!&m^B%5QI?`!IFWEj@!k>~w(9}#6 zvH10t(FIE7hn>=;8UKRo>L|lb zCP$jfdlvu`?>{s4!yRtx3)U6V{3f$IoWZD#{1E1->Q8T7nF`vWKLu}f84Vzdc0X+V zerlr-tVJSz%=CFBIFdL_>W9DKy&F`SwEFk21bKTeBEP{D7gRkSy0-P`&K14e&m4Zc z7FMW$BC}0gTlTjG(WQ~|w&}JE+6CU;)2rQ|BsNr`FMu_-rqCmH6L0F&8U(!^qk=Qe zO&#I}(f1-3#pb8qp|bJz`Xj$-`}$L^Lp0+XjA03+kY>T_s@XZea{lh*s2Uf?i-kzU z51FIU-G7sYH^2&)q5JP*pfX-p{m%K_D;sIXbT3U<^(dH2TNP*Jhe33Nr|!^w+J(6@ z60ji{!a{fDw_hK-^noH5w-5Qywt^#LVFnR={5}8NxVb5E<^K8xQ^FPlcyJXd;bw)D3M%OV0htXnSVpITcj8%=Axg-Q|P4A^}Do+(*+H5TE}Po zZz>e<7g333{Kc9mvDCvs_bY48LWBKc>8r`GP-`z#gmKbCoa~` zU4fW3#PR>4{W!8NsKS{h{2#&#`hbyHTP>JIq50{@O2AX?Lo0O%{)l1LDeyo!mous!Bz~<-sV`(O<8XCg>s5j@`tSLmjwRqQEsKdI-w3r_> z`DEvOWEzCV#{(5r-OO82ZJDr2rkNKGJt?AHbDe`GEdNUFd$l3^ADdX{z?1s4Z-;mu z*AU{}9`Bxl5NJ zJU?j5Z!x@kWwxMiQeo>~ z^mYk?=Q29a>dg$KY1F(s`gA^21dga&99rN{W&b>MF4X=Be>ive4Uab%HT*ui-U)mX zB0=?=(+FglXF?w|u#O9B>bWJ`j`|%X$!cta6&^yibITj5mTvt_`MSbbS4`VlbMdh$ zNcSp+d;U(zPvzaAJ=ym6WW|Bi!_&DK(pW@uMt&={)f%FGm~b6-E{jZDkzD-x2|y3i zvA?Q!fY0j&&OaL7h`#r9VdO5eWCZhh*XlvT!sZleRK)6mpnJul8i>{m{m(-x{7v=T zTwvO2A44z&y&|Nn)$)y3#~-%=j|_t=g{$02L?(2GIP$NP4TX3jf(xSEH`;KIz-UCs z>zg9_^tAZPnSME5<`lY2CwAU}B7nCSzx+A8xEK=uH&j8Uz=v7Lq}{%7WbYy4)#mL- zqp^P4u~18NA;o()I#1Q#ptG;uy)ifZy;%IoM3>rAZxqB( zJxbAs_rdKp#1r2>$f5J8uxNSfd6{*}AuGo9=T{Z|nYG%1LcR1)p0ySK+RK4IUAk!Z z#QU_Q3p_N^c6$oF<6@zEblQo{bb>MXq9hpAn7A{jgFc$B>g^*s_sv|Wd#wOn`7AE@ zj>7<|MQ$OVebmDQOi@Vj_{Tr7jCSo6mX}Ef+Fp}ZIXHkP`-JbodrMMRDfXbw zEXvd#j6~OrK2t!+f=tt+aLOg5xPO(W0Y50X@iHXNE2jLLV>^GUjUQS=lL1p4965)T6{ZaqhCam{!mWfJo)i% zrRIS4vQxq2%Z!5d@e#tZ^2-(8<|hShQBBpF diff --git a/ui/public/static/img/meshery-logo/meshery-logo-shadow.svg b/ui/public/static/img/meshery-logo/meshery-logo-shadow.svg deleted file mode 100644 index 2bf90f81b59..00000000000 --- a/ui/public/static/img/meshery-logo/meshery-logo-shadow.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 8 \ No newline at end of file diff --git a/ui/public/static/img/meshery-logo/meshery-logo-white-text.png b/ui/public/static/img/meshery-logo/meshery-logo-white-text.png deleted file mode 100644 index f5664c62c0bb8aac4737d5923457b31f32db1d8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31511 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

MC&s!h})nMEO>&a6eO0R_oDC0 z?C5NMbEmyebA5plT!{j9cJ{?>$)dK#!ANt#((QAB-Li}9oCKg)B0wCR0S@Ao5tg|j zE1Z;-9H?3s{2*c1CLahgaKtY1)K}V6x#CiEdPMkl;i9nMU8^X#0mkL6PhLOq(ov9x z_M(@~A{#Q#)+?~?s zCo-wb2GUxu^S6Fb>O4zNq_-nXNDWiU$_=tcBx(Tj9J?XT1{#x(TcSWkjTVqc$j*$Y zdcb6%J%#?9XP7?*mj4{kF+dd4$>OPs#XN}4<B4DhF z?CVeIuF;E|en5h&1oS9C9uZXCjQf%{1xX{X0AU!~s5tNDyu#xIWxDJCjuhx<_WPu~ zoCT1$T9U!PEvxkFWu~^%_RMKf!B1LArdQ1vLJWQSz+_iTncs5NiC6%=(Mym8aE_4S zc~C4gZ#*gVLJh<<`$d3ul&&p{wl55Gw+tc9Bz!SVqH=8LbdNr1*NHmL(I9v*^N*Be zIx0$nD)PFC_+V5ozB4VkJx5EsW^b}B)EEMCPt4Nu^irKD$j_lVh(qVx&O&YxYEGb9 zNm@(le|fI(8YfZ!+r+5reL;zX*%1;0xG<1Ua@?g`1D>_oJ2|A^OaNrlN5tnnQ>GTKYXHGzM}2~&Uu!^#(X5sfXqH1f z6v-|9X(LUvf#)wZ{fA&I&B}))d2l170}y*j%o{KU?b&^`H~>YcrV!-Gmntm zz?f?FcXA{+KnFViUMTR|hhW+%+{jS;hNocI3L;?Vk~T89zNA%$=M4x&7(N^A4-5MZ z)(#-dHTnS9hZ6#T`0A_vky7WBZK1O0G;@anB@;U4Fs%xXVSu-DIsk8{y5vjBX=Fnz zAV$_$1!JGnBUr*jhLbKR9xS*R7>)9dyq^xt@zppMpNkjj^P9V$z^(=s_eXOcCEhnp z=mp6y`yxZGz`}u8!*YYG+bnzTVP>fIdl^IoHfG!^c8hFSwY-QqlDufv z#Hx{&zXhQIMRlL(SzDAy-CF0nP|DYoA=3Tz!^I!d>SAvhlsyPe7e0nYMnj9Doq+Du zG3oIGK*d(iqhUAsB6|AJ=#@FvO0USznqOv}b2rwz;gb|fVgjzRczt)WB`U{dEtaKn+WM-}N})?7}B7^`P*#R?p^ghsAngOgU-}A&y+AC#9abY z1(|HbZE1<;@KWp(7jKz+%|6o-Y=^P+<*m{tIn$mK#ayO7`G`gyxG=cc;Nc&SKVs|i zx7*%-yrxorg6jfs=qJ{Lrpnn79}vt$YAHXviC#Y+V;k~&Z|f(v#O78+zAie6lyPpQ z&(CX~wJ+i_S>p?{6UjaMLOF*OVS>XK+VC_ruwTVrM1|{8?{p}R%Vx{^UuAPoXn(zV zMa20F_Uwsa{x0CUVAFDG!3f8SnhS0|cGJ_w8^Uk0njB{-|D0vFm+iRo%vpe}U1lsL zbvmc3)kjVuT#8P;!2By4PRxL(Aj7jkdp}ySJFKO1S?$;TN>sS}%qlkVYojomLYeW= zp7WAqAEkKgi?i!%Vdd?F;2m7qU*GRpyLdKRjH<4FBC=VN`C~yNk`=Lfy9YtMVP~pe z3j{S%S$hb}#?*gyY?3HL{_pR9-UDocn}6TQ&F#HoB*M8REKD+`D1Be~w`<{k<_jy8 zMV<1wA?t_x#AI9VbT_Ua9(!Ol674xRpQ;_QgZ|m5(AFR*By}>N(ZnFg;KtO-g9+~P zh3IJx)4vnu%$fe?jcaC&%X+mx#p=)8+%>*jyjClqy1MLNte&qPD9YjeqG;3nuKN#z=R8`JyVrkJQg@DB+GRv~JRFB# zv5({bVUxc$f4y$aQ$1-O%j{U)gTbw->f3exD8XJr@l$7Rl4b>;AFy^IL105DlPp6wb77$ z=7n~2&pMZF%i^h|ajVz+nR1-CXqe7ervIbILArI$Mht%y|BM8z9R7fp5DUV5EE+8H zEyxTrRW(!cf%mUjQPn-p_{@>9RI`QvQG4&*clam`v)t9BP}-JRt)^0u?`tfV>Vj2O z=L3o}pECkV0ZuTjgtlQdNz4X{v>ZeV7$mnMa=0H)1 zsZI2CrD?zV)qgT_zU@;&2 zVlBBNj(b*zL%4pYv;Cp?M|(d(agbTTS5`cs(CoC6sx@9O9n^y1nP%k3sy zkR)r(Zr*GE>j9_N75Ij#U-5}Cp~e_?^JK}?O`)=kMbLBm)4&UgN_`&gi@|DmHTJICA!q0|!jg@@c-?!GKf z>@X#yv{RtG={STvVWu2 zDK2~ax54RBI5T+8u?BqUS^z%O@j$ZOqPFh{1xcqpPl0_ zAbtu>)7^Z+Tk5*C-naadmkbh`aqPs&?(Pqh*`~@ug7#lcH;oPj8#jt>4x-;enx^XW zZEba{e&+@cMe;$S)E9X?T<7+75ueyWrH@>fA~;R2&zrn$6lp&q_x26+#LAf+OHZEA zPtjPHr~7R0l-=aJ+NbqHxarK41-*4t+D1nib3+anELJWev)v*#YgY!-Orvw|uvv7! zS;w1G_cI@*r#jtxv^VJ_=_EGbwRXO?e5(|>ec2{q;&ALu*}n7YhCG@?O$B*luJUI2 zz7WpK8pNhNK6aC7?XveTM&dD@~T-q~<3~++n51 zX<^pj7$F^SG~j+YKjIUP!y{nB@I7(-z6Zyh5|=C#n(MdeXL9meNDpQ879A@2a*JZi z7F7NbH$mksXE#SKIVTUCEH6&%ps(xh?i`4^A|Pm=vss3;qsrly{D41(;cRXwL3XZ$ z0ZhvNDx<}3^DD5M*!8yB*#2@Po~K-6t8ijZti7`Era3}|S#0(&jYXqK#FsFmEiYTU zs2nbRt&$Cuk>okkzyp$NuP7tL*5Di@zUv6dIB26#HoJZg7VXgi^U* zH*!ui)#TT^M%iSc^NMm>nWmeN(LkG)Z@-Hm+iKKyE<()t?#rllwWY+4=en7*A%wN- zgGUFG`!|c9QUFvWlA_OSq3a6l@$)yNjr3`zvsAGUOYjoEYA#nf3^tchzSb zg5boGh4=dReV8;zuttEX#o=sY%Q&{}eWe1;aq5GNF5v1mr z@=2deF7vMK$wTP3mO`3@lvRNsr5N_TbK2LtKCi(Lw{iD_3+2@1!HTrW#&GwDEoTHg z;Cuv~4oc*L#1dxgj?IY161=brEEo5|V;Oa`X<3}&%!8V}hCau^#btf#duk4rqN26^YOIM#D)wp|A+%m8{-iKgqfI`fCPE-4w zH-f}u*wIIp%$Wfx?$b|dN(03Q*0T%G(?jBUL-BoL4$BpfRBj4xmF|rZjp5HG%-7c+ z&0kk(+{QK~ac2J5vO|sf%9HnP+^FJ>n~(Cqs?KPB@4hsjQ;oY4#s@mDsW3HzG8c>2 z7JQlCy$|Dr7(PJ}_E`@z)}B4qiJa426%fo&g2Ld zf^mV65d0RQY3ce_+Vjki;x!gzl3XdHrE^abNVuU@0C4@xF>tvqxc+5xQXLEFgoEu> zV=G)|=|&S!qY7P_`tYH(p+BcNsa$8!U?=GxAX-Q*j-QU!iG09$UK)&Z-p8c0mcP6+ zhEd^>unlK6qFbXUwpUJ0s}tPh-+vJ-2Cm6m8IrliqT#%paV|WLTTn3LCIlG6#GIsF zOAb2@ji?veuh~V>OMbv5DLR9d+zZ(i415_IPI#xK9K&d!BSidEIU2^>c9+U*el=9V z@Kr}7U-xyghBJSI$zOx-R7%Vge{0L;R%v~qXBOE*h|qPYDL6;k2BvEP?1rYC9*@c{ z1OHC>iQgG@I*~}}83!e|6MK^b?zXjY7eM7^G{1{S!cIQ`@`dim!{*fETedvYg|F-c z^d<5sE4VEFg%ji~XQBU)7=41AsE)p)F#6V1^yy{1mEA>jQh(PK5QkNmw9&;nDyX7k zU<$VD>8_h9bK}kQ}PX`?3Fe}U=3+UEgu`Zw4wGaAf zzy)c#Bb@kKH9yxy{0c!rZKq!4qm~Fvpg59n$Tu+cO5hKo@tQCHqYp#t0+TC?6ng&Q zJ~Ho}Zgq7doR2zR2XqHSu>%xG+GMxZA;nc;k@(@fk-K=VCqndVnZeB5U~3M&__fs& zoRX(%&&(2a;2a7E-LV6WFV~byFNWOQO-u|vJ~TBD*-?sLzef*A^O5rw=Og}m+iQlH zfv=SJ!_Ao&g%gXi70aJE{4$grbYBaom@(GG-?a_de!IgQUlbEVNoobuF0bc5;bQcT zSlY3pu@eIY>uS`N3!i2@N-nJlk=S5pc3Ja)=S zYbWNgwa|3YN`={+1%uaJ9WHSXb;VPKz<@sLhio6w_P#lCKjQYdh z_vPkV_#NOxky41$?M!1CAo8@v7KU4v{HA{O6RDIggX_>V5JK9mJ9NRBZGmW3m>?ewQz%uUb#JhOAUc)|in zffeRn~GGPc&Yv+dcq>l)-YVA$r-E^2{p}Y zPD*7oZ+xgqzqc|n408io+lW+V?a&M;vC7GF6h`J@jYE*yeQx{w`G~%mxw)$>8%KIN z?QHE~0ocwYY;)y z(a7EJr(DvQBjR&5%#O&!xPs6Y4;n{TGYkR`+FJD*lb^7VG~wi$T8p{2i?gEE1eR>{ z_m|}-X)ia8I!kw~vxmm!HYY{UBj7ci^RKTsz2(^hdtLB%r|-WNHL+7Mt1vcC96^ac zpUcwdi5|n}*+d2S+|JAubM=GcZ2sWbmUntgE6T0^mGaIu_QiCnDTcLv7wvUvAMTC0 zYj@v@mnYvyU*F2s*8w8oGS}#YwARJ^chau?yp0QimDc4y}`CohlQ3D%ZE^kT3JXux`eY``!k-DSPkkjEi??# zxWBQ1D^%3^h-?3@N{tZoA89tbg;*Ic8WM>Tl#|RxVqIe$pkv(RVhJ}_ zi{)eIKeMW$!w}qmJ(+FPEXd$Xj(XtV#0t|!KWg!WHpu&y+Y7-NEC?&j6{&U_N5S`3pTv1Z7bSD{PK_wuN+S$C!ITi%_Rnqm$0ZT6Xnz=qZ zV$4Qa1sU=+Y-9EGqgTlLR(y$?5Q1MS5R5iyalPWkR>d8gGn~PiBWR1w&NFf95v~56f_u-OLuGv{TsjX;;%d9#S@TdYrj6n lhMuVWe}DfwJ@8;!XomOXcmKWD4xtY`qm9)nJbCHPe*s(-dCC9) diff --git a/ui/public/static/img/meshery-logo/meshery-logo-white.png b/ui/public/static/img/meshery-logo/meshery-logo-white.png deleted file mode 100644 index ad49a572ae8567585fb86de973c0693256728f3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12947 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 UwZoG9tVPzs>0N%VZhQNG0MtxBJpcdz diff --git a/ui/public/static/img/meshery-logo/meshery-logo.svg b/ui/public/static/img/meshery-logo/meshery-logo.svg deleted file mode 100644 index d50149cec6d..00000000000 --- a/ui/public/static/img/meshery-logo/meshery-logo.svg +++ /dev/null @@ -1 +0,0 @@ -Asset 3 \ No newline at end of file diff --git a/ui/public/static/img/meshery-logo/meshery-text-dark.png b/ui/public/static/img/meshery-logo/meshery-text-dark.png deleted file mode 100644 index 40989de1c4efdfcc1046a9cc935f7abef6a157f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3398 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 diff --git a/ui/public/static/img/meshery-logo/meshery-text-white.png b/ui/public/static/img/meshery-logo/meshery-text-white.png deleted file mode 100644 index 007012c4afad8a2544ffb3555acd8c0a2a8fd5be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5728 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 M07*qoM6N<$f}fAG0ssI2 diff --git a/ui/public/static/img/meshery-logo/meshery-white.svg b/ui/public/static/img/meshery-logo/meshery-white.svg deleted file mode 100644 index f87689a61ab..00000000000 --- a/ui/public/static/img/meshery-logo/meshery-white.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/ui/public/static/img/meshery-nighthawk.svg b/ui/public/static/img/meshery-nighthawk.svg deleted file mode 100644 index 4cb895e1534..00000000000 --- a/ui/public/static/img/meshery-nighthawk.svg +++ /dev/null @@ -1 +0,0 @@ -nighthawk-logo \ No newline at end of file diff --git a/ui/public/static/img/meshery-operator.svg b/ui/public/static/img/meshery-operator.svg deleted file mode 100644 index 7894c1cd40b..00000000000 --- a/ui/public/static/img/meshery-operator.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/meshery_catalog.svg b/ui/public/static/img/meshery_catalog.svg deleted file mode 100644 index bae57a81631..00000000000 --- a/ui/public/static/img/meshery_catalog.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/meshmap-snapshot-logo.svg b/ui/public/static/img/meshmap-snapshot-logo.svg deleted file mode 100644 index 3eec129f4ea..00000000000 --- a/ui/public/static/img/meshmap-snapshot-logo.svg +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/meshmap.svg b/ui/public/static/img/meshmap.svg deleted file mode 100644 index 3b78be4b45d..00000000000 --- a/ui/public/static/img/meshmap.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/meshsync-white.svg b/ui/public/static/img/meshsync-white.svg deleted file mode 100644 index 075320e75e9..00000000000 --- a/ui/public/static/img/meshsync-white.svg +++ /dev/null @@ -1 +0,0 @@ -meshsync-white \ No newline at end of file diff --git a/ui/public/static/img/meshsync.svg b/ui/public/static/img/meshsync.svg deleted file mode 100644 index 153eb0f3883..00000000000 --- a/ui/public/static/img/meshsync.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/model-categories/dark/analytics-dark.svg b/ui/public/static/img/model-categories/dark/analytics-dark.svg deleted file mode 100644 index 83a4e4fe8d6..00000000000 --- a/ui/public/static/img/model-categories/dark/analytics-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/dark/apps-dark.svg b/ui/public/static/img/model-categories/dark/apps-dark.svg deleted file mode 100644 index 8467ce8effa..00000000000 --- a/ui/public/static/img/model-categories/dark/apps-dark.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/dark/cloud-native-application-dark.svg b/ui/public/static/img/model-categories/dark/cloud-native-application-dark.svg deleted file mode 100644 index bfdbf78988b..00000000000 --- a/ui/public/static/img/model-categories/dark/cloud-native-application-dark.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/dark/cloud-native-network-dark.svg b/ui/public/static/img/model-categories/dark/cloud-native-network-dark.svg deleted file mode 100644 index 9b31193f6b1..00000000000 --- a/ui/public/static/img/model-categories/dark/cloud-native-network-dark.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/dark/database-dark.svg b/ui/public/static/img/model-categories/dark/database-dark.svg deleted file mode 100644 index 0c7a3115d2e..00000000000 --- a/ui/public/static/img/model-categories/dark/database-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/dark/database-storage-dark.svg b/ui/public/static/img/model-categories/dark/database-storage-dark.svg deleted file mode 100644 index 30273380199..00000000000 --- a/ui/public/static/img/model-categories/dark/database-storage-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/dark/machine-learning-dark.svg b/ui/public/static/img/model-categories/dark/machine-learning-dark.svg deleted file mode 100644 index 1098a520903..00000000000 --- a/ui/public/static/img/model-categories/dark/machine-learning-dark.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/dark/observability-analysis-dark.svg b/ui/public/static/img/model-categories/dark/observability-analysis-dark.svg deleted file mode 100644 index dbf21163b1c..00000000000 --- a/ui/public/static/img/model-categories/dark/observability-analysis-dark.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/dark/orchestration-management-dark.svg b/ui/public/static/img/model-categories/dark/orchestration-management-dark.svg deleted file mode 100644 index 76172d4b46a..00000000000 --- a/ui/public/static/img/model-categories/dark/orchestration-management-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/dark/other-dark.svg b/ui/public/static/img/model-categories/dark/other-dark.svg deleted file mode 100644 index 7c3972c1608..00000000000 --- a/ui/public/static/img/model-categories/dark/other-dark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/ui/public/static/img/model-categories/dark/platform-dark.svg b/ui/public/static/img/model-categories/dark/platform-dark.svg deleted file mode 100644 index f874b7b36dc..00000000000 --- a/ui/public/static/img/model-categories/dark/platform-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/dark/provisioning-dark.svg b/ui/public/static/img/model-categories/dark/provisioning-dark.svg deleted file mode 100644 index fce8517eca0..00000000000 --- a/ui/public/static/img/model-categories/dark/provisioning-dark.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/ui/public/static/img/model-categories/dark/runtime-dark.svg b/ui/public/static/img/model-categories/dark/runtime-dark.svg deleted file mode 100644 index 43ff13d1b72..00000000000 --- a/ui/public/static/img/model-categories/dark/runtime-dark.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/dark/serverless-dark.svg b/ui/public/static/img/model-categories/dark/serverless-dark.svg deleted file mode 100644 index 34599616999..00000000000 --- a/ui/public/static/img/model-categories/dark/serverless-dark.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/dark/tools-dark.svg b/ui/public/static/img/model-categories/dark/tools-dark.svg deleted file mode 100644 index 8813c1cdbad..00000000000 --- a/ui/public/static/img/model-categories/dark/tools-dark.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/analytics-label-green.svg b/ui/public/static/img/model-categories/label-green/analytics-label-green.svg deleted file mode 100644 index 60f41c033f9..00000000000 --- a/ui/public/static/img/model-categories/label-green/analytics-label-green.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/app-definition-development-label-green.svg b/ui/public/static/img/model-categories/label-green/app-definition-development-label-green.svg deleted file mode 100644 index a3cc0dbc823..00000000000 --- a/ui/public/static/img/model-categories/label-green/app-definition-development-label-green.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/cloud-native-application-label-green.svg b/ui/public/static/img/model-categories/label-green/cloud-native-application-label-green.svg deleted file mode 100644 index 52033a59460..00000000000 --- a/ui/public/static/img/model-categories/label-green/cloud-native-application-label-green.svg +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/cloud-native-network-label-green.svg b/ui/public/static/img/model-categories/label-green/cloud-native-network-label-green.svg deleted file mode 100644 index 7fc7dd3aee1..00000000000 --- a/ui/public/static/img/model-categories/label-green/cloud-native-network-label-green.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/database-label-green.svg b/ui/public/static/img/model-categories/label-green/database-label-green.svg deleted file mode 100644 index 8969e3d0caa..00000000000 --- a/ui/public/static/img/model-categories/label-green/database-label-green.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/database-storage-label-green.svg b/ui/public/static/img/model-categories/label-green/database-storage-label-green.svg deleted file mode 100644 index 23ccc51f192..00000000000 --- a/ui/public/static/img/model-categories/label-green/database-storage-label-green.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/machine-learning-label-green.svg b/ui/public/static/img/model-categories/label-green/machine-learning-label-green.svg deleted file mode 100644 index 7e75c684bda..00000000000 --- a/ui/public/static/img/model-categories/label-green/machine-learning-label-green.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/observability-analysis-label-green.svg b/ui/public/static/img/model-categories/label-green/observability-analysis-label-green.svg deleted file mode 100644 index c0f18731e39..00000000000 --- a/ui/public/static/img/model-categories/label-green/observability-analysis-label-green.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/orchestration-management-label-green.svg b/ui/public/static/img/model-categories/label-green/orchestration-management-label-green.svg deleted file mode 100644 index c67730402c1..00000000000 --- a/ui/public/static/img/model-categories/label-green/orchestration-management-label-green.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/other-label-green.svg b/ui/public/static/img/model-categories/label-green/other-label-green.svg deleted file mode 100644 index 8abef257c86..00000000000 --- a/ui/public/static/img/model-categories/label-green/other-label-green.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/platform-label-green.svg b/ui/public/static/img/model-categories/label-green/platform-label-green.svg deleted file mode 100644 index a3355c5407b..00000000000 --- a/ui/public/static/img/model-categories/label-green/platform-label-green.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/provisioning-label-green.svg b/ui/public/static/img/model-categories/label-green/provisioning-label-green.svg deleted file mode 100644 index 8c1412c70fc..00000000000 --- a/ui/public/static/img/model-categories/label-green/provisioning-label-green.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/runtime-label-green.svg b/ui/public/static/img/model-categories/label-green/runtime-label-green.svg deleted file mode 100644 index 87de44cb9db..00000000000 --- a/ui/public/static/img/model-categories/label-green/runtime-label-green.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/serverless-label-green.svg b/ui/public/static/img/model-categories/label-green/serverless-label-green.svg deleted file mode 100644 index a9faf5cb856..00000000000 --- a/ui/public/static/img/model-categories/label-green/serverless-label-green.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label-green/tools-label-green.svg b/ui/public/static/img/model-categories/label-green/tools-label-green.svg deleted file mode 100644 index 8c90f98743f..00000000000 --- a/ui/public/static/img/model-categories/label-green/tools-label-green.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/analytics-label.svg b/ui/public/static/img/model-categories/label/analytics-label.svg deleted file mode 100644 index 0fdf26be9c5..00000000000 --- a/ui/public/static/img/model-categories/label/analytics-label.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/app-definition-development-label.svg b/ui/public/static/img/model-categories/label/app-definition-development-label.svg deleted file mode 100644 index 17f78586e07..00000000000 --- a/ui/public/static/img/model-categories/label/app-definition-development-label.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/cloud-native-application-label.svg b/ui/public/static/img/model-categories/label/cloud-native-application-label.svg deleted file mode 100644 index f3c8139e4cb..00000000000 --- a/ui/public/static/img/model-categories/label/cloud-native-application-label.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/cloud-native-network-label.svg b/ui/public/static/img/model-categories/label/cloud-native-network-label.svg deleted file mode 100644 index f44c93db1a0..00000000000 --- a/ui/public/static/img/model-categories/label/cloud-native-network-label.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/cloud-native-storage-label.svg b/ui/public/static/img/model-categories/label/cloud-native-storage-label.svg deleted file mode 100644 index 590da084fd2..00000000000 --- a/ui/public/static/img/model-categories/label/cloud-native-storage-label.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/database-label.svg b/ui/public/static/img/model-categories/label/database-label.svg deleted file mode 100644 index fe4944a43d7..00000000000 --- a/ui/public/static/img/model-categories/label/database-label.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/machine-learning-label.svg b/ui/public/static/img/model-categories/label/machine-learning-label.svg deleted file mode 100644 index 44a7da7751c..00000000000 --- a/ui/public/static/img/model-categories/label/machine-learning-label.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/observability-analysis-label.svg b/ui/public/static/img/model-categories/label/observability-analysis-label.svg deleted file mode 100644 index cedc22bc184..00000000000 --- a/ui/public/static/img/model-categories/label/observability-analysis-label.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/orchestration-management-label.svg b/ui/public/static/img/model-categories/label/orchestration-management-label.svg deleted file mode 100644 index c2ac62f7c5e..00000000000 --- a/ui/public/static/img/model-categories/label/orchestration-management-label.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/other-label.svg b/ui/public/static/img/model-categories/label/other-label.svg deleted file mode 100644 index 349e0e43924..00000000000 --- a/ui/public/static/img/model-categories/label/other-label.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/label/platform-label.svg b/ui/public/static/img/model-categories/label/platform-label.svg deleted file mode 100644 index 0bb01e5222e..00000000000 --- a/ui/public/static/img/model-categories/label/platform-label.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/provisioning-label.svg b/ui/public/static/img/model-categories/label/provisioning-label.svg deleted file mode 100644 index 36ddae1f71d..00000000000 --- a/ui/public/static/img/model-categories/label/provisioning-label.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/runtime-label.svg b/ui/public/static/img/model-categories/label/runtime-label.svg deleted file mode 100644 index 92a56292883..00000000000 --- a/ui/public/static/img/model-categories/label/runtime-label.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/security-compliance-label.svg b/ui/public/static/img/model-categories/label/security-compliance-label.svg deleted file mode 100644 index 78b079c9ec6..00000000000 --- a/ui/public/static/img/model-categories/label/security-compliance-label.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/serverless-label.svg b/ui/public/static/img/model-categories/label/serverless-label.svg deleted file mode 100644 index ee48d51a129..00000000000 --- a/ui/public/static/img/model-categories/label/serverless-label.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/service-mesh-label.svg b/ui/public/static/img/model-categories/label/service-mesh-label.svg deleted file mode 100644 index f44c93db1a0..00000000000 --- a/ui/public/static/img/model-categories/label/service-mesh-label.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/tools-label.svg b/ui/public/static/img/model-categories/label/tools-label.svg deleted file mode 100644 index be5d92cc020..00000000000 --- a/ui/public/static/img/model-categories/label/tools-label.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/label/uncategorized-label.svg b/ui/public/static/img/model-categories/label/uncategorized-label.svg deleted file mode 100644 index d1e0b906015..00000000000 --- a/ui/public/static/img/model-categories/label/uncategorized-label.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/light/analytics-light.svg b/ui/public/static/img/model-categories/light/analytics-light.svg deleted file mode 100644 index 3addec5e4f0..00000000000 --- a/ui/public/static/img/model-categories/light/analytics-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/light/apps-light.svg b/ui/public/static/img/model-categories/light/apps-light.svg deleted file mode 100644 index d5726dac10b..00000000000 --- a/ui/public/static/img/model-categories/light/apps-light.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/light/cloud-native-application-light.svg b/ui/public/static/img/model-categories/light/cloud-native-application-light.svg deleted file mode 100644 index 1a06a4c904c..00000000000 --- a/ui/public/static/img/model-categories/light/cloud-native-application-light.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/light/cloud-native-network-light.svg b/ui/public/static/img/model-categories/light/cloud-native-network-light.svg deleted file mode 100644 index be9bd71f6a7..00000000000 --- a/ui/public/static/img/model-categories/light/cloud-native-network-light.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/light/database-light.svg b/ui/public/static/img/model-categories/light/database-light.svg deleted file mode 100644 index 40e8c6a413f..00000000000 --- a/ui/public/static/img/model-categories/light/database-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/light/database-storage-light.svg b/ui/public/static/img/model-categories/light/database-storage-light.svg deleted file mode 100644 index e5ac4675cf5..00000000000 --- a/ui/public/static/img/model-categories/light/database-storage-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/light/machine-learning-light.svg b/ui/public/static/img/model-categories/light/machine-learning-light.svg deleted file mode 100644 index bd939bb598f..00000000000 --- a/ui/public/static/img/model-categories/light/machine-learning-light.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/light/observability-analysis-light.svg b/ui/public/static/img/model-categories/light/observability-analysis-light.svg deleted file mode 100644 index 62b92fe1f8f..00000000000 --- a/ui/public/static/img/model-categories/light/observability-analysis-light.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/light/orchestration-management-light.svg b/ui/public/static/img/model-categories/light/orchestration-management-light.svg deleted file mode 100644 index c93efe3ce33..00000000000 --- a/ui/public/static/img/model-categories/light/orchestration-management-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/light/other-light.svg b/ui/public/static/img/model-categories/light/other-light.svg deleted file mode 100644 index c7e9db65a32..00000000000 --- a/ui/public/static/img/model-categories/light/other-light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/ui/public/static/img/model-categories/light/platform-light.svg b/ui/public/static/img/model-categories/light/platform-light.svg deleted file mode 100644 index 90ffd4927a0..00000000000 --- a/ui/public/static/img/model-categories/light/platform-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/light/provisioning-light.svg b/ui/public/static/img/model-categories/light/provisioning-light.svg deleted file mode 100644 index 86697e4253d..00000000000 --- a/ui/public/static/img/model-categories/light/provisioning-light.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/ui/public/static/img/model-categories/light/runtime-light.svg b/ui/public/static/img/model-categories/light/runtime-light.svg deleted file mode 100644 index 861e78c81c3..00000000000 --- a/ui/public/static/img/model-categories/light/runtime-light.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/light/serverless-light.svg b/ui/public/static/img/model-categories/light/serverless-light.svg deleted file mode 100644 index db80d2d7331..00000000000 --- a/ui/public/static/img/model-categories/light/serverless-light.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/light/tools-light.svg b/ui/public/static/img/model-categories/light/tools-light.svg deleted file mode 100644 index e5d03283653..00000000000 --- a/ui/public/static/img/model-categories/light/tools-light.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/white/analytics-white.svg b/ui/public/static/img/model-categories/white/analytics-white.svg deleted file mode 100644 index 85593f898bb..00000000000 --- a/ui/public/static/img/model-categories/white/analytics-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/white/apps-white.svg b/ui/public/static/img/model-categories/white/apps-white.svg deleted file mode 100644 index 98b271f736e..00000000000 --- a/ui/public/static/img/model-categories/white/apps-white.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/white/cloud-native-application-white.svg b/ui/public/static/img/model-categories/white/cloud-native-application-white.svg deleted file mode 100644 index 017f7a26ccb..00000000000 --- a/ui/public/static/img/model-categories/white/cloud-native-application-white.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/white/cloud-native-network-white.svg b/ui/public/static/img/model-categories/white/cloud-native-network-white.svg deleted file mode 100644 index a6391f212cf..00000000000 --- a/ui/public/static/img/model-categories/white/cloud-native-network-white.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/white/database-storage-white.svg b/ui/public/static/img/model-categories/white/database-storage-white.svg deleted file mode 100644 index 6e0ed3141a6..00000000000 --- a/ui/public/static/img/model-categories/white/database-storage-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/white/database-white.svg b/ui/public/static/img/model-categories/white/database-white.svg deleted file mode 100644 index b0698021042..00000000000 --- a/ui/public/static/img/model-categories/white/database-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/white/machine-learning-white.svg b/ui/public/static/img/model-categories/white/machine-learning-white.svg deleted file mode 100644 index 25b63c58e0e..00000000000 --- a/ui/public/static/img/model-categories/white/machine-learning-white.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/white/observability-analysis-white.svg b/ui/public/static/img/model-categories/white/observability-analysis-white.svg deleted file mode 100644 index 2f142975171..00000000000 --- a/ui/public/static/img/model-categories/white/observability-analysis-white.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/white/orchestration-management-white.svg b/ui/public/static/img/model-categories/white/orchestration-management-white.svg deleted file mode 100644 index e2220bb84ef..00000000000 --- a/ui/public/static/img/model-categories/white/orchestration-management-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/white/other-white.svg b/ui/public/static/img/model-categories/white/other-white.svg deleted file mode 100644 index 2d5e7004888..00000000000 --- a/ui/public/static/img/model-categories/white/other-white.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/ui/public/static/img/model-categories/white/platform-white.svg b/ui/public/static/img/model-categories/white/platform-white.svg deleted file mode 100644 index 9e626a1a6b1..00000000000 --- a/ui/public/static/img/model-categories/white/platform-white.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/model-categories/white/provisioning-white.svg b/ui/public/static/img/model-categories/white/provisioning-white.svg deleted file mode 100644 index b5bcd9c327a..00000000000 --- a/ui/public/static/img/model-categories/white/provisioning-white.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/ui/public/static/img/model-categories/white/runtime-white.svg b/ui/public/static/img/model-categories/white/runtime-white.svg deleted file mode 100644 index 3a0d0a0a1f9..00000000000 --- a/ui/public/static/img/model-categories/white/runtime-white.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/white/serverless-white.svg b/ui/public/static/img/model-categories/white/serverless-white.svg deleted file mode 100644 index bedb0701ac8..00000000000 --- a/ui/public/static/img/model-categories/white/serverless-white.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/model-categories/white/tools-white.svg b/ui/public/static/img/model-categories/white/tools-white.svg deleted file mode 100644 index a6904dc7430..00000000000 --- a/ui/public/static/img/model-categories/white/tools-white.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/ui/public/static/img/nats-icon-color.svg b/ui/public/static/img/nats-icon-color.svg deleted file mode 100644 index 4a44b41a78d..00000000000 --- a/ui/public/static/img/nats-icon-color.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/network_service_mesh-light.svg b/ui/public/static/img/network_service_mesh-light.svg deleted file mode 100644 index 8f9c9aaa739..00000000000 --- a/ui/public/static/img/network_service_mesh-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/network_service_mesh-white.svg b/ui/public/static/img/network_service_mesh-white.svg deleted file mode 100644 index bbc623ba727..00000000000 --- a/ui/public/static/img/network_service_mesh-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/network_service_mesh.svg b/ui/public/static/img/network_service_mesh.svg deleted file mode 100644 index 7db70ceacbd..00000000000 --- a/ui/public/static/img/network_service_mesh.svg +++ /dev/null @@ -1 +0,0 @@ -network-service-mesh-icon-color \ No newline at end of file diff --git a/ui/public/static/img/networkservicemesh.svg b/ui/public/static/img/networkservicemesh.svg deleted file mode 100644 index 7db70ceacbd..00000000000 --- a/ui/public/static/img/networkservicemesh.svg +++ /dev/null @@ -1 +0,0 @@ -network-service-mesh-icon-color \ No newline at end of file diff --git a/ui/public/static/img/nginx-light.svg b/ui/public/static/img/nginx-light.svg deleted file mode 100644 index 728661006c7..00000000000 --- a/ui/public/static/img/nginx-light.svg +++ /dev/null @@ -1 +0,0 @@ -NGINX Logo White Endorsement RGB \ No newline at end of file diff --git a/ui/public/static/img/nginx.svg b/ui/public/static/img/nginx.svg deleted file mode 100644 index 9ae67430b71..00000000000 --- a/ui/public/static/img/nginx.svg +++ /dev/null @@ -1 +0,0 @@ -NGINX Logo White Endorsement RGB \ No newline at end of file diff --git a/ui/public/static/img/nginx_service_mesh-light.svg b/ui/public/static/img/nginx_service_mesh-light.svg deleted file mode 100644 index 08a8feba730..00000000000 --- a/ui/public/static/img/nginx_service_mesh-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/nginx_service_mesh.svg b/ui/public/static/img/nginx_service_mesh.svg deleted file mode 100644 index 772dcdd9407..00000000000 --- a/ui/public/static/img/nginx_service_mesh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/nighthawk-logo.svg b/ui/public/static/img/nighthawk-logo.svg deleted file mode 100644 index 4cb895e1534..00000000000 --- a/ui/public/static/img/nighthawk-logo.svg +++ /dev/null @@ -1 +0,0 @@ -nighthawk-logo \ No newline at end of file diff --git a/ui/public/static/img/nighthawk-logo_white.svg b/ui/public/static/img/nighthawk-logo_white.svg deleted file mode 100644 index 6d1368c3418..00000000000 --- a/ui/public/static/img/nighthawk-logo_white.svg +++ /dev/null @@ -1 +0,0 @@ -nighthawk-icon_white \ No newline at end of file diff --git a/ui/public/static/img/octarine-light.svg b/ui/public/static/img/octarine-light.svg deleted file mode 100644 index 9cd8b2b9bfa..00000000000 --- a/ui/public/static/img/octarine-light.svg +++ /dev/null @@ -1 +0,0 @@ -octarine \ No newline at end of file diff --git a/ui/public/static/img/octarine-white.svg b/ui/public/static/img/octarine-white.svg deleted file mode 100644 index 9cd8b2b9bfa..00000000000 --- a/ui/public/static/img/octarine-white.svg +++ /dev/null @@ -1 +0,0 @@ -octarine \ No newline at end of file diff --git a/ui/public/static/img/octarine.svg b/ui/public/static/img/octarine.svg deleted file mode 100644 index 79819fecb16..00000000000 --- a/ui/public/static/img/octarine.svg +++ /dev/null @@ -1 +0,0 @@ -octarine \ No newline at end of file diff --git a/ui/public/static/img/open_service_mesh-light.svg b/ui/public/static/img/open_service_mesh-light.svg deleted file mode 100644 index e53d69d626f..00000000000 --- a/ui/public/static/img/open_service_mesh-light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/open_service_mesh-white.svg b/ui/public/static/img/open_service_mesh-white.svg deleted file mode 100644 index e53d69d626f..00000000000 --- a/ui/public/static/img/open_service_mesh-white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/open_service_mesh.svg b/ui/public/static/img/open_service_mesh.svg deleted file mode 100644 index 75e38ee12bb..00000000000 --- a/ui/public/static/img/open_service_mesh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/openservicemesh.svg b/ui/public/static/img/openservicemesh.svg deleted file mode 100644 index 75e38ee12bb..00000000000 --- a/ui/public/static/img/openservicemesh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/pattcolor.svg b/ui/public/static/img/pattcolor.svg deleted file mode 100644 index a7faf3e1c2b..00000000000 --- a/ui/public/static/img/pattcolor.svg +++ /dev/null @@ -1 +0,0 @@ -pattern-configure-color \ No newline at end of file diff --git a/ui/public/static/img/pattern_trans.svg b/ui/public/static/img/pattern_trans.svg deleted file mode 100644 index d7ffdf65146..00000000000 --- a/ui/public/static/img/pattern_trans.svg +++ /dev/null @@ -1 +0,0 @@ -pattern_trans \ No newline at end of file diff --git a/ui/public/static/img/performance.svg b/ui/public/static/img/performance.svg deleted file mode 100644 index d5b0931890c..00000000000 --- a/ui/public/static/img/performance.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/private.svg b/ui/public/static/img/private.svg deleted file mode 100644 index eaebc515d79..00000000000 --- a/ui/public/static/img/private.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/prometheus_logo_orange_circle.svg b/ui/public/static/img/prometheus_logo_orange_circle.svg deleted file mode 100644 index eb53a23c1a5..00000000000 --- a/ui/public/static/img/prometheus_logo_orange_circle.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/public.svg b/ui/public/static/img/public.svg deleted file mode 100644 index 257f466c321..00000000000 --- a/ui/public/static/img/public.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/ui/public/static/img/published.svg b/ui/public/static/img/published.svg deleted file mode 100644 index 14440b86c41..00000000000 --- a/ui/public/static/img/published.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/ui/public/static/img/service-mesh-pattern.png b/ui/public/static/img/service-mesh-pattern.png deleted file mode 100644 index 1b6d7b379387b9b6b3e6bce3aeec2625e03a6ccf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71088 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 diff --git a/ui/public/static/img/service-mesh.svg b/ui/public/static/img/service-mesh.svg deleted file mode 100644 index 743b193ffb6..00000000000 --- a/ui/public/static/img/service-mesh.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/smc-checklist.svg b/ui/public/static/img/smc-checklist.svg deleted file mode 100644 index 98498daef61..00000000000 --- a/ui/public/static/img/smc-checklist.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/smi-conformance-no-trim.svg b/ui/public/static/img/smi-conformance-no-trim.svg deleted file mode 100644 index bfbab4eb831..00000000000 --- a/ui/public/static/img/smi-conformance-no-trim.svg +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/smi-conformance-small.svg b/ui/public/static/img/smi-conformance-small.svg deleted file mode 100644 index 18f5235dde3..00000000000 --- a/ui/public/static/img/smi-conformance-small.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/ui/public/static/img/smi-white.svg b/ui/public/static/img/smi-white.svg deleted file mode 100644 index 67d210171d7..00000000000 --- a/ui/public/static/img/smi-white.svg +++ /dev/null @@ -1 +0,0 @@ -servicemeshinterface-icon-white \ No newline at end of file diff --git a/ui/public/static/img/smi.png b/ui/public/static/img/smi.png deleted file mode 100644 index ad147a34f34931953cf9fc03afde3cb9359b94f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2810 zcmZ`*X*kr27yglDvJMRn+b6yo77i8wP?avsxyrwPD_*yAaR30E8UVy40>I9`6vqO9FgO6r`v8Cu z0RUuzavPjY0Dwo#>AV~A_kQhe?=4Jm`&zkeL=GvNQ}K{fn#BEF&8d32o93|_eR?+% zz8hn>8*8@rqi1h=WH;W5+e6t+b=r;4+I`~n`|lM_7KZaOklR7x6voW0Z8R`>3ym zsgcyC`d_VGgXI(Tsfz`Ht1mF~Wl`1B9rxN>*}E$_LzIb)>87cnl98^ywV^L7UG(M7 zwoU5n@5%DMF4+T<3d%oDX#U_889jF5hrR)Ga&qU8%qY@!;(qcx>ElWhWzF4VYH)Ci z+P3~Y`&U5VOi}T2B#yPb%$c6v#`yiD5nIXoFXOp(&ej@8;g|pC#e!IS2c+OMNQ7Si zrl|Yz1^|HO?5!=_B1aa-qAoKGpg>T@J&_pmmc)cmu!^mHr)>4ZDkAyY+pi-PSb4_g zZ{<+QypK}Gs~W@4UFYWdn&tA}c#m0FI{QAeSIbfFyHM&?x-@W$+~3_%^y+Rimwg_x_5;oobv||T-GfM^k)$Z0Ve`R@^ ztKO$N{TJP``~t5_kHiqAQKMzJy91@qP#QNyO$Qb-?M*c&w>)$o8HMT2({De5o#F|y zIOz#Ff>X}3HPIrl5lTHr_TESlW%?IVGdwlFA#M)vw4eNIy*Pj1YAKw0LqO!+vNWbT zfY-`n@GN5_-Awc_o#mKbYlO%tS`^Edp{*(3K@r04zm@Wd_3T3>-a^LYOEiyM>>oNz zta9YuEB7OgEqSrkL+gh9hqI-}+5~mDk1AfdX=F9wHPt%RFsDeKAVaj}yY_i9OS75^ zBJJp>Un)EoxMZ41sX8*|-mlW&q8aryapX?RV{M`qeeIZYSPwjgTqyW-*`gB0hYM`} z%zJ0Mra;NY-K9{%OR+|uMrn3K|7jF7j!`G3Ns%BheQ_&S@;kwc59qOi#;qYJpQ~Wj zc$&6G*|<$wIPQYp`(Vq1!?~6$%&8%EYPZ{nVVGM9F#rt)3?N@oT1LzijVWIyoD zO-8Il+KpMgE*9L*EAg6}F0 z^poWWsLhH+V`n?%zksbt&Y-+H5rOa$&mzT^R`7;YL9h#Sd`q}zu%$HiVfP^xK7<3y zd;P)|nL0jMGgT@1hhy2rhkWbb1`ob0z@g!J3$Iz1#nuZ5d78yL(LK4wIqCi!(Nn$W zLlx!f=d6Q<3vaol_4afiAB{iTqMIS1q&^!S#<)tbhx2JHqU`Am{7b_zD_6!5axg=; z%yZ27!I9SFa@mV`e6)To4mJkE3rNIp45mg!meVLhl`xGoTS?r-cYK#{G+gl&7MCu*VM zDMSUi7(KrfALfcYdO;Kww`bWZ-c#wqPJvOb-bA!!w3rI`umOY1koP@@zZo=&-hW&; z8Q5wr9Bk-KIXe-}>u$jphNtEG2VoQ|s(s#-;0rtkdxF`@xl#(j(U-)$>|VQX;y^

BRd=do$pH?iieS*^?z1myNXY~`!BgL1tP53q`pQ`9FhD!xi)eo0Do1>13GS6ZVo>+(mV!FVb7y8^B1Rrm0ZbP#r|H|vt> zBd5RXp;Ug$GLw!80xb01ZBtLF?acgR-d!zJcQ!}K74mXISXRJk zV%= z`OP!g6n&gzY#_a#gJ4*s2iEs07Grch1hY?oE?gI`2}fw^=(@pA8SO*IPy-G(g2PM1 i-|c76e;EP-ef|BS{@XC%0$$lS0QSfW))kgM3I79el2vE` diff --git a/ui/public/static/img/smp-dark.svg b/ui/public/static/img/smp-dark.svg deleted file mode 100644 index 1b3cb5f21c9..00000000000 --- a/ui/public/static/img/smp-dark.svg +++ /dev/null @@ -1 +0,0 @@ -smp-dark \ No newline at end of file diff --git a/ui/public/static/img/terminal.svg b/ui/public/static/img/terminal.svg deleted file mode 100644 index 345879933d1..00000000000 --- a/ui/public/static/img/terminal.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/ui/public/static/img/traefik_mesh-light.svg b/ui/public/static/img/traefik_mesh-light.svg deleted file mode 100644 index e56d078e743..00000000000 --- a/ui/public/static/img/traefik_mesh-light.svg +++ /dev/null @@ -1,23 +0,0 @@ - - TraefikMesh-icon-color - - - - - - - - - - - \ No newline at end of file diff --git a/ui/public/static/img/traefik_mesh.svg b/ui/public/static/img/traefik_mesh.svg deleted file mode 100644 index 46df7875148..00000000000 --- a/ui/public/static/img/traefik_mesh.svg +++ /dev/null @@ -1 +0,0 @@ -TraefikMesh-icon-color \ No newline at end of file diff --git a/ui/public/static/img/web-applications.svg b/ui/public/static/img/web-applications.svg deleted file mode 100644 index 34f602bcd44..00000000000 --- a/ui/public/static/img/web-applications.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/web-filters.svg b/ui/public/static/img/web-filters.svg deleted file mode 100644 index dac6da51d6a..00000000000 --- a/ui/public/static/img/web-filters.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/ui/public/static/img/workspace-light.svg b/ui/public/static/img/workspace-light.svg deleted file mode 100644 index 2c7f3363c41..00000000000 --- a/ui/public/static/img/workspace-light.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/ui/public/static/img/workspace.svg b/ui/public/static/img/workspace.svg deleted file mode 100644 index 2c7f3363c41..00000000000 --- a/ui/public/static/img/workspace.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - \ No newline at end of file diff --git a/ui/public/static/namespace_discovery_relationship_policy.wasm b/ui/public/static/namespace_discovery_relationship_policy.wasm deleted file mode 100644 index 8af1905aa26ced44cefeda28d3f9bb7085494417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135804 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 { - const [data, setData] = useState(null); - - /** - * RTk Lazy Query - */ - const [getUserQuery] = useLazyGetUserKeysQuery(); - - useEffect(() => { - getUserQuery({ orgId: org?.id }, { skip }) - .unwrap() - .then((res) => { - const abilities = res.keys?.map((key) => ({ - action: key.id, - subject: _.lowerCase(key.function), - })); - - setData({ - ...res, - abilities: abilities, - }); - }) - .catch((error) => { - console.error('Error when fetching keys in useGetUserAbilities custom hook', error); - }); - }, [org?.id, getUserQuery, skip]); - - return data; -}; - -export const useGetCurrentAbilities = (org, setKeys, skip) => { - const res = useGetUserAbilities(org, skip); - if (res?.abilities) { - ability.update(res.abilities); - setKeys({ keys: res.keys }); - } - return res; -}; diff --git a/ui/rtk-query/connection.js b/ui/rtk-query/connection.js deleted file mode 100644 index 5d6b49a38c9..00000000000 --- a/ui/rtk-query/connection.js +++ /dev/null @@ -1,104 +0,0 @@ -import { api } from './index'; - -const TAGS = { - CONNECTIONS: 'connections', -}; - -const connectionsApi = api.injectEndpoints({ - endpoints: (builder) => ({ - getConnections: builder.query({ - query: (queryArg) => ({ - url: `integrations/connections`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - order: queryArg.order, - status: queryArg.status, - kind: queryArg.kind, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.CONNECTIONS }], - }), - getConnectionStatus: builder.query({ - query: (queryArg) => ({ - url: `integrations/connections/${queryArg.connectionKind}/status`, - params: { id: queryArg.repoURL }, - }), - }), - getConnectionDetails: builder.query({ - query: (queryArg) => ({ - url: `integrations/connections/${queryArg.connectionKind}/details`, - params: { id: queryArg.repoURL }, - }), - }), - verifyConnectionURL: builder.mutation({ - query: (queryArg) => ({ - url: `integrations/connections/${queryArg.connectionKind}/verify`, - method: 'POST', - params: { id: queryArg.repoURL }, - }), - }), - connectionMetaData: builder.mutation({ - query: (queryArg) => ({ - url: `integrations/connections/${queryArg.connectionKind}/metadata`, - method: 'POST', - body: queryArg.body, - }), - }), - configureConnection: builder.mutation({ - query: (queryArg) => ({ - url: `integrations/connections/${queryArg.connectionKind}/configure`, - method: 'POST', - body: queryArg.body, - }), - }), - updateConnection: builder.mutation({ - query: (queryArg) => ({ - url: `integrations/connections/${queryArg.connectionKind}/status`, - method: 'PUT', - body: queryArg.connectionPayload, - }), - invalidatesTags: () => [{ type: TAGS.CONNECTIONS }], - }), - getAllConnectionStatus: builder.query({ - query: () => ({ - url: `integrations/connections/status`, - method: 'GET', - }), - }), - getConnectionByKind: builder.query({ - query: (queryArg) => ({ - url: `integrations/connections/${queryArg.connectionKind}`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - order: queryArg.order, - }, - method: 'GET', - }), - }), - cancelConnectionRegister: builder.mutation({ - query: (queryArg) => ({ - url: `integrations/connections/register`, - method: 'DELETE', - body: queryArg.body, - }), - }), - }), -}); - -export const { - useGetConnectionsQuery, - useGetConnectionStatusQuery, - useLazyGetConnectionDetailsQuery, - useVerifyConnectionURLMutation, - useConnectionMetaDataMutation, - useConfigureConnectionMutation, - useUpdateConnectionMutation, - useGetAllConnectionStatusQuery, - useGetConnectionByKindQuery, - useCancelConnectionRegisterMutation, -} = connectionsApi; diff --git a/ui/rtk-query/design.js b/ui/rtk-query/design.js deleted file mode 100644 index 520d5939772..00000000000 --- a/ui/rtk-query/design.js +++ /dev/null @@ -1,135 +0,0 @@ -import { api } from './index'; -import { ctxUrl } from '@/utils/multi-ctx'; - -const TAGS = { - DESIGNS: 'designs', -}; - -export const designsApi = api - .enhanceEndpoints({ - addTagTypes: [TAGS.DESIGNS], - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getPatterns: builder.query({ - query: (queryArg) => ({ - url: `pattern`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - order: queryArg.order, - visibility: queryArg.visibility, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.DESIGNS }], - }), - deployPattern: builder.mutation({ - query: ({ - pattern_file, - pattern_id, - selectedK8sContexts, - verify = false, - dryRun = false, - skipCRD = false, - }) => ({ - url: `${ctxUrl('pattern/deploy', selectedK8sContexts)}${verify ? '&verify=true' : ''}${ - dryRun ? '&dryRun=true' : '' - }${skipCRD ? '&skipCRD=true' : ''}`, - method: 'POST', - body: { - pattern_file, - pattern_id, - }, - }), - }), - undeployPattern: builder.mutation({ - query: ({ - pattern_file, - pattern_id, - selectedK8sContexts, - verify = false, - dryRun = false, - }) => ({ - url: `${ctxUrl('pattern/deploy', selectedK8sContexts)}${verify ? '&verify=true' : ''}${ - dryRun ? '&dryRun=true' : '' - }`, - method: 'DELETE', - body: { - pattern_file, - pattern_id, - }, - }), - }), - clonePattern: builder.mutation({ - query: (queryArg) => ({ - url: `pattern/clone/${queryArg.patternID}`, - method: 'POST', - body: queryArg.body, - }), - }), - publishPattern: builder.mutation({ - query: (queryArg) => ({ - url: `pattern/catalog/publish`, - method: 'POST', - body: queryArg.publishBody, - }), - }), - unpublishPattern: builder.mutation({ - query: (queryArg) => ({ - url: `pattern/catalog/unpublish`, - method: 'DELETE', - body: queryArg.unpublishBody, - }), - }), - deletePattern: builder.mutation({ - query: (queryArg) => ({ - url: `patterns/delete`, - method: 'POST', - body: queryArg.deleteBody, - }), - }), - importPattern: builder.mutation({ - query: (queryArg) => ({ - url: `pattern/${queryArg.type}`, - method: 'POST', - body: queryArg.importBody, - }), - }), - deletePatternFile: builder.mutation({ - query: (queryArg) => ({ - url: `pattern/${queryArg.id}`, - method: 'DELETE', - }), - }), - updatePatternFile: builder.mutation({ - query: (queryArg) => ({ - url: `pattern`, - method: 'POST', - body: queryArg.updateBody, - }), - }), - uploadPatternFile: builder.mutation({ - query: (queryArg) => ({ - url: `pattern/`, - method: 'POST', - body: queryArg.uploadBody, - }), - }), - }), - }); - -export const { - useGetPatternsQuery, - useDeployPatternMutation, - useUndeployPatternMutation, - useClonePatternMutation, - usePublishPatternMutation, - useUnpublishPatternMutation, - useDeletePatternMutation, - useImportPatternMutation, - useUpdatePatternFileMutation, - useUploadPatternFileMutation, - useDeletePatternFileMutation, -} = designsApi; diff --git a/ui/rtk-query/environments.js b/ui/rtk-query/environments.js deleted file mode 100644 index 6e5f240b050..00000000000 --- a/ui/rtk-query/environments.js +++ /dev/null @@ -1,116 +0,0 @@ -import { api } from './index'; - -const TAGS = { - ENVIRONMENT_CONNECTIONS: 'enivroment_connections', -}; -const connectionsApi = api - .enhanceEndpoints({ - addTagTypes: [TAGS.ENVIRONMENT_CONNECTIONS], - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getEnvironments: builder.query({ - query: (queryArg) => ({ - url: `environments`, - params: { - search: queryArg.search, - order: queryArg.order, - page: queryArg.page || 0, - pagesize: queryArg.pagesize || 'all', - orgID: queryArg.orgId, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.ENVIRONMENT_CONNECTIONS }], - }), - - createEnvironment: builder.mutation({ - query: (queryArg) => ({ - url: `environments`, - method: 'POST', - body: queryArg.environmentPayload, - }), - - invalidatesTags: () => [{ type: TAGS.ENVIRONMENT_CONNECTIONS }], - }), - - updateEnvironment: builder.mutation({ - query: (queryArg) => ({ - url: `environments/${queryArg.environmentId}`, - method: 'PUT', - body: queryArg.environmentPayload, - }), - - invalidatesTags: () => [{ type: TAGS.ENVIRONMENT_CONNECTIONS }], - }), - - deleteEnvironment: builder.mutation({ - query: (queryArg) => ({ - url: `environments/${queryArg.environmentId}`, - method: 'DELETE', - }), - - invalidatesTags: () => [{ type: TAGS.ENVIRONMENT_CONNECTIONS }], - }), - - getEnvironmentConnections: builder.query({ - query: (queryArg) => ({ - url: `environments/${queryArg.environmentId}/connections`, - params: { - page: queryArg.page || 0, - per_page: queryArg.per_page, - pagesize: queryArg.pagesize || 'all', - filter: queryArg.filter, - }, - method: 'GET', - }), - providesTags: (_result, _error, arg) => [ - { type: TAGS.ENVIRONMENT_CONNECTIONS, id: arg.environmentId }, - ], - }), - - addConnectionToEnvironment: builder.mutation({ - query: (queryArg) => ({ - url: `environments/${queryArg.environmentId}/connections/${queryArg.connectionId}`, - method: 'POST', - body: {}, - }), - - invalidatesTags: (_result, _error, arg) => [ - { type: TAGS.ENVIRONMENT_CONNECTIONS, id: arg.environmentId }, - ], - }), - - removeConnectionFromEnvironment: builder.mutation({ - query: (queryArg) => ({ - url: `environments/${queryArg.environmentId}/connections/${queryArg.connectionId}`, - method: 'DELETE', - body: {}, - }), - - invalidatesTags: (_result, _error, arg) => [ - { type: TAGS.ENVIRONMENT_CONNECTIONS, id: arg.environmentId }, - ], - }), - - saveEnvironment: builder.mutation({ - query: (queryArg) => ({ - url: `environments`, - method: 'POST', - body: queryArg.body, - }), - invalidatesTags: [{ type: TAGS.ENVIRONMENT_CONNECTIONS }], - }), - }), - }); - -export const { - useGetEnvironmentsQuery, - useCreateEnvironmentMutation, - useUpdateEnvironmentMutation, - useDeleteEnvironmentMutation, - useGetEnvironmentConnectionsQuery, - useAddConnectionToEnvironmentMutation, - useRemoveConnectionFromEnvironmentMutation, - useSaveEnvironmentMutation, -} = connectionsApi; diff --git a/ui/rtk-query/filter.js b/ui/rtk-query/filter.js deleted file mode 100644 index 43445845cf5..00000000000 --- a/ui/rtk-query/filter.js +++ /dev/null @@ -1,81 +0,0 @@ -import { api } from './index'; - -const TAGS = { - FILTERS: 'filters', -}; -const filters = api - .enhanceEndpoints({ - addTagTypes: [TAGS.FILTERS], - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getFilters: builder.query({ - query: (queryArg) => ({ - url: `filter`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - order: queryArg.order, - visibility: queryArg.visibility, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.FILTERS }], - }), - cloneFilter: builder.mutation({ - query: (queryArg) => ({ - url: `filter/clone/${queryArg.filterID}`, - method: 'POST', - body: queryArg.body, - }), - }), - publishFilter: builder.mutation({ - query: (queryArg) => ({ - url: `filter/catalog/publish`, - method: 'POST', - body: queryArg.publishBody, - }), - }), - unpublishFilter: builder.mutation({ - query: (queryArg) => ({ - url: `filter/catalog/unpublish`, - method: 'DELETE', - body: queryArg.unpublishBody, - }), - }), - deleteFilter: builder.mutation({ - query: (queryArg) => ({ - url: `filter/${queryArg.id}`, - method: 'DELETE', - }), - }), - updateFilterFile: builder.mutation({ - query: (queryArg) => ({ - url: `filter`, - method: 'POST', - body: queryArg.updateBody, - }), - }), - uploadFilterFile: builder.mutation({ - query: (queryArg) => ({ - url: `filter`, - headers: { - 'Content-Type': 'application/octet-stream', // Set appropriate content type for binary data - }, - method: 'POST', - body: queryArg.uploadBody, - }), - }), - }), - }); - -export const { - useGetFiltersQuery, - useCloneFilterMutation, - usePublishFilterMutation, - useUnpublishFilterMutation, - useDeleteFilterMutation, - useUpdateFilterFileMutation, - useUploadFilterFileMutation, -} = filters; diff --git a/ui/rtk-query/index.js b/ui/rtk-query/index.js deleted file mode 100644 index 85aafa5c3b6..00000000000 --- a/ui/rtk-query/index.js +++ /dev/null @@ -1,21 +0,0 @@ -import { useSelectorRtk, useDispatchRtk, useStoreRtk } from '@/store/hooks'; -import { - coreModule, - reactHooksModule, - buildCreateApi, - fetchBaseQuery, -} from '@reduxjs/toolkit/query/react'; - -const createApi = buildCreateApi( - coreModule(), - reactHooksModule({ - useSelector: useSelectorRtk, - useDispatch: useDispatchRtk, - useStore: useStoreRtk, - }), -); -export const api = createApi({ - reducerPath: 'mesheryApi', - baseQuery: fetchBaseQuery({ baseUrl: '/api/' }), - endpoints: () => ({}), -}); diff --git a/ui/rtk-query/mesh.js b/ui/rtk-query/mesh.js deleted file mode 100644 index abf9e1ce1e2..00000000000 --- a/ui/rtk-query/mesh.js +++ /dev/null @@ -1,11 +0,0 @@ -import { api } from './index'; - -export const meshApi = api.injectEndpoints({ - endpoints: (builder) => ({ - getMesh: builder.query({ - query: () => 'mesh', - }), - }), -}); - -export const { useGetMeshQuery } = meshApi; diff --git a/ui/rtk-query/meshModel.js b/ui/rtk-query/meshModel.js deleted file mode 100644 index 5b2e45f6e47..00000000000 --- a/ui/rtk-query/meshModel.js +++ /dev/null @@ -1,197 +0,0 @@ -import { useEffect, useState } from 'react'; -import { api } from './index'; -import _ from 'lodash'; -import { initiateQuery } from './utils'; - -const TAGS = { - MESH_MODELS: 'mesh-models', -}; - -const defaultOptions = { - trim: false, - // annotations: false, - search: '', - page: 0, - pagesize: 'all', -}; - -const meshModelApi = api - .enhanceEndpoints({ - addTagTypes: [TAGS.MESH_MODELS], - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getMeshModels: builder.query({ - query: (queryArgs) => ({ - url: `meshmodels/models`, - params: _.merge({}, defaultOptions, queryArgs.params), - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - getComponents: builder.query({ - query: (queryArgs) => ({ - url: `meshmodels/components`, - params: _.merge({}, defaultOptions, queryArgs.params), - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - getRelationships: builder.query({ - query: (queryArgs) => ({ - url: `meshmodels/relationships`, - params: _.merge({}, defaultOptions, queryArgs.params), - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - getRegistrants: builder.query({ - query: (queryArgs) => ({ - url: `meshmodels/registrants`, - params: _.merge({}, defaultOptions, queryArgs.params), - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - getComponentsFromModal: builder.query({ - query: (queryArgs) => ({ - url: `meshmodels/models/${queryArgs.model}/components`, - params: _.merge({}, defaultOptions, queryArgs.params), - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - getRelationshipsFromModal: builder.query({ - query: (queryArgs) => ({ - url: `meshmodels/models/${queryArgs.model}/relationships`, - params: _.merge({}, defaultOptions, queryArgs.params), - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - updateEntityStatus: builder.mutation({ - query: (queryArgs) => ({ - url: `meshmodels/${queryArgs.entityType}/status`, - method: 'POST', - body: queryArgs.body, - }), - invalidatesTags: [TAGS.MESH_MODELS], - }), - getModelCategories: builder.query({ - query: () => ({ - url: `meshmodels/categories`, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - getModelFromCategory: builder.query({ - query: (queryArgs) => ({ - url: `meshmodels/categories/${queryArgs.category}/models`, - params: _.merge({}, defaultOptions, queryArgs.params), - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - getModelByName: builder.query({ - query: (queryArgs) => ({ - url: `meshmodels/models/${queryArgs.name}`, - params: _.merge({}, defaultOptions, queryArgs.params), - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - getComponentByName: builder.query({ - query: (queryArgs) => ({ - url: `meshmodels/components/${queryArgs.name}`, - params: _.merge({}, defaultOptions, queryArgs.params), - }), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - getComponentsByModelAndKind: builder.query({ - query: (queryArg) => ({ - url: `meshmodels/models/${queryArg.model}/components/${queryArg.component}`, - params: _.merge({}, defaultOptions, queryArg.params), - }), - }), - exportModel: builder.query({ - query: (queryArg) => ({ - url: `meshmodels/export`, - params: _.merge({}, defaultOptions, queryArg.params), - providesTags: () => [{ type: TAGS.MESH_MODELS }], - }), - }), - importMeshModel: builder.mutation({ - query: (queryArgs) => { - return { - url: `meshmodels/register`, - method: 'POST', - body: queryArgs.importBody, - }; - }, - invalidatesTags: [TAGS.MESH_MODELS], - }), - }), - }); - -export const { - useLazyGetMeshModelsQuery, - useLazyGetComponentsQuery, - useGetComponentsQuery, - useLazyGetRelationshipsQuery, - useGetRegistrantsQuery, - useGetRelationshipsQuery, - useLazyGetRegistrantsQuery, - useGetComponentsFromModalQuery, - useLazyGetComponentsFromModalQuery, - useGetRelationshipsFromModalQuery, - useLazyExportModelQuery, - useLazyGetRelationshipsFromModalQuery, - useUpdateEntityStatusMutation, - useGetModelCategoriesQuery, - useLazyGetModelFromCategoryQuery, - useGetModelByNameQuery, - useLazyGetModelByNameQuery, - useGetMeshModelsQuery, - useGetComponentByNameQuery, - useGetModelFromCategoryQuery, - useGetComponentsByModelAndKindQuery, - useImportMeshModelMutation, -} = meshModelApi; - -export const useGetCategoriesSummary = () => { - const [getModelFromCategory] = useLazyGetModelFromCategoryQuery(); - const { data: categories } = useGetModelCategoriesQuery(); - const [categoryMap, setCategoryMap] = useState({}); - - const fetchModelsForCategories = async () => { - const categoryMap = {}; - if (!categories) return categoryMap; - - const requests = categories.categories.map(async (category) => { - const { data } = await getModelFromCategory( - { category: category.name, params: { page: 1, pagesize: 1 } }, - true, - ); - categoryMap[category.name] = data?.total_count || 0; - }); - await Promise.allSettled(requests); - return categoryMap; - }; - - useEffect(async () => { - const categoryMap = await fetchModelsForCategories(); - setCategoryMap(categoryMap); - }, [categories]); - return categoryMap; -}; - -export const getComponentDefinition = async (component, model, params = {}) => { - const res = await initiateQuery(meshModelApi.endpoints.getComponentsByModelAndKind, { - component, - model, - params: _.omit({ params, annotations: 'include' }, ['apiVersion']), - }); - - if (params.apiVersion) { - return res?.data?.components?.find((c) => c.component.version === params.apiVersion); - } - return res?.data?.components?.[0]; -}; - -export const modelUniqueKey = (model) => `${model.name}-${model.version}`; -export const componentUniqueKey = (component) => - `${component.component.kind}-${component.component.version}-${component.version}-${modelUniqueKey( - component.model, - )}`; diff --git a/ui/rtk-query/meshsync.js b/ui/rtk-query/meshsync.js deleted file mode 100644 index 69bf6b11940..00000000000 --- a/ui/rtk-query/meshsync.js +++ /dev/null @@ -1,62 +0,0 @@ -import { api } from './index'; - -const TAGS = { - MESH_SYNC: 'meshsync', -}; - -const meshSyncApi = api - .enhanceEndpoints({ - addTagTypes: [TAGS.MESH_SYNC], - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getMeshSyncResources: builder.query({ - query: (queryArg) => ({ - url: `system/meshsync/resources`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - order: queryArg.order, - kind: queryArg.kind, - clusterIds: queryArg.clusterIds, - label: queryArg.label, - status: queryArg.status, - annotation: queryArg.annotation, - spec: queryArg.spec, - apiVersion: queryArg.apiVersion, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.MESH_SYNC }], - }), - getMeshSyncResourceKinds: builder.query({ - query: (queryArg) => ({ - url: `system/meshsync/resources/kinds`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - order: queryArg.order, - clusterIds: queryArg.clusterIds, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.MESH_SYNC }], - }), - deleteMeshsyncResource: builder.mutation({ - query: (resourceId) => ({ - url: `system/meshsync/resources/${resourceId}`, - method: 'DELETE', - credentials: 'include', - }), - invalidatesTags: [{ type: TAGS.MESH_SYNC }], - }), - }), - }); - -export const { - useGetMeshSyncResourcesQuery, - useGetMeshSyncResourceKindsQuery, - useDeleteMeshsyncResourceMutation, -} = meshSyncApi; diff --git a/ui/rtk-query/notificationCenter.js b/ui/rtk-query/notificationCenter.js deleted file mode 100644 index 6cc1b068a53..00000000000 --- a/ui/rtk-query/notificationCenter.js +++ /dev/null @@ -1,204 +0,0 @@ -import { deleteEvent, deleteEvents, updateEventStatus, updateEvents } from '../store/slices/events'; -import { api } from './index'; - -/** - * Converts an object with filters into a parsed object. - * - * This function takes an input object containing filters and returns a parsed object - * where empty or non-string values are removed, and non-string values (like Sets) - * are stringified using JSON.stringify. - * - * @param {Object} filters - The input object containing filters. - * @returns {Object} - The parsed object with filters. - * - * @example - * // Example 1: Basic usage - * const filters = { - * name: 'John', - * age: 30, - * active: true, - * interests: new Set(['reading', 'gaming']), - * city: null - * }; - * - * const parsed = parseFilters(filters); - * // Result: - * // { - * // name: 'John', - * // age: '30', - * // active: 'true', - * // interests: '["reading","gaming"]' - * // } - * - * @example - * // Example 2: Empty values are filtered out - * const filters = { - * name: '', - * age: 0, - * active: false, - * city: undefined - * }; - * - * const parsed = parseFilters(filters); - * // Result: {} (empty object) - * - * @example - * // Example 3: Nested objects are not supported - * const filters = { - * person: { - * name: 'Alice', - * age: 25 - * } - * }; - * - * const parsed = parseFilters(filters); - * // Result: { person: {} } - */ -function parseFilters(filters) { - return Object.entries(filters).reduce((parsedFilters, [key, value]) => { - if (value || typeof value === 'string') { - parsedFilters[key] = - typeof value === 'string' - ? value - : JSON.stringify(value, (_key, val) => (val instanceof Set ? [...val] : val)); - } - return parsedFilters; - }, {}); -} -export const PROVIDER_TAGS = { - EVENT: 'event', -}; - -const safeQueryResolve = async (queryFulfilled) => { - try { - return await queryFulfilled; - } catch { - console.error('Error while resolving query', queryFulfilled); - return null; - } -}; - -export const notificationCenterApi = api - .enhanceEndpoints({ - addTagTypes: Object.values(PROVIDER_TAGS), - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getEvents: builder.query({ - query: ({ page = 0, filters = {} }) => { - const parsedFilters = parseFilters(filters); - return { - url: `v2/events`, - params: { - ...parsedFilters, - page: page, - sort: 'created_at', - order: 'desc', - pagesize: 15, - }, - }; - }, - providesTags: [PROVIDER_TAGS.EVENT], - }), - getEventsSummary: builder.query({ - query: () => { - return { - url: `v2/events?page=$1&pagesize=1`, - }; - }, - transformResponse: (response) => { - return { - count_by_severity_level: response.count_by_severity_level, - total_count: response.total_count, - }; - }, - providesTags: [PROVIDER_TAGS.EVENT], - }), - - updateStatus: builder.mutation({ - query: ({ id, status }) => ({ - url: `events/status/${id}`, - method: 'PUT', - body: { - status: status, - }, - }), - onQueryStarted: async ({ id, status }, { dispatch, queryFulfilled }) => { - const res = await safeQueryResolve(queryFulfilled); - res && dispatch(updateEventStatus({ id, status })); - }, - invalidatesTags: [PROVIDER_TAGS.EVENT], - }), - - deleteEvent: builder.mutation({ - query: ({ id }) => ({ - url: `events/${id}`, - method: 'DELETE', - }), - async onQueryStarted({ id }, { dispatch, queryFulfilled }) { - const res = await safeQueryResolve(queryFulfilled); - res && dispatch(deleteEvent({ id })); - }, - invalidatesTags: [PROVIDER_TAGS.EVENT], - }), - - getEventFilters: builder.query({ - query: () => `events/types`, - }), - - //Bulk Operations - updateEvents: builder.mutation({ - query: ({ ids, updatedFields }) => ({ - url: `events/status/bulk`, - method: 'PUT', - body: { - ids, - ...updatedFields, - }, - }), - - async onQueryStarted({ ids, updatedFields }, { dispatch, queryFulfilled }) { - const res = await safeQueryResolve(queryFulfilled); - res && - dispatch( - updateEvents( - ids.map((id) => ({ - id, - changes: { - ...updatedFields, - }, - })), - ), - ); - }, - - invalidatesTags: [PROVIDER_TAGS.EVENT], - }), - - deleteEvents: builder.mutation({ - query: ({ ids }) => ({ - url: `events/bulk`, - method: 'DELETE', - body: { - ids, - }, - }), - async onQueryStarted({ ids }, { dispatch, queryFulfilled }) { - const res = await safeQueryResolve(queryFulfilled); - res && dispatch(deleteEvents({ ids })); - }, - invalidatesTags: [PROVIDER_TAGS.EVENT], - }), - }), - overrideExisting: false, - }); - -export const { - useGetEventsSummaryQuery, - useUpdateStatusMutation, - useDeleteEventMutation, - useLazyGetEventsQuery, - useGetEventFiltersQuery, - useDeleteEventsMutation, - useUpdateEventsMutation, -} = notificationCenterApi; diff --git a/ui/rtk-query/orgRoles.js b/ui/rtk-query/orgRoles.js deleted file mode 100644 index 652a4f18af6..00000000000 --- a/ui/rtk-query/orgRoles.js +++ /dev/null @@ -1,15 +0,0 @@ -import { api } from './index'; - -const userOrgRolesApi = api.injectEndpoints({ - endpoints: (builder) => ({ - getUserOrgRoles: builder.query({ - query: (queryArgs) => ({ - url: `extensions/api/identity/orgs/${queryArgs.orgId}/roles`, - method: 'GET', - credentials: 'include', - }), - }), - }), -}); - -export const { useGetUserOrgRolesQuery } = userOrgRolesApi; diff --git a/ui/rtk-query/organization.js b/ui/rtk-query/organization.js deleted file mode 100644 index d4fd1128a31..00000000000 --- a/ui/rtk-query/organization.js +++ /dev/null @@ -1,26 +0,0 @@ -import { api } from './index'; - -const TAGS = { - ORGANIZATION: 'organization', -}; - -const organizationsApi = api - .enhanceEndpoints({ - addTagTypes: [TAGS.ORGANIZATION], - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getOrgs: builder.query({ - query: (queryArgs) => ({ - url: `identity/orgs`, - params: { - page: queryArgs.page || 0, - pagesize: queryArgs.pagesize || 10, - }, - }), - providesTags: () => [{ type: TAGS.ORGANIZATION }], - }), - }), - }); - -export const { useGetOrgsQuery } = organizationsApi; diff --git a/ui/rtk-query/performance-profile.js b/ui/rtk-query/performance-profile.js deleted file mode 100644 index d8b30943d66..00000000000 --- a/ui/rtk-query/performance-profile.js +++ /dev/null @@ -1,86 +0,0 @@ -import { api } from './index'; - -const TAGS = { - PERFORMANCE_PROFILE: 'performance-profile', -}; - -const performanceProfile = api - .enhanceEndpoints({ - addTagTypes: [TAGS.PERFORMANCE_PROFILE], - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getPerformanceProfiles: builder.query({ - query: (queryArg) => ({ - url: `user/performance/profiles`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - order: queryArg.order, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.PERFORMANCE_PROFILE }], - }), - savePerformanceProfile: builder.mutation({ - query: (queryArg) => ({ - url: `user/performance/profiles`, - method: 'POST', - body: queryArg.body, - }), - invalidatesTags: [{ type: TAGS.PERFORMANCE_PROFILE }], - }), - getProfileResults: builder.query({ - query: (queryArg) => ({ - url: `user/performance/profiles/results`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - order: queryArg.order, - from: queryArg.from, - to: queryArg.to, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.PERFORMANCE_PROFILE }], - }), - getPerformanceProfileById: builder.query({ - query: (queryArg) => ({ - url: `user/performance/profiles/${queryArg.id}`, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.PERFORMANCE_PROFILE }], - }), - deletePerformanceProfile: builder.mutation({ - query: (queryArg) => ({ - url: `user/performance/profiles/${queryArg.id}`, - method: 'DELETE', - }), - invalidatesTags: [{ type: TAGS.PERFORMANCE_PROFILE }], - }), - getProfileResultsById: builder.query({ - query: (queryArg) => ({ - url: `user/performance/profiles/${queryArg.id}/results`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - order: queryArg.order, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.PERFORMANCE_PROFILE }], - }), - }), - }); - -export const { - useGetPerformanceProfilesQuery, - useSavePerformanceProfileMutation, - useGetProfileResultsQuery, - useGetPerformanceProfileByIdQuery, - useDeletePerformanceProfileMutation, - useGetProfileResultsByIdQuery, -} = performanceProfile; diff --git a/ui/rtk-query/providerRoles.js b/ui/rtk-query/providerRoles.js deleted file mode 100644 index f6a2f391046..00000000000 --- a/ui/rtk-query/providerRoles.js +++ /dev/null @@ -1,15 +0,0 @@ -import { api } from './index'; - -const userProviderRolesApi = api.injectEndpoints({ - endpoints: (builder) => ({ - getUserProviderRoles: builder.query({ - query: () => ({ - url: `user`, - method: 'GET', - credentials: 'include', - }), - }), - }), -}); - -export const { useGetUserProviderRolesQuery } = userProviderRolesApi; diff --git a/ui/rtk-query/schema.js b/ui/rtk-query/schema.js deleted file mode 100644 index 9d4536d4c09..00000000000 --- a/ui/rtk-query/schema.js +++ /dev/null @@ -1,14 +0,0 @@ -import { api } from './index'; - -/** - * RTK queries for schemas present in meshkit - */ -const schemasApi = api.injectEndpoints({ - endpoints: (builder) => ({ - getSchema: builder.query({ - query: (queryArg) => `schema/resource/${queryArg.schemaName}`, - }), - }), -}); - -export const { useGetSchemaQuery } = schemasApi; diff --git a/ui/rtk-query/system.js b/ui/rtk-query/system.js deleted file mode 100644 index fb40544b706..00000000000 --- a/ui/rtk-query/system.js +++ /dev/null @@ -1,24 +0,0 @@ -import { api } from './index'; - -const TAGS = { - SYSTEM: 'system', -}; - -const systemApi = api.injectEndpoints({ - endpoints: (builder) => ({ - getDatabaseSummary: builder.query({ - query: (queryArg) => ({ - url: `system/database`, - params: { - page: queryArg.page, - pagesize: queryArg.pagesize, - search: queryArg.search, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.SYSTEM }], - }), - }), -}); - -export const { useGetDatabaseSummaryQuery } = systemApi; diff --git a/ui/rtk-query/user.js b/ui/rtk-query/user.js deleted file mode 100644 index 1ebeddc0b1e..00000000000 --- a/ui/rtk-query/user.js +++ /dev/null @@ -1,87 +0,0 @@ -import { ctxUrl } from '@/utils/multi-ctx'; -import { api } from './index'; - -const Tags = { - USER_PREF: 'userPref', -}; - -const userApi = api.injectEndpoints({ - endpoints: (builder) => ({ - getLoggedInUser: builder.query({ - query: () => `user`, - method: 'GET', - }), - getUserById: builder.query({ - query: (id) => `user/profile/${id}`, - method: 'GET', - }), - getToken: builder.query({ - query: () => `token`, - method: 'GET', - }), - getUserPref: builder.query({ - query: () => 'user/prefs', - method: 'GET', - providesTags: [Tags.USER_PREF], - }), - updateUserPref: builder.mutation({ - query: (queryArg) => ({ - url: 'user/prefs', - method: 'POST', - body: queryArg.usersExtensionPreferences, - credentials: 'include', - }), - invalidatesTags: [Tags.USER_PREF], - }), - getUserPrefWithContext: builder.query({ - query: (selectedK8sContexts) => ({ - url: ctxUrl('user/prefs', selectedK8sContexts), - method: 'GET', - credentials: 'same-origin', - }), - providesTags: [Tags.USER_PREF], - }), - updateUserPrefWithContext: builder.mutation({ - query: (queryArg) => ({ - url: ctxUrl('/user/prefs', queryArg.selectedK8sContexts), - method: 'POST', - headers: { - 'Content-Type': 'application/json;charset=UTF-8', - }, - body: queryArg.body, - }), - invalidatesTags: [Tags.USER_PREF], - // Perform optimistic update - onQueryStarted: async (queryArg, { dispatch, queryFulfilled }) => { - // Optimistically update the cache with the new preferences - const patchResult = dispatch( - api.util.updateQueryData('getUserPref', queryArg.selectedK8sContexts, (draft) => { - Object.assign(draft, queryArg.body); - }), - ); - try { - // Wait for the mutation to complete - await queryFulfilled; - } catch { - // If the mutation fails, revert the optimistic update - patchResult.undo(); - } - }, - }), - getProviderCapabilities: builder.query({ - query: () => 'provider/capabilities', - method: 'GET', - }), - }), -}); - -export const { - useGetLoggedInUserQuery, - useGetUserByIdQuery, - useLazyGetTokenQuery, - useGetUserPrefQuery, - useUpdateUserPrefMutation, - useGetUserPrefWithContextQuery, - useUpdateUserPrefWithContextMutation, - useGetProviderCapabilitiesQuery, -} = userApi; diff --git a/ui/rtk-query/userKeys.js b/ui/rtk-query/userKeys.js deleted file mode 100644 index 5401b17b15a..00000000000 --- a/ui/rtk-query/userKeys.js +++ /dev/null @@ -1,26 +0,0 @@ -import { api } from './index'; - -const TAGS = { - USER_KEYS: 'user-keys', -}; - -const userKeysApi = api - .enhanceEndpoints({ - addTagTypes: [TAGS.USER_KEYS], - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getUserKeys: builder.query({ - query: (queryArgs) => ({ - url: `identity/orgs/${queryArgs.orgId}/users/keys`, - params: { - page: queryArgs.page || 0, - pagesize: queryArgs.pagesize || 10, - }, - }), - providesTags: () => [{ type: TAGS.USER_KEYS }], - }), - }), - }); - -export const { useLazyGetUserKeysQuery } = userKeysApi; diff --git a/ui/rtk-query/utils.js b/ui/rtk-query/utils.js deleted file mode 100644 index 0a2bc6b907e..00000000000 --- a/ui/rtk-query/utils.js +++ /dev/null @@ -1,23 +0,0 @@ -import { store } from '../store'; - -/** - * Initiates a query using specified query and variables via store.dispatch. - * @param {Object} query - The query object containing the initiate function. - * @param {any} variables - Variables to be passed to the query initiate function. - * @returns {Promise} - A Promise resolving with an object containing query execution results. - */ -export const initiateQuery = async (query, variables) => { - try { - return await store.dispatch(query.initiate(variables)); - } catch (error) { - // Return an object with error details if there's an exception - return { - data: null, - error: error, - isFetching: false, - isSuccess: false, - isLoading: false, - isError: true, - }; - } -}; diff --git a/ui/rtk-query/webhook.js b/ui/rtk-query/webhook.js deleted file mode 100644 index 233c59f29c8..00000000000 --- a/ui/rtk-query/webhook.js +++ /dev/null @@ -1,15 +0,0 @@ -import { api } from './index'; - -const webhookApi = api.injectEndpoints({ - endpoints: (builder) => ({ - supportWebHook: builder.mutation({ - query: (queryArg) => ({ - url: `extensions/api/webhook/${queryArg.type}`, - method: 'POST', - body: queryArg.body, - }), - }), - }), -}); - -export const { useSupportWebHookMutation } = webhookApi; diff --git a/ui/rtk-query/workspace.js b/ui/rtk-query/workspace.js deleted file mode 100644 index 515aad5b890..00000000000 --- a/ui/rtk-query/workspace.js +++ /dev/null @@ -1,135 +0,0 @@ -import { api } from './index'; - -const TAGS = { - WORKSPACES: 'workspaces', -}; -const workspacesApi = api - .enhanceEndpoints({ - addTagTypes: [TAGS.WORKSPACES], - }) - .injectEndpoints({ - endpoints: (builder) => ({ - getWorkspaces: builder.query({ - query: (queryArg) => ({ - url: `workspaces`, - params: { - search: queryArg.search, - order: queryArg.order, - page: queryArg.page || 0, - pagesize: queryArg.pagesize || 'all', - orgID: queryArg.orgId, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.WORKSPACES }], - }), - - createWorkspace: builder.mutation({ - query: (queryArg) => ({ - url: `workspaces`, - method: 'POST', - body: queryArg.workspacePayload, - }), - - invalidatesTags: () => [{ type: TAGS.WORKSPACES }], - }), - - updateWorkspace: builder.mutation({ - query: (queryArg) => ({ - url: `workspaces/${queryArg.workspaceId}`, - method: 'PUT', - body: queryArg.workspacePayload, - }), - - invalidatesTags: () => [{ type: TAGS.WORKSPACES }], - }), - - deleteWorkspace: builder.mutation({ - query: (queryArg) => ({ - url: `workspaces/${queryArg.workspaceId}`, - method: 'DELETE', - }), - - invalidatesTags: () => [{ type: TAGS.WORKSPACES }], - }), - - getEnvironmentsOfWorkspace: builder.query({ - query: (queryArg) => ({ - url: `workspaces/${queryArg.workspaceId}/environments`, - params: { - search: queryArg.search, - order: queryArg.order, - page: queryArg.page, - pagesize: queryArg.pagesize, - filter: queryArg.filter, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.WORKSPACES }], - }), - - assignEnvironmentToWorkspace: builder.mutation({ - query: (queryArg) => ({ - url: `workspaces/${queryArg.workspaceId}/environments/${queryArg.environmentId}`, - method: 'POST', - }), - - invalidatesTags: () => [{ type: TAGS.WORKSPACES }], - }), - - unassignEnvironmentFromWorkspace: builder.mutation({ - query: (queryArg) => ({ - url: `workspaces/${queryArg.workspaceId}/environments/${queryArg.environmentId}`, - method: 'DELETE', - }), - - invalidatesTags: () => [{ type: TAGS.WORKSPACES }], - }), - - getDesignsOfWorkspace: builder.query({ - query: (queryArg) => ({ - url: `workspaces/${queryArg.workspaceId}/designs`, - params: { - search: queryArg.search, - order: queryArg.order, - page: queryArg.page, - pagesize: queryArg.pagesize, - filter: queryArg.filter, - }, - method: 'GET', - }), - providesTags: () => [{ type: TAGS.WORKSPACES }], - }), - - assignDesignToWorkspace: builder.mutation({ - query: (queryArg) => ({ - url: `workspaces/${queryArg.workspaceId}/designs/${queryArg.designId}`, - method: 'POST', - }), - - invalidatesTags: () => [{ type: TAGS.WORKSPACES }], - }), - - unassignDesignFromWorkspace: builder.mutation({ - query: (queryArg) => ({ - url: `workspaces/${queryArg.workspaceId}/designs/${queryArg.designId}`, - method: 'DELETE', - }), - - invalidatesTags: () => [{ type: TAGS.WORKSPACES }], - }), - }), - }); - -export const { - useGetWorkspacesQuery, - useCreateWorkspaceMutation, - useUpdateWorkspaceMutation, - useDeleteWorkspaceMutation, - useGetEnvironmentsOfWorkspaceQuery, - useAssignEnvironmentToWorkspaceMutation, - useUnassignEnvironmentFromWorkspaceMutation, - useGetDesignsOfWorkspaceQuery, - useAssignDesignToWorkspaceMutation, - useUnassignDesignFromWorkspaceMutation, -} = workspacesApi; diff --git a/ui/store/hooks.js b/ui/store/hooks.js deleted file mode 100644 index 542ad327e02..00000000000 --- a/ui/store/hooks.js +++ /dev/null @@ -1,8 +0,0 @@ -import { createContext } from 'react'; -import { createDispatchHook, createSelectorHook, createStoreHook } from 'react-redux'; - -export const RTKContext = createContext(null); - -export const useSelectorRtk = createSelectorHook(RTKContext); -export const useDispatchRtk = createDispatchHook(RTKContext); -export const useStoreRtk = createStoreHook(RTKContext); diff --git a/ui/store/index.js b/ui/store/index.js deleted file mode 100644 index c015662674b..00000000000 --- a/ui/store/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import eventsReducer from './slices/events'; -import globalEnvironmentContextReducer from './slices/globalEnvironmentContext'; -import { configureStore } from '@reduxjs/toolkit'; -import { api } from '../rtk-query/index'; - -export const store = configureStore({ - reducer: { - events: eventsReducer, - globalEnvironmentContext: globalEnvironmentContextReducer, - [api.reducerPath]: api.reducer, - }, - middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(api.middleware), -}); diff --git a/ui/store/slices/events.js b/ui/store/slices/events.js deleted file mode 100644 index 50d261cf844..00000000000 --- a/ui/store/slices/events.js +++ /dev/null @@ -1,226 +0,0 @@ -import { createEntityAdapter, createSlice } from '@reduxjs/toolkit'; -import { SEVERITY, STATUS } from '../../components/NotificationCenter/constants'; - -const initialState = { - current_view: { - page: 0, - pagesize: 10, - filters: { - initial: true, - }, - has_more: true, - }, - - isNotificationCenterOpen: false, -}; - -const defaultEventProperties = { - severity: SEVERITY.INFO, - status: STATUS.UNREAD, -}; - -const eventsEntityAdapter = createEntityAdapter({ - selectId: (event) => event.id, - //sort based on update_at timestamp(utc) - sortComparer: (a, b) => { - if (b?.created_at?.localeCompare && a?.created_at?.localeCompare) { - return b.created_at?.localeCompare(a.created_at); - } - return 0; - }, -}); - -export const eventsSlice = createSlice({ - name: 'events', - initialState: eventsEntityAdapter.getInitialState(initialState), - reducers: { - clearEvents: (state) => { - state.events = []; - }, - - setEvents: (state, action) => { - // state.events = action.payload || [] - eventsEntityAdapter.removeAll(state); - eventsEntityAdapter.addMany(state, action.payload); - - state.current_view.has_more = action.payload.length == 0 ? false : true; - }, - - pushEvents: (state, action) => { - // state.events = [...state.events, ...action.payload] - eventsEntityAdapter.addMany(state, action.payload); - state.current_view.has_more = action.payload.length == 0 ? false : true; - }, - - pushEvent: (state, action) => { - const event = { - ...action.payload, - severity: action.payload?.severity?.trim() || defaultEventProperties.severity, - status: action.payload?.status?.trim() || defaultEventProperties.status, - }; - eventsEntityAdapter.addOne(state, event); - // state.events = [event, ...state.events] - }, - - updateEvent: eventsEntityAdapter.updateOne, - updateEvents: eventsEntityAdapter.updateMany, - updateIsEventChecked: (state, { payload }) => { - const { id, value } = payload; - eventsEntityAdapter.updateOne(state, { - id, - changes: { - checked: value, - }, - }); - }, - - updateCheckAllEvents: (state, { payload }) => { - const updates = Object.keys(state.entities).map((id) => ({ - id, - changes: { - checked: payload, - }, - })); - eventsEntityAdapter.updateMany(state, updates); - }, - - clearCurrentView: (state) => { - state.current_view = initialState.current_view; - state.events = []; - }, - - setCurrentView: (state, action) => { - state.current_view = action.payload; - }, - - toggleNotificationCenter: (state) => { - state.isNotificationCenterOpen = !state.isNotificationCenterOpen; - }, - - closeNotificationCenter: (state) => { - state.isNotificationCenterOpen = false; - }, - }, -}); - -// Action creators are generated for each case reducer function -export const { - pushEvent, - clearEvents, - setEvents, - clearCurrentView, - updateIsEventChecked, - updateCheckAllEvents, - pushEvents, - setCurrentView, - updateEvent, - toggleNotificationCenter, - closeNotificationCenter, - updateEvents, -} = eventsSlice.actions; - -export default eventsSlice.reducer; - -export const loadEvents = (fetch, page, filters) => async (dispatch, getState) => { - const currentView = getState().events.current_view; - try { - const { data } = await fetch({ page, filters }); - dispatch( - setCurrentView({ - ...currentView, - page, - filters, - }), - ); - if (page <= 0) { - dispatch(setEvents(data?.events || [])); - return; - } - dispatch(pushEvents(data?.events || [])); - } catch (e) { - console.error('Error while setting events in store --loadEvents', e); - return; - } -}; - -export const loadNextPage = (fetch) => async (dispatch, getState) => { - const currentView = getState().events.current_view; - dispatch(loadEvents(fetch, currentView.page + 1, currentView.filters)); -}; - -export const updateEventStatus = - ({ id, status }) => - (dispatch) => { - //const currentView = getState().events.current_view; - dispatch( - updateEvent({ - id, - changes: { - status, - }, - }), - ); - }; - -// does a soft deletion on ui -export const deleteEvent = - ({ id }) => - (dispatch) => { - dispatch(updateEvent({ id, changes: { is_deleted: true } })); - //mutator({ id }); - }; - -export const deleteEvents = - ({ ids }) => - (dispatch) => { - dispatch( - updateEvents( - ids.map((id) => ({ - id, - changes: { - is_deleted: true, - }, - })), - ), - ); - }; - -//selectors - -//select all events -export const selectEvents = (state) => { - return eventsEntityAdapter.getSelectors().selectAll(state.events); -}; - -export const selectCheckedEvents = (state) => { - return selectEvents(state).filter((e) => e.checked); -}; - -export const selectEventById = (state, id) => { - return eventsEntityAdapter.getSelectors().selectById(state.events, id); -}; - -export const selectIsEventChecked = (state, id) => { - return Boolean(selectEventById(state, id).checked); -}; - -export const selectAreAllEventsChecked = (state) => { - if (selectEvents(state).length == 0) { - return false; - } - return selectEvents(state).reduce((selected, event) => (event.checked ? selected : false), true); -}; - -export const selectIsEventVisible = (state, id) => { - const event = selectEventById(state, id); - const currentFilters = state.events.current_view?.filters || {}; - const shouldBeInCurrentFilteredView = currentFilters.status - ? currentFilters.status == event.status - : true; - const isDeleted = event.is_deleted || false; - return !isDeleted && shouldBeInCurrentFilteredView; -}; -export const selectSeverity = (state) => { - const currentSeverityList = state.events?.current_view?.filters?.severity; - return currentSeverityList ? currentSeverityList[0] : undefined; -}; diff --git a/ui/store/slices/globalEnvironmentContext.js b/ui/store/slices/globalEnvironmentContext.js deleted file mode 100644 index 2ee4627ba43..00000000000 --- a/ui/store/slices/globalEnvironmentContext.js +++ /dev/null @@ -1,112 +0,0 @@ -const { createSlice } = require('@reduxjs/toolkit'); -export const globalEnvironmentContextSlice = createSlice({ - name: 'globalEnvironmentContext', - initialState: { - selectedEnvs: { - // envId : { - // // selectedConnections : [connection] - // } - }, - }, - - reducers: { - selectEnv: (state, action) => { - const { environment, selectedConnections = [] } = action.payload; - state.selectedEnvs[environment.id] = { - ...environment, - selectedConnections, - }; - }, - unselectEnv: (state, action) => { - const { envId } = action.payload; - delete state.selectedEnvs[envId]; - }, - - selectConnection: (state, action) => { - const { env, connection } = action.payload; - const isEnvSelected = selectIsEnvSelected({ globalEnvironmentContext: state }, env.id); - if (!isEnvSelected) { - state.selectedEnvs[env.id] = { - ...env, - selectedConnections: [connection], - }; - return; - } - state.selectedEnvs[env.id].selectedConnections.push(connection); - }, - - unselectConnection: (state, action) => { - const { envId, connectionId } = action.payload; - state.selectedEnvs[envId].selectedConnections = state.selectedEnvs[ - envId - ].selectedConnections.filter((connection) => connection.id !== connectionId); - }, - }, -}); - -export const { selectEnv, unselectEnv, selectConnection, unselectConnection } = - globalEnvironmentContextSlice.actions; - -export const toggleConnection = (env, connection) => (dispatch, getState) => { - const envId = env.id; - const connectionId = connection.id; - const isSelected = selectIsConnectionSelected(getState(), envId, connection.id); - if (isSelected) { - dispatch(unselectConnection({ envId, connectionId })); - } else { - dispatch(selectConnection({ env, connection })); - } -}; - -export const toggleEnvSelection = (environment, selectedConnections) => (dispatch, getState) => { - const isSelected = selectIsEnvSelected(getState(), environment.id); - if (isSelected) { - dispatch(unselectEnv({ envId: environment.id })); - return; - } - dispatch(selectEnv({ environment, selectedConnections })); -}; - -export default globalEnvironmentContextSlice.reducer; - -// selectors - -const selectIsConnectionSelected = (state, envId, connectionId) => { - if (!selectIsEnvSelected(state, envId)) { - return false; - } - return state.globalEnvironmentContext.selectedEnvs[envId].selectedConnections - .map((connection) => connection.id) - .includes(connectionId); -}; - -const selectIsEnvSelected = (state, envId) => - Boolean(state.globalEnvironmentContext.selectedEnvs[envId]); - -const selectSelectedEnvs = (state) => state.globalEnvironmentContext.selectedEnvs; - -const selectSelectedConnections = (state, envId) => - state.globalEnvironmentContext.selectedEnvs[envId]?.selectedConnections || []; - -const selectAllSelectedConnections = (state) => { - const selectedEnvs = selectSelectedEnvs(state); - return Object.values(selectedEnvs).reduce((acc, { selectedConnections }) => { - return [...acc, ...selectedConnections]; - }, []); -}; - -const selectSelectedK8sConnections = (state, envId) => - selectSelectedConnections(state, envId).filter((connection) => connection.kind === 'kubernetes'); - -const selectAllSelectedK8sConnections = (state) => - selectAllSelectedConnections(state).filter((connection) => connection.kind === 'kubernetes'); - -export { - selectIsConnectionSelected, - selectIsEnvSelected, - selectSelectedEnvs, - selectSelectedConnections, - selectAllSelectedConnections, - selectAllSelectedK8sConnections, - selectSelectedK8sConnections, -}; diff --git a/ui/tests/e2e/auth.setup.js b/ui/tests/e2e/auth.setup.js deleted file mode 100644 index f157d115891..00000000000 --- a/ui/tests/e2e/auth.setup.js +++ /dev/null @@ -1,39 +0,0 @@ -import { expect, test as setup } from '@playwright/test'; -import { ENV } from './env'; - -const authFile = 'playwright/.auth/user.json'; - -/** - * This function is called only once before any tests are run. - * It performs the authentication steps. - * It logs in to Meshery and saves the cookies and browser context to a file. - * The cookies are used in the subsequent tests to authenticate the user. - * @param {import("@playwright/test").TestModifier} param0 - */ -setup('authenticate', async ({ page }) => { - // Perform authentication steps. Replace these actions with your own. - - await page.goto(ENV.PROVIDER_SELECTION_URL); - await page.getByLabel('Select Provider').click(); - await page.getByRole('menuitem', { name: 'Meshery' }).click(); - await page.getByLabel('E-Mail').fill(ENV.REMOTE_PROVIDER_USER.email); - await page.getByLabel('Password').fill(ENV.REMOTE_PROVIDER_USER.password); - await page.getByRole('button', { name: 'Sign in', exact: true }).click(); - // Wait until the page receives the cookies. - // Sometimes login flow sets cookies in the process of several redirects. - // Wait for the final URL to ensure that the cookies are actually set. - - await expect(async () => { - const url = page.url(); - - const redirect_urls = new Set([ - ENV.MESHERY_SERVER_URL + '/', - ENV.REMOTE_PROVIDER_URL + '/', - ENV.REMOTE_PROVIDER_URL + '/dashboard', - ]); - const redirected = redirect_urls.has(url); - return expect(redirected).toBeTruthy(); - }).toPass(); - // End of authentication steps. - await page.context().storageState({ path: authFile }); -}); diff --git a/ui/tests/e2e/connections.spec.js b/ui/tests/e2e/connections.spec.js deleted file mode 100644 index d84e83f71d7..00000000000 --- a/ui/tests/e2e/connections.spec.js +++ /dev/null @@ -1,227 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { ENV } from './env'; -import os from 'os'; - -const verifyConnectionsResBody = (body) => { - expect(body).toEqual( - expect.objectContaining({ - connections: expect.any(Array), - total_count: expect.any(Number), - page: expect.any(Number), - page_size: expect.any(Number), - }), - ); - for (const connection of body.connections) { - expect(connection).toEqual( - expect.objectContaining({ - id: expect.any(String), - name: expect.any(String), - credential_id: expect.any(String), - type: expect.any(String), - sub_type: expect.any(String), - kind: expect.any(String), - metadata: expect.anything(), - status: expect.any(String), - user_id: expect.any(String), - created_at: expect.any(String), - updated_at: expect.any(String), - deleted_at: expect.objectContaining({ - Time: expect.any(String), - Valid: expect.any(Boolean), - }), - }), - ); - } -}; - -// name: Name of the test -// transitionOption: Option to be chosen from dropdown to transition to another state -// statusAfterTransition: Text shown in current state after transition -// restorationOption: Option to be chosen from dropdown to transition back to connected state -const transitionTests = [ - { - name: 'Transition to disconnected state and then back to connected state', - transitionOption: 'Disconnect', - statusAfterTransition: 'disconnected', - restorationOption: 'Connect', - }, - { - name: 'Transition to ignored state and then back to connected state', - transitionOption: 'Ignore', - statusAfterTransition: 'ignored', - restorationOption: 'Register', - }, - { - name: 'Transition to not found state and then back to connected state', - transitionOption: 'Not Found', - statusAfterTransition: 'not found', - restorationOption: 'Discover', - }, -]; - -test.describe.configure({ mode: 'serial' }); -let connectionCount = 0; - -test.beforeEach(async ({ page }) => { - const connectionsReq = page.waitForRequest( - (request) => - request.url().startsWith(`${ENV.MESHERY_SERVER_URL}/api/integrations/connections`) && - request.method() === 'GET', - ); - const connectionsRes = page.waitForResponse(async (response) => { - if (!response.url().startsWith(`${ENV.MESHERY_SERVER_URL}/api/integrations/connections`)) - return false; - if (response.status() !== 200) return false; - const body = await response.json(); - if (body.connections && body.connections.length > 0) return true; - else return false; - }); - - // Visit Connections Page - await page.goto(`${ENV.MESHERY_SERVER_URL}`); - await page.getByRole('button', { name: 'Lifecycle' }).click(); - await page.getByRole('button', { name: 'Connections' }).click(); - - // Verify requests and responses expected on initial page load - await connectionsReq; - const res = await connectionsRes; - const body = await res.json(); - verifyConnectionsResBody(body); - - connectionCount = body.connections.length; -}); - -test('Verify that UI components are displayed', async ({ page }) => { - // Verify that connections table is displayed (by checking for table headings) - for (const heading of ['Name', 'Environments', 'Kind', 'Category', 'Status', 'Actions']) { - await expect(page.getByRole('columnheader', { name: heading })).toBeVisible(); - } - - // Verify that all connections returned by server are displayed (by counting number of rows in the table) - expect((await page.locator('tr').count()) - 2).toEqual(connectionCount); // -2 for not considering header and footer -}); - -test('Add a cluster connection by uploading kubeconfig file', async ({ page }) => { - // Navigate to 'Connections' tab - await page.getByRole('tab', { name: 'Connections' }).click(); - - const addConnectionReq = page.waitForRequest( - (request) => - request.url() === `${ENV.MESHERY_SERVER_URL}/api/system/kubernetes` && - request.method() === 'POST', - ); - const addConnectionRes = page.waitForResponse( - (response) => - response.url() === `${ENV.MESHERY_SERVER_URL}/api/system/kubernetes` && - response.status() === 200, - ); - - // Click Add Cluster button - await page.getByTestId('connection-addCluster').click(); - - // Verify "Add Kubernetes Cluster(s)" modal opens - await expect(page.getByTestId('connection-addKubernetesModal')).toBeVisible(); - - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByTestId('connection-uploadKubeConfig').click(); - const fileChooser = await fileChooserPromise; - - // Attach existing kubeconfig file of the system, to test the upload without making any changes in configuration - const kubeConfigPath = `${os.homedir()}/.kube/config`; - await fileChooser.setFiles(kubeConfigPath); - - // Click "IMPORT" button - await page.getByRole('button', { name: 'IMPORT', exact: true }).click(); - - // Verify requests and responses - await addConnectionReq; - await addConnectionRes; - - // Verify displaying of success modal - await expect(page.getByTestId('connection-discoveredModal')).toBeVisible(); - - // Verify available contexts were connected - await expect(page.getByRole('menuitem', { name: 'connected' })).toBeVisible(); - - // Click "OK" button to close success modal - await page.getByRole('button', { name: 'OK', exact: true }).click(); -}); - -transitionTests.forEach((t) => { - test(t.name, async ({ page }) => { - const stateTransitionReq = page.waitForRequest( - (request) => - request.url() === - `${ENV.MESHERY_SERVER_URL}/api/integrations/connections/kubernetes/status` && - request.method() === 'PUT', - ); - - const stateTransitionRes = page.waitForResponse( - (response) => - response.url() === - `${ENV.MESHERY_SERVER_URL}/api/integrations/connections/kubernetes/status` && - response.status() === 202, - ); - - const getConnectionsReq = page.waitForRequest( - (request) => - request.url().startsWith(`${ENV.MESHERY_SERVER_URL}/api/integrations/connections`) && - request.method() === 'GET', - ); - - const getConnectionsRes = page.waitForResponse( - (response) => - response.url().startsWith(`${ENV.MESHERY_SERVER_URL}/api/integrations/connections`) && - response.status() === 200, - ); - - // since test run serially, and latest connection appears at topmost, - // the connection created in the previous test will appear in the first row of the table - const firstRow = page.locator('tbody').locator('tr').first(); - - // expect connected state initially - await expect(firstRow.locator('span', { hasText: 'connected' })).toBeVisible(); - - // ===== TRANSITIONING TO A NEW STATE ===== - - // open state transition options dropdown - await firstRow.locator('span', { hasText: 'connected' }).click(); - - // click required option - await page.getByText(t.transitionOption, { exact: true }).click(); - - // verify that Confirmation modal opened - await expect(page.getByText('Connection Status Transition')).toBeVisible(); - - // click "Confirm" - await page.getByRole('button', { name: 'Confirm' }).click(); - - // verify API requests and responses - await stateTransitionReq; - await stateTransitionRes; - await getConnectionsReq; - const res = await getConnectionsRes; - const body = await res.json(); - verifyConnectionsResBody(body); - - // expect new state to be shown as current state - await expect(firstRow.locator('span', { hasText: t.statusAfterTransition })).toBeVisible(); - - // ===== TRANSITION BACK TO "connected" STATE ===== - - // open state transition options dropdown again - await firstRow.locator('span', { hasText: t.statusAfterTransition }).click(); - - // click the option required to transition back to "connected" state - await page.getByText(t.restorationOption, { exact: true }).click(); - - // verify that Confirmation modal opened again - await expect(page.getByText('Connection Status Transition')).toBeVisible(); - - // click "Confirm" - await page.getByRole('button', { name: 'Confirm' }).click(); - - // expect the state to be restored to "connected" - await expect(firstRow.locator('span', { hasText: 'connected' })).toBeVisible(); - }); -}); diff --git a/ui/tests/e2e/custom-playwright-reporter.js b/ui/tests/e2e/custom-playwright-reporter.js deleted file mode 100644 index c30eba8f017..00000000000 --- a/ui/tests/e2e/custom-playwright-reporter.js +++ /dev/null @@ -1,148 +0,0 @@ -import { readFileSync, writeFileSync } from 'fs'; -import { template } from 'lodash'; -import moment from 'moment'; -import path from 'path'; - -class MyReporter { - introMessage = ''; - totalTests = ''; - expectedTest = ''; - testTable = `| Test | Browser | Test Case | Result | Retries | -| :---: | :---: | :--- | :---: | :---: |`; - passed = 0; - failed = 0; - skipped = 0; - flaky = 0; - countLog = 1; - countTable = 1; - - onBegin(_config, suite) { - this.introMessage = `- Testing started at: ${moment().format('MMMM Do YYYY, h:mm:ss a')}`; - this.totalTests = `- Total tests cases: ${suite.allTests().length}`; - } - - // eslint-disable-next-line no-unused-vars - onStdOut(chunk, _test, _result) { - const text = chunk.toString('utf-8'); - process.stdout.write(text); - } - - // eslint-disable-next-line no-unused-vars - onStdErr(chunk, _test, _result) { - const text = chunk.toString('utf-8'); - process.stderr.write(text); - } - - onTestEnd(test, result) { - const status = test.outcome(); - const project = test.parent.project().name; - - this.displayLogs(project, test.title, status, result); - this.addTestTable(project, test.title, status, result.retry, test.retries); - } - - async onEnd(result) { - const message = await this.buildMessage(result); - - try { - writeFileSync('test-report.md', message); - } catch (e) { - console.log('Cannot write test reporter ', e); - } - } - - displayLogs(project, title, status, result) { - const logs = `${ - this.countLog - }. Project: ${project}, Test: ${title}, Status: ${this.getStatusEmoji(status)}, Retry: ${ - result.retry - } ${ - status === 'unexpected' && result.error !== undefined - ? '\n' + - `File Location: ${result.error.location?.file ?? 'Not Found'}` + - '\n' + - result.error?.snippet ?? 'No snippet' + '\n' + result.error?.message - : '' - }\n`; - - process.stdout.write(logs); - - this.countLog++; - } - - addTestTable(project, title, status, retry, retries) { - this.countTestStatus(status, retry, retries); - - if (status === 'expected') return; - - const lastRetriesRun = retry === retries; - const isFail = status === 'unexpected'; - const isSkipped = status === 'skipped'; - - if ((isFail || isSkipped) && !lastRetriesRun) { - return; - } - - const message = `| ${this.countTable} | ${project} | ${title} | ${this.getStatusEmoji( - status, - )} | ${retry} |`; - - this.testTable += `\n${message}`; - this.countTable++; - } - - countTestStatus(status, retry, retries) { - const lastRetriesRun = retry === retries; - const isFail = status === 'unexpected'; - const isSkipped = status === 'skipped'; - const isFlaky = status === 'flaky'; - - if (status === 'expected') { - this.passed++; - } - if (isFlaky) { - this.flaky++; - } - if (isFail && lastRetriesRun) { - this.failed++; - } - if (isSkipped && lastRetriesRun) { - this.skipped++; - } - } - - getStatusEmoji(status) { - if (status === 'expected') { - return '✅'; - } - if (status === 'unexpected') { - return '❌'; - } - if (status === 'flaky') { - return '⚠️'; - } - if (status === 'skipped') { - return '⏩'; - } - } - - async buildMessage(result) { - const duration = moment.duration(result.duration, 'milliseconds'); - const minutes = Math.floor(duration.asMinutes()); - const seconds = duration.seconds(); - const templateStr = readFileSync(path.join(__dirname, 'reporterSummary.md'), 'utf8'); - return template(templateStr)({ - introMessage: this.introMessage, - minutes, - seconds, - passed: this.passed, - failed: this.failed, - flaky: this.flaky, - skipped: this.skipped, - totalTests: this.totalTests, - testTable: this.testTable, - }); - } -} - -export default MyReporter; diff --git a/ui/tests/e2e/dashboard.spec.js b/ui/tests/e2e/dashboard.spec.js deleted file mode 100644 index c59dd97a663..00000000000 --- a/ui/tests/e2e/dashboard.spec.js +++ /dev/null @@ -1,29 +0,0 @@ -const { ENV } = require('./env'); -const { test, expect } = require('./fixtures/pages'); - -test('Aggregation Charts are displayed', async ({ page }) => { - await page.goto(ENV.MESHERY_SERVER_URL); - await expect( - page.getByRole('heading', { - name: 'Models by Category', - }), - ).toBeVisible(); - - await expect( - page.getByRole('heading', { - name: 'Registry', - }), - ).toBeVisible(); - - await expect( - page.getByRole('heading', { - name: 'Connections', - }), - ).toBeVisible(); - - await expect( - page.getByRole('heading', { - name: 'Configuration', - }), - ).toBeVisible(); -}); diff --git a/ui/tests/e2e/delays.js b/ui/tests/e2e/delays.js deleted file mode 100644 index f0288b57958..00000000000 --- a/ui/tests/e2e/delays.js +++ /dev/null @@ -1,8 +0,0 @@ -export const DYNAMIC_TIMEOUTS = { - DESING_IMPORT: (numberOfComponents) => 30 * 1000 + 1000 * numberOfComponents, - DESING_LOAD: (numberOfComponents) => 30 * 1000 + 500 * numberOfComponents, - PERFORMANCE_RUN: () => 30 * 1000, // Dynamic timeout for Performance Run -}; - -export const SLOW_TEST_DURATION = 60 * 1000; -export const BASE_TIMEOUT = 60 * 1000; diff --git a/ui/tests/e2e/env.js b/ui/tests/e2e/env.js deleted file mode 100644 index 74c02b84032..00000000000 --- a/ui/tests/e2e/env.js +++ /dev/null @@ -1,51 +0,0 @@ -const MESHERY_SERVER_URL = process.env.MESHERY_SERVER_URL || 'http://localhost:9081'; -const REMOTE_PROVIDER_URL = process.env.REMOTE_PROVIDER_URL || 'https://staging-meshery.layer5.io'; - -const USER_EMAIL = process.env.REMOTE_PROVIDER_USER_EMAIL; -const USER_PASSWORD = process.env.REMOTE_PROVIDER_USER_PASSWORD; - -const REMOTE_PROVIDER_USER = { - email: USER_EMAIL || 'test-admin@layer5.io', - password: USER_PASSWORD || 'test-admin', -}; -const PROVIDER_SELECTION_URL = `${MESHERY_SERVER_URL}/provider`; -const PROVIDER_TOKEN = process.env.PROVIDER_TOKEN; - -if (process.env.CI) { - const core = require('@actions/core'); - - if (!USER_EMAIL && !USER_PASSWORD) { - core.warning('Using default email and password on auth'); - } else if (!USER_EMAIL || !USER_PASSWORD) { - core.setFailed("You're either email or password is empty"); - } - - if (!PROVIDER_TOKEN) { - core.setFailed( - 'Token is required, please provide token from Meshery Cloud Provider https://staging-meshery.layer5.io/security/tokens', - ); - } -} else { - if (!USER_EMAIL && !USER_PASSWORD) { - console.warn('Using default email and password on auth'); - } else if (!USER_EMAIL || !USER_PASSWORD) { - throw new Error('You are email or password is empty'); - } - - if (!PROVIDER_TOKEN) { - throw new Error( - 'Token is required, please provide token from Meshery Cloud Provider https://meshery.layer5.io/security/tokens', - ); - } -} - -const AUTHFILE = 'playwright/.auth/user.json'; - -export const ENV = { - MESHERY_SERVER_URL, - PROVIDER_SELECTION_URL, - REMOTE_PROVIDER_URL, - REMOTE_PROVIDER_USER, - PROVIDER_TOKEN, - AUTHFILE, -}; diff --git a/ui/tests/e2e/fixtures/pages.js b/ui/tests/e2e/fixtures/pages.js deleted file mode 100644 index 2c66af43752..00000000000 --- a/ui/tests/e2e/fixtures/pages.js +++ /dev/null @@ -1,86 +0,0 @@ -import { DYNAMIC_TIMEOUTS } from '../delays'; -import { ENV } from '../env'; - -const base = require('@playwright/test'); - -// import types -/** @typedef {import("@playwright/test")} PlaywrightTest - * @typedef {import("@playwright/test").Page} PlaywrightPage - * @typedef {import("@playwright/test").ElementHandle} PlaywrightElementHandle - * @typedef {import("@playwright/test").JSHandle} JSHandle - */ - -/** - * @typedef {import("@playwright/test").JSHandle} CytoscapeHandle - */ - -// Extend base test by providing "todoPage" and "settingsPage". -// This new "test" can be used in multiple test files, and each of them will get the fixtures. - -// Follows Page Object pattern -export class DesignsPage { - /** - * @param {import("@playwright/test").Page} page - */ - constructor(page) { - this.page = page; - } - - async loadDefault() { - await this.page.goto(ENV.MESHMAP_DESIGN_URL()); - await expect(this.page.getByTestId('DesignerContainer')).toBeVisible(); - } - - async loadDesign(id) { - await this.page.goto(ENV.MESHMAP_DESIGN_URL(id)); - await expect(this.page.getByTestId('DesignerContainer')).toBeVisible(); - } - - // NOTE: Refactor the import form to use accessible labels - // and proper roles selectors to make it easier to test - async importDesignFromURI(type, uri, name, expectedNumberOfComponents = 1) { - const timeout = DYNAMIC_TIMEOUTS.DESING_IMPORT(expectedNumberOfComponents); - const page = this.page; - await page.getByRole('tab', { name: 'Designs' }).click(); - await page.getByRole('button', { name: 'Import Design' }).click(); - await page.getByLabel('Meshery Design').click(); - await page.locator('li').filter({ hasText: type }).click(); - await page.getByLabel('URL *').fill(uri); - await page.getByLabel('Design file name').fill(name); - await page.getByRole('button', { name: 'Import' }).click(); - const designsTable = page.getByRole('table', { name: 'sidepabel-tab-content' }); - await expect(designsTable).toBeVisible(); - - // check if imported design is shown in getSidePanelTab - await expect(designsTable.getByTitle(`designs-table-row-${name}`)).toBeVisible({ - timeout, - }); - } - - async loadDesignFromSidePanel(name) { - const page = this.page; - await page.getByRole('tab', { name: 'Designs' }).click(); - const designsTable = page.getByRole('table', { name: 'sidepabel-tab-content' }); - await expect(designsTable).toBeVisible(); - await designsTable.getByTitle(`designs-table-row-${name}`).click(); - } -} - -export class ConnectionsPage { - /** - * @param {PlaywrightPage} page - */ - constructor(page) { - this.page = page; - } -} - -export const test = base.test.extend({ - designsPage: async ({ page }, use) => { - const designerPage = new DesignsPage(page); - await designerPage.loadDefault(); - await use(designerPage); - }, -}); - -export const expect = base.expect; diff --git a/ui/tests/e2e/fixtures/performancePage.js b/ui/tests/e2e/fixtures/performancePage.js deleted file mode 100644 index dce89d350c6..00000000000 --- a/ui/tests/e2e/fixtures/performancePage.js +++ /dev/null @@ -1,101 +0,0 @@ -import { expect } from '@playwright/test'; -import { ENV } from '../env'; - -export class PerformancePage { - /** - * @param {import('@playwright/test').Page} page - */ - constructor(page) { - this.page = page; - } - - async navigate() { - await this.page.goto(`${ENV.MESHERY_SERVER_URL}/performance`); - await expect(this.page).toHaveURL(`${ENV.MESHERY_SERVER_URL}/performance`); - } - - async goToProfiles() { - await this.page.goto(`${ENV.MESHERY_SERVER_URL}/performance/profiles`); - await expect(this.page).toHaveURL(`${ENV.MESHERY_SERVER_URL}/performance/profiles`); - } - - async createPerformanceProfile(profileName) { - if (!(await this.doesProfileExist(profileName))) { - this.page.setDefaultTimeout(90 * 1000); // 90 seconds - await this.page.getByRole('button', { name: 'Add Performance Profile', exact: true }).click(); - await this.fillInput(this.page.getByLabel('Profile Name'), profileName); - await this.page.locator('[aria-labelledby="meshName-label meshName"]').click(); - await this.page.locator('[data-value="istio"]').click(); - await this.fillInput(this.page.getByRole('textbox', { name: 'url' }), 'https://layer5.io/'); - await this.fillInput(this.page.getByRole('spinbutton', { name: 'Concurrent requests' }), '5'); - await this.fillInput(this.page.getByRole('spinbutton', { name: 'Queries per second' }), '5'); - await this.fillInput(this.page.getByRole('textbox', { name: 'Duration' }), '15s'); - await expect(this.page.getByRole('button', { name: 'Run Test', exact: true })).toBeVisible(); - await this.page.getByRole('button', { name: 'Run Test', exact: true }).click(); - // Check for notification visibility - const notification = await this.page.locator('text=Initiating load test . . .').first(); - await expect(notification).toBeVisible(); - } else { - console.log(`Profile “${profileName}” already exists.`); - } - } - - async doesProfileExist(profileName) { - await this.goToProfiles(); - return this.page - .locator(`text=${profileName}`) - .count() - .then((count) => count > 0); - } - - async viewPerformanceProfileResult(profileName) { - await this.page.waitForSelector(`text=${profileName}`, { state: 'visible' }); - await this.page.click(`button:has-text("View Results")`); - await this.page.waitForSelector('button[aria-label="more"]', { state: 'visible' }); - await this.page.click('button[aria-label="more"]'); - - await this.page.evaluate(() => { - const sentinelStartDiv = document.querySelector('div[data-testid="sentinelStart"]'); - if (sentinelStartDiv) { - sentinelStartDiv.setAttribute('data-testid', 'sentinel-graph'); - } - }); - - const graphVisible = await this.page.getByTestId('sentinel-graph').isVisible(); - expect(graphVisible); - } - - async runPerformanceTest(profileName) { - await this.page.goto(`${ENV.MESHERY_SERVER_URL}/performance`); - await this.page.getByRole('button', { name: 'Run Test', exact: true }).click(); - await this.fillInput(this.page.getByLabel('Profile Name'), profileName); - await this.page.locator('[aria-labelledby="meshName-label meshName"]').click(); - await this.page.locator('[data-value="istio"]').click(); - await this.fillInput(this.page.getByRole('textbox', { name: 'url' }), 'https://layer5.io/'); - await this.fillInput(this.page.getByRole('spinbutton', { name: 'Concurrent requests' }), '5'); - await this.fillInput(this.page.getByRole('spinbutton', { name: 'Queries per second' }), '5'); - await this.fillInput(this.page.getByRole('textbox', { name: 'Duration' }), '15s'); - await expect(this.page.getByRole('button', { name: 'Run Test', exact: true })).toBeVisible(); - await this.page.getByRole('button', { name: 'Run Test', exact: true }).click(); - // Check for notification visibility - const notification = await this.page.locator('text=Initiating load test . . .').first(); - await expect(notification).toBeVisible(); - } - - async viewPerformanceProfileConfiguration(profileName) { - await this.page.click(`div:has-text("${profileName}")`); - await this.page.evaluate(() => { - const editIcon = document.querySelector( - 'svg path[d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.9959.9959 0 00-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"]', - ); - if (editIcon) { - editIcon.closest('svg').setAttribute('data-testid', 'edit-icon'); - } - }); - await this.page.getByTestId('edit-icon').click(); - } - - async fillInput(locator, value) { - await locator.fill(value); - } -} diff --git a/ui/tests/e2e/indexui.spec.js b/ui/tests/e2e/indexui.spec.js deleted file mode 100644 index 50937b4909d..00000000000 --- a/ui/tests/e2e/indexui.spec.js +++ /dev/null @@ -1,25 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { ENV } from './env'; - -test.describe('Index Page UI Tests', () => { - test.beforeEach(async ({ page }) => { - // Visit Index Page - await page.goto(ENV.MESHERY_SERVER_URL); - }); - - test('Test if Left Navigation Panel is displayed', async ({ page }) => { - await expect(page.locator('[data-test=navigation]')).toBeVisible(); - }); - - test('Test if Settings button is displayed', async ({ page }) => { - await expect(page.locator('[data-test=settings-button]')).toBeVisible(); - }); - - test('Test if Notification button is displayed', async ({ page }) => { - await expect(page.locator('[data-test=notification-button]')).toBeVisible(); - }); - - test('Test if Profile button is displayed', async ({ page }) => { - await expect(page.locator('[data-test=profile-button]')).toBeVisible(); - }); -}); diff --git a/ui/tests/e2e/reporterSummary.md b/ui/tests/e2e/reporterSummary.md deleted file mode 100644 index 46c7ae21e5a..00000000000 --- a/ui/tests/e2e/reporterSummary.md +++ /dev/null @@ -1,26 +0,0 @@ -### END-TO-END TESTS - -<%- introMessage %> - -**📦 Test Result Summary** - -- ✅ <%- passed %> passed -- ❌ <%- failed %> failed -- ⚠️ <%- flaky %> flaked -- ⏩ <%- skipped %> skipped - -⌛ _Duration: <%- minutes %> minutes and <%- seconds %> seconds_ - -<%- failed > 0 ? "**Overall Result**: 👎 Some tests failed." : "**Overall Result**: 👍 All tests passed." %> - -<% if (testTable) { %> - -
- [Show/Hide] Test Result Details - -<%- testTable %> - -
-<% } %> - - diff --git a/ui/tests/e2e/service_mesh_lifecycle.spec.js b/ui/tests/e2e/service_mesh_lifecycle.spec.js deleted file mode 100644 index 54e8c79127a..00000000000 --- a/ui/tests/e2e/service_mesh_lifecycle.spec.js +++ /dev/null @@ -1,74 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { ENV } from './env'; - -test.describe('Service Mesh Lifecycle Tests', () => { - const mesheryAdapters = [{ adapterName: 'Istio', adapterPort: '10000', deploy: false }]; - - mesheryAdapters.forEach(({ adapterName, adapterPort }) => { - const ADAPTER_LOCATION = `localhost:${adapterPort}`; - test(`Configure Existing ${adapterName} adapter through Mesh Adapter URL from Management page`, async ({ - page, - }) => { - // Visit Settings Page - await page.goto(`${ENV.MESHERY_SERVER_URL}/settings`); - - // Navigate to 'Adapters' tab - await page.getByRole('tab', { name: 'Adapters', exact: true }).click({ force: true }); - - // Enter Mesh Adapter URL - await page - .locator('label') - .filter({ hasText: /Mesh Adapter URL/ }) - .locator('..') - .locator('input') - .fill(`localhost:${adapterPort}`); - await page.keyboard.press('Enter'); - - // Click 'Connect' Button - await page.getByRole('button', { name: 'Connect', exact: true }).click(); - - // Verify success notification - await expect(page.getByText('Adapter was configured!')).toBeVisible(); - - // Visit Lifecycle > Service Mesh Page - await page.goto(`${ENV.MESHERY_SERVER_URL}/management/adapter`); - - // Open "Select Meshery Adapter" Dropdown - const dropdown = page - .locator('label') - .filter({ hasText: /Select Meshery Adapter/ }) - .locator('..'); - await dropdown.click(); - - // Select the adapter by URL - await page.getByRole('option', { name: ADAPTER_LOCATION }).click(); - - // Verify selection of the adapter by URL - await expect(dropdown).toContainText(ADAPTER_LOCATION); - }); - - test(`Ping ${adapterName} Adapter`, async ({ page }) => { - // Visit Lifecycle > Service Mesh Page - await page.goto(`${ENV.MESHERY_SERVER_URL}/management/adapter`); - - // Open "Select Meshery Adapter" Dropdown - const dropdown = page - .locator('label') - .filter({ hasText: /Select Meshery Adapter/ }) - .locator('..'); - await dropdown.click(); - - // Select the adapter by URL - await page.getByRole('option', { name: ADAPTER_LOCATION }).click(); - - // Verify selection of the adapter by URL - await expect(dropdown).toContainText(ADAPTER_LOCATION); - - // Ping the adapter by clicking the chip containing adapter URL in "Manage Service Mesh" section - await page.getByRole('button', { name: ADAPTER_LOCATION, exact: true }).click(); - - // Verify that the adapter was pinged - await expect(page.getByText('Adapter pinged!')).toBeVisible(); - }); - }); -}); diff --git a/ui/tests/e2e/service_mesh_performance.spec.js b/ui/tests/e2e/service_mesh_performance.spec.js deleted file mode 100644 index a6b5a5b2b68..00000000000 --- a/ui/tests/e2e/service_mesh_performance.spec.js +++ /dev/null @@ -1,62 +0,0 @@ -import { test as base, expect } from '@playwright/test'; -import { PerformancePage } from './fixtures/performancePage'; -import { ENV } from './env'; - -export const test = base.extend({ - performancePage: async ({ page }, use) => { - const perfPage = new PerformancePage(page); - await perfPage.navigate(); - await use(perfPage); - }, -}); - -// Disable this test until got fixed -test.describe('Service Mesh Performance Management Tests', () => { - test.skip(); - - const profileName = 'Sample-test'; - - test.beforeEach(async ({ performancePage }) => { - await performancePage.goToProfiles(); - }); - - test('Run a performance test through profile', async ({ performancePage }) => { - await performancePage.createPerformanceProfile(profileName); - await expect(performancePage.page).toHaveURL(`${ENV.MESHERY_SERVER_URL}/performance/profiles`); - }); - - test('View detailed result of a performance profile (Graph Visualiser)', async ({ - performancePage, - }) => { - await performancePage.goToProfiles(); - await performancePage.viewPerformanceProfileResult(profileName); - }); - - test('Run a performance test', async ({ performancePage }) => { - await performancePage.runPerformanceTest(profileName); - }); - - test('View Results from a performance profile', async ({ performancePage }) => { - await performancePage.goToProfiles(); - await performancePage.viewPerformanceProfileResult(profileName); - }); - - test('View/Edit the configuration of a performance profile', async ({ performancePage }) => { - await performancePage.goToProfiles(); - await performancePage.viewPerformanceProfileConfiguration(profileName); - await performancePage.page.locator('[aria-labelledby="meshName-label meshName"]').click(); - await performancePage.page.locator('[data-value="istio"]').click(); - await performancePage.fillInput( - performancePage.page.getByRole('spinbutton', { name: 'Concurrent requests' }), - '6', - ); - await expect( - performancePage.page.getByRole('button', { name: 'Run Test', exact: true }), - ).toBeVisible(); - await performancePage.page.getByRole('button', { name: 'Run Test', exact: true }).click(); - const notification = await performancePage.page - .locator('text=Initiating load test . . .') - .first(); - await expect(notification).toBeVisible(); - }); -}); diff --git a/ui/tests/e2e/settings.spec.js b/ui/tests/e2e/settings.spec.js deleted file mode 100644 index ff6548fab89..00000000000 --- a/ui/tests/e2e/settings.spec.js +++ /dev/null @@ -1,89 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { ENV } from './env'; - -const verifyAdapterResBody = (body) => { - expect(body).toBeInstanceOf(Array); - body.forEach(({ adapter_location, name, version, git_commit_sha, ops }) => { - expect(adapter_location).toMatch(/localhost:\d+/); - expect(name).toEqual(expect.any(String)); - expect(version).toEqual(expect.any(String)); - expect(git_commit_sha).toEqual(expect.any(String)); - // ops can be null or array - if (ops) { - expect(ops).toBeInstanceOf(Array); - ops.forEach(({ key, value, category }) => { - expect(key).toEqual(expect.any(String)); - expect(value).toEqual(expect.any(String)); - // category may or may not be present, if present its an integer - if (category) { - expect(category).toEqual(expect.any(Number)); - } else { - expect(category).toBeUndefined(); - } - }); - } else { - expect(ops).toBeNull(); - } - }); -}; - -test.describe('Settings Page Tests', () => { - test.beforeEach(async ({ page }) => { - const meshAdapterReq = page.waitForRequest( - (request) => - request.url() === `${ENV.MESHERY_SERVER_URL}/api/system/adapters` && - request.method() === 'GET', - ); - const meshAdapterRes = page.waitForResponse( - (response) => - response.url() === `${ENV.MESHERY_SERVER_URL}/api/system/adapters` && - response.status() === 200, - ); - - // Visit Settings Page - await page.goto(`${ENV.MESHERY_SERVER_URL}/settings`); - - // Verify requests and responses expected on initial page load - await meshAdapterReq; - const res = await meshAdapterRes; - const body = await res.json(); - verifyAdapterResBody(body); - }); - - test('Connect to Meshery Istio Adapter and configure it', async ({ page }) => { - // Navigate to 'Adapters' tab - await page.getByRole('tab', { name: 'Adapters', exact: true }).click({ force: true }); - - const meshManageReq = page.waitForRequest( - (request) => - request.url() === `${ENV.MESHERY_SERVER_URL}/api/system/adapter/manage` && - request.method() === 'POST', - ); - const meshManageRes = page.waitForResponse( - (response) => - response.url() === `${ENV.MESHERY_SERVER_URL}/api/system/adapter/manage` && - response.status() === 200, - ); - - // Enter Mesh Adapter URL - await page - .locator('label') - .filter({ hasText: /Mesh Adapter URL/ }) - .locator('..') - .locator('input') - .fill('localhost:10000'); - await page.keyboard.press('Enter'); - - // Click 'Connect' Button - await page.getByRole('button', { name: 'Connect', exact: true }).click(); - - // Verify requests and responses - await meshManageReq; - const res = await meshManageRes; - const body = await res.json(); - verifyAdapterResBody(body); - - // Verify success notification - await expect(page.getByText('Adapter was configured!')).toBeVisible(); - }); -}); diff --git a/ui/tests/e2e/userpreference.spec.js b/ui/tests/e2e/userpreference.spec.js deleted file mode 100644 index acbec9bb52c..00000000000 --- a/ui/tests/e2e/userpreference.spec.js +++ /dev/null @@ -1,86 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { ENV } from './env'; - -const userPreferenceTests = [ - { - name: 'Toggle "Meshery Catalog Content"', - apiURL: `${ENV.MESHERY_SERVER_URL}/api/user/prefs`, - switchLabel: 'Meshery Catalog Content', - expectedMethod: 'POST', - expectedStatus: 200, - }, - { - name: 'Toggle "Send Anonymous Usage Statistics"', - apiURL: `${ENV.MESHERY_SERVER_URL}/api/user/prefs`, - switchLabel: 'Send Anonymous Usage Statistics', - expectedMethod: 'POST', - expectedStatus: 200, - }, - { - name: 'Toggle "Send Anonymous Performance Results"', - apiURL: `${ENV.MESHERY_SERVER_URL}/api/user/prefs`, - switchLabel: 'Send Anonymous Performance Results', - expectedMethod: 'POST', - expectedStatus: 200, - }, -]; - -test.describe('User Preferences Page Tests', () => { - test.beforeEach(async ({ page }) => { - const userPrefReq = page.waitForRequest( - (request) => - request.url().startsWith(`${ENV.MESHERY_SERVER_URL}/api/user/prefs`) && - request.method() === 'GET', - ); - const userPrefRes = page.waitForResponse( - (response) => - response.url().startsWith(`${ENV.MESHERY_SERVER_URL}/api/user/prefs`) && - response.status() === 200, - ); - - // Visit User Preferences Page - await page.goto(`${ENV.MESHERY_SERVER_URL}/user/preferences`); - - // Verify requests and responses expected on initial page load - await userPrefReq; - await userPrefRes; - - // Verify visibility of 'Extensions' Section - await expect(page.getByRole('group', { name: /Extensions.*/ })).toBeVisible(); - - // Verify visibility of 'Analytics and Improvement Program' Section - await expect( - page.getByRole('group', { name: /Analytics and Improvement Program.*/ }), - ).toBeVisible(); - - // Verify visibility of 'Theme' Section - await expect(page.getByRole('group', { name: /Theme.*/ })).toBeVisible(); - }); - - for (const t of userPreferenceTests) { - test(t.name, async ({ page }) => { - const userPrefReq = page.waitForRequest( - (request) => request.url() === t.apiURL && request.method() === t.expectedMethod, - ); - const userPrefRes = page.waitForResponse( - (response) => response.url() === t.apiURL && response.status() === t.expectedStatus, - ); - - // Check current state of switch (checked or unchecked) - const prefSwitch = page.getByLabel(t.switchLabel); - const wasChecked = await prefSwitch.isChecked(); - - // Toggle the state of switch - await prefSwitch.click(); - - // Verify requests and responses - await userPrefReq; - await userPrefRes; - - // Verify that state of switch changed - await page.waitForTimeout(2000); - if (wasChecked) await expect(prefSwitch).not.toBeChecked(); - else await expect(prefSwitch).toBeChecked(); - }); - } -}); diff --git a/ui/tests/e2e/utils/fetch.js b/ui/tests/e2e/utils/fetch.js deleted file mode 100644 index 51656a2d724..00000000000 --- a/ui/tests/e2e/utils/fetch.js +++ /dev/null @@ -1,35 +0,0 @@ -import { ENV } from '../env'; - -const getTokenFromAuthFile = () => { - try { - const authFile = require('../../../playwright/.auth/user.json'); - return authFile.cookies.find((cookie) => cookie.name === 'token').value; - } catch (error) { - console.error('Error while getting token from auth file:', error); - return null; - } -}; - -export async function fetchData(endpoint, method = 'GET', body = null) { - const url = `${ENV.MESHERY_SERVER_URL}/api${endpoint}`; - const yourToken = ENV.PROVIDER_TOKEN; - const token = yourToken || getTokenFromAuthFile(); - const urlWithoutProtocol = new URL(ENV.REMOTE_PROVIDER_URL).host; - - const headers = { - 'meshery-token': token, - Cookie: `meshery-provider=Meshery; ${urlWithoutProtocol}_ref=/;token=${token}`, - }; - - try { - const response = await fetch(url, { headers, method, body }); - if (!response.ok) { - throw new Error(`Error fetching data: ${response.status}`); - } - const data = await response.json(); - return data; - } catch (error) { - console.error('Error:', error); - return null; // Or handle the error differently - } -} diff --git a/ui/tests/e2e/utils/inspectXstate.js b/ui/tests/e2e/utils/inspectXstate.js deleted file mode 100644 index e17151f019f..00000000000 --- a/ui/tests/e2e/utils/inspectXstate.js +++ /dev/null @@ -1,57 +0,0 @@ -// Usage: await inspectXstate(page, machine, options); -import { waitFor } from './waitFor'; - -/** - * Waits for a specific event from the XState debugger. - * @param {Object} params - Parameters object. - * @param {import('playwright').Page} params.page - Playwright page instance. - * @param {string} params.eventType - The type of event to wait for. - * @param {number} [params.timeout_after=3000] - Timeout duration in milliseconds. - * @returns {Promise} - Promise resolving to the handle of the received event. - */ -export const waitForEvent = async ({ page, eventType, timeout_after = 3000 }) => { - await waitFor( - () => - page.evaluate(() => { - const debuggerActor = window?.debuggingActorRef; - if (!debuggerActor) { - return null; - } - return debuggerActor?.getSnapshot?.()?.status == 'active'; - }), - timeout_after, - ); - - const eventHandle = await page.evaluateHandle( - async ([eventType, timeout_after]) => { - const debuggerActor = window?.debuggingActorRef; - const timeout = setTimeout(() => { - throw new Error(`Timeout after ${timeout_after} ms for event ${eventType}`); - }, timeout_after); - - return new Promise((resolve) => { - const in_buffer = debuggerActor - .getSnapshot() - .context.events_buffer.find((e) => e.data.eventType == eventType); - - if (in_buffer) { - debuggerActor.send({ type: 'FLUSH_BUFFER' }); - return resolve(in_buffer.data.incommingEvent); - } - - const subscription = debuggerActor.on('LOGGED_EVENT', (event) => { - // console.log("Inspect", event.data.eventType); - if (event.data.eventType == eventType) { - subscription.unsubscribe(); - debuggerActor.send({ type: 'FLUSH_BUFFER' }); - clearTimeout(timeout); - resolve(event?.data?.incommingEvent); - } - }); - }); - }, - [eventType, timeout_after], - ); - - return eventHandle; -}; diff --git a/ui/tests/e2e/utils/waitFor.js b/ui/tests/e2e/utils/waitFor.js deleted file mode 100644 index 503dadab64e..00000000000 --- a/ui/tests/e2e/utils/waitFor.js +++ /dev/null @@ -1,24 +0,0 @@ -export const waitFor = async (func, timeout = 5000) => { - return new Promise((resolve, reject) => { - const pollFn = async (pollingInterval) => { - try { - const result = await func(); - if (result) { - clearInterval(pollingInterval); - resolve(result); - } - } catch (error) { - clearInterval(pollingInterval); - reject(error); - } - }; - - const pollingInterval = setInterval(function () { - pollFn(this); - }, 200); - setTimeout(() => { - clearInterval(pollingInterval); - reject(`Timeout after ${timeout} ms for condition ${func}`); - }, timeout); - }); -}; diff --git a/ui/tests/samples/helmCharts.js b/ui/tests/samples/helmCharts.js deleted file mode 100644 index 30481ab579d..00000000000 --- a/ui/tests/samples/helmCharts.js +++ /dev/null @@ -1,11 +0,0 @@ -export const HelmCharts = { - HelloWorld: { - source_type: 'Helm Chart', - name: 'HelloWorld', - uri: 'https://github.com/helm/examples/releases/download/hello-world-0.1.0/hello-world-0.1.0.tgz', - expectations: { - numberOfComponents: 3, - numberOfEdges: 1, - }, - }, -}; diff --git a/ui/tests/samples/kubernetsManifests.js b/ui/tests/samples/kubernetsManifests.js deleted file mode 100644 index e5437db9410..00000000000 --- a/ui/tests/samples/kubernetsManifests.js +++ /dev/null @@ -1,11 +0,0 @@ -export const KubernetesManifests = { - HelloWorld: { - source_type: 'Kubernetes Manifest', - name: 'GCP Sample', - uri: 'https://raw.githubusercontent.com/GoogleCloudPlatform/microservices-demo/main/release/kubernetes-manifests.yaml', - expectations: { - numberOfComponents: 35, - numberOfEdges: 20, - }, - }, -}; diff --git a/ui/tests/samples/seededDesigns.js b/ui/tests/samples/seededDesigns.js deleted file mode 100644 index 36e8bea393b..00000000000 --- a/ui/tests/samples/seededDesigns.js +++ /dev/null @@ -1,71 +0,0 @@ - - // This file is auto-generated by seedResources.setup.js - // Do not edit this file manually - export const Designs = { - "Datadog seed content": { - "id": "428fa922-c501-4774-b6c6-a1abc111bd21", - "name": "Datadog seed content", - "pattern_file": "{\"id\":\"00000000-0000-0000-0000-000000000000\",\"components\":null,\"name\":\"Datadog agent on k8's\",\"relationships\":null,\"schemaVersion\":\"\",\"version\":\"0.0.1\"}", - "user_id": "2e246a4a-11e3-4b99-8c79-e42f8565e4be", - "location": {}, - "visibility": "public", - "catalog_data": { - "published_version": "", - "compatibility": null, - "pattern_caveats": "", - "pattern_info": "", - "type": "" - }, - "type": { - "String": "Design", - "Valid": true - }, - "source_content": null, - "updated_at": "2024-08-23T09:05:49.043444Z", - "created_at": "2024-08-23T09:05:49.043441Z", - "view_count": 0, - "share_count": 0, - "download_count": 0, - "clone_count": 0, - "deployment_count": 0, - "expectations": { - "noOfComponents": 2, - "noOfConfigurableComponents": 2, - "noOfAnnotations": 0, - "noOfComponentsWithValidationIssues": 0 - } - }, - "Design With Validation Errors": { - "id": "6751f6f7-01e1-4563-90c4-077abeb0b215", - "name": "Design With Validation Errors", - "pattern_file": "{\"id\":\"00000000-0000-0000-0000-000000000000\",\"components\":null,\"name\":\"Design With Validation Errors \",\"relationships\":null,\"schemaVersion\":\"\",\"version\":\"0.0.1\"}", - "user_id": "2e246a4a-11e3-4b99-8c79-e42f8565e4be", - "location": {}, - "visibility": "public", - "catalog_data": { - "published_version": "", - "compatibility": null, - "pattern_caveats": "", - "pattern_info": "", - "type": "" - }, - "type": { - "String": "Design", - "Valid": true - }, - "source_content": null, - "updated_at": "2024-08-23T09:05:49.307029Z", - "created_at": "2024-08-23T09:05:49.307026Z", - "view_count": 0, - "share_count": 0, - "download_count": 0, - "clone_count": 0, - "deployment_count": 0, - "expectations": { - "noOfComponents": 8, - "noOfConfigurableComponents": 6, - "noOfAnnotations": 2, - "noOfComponentsWithValidationIssues": 1 - } - } -}; \ No newline at end of file diff --git a/ui/tests/seed-data/Datadog agent on k8's b/ui/tests/seed-data/Datadog agent on k8's deleted file mode 100644 index 7766dd5f35e..00000000000 --- a/ui/tests/seed-data/Datadog agent on k8's +++ /dev/null @@ -1,206 +0,0 @@ -name: Datadog agent on k8's -services: - NodeGroupInventoryWallet: - name: NodeGroupInventoryWallet - type: NodeGroupInventoryWallet - apiVersion: core.meshery.io/v1alpha1 - version: 0.7.1 - model: meshery-core - dependsOn: - - datadog-agent - traits: - meshmap: - edges: [] - id: 841cef26-db29-43a5-8906-8a01543263d6 - label: NodeGroupInventoryWallet - meshmodel-data: - category: - metadata: null - name: Orchestration & Management - components: [] - displayName: Meshery Core - hostID: 00000000-0000-0000-0000-000000000000 - id: 5400b823-94ee-543c-8877-4ca3e299fcc4 - metadata: - isAnnotation: false - published: true - subCategory: App Definition and Development - svgColor: ui/public/static/img/meshmodels/meshery-core/color/meshery-core-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/meshery-core/color/meshery-core-color.svg - name: meshery-core - relationships: [] - status: registered - version: 0.7.1 - meshmodel-metadata: - capabilities: '{"designer":{"edit":{"config":false,"lock":true,"shape":{"convert-shape":false},"style":false},"label":{"edit":true,"show":false,"sync-with-config-property":"label"}}}' - defaultData: '{"label":""}' - genealogy: parent - hasInvalidSchema: true - isAnnotation: true - primaryColor: '#00B39F' - published: true - secondaryColor: '#00D3A9' - shape: round-rectangle - shapePolygonPoints: "" - styleOverrides: - background-image: none - background-opacity: 0.1 - border-style: dashed - border-width: 0 - data: - label: "" - height: 30px - width: 30px - z-index: 4 - styles: '{"height":"30px","width":"30px", "background-image":"none","border-width":1,"border-style":"dashed","background-opacity":0.1}' - subCategory: "" - svgColor: ui/public/static/img/meshmodels/meshery-core/color/anchornode-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/meshery-core/white/anchornode-white.svg - parent: 92ca2d36-aed9-48d5-80b3-8b54249a212f - position: - posX: 56.022612875071225 - posY: 5.623531896747492 - whiteboardData: {} - datadog-agent: - name: datadog-agent - type: Deployment - apiVersion: apps/v1 - namespace: default - model: kubernetes - labels: - app: datadog - settings: - spec: - replicas: 1 - selector: - match Labels: - app: datadog - template: - metadata: - labels: - app: datadog - spec: - containers: - - env: - - name: DD_API_KEY - value: - image: datadog/agent:latest - name: datadog-agent - volume Mounts: - - mount Path: /etc/datadog-agent - name: datadog-agent-config - volumes: - - config Map: - name: datadog-agent-config - name: datadog-agent-config - traits: - meshmap: - edges: [] - id: 92ca2d36-aed9-48d5-80b3-8b54249a212f - meshmodel-metadata: - capabilities: |2- - { - "designer": { - "edit": { - "shape": { - "convert-shape": false - } - } - } - } - defaultData: "" - genealogy: parent - isAnnotation: false - isCustomResource: false - isModelAnnotation: "FALSE" - isNamespaced: true - logoURL: Created by Meshery Authors - model: kubernetes - modelDisplayName: Kubernetes - primaryColor: '#326CE5' - published: true - secondaryColor: '#7aa1f0' - shape: round-pentagon - shapePolygonPoints: "" - styleOverrides: '{"border-width":2,"background-opacity":0.5}' - styles: '{"border-width":2,"background-opacity":0.5}' - subCategory: "" - svgColor: ui/public/static/img/meshmodels/kubernetes/color/deployment-color.svg - svgComplete: ui/public/static/img/meshmodels/kubernetes/complete/deployment-complete.svg - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/deployment-white.svg - position: - posX: 56.02261287507122 - posY: 5.623531896747493 - whiteboardData: - style: {} - datadog-agent-service: - name: datadog-agent-service - type: Service - apiVersion: v1 - namespace: default - model: kubernetes - settings: - spec: - ports: - - name: udp-metrics - port: 8125 - protocol: UDP - target Port: 8125 - - name: dogstatsd - port: 8126 - protocol: UDP - target Port: 8126 - - name: trace-agent - port: 8127 - protocol: TCP - target Port: 8127 - - name: apm-http - port: 8128 - protocol: TCP - target Port: 8128 - - name: apm-statsd - port: 8129 - protocol: UDP - target Port: 8129 - selector: - app: datadog - traits: - meshmap: - edges: [] - id: 93346e3b-7fcb-4a3b-ba54-4dadefde0f00 - meshmodel-metadata: - capabilities: "" - defaultData: "" - genealogy: "" - isAnnotation: false - isCustomResource: false - isModelAnnotation: "FALSE" - isNamespaced: true - logoURL: https://github.com/cncf/artwork/blob/master/projects/kubernetes/icon/white/kubernetes-icon-white.svg - model: kubernetes - modelDisplayName: Kubernetes - primaryColor: '#326CE5' - published: true - secondaryColor: '#7aa1f0' - shape: round-triangle - shapePolygonPoints: "" - styleOverrides: - background-position-y: 4.5 - height: 20 - padding: 12 - width: 20 - x: 10px - "y": 12px - z-index: 3 - styles: '{"height":20,"width":20,"padding":12,"background-position-y":4.5,"x":"10px","y":"12px"}' - subCategory: "" - svgColor: ui/public/static/img/meshmodels/kubernetes/color/service-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/service-white.svg - position: - posX: -23 - posY: 0 - whiteboardData: - style: {} diff --git a/ui/tests/seed-data/Design With Validation Errors b/ui/tests/seed-data/Design With Validation Errors deleted file mode 100644 index c73909740f3..00000000000 --- a/ui/tests/seed-data/Design With Validation Errors +++ /dev/null @@ -1,546 +0,0 @@ -name: 'Design With Validation Errors ' -services: - Section: - name: Section - type: Section - apiVersion: core.meshery.io/v1alpha1 - version: 0.7.1 - model: meshery-shapes - traits: - meshmap: - edges: [] - id: 446cdb32-2b4c-4233-b9a1-1bfbdf00f0c3 - label: Section - meshmodel-data: - category: - metadata: null - name: Orchestration & Management - components: null - description: "" - displayName: Meshery Shapes - hostID: 26e64aa8-2d86-57bd-92b3-2a73160d27b4 - id: 0499d935-67ae-5f79-a806-7865387c1488 - metadata: - isAnnotation: true - subCategory: App Definition and Development - svgColor: ui/public/static/img/meshmodels/meshery-shapes/color/meshery-shapes-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/meshery-shapes/white/meshery-shapes-white.svg - model: - version: 0.7.1 - name: meshery-shapes - registrant: - hostname: artifacthub - relationships: null - schemaVersion: core.meshery.io/v1beta1 - status: enabled - subCategory: App Definition and Development - version: v1.0.0 - meshmodel-metadata: - capabilities: '{"designer":{"show-node-group-badge":false, "edit":{"config":false, - "text":false,"lock":true,"shape":{"convert-shape":false},"style":true},"label":{"edit":true,"show":true,"sync-with-config-property":"label"}}}' - defaultData: '{"label":""}' - genealogy: parent - hasInvalidSchema: true - isAnnotation: true - primaryColor: '#00B39F' - secondaryColor: '#00D3A9' - shape: rectangle - shapePolygonPoints: "" - status: enabled - styleOverrides: - background-image: none - background-opacity: 0.1 - border-style: dashed - border-width: 1 - data: - label: "" - height: 30px - width: 30px - z-index: 16 - styles: '{"height":"30px","width":"30px", "background-image":"none","border-width":1,"border-style":"dashed","background-opacity":0.1}' - subCategory: "" - svgColor: ui/public/static/img/meshmodels/meshery-core/color/anchornode-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/meshery-core/white/anchornode-white.svg - position: - posX: 530 - posY: 99 - whiteboardData: {} - cluster-role-binding-id: - name: cluster-role-binding-id - type: ClusterRoleBinding - apiVersion: rbac.authorization.k8s.io/v1 - version: v1.25.2 - model: kubernetes - settings: - role Ref: {} - subjects: [] - traits: - meshmap: - edges: [] - id: 21a4b68c-ee96-47e5-bc73-567997325110 - label: Cluster Role Binding - meshmodel-data: - category: - metadata: null - name: Orchestration & Management - components: null - description: "" - displayName: Kubernetes - hostID: 26e64aa8-2d86-57bd-92b3-2a73160d27b4 - id: a5d424b9-55b1-5767-a451-a250c4098685 - metadata: - isAnnotation: false - svgColor: ui/public/static/img/meshmodels/kubernetes/color/kubernetes-color.svg - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/kubernetes-white.svg - model: - version: v1.25.2 - name: kubernetes - registrant: - hostname: artifacthub - relationships: null - schemaVersion: core.meshery.io/v1beta1 - status: enabled - subCategory: "" - version: v1.0.0 - meshmodel-metadata: - capabilities: "" - defaultData: "" - genealogy: "" - isAnnotation: false - isCustomResource: false - isModelAnnotation: "FALSE" - isNamespaced: false - logoURL: Created by Meshery Authors - model: kubernetes - modelDisplayName: Kubernetes - primaryColor: '#326CE5' - secondaryColor: '#7aa1f0' - shape: round-rectangle - shapePolygonPoints: "" - status: enabled - styleOverrides: - height: 25px - width: 25px - x: "7" - "y": "7" - z-index: 18 - styles: '{"height":"25px","width":"25px","x":"7", "y":"7"}' - subCategory: "" - svgColor: ui/public/static/img/meshmodels/kubernetes/color/clusterrolebinding-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/clusterrolebinding-white.svg - position: - posX: -30 - posY: 70 - whiteboardData: {} - cluster-role-binding-ly: - name: cluster-role-binding-ly - type: ClusterRoleBinding - apiVersion: rbac.authorization.k8s.io/v1 - version: v1.25.2 - model: kubernetes - settings: - role Ref: - api Group: v1 - kind: cluster - name: my-role - subjects: [] - traits: - meshmap: - edges: [] - id: 00bd312a-3705-41aa-9e1c-490dbe6265b1 - label: Cluster Role Binding - meshmodel-data: - category: - metadata: null - name: Orchestration & Management - components: null - description: "" - displayName: Kubernetes - hostID: 26e64aa8-2d86-57bd-92b3-2a73160d27b4 - id: a5d424b9-55b1-5767-a451-a250c4098685 - metadata: - isAnnotation: false - svgColor: ui/public/static/img/meshmodels/kubernetes/color/kubernetes-color.svg - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/kubernetes-white.svg - model: - version: v1.25.2 - name: kubernetes - registrant: - hostname: artifacthub - relationships: null - schemaVersion: core.meshery.io/v1beta1 - status: enabled - subCategory: "" - version: v1.0.0 - meshmodel-metadata: - capabilities: "" - defaultData: "" - genealogy: "" - isAnnotation: false - isCustomResource: false - isModelAnnotation: "FALSE" - isNamespaced: false - logoURL: Created by Meshery Authors - model: kubernetes - modelDisplayName: Kubernetes - primaryColor: '#326CE5' - secondaryColor: '#7aa1f0' - shape: round-rectangle - shapePolygonPoints: "" - status: enabled - styleOverrides: - height: 25px - width: 25px - x: "7" - "y": "7" - z-index: 12 - styles: '{"height":"25px","width":"25px","x":"7", "y":"7"}' - subCategory: "" - svgColor: ui/public/static/img/meshmodels/kubernetes/color/clusterrolebinding-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/clusterrolebinding-white.svg - position: - posX: 310 - posY: 70 - whiteboardData: {} - cluster-role-nr: - name: cluster-role-nr - type: ClusterRole - apiVersion: rbac.authorization.k8s.io/v1 - version: v1.25.2 - model: kubernetes - settings: - rules: [] - traits: - meshmap: - edges: [] - id: b7c3161d-d673-41f9-8f7a-771fdbb3104c - label: Cluster Role - meshmodel-data: - category: - metadata: null - name: Orchestration & Management - components: null - description: "" - displayName: Kubernetes - hostID: 26e64aa8-2d86-57bd-92b3-2a73160d27b4 - id: a5d424b9-55b1-5767-a451-a250c4098685 - metadata: - isAnnotation: false - svgColor: ui/public/static/img/meshmodels/kubernetes/color/kubernetes-color.svg - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/kubernetes-white.svg - model: - version: v1.25.2 - name: kubernetes - registrant: - hostname: artifacthub - relationships: null - schemaVersion: core.meshery.io/v1beta1 - status: enabled - subCategory: "" - version: v1.0.0 - meshmodel-metadata: - capabilities: "" - defaultData: "" - genealogy: "" - isAnnotation: false - isCustomResource: false - isModelAnnotation: "FALSE" - isNamespaced: false - logoURL: Created by Meshery Authors - model: kubernetes - modelDisplayName: Kubernetes - primaryColor: '#326CE5' - secondaryColor: '#7aa1f0' - shape: round-rectangle - shapePolygonPoints: "" - status: enabled - styleOverrides: - height: 22px - width: 22px - x: "8.5" - "y": "7.5" - z-index: 11 - styles: '{"height":"22px", "width":"22px", "x":"8.5", "y":"7.5"}' - subCategory: "" - svgColor: ui/public/static/img/meshmodels/kubernetes/color/clusterrole-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/clusterrole-white.svg - position: - posX: 210 - posY: 170 - whiteboardData: {} - comment-lg: - name: comment-lg - type: Comment - apiVersion: core.meshery.io/v1alpha1 - namespace: default - version: 0.7.1 - model: meshery-core - dependsOn: - - Section - settings: - user Messages: [] - traits: - meshmap: - edges: [] - id: 260805b5-3f0e-4ee7-ab79-1a66a6854b83 - label: Comment - meshmodel-data: - category: - metadata: null - name: Orchestration & Management - components: null - description: "" - displayName: Meshery Core - hostID: 26e64aa8-2d86-57bd-92b3-2a73160d27b4 - id: 3e2db384-d3af-5fac-8af2-684fc3c29446 - metadata: - isAnnotation: false - subCategory: App Definition and Development - svgColor: ui/public/static/img/meshmodels/meshery-core/color/meshery-core-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/meshery-core/color/meshery-core-color.svg - model: - version: 0.7.1 - name: meshery-core - registrant: - hostname: artifacthub - relationships: null - schemaVersion: core.meshery.io/v1beta1 - status: enabled - subCategory: App Definition and Development - version: v1.0.0 - meshmodel-metadata: - capabilities: '{"designer":{"edit":{"config":true}}}' - defaultData: "" - genealogy: "" - isAnnotation: true - primaryColor: '#FFDE00' - secondaryColor: '#FFDE00' - shape: tag - shapePolygonPoints: "" - status: enabled - styleOverrides: - height: 22px - width: 22px - x: 1.5px - "y": 7.5px - z-index: 17 - styles: '{"height":"22px","width":"22px","x":"1.5px","y":"7.5px"}' - subCategory: "" - svgColor: ui/public/static/img/meshmodels/meshery-core/color/comment-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/meshery-core/color/comment-color.svg - parent: 446cdb32-2b4c-4233-b9a1-1bfbdf00f0c3 - position: - posX: 530 - posY: 90 - whiteboardData: {} - default: - name: default - type: Namespace - apiVersion: v1 - version: v1.25.2 - model: kubernetes - traits: - meshmap: - edges: [] - id: d42199a2-d5cd-4224-921b-bd4643bec22d - label: Namespace - meshmodel-data: - category: - metadata: null - name: Orchestration & Management - components: null - description: "" - displayName: Kubernetes - hostID: 26e64aa8-2d86-57bd-92b3-2a73160d27b4 - id: a5d424b9-55b1-5767-a451-a250c4098685 - metadata: - isAnnotation: false - svgColor: ui/public/static/img/meshmodels/kubernetes/color/kubernetes-color.svg - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/kubernetes-white.svg - model: - version: v1.25.2 - name: kubernetes - registrant: - hostname: artifacthub - relationships: null - schemaVersion: core.meshery.io/v1beta1 - status: enabled - subCategory: "" - version: v1.0.0 - meshmodel-metadata: - capabilities: |2- - { - "designer": { - "edit": { - "shape": { - "convert-shape": false - } - } - } - } - defaultData: "" - genealogy: parent - isAnnotation: false - isCustomResource: false - isModelAnnotation: "FALSE" - isNamespaced: false - logoURL: https://github.com/cncf/artwork/blob/master/projects/kubernetes/icon/white/kubernetes-icon-white.svg - model: kubernetes - modelDisplayName: Kubernetes - primaryColor: '#326CE5' - secondaryColor: '#7aa1f0' - shape: rectangle - shapePolygonPoints: "" - status: enabled - styleOverrides: - background-image: none - background-opacity: 0.5 - border-style: dashed - border-width: 2 - z-index: 14 - styles: '{"background-image":"none","border-width":2,"border-style":"dashed","background-opacity":0.5}' - subCategory: "" - svgColor: ui/public/static/img/meshmodels/kubernetes/color/namespace-color.svg - svgComplete: ui/public/static/img/meshmodels/kubernetes/complete/namespace-complete.svg - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/namespace-white.svg - position: - posX: 210 - posY: 49 - whiteboardData: {} - replication-controller-jy: - name: replication-controller-jy - type: ReplicationController - apiVersion: v1 - namespace: default - version: v1.25.2 - model: kubernetes - dependsOn: - - default - traits: - meshmap: - edges: [] - id: 6da4e565-a9e1-4d9d-a6c3-c5bcb92d705d - label: Replication Controller - meshmodel-data: - category: - metadata: null - name: Orchestration & Management - components: null - description: "" - displayName: Kubernetes - hostID: 26e64aa8-2d86-57bd-92b3-2a73160d27b4 - id: a5d424b9-55b1-5767-a451-a250c4098685 - metadata: - isAnnotation: false - svgColor: ui/public/static/img/meshmodels/kubernetes/color/kubernetes-color.svg - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/kubernetes-white.svg - model: - version: v1.25.2 - name: kubernetes - registrant: - hostname: artifacthub - relationships: null - schemaVersion: core.meshery.io/v1beta1 - status: enabled - subCategory: "" - version: v1.0.0 - meshmodel-metadata: - capabilities: "" - defaultData: "" - genealogy: "" - isAnnotation: false - isCustomResource: false - isModelAnnotation: "FALSE" - isNamespaced: true - logoURL: https://github.com/cncf/artwork/blob/master/projects/kubernetes/icon/white/kubernetes-icon-white.svg - model: kubernetes - modelDisplayName: Kubernetes - primaryColor: '#326CE5' - secondaryColor: '#7aa1f0' - shape: cut-rectangle - shapePolygonPoints: "" - status: enabled - styleOverrides: - z-index: 15 - styles: "" - subCategory: "" - svgColor: ui/public/static/img/meshmodels/kubernetes/color/replicationcontroller-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/replicationcontroller-white.svg - parent: d42199a2-d5cd-4224-921b-bd4643bec22d - position: - posX: 230 - posY: 50 - whiteboardData: {} - replication-controller-ld: - name: replication-controller-ld - type: ReplicationController - apiVersion: v1 - namespace: default - version: v1.25.2 - model: kubernetes - dependsOn: - - default - traits: - meshmap: - edges: [] - id: 0463ce18-8cc4-4082-a5ab-8582aaed0332 - label: Replication Controller - meshmodel-data: - category: - metadata: null - name: Orchestration & Management - components: null - description: "" - displayName: Kubernetes - hostID: 26e64aa8-2d86-57bd-92b3-2a73160d27b4 - id: a5d424b9-55b1-5767-a451-a250c4098685 - metadata: - isAnnotation: false - svgColor: ui/public/static/img/meshmodels/kubernetes/color/kubernetes-color.svg - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/kubernetes-white.svg - model: - version: v1.25.2 - name: kubernetes - registrant: - hostname: artifacthub - relationships: null - schemaVersion: core.meshery.io/v1beta1 - status: enabled - subCategory: "" - version: v1.0.0 - meshmodel-metadata: - capabilities: "" - defaultData: "" - genealogy: "" - isAnnotation: false - isCustomResource: false - isModelAnnotation: "FALSE" - isNamespaced: true - logoURL: https://github.com/cncf/artwork/blob/master/projects/kubernetes/icon/white/kubernetes-icon-white.svg - model: kubernetes - modelDisplayName: Kubernetes - primaryColor: '#326CE5' - secondaryColor: '#7aa1f0' - shape: cut-rectangle - shapePolygonPoints: "" - status: enabled - styleOverrides: - z-index: 13 - styles: "" - subCategory: "" - svgColor: ui/public/static/img/meshmodels/kubernetes/color/replicationcontroller-color.svg - svgComplete: "" - svgWhite: ui/public/static/img/meshmodels/kubernetes/white/replicationcontroller-white.svg - parent: d42199a2-d5cd-4224-921b-bd4643bec22d - position: - posX: 190 - posY: 30 - whiteboardData: {} diff --git a/ui/themes/app.js b/ui/themes/app.js deleted file mode 100644 index 0f69f0071e8..00000000000 --- a/ui/themes/app.js +++ /dev/null @@ -1,694 +0,0 @@ -import { createTheme } from '@material-ui/core/styles'; -import { blueGrey } from '@material-ui/core/colors'; -import { iconMedium } from '../css/icons.styles'; - -const drawerWidth = 256; - -export const Colors = { - darkJungleGreen: '#1E2117', - caribbeanGreen: '#00D3a9', - keppelGreen: '#00B39F', - charcoal: '#3C494F', -}; - -export const common = { - overrides: { - MuiSwitch: { - switchBase: { - color: '#647881', - '&$checked': { - color: '#00b39f !important', - }, - '&$checked + $track': { - backgroundColor: 'rgba(0,179,159,0.5) !important', - }, - }, - }, - }, -}; - -export var darkTheme = createTheme({ - typography: { - useNextVariants: true, - fontFamily: ['Qanelas Soft', 'Roboto', 'Helvectica', 'Arial', 'sans-serif'].join(','), - h5: { - fontWeight: 'bolder', - fontSize: 26, - color: '#FFF', - letterSpacing: 0.5, - }, - p: { - color: '#FFF', - }, - h6: { - color: '#FFF', - }, - }, - palette: { - type: 'dark', - primary: blueGrey, - colors: Colors, - secondary: { - main: '#EE5351', - primeColor: '#303030', - dark: '#121212', - titleText: '#FBFBFB', - text: '#FFF', - text2: '#7494a1', - text3: '#FFF', - textMain: '#F6F8F8', - titleBackground: '#000', - mainBackground: '#202020', - mainBackground2: '#303030', - elevatedComponents: '#202020', - elevatedComponents2: '#303030', - elevatedComponents3: '#303030', - lightText: 'rgba(255, 255, 255, 0.54)', - icon: 'rgba(255, 255, 255, 0.54)', - icon2: '#E6E6E6', - iconMain: '#F6F8F8', - disabledIcon: 'rgba(255, 255, 255, 0.26)', - chevron: 'rgb(255, 255, 255, 0.2)', - link: 'rgba(255, 255, 255, 0.7)', - link2: '#05FFCD', - headerColor: '#202020', - sideBar: '#1A1A1A', - drawer: '#252E31', - drawerHover: '#202020', - img: 'invert(0.8)', - appBar: '#363636', - number: '#eee', - completeInvert: 'invert(1)', - canvas: '#1A1A1A', - brightness: 'brightness(200%)', - switcherButtons: '#1e1e1e', - honeyComb: '#303030', - filterChipBackground: '#222222', - searchBackground: '#294957', - searchBorder: '#396679', - tabs: '#202020', - modalTabs: '#363636', - darkSlateGray: '#294957', - tabHover: '#212121', - confirmationModal: '#111111', - focused: '#00b39f', - primaryModalText: '#FFF', - default: '#9FAFB6', - success: '#00D3A9', - primary: '#86B2C6', - confirmation: '#86B2C6', - warning: '#EBC017', - error: '#F91313', - danger: '#F91313', - lightError: '#B32700', - penColorPrimary: '#E6E6E6', - penColorSecondary: '#E6E6E6', - toolbarBg2: '#464646', - menuBg: '#363636', - menuActionBg: '#222', - menuSelectedBg: 'rgba(0, 179, 159, 0.25)', - menuActionText: '#FBFBFB', - menuItemBorder: '#979797', - pinball: '#222222', - innertableBg1: 'rgb(255, 255, 255, 0.1)', - innertableBg2: 'rgb(255, 255, 255, 0.05)', - tabContainer: '#51636B', - card: '#51636B', - detailsContainer: '#82828280', - tabCard: '#677a84', - disableButtonBg: '#666666', - disableButton: '#9d9d9d', - listItemHover: 'rgb(0, 187, 166, 0.5)', - white: '#202020', - whiteIcon: '#ffffff', - btnDisabled: '#b0bec5', - interactiveArea: '#00B39F', - }, - tables: { - head: { - background: '#faf9f8', - color: '#242424', - }, - body: { - background: '#fff', - }, - }, - shape: { - borderRadius: 4, - }, - }, - p: { - color: '#FFF', - }, - shape: { borderRadius: 8 }, - breakpoints: { - values: { - xs: 0, - sm: 600, - md: 960, - lg: 1280, - xl: 1920, - }, - }, -}); -darkTheme = { - ...darkTheme, - overrides: { - ...common.overrides, - MuiSvgIcon: { - root: { - ...iconMedium, - }, - }, - MuiOutlinedInput: { - root: { - '&:hover $notchedOutline': { - borderColor: '#00B39F', - }, - '&$focused $notchedOutline': { - borderColor: '#00B39F', - }, - }, - }, - MuiCheckbox: { - colorPrimary: { - '&$checked': { - color: '#00B39F', - }, - '&.MuiCheckbox-indeterminate': { - color: '#00B39F', - }, - }, - }, - MuiDrawer: { paper: { backgroundColor: '#263238' } }, - MuiFormLabel: { - root: { - '&$focused': { - color: '#00B39F', - }, - }, - }, - MuiButton: { - label: { textTransform: 'initial' }, - contained: { - boxShadow: 'none', - color: 'rgba(255, 255, 255, 0.87)', - backgroundColor: '#3C494F', - '&:hover': { backgroundColor: '#505b61' }, - '&:active': { boxShadow: 'none' }, - }, - containedPrimary: { - backgroundColor: '#00B39F', - '&:hover': { backgroundColor: '#00D3A9' }, - }, - }, - MuiToggleButton: { - label: { - textTransform: 'initial', - color: '#00B39F', - }, - }, - MuiTabs: { - root: { marginLeft: darkTheme.spacing(1) }, - indicator: { - height: 3, - backgroundColor: '#00B39F', - borderTopLeftRadius: 3, - borderTopRightRadius: 3, - }, - }, - MuiTab: { - root: { - textTransform: 'initial', - margin: '0 16px', - minWidth: 0, - // [darkTheme.breakpoints.up('md')]: { - // minWidth: 0, - // }, - }, - labelContainer: { - padding: 0, - // [darkTheme.breakpoints.up('md')]: { - // padding: 0, - // }, - }, - selected: { - color: '#00B39F !important', - }, - }, - MuiPaper: { - root: { backgroundColor: '#363636' }, - elevation2: { - boxShadow: - '0px 4px 0px -2px rgb(0 179 159 / 10%), 0px 4px 0px 0px rgb(0 179 159 / 10%), 0px 2px 0px 0px rgb(0 179 159 / 20%)', - }, - }, - MuiIconButton: { - root: { - padding: darkTheme.spacing(1), - color: '#F6F8F8', - '&:hover': { - color: '#00B39F', - backgroundColor: 'none', - }, - }, - colorPrimary: { - color: '#F6F8F8', - }, - - //focusedStyles - }, - MuiTooltip: { tooltip: { borderRadius: 4 } }, - MuiDivider: { root: { backgroundColor: '#404854' } }, - MuiListItemText: { primary: { fontWeight: darkTheme.typography.fontWeightMedium } }, - MuiListItemIcon: { - root: { - color: 'inherit', - marginRight: 0, - '& svg': { fontSize: 20 }, - justifyContent: 'center', - minWidth: 0, - }, - }, - MuiAvatar: { - root: { - width: 32, - height: 32, - }, - }, - // Global scrollbar and body styles - MuiCssBaseline: { - '@global': { - body: { - backgroundColor: '#303030', - // scrollbarColor : "#6b6b6b #263238", - '&::-webkit-scrollbar, & *::-webkit-scrollbar': { - backgroundColor: '#1A1A1A', - width: '0.5rem', - }, - '&::-webkit-scrollbar-thumb, & *::-webkit-scrollbar-thumb': { - backgroundColor: '#6b6b6b', - width: '0.5rem', - }, - '&::-webkit-scrollbar-thumb:focus, & *::-webkit-scrollbar-thumb:focus': { - backgroundColor: '#959595', - }, - '&::-webkit-scrollbar-thumb:active, & *::-webkit-scrollbar-thumb:active': { - backgroundColor: '#959595', - }, - '&::-webkit-scrollbar-thumb:hover, & *::-webkit-scrollbar-thumb:hover': { - backgroundColor: '#959595', - }, - '&::-webkit-scrollbar-corner, & *::-webkit-scrollbar-corner': { - backgroundColor: '#3d3d3d', - }, - '::-webkit-scrollbar-track, &::-webkit-scrollbar-track': { - backgroundColor: '#3d3d3d', - }, - }, - }, - }, - }, - props: { MuiTab: { disableRipple: true } }, - mixins: { ...darkTheme.mixins }, -}; - -let theme = createTheme({ - typography: { - fontFamily: ['Qanelas Soft', 'Roboto', 'Helvectica', 'Arial', 'sans-serif'].join(','), - useNextVariants: true, - h5: { - fontWeight: 'bolder', - fontSize: 26, - letterSpacing: 0.5, - }, - }, - palette: { - type: 'light', - // primary: { - // light: '#cfd8dc', - // main: '#607d8b', - // dark: '#455a64', - // }, - primary: blueGrey, - colors: Colors, - secondary: { - main: '#EE5351', - primeColor: '#ebeff1', - dark: '#455a64', - titleText: '#7494A1', - text: '#000', - text2: 'rgba(57, 102, 121, .9)', - text3: '#333333', - textMain: '#3C494F', - titleBackground: 'rgba(57, 102, 121, .1)', - mainBackground: '#396679', - mainBackground2: '#FFF', - elevatedComponents: '#FFF', - elevatedComponents2: '#eaeff1', - elevatedComponents3: '#FFF', - lightText: 'rgba(0, 0, 0, 0.54)', - icon: 'rgba(0, 0, 0, 0.54)', - icon2: 'gray', - iconMain: '#3C494F', - disabledIcon: 'rgba(0, 0, 0, 0.26)', - chevron: '#FFF', - link: '#000', - link2: '#00b39F', - headerColor: '#eeeeee', - sideBar: '#FFF', - drawer: '#FFF', - drawerHover: '#f2f5f7', - img: 'none', - appBar: '#FFF', - number: '#607d8b', - completeInvert: 'none', - canvas: '#fff', - brightness: 'none', - switcherButtons: '#335c6d', - honeyComb: '#F0F0F0', - filterChipBackground: '#CCCCCC', - searchBackground: '#fff', - searchBorder: '#CCCCCC', - tabs: '#eeeeee87', - modalTabs: '#dddddd', - tabHover: '#e3e3e3', - confirmationModal: 'rgb(234, 235, 236)', - focused: '#607d8b', - primaryModalText: '#FFF', - darkSlateGray: '#294957', - default: '#51636B', - success: '#00B39F', - primary: '#477E96', - confirmation: '#477E96', - warning: '#F0A303', - error: '#8F1F00', - danger: '#8F1F00', - lightError: '#8F1F00', - penColorPrimary: '#3C494F', - penColorSecondary: '#677E88', - toolbarBg1: '#FFFFFF', - menuBg: '#EBEFF1', - menuItemBg: '#EBEFF1', - menuActionBg: '#51636B', - menuSelectedBg: '#CCC', - menuActionText: '#FBFBFB', - menuItemBorder: '#979797', - pinball: '#d3d3d3', - innertableBg1: '#ffffff', - innertableBg2: '#ECECED', - tabContainer: '#51636B', - card: '#51636B', - detailsContainer: 'rgb(100, 120, 129, 5%)', - tabCard: '#677a84', - disableButtonBg: '#e0e0e0', - disableButton: '#9d9d9d', - listItemHover: '#f9f9f9', - white: '#ffffff', - whiteIcon: '#ffffff', - btnDisabled: '#b0bec5', - interactiveArea: '#00B39F', - }, - tables: { - head: { - background: '#faf9f8', - color: '#242424', - }, - body: { - background: '#fff', - }, - }, - shape: { - borderRadius: 4, - }, - }, - shape: { borderRadius: 8 }, - breakpoints: { - values: { - xs: 0, - sm: 600, - md: 960, - lg: 1280, - xl: 1920, - }, - }, -}); - -theme = { - ...theme, - overrides: { - ...common.overrides, - MuiSvgIcon: { - root: { - ...iconMedium, - }, - }, - MuiDrawer: { paper: { backgroundColor: '#263238' } }, - MuiButton: { - label: { textTransform: 'initial' }, - contained: { - boxShadow: 'none', - '&:active': { boxShadow: 'none' }, - }, - }, - MuiToggleButton: { - label: { - textTransform: 'initial', - color: '#607d8b', - }, - }, - MuiTabs: { - root: { marginLeft: theme.spacing(1) }, - indicator: { - height: 3, - borderTopLeftRadius: 3, - borderTopRightRadius: 3, - }, - }, - MuiTab: { - root: { - textTransform: 'initial', - margin: '0 16px', - minWidth: 0, - // [theme.breakpoints.up('md')]: { - // minWidth: 0, - // }, - }, - labelContainer: { - padding: 0, - // [theme.breakpoints.up('md')]: { - // padding: 0, - // }, - }, - }, - MuiIconButton: { - root: { - padding: theme.spacing(1), - '&:hover': { - color: '#00B39F', - backgroundColor: 'none', - }, - color: '#607d8b', - }, - colorPrimary: { color: '#607d8b' }, - }, - MuiTooltip: { tooltip: { borderRadius: 4 } }, - MuiDivider: { root: { backgroundColor: '#404854' } }, - MuiListItemText: { primary: { fontWeight: theme.typography.fontWeightMedium } }, - MuiListItemIcon: { - root: { - color: 'inherit', - marginRight: 0, - '& svg': { fontSize: 20 }, - justifyContent: 'center', - minWidth: 0, - }, - }, - MuiAvatar: { - root: { - width: 32, - height: 32, - }, - }, - - MuiCheckbox: { - colorPrimary: { - '&$checked': { - color: '#00B39F', - }, - '&.MuiCheckbox-indeterminate': { - color: '#00B39F', - }, - }, - }, - MuiOutlinedInput: { - root: { - '&:hover $notchedOutline': { - borderColor: '#00B39F', - }, - '&$focused $notchedOutline': { - borderColor: '#00B39F', - }, - }, - }, - // global style for body throughout meshery-ui - // Global scrollbar styles - MuiCssBaseline: { - '@global': { - body: { - backgroundColor: '#e9eff1', - // scrollbarColor : "#6b6b6b #263238", - '&::-webkit-scrollbar, & *::-webkit-scrollbar': { - backgroundColor: '#d7d7d7', - width: '0.5rem', - }, - '&::-webkit-scrollbar-thumb, & *::-webkit-scrollbar-thumb': { - backgroundColor: '#d7d7d7', - width: '0.5rem', - }, - '&::-webkit-scrollbar-thumb:focus, & *::-webkit-scrollbar-thumb:focus': { - backgroundColor: '#e3e3e3', - }, - '&::-webkit-scrollbar-thumb:active, & *::-webkit-scrollbar-thumb:active': { - backgroundColor: '#e3e3e3', - }, - '&::-webkit-scrollbar-thumb:hover, & *::-webkit-scrollbar-thumb:hover': { - backgroundColor: '#e3e3e3', - }, - '&::-webkit-scrollbar-corner, & *::-webkit-scrollbar-corner': { - backgroundColor: '#e9eff1', - }, - '::-webkit-scrollbar-track, &::-webkit-scrollbar-track': { - backgroundColor: '#e9eff1', - }, - }, - }, - }, - }, - props: { MuiTab: { disableRipple: true } }, - mixins: { ...theme.mixins }, -}; - -export const lightTheme = theme; - -export default theme; - -export const notificationColors = { - error: '#F91313', - warning: '#F0A303', - success: '#206D24', - info: '#2196F3', - darkRed: '#B32700', - lightwarning: '#E75225', -}; - -export const darkNotificationColors = { - error: '#F91313', - warning: '#F0D053', - success: '#78C57C', - info: '#5FD4FF', -}; - -export const styles = (theme) => ({ - root: { - display: 'flex', - minHeight: '100vh', - height: '100vh', - }, - drawer: { - [theme.breakpoints.up('sm')]: { - width: drawerWidth, - flexShrink: 0, - }, - transition: theme.transitions.create('width', { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.enteringScreen, - }), - '& > div:first-child': { - height: 'inherit', - width: 'inherit', - }, - }, - drawerCollapsed: { - [theme.breakpoints.up('sm')]: { width: theme.spacing(8.4) + 1 }, - transition: theme.transitions.create('width', { - easing: theme.transitions.easing.sharp, - duration: theme.transitions.duration.leavingScreen, - }), - '& > div:first-child': { - height: 'inherit', - width: 'inherit', - }, - }, - appContent: { - flex: 1, - display: 'flex', - flexDirection: 'column', - }, - mainContent: { - flex: 1, - padding: '48px 36px 24px', - }, - footer: { - backgroundColor: '#fff', - padding: theme.spacing(2), - }, - footerDark: { - backgroundColor: '#202020', - padding: theme.spacing(2), - }, - footerText: { - cursor: 'pointer', - display: 'inline', - verticalAlign: 'middle', - }, - footerIcon: { - display: 'inline', - verticalAlign: 'bottom', - }, - icon: { fontSize: 20 }, - notifSuccess: { - backgroundColor: 'rgb(248, 252, 248) !important', - color: `${notificationColors.success} !important`, - pointerEvents: 'auto !important', - }, - notifInfo: { - backgroundColor: 'rgb(248, 252, 248) !important', - color: `${notificationColors.info} !important`, - pointerEvents: 'auto !important', - }, - notifWarn: { - backgroundColor: '#fff !important', - color: `${notificationColors.warning} !important`, - pointerEvents: 'auto !important', - }, - notifError: { - backgroundColor: 'rgb(248, 252, 248) !important', - color: `${notificationColors.error} !important`, - pointerEvents: 'auto !important', - }, - darknotifSuccess: { - backgroundColor: '#323232 !important', - color: `${darkNotificationColors.success} !important`, - pointerEvents: 'auto !important', - }, - darknotifInfo: { - backgroundColor: '#323232 !important', - color: `${darkNotificationColors.info} !important`, - pointerEvents: 'auto !important', - }, - darknotifWarn: { - backgroundColor: '#323232 !important', - color: `${darkNotificationColors.warning} !important`, - pointerEvents: 'auto !important', - }, - darknotifError: { - backgroundColor: '#323232 !important', - color: `${darkNotificationColors.error} !important`, - pointerEvents: 'auto !important', - }, - playgroundFooter: { - backgroundColor: notificationColors.warning, - padding: theme.spacing(2), - }, -}); diff --git a/ui/themes/configurationTableTheme.js b/ui/themes/configurationTableTheme.js deleted file mode 100644 index 95f9391e5fb..00000000000 --- a/ui/themes/configurationTableTheme.js +++ /dev/null @@ -1,89 +0,0 @@ -import { createTheme } from '@mui/material/styles'; - -function configurationTableTheme(style = {}) { - const theme = createTheme({ - shadows: ['none'], - components: { - MuiInput: { - styleOverrides: { - underline: { - '&:hover:not(.Mui-disabled):before': { - borderBottom: '2px solid #222', - }, - '&:after': { - borderBottom: '2px solid #222', - }, - }, - }, - }, - MUIDataTableSearch: { - styleOverrides: { - searchIcon: { - color: '#607d8b', - marginTop: '7px', - marginRight: '8px', - }, - clearIcon: { - '&:hover': { - color: '#607d8b', - }, - }, - }, - }, - MUIDataTableSelectCell: { - styleOverrides: { - checkboxRoot: { - '&$checked': { - color: '#607d8b', - }, - }, - }, - }, - MUIDataTableToolbar: { - styleOverrides: { - iconActive: { - color: '#222', - }, - icon: { - '&:hover': { - color: '#607d8b', - }, - }, - }, - }, - }, - ...style, - }); - return theme; -} - -function configurationTableThemeDark(style = {}) { - const theme = createTheme({ - shadows: ['none'], - palette: { - mode: 'dark', // Use mode instead of type for dark theme - }, - components: { - MuiPaper: { - styleOverrides: { - root: { - backgroundColor: '#363636', - }, - }, - }, - MuiFormLabel: { - styleOverrides: { - root: { - '&$focused': { - color: '#00B39F', - }, - }, - }, - }, - }, - ...style, - }); - return theme; -} - -export { configurationTableTheme, configurationTableThemeDark }; diff --git a/ui/themes/hooks.js b/ui/themes/hooks.js deleted file mode 100644 index dd79d661cc5..00000000000 --- a/ui/themes/hooks.js +++ /dev/null @@ -1,49 +0,0 @@ -import React, { useEffect } from 'react'; -import { useGetUserPrefQuery, useUpdateUserPrefWithContextMutation } from '@/rtk-query/user'; -import { useState } from 'react'; -import _ from 'lodash/fp'; - -export const useGetSystemTheme = () => { - const [theme, setTheme] = React.useState('dark'); - useEffect(() => { - const systemPref = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; - setTheme(systemPref); - }, []); - return theme; -}; - -export const useThemePreference = () => { - const { data, ...res } = useGetUserPrefQuery(); - const systemPref = useGetSystemTheme(); - const mode = data?.remoteProviderPreferences?.theme || systemPref || 'dark'; - - return { - data: { - mode, - }, - ...res, - }; -}; - -export const ThemeTogglerCore = ({ Component }) => { - const themePref = useThemePreference(); - const [handleUpdateUserPref] = useUpdateUserPrefWithContextMutation(); - const { data: userPrefs } = useGetUserPrefQuery(); - const [mode, setMode] = useState(themePref?.data?.mode); - - useEffect(() => { - setMode(themePref?.data?.mode); - }, [themePref?.data?.mode]); - - const toggleTheme = () => { - const newTheme = mode === 'light' ? 'dark' : 'light'; - setMode(newTheme); - const updated = _.set('remoteProviderPreferences.theme', newTheme, userPrefs); - console.log('updated', updated); - handleUpdateUserPref({ - body: updated, - }); - }; - - return ; -}; diff --git a/ui/themes/index.js b/ui/themes/index.js deleted file mode 100644 index 964db0df4e7..00000000000 --- a/ui/themes/index.js +++ /dev/null @@ -1,14 +0,0 @@ -import { rjsfTheme } from './rjsf'; -import defaultTheme, { styles, notificationColors } from './app'; - -export const NOTIFICATIONCOLORS = { - ERROR: '#F91313', - WARNING: '#F0A303', - SUCCESS: '#206D24', - INFO: '#2196F3', - SUCCESS_V2: '#3FC6B6', - ERROR_DARK: '#B32700', -}; - -export default defaultTheme; -export { rjsfTheme, styles, notificationColors }; diff --git a/ui/themes/rjsf.js b/ui/themes/rjsf.js deleted file mode 100644 index b325687e62c..00000000000 --- a/ui/themes/rjsf.js +++ /dev/null @@ -1,443 +0,0 @@ -import { createTheme } from '@material-ui/core/styles'; -import createBreakpoints from '@material-ui/core/styles/createBreakpoints'; -const breakpoints = createBreakpoints({}); -export const rjsfTheme = createTheme({ - palette: { - primary: { - main: '#607d8b', - }, - }, - typography: { - fontFamily: 'Qanelas Soft, sans-serif', - fontSize: 13, - }, - props: { - MuiTextField: { - variant: 'outlined', - margin: 'dense', - }, - MuiCheckbox: { - color: 'primary', - }, - MuiMenu: { - variant: 'outlined', - }, - }, - overrides: { - MuiOutlinedInput: { - root: { - backgroundColor: '#ffffff', - }, - }, - MuiButton: { - textSecondary: { - color: '#00b39f', - '&:hover': '00b39f', - }, - }, - MuiTextField: { - root: { - width: 'calc(100% - 4px)', - }, - }, - MuiInputLabel: { - root: { - whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', - maxWidth: '60%', - height: '100%', - '&:hover': { - overflow: 'visible', - }, - }, - shrink: { - maxWidth: '100%', - }, - }, - MuiFormControl: { - root: { - marginTop: '0.3rem', - }, - }, - MuiFormControlLabel: { - root: { - textTransform: 'capitalize', - padding: '3px', - }, - }, - MuiBox: { - root: { - marginTop: 0, - }, - }, - MuiDivider: { - root: { - height: '0.5px', - }, - }, - MuiFormLabel: { - root: { - color: '#333', - fontSize: '0.8rem', - textTransform: 'capitalize', - }, - }, - MuiTypography: { - body1: { - fontSize: '0.8rem', - }, - h5: { - textTransform: 'capitalize', - fontSize: '1.1rem', - fontWeight: 'bold', - }, - subtitle2: { - fontSize: '0.8rem', - fontStyle: 'italic', - color: '#565656', - }, - }, - MuiInputBase: { - root: { - fontSize: '0.8rem', // same as title - minRows: 5, - }, - }, - MuiTooltip: { - tooltip: { - backgroundColor: ' #3C494F', - color: '#fff', - opacity: '100%', - fontSize: '14px', - borderRadius: '0.9375rem', - padding: '0.9rem', - zIndex: '99999999999', - }, - popper: { - zIndex: '99999 !important', - }, - }, - MuiAccordionSummary: { - root: { - // border: "5px solid red", - backgroundColor: 'rgba(242,242,242)', - borderBottom: '1px solid rgba(0, 0, 0, .125)', - marginBottom: -1, - maxHeight: '1.5rem', - '&$expanded': { - minHeight: 56, - }, - }, - content: { - // border: "5px solid green", - justifyContent: 'space-between', - '&$expanded': { - margin: '12px 0', - justifyContent: 'space-between', - }, - }, - }, - MuiAccordionDetails: { - root: { - padding: 16, - }, - }, - MuiAccordion: { - root: { - border: '1px solid rgba(0, 0, 0, .125)', - boxShadow: 'none', - '&:not(:last-child)': { - borderBottom: 0, - }, - '&:before': { - display: 'none', - }, - '&$expanded': { - margin: 'auto', - }, - backgroundColor: 'rgba(242,242,242)', - }, - }, - MuiGrid: { - root: { - '& > *': { - border: 'none !important', - }, - marginTop: '0.1rem !important', - overflow: 'hidden', - alignSelf: 'center', - textOverflow: 'ellipsis', - '&:hover': { - overflow: 'visible', - }, - // To scale the grid items on a particular screen size - [breakpoints.up('lg')]: { - '& > *:nth-child(2)': { - '& > *:nth-child(1)': { - '& > *:nth-child(2)': { - justifyContent: 'space-around', - }, - }, - }, - }, - }, - }, - MuiCheckbox: { - // checkboxes white background - root: { - marginLeft: '4px', - '& > *:nth-child(1)': { - backgroundColor: '#ffffff', - width: '1rem', - height: '1rem', - }, - }, - }, - MuiIconButton: { - root: { - cursor: 'pointer', - }, - sizeSmall: { - padding: '1px', - }, - }, - MuiPaper: { - elevation0: { - backgroundColor: 'inherit', - }, - elevation2: { - boxShadow: 'none', - }, - }, - 'spacing-xs-2': { - padding: 0, - '& > *': { - paddingTop: '0 !important', - paddingBottom: '0 !important', - }, - }, - }, -}); - -const darkRjsfTheme = createTheme({ - palette: { - type: 'dark', - primary: { - main: '#00B39F', - }, - }, - typography: { - fontFamily: 'Qanelas Soft, sans-serif', - fontSize: 13, - }, - props: { - MuiTextField: { - variant: 'outlined', - margin: 'dense', - }, - MuiCheckbox: { - color: 'primary', - }, - MuiMenu: { - variant: 'outlined', - }, - }, - overrides: { - MuiOutlinedInput: { - root: { - // backgroundColor: '#303030', - }, - }, - MuiButton: { - textSecondary: { - color: '#00b39f', - '&:hover': '00b39f', - }, - }, - MuiTextField: { - root: { - width: 'calc(100% - 4px)', - }, - }, - MuiFormControlLabel: { - root: { - textTransform: 'capitalize', - padding: '3px', - }, - }, - MuiInputLabel: { - root: { - whiteSpace: 'nowrap', - overflow: 'hidden', - textOverflow: 'ellipsis', - maxWidth: '60%', - height: '100%', - '&:hover': { - overflow: 'visible', - }, - }, - shrink: { - maxWidth: '100%', - }, - }, - MuiFormControl: { - root: { - marginTop: '0.3rem', - }, - }, - MuiBox: { - root: { - marginTop: 0, - }, - }, - MuiDivider: { - root: { - height: '0.5px', - }, - }, - MuiFormLabel: { - root: { - color: '#FFF', - fontSize: '0.8rem', - textTransform: 'capitalize', - }, - }, - MuiTypography: { - body1: { - fontSize: '0.8rem', - }, - h5: { - textTransform: 'capitalize', - fontSize: '1.1rem', - fontWeight: 'bold', - }, - subtitle2: { - fontSize: '0.8rem', - fontStyle: 'italic', - color: '#565656', - }, - }, - MuiInputBase: { - root: { - fontSize: '0.8rem', // same as title - minRows: 5, - }, - }, - MuiTooltip: { - tooltip: { - backgroundColor: ' #3C494F', - color: '#fff', - opacity: '100%', - fontSize: '14px', - borderRadius: '0.9375rem', - padding: '0.9rem', - zIndex: '99999999999', - }, - popper: { - zIndex: '99999 !important', - }, - }, - MuiAccordionSummary: { - root: { - // border: "5px solid red", - backgroundColor: '#303030', - borderBottom: '1px solid rgba(255, 255, 255, .125)', - marginBottom: -1, - maxHeight: '1.5rem', - '&$expanded': { - minHeight: 56, - }, - }, - content: { - // border: "5px solid green", - justifyContent: 'space-between', - '&$expanded': { - margin: '12px 0', - justifyContent: 'space-between', - }, - }, - }, - MuiAccordionDetails: { - root: { - padding: 16, - }, - }, - MuiAccordion: { - root: { - border: '1px solid rgba(255, 255, 255, .125)', - boxShadow: 'none', - '&:not(:last-child)': { - borderBottom: 0, - }, - '&:before': { - display: 'none', - }, - '&$expanded': { - margin: 'auto', - }, - backgroundColor: '#303030', - }, - }, - MuiGrid: { - root: { - '& > *': { - border: 'none !important', - }, - marginTop: '0.1rem !important', - overflow: 'hidden', - alignSelf: 'center', - textOverflow: 'ellipsis', - '&:hover': { - overflow: 'visible', - }, - background: 'none', - // To scale the grid items on a particular screen size - [breakpoints.up('lg')]: { - '& > *:nth-child(2)': { - '& > *:nth-child(1)': { - '& > *:nth-child(2)': { - justifyContent: 'space-around', - }, - }, - }, - }, - }, - }, - MuiCheckbox: { - // checkboxes white background - root: { - marginLeft: '4px', - '& > *:nth-child(1)': { - backgroundColor: '#303030', - width: '1rem', - height: '1rem', - }, - }, - }, - MuiIconButton: { - root: { - cursor: 'default', - }, - sizeSmall: { - padding: '1px', - }, - }, - MuiPaper: { - elevation0: { - backgroundColor: 'inherit', - }, - elevation2: { - boxShadow: 'none', - }, - }, - 'spacing-xs-2': { - padding: 0, - '& > *': { - paddingTop: '0 !important', - paddingBottom: '0 !important', - }, - }, - }, -}); -export default darkRjsfTheme; diff --git a/ui/ui.config.js b/ui/ui.config.js deleted file mode 100644 index 2de358368e8..00000000000 --- a/ui/ui.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - components: { - navigator: true, // set false to disable the navigator component ( default: true ) - }, -}; diff --git a/ui/ui_dev_server.js b/ui/ui_dev_server.js deleted file mode 100644 index c11f49c4c37..00000000000 --- a/ui/ui_dev_server.js +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable no-unused-vars */ -const { createServer } = require('http'); -const { parse } = require('url'); -const next = require('next'); - -const port = parseInt(process.env.PORT, 10) || 3000; -const dev = process.env.NODE_ENV !== 'production'; -const app = next({ dev }); -const handle = app.getRequestHandler(); -var httpProxy = require('http-proxy'); - -var proxy = httpProxy.createProxyServer({ target: { host: 'localhost', port: 9081 } }); - -proxy.on('error', function (err, req, res) { - res.writeHead(500, { 'Content-Type': 'text/plain' }); - res.end('Proxy issue in Meshery-UI'); -}); - -app.prepare().then(() => { - let server = createServer((req, res) => { - // Be sure to pass `true` as the second argument to `url.parse`. - // This tells it to parse the query portion of the URL. - const { pathname } = parse(req.url, true); - if ( - pathname.startsWith('/api') || - pathname.startsWith('/user/logout') || - pathname.startsWith('/user/login') || - pathname.startsWith('/provider') || - pathname.startsWith('/ui/public/static/img/meshmodels') - ) { - proxy.web(req, res); - } else { - handle(req, res); - } - }); - - server.on('upgrade', (req, socket, head) => { - const { pathname } = parse(req.url, true); - if (!pathname.startsWith('/_next/webpack-hmr')) { - proxy.ws(req, socket, head, (err) => { - socket.write('HTTP/' + req.httpVersion + ' 500 Connection error\r\n\r\n'); - socket.end(); - }); - } - }); - - server.listen(port, (err) => { - if (err) throw err; - console.log(`> Ready on http://localhost:${port}`); - }); -}); diff --git a/ui/utils/Elements.js b/ui/utils/Elements.js deleted file mode 100644 index 8611996b3e9..00000000000 --- a/ui/utils/Elements.js +++ /dev/null @@ -1,35 +0,0 @@ -// Description: Contains functions related to DOM elements and react components. - -import React from 'react'; - -// recursively check if element or any of its parent has the class -export const hasClass = (element, className) => { - try { - if (typeof element?.className == 'string' && element?.className?.includes(className)) { - return true; - } - if (element?.parentElement) { - return hasClass(element.parentElement, className); - } - } catch (e) { - console.error(`Error in hasClass while checking for ${className} in `, element, e); - } - return false; -}; - -// recursively got throught component and its children and add the class to each of them -// This is required to prevent the clickaway listner from blocking the click event -// on the notification center IconButton create it as a HOC and use react.cloneElement to add the class -export const AddClassRecursively = ({ children, className }) => { - return React.Children.map(children, (child) => { - if (React.isValidElement(child)) { - return React.cloneElement(child, { - className: `${child.props.className} ${className}`, - children: AddClassRecursively({ children: child.props.children, className }), - }); - } - - // if child is a svg or animated svg string - return child; - }); -}; diff --git a/ui/utils/Enum.js b/ui/utils/Enum.js deleted file mode 100644 index 33e5d255e80..00000000000 --- a/ui/utils/Enum.js +++ /dev/null @@ -1,119 +0,0 @@ -export const FILE_OPS = { - FILE_UPLOAD: 'upload', - URL_UPLOAD: 'url_upload', - UPDATE: 'update', - DELETE: 'delete', - DOWNLOAD: 'download', - CLONE: 'clone', -}; - -export const CON_OPS = { - DELETE: 'delete', - UPDATE: 'update', - CREATE: 'create', -}; -export const ACTIONS = { - DEPLOY: 2, - UNDEPLOY: 1, - VERIFY: 0, -}; - -export const DEPLOYMENT_TYPE = { - IN_CLUSTER: 'in_cluster', - OUT_CLUSTER: 'out_of_cluster', -}; - -export const VISIBILITY = { - PRIVATE: 'private', - PUBLIC: 'public', - PUBLISHED: 'published', -}; - -export const EVENT_TYPES = { - ADDED: 'ADDED', - DELETED: 'DELETED', - MODIFIED: 'MODIFIED', -}; - -export const EXTENSIONS = { - MESHMAP: 'meshmap', -}; - -export const REGISTRY_ITEM_STATES = { - ENABLED: 'enabled', - IGNORED: 'ignored', -}; - -export const REGISTRY_ITEM_STATES_TO_TRANSITION_MAP = { - [REGISTRY_ITEM_STATES.ENABLED]: 'Enable', - [REGISTRY_ITEM_STATES.IGNORED]: 'Ignore', -}; - -export const CONNECTION_STATES = { - DISCOVERED: 'discovered', - REGISTERED: 'registered', - CONNECTED: 'connected', - IGNORED: 'ignored', - MAINTENANCE: 'maintenance', - DISCONNECTED: 'disconnected', - DELETED: 'deleted', - NOTFOUND: 'not found', -}; - -export const CONTROLLERS = { - BROKER: 'BROKER', - OPERATOR: 'OPERATOR', - MESHSYNC: 'MESHSYNC', -}; - -// Fetch from GraphQL/REST API remove this -export const CONTROLLER_STATES = { - DEPLOYED: 'DEPLOYED', - NOTDEPLOYED: 'NOTDEPLOYED', - UNDEPLOYED: 'UNDEPLOYED', - DEPLOYING: 'DEPLOYING', - ENABLED: 'ENABLED', - UNKOWN: 'UNKOWN', - RUNNING: 'RUNNING', - CONNECTED: 'CONNECTED', - DISABLED: 'DISABLED', -}; - -export const MesheryPatternsCatalog = 'meshery-patterns-catalog'; - -export const MesheryFiltersCatalog = 'meshery-filters-catalog'; - -// Remove this fetch all connections initially -export const CONNECTION_KINDS_DEF = ['MESHERY', 'KUBERNETES', 'PROMETHEUS', 'GRAFANA', 'GITHUB']; - -export const CONNECTION_KINDS = { - MESHERY: 'meshery', - KUBERNETES: 'kubernetes', - PROMETHEUS: 'prometheus', - GRAFANA: 'grafana', - GITHUB: 'github', -}; - -export const MESHSYNC_STATES = { - DISCOVERED: 'discovered', - REGISTER: 'register', -}; - -export const TRANSFER_COMPONENT = { - CHIP: 'chip', - OTHER: 'other', -}; - -export const CONNECTION_STATE_TO_TRANSITION_MAP = { - [CONNECTION_STATES.IGNORED]: 'Ignore', - [CONNECTION_STATES.CONNECTED]: 'Connect', - [CONNECTION_STATES.REGISTERED]: 'Register', - [CONNECTION_STATES.DISCOVERED]: 'Discover', - [CONNECTION_STATES.DELETED]: 'Delete', - [CONNECTION_STATES.MAINTENANCE]: 'Maintenance', - [CONNECTION_STATES.DISCONNECTED]: 'Disconnect', - [CONNECTION_STATES.NOTFOUND]: 'Not Found', -}; - -export const FILTER = 'filter'; -export const PATTERN = 'pattern'; diff --git a/ui/utils/ExtensionPointSchemaValidator.js b/ui/utils/ExtensionPointSchemaValidator.js deleted file mode 100644 index 6db4d9be7ab..00000000000 --- a/ui/utils/ExtensionPointSchemaValidator.js +++ /dev/null @@ -1,147 +0,0 @@ -/** - * @typedef {Object} NavigatorSchema - * @property {string} title - * @property {number} onClickCallback - * @property {string} href - * @property {string} component - * @property {string} icon - * @property {NavigatorSchema[]} children - * @property {string} type - */ - -/** - * @typedef {Object} UserPrefSchema - * @property {string} component - * @property {string} type - */ - -/** - * @typedef {Object} CollaboratorSchema - * @property {string} component - * @property {string} type - */ - -/** - * @typedef {Object} AccountSchema - * @property {string} title - * @property {number} onClickCallback - * @property {string} href - * @property {string} component - * @property {AccountSchema[]} children - * @property {string} type - */ - -/** - * @typedef {Object} FullPageExtensionSchema - * @property {string} title - * @property {number} onClickCallback - * @property {string} href - * @property {string} component - * @property {AccountSchema[]} children - * @property {string} type - */ - -/** - * ExtensionPointSchemaValidator returns the schema validator based on the - * type passed to the function - * @param {string} type - Type of Schema validator needed. Valid types are - navigator, userprefs, account - */ -export default function ExtensionPointSchemaValidator(type) { - switch (type) { - case 'navigator': - return NavigatorExtensionSchemaDecoder; - case 'user_prefs': - return UserPrefsExtensionSchemaDecoder; - case 'collaborator': - return CollaboratorExtensionSchemaDecoder; - case 'account': - return AccountExtensionSchemaDecoder; - default: - return () => {}; - } -} - -/** - * NavigatorExtensionSchemaDecoder - * @param {*} content - * @returns {NavigatorSchema[]} - */ -function NavigatorExtensionSchemaDecoder(content) { - if (Array.isArray(content)) { - return content.map((item) => { - return { - title: item.title || '', - href: prepareHref(item.href), - component: item.component || '', - onClickCallback: item?.on_click_callback || 0, - icon: (item.icon && '/api/provider/extension/' + item.icon) || '', - show: !!item.show, - children: NavigatorExtensionSchemaDecoder(item.children), - full_page: item.full_page, - isBeta: item.isBeta ?? false, - }; - }); - } - - return []; -} - -/** - * - * @param {*} content - * @returns {UserPrefSchema[]} - */ -function UserPrefsExtensionSchemaDecoder(content) { - if (Array.isArray(content)) { - return content.map((item) => { - return { component: item.component || '' }; - }); - } - - return []; -} - -/** - * - * @param {*} content - * @returns {CollaboratorSchema[]} - */ -function CollaboratorExtensionSchemaDecoder(content) { - if (Array.isArray(content)) { - return content.map((item) => { - return { component: item.component || '' }; - }); - } - - return []; -} - -/** - * AccountExtensionSchemaDecoder - * @param {*} content - * @returns {AccountSchema[]} - */ -function AccountExtensionSchemaDecoder(content) { - if (Array.isArray(content)) { - return content.map((item) => { - return { - title: item.title || '', - href: prepareHref(item.href), - component: item.component || '', - onClickCallback: item?.on_click_callback || 0, - show: !!item.show, - children: AccountExtensionSchemaDecoder(item.children), - full_page: item.full_page, - isHtmlLink: item.link, - }; - }); - } - - return []; -} - -function prepareHref(href) { - if (href.external) return href.uri || ''; - - return '/extension' + (href.uri || ''); -} diff --git a/ui/utils/PascalCaseToKebab.js b/ui/utils/PascalCaseToKebab.js deleted file mode 100644 index a20f59b4241..00000000000 --- a/ui/utils/PascalCaseToKebab.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * PascalCaseToKebab takes in a string in pascal case and returns - * a kebab cased string - * @param {string} str string in pascal case or camel case - * @returns - */ -export default function PascalCaseToKebab(str) { - return pascalCaseToCamelCase(str).replace(/[A-Z]/g, '-$&').toLowerCase(); -} - -/** - * pascalCaseToCamelCase takes in a string in pascal case and - * returns it in camelcase format - * @param {string} str string that needs to be transformed - */ -function pascalCaseToCamelCase(str) { - return str.charAt(0).toLowerCase() + str.slice(1); -} diff --git a/ui/utils/TooltipButton.js b/ui/utils/TooltipButton.js deleted file mode 100644 index 34abca64daa..00000000000 --- a/ui/utils/TooltipButton.js +++ /dev/null @@ -1,12 +0,0 @@ -import { Button } from '@material-ui/core'; -import { CustomTooltip } from '@layer5/sistent'; - -export default function TooltipButton({ children, onClick, title, variant, ...props }) { - return ( - - - - ); -} diff --git a/ui/utils/URLValidator.js b/ui/utils/URLValidator.js deleted file mode 100644 index 205f45b01a2..00000000000 --- a/ui/utils/URLValidator.js +++ /dev/null @@ -1,14 +0,0 @@ -export const URLValidator = (url) => { - const compulsoryProtocolValidUrlPattern = new RegExp( - '(^(http|https|nats|tcp):\\/\\/)' + // compulsory protocol - '((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.{0,})+[a-z]{0,}|' + // domain name - 'localhost|' + - '((\\d{1,3}.){3}\\d{1,3}))' + // OR ip (v4) address - '(\\:\\d+)?(/[-a-z\\d%_.~+]*)*' + // port and path - '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string - '(\\#[-a-z\\d_]*)?$', - 'i', - ); // fragment locator - - return url?.match(compulsoryProtocolValidUrlPattern); -}; diff --git a/ui/utils/camelCaseToSentanceCase.js b/ui/utils/camelCaseToSentanceCase.js deleted file mode 100644 index 39aaeff4863..00000000000 --- a/ui/utils/camelCaseToSentanceCase.js +++ /dev/null @@ -1,3 +0,0 @@ -export const CamelCaseToSentanceCase = (stringValue) => { - return stringValue.replace(/([A-Z]+)/g, ' $1').replace(/([A-Z][a-z])/g, ' $1'); -}; diff --git a/ui/utils/can.js b/ui/utils/can.js deleted file mode 100644 index 637e4ab2689..00000000000 --- a/ui/utils/can.js +++ /dev/null @@ -1,19 +0,0 @@ -import { PureAbility } from '@casl/ability'; -import { createCanShow } from '@layer5/sistent'; -import _ from 'lodash'; -import { CapabilitiesRegistry } from './disabledComponents'; -import { store } from '../store'; -import { EventBus } from '@layer5/sistent'; - -export const ability = new PureAbility([]); - -export default function CAN(action, subject) { - return ability.can(action, _.lowerCase(subject)); -} - -const getCapabilitiesRegistry = () => - new CapabilitiesRegistry(store.getState().capabilitiesRegistry); - -export const mesheryEventBus = new EventBus(); - -export const CanShow = createCanShow(getCapabilitiesRegistry, CAN, () => mesheryEventBus); diff --git a/ui/utils/charts.js b/ui/utils/charts.js deleted file mode 100644 index a29dd297858..00000000000 --- a/ui/utils/charts.js +++ /dev/null @@ -1,38 +0,0 @@ -export const isValidColumnName = (name) => { - return name !== '' && name !== ' ' && name != undefined && name != null; -}; - -export const CHART_COLORS = [ - '#14232A', // Gunmetal - // '#213A45', - '#2E5261', - // '#294957', - '#3B697D', // Paynes' Gray - // '#396679', - '#4A839C', - // '#477E96', Teal Blue - '#5996B1', - // '#639CB5', - '#74A8BE', - // '#8Bb2C6', - '#90B9CB', - // '#AACCBD8', // Columbia Blue - '#CBDEE6', - // '#EEF4F7' -]; - -export const dataToColors = (data) => { - const columns = data.map((item) => item[0]); - const colors = {}; - let colorIdx = 0; - - columns.forEach((col) => { - if (colorIdx >= CHART_COLORS.length) { - colorIdx = 0; - } - colors[col] = CHART_COLORS[colorIdx]; - colorIdx += 1; - }); - - return colors; -}; diff --git a/ui/utils/context/dynamicContext.js b/ui/utils/context/dynamicContext.js deleted file mode 100644 index d37d41d0a55..00000000000 --- a/ui/utils/context/dynamicContext.js +++ /dev/null @@ -1,23 +0,0 @@ -import React, { useState } from 'react'; - -// Create a context to hold the dynamic component -const DynamicComponentContext = React.createContext(); - -// Custom hook to use the dynamic component -export const useDynamicComponent = () => { - const context = React.useContext(DynamicComponentContext); - if (!context) { - throw new Error('useDynamicComponent must be used within a DynamicComponentProvider'); - } - return context; -}; - -// Provider component to set the dynamic component -export const DynamicComponentProvider = ({ children }) => { - const [DynamicComponent, setComponent] = useState(null); - return ( - - {children} - - ); -}; diff --git a/ui/utils/context/schemaSet.js b/ui/utils/context/schemaSet.js deleted file mode 100644 index 439ec80a628..00000000000 --- a/ui/utils/context/schemaSet.js +++ /dev/null @@ -1,4 +0,0 @@ -import { createContext } from 'react'; - -export const SchemaContext = createContext({ workloadTraitSet: null, meshWorkloads: null }); -// values are initialised in `ui/components/ConfiguratorWrapper.js` diff --git a/ui/utils/custom-column.js b/ui/utils/custom-column.js deleted file mode 100644 index 77764dc6626..00000000000 --- a/ui/utils/custom-column.js +++ /dev/null @@ -1,152 +0,0 @@ -import React, { useState } from 'react'; -import IconButton from '@mui/material/IconButton'; -import Checkbox from '@mui/material/Checkbox'; -import FormControlLabel from '@mui/material/FormControlLabel'; -import { CustomTooltip } from '@layer5/sistent'; -import Popper from '@mui/material/Popper'; -import ClickAwayListener from '@mui/material/ClickAwayListener'; -import { withStyles } from '@material-ui/core/styles'; -// import Slide from '@mui/material/Slide'; -import Box from '@mui/material/Box'; -import { Card } from '@material-ui/core'; -import CheckBoxOutlineBlankIcon from '@mui/icons-material/CheckBoxOutlineBlank'; -import { ColumnIcon } from '@layer5/sistent'; - -const styles = (theme) => ({ - epaper: { - '&: .MuiPaper-root': { - background: theme.palette.secondary.headerColor, - color: theme.palette.secondary.textMain, - }, - padding: '1rem', - boxShadow: `0px 4px 8px ${ - theme.palette.type === 'light' - ? theme.palette.secondary.disabledIcon - : '0px 4px 5px 0px rgba(0,0,0,0.14)' - }`, - }, - icon: { - fill: theme.palette.secondary.iconMain, - }, -}); - -const CustomColumnVisibilityControl = ({ columns, customToolsProps, classes, id }) => { - const [anchorEl, setAnchorEl] = useState(null); - - const handleOpen = (event) => { - setAnchorEl(event.currentTarget); - }; - - const handleClose = () => { - setAnchorEl(null); - }; - - const handleColumnVisibilityChange = (columnName, isVisible) => { - customToolsProps.setColumnVisibility((prevState) => ({ - ...prevState, - [columnName]: isVisible, - })); - }; - - return ( -
- - - - - - - - - {/* {({ TransitionProps }) => ( - */} - - - -
- {columns.map((col) => ( - handleColumnVisibilityChange(col.name, e.target.checked)} - icon={} - sx={{ - '&.Mui-checked': { - color: '#00B39F', - }, - }} - /> - } - label={col.label} - /> - ))} -
-
-
-
- {/*
- )} */} -
-
-
- ); -}; - -export default withStyles(styles)(CustomColumnVisibilityControl); diff --git a/ui/utils/custom-filter.js b/ui/utils/custom-filter.js deleted file mode 100644 index 4aba4af19bd..00000000000 --- a/ui/utils/custom-filter.js +++ /dev/null @@ -1,174 +0,0 @@ -import React, { useState } from 'react'; -import { Popper } from '@mui/material'; -import { - Button, - Card, - ClickAwayListener, - InputLabel, - MenuItem, - Select, - IconButton, -} from '@material-ui/core'; -import { CustomTooltip } from '@layer5/sistent'; -import { withStyles } from '@material-ui/core/styles'; -import { FilterIcon } from '@layer5/sistent'; - -const styles = (theme) => ({ - epaper: { - '&: .MuiPaper-root': { - background: theme.palette.secondary.headerColor, - color: theme.palette.secondary.textMain, - }, - padding: '1rem', - boxShadow: `0px 4px 8px ${ - theme.palette.type === 'light' - ? theme.palette.secondary.disabledIcon - : '0px 4px 5px 0px rgba(0,0,0,0.14)' - }`, - }, - icon: { - fill: theme.palette.secondary.iconMain, - }, -}); - -const UniversalFilter = ({ - filters, - selectedFilters, - setSelectedFilters, - handleApplyFilter, - showAllOption = true, - style, - classes, - conditionForMaxHeight = false, -}) => { - const [anchorEl, setAnchorEl] = useState(null); - const [open, setOpen] = useState(false); - const handleFilterChange = (event, columnName) => { - const value = event.target.value; - - setSelectedFilters((filters) => ({ - ...filters, - [columnName]: value, - })); - }; - - const handleApplyOnClick = () => { - handleClose(); - handleApplyFilter(); - }; - - const handleClick = (event) => { - setAnchorEl(event.currentTarget); - setOpen((previousOpen) => !previousOpen); - // setOpenDialog(true); - }; - - const canBeOpen = open && Boolean(anchorEl); - const id = canBeOpen ? 'transition-popper' : undefined; - - const handleClose = () => { - // setAnchorEl(null); - setOpen(false); - // setOpenDialog(false); - }; - - return ( -
- - - - - - -
- -
- - {Object.keys(filters).map((filter_column) => { - const options = filters[filter_column].options; - return ( -
- - {filters[filter_column].name} - - -
- ); - })} -
- -
-
-
-
-
-
-
- ); -}; - -export default withStyles(styles)(UniversalFilter); diff --git a/ui/utils/custom-search.js b/ui/utils/custom-search.js deleted file mode 100644 index ecb4e8cfaec..00000000000 --- a/ui/utils/custom-search.js +++ /dev/null @@ -1,150 +0,0 @@ -import React, { useState, useRef } from 'react'; -import TextField from '@mui/material/TextField'; -import { CustomTooltip } from '@layer5/sistent'; -import IconButton from '@mui/material/IconButton'; -// import SearchIcon from '../assets/icons/search'; -// import CloseIcon from '@mui/icons-material/Close'; -import { makeStyles } from '@material-ui/core/styles'; -import ClickAwayListener from '@mui/material/ClickAwayListener'; -import debounce from './debounce'; -import { CloseIcon, SearchIcon } from '@layer5/sistent'; - -const useStyles = makeStyles((theme) => ({ - icon: { - fill: theme.palette.secondary.iconMain, - width: '1.5rem', - height: '1.5rem', - }, - searchInput: { - '& .MuiOutlinedInput-root': { - color: theme.palette.secondary.iconMain, - }, - '& .MuiOutlinedInput-notchedOutline': { - borderColor: theme.palette.secondary.iconMain, - '&:hover': { - borderColor: '#00b39f', - }, - }, - '& .MuiInputLabel-root': { - color: theme.palette.secondary.iconMain, - }, - '& .MuiInputBase-input': { - color: theme.palette.secondary.iconMain, - caretColor: theme.palette.secondary.iconMain, - }, - '& .MuiInput-underline:before': { - borderBottomColor: theme.palette.secondary.iconMain, - }, - '& .MuiInput-underline:hover:before': { - borderBottomColor: '#00b39f', - }, - '& .MuiInput-underline:hover:after': { - borderBottomColor: '#00b39f', - }, - '& .MuiInput-underline.Mui-focused:before': { - borderBottomColor: '#00b39f', - }, - '& .MuiInput-underline.Mui-focused:after': { - borderBottomColor: '#00b39f', - }, - }, -})); - -const SearchBar = ({ onSearch, placeholder, expanded, setExpanded, value = '' }) => { - const [searchText, setSearchText] = useState(value); - const searchRef = useRef(null); - const classes = useStyles(); - - const debouncedOnSearch = debounce(onSearch, 500); - - const handleSearchChange = (event) => { - debouncedOnSearch(event.target.value); - setSearchText(event.target.value); - }; - - const handleClearIconClick = () => { - setSearchText(''); - debouncedOnSearch(''); - setExpanded(false); - }; - - const handleSearchIconClick = () => { - if (expanded) { - setSearchText(''); - setExpanded(false); - } else { - setExpanded(true); - setTimeout(() => { - searchRef.current.focus(); - }, 300); - } - }; - - const width = window.innerWidth; - let searchWidth = '200px'; - if (width <= 750) { - searchWidth = '120px'; - } - - return ( -
- - - {expanded ? ( - { - const isTable = event.target.closest('#ref'); - - if (searchText !== '') { - return; - } - if (isTable) { - handleClearIconClick(); // Close the search bar as needed - } - }} - > - - - - - - - ) : ( - - - - - - )} -
- ); -}; - -export default SearchBar; diff --git a/ui/utils/cypress-gql/graphql-test-utils.js b/ui/utils/cypress-gql/graphql-test-utils.js deleted file mode 100644 index d46b3d89fe7..00000000000 --- a/ui/utils/cypress-gql/graphql-test-utils.js +++ /dev/null @@ -1,22 +0,0 @@ -// Utility to match GraphQL mutation based on the operation name -export const hasOperationName = (req, operationName) => { - const { body } = req; - return ( - Object.prototype.hasOwnProperty.call(body, 'operationName') && - body.operationName === operationName - ); -}; - -// Alias query if operationName matches -export const aliasQuery = (req, operationName) => { - if (hasOperationName(req, operationName)) { - req.alias = `gql${operationName}Query`; - } -}; - -// Alias mutation if operationName matches -export const aliasMutation = (req, operationName) => { - if (hasOperationName(req, operationName)) { - req.alias = `gql${operationName}Mutation`; - } -}; diff --git a/ui/utils/data-table.js b/ui/utils/data-table.js deleted file mode 100644 index 372c4a28d5a..00000000000 --- a/ui/utils/data-table.js +++ /dev/null @@ -1,124 +0,0 @@ -// Data table for parent tables with custom column visibility control -import MUIDataTable from 'mui-datatables'; -import React, { useEffect, useCallback } from 'react'; -import { useWindowDimensions } from './dimension'; -import { styled } from '@mui/system'; - -const StyledMUIDataTable = styled(MUIDataTable)(() => ({ - padding: '5px 18px 0 18px', -})); - -const ResponsiveDataTable = ({ - data, - columns, - options, - tableCols, - updateCols, - columnVisibility, - ...props -}) => { - const { width } = useWindowDimensions(); - - const formatDate = useCallback( - (date, width) => { - const dateOptions = { - day: 'numeric', - weekday: 'short', - month: 'long', - year: 'numeric', - }; - - if (width < 1240 && width >= 915) { - dateOptions.month = 'short'; - dateOptions.day = 'numeric'; - dateOptions.year = 'numeric'; - dateOptions.weekday = 'short'; - } else if (width < 915) { - dateOptions.month = 'short'; - dateOptions.day = '2-digit'; - dateOptions.year = 'numeric'; - dateOptions.weekday = undefined; - } - - return date.toLocaleDateString('en-US', dateOptions); - }, - [width], - ); - - const updatedOptions = { - ...options, - // viewColumns: false, - onViewColumnsChange: (column, action) => { - let colToChange; - switch (action) { - case 'add': - colToChange = columns.find((obj) => obj.name === column); - colToChange.options.display = true; - updateCols([...columns]); - break; - case 'remove': - colToChange = columns.find((obj) => obj.name === column); - colToChange.options.display = false; - updateCols([...columns]); - break; - } - }, - }; - - useEffect(() => { - columns?.forEach((col) => { - if (!col.options) { - col.options = {}; - } - // Set the display option based on columnVisibility state - col.options.display = columnVisibility[col.name]; - - if ( - [ - 'updated_at', - 'created_at', - 'deleted_at', - 'last_login_time', - 'joined_at', - 'last_run', - 'next_run', - ].includes(col.name) - ) { - col.options.customBodyRender = (value) => { - if (value === 'NA') { - return value; - } else if (value?.Valid === true) { - const date = new Date(value.Time); - return formatDate(date, width); - } else if (value?.Valid === false) { - return 'NA'; - } else { - const date = new Date(value); - return formatDate(date, width); - } - }; - } - }); - updateCols([...columns]); - }, [width, columnVisibility]); - - const components = { - ExpandButton: function () { - return ''; - }, - }; - - return ( -
- -
- ); -}; - -export default ResponsiveDataTable; diff --git a/ui/utils/debounce.js b/ui/utils/debounce.js deleted file mode 100644 index b6304b0b775..00000000000 --- a/ui/utils/debounce.js +++ /dev/null @@ -1,17 +0,0 @@ -/** - * The debouncing mechanism for calling the function - * on the timeout reached. - * - * @param {Function} func - * @param {Number} timeout time in miliseconds - * @returns - */ -export default function debounce(func, timeout = 500) { - let timer; - return (...args) => { - clearTimeout(timer); - timer = setTimeout(() => { - func.apply(this, args); - }, timeout); - }; -} diff --git a/ui/utils/dimension.js b/ui/utils/dimension.js deleted file mode 100644 index 9c279b62286..00000000000 --- a/ui/utils/dimension.js +++ /dev/null @@ -1,52 +0,0 @@ -import { useState, useEffect } from 'react'; - -/** - * getWindowDimensions - Returns the width and height of the window - * @returns {object} {width, height} - */ -export function getWindowDimensions() { - const { innerWidth: width, innerHeight: height } = window; - return { - width, - height, - }; -} - -/** - * useWindowDimensions - Returns the width and height of the window - * @returns {object} {width, height} - * @example - * const { width, height } = useWindowDimensions(); - * console.log(width, height); - * // 1920 1080 - */ - -// Description: -// useWindowDimensions, which is used to obtain and track the width and height -// of the browser window. It leverages the useState and useEffect hooks to update -// the window dimensions and provide them to the calling component. - -// Eg: React component that needs to respond to changes in the browser window's dimensions, for instance, -// to make responsive design decisions. You can use the useWindowDimensions hook to achieve this. - -export function useWindowDimensions() { - const [windowDimensions, setWindowDimensions] = useState(getWindowDimensions()); - - useEffect(() => { - let searchTimeout; - - function handleResize() { - if (searchTimeout) { - clearTimeout(searchTimeout); - } - searchTimeout = setTimeout(() => { - setWindowDimensions(getWindowDimensions()); - }, 500); - } - - window.addEventListener('resize', handleResize); - return () => window.removeEventListener('resize', handleResize); - }, []); - - return windowDimensions; -} diff --git a/ui/utils/disabledComponents.js b/ui/utils/disabledComponents.js deleted file mode 100644 index 7e877c72f45..00000000000 --- a/ui/utils/disabledComponents.js +++ /dev/null @@ -1,79 +0,0 @@ -import _ from 'lodash'; - -function recursivelySearchObjKey(obj, arr, index) { - if (index === arr.length) { - return obj; - } - - const objectKeys = Object.keys(obj); - - // eslint-disable-next-line no-unused-vars - for (let _key in objectKeys) { - const keyName = arr[index]; - if (obj[keyName]) { - return recursivelySearchObjKey(obj[keyName], arr, index + 1); - } - - return false; - } -} - -export class CapabilitiesRegistry { - capabilitiesRegistry; - isPlaygroundEnv = false; - - constructor(capabilitiesRegistry) { - this.capabilitiesRegistry = capabilitiesRegistry; - this.isPlaygroundEnv = capabilitiesRegistry?.restrictedAccess?.isMesheryUiRestricted || false; - } - - capabilities() { - return this.capabilitiesRegistry; - } - - isNavigatorComponentEnabled(navigatorWalker) { - if (!this.isPlaygroundEnv) { - return true; - } - - let walkerArray = ['restrictedAccess', 'allowedComponents', 'navigator', ...navigatorWalker]; - - const searchResult = recursivelySearchObjKey(this.capabilitiesRegistry, walkerArray, 0); - if (_.isObject(searchResult) && _.isEmpty(searchResult)) { - return false; - } - return searchResult; - } - - isHeaderComponentEnabled(headerWalker) { - if (!this.isPlaygroundEnv) { - return true; - } - - let walkerArray = ['restrictedAccess', 'allowedComponents', 'header', ...headerWalker]; - - const searchResult = recursivelySearchObjKey(this.capabilitiesRegistry, walkerArray, 0); - if (_.isObject(searchResult) && _.isEmpty(searchResult)) { - return false; - } - return searchResult; - } - - isExtensionComponentEnabled(walkerArray) { - if (!this.isPlaygroundEnv) { - return true; - } - - if (!this.capabilitiesRegistry.extensions?.navigator) { - return false; - } - - const navigatorObj = this.capabilitiesRegistry.extensions.navigator[0]?.allowedTo; - - const searchResult = recursivelySearchObjKey(navigatorObj, walkerArray, 0); - if (_.isObject(searchResult) && _.isEmpty(searchResult)) { - return false; - } - return searchResult; - } -} diff --git a/ui/utils/fallback.js b/ui/utils/fallback.js deleted file mode 100644 index 19120ccb8c2..00000000000 --- a/ui/utils/fallback.js +++ /dev/null @@ -1,7 +0,0 @@ -export function getFallbackImageBasedOnKind(kind) { - const fallbackComponent = { - meshery: 'static/img/meshery-logo.png', - kubernetes: 'static/img/kubernetes.svg', - }; - return fallbackComponent[kind]; -} diff --git a/ui/utils/fileDownloader.js b/ui/utils/fileDownloader.js deleted file mode 100644 index 3c4d00e4919..00000000000 --- a/ui/utils/fileDownloader.js +++ /dev/null @@ -1,40 +0,0 @@ -import { FILTER, PATTERN } from './Enum'; - -const DOWNLOAD_PATH = { - [PATTERN]: ({ id, source_type, params }) => - source_type - ? `/api/pattern/download/${id}/${source_type}` - : params - ? `/api/pattern/download/${id}?${params}` - : `/api/pattern/download/${id}`, - [FILTER]: ({ id }) => `/api/filter/download/${id}`, -}; - -export const downloadFileFromUrl = (url, name) => { - let linkElement = document.createElement('a'); - linkElement.setAttribute('href', url); - linkElement.setAttribute('download', name); - linkElement.click(); - linkElement.remove(); -}; - -/* - * @param {string} type - application, pattern, filter - * @param {string} id - id of the file to download - * @param {string} name - name of the file to download - * @param {string} source_type - source type of the file to download - * @returns {void} - */ -export default function downloadContent({ id, type, name, source_type, params }) { - const uri = DOWNLOAD_PATH[type]({ id, source_type, params }); - if (!uri) { - throw new Error('Invalid type of content to download', type); - } - downloadFileFromUrl(uri, name); -} - -export const downloadFileFromContent = (content, fileName, type) => { - const blob = new Blob([content], { type: type }); - const url = window.URL.createObjectURL(blob); - downloadFileFromUrl(url, fileName); -}; diff --git a/ui/utils/hooks/useMeshModelComponents.js b/ui/utils/hooks/useMeshModelComponents.js deleted file mode 100644 index 0fd93a380ec..00000000000 --- a/ui/utils/hooks/useMeshModelComponents.js +++ /dev/null @@ -1,212 +0,0 @@ -import _ from 'lodash'; - -export const WILDCARD_V = 'All Versions'; - -import { - fetchCategories, - getComponentFromModelApi, - getModelFromCategoryApi, - getVersionedComponentFromModel, -} from '../../api/meshmodel'; -import { compose } from 'lodash/fp'; -import { useEffect, useState } from 'react'; -import getMostRecentVersion, { - versionSortComparatorFn, - sortAndGroupVersionsInModel, -} from '../versionSort'; - -const handleError = (e) => { - console.error('MeshModel axios error ocurred', e); -}; - -function componentToLatestApiVersion(components) { - const componentToAPiVersionMap = {}; // this is for storing all the apiVersions of similar components in order to get the most recent at the end - - [...components].forEach((componentDef) => { - if (componentToAPiVersionMap?.[componentDef.component.kind]) { - componentToAPiVersionMap[componentDef.component.kind] = [ - ...componentToAPiVersionMap[componentDef.component.kind], - componentDef.component.version, - ]; - } else { - componentToAPiVersionMap[componentDef.component.kind] = [componentDef.component.version]; - } - }); - - Object.keys(componentToAPiVersionMap).forEach((key) => { - componentToAPiVersionMap[key] = getMostRecentVersion(componentToAPiVersionMap[key]); - }); - - return componentToAPiVersionMap; -} - -function removeDuplicateMeshModelComponents(componentDefs) { - const componentClone = [...componentDefs]; - const cmpToApiVersion = componentToLatestApiVersion(componentClone); - // component kind set keeps track of redudant components - const componentKindUniqueSet = new Set(); - return componentClone - .filter((componentDef) => { - const kind = componentDef.component; - // filter unique components - // already found in the unique set, means that it is already filtered - if (componentKindUniqueSet.has(kind)) { - return false; - } - - componentKindUniqueSet.add(kind); - return true; - }) - .map((componentDef) => ({ - // on all unique components, set the apiVersion to latest one - ...componentDef, - apiVersion: cmpToApiVersion[componentDef.component.kind] || componentDef.component.version, // fallback in case of mishap - })); -} - -function sortMeshModelComponents(componentDefs) { - return [...componentDefs].sort((a, b) => a.component.kind.localeCompare(b.component.kind)); -} - -export const removeDuplicatesAndSortByAlphabet = _.flowRight( - sortMeshModelComponents, - removeDuplicateMeshModelComponents, -); - -// processing includes sorting and deduplicating components -function getProcessedMeshModelResponseData(meshModelResponse) { - return [...meshModelResponse] - .map((meshmodel) => ({ - ...meshmodel, - components: removeDuplicatesAndSortByAlphabet(meshmodel.components), - })) - .sort((modelA, modelB) => versionSortComparatorFn(modelA.version, modelB.version)) - .reverse(); // sort the versions in reverse order -} - -function deduplicatedListOfComponentsFromAllVersions(componentDefs) { - const uniqueComponents = [ - ...new Set(componentDefs.map((componentDef) => componentDef.component.kind)), - ]; - return uniqueComponents.map((compKind) => - componentDefs.find((componentDef) => componentDef.component.kind === compKind), - ); -} - -function groupComponentsByVersion(componentDefs) { - const versions = [ - ...new Set(componentDefs?.map((componentDef) => componentDef.model.model.version) || []), - ]; - - if (versions.length > 1) { - return [ - { - version: WILDCARD_V, - components: deduplicatedListOfComponentsFromAllVersions(componentDefs), - }, - ...versions.map((version) => ({ - version: version, - components: componentDefs.filter( - (componentDef) => componentDef.model.model.version === version, - ), - })), - ]; - } - - // don't attach the wildcards - return versions.map((version) => ({ - version: version, - components: componentDefs.filter( - (componentDef) => componentDef.model.model.version === version, - ), - })); -} -const getProcessedComponentsData = compose( - getProcessedMeshModelResponseData, - groupComponentsByVersion, -); - -function convertToArray(item) { - if (Array.isArray(item)) return item; - - return [item]; -} - -export function useMeshModelComponents() { - const [meshmodelComponents, setMeshModelComponents] = useState({}); - const [categories, setCategories] = useState([]); - const [models, setModels] = useState({}); - - useEffect(() => { - fetchCategories() - .then((categoryJson) => { - setCategories( - categoryJson.categories.sort((catA, catB) => catA.name.localeCompare(catB.name)), - ); - }) - .catch(handleError); - }, []); - - async function getModelFromCategory(category) { - // already fetched the models from catgory and stored - if (models[category]) { - return; - } - - getModelFromCategoryApi(category) - .then((response) => { - setModels( - Object.assign( - { ...models }, - { - [category]: sortAndGroupVersionsInModel(response.models), - }, - ), - ); - }) - .catch(handleError); - } - - async function getComponentsFromModel(modelName, version) { - if (!version) { - if (!meshmodelComponents[modelName]) { - const modelData = await getComponentFromModelApi(modelName); - - setMeshModelComponents( - Object.assign( - { ...meshmodelComponents }, - { - [modelName]: getProcessedComponentsData(modelData.components), - }, - ), - ); - } - return; - } - - if ( - !meshmodelComponents[modelName] || - !convertToArray(meshmodelComponents[modelName])?.find( - (model) => model.model.version === version, - ) - ) { - const modelData = await getVersionedComponentFromModel(modelName, version); - setMeshModelComponents( - Object.assign( - { ...meshmodelComponents }, - { - [modelName]: getProcessedComponentsData(modelData.components), - }, - ), - ); - } - } - - return { - models, - meshmodelComponents, - getModelFromCategory, - getComponentsFromModel, - categories, - }; -} diff --git a/ui/utils/hooks/useNotification.js b/ui/utils/hooks/useNotification.js deleted file mode 100644 index a9e4029773c..00000000000 --- a/ui/utils/hooks/useNotification.js +++ /dev/null @@ -1,113 +0,0 @@ -/* eslint-disable no-unused-vars */ -//NOTE: This file is being refactored to use the new notification center -import { IconButton } from '@material-ui/core'; -import { ToggleButtonGroup } from '@mui/material'; -import { useSnackbar } from 'notistack'; -import { iconMedium } from '../../css/icons.styles'; -import CloseIcon from '@material-ui/icons/Close'; -import { useDispatch } from 'react-redux'; -import moment from 'moment'; -import { v4 } from 'uuid'; -import { NOTIFICATION_STATUS } from '../../lib/event-types'; -import { store as rtkStore } from '../../store/index'; -import { toggleNotificationCenter } from '../../store/slices/events'; -import { NOTIFICATION_CENTER_TOGGLE_CLASS } from '../../components/NotificationCenter/constants'; -import React from 'react'; -import BellIcon from '../../assets/icons/BellIcon'; -import { AddClassRecursively } from '../Elements'; - -/** - * A React hook to facilitate emitting events from the client. - * The hook takes care of storing the events on the client through Redux - * and also notifying the user through snackbars and the notification center. - * - * @returns {Object} An object with the `notify` property. - */ -export const useNotification = () => { - const x = useSnackbar(); - const { enqueueSnackbar, closeSnackbar } = useSnackbar(); - - /** - * Opens an event in the notification center. - * - * @param {string} eventId - The ID of the event to be opened. - */ - const openEvent = (eventId) => { - rtkStore.dispatch(toggleNotificationCenter()); - }; - - /** - * Notifies and stores the event. - * - * @param {Object} options - Options for the event notification. - * @param {string} options.id - A unique ID for the event. If not provided, a random ID will be generated. - * @param {string} options.message - Summary of the event. - * @param {string} options.details - Description of the event. - * @param {Object} options.event_type - The type of the event. - * @param {number} options.timestamp - UTC timestamp for the event. If not provided, it is generated on the client. - * @param {Object} options.customEvent - Additional properties related to the event. - * @param {boolean} options.showInNotificationCenter - Whether to show the event in the notification center. Defaults to `true`. - * @param {boolean} options.pushToServer - Whether to push the event to the server. Defaults to `false`. - */ - const notify = ({ - id = null, - message, - details = null, - event_type, - timestamp = null, - customEvent = null, - showInNotificationCenter = false, - pushToServer = false, - }) => { - timestamp = timestamp ?? moment.utc().valueOf(); - id = id || v4(); - - enqueueSnackbar(message, { - //NOTE: Need to Consolidate the variant and event_type - variant: typeof event_type === 'string' ? event_type : event_type?.type, - action: function Action(key) { - return ( - - {showInNotificationCenter && ( - - openEvent(id)} - > - - - - )} - closeSnackbar(key)} - > - - - - ); - }, - }); - }; - - return { - notify, - }; -}; - -/** - * A higher-order component that provides the `notify` function as a prop to a class-based component. - * - * @param {React.Component} Component - The class-based component to be wrapped. - * @returns {React.Component} The wrapped component with the `notify` prop. - */ -export function withNotify(Component) { - return function WrappedWithNotify(props) { - const { notify } = useNotification(); - return ; - }; -} diff --git a/ui/utils/hooks/usePreventUserFromLeavingPage.js b/ui/utils/hooks/usePreventUserFromLeavingPage.js deleted file mode 100644 index f6198314dcc..00000000000 --- a/ui/utils/hooks/usePreventUserFromLeavingPage.js +++ /dev/null @@ -1,43 +0,0 @@ -import SingletonRouter, { Router } from 'next/router'; -import React from 'react'; - -/** - * Restrict the user to navigate away to another page - * @param {bool} preventLeave - * @returns - */ -export default function usePreventUserFromLeavingPage(preventLeave) { - const confirmationMsg = 'You might have some unsaved changes. Are you sure you want to leave?'; - const [shouldPreventLeaving, setShouldPreventLeaving] = React.useState(!!preventLeave); - - React.useEffect(() => { - // Prevents tab quit / tab refresh - if (shouldPreventLeaving) { - // Adding window alert if the shop quits without saving - window.onbeforeunload = function () { - return confirmationMsg; - }; - } else { - window.onbeforeunload = () => {}; - } - - if (shouldPreventLeaving) { - // Prevents next routing - SingletonRouter.router.change = (...args) => { - if (confirm(confirmationMsg)) { - return Router.prototype.change.apply(SingletonRouter.router, args); - } else { - /* eslint-disable */ - return new Promise((resolve, reject) => resolve(false)); - } - }; - } - - // unmount - return () => { - delete SingletonRouter.router.change; - }; - }, [shouldPreventLeaving]); - - return setShouldPreventLeaving; -} diff --git a/ui/utils/hooks/useStateCB.js b/ui/utils/hooks/useStateCB.js deleted file mode 100644 index 4de573e223b..00000000000 --- a/ui/utils/hooks/useStateCB.js +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react'; - -function useStateCB(initState, changeTrackCB) { - const [state, _setState] = React.useState(initState); - const stateRef = React.useRef(initState); - - const callbackRef = React.useRef(); - const changeTrackCBRef = React.useRef(changeTrackCB); - const isFirstCBCall = React.useRef(true); - - React.useEffect(() => { - if (isFirstCBCall.current) isFirstCBCall.current = false; - else { - callbackRef.current?.(state); - changeTrackCBRef.current?.(state); - } - }, [state]); - - const setState = (state, callback) => { - callbackRef.current = callback; - - stateRef.current = state; - _setState(state); - }; - - const getStateRefValue = () => stateRef.current; - - return [state, setState, getStateRefValue]; -} - -export default useStateCB; diff --git a/ui/utils/k8s-utils.js b/ui/utils/k8s-utils.js deleted file mode 100644 index f12e985646f..00000000000 --- a/ui/utils/k8s-utils.js +++ /dev/null @@ -1,254 +0,0 @@ -import _ from 'lodash'; -import humanizeDuration from 'humanize-duration'; - -const humanize = humanizeDuration.humanizer(); -humanize.languages['en-mini'] = { - y: () => 'y', - mo: () => 'mo', - w: () => 'w', - d: () => 'd', - h: () => 'h', - m: () => 'm', - s: () => 's', - ms: () => 'ms', -}; - -export const CLUSTER_ACTION_GRACE_PERIOD = 5000; // ms - -/** - * Show the time passed since the given date, in the desired format. - * - * @param date - The date since which to calculate the duration. - * @param options - `format` takes "brief" or "mini". "brief" rounds the date and uses the largest suitable unit (e.g. "4 weeks"). "mini" uses something like "4w" (for 4 weeks). - * @returns The formatted date. - */ -export function timeAgo(date, options = {}) { - const fromDate = new Date(date); - let now = new Date(); - - if (process.env.UNDER_TEST === 'true') { - // For testing, we consider the current moment to be 3 months from the dates we are testing. - const days = 24 * 3600 * 1000; // in ms - now = new Date(fromDate.getTime() + 90 * days); - } - - return formatDuration(now.getTime() - fromDate.getTime(), options); -} - -/** Format a duration in milliseconds to a human-readable string. - * - * @param duration - The duration in milliseconds. - * @param options - `format` takes "brief" or "mini". "brief" rounds the date and uses the largest suitable unit (e.g. "4 weeks"). "mini" uses something like "4w" (for 4 weeks). - * @returns The formatted duration. - * */ -export function formatDuration(duration, options) { - const { format = 'brief' } = options; - - if (format === 'brief') { - return humanize(duration, { - fallbacks: ['en'], - round: true, - largest: 1, - }); - } - - return humanize(duration, { - language: 'en-mini', - spacer: '', - fallbacks: ['en'], - round: true, - largest: 1, - }); -} - -export function getPercentStr(value, total) { - if (total === 0) { - return null; - } - const percentage = (value / total) * 100; - const decimals = percentage % 10 > 0 ? 1 : 0; - return `${percentage.toFixed(decimals)} %`; -} - -export function getReadyReplicas(item) { - return item.status.readyReplicas || item.status.numberReady || 0; -} - -export function getTotalReplicas(item) { - return item.spec.replicas || item.status.currentNumberScheduled || 0; -} - -// compareUnits compares two units and returns true if they are equal -export function compareUnits(quantity1, quantity2) { - // strip whitespace and convert to lowercase - const qty1 = quantity1.replace(/\s/g, '').toLowerCase(); - const qty2 = quantity2.replace(/\s/g, '').toLowerCase(); - - // compare numbers - return parseInt(qty1) === parseInt(qty2); -} - -export function normalizeUnit(resourceType, quantity) { - let type = resourceType; - - if (type.includes('.')) { - type = type.split('.')[1]; - } - - let normalizedQuantity = ''; - let bytes = 0; - switch (type) { - case 'cpu': - normalizedQuantity = quantity?.endsWith('m') - ? `${Number(quantity.substring(0, quantity.length - 1)) / 1000}` - : `${quantity}`; - if (normalizedQuantity === '1') { - normalizedQuantity = normalizedQuantity + ' ' + 'core'; - } else { - normalizedQuantity = normalizedQuantity + ' ' + 'cores'; - } - break; - - case 'memory': - /** - * Decimal: m | n | "" | k | M | G | T | P | E - * Binary: Ki | Mi | Gi | Ti | Pi | Ei - * Refer https://github.com/kubernetes-client/csharp/blob/840a90e24ef922adee0729e43859cf6b43567594/src/KubernetesClient.Models/ResourceQuantity.cs#L211 - */ - console.log('debug:', quantity, parseInt(quantity), quantity.endsWith('m')); - bytes = parseInt(quantity); - if (quantity.endsWith('Ki')) { - bytes *= 1024; - } else if (quantity.endsWith('Mi')) { - bytes *= 1024 * 1024; - } else if (quantity.endsWith('Gi')) { - bytes *= 1024 * 1024 * 1024; - } else if (quantity.endsWith('Ti')) { - bytes *= 1024 * 1024 * 1024 * 1024; - } else if (quantity.endsWith('Ei')) { - bytes *= 1024 * 1024 * 1024 * 1024 * 1024; - } else if (quantity.endsWith('m')) { - bytes /= 1000; - } else if (quantity.endsWith('u')) { - bytes /= 1000 * 1000; - } else if (quantity.endsWith('n')) { - bytes /= 1000 * 1000 * 1000; - } else if (quantity.endsWith('k')) { - bytes *= 1000; - } else if (quantity.endsWith('M')) { - bytes *= 1000 * 1000; - } else if (quantity.endsWith('G')) { - bytes *= 1000 * 1000 * 1000; - } else if (quantity.endsWith('T')) { - bytes *= 1000 * 1000 * 1000 * 1000; - } else if (quantity.endsWith('E')) { - bytes *= 1000 * 1000 * 1000 * 1000 * 1000; - } - - if (bytes === 0) { - normalizedQuantity = '0 Bytes'; - } else { - const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - const k = 1000; - const dm = 2; - const i = Math.floor(Math.log(bytes) / Math.log(k)); - console.debug('debug bytes:', bytes, i, sizes); - normalizedQuantity = parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; - } - break; - - default: - normalizedQuantity = quantity; - break; - } - return normalizedQuantity; -} - -const RAM_TYPES = ['Bi', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei']; -const UNITS = ['B', 'K', 'M', 'G', 'T', 'P', 'E']; - -export const TO_GB = 1024 * 1024 * 1024; -export const TO_ONE_M_CPU = 1000000; -export const TO_ONE_CPU = 1000000000; - -export function parseDiskSpace(value) { - return parseUnitsOfBytes(value); -} - -export function parseRam(value) { - return parseUnitsOfBytes(value); -} - -function parseUnitsOfBytes(value) { - if (!value) return 0; - - const groups = value.match(/(\d+)([BKMGTPEe])?(i)?(\d+)?/) || []; - const number = parseInt(groups[1], 10); - - // number ex. 1000 - if (groups[2] === undefined) { - return number; - } - - // number with exponent ex. 1e3 - if (groups[4] !== undefined) { - return number * 10 ** parseInt(groups[4], 10); - } - - const unitIndex = _.indexOf(UNITS, groups[2]); - - // Unit + i ex. 1Ki - if (groups[3] !== undefined) { - return number * 1024 ** unitIndex; - } - - // Unit ex. 1K - return number * 1000 ** unitIndex; -} - -export function unparseRam(value) { - let i = 0; - while (value >= 1024 && i < RAM_TYPES.length - 1) { - i++; - value /= 1024; // eslint-disable-line no-param-reassign - } - - return { - value: _.round(value, 1), - unit: RAM_TYPES[i], - }; -} - -export function parseCpu(value) { - if (!value) return 0; - - const number = parseInt(value, 10); - if (value.endsWith('n')) return number; - if (value.endsWith('u')) return number * 1000; - if (value.endsWith('m')) return number * 1000 * 1000; - return number * 1000 * 1000 * 1000; -} - -export function unparseCpu(value) { - const result = parseFloat(value); - - return { - value: _.round(result / 1000000, 2), - unit: 'm', - }; -} - -export const resourceParsers = { - cpu: parseCpu, - memory: parseRam, -}; - -export function getResourceStr(value, resourceType) { - const resourceFormatters = { - cpu: unparseCpu, - memory: unparseRam, - }; - - const valueInfo = resourceFormatters[resourceType](value); - return `${valueInfo.value}${valueInfo.unit}`; -} diff --git a/ui/utils/lightenOrDarkenColor.js b/ui/utils/lightenOrDarkenColor.js deleted file mode 100644 index 3508e767294..00000000000 --- a/ui/utils/lightenOrDarkenColor.js +++ /dev/null @@ -1,37 +0,0 @@ -export function pSBCr(color, percent) { - if (!color) { - return '#607d8b'; - } - - // handle color in Hex Format - if (color.startsWith('#')) { - let R = parseInt(color?.substring(1, 3), 16); - let G = parseInt(color?.substring(3, 5), 16); - let B = parseInt(color?.substring(5, 7), 16); - - return RGBBlender(R, G, B, percent); - } - - // handle color in RGB Format - const RGB = color.substring(3).replaceAll('(', '').replaceAll(')', '').split(','); - if (RGB.length >= 3) { - // rgb with opacity may have length == 4 - return RGBBlender(RGB[0], RGB[1], RGB[2], percent); - } -} - -function RGBBlender(R, G, B, percent) { - R = parseInt((R * (100 + percent)) / 100); - G = parseInt((G * (100 + percent)) / 100); - B = parseInt((B * (100 + percent)) / 100); - - R = R < 255 ? R : 255; - G = G < 255 ? G : 255; - B = B < 255 ? B : 255; - - let RR = R.toString(16).length == 1 ? '0' + R.toString(16) : R.toString(16); - let GG = G.toString(16).length == 1 ? '0' + G.toString(16) : G.toString(16); - let BB = B.toString(16).length == 1 ? '0' + B.toString(16) : B.toString(16); - - return '#' + RR + GG + BB; -} diff --git a/ui/utils/multi-ctx.js b/ui/utils/multi-ctx.js deleted file mode 100644 index bda62e4770a..00000000000 --- a/ui/utils/multi-ctx.js +++ /dev/null @@ -1,177 +0,0 @@ -/** - * A function to be used by the requests sent for the - * operations based on multi-context support - * - * @param {string} url The request URL - * @param {Array.} ctx The context Array - * @returns {string} The final query-parametrised URL - */ -export function ctxUrl(url, ctx) { - if (ctx?.length) { - const contextQuery = ctx.map((context) => `contexts=${context}`).join('&'); - return `${url}?${contextQuery}`; - } - return url; -} - -/** - * The function takes in all the context and returns - * their respective cluster IDs associated to them - * - * @param {Array.} selectedContexts - * @param {Array.} k8sconfig - * @returns - */ -export const getK8sClusterIdsFromCtxId = (selectedContexts, k8sconfig) => { - if (selectedContexts.length === 0) { - return []; - } - - if (selectedContexts.includes('all')) { - return k8sconfig.map((cfg) => cfg?.kubernetes_server_id); - } - const clusterIds = []; - selectedContexts.forEach((context) => { - const clusterId = k8sconfig.find((cfg) => cfg.id === context)?.kubernetes_server_id; - if (clusterId) { - clusterIds.push(clusterId); - } - }); - - return clusterIds; -}; - -/** - * - * @param {Array.} selectedK8sContexts - * @param {Array.} k8sConfig - * @returns {string} The context ID - */ -export function getFirstCtxIdFromSelectedCtxIds(selectedK8sContexts, k8sConfig) { - if (!selectedK8sContexts?.length) { - return ''; - } - - if (selectedK8sContexts?.includes('all')) { - return k8sConfig[0]?.id; - } - - return selectedK8sContexts[0]; -} - -/** - * Get the k8sConfigIds of K8sconfig - * @param {Array.} k8sConfig - * @returns - */ -export function getK8sConfigIdsFromK8sConfig(k8sConfig) { - if (!k8sConfig || !k8sConfig.length) { - return []; - } - - return k8sConfig.map((cfg) => cfg.id); -} - -export const getK8sClusterNamesFromCtxId = (selectedContexts, k8sconfig) => { - if (selectedContexts.length === 0) { - return []; - } - - if (selectedContexts.includes('all')) { - return ['all']; - } - - const clusterNames = []; - - selectedContexts.forEach((context) => { - const name = k8sconfig.find((cfg) => cfg.id === context)?.name; - if (name) { - clusterNames.push(name); - } - }); - - return clusterNames; -}; - -/** - * - * @param {string} clusterId Kubernetes Cluster ID - * @param {Array} k8sConfig Kubernetes config - * @returns {string} Kubernetes context - */ -export function getK8sContextFromClusterId(clusterId, k8sConfig) { - const cluster = k8sConfig.find((cfg) => cfg.kubernetes_server_id === clusterId); - if (!cluster) { - return {}; - } - return cluster; -} - -/** - * - * @param {string} clusterId Kubernetes Cluster ID - * @param {Array} k8sConfig Kubernetes config - * @returns {string} Kubernetes cluster name - */ -export function getClusterNameFromClusterId(clusterId, k8sConfig) { - const cluster = k8sConfig.find((cfg) => cfg.kubernetes_server_id === clusterId); - if (!cluster) { - return ''; - } - return cluster.name; -} - -/** - * - * @param {string} connectionId Kubernetes Connection ID - * @param {Array} k8sConfig Kubernetes config - * @returns {string} Kubernetes cluster name - */ -export function getClusterNameFromConnectionId(connId, k8sConfig) { - const cluster = k8sConfig.find((cfg) => cfg.connection_id === connId); - if (!cluster) { - return ''; - } - return cluster.name; -} - -/** - * - * @param {string} clusterId Kubernetes Cluster ID - * @param {Array} k8sConfig Kubernetes config - * @returns {string} Kubernetes connection ID - */ -export function getConnectionIdFromClusterId(clusterId, k8sConfig) { - const cluster = k8sConfig.find((cfg) => cfg.kubernetes_server_id === clusterId); - if (!cluster) { - return ''; - } - return cluster.connection_id; -} - -/** - * - * @param {string} ctxId Kubernetes context ID - * @param {Array} k8sConfig Kubernetes config - * @returns {string} Kubernetes cluster name - */ -export function getClusterNameFromCtxId(ctxId, k8sConfig) { - const cluster = k8sConfig.find((cfg) => cfg.id === ctxId); - if (!cluster) { - return ''; - } - return cluster.name; -} - -/** - * - * @param {Array} contextIDs Kubernetes context ids - * @param {Array} k8sConfig Kubernetes config - * @returns {Array} array of connection ID for given kubernetes contexts - */ -export function getConnectionIDsFromContextIds(contexts, k8sConfig) { - const filteredK8sConnfigs = k8sConfig.filter((config) => - contexts.some((context) => context == config.id), - ); - return filteredK8sConnfigs.map((config) => config.connection_id); -} diff --git a/ui/utils/nameMapper.js b/ui/utils/nameMapper.js deleted file mode 100644 index 1d95a2adf7c..00000000000 --- a/ui/utils/nameMapper.js +++ /dev/null @@ -1,53 +0,0 @@ -export const podNameMapper = (serviceMeshName, podName) => { - switch (serviceMeshName) { - case 'istio': - if (podName.includes('istio-galley')) return 'Istio Galley'; - if (podName.includes('istio-ingressgateway')) return 'Istio Ingress Gateway'; - if (podName.includes('istio-egressgateway')) return 'Istio Egress Gateway'; - if (podName.includes('istio-policy')) return 'Istio Policy'; - if (podName.includes('istio-citadel')) return 'Istio Citadel'; - if (podName.includes('istio-telemetry')) return 'Istio Telemetry'; - if (podName.includes('istio-pilot')) return 'Istio Pilot'; - if (podName.includes('istio-tracing')) return 'Istio Tracing'; - if (podName.includes('istio-sidecar-injector')) return 'Istio Sidecar Injector'; - break; - case 'kiali': - return 'Kiali'; - case 'grafana': - return 'Grafana'; - case 'prometheus': - return 'Prometheus'; - default: - break; - } - const podNameArr = podName.split('-'); - - if (Array.isArray(podNameArr)) { - const prettifiedPodName = podNameArr - .slice(0, -2) - .map((word) => word[0].toUpperCase() + word.substr(1)) - .join(' '); - - return prettifiedPodName; - } - return podName; -}; - -export const versionMapper = (versionName) => - versionName.charAt(0) === 'v' ? versionName : `v${versionName}`; - -export const TelemetryComps = { - GRAFANA: 'grafana', - PROMETHEUS: 'prometheus', -}; - -// maps objects to telemetry comp if name is one of "TelemetryComps" -export function isTelemetryComponent(name) { - const comps = Object.values(TelemetryComps); - for (const comp in comps) { - if (name?.toLowerCase().includes(comps[comp])) { - return comps[comp]; - } - } - return ''; -} diff --git a/ui/utils/normalizeURI.js b/ui/utils/normalizeURI.js deleted file mode 100644 index 76ff079f6f8..00000000000 --- a/ui/utils/normalizeURI.js +++ /dev/null @@ -1,14 +0,0 @@ -/** - * normalizeURI takes in a uri and adds "/" - * to the start of it if they they if it doesn't - * them already - * - * The goal is to be able to easily append the uris - * without concerning about the slashes - * @param {string} uri - * @returns {string} - */ -export default function normalizeURI(uri) { - if (!uri.startsWith('/')) return '/' + uri; - return uri; -} diff --git a/ui/utils/objects.js b/ui/utils/objects.js deleted file mode 100644 index 392e9f6db49..00000000000 --- a/ui/utils/objects.js +++ /dev/null @@ -1,49 +0,0 @@ -import _ from 'lodash'; - -export function isEmptyAtAllDepths(input) { - if (_.isArray(input)) { - // If the input is an array, check if all items are empty at all depths - return input.every(isEmptyAtAllDepths); - } else if (_.isObject(input)) { - // If the input is an object, check if all properties are empty at all depths - return _.every(input, isEmptyAtAllDepths); - } else { - // If the input is not an array or object, check if it's empty - return _.isEmpty(input); - } -} - -/** - * Finds the first nested object in a tree-like structure that satisfies a given condition. - * - * @param {Object} object - The root object to start the search. - * @param {Function} condition - A function that takes an object as an argument and returns a boolean indicating if the condition is met. - * @returns {Object|null} - The first object that satisfies the condition, or null if no matching object is found. - */ -export const findNestedObject = (object, condition) => { - const stack = [object]; - while (stack.length) { - const currentObject = stack.pop(); - if (condition(currentObject)) { - return currentObject; - } - if (_.isObject(currentObject) || _.isArray(currentObject)) { - if (_.isObject(currentObject) || _.isArray(currentObject)) { - const values = _.values(currentObject).filter((value) => value !== currentObject.models); - stack.push(...values); - } - } - } - return null; -}; -/** - * Accept object and removes empty properties from object. - **/ -export const filterEmptyFields = (data) => { - return Object.keys(data).reduce((acc, key) => { - if (data[key] !== undefined && data[key] !== '') { - acc[key] = data[key]; - } - return acc; - }, {}); -}; diff --git a/ui/utils/permission_constants.js b/ui/utils/permission_constants.js deleted file mode 100644 index 9128864f1f9..00000000000 --- a/ui/utils/permission_constants.js +++ /dev/null @@ -1,413 +0,0 @@ -/** - * Constants for Identity & Access Management Keys - * When add new key make sure that subject property matches with key function property - */ - -export const keys = { - VIEW_ALL_ORGANIZATIONS: { - subject: 'View All Organizations', - action: 'e996c998-a50f-4cb8-ae7b-f2f1b523c971', - }, - VIEW_PROFILE: { - subject: 'View Profile', - action: 'fa7de118-2d08-4b07-b9d7-3e0baead6d04', - }, - EDIT_ACCOUNT: { - subject: 'Edit Account', - action: 'f5e6bb39-c89a-4172-86f9-14a4a59792c1', - }, - VIEW_CREDENTIALS: { - subject: 'View Credentials', - action: '96759f76-4add-45f8-b4ef-d4ace5ab1bc4', - }, - CREATE_CREDENTIAL: { - subject: 'Create Credential', - action: '30023b1b-01a7-4613-8364-38d3487d1789', - }, - EDIT_CREDENTIAL: { - subject: 'Edit Credential', - action: 'e4cd5bb0-8afb-4b35-8716-0e2ead13c9b7', - }, - DELETE_CREDENTIAL: { - subject: 'Delete Credential', - action: 'cb09f530-aa87-4a18-b3d3-bbcc2d6ca1a6', - }, - VIEW_SESSIONS: { - subject: 'View Sessions', - action: '26cf042a-91db-4237-8644-4d617a0d49e1', - }, - LOGOUT_SESSION_FROM_A_SESSION: { - subject: 'Logout from a Session', - action: '177b928b-71ee-4ecd-a30b-3154ff4ba0d9', - }, - VIEW_TOKENS: { - subject: 'View Tokens', - action: '46d914bc-18c1-438f-aa74-fb78823aa25c', - }, - DOWNLOAD_TOKEN: { - subject: 'Download Token', - action: 'ee5fc23e-d629-4c7b-8169-27e526394e8b', - }, - CREATE_TOKEN: { - subject: 'Create Token', - action: '8aa0df56-57e8-44b7-9d6e-7df413048ed5', - }, - DELETE_TOKEN: { - subject: 'Delete Token', - action: 'ddba5064-ac3c-470e-b405-d2a0e99db477', - }, - VIEW_WORKSPACE: { - subject: 'View Workspace', - action: 'bc9379e8-dc18-4655-b53c-c641271c4ba3', - }, - CREATE_WORKSPACE: { - subject: 'Create Workspace', - action: 'eb42ac41-a883-465e-843c-d64e962a3a0e', - }, - DELETE_WORKSPACE: { - subject: 'Delete Workspace', - action: '09eb0507-2f14-4bc4-92c5-9e26a4efbd5e', - }, - EDIT_WORKSPACE: { - subject: 'Edit Workspace', - action: '4112230f-5d1e-4d30-9790-942ad5c1dc50', - }, - CONNECT_GOOGLE_ACCOUNT_TO_WORKSPACE: { - subject: 'Connect Google Account to Workspace', - action: '69179641-6c41-40d8-87a0-81dd99bcb396', - }, - CONNECT_GITHUB_ACCOUNT_TO_WORKSPACE: { - subject: 'Connect Github Account to Workspace', - action: '410b2d3c-8194-44d1-9f80-7b5fea689b4f', - }, - ASSIGN_TEAM_TO_WORKSPACE: { - subject: 'Assign team to workspace', - action: '6ab4263b-0bb3-492e-9878-6936a5b6312f', - }, - REMOVE_TEAM_FROM_WORKSPACE: { - subject: 'Remove team from workspace', - action: 'c4ed82f5-783d-4451-9b34-44f50cae71df', - }, - ASSIGN_ENVIRONMENT_TO_WORKSPACE: { - subject: 'Assign environment to workspace', - action: 'f421fc20-c14a-4282-b526-776c6cacfd99', - }, - REMOVE_ENVIRONMENT_FROM_WORKSPACE: { - subject: 'Remove environment from workspace', - action: 'd0657715-80fb-4b00-af27-b78bb0fa56df', - }, - VIEW_AUDIT: { - subject: 'View Audit', - action: '80bb9c66-0657-49ff-a064-667e9875bb3f', - }, - VIEW_PROJECTS: { - subject: 'View Projects', - action: '141a5f3d-b5e2-4f36-8f83-df7f73744ee1', - }, - VIEW_CONNECTIONS: { - subject: 'View Connections', - action: 'b35c9ce0-e787-4de6-8560-631007b0b947', - }, - VIEW_ENVIRONMENTS: { - subject: 'View Environment', - action: 'e3656bbc-fba2-483d-9996-34f8614cd21b', - }, - CREATE_ENVIRONMENT: { - subject: 'Create Environment', - action: 'a97b7f3b-3349-4a86-b917-2ce0b64a540b', - }, - EDIT_ENVIRONMENT: { - subject: 'Edit Environment', - action: '145ab6ed-b4b6-4e34-ada5-78dada250f89', - }, - DELETE_ENVIRONMENT: { - subject: 'Delete Environment', - action: '70747966-dfad-4523-93ce-bd7421258955', - }, - ASSIGN_CONNECTIONS_TO_ENVIRONMENT: { - subject: 'Assign Connections To Environment', - action: '52cbe0b8-9aa7-4605-8eed-aa37e595adbb', - }, - REMOVE_CONNECTIONS_FROM_ENVIRONMENT: { - subject: 'Remove Connections From Environment', - action: '65648682-e47f-43d7-a5ad-dc042803f951', - }, - VIEW_CATALOG: { - subject: 'View Catalog', - action: '0cd05106-36b6-4393-a08e-4222fc10c8de', - }, - VIEW_APPLICATIONS: { - subject: 'View Applications', - action: 'bfb200b6-0ba9-4783-95d4-eaf1c8fe004c', - }, - VIEW_DESIGNS: { - subject: 'View Designs', - action: '3798736d-1f5d-41b3-876f-f3f01453dd15', - }, - SHARE_DESIGN: { - subject: 'Share Design', - action: 'd9ae2b08-762f-418f-916f-43de736b53e2', - }, - CLONE_DESIGN: { - subject: 'Clone Design', - action: '94a12f80-3c45-4a1f-afb2-a68b909d0d7f', - }, - OPEN_IN_PLAYGROUND: { - subject: 'Open in Playground', // not seeded - action: 'c4d6c676-6e26-4b0c-9fdd-5eea1b780e98', - }, - VIEW_FILTERS: { - subject: 'View Filters', - action: 'df41c45f-7c73-49c2-a055-0584fdcec1c1', - }, - CREATE_NEW_DESIGN: { - subject: 'Create new design', - action: '14bd933e-83b7-464d-9a4d-d8c8eb9682ab', - }, - IMPORT_DESIGN: { - subject: 'Import Design', - action: 'cc040d21-3160-4a96-8efa-833487a234cd', - }, - PUBLISH_DESIGN: { - subject: 'Publish Design', - action: '9e66bdec-4177-42f9-8cec-d9eb52a12c38', - }, - UNPUBLISH_DESIGN: { - subject: 'Unpublish Design', - action: 'c1595c90-b85b-4ac7-b921-f08959926db3', - }, - VALIDATE_DESIGN: { - subject: 'Validate Design', - action: 'da5339dd-a4bc-4b91-8865-d8a703656516', - }, - DEPLOY_DESIGN: { - subject: 'Deploy Design', - action: '595b921a-ea1e-4611-83f0-503db0eeb94d', - }, - UNDEPLOY_DESIGN: { - subject: 'Undeploy Design', - action: '16b11ffa-7b92-4666-a0ff-191df9cd18b2', - }, - DETAILS_OF_DESIGN: { - subject: 'Details of design', - action: '10a03036-53a0-40b3-9f69-6daab852e434', - }, - EDIT_DESIGN: { - subject: 'Edit design', - action: '7f2b7084-4533-4824-b688-50cf35de7ef8', - }, - DELETE_A_DESIGN: { - subject: 'Delete a design', - action: 'f024fcf7-3c3d-4521-b83e-6d659353ca0e', - }, - EXPORT_DESIGN: { - subject: 'Export Design', - action: '9a783f51-3b4a-47a6-a02e-b0db9e78cd85', - }, - DOWNLOAD_A_DESIGN: { - subject: 'Download a design', - action: '64de96b7-60db-4aab-b311-afc64066b2c4', - }, - IMPORT_FILTER: { - subject: 'Import Filter', - action: 'cb79d7fb-19de-45fa-aaf5-0a0afc832bf8', - }, - PUBLISH_WASM_FILTER: { - subject: 'Publish WASM Filter', - action: '173d99b7-3820-4c0c-88b2-a8455bd7a6b5', - }, - UNPUBLISH_WASM_FILTER: { - subject: 'Unpublish WASM Filter', - action: '773f0a4d-ba04-40ed-9298-59ac8749804a', - }, - DOWNLOAD_A_WASM_FILTER: { - subject: 'Download a WASM filter', - action: '24325b2c-5e08-4ba8-809f-8a4a1bf91084', - }, - DETAILS_OF_WASM_FILTER: { - subject: 'Details of WASM Filter', - action: '86c457b5-b9ec-4223-af1f-30a5be67d69d', - }, - EDIT_WASM_FILTER: { - subject: 'Edit WASM filter', - action: '88cd144e-806e-472a-a31a-ef6d64643291', - }, - DELETE_WASM_FILTER: { - subject: 'Delete WASM Filter', - action: '9225d5a7-7255-49be-9233-daeabefae306', - }, - CLONE_WASM_FILTER: { - subject: 'Clone WASM Filter', - action: 'c84718ca-7479-4ad9-a2b7-a5784baa51fb', - }, - ADD_CLUSTER: { - subject: 'Add cluster', - action: 'fce15b20-78ac-42af-b79c-b8f19bdb0802', - }, - CHANGE_CONNECTION_STATE: { - subject: 'Change connection state', - action: '14ac9622-3170-4580-8403-ed7a584f90ef', - }, - FLUSH_MESHSYNC_DATA: { - subject: 'Flush Meshsync data', - action: '8dd4c54a-bccd-4fb3-a18c-269195653a91', - }, - REGISTER_DISCOVERED_MESHSYNC_RESOURCE: { - subject: 'Register discovered Meshsync resource', - action: '214ad6b1-df4d-44a6-8872-8ad1f751ef68', - }, - DELETE_A_CONNECTION: { - subject: 'Delete a connection', - action: '61afb8c2-cda6-4175-aad9-74ff87fed323', - }, - INSTALL_EXTENSION: { - subject: 'Install extension', - action: '24f41e98-7ce1-40c4-a82d-4ae0294d237d', - }, - UNINSTALL_EXTENSION: { - // not seeded - subject: 'Uninstall extension from Meshery', - action: 'd25e0950-bcd5-4f31-9d19-26c91d17d89b', - }, - VIEW_EXTENSIONS: { - subject: 'View Extensions', - action: 'c1330df4-1bbe-4d5d-8828-f4bd9ee989e5', - }, - VIEW_MESHERY_USER_PREFERENCES: { - subject: 'View Meshery User Preferences', - action: 'cdec6212-bbbf-4cab-b10d-76d12bee7e56', - }, - VIEW_SETTINGS: { - subject: 'View Settings', - action: 'fdc038e3-1fdf-403a-af8a-53c0de8d7820', - }, - CONNECT_ADAPTER: { - subject: 'Connect adapter', - action: 'c93bd211-1dac-42cc-9086-859288826d1b', - }, - CONNECT_METRICS: { - subject: 'Connect Metrics', - action: 'b0aee906-c549-445f-be0c-b98b04d47d09', - }, - VIEW_METRICS: { - subject: 'View Metrics', - action: '7fe36f60-fd0a-4fda-84e5-c64a04c3ad06', - }, - VIEW_REGISTRY: { - subject: 'View Registry', - action: 'cc069117-08cc-44e3-9c61-ae0eeca0bcf1', - }, - ADD_PERFORMANCE_PROFILE: { - subject: 'Add performace profile', - action: 'b2861578-c573-45fe-a95e-0356d56e1d1b', - }, - RUN_TEST: { - subject: 'Run test', - action: '06de2b07-b4f4-4701-b87f-d92ebb66ba42', - }, - VIEW_RESULTS: { - subject: 'View Results', - action: '0c757cc7-4038-4d9b-9b60-fa8d9fc9d27e', - }, - EDIT_PERFORMANCE_TEST: { - subject: 'Edit performance test', - action: '33aa5c47-a8aa-4ad5-9950-7c17042c001d', - }, - DELETE_PERFORMANCE_TEST: { - subject: 'Delete performance test', - action: '84aa9d3c-3d4b-4587-947d-ae17b2dcd5f5', - }, - VIEW_VIEWS: { - subject: 'View Views', - action: '4b3117e6-176c-4d9b-8e09-4278d2f48280', - }, - CREATE_VIEW: { - subject: 'Create View', - action: 'a7392c29-34af-4ee9-af1c-71e83876a8aa', - }, - DELETE_VIEW: { - subject: 'Delete View', - action: 'b2b9c027-0f39-4a26-b3ed-5b30aaf82060', - }, - EDIT_VIEW: { - subject: 'Edit View', - action: 'f2e04b59-42ee-4af6-b488-7bc7047fc01b', - }, - ASSIGN_VIEWS_TO_WORKSPACE: { - subject: 'Assign views to workspace', - action: '5a26b21b-bf15-4622-9681-d907fc5154fd', - }, - REMOVE_VIEWS_FROM_WORKSPACE: { - subject: 'Remove views from workspace', - action: '5b48eded-15d8-4c51-9ac4-b11097dbdd75', - }, - INVITE_COLLABORATORS_PUBLIC_DESIGNS: { - subject: 'Invite any Meshery Cloud user, or all Meshery users', - action: 'ccc4bc8d-f484-42b3-8a62-2667284605c3', - }, - INVITE_COLLABORATORS_PRIVATE_DESIGNS: { - subject: 'Invite any Meshery Cloud user to on a private design', - action: 'e28b851f-9a49-4ecf-a86e-493db1a27540', - }, - MESSAGE_IN_REAL_TIME: { - subject: 'Message in real-time', - action: 'c42d08b2-c3e0-47b6-9e47-cfb149c0a5af', - }, - DISCUSS_ANY_DESIGN_BY_LEAVING_REVIEW_COMMENTS: { - subject: 'Discuss any design by leaving review comments', - action: 'da5adf96-9fb5-49b2-a55e-dec9c9c4acba', - }, - MANAGE_ACCESS_TO_DESIGN: { - subject: 'Manage access to designs', - action: '7a17c8d3-bba2-474b-bb1e-be5b5eee5dad', - }, - CREATE_AND_COLLABORATE_IN_ONLINE_DESIGNS_IN_REAL_TIME: { - // seed new function name for this key - subject: 'Create and collaborate in online designs in real-time', - action: 'd5267c04-b3ee-43fe-8b97-2a3321eb7f8e', - }, - MANAGE_CLOUD_NATIVE_INFRASTRUCTURE_LIFE_CYCLE: { - subject: 'Manage cloud native infrastructure life cycle', - action: '255fd148-e3fd-4408-a48c-0d157a57d4d9', - }, - MANAGE_CLOUD_NATIVE_INFRASTRUCTURE_CONFIGURATION: { - subject: 'Manage cloud native infrastructure configuration', - action: '0eb0558d-9b21-4e50-b4c6-bd8e9e3414f5', - }, - APPLY_CLOUD_NATIVE_INFRASTRUCTURE_CONFIGURATION: { - subject: 'Apply cloud native infrastructure configuration', - action: '3f20a106-24f5-4da6-a8eb-6eddaad50944', - }, - VALIDATE_CLOUD_NATIVE_INFRASTRUCTURE_CONFIGURATION: { - subject: 'Validate cloud native infrastructure configuration', - action: '8bb93f97-fcfb-4827-9fed-f931fdca7b95', - }, - APPLY_CUSTOM_CLOUD_NATIVE_CONFIGURATION: { - subject: 'Apply custom cloud native configuration', - action: '2f4e2300-4c7e-4d48-95aa-74614a4826fe', - }, - DEPLOY_CLOUD_NATIVE_INFRASTRUCTURE: { - subject: 'Deploy cloud native infrastructure', - action: 'f7e70ffb-333d-43b3-a76e-0e6c63b9fbfa', - }, - UNDEPLOY_CLOUD_NATIVE_INFRASTRUCTURE: { - subject: 'Undeploy cloud native infrastructure', - action: '6e7f6f4f-4321-4e42-9eff-6a8323f32e84', - }, - VIEW_CLOUD_NATIVE_INFRASTRUCTURE: { - subject: 'View cloud native infrastructure', - action: 'fdc485dc-f68b-405c-9e54-7b9a7254c282', - }, - VIEW_ALL_KUBERNETES_CLUSTERS: { - subject: 'View All Kubernetes Clusters', - action: 'b99a9a0a-2cb9-4be7-8251-14a249e4038e', - }, - VIEW_PERFORMANCE_PROFILES: { - subject: 'View performance profiles', - action: '6593ac26-820b-4e87-be32-64ee740ea204', - }, - RESET_DATABASE: { - subject: 'Reset database', - action: '84fc402c-f33e-4a21-a0e3-e14f9e20b125', - }, -}; diff --git a/ui/utils/responsive-column.js b/ui/utils/responsive-column.js deleted file mode 100644 index 644afe78a27..00000000000 --- a/ui/utils/responsive-column.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * updateVisibleColumns Function - * - * Purpose: - * This function calculates which columns should be visible based on the provided screen sizes and the current screen width. - * - * Input: - * @param {Array} colViews - An array of column views, where each element is an array containing the column name and the screen size till which it should be visible. - * @param {number} width - The current screen width. - * - * Output: - * @returns {Object} - An object representing column visibility, where keys are column names, and values are booleans indicating visibility. - */ - -export const updateVisibleColumns = (colViews, width) => { - // Create a mapping of screen sizes to their minimum widths - const screenSizeMap = { - na: 0, - xs: 585, - s: 690, - m: 775, - l: 915, - xl: 1140, - }; - - // Determine the minimum width for visibility based on the provided screen size - const getMinWidthForScreenSize = (screenSize) => { - return screenSizeMap[screenSize] || 0; - }; - - // Initialize showCols as an empty object - const showCols = {}; - - colViews.forEach((col) => { - const [columnName, screenSize] = col; - const minScreenWidth = getMinWidthForScreenSize(screenSize); - - // Determine if the column should be visible based on screen width and rules - if (screenSize === 'na') { - showCols[columnName] = false; // "na" columns are not visible in any screen size - } else if (screenSize === 'xs') { - showCols[columnName] = true; // "xs" columns are visible in all screen sizes - } else { - // For other screen sizes, check if the screen width is greater than or equal to the minimum width - showCols[columnName] = width >= minScreenWidth; - } - }); - - return showCols; -}; diff --git a/ui/utils/theme.js b/ui/utils/theme.js deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/ui/utils/utils.js b/ui/utils/utils.js deleted file mode 100644 index 03b38b0a710..00000000000 --- a/ui/utils/utils.js +++ /dev/null @@ -1,445 +0,0 @@ -import { trueRandom } from '../lib/trueRandom'; -import jsYaml from 'js-yaml'; -import { findWorkloadByName } from './workloadFilter'; -import { EVENT_TYPES } from './Enum'; -import _ from 'lodash'; -import { getWebAdress } from './webApis'; -import { APPLICATION, DESIGN, FILTER } from '../constants/navigator'; -import { Tooltip } from '@mui/material'; -import jsyaml from 'js-yaml'; -import yaml from 'js-yaml'; - -/** - * Check if an object is empty - * - * @param {Object} obj - * - * @returns {Boolean} if obj is empty - */ -export function isEmptyObj(obj) { - return ( - !obj || - (obj && Object.keys(obj).length === 0 && Object.getPrototypeOf(obj) === Object.prototype) - ); -} - -/** - * Check if array is empty - * - * @param {Array} arr - * @returns {Boolean} if arr is empty - */ -export function isEmptyArr(arr) { - return arr && arr.length === 0; -} - -/** - * Check if two arrays are equal - * - * @param {Array} arr1 - * @param {Array} arr2 - * @param {Boolean} orderMatters - * @returns - */ -export function isEqualArr(arr1, arr2, orderMatters = true) { - if (arr1 === arr2) return true; - if (arr1 == null || arr2 == null) return false; - if (arr1.length !== arr2.length) return false; - - if (!orderMatters) { - arr1.sort(); - arr2.sort(); - } - - for (var i = 0; i < arr1.length; ++i) { - if (arr1[i] !== arr2[i]) return false; - } - return true; -} - -/** - * ScrollToTop scrolls the window to top - * - * @param {( - * "auto" - * |"smooth" - * |"inherit" - * |"initial" - * |"revert" - * |"unset" - * )} behavior : scroll-behaviour, see https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior - */ -export function scrollToTop(behavior = 'smooth') { - setTimeout(() => { - window.scrollTo({ - top: 0, - left: 0, - behavior, - }); - }, 0); -} - -/** - * Generates random Pattern Name with the prefix meshery_ - */ -export function randomPatternNameGenerator() { - return 'meshery_' + Math.floor(trueRandom() * 100); -} - -/** - * Returns number of components in Pattern/Application/Filters file - */ -export function getComponentsinFile(file) { - if (file) { - try { - let keys = Object.keys(jsYaml.load(file).services); - return keys.length; - } catch (e) { - if (e.reason?.includes('expected a single document')) { - return file.split('---').length; - } - } - } - return 0; -} - -export function generateValidatePayload(pattern_file, workloadTraitSet) { - let pattern = jsYaml.loadAll(pattern_file); - const services = pattern[0]?.services; - if (!services) { - return { err: 'Services not found in the design' }; - } - - const validationPayloads = {}; - - for (const serviceId in services) { - let valueType; - - let { workload } = findWorkloadByName(services[serviceId].type, workloadTraitSet); - - if (!(workload && workload?.oam_ref_schema)) { - continue; - } - const schema = workload.oam_ref_schema; - const value = services[serviceId]?.settings; - if (!value) { - continue; - } - valueType = 'JSON'; - const validationPayload = { - schema, - value: JSON.stringify(value), - valueType, - }; - validationPayloads[serviceId] = validationPayload; - } - - return validationPayloads; -} - -export function updateURLs(urlsSet, newUrls, eventType) { - switch (eventType) { - case EVENT_TYPES.DELETED: - newUrls.forEach((url) => { - urlsSet.delete(url); - }); - break; - case EVENT_TYPES.ADDED: - case EVENT_TYPES.MODIFIED: - newUrls.forEach((url) => { - urlsSet.add(url); - }); - } -} - -/** - * Gets the raw b64 file and convert it to Binary - * - * @param {string} file - * @returns - */ -export function getDecodedFile(dataUrl) { - // Extract base64-encoded content - const [, base64Content] = dataUrl.split(';base64,'); - - // Decode base64 content - return atob(base64Content); -} - -/** - * Gets the raw b64 file and convert it to uint8Array - * - * @param {string} file - * @returns {array} - return array of uint8Array - */ -export const getUnit8ArrayDecodedFile = (dataUrl) => { - // Extract base64 content - const [, base64Content] = dataUrl.split(';base64,'); - - // Decode base64 content - const decodedContent = atob(base64Content); - - // Convert decoded content to Uint8Array directly - const uint8Array = Uint8Array.from(decodedContent, (char) => char.charCodeAt(0)); - - return Array.from(uint8Array); -}; - -/** - * Gets the stringified meshery pattern_file and convert it to uint8Array - * @param {string} design - * @returns {array} - return array of uint8Array - * - * */ -export const getUnit8ArrayForDesign = (design) => { - const uint8Array = Uint8Array.from(design, (char) => char.charCodeAt(0)); - - return Array.from(uint8Array); -}; - -/** - * Change the value of a property in RJSF schema - * - * @param {string} schema - RJSF schema - * @param {string} propertyPath - path of the property to be modified - * @param {any} newValue - new value to be set - * @returns {object} - modified schema - */ -export const modifyRJSFSchema = (schema, propertyPath, newValue) => { - const clonedSchema = _.cloneDeep(schema); - _.set(clonedSchema, propertyPath, newValue); - return clonedSchema; -}; - -/** - * get sharable link with same and host and protocol, here until meshery cloud interception - * @param {Object.} sharedResource - * @returns {string} - */ -export function getSharableCommonHostAndprotocolLink(sharedResource) { - const webAddr = getWebAdress() + '/extension/meshmap'; - if (sharedResource?.application_file) { - return `${webAddr}?${APPLICATION}=${sharedResource.id}`; - } - if (sharedResource?.pattern_file) { - return `${webAddr}?${DESIGN}=${sharedResource.id}`; - } - if (sharedResource?.filter_resource) { - return `${webAddr}?${FILTER}=${sharedResource.id}`; - } - - return ''; -} - -/** - * Retrieves the value of a specified column from a row of data. - * - * @param {Array} rowData - The array representing the row of data. - * @param {string} columnName - The name of the column whose value you want to retrieve. - * @param {Array} columns - An array of column definitions. - * @returns {*} The value of the specified column in the row, or undefined if not found. - */ - -export const getColumnValue = (rowData, columnName, columns) => { - const columnIndex = columns.findIndex((column) => column.name === columnName); - return rowData[columnIndex]; -}; - -/** - * Filter the columns to show in visibility switch. - * - * @param {string} columns - Full list of columns name. - * - */ - -export const getVisibilityColums = (columns) => { - return columns.filter((col) => col?.options?.display !== false); -}; - -export function JsonParse(item, safe = true) { - if (typeof item === 'string') { - try { - return JSON.parse(item || '{}'); - } catch (e) { - if (safe) { - return {}; - } - throw e; - } - } - - return item; -} - -export const ConditionalTooltip = ({ value, maxLength, ...restProps }) => { - return value?.length > maxLength ? ( - -
- {`${value.slice(0, maxLength)}...`} -
-
- ) : ( -
- {value} -
- ); -}; - -/** - * Handle scroll event for infinite scrolling - * - * @param {string} scrollingView - The view identifier for which scrolling is handled - * @param {function} setPage - The function to set the page state - * @param {object} scrollRef - Reference to the scroll element - * @param {number} buffer - The buffer value for infinite scrolling - * @returns {function} - Scroll event handler function - */ -export const createScrollHandler = (scrollingView, setPage, scrollRef, buffer) => (event) => { - const div = event.target; - if (div.scrollTop >= div.scrollHeight - div.clientHeight - buffer) { - setPage((prevPage) => ({ - ...prevPage, - [scrollingView]: prevPage[scrollingView] + 1, - })); - } - - scrollRef.current = div.scrollTop; -}; - -/** - * - * Add underscore to camal case variable name. - * - * @param {string} value - An array of column definitions. - * - */ - -export const camelcaseToSnakecase = (value) => { - return value?.replace(/[A-Z]/g, (match) => `_${match.toLowerCase()}`); -}; - -export const formatToTitleCase = (value) => { - if (typeof value === 'string') { - return value.substring(0, 1).toUpperCase().concat('', value.substring(1).toLowerCase()); - } - return ''; -}; - -const cellStyle = { - boxSizing: 'border-box', - overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', -}; - -const customBodyRenderStyle = { - position: 'absolute', - top: 0, - right: 0, - bottom: 0, - left: 0, - boxSizing: 'border-box', - display: 'block', - width: '120%', -}; - -export const ResizableCell = ({ value }) => ( -
-
-
- - {value} - -
-
-
-); - -export const parseDesignFile = (designFile) => { - try { - return jsyaml.load(designFile); - } catch (e) { - console.error('Error parsing design file', e); - return null; - } -}; - -export const encodeDesignFile = (designJson) => { - try { - return jsyaml.dump(designJson); - } catch (e) { - console.error('Error encoding design file', e); - return null; - } -}; - -/** - * Process the design data to extract the components and design version - * @param {object} design - The design file of format design schema v1beta1 - */ -export const processDesign = (design) => { - console.log('Design to process', design); - if (design.schemaVersion != 'designs.meshery.io/v1beta1') { - console.error('Invalid design schema version', design); - return { - configurableComponents: [], - annotationComponents: [], - components: [], - designJson: { - name: '', - components: [], - }, - }; - } - - const isAnnotation = (component) => component?.metadata?.isAnnotation; - - const components = design.components; - const configurableComponents = components.filter(_.negate(isAnnotation)); - const annotationComponents = components.filter(isAnnotation); - - return { - configurableComponents, - annotationComponents, - components, - designJson: design, - }; -}; - -export const getComponentFromDesign = (design, componentId) => { - const component = design.components.find((component) => component.id === componentId); - return component; -}; - -/* - * Get the design version from the design file - * @param {object} design - The design resource - */ -export const getDesignVersion = (design) => { - if (design.visibility === 'published') { - return design.catalog_data.published_version; - } else { - try { - const parsedYaml = yaml.load(design.pattern_file); - return parsedYaml.version; - } catch (error) { - console.error('Version is not available for this design: ', error); - } - } -}; diff --git a/ui/utils/versionSort.js b/ui/utils/versionSort.js deleted file mode 100644 index 1039dd85b4c..00000000000 --- a/ui/utils/versionSort.js +++ /dev/null @@ -1,152 +0,0 @@ -import { compose } from 'lodash/fp'; -import { WILDCARD_V } from './hooks/useMeshModelComponents'; - -/** - * returns the API Version that should be used and is most stable - * Priority Order v1 > v1beta > v1alpha - * - * @param {Array.} versionList - */ -export default function getMostRecentVersion(versionList) { - if (!versionList) return; - - const stableList = []; - const alphaList = []; - const betaList = []; - - versionList.forEach((apiVersion) => { - const isStable = /^v[0-9]$/.test(apiVersion); // returns true if matches v1-v9 - const isAlpha = apiVersion.includes('alpha'); // returns true if matches alpha in string - const isBeta = apiVersion.includes('beta'); // returns true if matches beta in string - - isStable && stableList.push(apiVersion); - isAlpha && alphaList.push(apiVersion); - isBeta && betaList.push(apiVersion); - }); - - stableList.sort().reverse(); - alphaList.sort().reverse(); - betaList.sort().reverse(); - - // priority order: stable > beta > alpha - return stableList?.[0] || betaList?.[0] || alphaList?.[0] || versionList?.[0]; -} - -/** - * Sorts version in "INCREASING ORDER", apply reverse if wanted to sort in descreasing order - * - * @param {string} versionA - * @param {string} versionB - * @returns - */ -export function versionSortComparatorFn(versionA, versionB) { - if (!versionA || !versionB) { - return; - } - - if (versionA === WILDCARD_V || versionB === WILDCARD_V) { - // wildcard support - return -1; - } - - const verA = versionA.split('.'); - const verB = versionB.split('.'); - - for (let i = 0; i < verA.length && i < verB.length; i++) { - let vA = verA[i]; - let vB = verB[i]; - // index 0 is the start of the version, remove v if present for proper sorting - if (i == 0) { - vA = removeVFromVersion(vA); - vB = removeVFromVersion(vB); - } - // move to next comparison - if (vA - vB === 0) { - continue; - } - return vA - vB; - } -} - -function removeVFromVersion(version) { - if (!version) return; - if (version.startsWith('v')) { - return version.substring(1); - } - return version; -} - -/** - * usually when you sort the version by string, the version 10.0.0 < 2.0.0, because of string sort, - * ideally, it should be 10.0.0 > 2.0.0 - * - * [ "2.2.1", "2.10.11", "10.1.2", "10.1.1" ] using this comparator function returns [ '10.1.2', '10.1.1', '2.10.11', '2.2.1' ] - * @param {Array.} versions - * @returns Versions sorted in decreasing order - */ -export const sortByVersionInDecreasingOrder = (versions) => { - if (!versions) { - return; - } - - // add wildcard only in the case of multiple distinct versions - let wildCardV = []; - if (versions.length > 1) { - wildCardV = [WILDCARD_V]; - } - - return [...wildCardV, ...[...versions].sort(versionSortComparatorFn).reverse()]; -}; - -/** - * Get Greater version between the two versions passed - * - * @param {string} v1 - * @param {string} v2 - */ -export function getGreaterVersion(v1, v2) { - const comparatorResult = versionSortComparatorFn(v1, v2); - - if (comparatorResult >= 0) { - return v1; - } - - return v2; -} - -/* - MeshModel Specific -*/ - -/** - * - * @param {Array} models - * @returns {Array} the de-duplicated models array with all the versions available - */ -function groupModelsByVersion(models) { - if (!models) { - return []; - } - - let modelMap = {}; - models.forEach((model) => { - const modelMapCurr = modelMap[model.name]; - if (modelMapCurr) { - modelMap[model.name].version = [...new Set([...modelMapCurr.version, model.version])]; // remove duplicate entries for version - } else { - model.version = [model.version]; // the version is a string, to derive consistency the version is changed to array - modelMap[model.name] = model; - } - }); - - return Object.values(modelMap); -} - -function sortVersionsInModel(models) { - return [...models].map((model) => ({ - ...model, - version: sortByVersionInDecreasingOrder(model.version), - })); -} - -export const sortAndGroupVersionsInModel = compose(sortVersionsInModel, groupModelsByVersion); diff --git a/ui/utils/webApis.js b/ui/utils/webApis.js deleted file mode 100644 index ed694b79fc6..00000000000 --- a/ui/utils/webApis.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Finds the host on which Meshery is running, it could be - * localhost:{port} or an IP adress or a webadress - * @returns {string} application host - */ -function getHost() { - return window.location.host; -} - -/** - * The protocol used by the Meshery Application. - * It could be , "http:" or "https:" - * @returns {string} - */ -export function getProtocol() { - return window.location.protocol; -} - -/** - * - * @returns {string} base url on which Meshery is runnning, - * @example http://localhost:9081 - */ -export function getWebAdress() { - return getProtocol() + '//' + getHost(); -} - -/** - * get value from query param - * @example for "http://localhost:9081/extension/meshmap?componentInterface=meshmodel" , - * if called the function like getQueryParam("componentInterface"), then it will return "meshmodel" - * @param {string} queryKey - * @returns {string} queryVal - */ -export function getQueryParam(queryKey) { - let queryParamString = window.location.search; - queryParamString = queryParamString.replace('?', ''); - - let queryVal = ''; - - queryParamString.split('&').forEach((query) => { - if (query.split('=')[0] === queryKey) { - if (!queryVal) { - queryVal = query.split('=')[1]; - } - } - }); - - return queryVal; -} - -export function getRawUrlFromCssUrlString(url) { - if (!url) return; - - // turns url(http://localhost:9081/path/to/svg) to http://localhost:9081/path/to/svg - if (url.startsWith('url')) { - url = url.slice(4).slice(0, -1); - } - - // turns http://localhost:9081/path/to/svg to "/path/to/svg" - if (url.startsWith('http')) { - return url.split('//')?.[1]?.split('/')?.slice(1)?.join('/'); - } - - return url; -} diff --git a/ui/utils/workloadFilter.js b/ui/utils/workloadFilter.js deleted file mode 100644 index 924c90a4151..00000000000 --- a/ui/utils/workloadFilter.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Filter-workloads by versions - * - * @param {Object} meshfilteredWorkloads array of mesh-filtered-workloads - * - * @returns {Array.Array.} versioned and typed filtered workloads - */ -export function groupWorkloadByVersion(meshfilteredWorkloads) { - let versionedFilteredWorkloads = {}; - meshfilteredWorkloads.map((wtSet) => { - const version = - wtSet.workload?.oam_definition?.spec?.metadata?.meshVersion || - wtSet.workload.oam_definition?.spec?.metadata?.version || - 'Meshery'; - if (version) { - let versionedFilteredMesh = versionedFilteredWorkloads[version] || []; - versionedFilteredMesh.push(wtSet); - versionedFilteredWorkloads[version] = versionedFilteredMesh; - } - }); - - return versionedFilteredWorkloads; -} - -export function getUnformattedName(oamWorkloadOrTrait) { - return oamWorkloadOrTrait.workload.oam_definition?.metadata?.name || 'Un-Named'; -} - -export function findWorkloadByName(name, workloads) { - return workloads?.find((workload) => getUnformattedName(workload) == name); -} diff --git a/ui/utils/zIndex.js b/ui/utils/zIndex.js deleted file mode 100644 index e052aff5d5e..00000000000 --- a/ui/utils/zIndex.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * function used to calculate the zIndex - * @param {number} p - power of zIndex - directly proportional to `zIndex` (css property) value - * @returns {string} zIndex - */ -export const ziCalc = (p = 1) => { - if (p >= 1) { - // 1 is the least power for zIndex - let zIndex = ''; - for (let i = 0; i < p; i++) { - zIndex = zIndex + '9'; - } - return zIndex; - } - `0`; -};