From e675abcff99bbca7b1b5fefa2132f5e537dfe95f Mon Sep 17 00:00:00 2001 From: justin212407 Date: Sun, 10 May 2026 01:12:22 +0530 Subject: [PATCH 1/4] feat: Add Collector Home page Signed-off-by: justin212407 --- ecosystem-explorer/src/App.tsx | 20 +- .../collector/collector-components-page.tsx | 408 ++++++++++++++++ .../collector/collector-page.test.tsx | 208 +-------- .../src/features/collector/collector-page.tsx | 313 +------------ .../collector-explore-landing.test.tsx | 152 ++++++ .../components/collector-explore-landing.tsx | 440 ++++++++++++++++++ 6 files changed, 1031 insertions(+), 510 deletions(-) create mode 100644 ecosystem-explorer/src/features/collector/collector-components-page.tsx create mode 100644 ecosystem-explorer/src/features/collector/components/collector-explore-landing.test.tsx create mode 100644 ecosystem-explorer/src/features/collector/components/collector-explore-landing.tsx diff --git a/ecosystem-explorer/src/App.tsx b/ecosystem-explorer/src/App.tsx index 4e69f359..6af39cc0 100644 --- a/ecosystem-explorer/src/App.tsx +++ b/ecosystem-explorer/src/App.tsx @@ -25,8 +25,11 @@ const HomePage = lazy(() => const JavaAgentPage = lazy(() => import("@/features/java-agent/java-agent-page").then((m) => ({ default: m.JavaAgentPage })) ); -const CollectorPage = lazy(() => - import("@/features/collector/collector-page").then((m) => ({ default: m.CollectorPage })) +const CollectorPage = lazy(() => import("@/features/collector/collector-page")); +const CollectorComponentsPage = lazy(() => + import("@/features/collector/collector-components-page").then((m) => ({ + default: m.CollectorComponentsPage, + })) ); const CollectorDetailPage = lazy(() => import("@/features/collector/collector-detail-page").then((m) => ({ @@ -95,16 +98,9 @@ export default function App() { /> )} } /> - {isEnabled("COLLECTOR_PAGE") && ( - <> - } /> - } /> - } - /> - - )} + } /> + } /> + } /> } /> } /> diff --git a/ecosystem-explorer/src/features/collector/collector-components-page.tsx b/ecosystem-explorer/src/features/collector/collector-components-page.tsx new file mode 100644 index 00000000..07dca774 --- /dev/null +++ b/ecosystem-explorer/src/features/collector/collector-components-page.tsx @@ -0,0 +1,408 @@ +/* + * Copyright The OpenTelemetry Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { useMemo, useState } from "react"; +import { useParams, useNavigate, Link, useSearchParams } from "react-router-dom"; +import { + Search, + Loader2, + ChevronRight, + Box, + Layers, + Send, + Plug, + Workflow, + ChevronDown, + AlertCircle, +} from "lucide-react"; + +import { PageContainer } from "@/components/layout/page-container"; +import { GlowBadge } from "@/components/ui/glow-badge"; +import { DetailCard } from "@/components/ui/detail-card"; +import { useCollectorVersions, useCollectorComponents } from "@/hooks/use-collector-data"; + +type ComponentTypeFilter = + | "all" + | "receiver" + | "processor" + | "exporter" + | "extension" + | "connector"; +type DistributionFilter = "all" | "core" | "contrib"; + +function getTypeFilter(value: string | null): ComponentTypeFilter { + switch (value) { + case "receiver": + case "processor": + case "exporter": + case "extension": + case "connector": + return value; + default: + return "all"; + } +} + +function getDistributionFilter(value: string | null): DistributionFilter { + switch (value) { + case "core": + case "contrib": + return value; + default: + return "all"; + } +} + +const getIcon = (type: string) => { + switch (type) { + case "receiver": + return