diff --git a/src/components/Navigation/constants.ts b/src/components/Navigation/constants.ts index 19a7d13603..581af738b8 100644 --- a/src/components/Navigation/constants.ts +++ b/src/components/Navigation/constants.ts @@ -299,7 +299,7 @@ export const NAVIGATION_LIST: NavigationGroupType[] = [ dataTestId: 'observability-vms', id: 'observability-vms', icon: 'ic-cluster', - href: COMMON_URLS.OBSERVABILITY_LIST, + href: COMMON_URLS.OBSERVABILITY_CUSTOMER_LIST, }, ], }, diff --git a/src/components/common/navigation/NavigationRoutes.tsx b/src/components/common/navigation/NavigationRoutes.tsx index cbf810bbbd..4720926276 100644 --- a/src/components/common/navigation/NavigationRoutes.tsx +++ b/src/components/common/navigation/NavigationRoutes.tsx @@ -561,10 +561,7 @@ const NavigationRoutes = ({ reloadVersionConfig }: Readonly - + { + // ASYNC CALLS + const [isFetching, customerData] = useAsync(() => getCustomerListData(), []) + + // CONFIGS + const rows = useMemo( + () => + (customerData || []).map((data) => ({ + id: `observe_project_${data.id.toString()}`, + data, + })), + [customerData], + ) + + const filter: CustomerTableProps['filter'] = ( + rowData: { id: string; data: CustomerObservabilityDTO }, + filterData: { searchKey: string }, + ) => rowData.data.name.toLowerCase().includes(filterData.searchKey.toLowerCase()) + + return ( +
+ + id="table__customer-list" + loading={isFetching} + stylesConfig={{ showSeparatorBetweenRows: true }} + columns={CUSTOMER_TABLE_COLUMN} + rows={rows} + filtersVariant={FiltersTypeEnum.STATE} + emptyStateConfig={{ + noRowsConfig: { + title: 'No resources found', + subTitle: `No resources found in this cluster for upgrade compatibility check`, + }, + }} + filter={filter} + additionalFilterProps={{ + initialSortKey: 'name', + }} + paginationVariant={PaginationEnum.PAGINATED} + /> +
+ ) +} diff --git a/src/components/observability/CustomerListCellComponent.tsx b/src/components/observability/CustomerListCellComponent.tsx new file mode 100644 index 0000000000..3c73fb441c --- /dev/null +++ b/src/components/observability/CustomerListCellComponent.tsx @@ -0,0 +1,76 @@ +import { FunctionComponent, useEffect, useRef } from 'react' +import { Link, useRouteMatch } from 'react-router-dom' + +import { + FiltersTypeEnum, + getUrlWithSearchParams, + TableCellComponentProps, + TableSignalEnum, + Tooltip, +} from '@devtron-labs/devtron-fe-common-lib/dist' + +import { CustomerObservabilityDTO, ProjectListFields } from './types' + +export const CustomerListCellComponent: FunctionComponent< + TableCellComponentProps +> = ({ + field, + row: { + data: { id, name, status, project, totalVms, activeVms, healthStatus }, + }, + isRowActive, + signals, +}: TableCellComponentProps) => { + const linkRef = useRef(null) + + const match = useRouteMatch() + + useEffect(() => { + const handleEnter = ({ detail: { activeRowData } }) => { + if (activeRowData.data.id === id) { + linkRef.current?.click() + } + } + + if (isRowActive) { + signals.addEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) + } + + return () => { + signals.removeEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) + } + }, [isRowActive]) + + switch (field) { + case ProjectListFields.PROJECT_NAME: + return ( + + + {name} + + + ) + case ProjectListFields.STATUS: + return {status} + case ProjectListFields.PROJECTS: + return {project} + case ProjectListFields.TOTAL_VMS: + return {totalVms} + case ProjectListFields.ACTIVE_VMS: + return {activeVms} + case ProjectListFields.HEALTH_STATUS: + return ( +
+ + {healthStatus} + +
+ ) + default: + return null + } +} diff --git a/src/components/observability/Customers.tsx b/src/components/observability/Customers.tsx new file mode 100644 index 0000000000..7a82fefc21 --- /dev/null +++ b/src/components/observability/Customers.tsx @@ -0,0 +1,116 @@ +import { useEffect, useState } from 'react' + +import { + BreadCrumb, + BreadcrumbText, + ComponentSizeType, + handleUTCTime, + PageHeader, + SearchBar, + useBreadcrumb, +} from '@devtron-labs/devtron-fe-common-lib' + +import { CustomerList } from './CustomerList' +import ObservabilityIconComponent from './ObservabilityIcon' + +let interval +const Customers = () => { + const [lastDataSyncTimeString, setLastDataSyncTimeString] = useState('') + const [isDataSyncing, setDataSyncing] = useState(false) + const [syncListData, setSyncListData] = useState() + // TODO: Remove later + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [fetchingExternalApps, setFetchingExternalApps] = useState(false) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [selectedTabIndex, setSelectedTabIndex] = useState(0) + const renderDataSyncingText = () => Syncing + useEffect(() => { + if (isDataSyncing) { + setLastDataSyncTimeString(renderDataSyncingText) + } else { + const _lastDataSyncTime = Date() + setLastDataSyncTimeString(`Last synced ${handleUTCTime(_lastDataSyncTime, true)}`) + interval = setInterval(() => { + setLastDataSyncTimeString(`Last synced ${handleUTCTime(_lastDataSyncTime, true)}`) + }, 1000) + } + return () => { + if (interval) { + clearInterval(interval) + } + } + }, [isDataSyncing]) + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const updateDataSyncing = (loading: boolean): void => { + setDataSyncing(loading) + } + + const syncNow = (): void => { + setSyncListData(!syncListData) + } + + const renderLastSyncComponent = () => ( +
+ {lastDataSyncTimeString && ( + <> + {lastDataSyncTimeString} + {!isDataSyncing && ( + <> +   + + + )} + + )} + {fetchingExternalApps && renderDataSyncingText()} +
+ ) + + const { breadcrumbs } = useBreadcrumb({ + alias: { + observability: { + component: , + linked: true, + }, + customers: { + component: , + linked: false, + }, + }, + }) + const renderBreadcrumbs = () => + const searchKey = '' + const handleSearch = () => {} + return ( +
+ +
+
+ +
+ {renderLastSyncComponent()} +
+ +
+ ) +} + +export default Customers diff --git a/src/components/observability/ObservabilityRouter.tsx b/src/components/observability/ObservabilityRouter.tsx index d0bbd2d25b..4c8d660241 100644 --- a/src/components/observability/ObservabilityRouter.tsx +++ b/src/components/observability/ObservabilityRouter.tsx @@ -1,23 +1,30 @@ -import { Redirect, Route, Switch } from 'react-router-dom' +import { Redirect, Route, Switch, useRouteMatch } from 'react-router-dom' import { URLS } from '@devtron-labs/devtron-fe-common-lib' -import Project from './Project' -import VMList from './VMList' +import Project from './ProjectObservability/Project' +import Customers from './Customers' import { Overview } from './Overview' -const ObservabilityRouter: React.FC = () => ( - - - - +const ObservabilityRouter: React.FC = () => { + const { path } = useRouteMatch() + return ( + + + + - - - + + + - - -) + + + + + + + ) +} export default ObservabilityRouter diff --git a/src/components/observability/Project.tsx b/src/components/observability/Project.tsx deleted file mode 100644 index fe3198d913..0000000000 --- a/src/components/observability/Project.tsx +++ /dev/null @@ -1,188 +0,0 @@ -import { useState,useEffect } from "react" -import ProjectList from "./ProjectList" -import { BreadCrumb, BreadcrumbText, ComponentSizeType, handleUTCTime, PageHeader, SearchBar, SegmentedControl, SegmentedControlProps, TabGroup, TabProps, useBreadcrumb, useUrlFilters } from ".yalc/@devtron-labs/devtron-fe-common-lib/dist" -import { URLS } from "@Config/routes" -import ObservabilityIconComponent from "./ObservabilityIcon" -import ProjectOverview from "./ProjectOverview" -import './styles.scss' -import { TabDetailsSearchParams, TabDetailsSegment } from "./types" -import { parseChartDetailsSearchParams } from "./utils" -import { TAB_DETAILS_SEGMENTS } from "./constants" -let interval -const Project = () => { - const [lastDataSyncTimeString, setLastDataSyncTimeString] = useState('') - const [isDataSyncing, setDataSyncing] = useState(false) - const [syncListData, setSyncListData] = useState() - const [fetchingExternalApps, setFetchingExternalApps] = useState(false) - const [selectedTabIndex, setSelectedTabIndex] = useState(0) - const renderDataSyncingText = () => Syncing - useEffect(() => { - if (isDataSyncing) { - setLastDataSyncTimeString(renderDataSyncingText) - } else { - const _lastDataSyncTime = Date() - setLastDataSyncTimeString(`Last synced ${handleUTCTime(_lastDataSyncTime, true)}`) - interval = setInterval(() => { - setLastDataSyncTimeString(`Last synced ${handleUTCTime(_lastDataSyncTime, true)}`) - }, 1000) - } - return () => { - if (interval) { - clearInterval(interval) - } - } - }, [isDataSyncing]) - - const updateDataSyncing = (loading: boolean): void => { - setDataSyncing(loading) - } - const tabs: TabProps = [ - { - id: 'project_overview', - label: 'Overview', - tabType: 'button', - active: selectedTabIndex == 0, - props: { - onClick: () => { - setSelectedTabIndex(0) - }, - }, - }, - { - id: 'project_list', - label: 'Projects', - tabType: 'button', - active: selectedTabIndex == 1, - props: { - onClick: () => { - setSelectedTabIndex(1) - }, - }, - } - ] - - const syncNow = (): void => { - setSyncListData(!syncListData) - } - - const renderProjectOverview = () => { - return - } - - const renderProjectList = () => { - return - } - -const { tab, updateSearchParams } = useUrlFilters({ - parseSearchParams: parseChartDetailsSearchParams, - }) - - const handleSegmentChange: SegmentedControlProps['onChange'] = (selectedSegment) => { - const updatedTab = selectedSegment.value as TabDetailsSegment - - if (updatedTab === TabDetailsSegment.PROJECTS) { - renderProjectList() - } - - updateSearchParams({ tab: updatedTab }) - } - - const renderProjectTabs = () => { - const rightComponent = ( -
- {lastDataSyncTimeString && - <> - {lastDataSyncTimeString} - {!isDataSyncing && ( - <> -   - - - )} - - } - {fetchingExternalApps && renderDataSyncingText()} -
- ) - - const renderSegments = () => { - switch (tab) { - case TabDetailsSegment.OVERVIEW: - return ( - renderProjectOverview() - ) - case TabDetailsSegment.PROJECTS: - return renderProjectList() - default: - return null - } - } - - return ( -
-
-
- {/* */} - -
-
-
-
- {/* {selectedTabIndex == 0 && renderProjectOverview()} - {selectedTabIndex == 1 && renderProjectList()} */} - {renderSegments()} -
-
-
- ) - } - - const { breadcrumbs } = useBreadcrumb({ - alias: { - observability: { - component: , - linked: true, - }, - customer: { - component: , - linked: false, - }, - }, - }) - const renderBreadcrumbs = () => - const searchKey = "" - const handleSearch = () => {} - return ( -
- -
- -
- {renderProjectTabs()} -
- ) -} - -export default Project; \ No newline at end of file diff --git a/src/components/observability/ProjectList.tsx b/src/components/observability/ProjectList.tsx deleted file mode 100644 index 97410c1171..0000000000 --- a/src/components/observability/ProjectList.tsx +++ /dev/null @@ -1,182 +0,0 @@ -import { FiltersTypeEnum, numberComparatorBySortOrder, PaginationEnum, stringComparatorBySortOrder, Table, TableCellComponentProps, TableSignalEnum, Tooltip, useAsync } from ".yalc/@devtron-labs/devtron-fe-common-lib/dist"; -import { FunctionComponent, useEffect, useMemo, useRef } from "react"; -import { ObservabilityProject, ProjectListFields, ProjectTableProps } from "./types"; -import { Link } from "react-router-dom"; -import { getProjectList } from "./service"; - -const ProjectList = () => { - - // ASYNC CALLS - const [isFetching, projectData, isError, refetch] = useAsync( - () => getProjectList(), - [], - ) - - // CONFIGS - const rows = useMemo( - () => - (projectData || []).map((data) => ({ - id: `observe_project_${data.id.toString()}`, - data, - })), - [projectData], - ) - - const filter: ProjectTableProps['filter'] = (rowData, filterData) => - rowData.data.name.includes(filterData.searchKey.toLowerCase()) - - return <> -
- - id="table__customer-list" - loading={isFetching} - stylesConfig={{ showSeparatorBetweenRows: true }} - columns={PROJECT_TABLE_COLUMNS} - rows={rows} - filtersVariant={FiltersTypeEnum.STATE} - paginationVariant={PaginationEnum.NOT_PAGINATED} - emptyStateConfig={{ - noRowsConfig: { - title: 'No resources found', - subTitle: `No resources found in this cluster for upgrade compatibility check`, - }, - }} - filter={filter} - additionalFilterProps={{ - initialSortKey: 'name', - }} - /> -
- -} - -export default ProjectList; - -export const ProjectListCellComponent: FunctionComponent< - TableCellComponentProps -> = ({ - field, - row: { - data: { id, name, description, status, totalVms, activeVms, healthStatus }, - }, - isRowActive, - signals, -}: TableCellComponentProps) => { - const linkRef = useRef(null) - - useEffect(() => { - const handleEnter = ({ detail: { activeRowData } }) => { - if (activeRowData.data.id === id) { - linkRef.current?.click() - } - } - - if (isRowActive) { - signals.addEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) - } - - return () => { - signals.removeEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) - } - }, [isRowActive]) - - switch (field) { - case ProjectListFields.PROJECT_NAME: - return ( - - - {name} - - - ) - case ProjectListFields.PROJECT_DESCRIPTION: - return {description} - case ProjectListFields.PROJECT_STATUS: - return {status} - case ProjectListFields.TOTAL_VMS: - return {totalVms} - case ProjectListFields.ACTIVE_VMS: - return ( -
- - {activeVms} - -
- ) - case ProjectListFields.HEALTH_STATUS: - return ( -
- - {healthStatus} - -
- ) - default: - return null - } -} - -export const PROJECT_TABLE_COLUMNS: ProjectTableProps['columns'] = [ - { - field: 'name', - label: 'Project name', - size: { - fixed: 250, - }, - isSortable: true, - comparator: stringComparatorBySortOrder, - CellComponent: ProjectListCellComponent - }, - { - field: 'description', - label: 'Description', - size: { - fixed: 250, - }, - isSortable: true, - comparator: stringComparatorBySortOrder, - CellComponent: ProjectListCellComponent - }, - { - field: 'status', - label: 'Status', - size: { - fixed: 250, - }, - isSortable: true, - comparator: stringComparatorBySortOrder, - CellComponent: ProjectListCellComponent - }, - { - field: 'totalVms', - label: 'Total VM', - size: { - fixed: 200, - }, - isSortable: true, - comparator: numberComparatorBySortOrder, - CellComponent: ProjectListCellComponent - }, - { - field: 'activeVms', - label: 'Active VM', - size: { - fixed: 200, - }, - isSortable: true, - comparator: numberComparatorBySortOrder, - CellComponent: ProjectListCellComponent - }, - { - field: 'healthStatus', - label: 'Health Status', - size: { - fixed: 200, - }, - CellComponent: ProjectListCellComponent - } -] \ No newline at end of file diff --git a/src/components/observability/ProjectObservability/Project.tsx b/src/components/observability/ProjectObservability/Project.tsx new file mode 100644 index 0000000000..b3b3000a43 --- /dev/null +++ b/src/components/observability/ProjectObservability/Project.tsx @@ -0,0 +1,171 @@ +import { useEffect, useState } from 'react' +import { useRouteMatch } from 'react-router-dom' + +import { + BreadCrumb, + BreadcrumbText, + ComponentSizeType, + handleUTCTime, + PageHeader, + SearchBar, + TabGroup, + TabProps, + URLS, + useBreadcrumb, +} from '@devtron-labs/devtron-fe-common-lib' + +import ObservabilityIconComponent from '../ObservabilityIcon' +import ProjectList from './ProjectList' +import { ProjectOverview } from './ProjectOverview' + +let interval +const Project = () => { + const match = useRouteMatch() + + const [lastDataSyncTimeString, setLastDataSyncTimeString] = useState('') + const [isDataSyncing, setDataSyncing] = useState(false) + const [syncListData, setSyncListData] = useState() + // TODO: Remove later + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [fetchingExternalApps, setFetchingExternalApps] = useState(false) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const [selectedTabIndex, setSelectedTabIndex] = useState(0) + const renderDataSyncingText = () => Syncing + useEffect(() => { + if (isDataSyncing) { + setLastDataSyncTimeString(renderDataSyncingText) + } else { + const _lastDataSyncTime = Date() + setLastDataSyncTimeString(`Last synced ${handleUTCTime(_lastDataSyncTime, true)}`) + interval = setInterval(() => { + setLastDataSyncTimeString(`Last synced ${handleUTCTime(_lastDataSyncTime, true)}`) + }, 1000) + } + return () => { + if (interval) { + clearInterval(interval) + } + } + }, [isDataSyncing]) + + console.log(match) + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const updateDataSyncing = (loading: boolean): void => { + setDataSyncing(loading) + } + const tabs: TabProps[] = [ + { + id: 'project_overview', + label: 'Overview', + tabType: 'link', + active: selectedTabIndex === 0, + props: { + to: `${match.url}/${URLS.OBSERVABILITY_OVERVIEW}`, + // onClick: () => { + // setSelectedTabIndex(0) + // }, + }, + }, + { + id: 'project_list', + label: 'Projects', + tabType: 'link', + active: selectedTabIndex === 1, + props: { + to: `${match.url}/projects`, + // onClick: () => { + // setSelectedTabIndex(1) + // }, + }, + }, + ] + + const syncNow = (): void => { + setSyncListData(!syncListData) + } + + const rightComponent = ( +
+ {lastDataSyncTimeString && ( + <> + {lastDataSyncTimeString} + {!isDataSyncing && ( + <> +   + + + )} + + )} + {fetchingExternalApps && renderDataSyncingText()} +
+ ) + + const renderProjectTabs = () => { + const renderSegments = () => { + if (selectedTabIndex === 0) { + return + } + + return + } + + return ( +
+
+
+ +
+
+
+
{renderSegments()}
+
+
+ ) + } + + const { breadcrumbs } = useBreadcrumb({ + alias: { + observability: { + component: , + linked: true, + }, + customer: { + component: , + linked: false, + }, + }, + }) + const renderBreadcrumbs = () => + const searchKey = '' + const handleSearch = () => {} + return ( +
+ +
+ +
+ {renderProjectTabs()} +
+ ) +} + +export default Project diff --git a/src/components/observability/ProjectObservability/ProjectList.tsx b/src/components/observability/ProjectObservability/ProjectList.tsx new file mode 100644 index 0000000000..6a29b7153b --- /dev/null +++ b/src/components/observability/ProjectObservability/ProjectList.tsx @@ -0,0 +1,53 @@ +import { useMemo } from 'react' + +import { FiltersTypeEnum, PaginationEnum, Table, useAsync } from '@devtron-labs/devtron-fe-common-lib' + +import { PROJECT_TABLE_COLUMNS } from '../constants' +import { getProjectList } from '../service' +import { ObservabilityProject, ProjectTableProps } from '../types' + +const ProjectList = () => { + // ASYNC CALLS + const [isFetching, projectData] = useAsync(() => getProjectList(), []) + + // CONFIGS + const rows = useMemo( + () => + (projectData || []).map((data) => ({ + id: `observe_project_${data.id.toString()}`, + data, + })), + [projectData], + ) + + const filter: ProjectTableProps['filter'] = ( + rowData: { id: string; data: ObservabilityProject }, + filterData: { searchKey: string }, + ) => rowData.data.name.toLowerCase().includes(filterData.searchKey.toLowerCase()) + + return ( +
+ + id="table__customer-list" + loading={isFetching} + stylesConfig={{ showSeparatorBetweenRows: true }} + columns={PROJECT_TABLE_COLUMNS} + rows={rows} + filtersVariant={FiltersTypeEnum.STATE} + paginationVariant={PaginationEnum.NOT_PAGINATED} + emptyStateConfig={{ + noRowsConfig: { + title: 'No resources found', + subTitle: `No resources found in this cluster for upgrade compatibility check`, + }, + }} + filter={filter} + additionalFilterProps={{ + initialSortKey: 'name', + }} + /> +
+ ) +} + +export default ProjectList diff --git a/src/components/observability/ProjectObservability/ProjectListCellComponent.tsx b/src/components/observability/ProjectObservability/ProjectListCellComponent.tsx new file mode 100644 index 0000000000..98d7d90087 --- /dev/null +++ b/src/components/observability/ProjectObservability/ProjectListCellComponent.tsx @@ -0,0 +1,75 @@ +import { FunctionComponent, useEffect, useRef } from 'react' +import { Link } from 'react-router-dom' + +import { + FiltersTypeEnum, + TableCellComponentProps, + TableSignalEnum, + Tooltip, +} from '@devtron-labs/devtron-fe-common-lib/dist' + +import { ObservabilityProject, ProjectListFields } from '../types' + +export const ProjectListCellComponent: FunctionComponent< + TableCellComponentProps +> = ({ + field, + row: { + data: { id, name, description, status, totalVms, activeVms, healthStatus }, + }, + isRowActive, + signals, +}: TableCellComponentProps) => { + const linkRef = useRef(null) + + useEffect(() => { + const handleEnter = ({ detail: { activeRowData } }) => { + if (activeRowData.data.id === id) { + linkRef.current?.click() + } + } + + if (isRowActive) { + signals.addEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) + } + + return () => { + signals.removeEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) + } + }, [isRowActive]) + + switch (field) { + case ProjectListFields.PROJECT_NAME: + return ( + + + {name} + + + ) + case ProjectListFields.PROJECT_DESCRIPTION: + return {description} + case ProjectListFields.STATUS: + return {status} + case ProjectListFields.TOTAL_VMS: + return {totalVms} + case ProjectListFields.ACTIVE_VMS: + return ( +
+ + {activeVms} + +
+ ) + case ProjectListFields.HEALTH_STATUS: + return ( +
+ + {healthStatus} + +
+ ) + default: + return null + } +} diff --git a/src/components/observability/ProjectObservability/ProjectOverview.tsx b/src/components/observability/ProjectObservability/ProjectOverview.tsx new file mode 100644 index 0000000000..cbbf347952 --- /dev/null +++ b/src/components/observability/ProjectObservability/ProjectOverview.tsx @@ -0,0 +1,59 @@ +import { GenericSectionErrorState } from '@devtron-labs/devtron-fe-common-lib' + +import { MetricsInfoCard } from '../MetricsInfoCard' +import { GlanceMetricsKeys } from '../types' +import { MetricsInfoLoadingCard, useGetGlanceConfig } from '../utils' + +export const ProjectOverview = () => { + const { isFetching, data, isError, refetch } = useGetGlanceConfig() + console.log(data) + + const renderBody = () => { + if (isFetching) { + return ( +
+ {Object.keys(GlanceMetricsKeys).map((key) => ( + + ))} +
+ ) + } + + if (isError) { + return ( + + ) + } + // alert(JSON.stringify(data)) + return ( +
+ +
+ ) + } + + return ( +
+
+
+

At a Glance

+
+
+ {renderBody()} +
+ ) +} + +export default ProjectOverview diff --git a/src/components/observability/ProjectObservability/index.ts b/src/components/observability/ProjectObservability/index.ts new file mode 100644 index 0000000000..02e1b0e063 --- /dev/null +++ b/src/components/observability/ProjectObservability/index.ts @@ -0,0 +1 @@ +export { default as ProjectObservability } from './Project' diff --git a/src/components/observability/ProjectOverview.tsx b/src/components/observability/ProjectOverview.tsx deleted file mode 100644 index 861a2cf6e2..0000000000 --- a/src/components/observability/ProjectOverview.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { - BreadCrumb, - BreadcrumbText, - GenericSectionErrorState, - PageHeader, - useBreadcrumb, -} from '@devtron-labs/devtron-fe-common-lib' - -import ObservabilityIconComponent from './ObservabilityIcon' -import { GlanceMetricsKeys } from './types' -import { MetricsInfoLoadingCard, useGetGlanceConfig } from './utils' - -import './styles.scss' -import { MetricsInfoCard } from './MetricsInfoCard' - -export const ProjectOverview = () => { - const { isFetching, data, isError, refetch } = useGetGlanceConfig() - - const renderBody = () => { - if (isFetching) { - return ( -
- {Object.keys(GlanceMetricsKeys).map((key) => ( - - ))} -
- ) - } - - if (isError) { - return ( - - ) - } - // alert(JSON.stringify(data)) - return ( -
- -
- ) - } - - return ( -
-
-
-

At a Glance

-
-
- {renderBody()} -
- ) -} - - -export default ProjectOverview; \ No newline at end of file diff --git a/src/components/observability/VMList.tsx b/src/components/observability/VMList.tsx deleted file mode 100644 index aba1d9ffbb..0000000000 --- a/src/components/observability/VMList.tsx +++ /dev/null @@ -1,185 +0,0 @@ -import { FiltersTypeEnum, numberComparatorBySortOrder, PaginationEnum, stringComparatorBySortOrder, Table, TableCellComponentProps, TableSignalEnum, Tooltip, useAsync } from ".yalc/@devtron-labs/devtron-fe-common-lib/dist"; -import { FunctionComponent, useEffect, useMemo, useRef } from "react"; -import { ObservabilityVM, VMListFields, VMTableProps } from "./types"; -import { Link } from "react-router-dom"; -import { getVMList } from "./service"; - -const VMList = () => { - - // ASYNC CALLS - const [isFetching, vmData, isError, refetch] = useAsync( - () => getVMList(), - [], - ) - - // CONFIGS - const rows = useMemo( - () => - (vmData || []).map((data) => ({ - id: `observe_vm_${data.id.toString()}`, - data, - })), - [vmData], - ) - - const filter: VMTableProps['filter'] = (rowData, filterData) => - rowData.data.name.includes(filterData.searchKey.toLowerCase()) - - return ( - <> -
- - id="table__vm-list" - loading={isFetching} - stylesConfig={{ showSeparatorBetweenRows: true }} - columns={VM_TABLE_COLUMNS} - rows={rows} - filtersVariant={FiltersTypeEnum.STATE} - paginationVariant={PaginationEnum.NOT_PAGINATED} - emptyStateConfig={{ - noRowsConfig: { - title: 'No resources found', - subTitle: `No resources found in this cluster for upgrade compatibility check`, - }, - }} - filter={filter} - additionalFilterProps={{ - initialSortKey: 'name', - }} - /> -
- - ) -} - -export default VMList; - -export const VMListCellComponent: FunctionComponent< - TableCellComponentProps -> = ({ - field, - row: { - data: { id, name, ipAddress, status, cpu, memory, disk }, - }, - isRowActive, - signals, -}: TableCellComponentProps) => { - const linkRef = useRef(null) - - useEffect(() => { - const handleEnter = ({ detail: { activeRowData } }) => { - if (activeRowData.data.id === id) { - linkRef.current?.click() - } - } - - if (isRowActive) { - signals.addEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) - } - - return () => { - signals.removeEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) - } - }, [isRowActive]) - - switch (field) { - case VMListFields.VM_NAME: - return ( - - - {name} - - - ) - case VMListFields.VM_IPADDRESS: - return {ipAddress} - case VMListFields.VM_STATUS: - return {status} - case VMListFields.VM_CPU: - return {cpu} - case VMListFields.VM_MEMORY: - return ( -
- - {memory} - -
- ) - case VMListFields.VM_DISK: - return ( -
- - {disk} - -
- ) - default: - return null - } -} - -export const VM_TABLE_COLUMNS: VMTableProps['columns'] = [ - { - field: 'name', - label: 'VM name', - size: { - fixed: 250, - }, - isSortable: true, - comparator: stringComparatorBySortOrder, - CellComponent: VMListCellComponent - }, - { - field: 'status', - label: 'Status', - size: { - fixed: 250, - }, - isSortable: true, - comparator: stringComparatorBySortOrder, - CellComponent: VMListCellComponent - }, - { - field: 'ipAddress', - label: 'IP Address', - size: { - fixed: 250, - }, - isSortable: true, - comparator: stringComparatorBySortOrder, - CellComponent: VMListCellComponent - }, - { - field: 'cpu', - label: 'CPU', - size: { - fixed: 200, - }, - isSortable: true, - comparator: numberComparatorBySortOrder, - CellComponent: VMListCellComponent - }, - { - field: 'memory', - label: 'Memory', - size: { - fixed: 200, - }, - isSortable: true, - comparator: numberComparatorBySortOrder, - CellComponent: VMListCellComponent - }, - { - field: 'disk', - label: 'Disk', - size: { - fixed: 200, - }, - comparator: numberComparatorBySortOrder, - CellComponent: VMListCellComponent - } -] \ No newline at end of file diff --git a/src/components/observability/VM.tsx b/src/components/observability/VMObservability/VM.tsx similarity index 81% rename from src/components/observability/VM.tsx rename to src/components/observability/VMObservability/VM.tsx index d14d544554..ac78a2fa2d 100644 --- a/src/components/observability/VM.tsx +++ b/src/components/observability/VMObservability/VM.tsx @@ -1,14 +1,29 @@ -import { useState,useEffect } from "react" -import { BreadCrumb, BreadcrumbText, ComponentSizeType, handleUTCTime, PageHeader, SearchBar, TabGroup, TabProps, useBreadcrumb } from ".yalc/@devtron-labs/devtron-fe-common-lib/dist" -import ObservabilityIconComponent from "./ObservabilityIcon" -import './styles.scss' -import VMOverview from "./VMOverview" -import VMList from "./VMList" +import { useEffect, useState } from 'react' + +import { + BreadCrumb, + BreadcrumbText, + ComponentSizeType, + handleUTCTime, + PageHeader, + SearchBar, + TabGroup, + TabProps, + useBreadcrumb, +} from '@devtron-labs/devtron-fe-common-lib/dist' + +import ObservabilityIconComponent from '../ObservabilityIcon' +import VMList from './VMList' +import { VMOverview } from './VMOverview' + +import '../styles.scss' + let interval const VM = () => { const [lastDataSyncTimeString, setLastDataSyncTimeString] = useState('') const [isDataSyncing, setDataSyncing] = useState(false) const [syncListData, setSyncListData] = useState() + // eslint-disable-next-line @typescript-eslint/no-unused-vars const [fetchingExternalApps, setFetchingExternalApps] = useState(false) const [selectedTabIndex, setSelectedTabIndex] = useState(0) const renderDataSyncingText = () => Syncing @@ -28,16 +43,17 @@ const VM = () => { } } }, [isDataSyncing]) - + + // eslint-disable-next-line @typescript-eslint/no-unused-vars const updateDataSyncing = (loading: boolean): void => { setDataSyncing(loading) } - const tabs: TabProps = [ + const tabs: TabProps[] = [ { id: 'vm_overview', label: 'Overview', tabType: 'button', - active: selectedTabIndex == 0, + active: selectedTabIndex === 0, props: { onClick: () => { setSelectedTabIndex(0) @@ -48,31 +64,27 @@ const VM = () => { id: 'vm_list', label: 'VMs', tabType: 'button', - active: selectedTabIndex == 1, + active: selectedTabIndex === 1, props: { onClick: () => { setSelectedTabIndex(1) }, }, - } + }, ] - + const syncNow = (): void => { setSyncListData(!syncListData) } - const renderVMOverview = () => { - return - } + const renderVMOverview = () => - const renderVMList = () => { - return - } + const renderVMList = () => const renderVMTabs = () => { const rightComponent = (
- {lastDataSyncTimeString && + {lastDataSyncTimeString && ( <> {lastDataSyncTimeString} {!isDataSyncing && ( @@ -89,22 +101,22 @@ const VM = () => { )} - } + )} {fetchingExternalApps && renderDataSyncingText()}
) - + return (
- +
- {selectedTabIndex == 0 && renderVMOverview()} - {selectedTabIndex == 1 && renderVMList()} + {selectedTabIndex === 0 && renderVMOverview()} + {selectedTabIndex === 1 && renderVMList()}
@@ -124,7 +136,7 @@ const VM = () => { }, }) const renderBreadcrumbs = () => - const searchKey = "" + const searchKey = '' const handleSearch = () => {} return (
@@ -147,4 +159,4 @@ const VM = () => { ) } -export default VM; \ No newline at end of file +export default VM diff --git a/src/components/observability/VMObservability/VMList.tsx b/src/components/observability/VMObservability/VMList.tsx new file mode 100644 index 0000000000..b00d730403 --- /dev/null +++ b/src/components/observability/VMObservability/VMList.tsx @@ -0,0 +1,51 @@ +import { useMemo } from 'react' + +import { FiltersTypeEnum, PaginationEnum, Table, useAsync } from '@devtron-labs/devtron-fe-common-lib' + +import { VM_TABLE_COLUMNS } from '../constants' +import { getVMList } from '../service' +import { ObservabilityVM, VMTableProps } from '../types' + +const VMList = () => { + // ASYNC CALLS + const [isFetching, vmData] = useAsync(() => getVMList(), []) + + // CONFIGS + const rows = useMemo( + () => + (vmData || []).map((data) => ({ + id: `observe_vm_${data.id.toString()}`, + data, + })), + [vmData], + ) + + const filter: VMTableProps['filter'] = (rowData, filterData) => + rowData.data.name.includes(filterData.searchKey.toLowerCase()) + + return ( +
+ + id="table__vm-list" + loading={isFetching} + stylesConfig={{ showSeparatorBetweenRows: true }} + columns={VM_TABLE_COLUMNS} + rows={rows} + filtersVariant={FiltersTypeEnum.STATE} + paginationVariant={PaginationEnum.NOT_PAGINATED} + emptyStateConfig={{ + noRowsConfig: { + title: 'No resources found', + subTitle: `No resources found in this cluster for upgrade compatibility check`, + }, + }} + filter={filter} + additionalFilterProps={{ + initialSortKey: 'name', + }} + /> +
+ ) +} + +export default VMList diff --git a/src/components/observability/VMObservability/VMListCellComponent.tsx b/src/components/observability/VMObservability/VMListCellComponent.tsx new file mode 100644 index 0000000000..1fc53cef30 --- /dev/null +++ b/src/components/observability/VMObservability/VMListCellComponent.tsx @@ -0,0 +1,75 @@ +import { FunctionComponent, useEffect, useRef } from 'react' +import { Link } from 'react-router-dom' + +import { + FiltersTypeEnum, + TableCellComponentProps, + TableSignalEnum, + Tooltip, +} from '@devtron-labs/devtron-fe-common-lib/dist' + +import { ObservabilityVM, VMListFields } from '../types' + +export const VMListCellComponent: FunctionComponent< + TableCellComponentProps +> = ({ + field, + row: { + data: { id, name, ipAddress, status, cpu, memory, disk }, + }, + isRowActive, + signals, +}: TableCellComponentProps) => { + const linkRef = useRef(null) + + useEffect(() => { + const handleEnter = ({ detail: { activeRowData } }) => { + if (activeRowData.data.id === id) { + linkRef.current?.click() + } + } + + if (isRowActive) { + signals.addEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) + } + + return () => { + signals.removeEventListener(TableSignalEnum.ENTER_PRESSED, handleEnter) + } + }, [isRowActive]) + + switch (field) { + case VMListFields.VM_NAME: + return ( + + + {name} + + + ) + case VMListFields.VM_IPADDRESS: + return {ipAddress} + case VMListFields.VM_STATUS: + return {status} + case VMListFields.VM_CPU: + return {cpu} + case VMListFields.VM_MEMORY: + return ( +
+ + {memory} + +
+ ) + case VMListFields.VM_DISK: + return ( +
+ + {disk} + +
+ ) + default: + return null + } +} diff --git a/src/components/observability/VMObservability/VMOverview.tsx b/src/components/observability/VMObservability/VMOverview.tsx new file mode 100644 index 0000000000..2727eaccf1 --- /dev/null +++ b/src/components/observability/VMObservability/VMOverview.tsx @@ -0,0 +1,61 @@ +import { GenericSectionErrorState } from '@devtron-labs/devtron-fe-common-lib' + +import { MetricsInfoCard } from '../MetricsInfoCard' +// import ObservabilityIconComponent from './ObservabilityIcon' +import { GlanceMetricsKeys } from '../types' +import { MetricsInfoLoadingCard, useGetGlanceConfig } from '../utils' + +import '../styles.scss' + +export const VMOverview = () => { + const { isFetching, isError, refetch } = useGetGlanceConfig() + + const renderBody = () => { + if (isFetching) { + return ( +
+ {Object.keys(GlanceMetricsKeys).map((key) => ( + + ))} +
+ ) + } + + if (isError) { + return ( + + ) + } + // alert(JSON.stringify(data)) + return ( +
+ +
+ ) + } + + return ( +
+
+
+

At a Glance

+
+
+ {renderBody()} +
+ ) +} + +export default VMOverview diff --git a/src/components/observability/VMObservability/index.ts b/src/components/observability/VMObservability/index.ts new file mode 100644 index 0000000000..3a44bfda27 --- /dev/null +++ b/src/components/observability/VMObservability/index.ts @@ -0,0 +1 @@ +export { default as VMObservability } from './VM' diff --git a/src/components/observability/VMOverview.tsx b/src/components/observability/VMOverview.tsx deleted file mode 100644 index 3d85d1894b..0000000000 --- a/src/components/observability/VMOverview.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import { - BreadCrumb, - BreadcrumbText, - GenericSectionErrorState, - PageHeader, - useBreadcrumb, -} from '@devtron-labs/devtron-fe-common-lib' - -import ObservabilityIconComponent from './ObservabilityIcon' -import { GlanceMetricsKeys } from './types' -import { MetricsInfoLoadingCard, useGetGlanceConfig } from './utils' - -import './styles.scss' -import { MetricsInfoCard } from './MetricsInfoCard' - -export const VMOverview = () => { - const { isFetching, data, isError, refetch } = useGetGlanceConfig() - - const renderBody = () => { - if (isFetching) { - return ( -
- {Object.keys(GlanceMetricsKeys).map((key) => ( - - ))} -
- ) - } - - if (isError) { - return ( - - ) - } - // alert(JSON.stringify(data)) - return ( -
- -
- ) - } - - return ( -
-
-
-

At a Glance

-
-
- {renderBody()} -
- ) -} - - -export default VMOverview; \ No newline at end of file diff --git a/src/components/observability/constants.ts b/src/components/observability/constants.ts index f0a1892809..73b3a461eb 100644 --- a/src/components/observability/constants.ts +++ b/src/components/observability/constants.ts @@ -1,5 +1,14 @@ -import { IconName, SegmentedControlProps } from '@devtron-labs/devtron-fe-common-lib' -import { TabDetailsSegment } from './types' +import { + IconName, + numberComparatorBySortOrder, + SegmentedControlProps, + stringComparatorBySortOrder, +} from '@devtron-labs/devtron-fe-common-lib' + +import { ProjectListCellComponent } from './ProjectObservability/ProjectListCellComponent' +import { VMListCellComponent } from './VMObservability/VMListCellComponent' +import { CustomerListCellComponent } from './CustomerListCellComponent' +import { CustomerTableProps, ProjectTableProps, TabDetailsSegment, VMTableProps } from './types' export enum GlanceMetricKeys { PROJECTS = 'projects', @@ -40,5 +49,201 @@ export const TAB_DETAILS_SEGMENTS: SegmentedControlProps['segments'] = [ { label: 'Projects', value: TabDetailsSegment.PROJECTS, - } + }, +] + +export const CUSTOMER_TABLE_COLUMN: CustomerTableProps['columns'] = [ + { + field: 'icon', + size: { + fixed: 24, + }, + CellComponent: CustomerListCellComponent, + }, + { + field: 'name', + label: 'Customer', + size: { + fixed: 250, + }, + CellComponent: CustomerListCellComponent, + isSortable: true, + comparator: stringComparatorBySortOrder, + } as CustomerTableProps['columns'][0], + { + field: 'status', + label: 'Status', + size: { + fixed: 250, + }, + CellComponent: CustomerListCellComponent, + isSortable: true, + comparator: stringComparatorBySortOrder, + }, + { + field: 'project', + label: 'Projects', + size: { + fixed: 250, + }, + CellComponent: CustomerListCellComponent, + isSortable: true, + comparator: numberComparatorBySortOrder, + }, + { + field: 'totalVms', + label: 'Total VMs', + size: { + fixed: 150, + }, + CellComponent: CustomerListCellComponent, + isSortable: true, + comparator: numberComparatorBySortOrder, + }, + + { + field: 'activeVms', + label: 'Active VMs', + size: { + fixed: 150, + }, + CellComponent: CustomerListCellComponent, + isSortable: true, + comparator: numberComparatorBySortOrder, + }, + + { + field: 'healthStatus', + label: 'Health', + size: { + fixed: 250, + }, + CellComponent: CustomerListCellComponent, + isSortable: true, + comparator: stringComparatorBySortOrder, + }, +] + +export const PROJECT_TABLE_COLUMNS: ProjectTableProps['columns'] = [ + { + field: 'name', + label: 'Project name', + size: { + fixed: 250, + }, + isSortable: true, + comparator: stringComparatorBySortOrder, + CellComponent: ProjectListCellComponent, + }, + { + field: 'description', + label: 'Description', + size: { + fixed: 250, + }, + isSortable: true, + comparator: stringComparatorBySortOrder, + CellComponent: ProjectListCellComponent, + }, + { + field: 'status', + label: 'Status', + size: { + fixed: 250, + }, + isSortable: true, + comparator: stringComparatorBySortOrder, + CellComponent: ProjectListCellComponent, + }, + { + field: 'totalVms', + label: 'Total VM', + size: { + fixed: 200, + }, + isSortable: true, + comparator: numberComparatorBySortOrder, + CellComponent: ProjectListCellComponent, + }, + { + field: 'activeVms', + label: 'Active VM', + size: { + fixed: 200, + }, + isSortable: true, + comparator: numberComparatorBySortOrder, + CellComponent: ProjectListCellComponent, + }, + { + field: 'healthStatus', + label: 'Health Status', + size: { + fixed: 200, + }, + CellComponent: ProjectListCellComponent, + }, +] + +export const VM_TABLE_COLUMNS: VMTableProps['columns'] = [ + { + field: 'name', + label: 'VM name', + size: { + fixed: 250, + }, + isSortable: true, + comparator: stringComparatorBySortOrder, + CellComponent: VMListCellComponent, + }, + { + field: 'status', + label: 'Status', + size: { + fixed: 250, + }, + isSortable: true, + comparator: stringComparatorBySortOrder, + CellComponent: VMListCellComponent, + }, + { + field: 'ipAddress', + label: 'IP Address', + size: { + fixed: 250, + }, + isSortable: true, + comparator: stringComparatorBySortOrder, + CellComponent: VMListCellComponent, + }, + { + field: 'cpu', + label: 'CPU', + size: { + fixed: 200, + }, + isSortable: true, + comparator: numberComparatorBySortOrder, + CellComponent: VMListCellComponent, + }, + { + field: 'memory', + label: 'Memory', + size: { + fixed: 200, + }, + isSortable: true, + comparator: numberComparatorBySortOrder, + CellComponent: VMListCellComponent, + }, + { + field: 'disk', + label: 'Disk', + size: { + fixed: 200, + }, + isSortable: true, + comparator: numberComparatorBySortOrder, + CellComponent: VMListCellComponent, + }, ] diff --git a/src/components/observability/service.ts b/src/components/observability/service.ts index b5a8de4d1c..1f828eff58 100644 --- a/src/components/observability/service.ts +++ b/src/components/observability/service.ts @@ -1,3 +1,5 @@ +import { CustomerObservabilityDTO } from './types' + export const getObservabilityData: () => Promise = () => Promise.resolve({ totalClusters: 10, @@ -7,71 +9,95 @@ export const getObservabilityData: () => Promise = () => healthStatus: 50, }) - export const getProjectList: () => Promise = () => - Promise.resolve([{ - id: 1, - name: 'Project-1', - description: "Description of Project-1", - status: 'Active', - totalVms: 40, - activeVms: 50, - healthStatus: '80%' - }, - { - id: 2, - name: 'Project-2', - description: "Description of Project-2", - status: 'Active', - totalVms: 40, - activeVms: 50, - healthStatus: '80%' - }, - { - id: 3, - name: 'Project-3', - description: "Description of Project-3", - status: 'Active', - totalVms: 40, - activeVms: 50, - healthStatus: '80%' - }, - { - id: 4, - name: 'Project-4', - description: "Description of Project-4", - status: 'Active', - totalVms: 40, - activeVms: 50, - healthStatus: '80%' - }, - { - id: 5, - name: 'Project-5', - description: "Description of Project-5", - status: 'Active', - totalVms: 40, - activeVms: 50, - healthStatus: '80%' - }, +export const getProjectList: () => Promise = () => + Promise.resolve([ + { + id: 1, + name: 'Project-1', + description: 'Description of Project-1', + status: 'Active', + totalVms: 40, + activeVms: 50, + healthStatus: '80%', + }, + { + id: 2, + name: 'Project-2', + description: 'Description of Project-2', + status: 'Active', + totalVms: 40, + activeVms: 50, + healthStatus: '80%', + }, + { + id: 3, + name: 'Project-3', + description: 'Description of Project-3', + status: 'Active', + totalVms: 40, + activeVms: 50, + healthStatus: '80%', + }, + { + id: 4, + name: 'Project-4', + description: 'Description of Project-4', + status: 'Active', + totalVms: 40, + activeVms: 50, + healthStatus: '80%', + }, + { + id: 5, + name: 'Project-5', + description: 'Description of Project-5', + status: 'Active', + totalVms: 40, + activeVms: 50, + healthStatus: '80%', + }, + ]) + +export const getVMList: () => Promise = () => + Promise.resolve([ + { + id: 1, + name: 'PIS-Web-Server-01', + ipAddress: '192.168.1.101', + status: 'running', + cpu: 40, + memory: 50, + disk: 80, + }, + { + id: 2, + name: 'PIS-DB-Server-01', + ipAddress: '192.168.1.102', + status: 'running', + cpu: 40, + memory: 50, + disk: 80, + }, ]) - export const getVMList: () => Promise = () => - Promise.resolve([{ - id: 1, - name: 'PIS-Web-Server-01', - ipAddress: "192.168.1.101", - status: 'running', - cpu: 40, - memory: 50, - disk: 80 - }, - { - id: 2, - name: 'PIS-DB-Server-01', - ipAddress: "192.168.1.102", - status: 'running', - cpu: 40, - memory: 50, - disk: 80 - }, - ]) \ No newline at end of file +export const getCustomerListData: () => Promise = () => + Promise.resolve([ + { + id: 1, + name: 'Customer1', + status: 'ACTIVE', + project: 2, + totalVms: 14, + healthStatus: '80%', + activeVms: 2, + }, + { + id: 2, + name: 'Customer2', + status: 'INACTIVE', + project: 34, + totalVms: 4, + healthStatus: '20%', + activeVms: 1, + }, + ]) diff --git a/src/components/observability/styles.scss b/src/components/observability/styles.scss index a569c3f908..a87e223ec5 100644 --- a/src/components/observability/styles.scss +++ b/src/components/observability/styles.scss @@ -10,17 +10,18 @@ grid-template-columns: 150px 1fr 1fr; } - .at-a-glance { - grid-template-columns: 1fr 1fr 1fr; - } + .at-a-glance { + grid-template-columns: 1fr 1fr 1fr; + } } .observability-table-wrapper { + // Apply to every first child up to 4 levels deep > :first-child, - > :first-child > :first-child, - > :first-child > :first-child > :first-child, - > :first-child > :first-child > :first-child > :first-child { + > :first-child> :first-child, + > :first-child> :first-child> :first-child, + > :first-child> :first-child> :first-child> :first-child { overflow: visible !important; } } diff --git a/src/components/observability/types.ts b/src/components/observability/types.ts index 86a35d87d8..f2cadb3a62 100644 --- a/src/components/observability/types.ts +++ b/src/components/observability/types.ts @@ -1,4 +1,4 @@ -import { FiltersTypeEnum, TableProps } from ".yalc/@devtron-labs/devtron-fe-common-lib/dist" +import { FiltersTypeEnum, TableProps } from '.yalc/@devtron-labs/devtron-fe-common-lib/dist' export enum GlanceMetricsKeys { REACHABLE_CUSTOMERS = 'customers', @@ -7,49 +7,51 @@ export enum GlanceMetricsKeys { HEALTH_STATUS = 'healthStatus', } +export type ObservabilityStatus = 'ACTIVE' | 'INACTIVE' -export interface ObservabilityProject { - id: string, - name: string, - description: string, - status: string, - totalVms: number, - activeVms: number, +export interface BaseObservability { + id: number + name: string + status: ObservabilityStatus +} + +export interface CustomerObservabilityDTO extends BaseObservability { + project: number + totalVms: number + activeVms: number healthStatus: string } -export type ProjectTableProps = TableProps< - ObservabilityProject, - FiltersTypeEnum.STATE, - {} -> +export type CustomerTableProps = TableProps + +export interface ObservabilityProject + extends BaseObservability, + Pick { + description: string +} + +export type ProjectTableProps = TableProps + +export interface ObservabilityVM extends BaseObservability { + ipAddress: string + cpu: number + memory: number + disk: number +} + +export type VMTableProps = TableProps export enum ProjectListFields { PROJECT_ID = 'id', PROJECT_NAME = 'name', PROJECT_DESCRIPTION = 'description', - PROJECT_STATUS = 'status', + STATUS = 'status', TOTAL_VMS = 'totalVms', ACTIVE_VMS = 'activeVms', HEALTH_STATUS = 'healthStatus', + PROJECTS = 'projects', } -export interface ObservabilityVM { - id: string, - name: string, - ipAddress: string, - status: string, - cpu: number, - memory: number, - disk: number -} - -export type VMTableProps = TableProps< - ObservabilityVM, - FiltersTypeEnum.STATE, - {} -> - export enum VMListFields { VM_ID = 'id', VM_NAME = 'name', @@ -68,9 +70,9 @@ export enum ObservabilityFilters { export enum TabDetailsSegment { 'OVERVIEW' = 'Overview', - 'PROJECTS' = 'Projects' + 'PROJECTS' = 'Projects', } export interface TabDetailsSearchParams { tab: TabDetailsSegment -} \ No newline at end of file +} diff --git a/src/components/observability/utils.tsx b/src/components/observability/utils.tsx index fe934d565d..382130f680 100644 --- a/src/components/observability/utils.tsx +++ b/src/components/observability/utils.tsx @@ -24,4 +24,4 @@ export const useGetGlanceConfig = () => export const parseChartDetailsSearchParams = (searchParams: URLSearchParams): TabDetailsSearchParams => ({ tab: (searchParams.get('tab') as TabDetailsSegment) || TabDetailsSegment.OVERVIEW, -}) \ No newline at end of file +}) diff --git a/src/components/project/ProjectList.tsx b/src/components/project/ProjectList.tsx index fd2b7dd8bc..799a63bbfc 100644 --- a/src/components/project/ProjectList.tsx +++ b/src/components/project/ProjectList.tsx @@ -20,7 +20,6 @@ import { Progressing, ErrorScreenManager, ErrorScreenNotAuthorized, - FeatureTitleWithInfo, ToastVariantType, ToastManager, PageHeader, diff --git a/vite.config.mts b/vite.config.mts index dcb785595b..e7d3de936c 100644 --- a/vite.config.mts +++ b/vite.config.mts @@ -31,7 +31,7 @@ import tsconfigPaths from 'vite-tsconfig-paths' import { compression, defineAlgorithm } from 'vite-plugin-compression2' const WRONG_CODE = `import { bpfrpt_proptype_WindowScroller } from "../WindowScroller.js";` -const TARGET_URL = 'https://preview.devtron.ai/' +const TARGET_URL = 'https://devtron-ent-7.devtron.info/' function reactVirtualized(): PluginOption { return {