Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Lint
run: npm run lint

- name: Run Vitest Tests
run: npm run test:vi

Expand Down
32 changes: 7 additions & 25 deletions src/components/ComponentsSelection/ComponentsSelection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,23 +28,15 @@ export interface ComponentsSelectionProps {
setComponentsList: (components: ComponentsListItem[]) => void;
}

export const ComponentsSelection: React.FC<ComponentsSelectionProps> = ({
componentsList,
setComponentsList,
}) => {
export const ComponentsSelection: React.FC<ComponentsSelectionProps> = ({ componentsList, setComponentsList }) => {
const [searchTerm, setSearchTerm] = useState('');
const { t } = useTranslation();

const selectedComponents = useMemo(
() => getSelectedComponents(componentsList),
[componentsList],
);
const selectedComponents = useMemo(() => getSelectedComponents(componentsList), [componentsList]);

const searchResults = useMemo(() => {
const lowerSearch = searchTerm.toLowerCase();
return componentsList.filter(({ name }) =>
name.toLowerCase().includes(lowerSearch),
);
return componentsList.filter(({ name }) => name.toLowerCase().includes(lowerSearch));
}, [componentsList, searchTerm]);

const handleSelectionChange = useCallback(
Expand All @@ -53,9 +45,7 @@ export const ComponentsSelection: React.FC<ComponentsSelectionProps> = ({
if (!id) return;
setComponentsList(
componentsList.map((component) =>
component.name === id
? { ...component, isSelected: !component.isSelected }
: component,
component.name === id ? { ...component, isSelected: !component.isSelected } : component,
),
);
},
Expand All @@ -74,9 +64,7 @@ export const ComponentsSelection: React.FC<ComponentsSelectionProps> = ({
if (!name) return;
setComponentsList(
componentsList.map((component) =>
component.name === name
? { ...component, selectedVersion: version || '' }
: component,
component.name === name ? { ...component, selectedVersion: version || '' } : component,
),
);
},
Expand All @@ -86,9 +74,7 @@ export const ComponentsSelection: React.FC<ComponentsSelectionProps> = ({
const isProviderDisabled = useCallback(
(component: ComponentsListItem) => {
if (!component.name?.includes('provider')) return false;
const crossplane = componentsList.find(
({ name }) => name === 'crossplane',
);
const crossplane = componentsList.find(({ name }) => name === 'crossplane');
return crossplane?.isSelected === false;
},
[componentsList],
Expand Down Expand Up @@ -130,11 +116,7 @@ export const ComponentsSelection: React.FC<ComponentsSelectionProps> = ({
aria-label={component.name}
onChange={handleSelectionChange}
/>
<FlexBox
gap={10}
justifyContent="SpaceBetween"
alignItems="Baseline"
>
<FlexBox gap={10} justifyContent="SpaceBetween" alignItems="Baseline">
{/* TODO: Add documentation link */}
{component.documentationUrl && (
<Button
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import IllustratedError from '../Shared/IllustratedError.tsx';
import { sortVersions } from '../../utils/componentsVersions.ts';

import { ListManagedComponents } from '../../lib/api/types/crate/listManagedComponents.ts';
import useApiResource from '../../lib/api/useApiResource.ts';
import { useApiResource } from '../../lib/api/useApiResource.ts';
import Loading from '../Shared/Loading.tsx';
import { ComponentsListItem, removeComponents } from '../../lib/api/types/crate/createManagedControlPlane.ts';
import { useTranslation } from 'react-i18next';
Expand Down
5 changes: 1 addition & 4 deletions src/components/ControlPlane/ComponentList.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import {
AnalyticalTable,
AnalyticalTableColumnDefinition,
} from '@ui5/webcomponents-react';
import { AnalyticalTable, AnalyticalTableColumnDefinition } from '@ui5/webcomponents-react';
import { ControlPlaneType } from '../../lib/api/types/crate/controlPlanes';
import { useTranslation } from 'react-i18next';

Expand Down
65 changes: 16 additions & 49 deletions src/components/ControlPlane/FluxList.tsx
Original file line number Diff line number Diff line change
@@ -1,16 +1,9 @@
import ConfiguredAnalyticstable from '../Shared/ConfiguredAnalyticsTable.tsx';
import {
AnalyticalTableColumnDefinition,
FlexBox,
Title,
} from '@ui5/webcomponents-react';
import { AnalyticalTableColumnDefinition, FlexBox, Title } from '@ui5/webcomponents-react';
import IllustratedError from '../Shared/IllustratedError.tsx';
import useResource from '../../lib/api/useApiResource';
import { useApiResource } from '../../lib/api/useApiResource';
import { FluxRequest } from '../../lib/api/types/flux/listGitRepo';
import {
FluxKustomization,
KustomizationsResponse,
} from '../../lib/api/types/flux/listKustomization';
import { FluxKustomization, KustomizationsResponse } from '../../lib/api/types/flux/listKustomization';
import { useTranslation } from 'react-i18next';
import { timeAgo } from '../../utils/i18n/timeAgo.ts';
import { ResourceStatusCell } from '../Shared/ResourceStatusCell.tsx';
Expand All @@ -19,16 +12,12 @@ import { useMemo } from 'react';
import StatusFilter from '../Shared/StatusFilter/StatusFilter.tsx';

export default function FluxList() {
const {
data: gitReposData,
error: repoErr,
isLoading: repoIsLoading,
} = useResource(FluxRequest); //404 if component not enabled
const { data: gitReposData, error: repoErr, isLoading: repoIsLoading } = useApiResource(FluxRequest); //404 if component not enabled
const {
data: kustmizationData,
error: kustomizationErr,
isLoading: kustomizationIsLoading,
} = useResource(FluxKustomization); //404 if component not enabled
} = useApiResource(FluxKustomization); //404 if component not enabled

const { t } = useTranslation();

Expand Down Expand Up @@ -75,9 +64,7 @@ export default function FluxList() {
<ResourceStatusCell
value={cellData.cell.row.original?.isReady}
transitionTime={
cellData.cell.row.original?.statusUpdateTime
? cellData.cell.row.original?.statusUpdateTime
: ''
cellData.cell.row.original?.statusUpdateTime ? cellData.cell.row.original?.statusUpdateTime : ''
}
/>
) : null,
Expand All @@ -93,7 +80,7 @@ export default function FluxList() {
),
},
],
[],
[t],
);

const kustomizationsColumns: AnalyticalTableColumnDefinition[] = useMemo(
Expand All @@ -118,9 +105,7 @@ export default function FluxList() {
<ResourceStatusCell
value={cellData.cell.row.original?.isReady}
transitionTime={
cellData.cell.row.original?.statusUpdateTime
? cellData.cell.row.original?.statusUpdateTime
: ''
cellData.cell.row.original?.statusUpdateTime ? cellData.cell.row.original?.statusUpdateTime : ''
}
/>
) : null,
Expand All @@ -132,22 +117,16 @@ export default function FluxList() {
width: 85,
accessor: 'yaml',
disableFilters: true,
Cell: (cellData: CellData<FluxRow>) => (
<YamlViewButton resourceObject={cellData.cell.row.original?.item} />
),
Cell: (cellData: CellData<FluxRow>) => <YamlViewButton resourceObject={cellData.cell.row.original?.item} />,
},
],
[],
[t],
);

if (repoErr || kustomizationErr) {
return (
<IllustratedError
details={
repoErr?.message ||
kustomizationErr?.message ||
t('FluxList.undefinedError')
}
details={repoErr?.message || kustomizationErr?.message || t('FluxList.undefinedError')}
title={t('FluxList.noFluxError')}
/>
);
Expand All @@ -157,12 +136,8 @@ export default function FluxList() {
gitReposData?.items?.map((item) => {
return {
name: item.metadata.name,
isReady:
item?.status?.conditions?.find((x) => x.type === 'Ready')?.status ===
'True',
statusUpdateTime: item.status?.conditions?.find(
(x) => x.type === 'Ready',
)?.lastTransitionTime,
isReady: item?.status?.conditions?.find((x) => x.type === 'Ready')?.status === 'True',
statusUpdateTime: item.status?.conditions?.find((x) => x.type === 'Ready')?.lastTransitionTime,
revision: shortenCommitHash(item.status.artifact?.revision ?? '-'),
created: timeAgo.format(new Date(item.metadata.creationTimestamp)),
item: item,
Expand All @@ -173,12 +148,8 @@ export default function FluxList() {
kustmizationData?.items?.map((item) => {
return {
name: item.metadata.name,
isReady:
item.status?.conditions?.find((x) => x.type === 'Ready')?.status ===
'True',
statusUpdateTime: item.status?.conditions?.find(
(x) => x.type === 'Ready',
)?.lastTransitionTime,
isReady: item.status?.conditions?.find((x) => x.type === 'Ready')?.status === 'True',
statusUpdateTime: item.status?.conditions?.find((x) => x.type === 'Ready')?.lastTransitionTime,
created: timeAgo.format(new Date(item.metadata.creationTimestamp)),
item: item,
};
Expand All @@ -191,11 +162,7 @@ export default function FluxList() {
<Title level="H4">{t('FluxList.gitOpsTitle')}</Title>
<YamlViewButton resourceObject={gitReposData} />
</FlexBox>
<ConfiguredAnalyticstable
columns={gitReposColumns}
isLoading={repoIsLoading}
data={gitReposRows}
/>
<ConfiguredAnalyticstable columns={gitReposColumns} isLoading={repoIsLoading} data={gitReposRows} />
</div>
<div className="crossplane-table-element">
<FlexBox justifyContent={'Start'} alignItems={'Center'} gap={'0.5em'}>
Expand Down
54 changes: 12 additions & 42 deletions src/components/ControlPlane/Landscapers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,55 +9,30 @@ import {
} from '@ui5/webcomponents-react';
import { useState, JSX } from 'react';
import { resourcesInterval } from '../../lib/shared/constants';
import useResource, {
useMultipleApiResources,
} from '../../lib/api/useApiResource';
import { useApiResource, useMultipleApiResources } from '../../lib/api/useApiResource';
import { ListNamespaces } from '../../lib/api/types/k8s/listNamespaces';
import {
Installation,
InstallationsRequest,
} from '../../lib/api/types/landscaper/listInstallations';
import {
Execution,
ExecutionsRequest,
} from '../../lib/api/types/landscaper/listExecutions';
import {
DeployItem,
DeployItemsRequest,
} from '../../lib/api/types/landscaper/listDeployItems';
import { Installation, InstallationsRequest } from '../../lib/api/types/landscaper/listInstallations';
import { Execution, ExecutionsRequest } from '../../lib/api/types/landscaper/listExecutions';
import { DeployItem, DeployItemsRequest } from '../../lib/api/types/landscaper/listDeployItems';

import { MultiComboBoxSelectionChangeEventDetail } from '@ui5/webcomponents/dist/MultiComboBox.js';

export function Landscapers() {
const { t } = useTranslation();

const { data: namespaces } = useResource(ListNamespaces, {
const { data: namespaces } = useApiResource(ListNamespaces, {
refreshInterval: resourcesInterval,
});

const [selectedNamespaces, setSelectedNamespaces] = useState<string[]>([]);

const { data: installations = [] } = useMultipleApiResources<Installation>(
selectedNamespaces,
InstallationsRequest,
);
const { data: installations = [] } = useMultipleApiResources<Installation>(selectedNamespaces, InstallationsRequest);

const { data: executions = [] } = useMultipleApiResources<Execution>(
selectedNamespaces,
ExecutionsRequest,
);
const { data: executions = [] } = useMultipleApiResources<Execution>(selectedNamespaces, ExecutionsRequest);

const { data: deployItems = [] } = useMultipleApiResources<DeployItem>(
selectedNamespaces,
DeployItemsRequest,
);
const { data: deployItems = [] } = useMultipleApiResources<DeployItem>(selectedNamespaces, DeployItemsRequest);

const handleSelectionChange = (
e: Ui5CustomEvent<
MultiComboBoxDomRef,
MultiComboBoxSelectionChangeEventDetail
>,
) => {
const handleSelectionChange = (e: Ui5CustomEvent<MultiComboBoxDomRef, MultiComboBoxSelectionChangeEventDetail>) => {
const selectedItems = Array.from(e.detail.items || []);
const selectedValues = selectedItems
.map((item) => item.text)
Expand Down Expand Up @@ -85,9 +60,7 @@ export function Landscapers() {
(installation.status?.subInstCache?.activeSubs
?.map((sub) =>
installations.find(
(i) =>
i.metadata.name === sub.objectName &&
i.metadata.namespace === installation.metadata.namespace,
(i) => i.metadata.name === sub.objectName && i.metadata.namespace === installation.metadata.namespace,
),
)
.filter(Boolean) as Installation[]) || [];
Expand All @@ -102,9 +75,7 @@ export function Landscapers() {
(execution?.status?.deployItemCache?.activeDIs
?.map((di) =>
deployItems.find(
(item) =>
item.metadata.name === di.objectName &&
item.metadata.namespace === execution.metadata.namespace,
(item) => item.metadata.name === di.objectName && item.metadata.namespace === execution.metadata.namespace,
),
)
.filter(Boolean) as DeployItem[]) || [];
Expand Down Expand Up @@ -154,8 +125,7 @@ export function Landscapers() {
return !installations.some((parent) =>
parent.status?.subInstCache?.activeSubs?.some(
(sub: { objectName: string }) =>
sub.objectName === inst.metadata.name &&
parent.metadata.namespace === inst.metadata.namespace,
sub.objectName === inst.metadata.name && parent.metadata.namespace === inst.metadata.namespace,
),
);
});
Expand Down
29 changes: 6 additions & 23 deletions src/components/ControlPlane/MCPHealthPopoverButton.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,9 @@
import {
AnalyticalTable,
Icon,
Popover,
FlexBox,
FlexBoxJustifyContent,
Button,
} from '@ui5/webcomponents-react';
import { AnalyticalTable, Icon, Popover, FlexBox, FlexBoxJustifyContent, Button } from '@ui5/webcomponents-react';
import { AnalyticalTableColumnDefinition } from '@ui5/webcomponents-react/wrappers';
import PopoverPlacement from '@ui5/webcomponents/dist/types/PopoverPlacement.js';
import '@ui5/webcomponents-icons/dist/copy';
import { JSX, useRef, useState } from 'react';
import {
ControlPlaneStatusType,
ReadyStatus,
} from '../../lib/api/types/crate/controlPlanes';
import { ControlPlaneStatusType, ReadyStatus } from '../../lib/api/types/crate/controlPlanes';
import ReactTimeAgo from 'react-time-ago';
import { AnimatedHoverTextButton } from '../Helper/AnimatedHoverTextButton.tsx';
import { useTranslation } from 'react-i18next';
Expand Down Expand Up @@ -67,10 +57,8 @@ export default function MCPHealthPopoverButton({
mcpStatus?.conditions
.map((condition) => {
let text = `- ${condition.type}: ${condition.status}\n`;
if (condition.reason)
text += ` - ${t('MCPHealthPopoverButton.reasonHeader')}: ${condition.reason}\n`;
if (condition.message)
text += ` - ${t('MCPHealthPopoverButton.messageHeader')}: ${condition.message}\n`;
if (condition.reason) text += ` - ${t('MCPHealthPopoverButton.reasonHeader')}: ${condition.reason}\n`;
if (condition.message) text += ` - ${t('MCPHealthPopoverButton.messageHeader')}: ${condition.message}\n`;
return text;
})
.join('')
Expand Down Expand Up @@ -189,14 +177,9 @@ function StatusTable({
}) ?? []
}
/>
<FlexBox
justifyContent={FlexBoxJustifyContent.End}
style={{ marginTop: '0.5rem' }}
>
<FlexBox justifyContent={FlexBoxJustifyContent.End} style={{ marginTop: '0.5rem' }}>
<a href={githubIssuesLink} target="_blank" rel="noreferrer">
<Button>
{t('MCPHealthPopoverButton.createSupportTicketButton')}
</Button>
<Button>{t('MCPHealthPopoverButton.createSupportTicketButton')}</Button>
</a>
</FlexBox>
</div>
Expand Down
Loading
Loading