Skip to content
Snippets Groups Projects
Commit ce3e8fd9 authored by Max Frederiksen's avatar Max Frederiksen Committed by Max Frederiksen
Browse files

Add typing /components/records

parent 270cb207
No related branches found
No related tags found
2 merge requests!612Release 5.0.0,!590CE-3429: Convert to typescript
import { IconBadge, InternalLink } from "@ess-ics/ce-ui-common"; import { IconBadge, InternalLink } from "@ess-ics/ce-ui-common";
import { type SxProps } from "@mui/material";
import { RecordStatusIcon } from "./RecordIcons"; import { RecordStatusIcon } from "./RecordIcons";
import { Record } from "../../store/deployApi";
export function RecordBadge({ record, ...rest }) { interface RecordBadgeProps {
record: Record;
sx?: SxProps;
}
export function RecordBadge({ record, sx }: RecordBadgeProps) {
return ( return (
<IconBadge <IconBadge
icon={<RecordStatusIcon record={record} />} icon={<RecordStatusIcon record={record} />}
...@@ -14,7 +21,7 @@ export function RecordBadge({ record, ...rest }) { ...@@ -14,7 +21,7 @@ export function RecordBadge({ record, ...rest }) {
{record?.iocName} {record?.iocName}
</InternalLink> </InternalLink>
} }
{...rest} sx={sx}
/> />
); );
} }
import { Grid, Skeleton, Typography } from "@mui/material"; import { Grid, Skeleton, Typography } from "@mui/material";
import { InternalLink, EllipsisText, EmptyValue } from "@ess-ics/ce-ui-common"; import { InternalLink, EllipsisText, EmptyValue } from "@ess-ics/ce-ui-common";
import { useFindNetBoxHostByFqdnQuery } from "../../store/deployApi"; import {
HostInfoWithId,
useFindNetBoxHostByFqdnQuery
} from "../../store/deployApi";
function shortenFqdn(fqdn) { function createHostLink(hostInfo: HostInfoWithId, fqdn?: string) {
return fqdn.split(".")[0];
}
function createHostLink(fqdn, hostInfo) {
// if the fqdn field is empty for some reason // if the fqdn field is empty for some reason
if (fqdn === null || fqdn.trim() === "") { if (fqdn === null || fqdn?.trim() === "") {
return <EmptyValue />; return <EmptyValue />;
} }
...@@ -20,7 +19,7 @@ function createHostLink(fqdn, hostInfo) { ...@@ -20,7 +19,7 @@ function createHostLink(fqdn, hostInfo) {
label={`Record host details, ${fqdn}}`} label={`Record host details, ${fqdn}}`}
width="100%" width="100%"
> >
<EllipsisText>{shortenFqdn(fqdn)}</EllipsisText> <EllipsisText>{fqdn?.split(".")[0]}</EllipsisText>
</InternalLink> </InternalLink>
); );
} }
...@@ -28,8 +27,11 @@ function createHostLink(fqdn, hostInfo) { ...@@ -28,8 +27,11 @@ function createHostLink(fqdn, hostInfo) {
return <Typography>{fqdn}</Typography>; return <Typography>{fqdn}</Typography>;
} }
export const RecordHostLink = ({ fqdn }) => { export const RecordHostLink = ({ fqdn }: { fqdn?: string }) => {
const { data: hostInfo, isLoading } = useFindNetBoxHostByFqdnQuery({ fqdn }); const { data: hostInfo, isLoading } = useFindNetBoxHostByFqdnQuery(
{ fqdn: fqdn ?? "" },
{ skip: !fqdn }
);
return ( return (
<Grid <Grid
...@@ -41,7 +43,7 @@ export const RecordHostLink = ({ fqdn }) => { ...@@ -41,7 +43,7 @@ export const RecordHostLink = ({ fqdn }) => {
{isLoading || !hostInfo ? ( {isLoading || !hostInfo ? (
<Skeleton width="100%" /> <Skeleton width="100%" />
) : ( ) : (
createHostLink(fqdn, hostInfo) createHostLink(hostInfo, fqdn)
)} )}
</Grid> </Grid>
); );
......
import { ReactElement } from "react";
import { useTheme } from "@mui/material"; import { useTheme } from "@mui/material";
import { LabeledIcon } from "@ess-ics/ce-ui-common"; import { LabeledIcon } from "@ess-ics/ce-ui-common";
import { import {
...@@ -5,28 +6,29 @@ import { ...@@ -5,28 +6,29 @@ import {
RadioButtonUnchecked, RadioButtonUnchecked,
HelpOutline HelpOutline
} from "@mui/icons-material"; } from "@mui/icons-material";
import { Record as ApiRecord } from "../../store/deployApi";
export function RecordStatusIcon({ record }) { export function RecordStatusIcon({ record }: { record: ApiRecord }) {
const theme = useTheme(); const theme = useTheme();
const { pvStatus } = record; const { pvStatus } = record;
const iconConfig = { const iconConfig: Record<string, { title: string; icon: ReactElement }> = {
active: { active: {
title: "Active", title: "Active",
icon: Brightness1 icon: <Brightness1 />
}, },
inactive: { inactive: {
title: "Inactive", title: "Inactive",
icon: RadioButtonUnchecked icon: <RadioButtonUnchecked />
}, },
null: { null: {
title: "Unknown", title: "Unknown",
icon: HelpOutline icon: <HelpOutline />
} }
}; };
const state = pvStatus ? pvStatus.toLowerCase() : null; const state = pvStatus ? pvStatus.toLowerCase() : "null";
const iconStyle = { fill: theme.palette.status.icons }; const iconStyle = { fill: theme.palette.status.icons };
const iconTitle = iconConfig[state].title; const iconTitle = iconConfig[state].title;
const statusIcon = iconConfig[state].icon; const statusIcon = iconConfig[state].icon;
......
...@@ -6,20 +6,33 @@ import { RecordTable } from "./RecordTable"; ...@@ -6,20 +6,33 @@ import { RecordTable } from "./RecordTable";
import { initRequestParams } from "../common/Helper"; import { initRequestParams } from "../common/Helper";
import { ROWS_PER_PAGE } from "../../constants"; import { ROWS_PER_PAGE } from "../../constants";
import { useLazyFindAllRecordsQuery } from "../../store/deployApi"; import { useLazyFindAllRecordsQuery } from "../../store/deployApi";
import { Pagination } from "../../types/common";
export function RecordSearch({ iocName, rowType, isExpanded }) { interface RecordSearchProps {
iocName?: string;
rowType: "records" | "iocDetails" | undefined;
isExpanded: boolean;
}
export function RecordSearch({
iocName,
rowType,
isExpanded
}: RecordSearchProps) {
const [ const [
getRecords, getRecords,
{ data: records, isLoading: loading, isSuccess: dataReady } { data: records, isLoading: loading, isSuccess: dataReady }
] = useLazyFindAllRecordsQuery(); ] = useLazyFindAllRecordsQuery();
const [searchParams, setSearchParams] = useSearchParams({ query: "" }); const [searchParams, setSearchParams] = useSearchParams({ query: "" });
const [recordFilter, setRecordFilter] = useState(); const [recordFilter, setRecordFilter] = useState<
"ACTIVE" | "INACTIVE" | undefined
>(undefined);
const [tabIndex, setTabIndex] = useState(0); const [tabIndex, setTabIndex] = useState(0);
const handleTabChange = (tab) => { const handleTabChange = (tab: number) => {
if (tab === 0) { if (tab === 0) {
setRecordFilter(null); setRecordFilter(undefined);
} else if (tab === 1) { } else if (tab === 1) {
setRecordFilter("ACTIVE"); setRecordFilter("ACTIVE");
} else if (tab === 2) { } else if (tab === 2) {
...@@ -43,23 +56,27 @@ export function RecordSearch({ iocName, rowType, isExpanded }) { ...@@ -43,23 +56,27 @@ export function RecordSearch({ iocName, rowType, isExpanded }) {
useEffect(() => { useEffect(() => {
if (isExpanded) { if (isExpanded) {
const requestParams = initRequestParams(pagination); const requestParams = initRequestParams(pagination);
requestParams.pv_status = recordFilter;
requestParams.text = searchParams.get("query"); getRecords({
requestParams.ioc_name = iocName; pvStatus: recordFilter,
getRecords(requestParams); text: searchParams.get("query") || undefined,
iocName: iocName,
...requestParams,
limit: requestParams.limit.toString()
});
} }
}, [getRecords, recordFilter, searchParams, pagination, iocName, isExpanded]); }, [getRecords, recordFilter, searchParams, pagination, iocName, isExpanded]);
// Callback for searchbar, called whenever user updates search // Callback for searchbar, called whenever user updates search
const setSearch = useCallback( const setSearch = useCallback(
(query) => { (query: string) => {
setSearchParams({ query }, { replace: true }); setSearchParams({ query }, { replace: true });
}, },
[setSearchParams] [setSearchParams]
); );
// Invoked by Table on change to pagination // Invoked by Table on change to pagination
const onPage = (params) => { const onPage = (params: Pagination) => {
setPagination(params); setPagination(params);
}; };
......
...@@ -7,6 +7,11 @@ import { ...@@ -7,6 +7,11 @@ import {
import { Grid } from "@mui/material"; import { Grid } from "@mui/material";
import { RecordStatusIcon } from "./RecordIcons"; import { RecordStatusIcon } from "./RecordIcons";
import { RecordHostLink } from "./RecordHostLink"; import { RecordHostLink } from "./RecordHostLink";
import { Pagination } from "../../types/common";
import type {
PagedRecordResponse,
Record as ApiRecord
} from "../../store/deployApi";
const recordsColumns = [ const recordsColumns = [
{ {
...@@ -50,10 +55,10 @@ const iocDetailsColumns = [ ...@@ -50,10 +55,10 @@ const iocDetailsColumns = [
{ field: "iocVersion", headerName: "Version", width: "15ch", sortable: false } { field: "iocVersion", headerName: "Version", width: "15ch", sortable: false }
]; ];
function createRecordName(record) { function createRecordName(record: ApiRecord) {
return ( return (
<InternalLink <InternalLink
to={`/records/${encodeURIComponent(record.name)}`} to={`/records/${encodeURIComponent(record?.name || "")}`}
label={`Record details, ${record.name}`} label={`Record details, ${record.name}`}
width="100%" width="100%"
> >
...@@ -77,7 +82,7 @@ function createRecordName(record) { ...@@ -77,7 +82,7 @@ function createRecordName(record) {
); );
} }
function createRecordDescription(description) { function createRecordDescription(description?: string) {
return ( return (
<> <>
{description ? ( {description ? (
...@@ -89,7 +94,7 @@ function createRecordDescription(description) { ...@@ -89,7 +94,7 @@ function createRecordDescription(description) {
); );
} }
function createIocLink(record) { function createIocLink(record: ApiRecord) {
// IOC ID only exists if it has been created in the DB -> avoid linking if it hasn't been created // IOC ID only exists if it has been created in the DB -> avoid linking if it hasn't been created
if (record.iocId) { if (record.iocId) {
return ( return (
...@@ -106,7 +111,7 @@ function createIocLink(record) { ...@@ -106,7 +111,7 @@ function createIocLink(record) {
return record.iocName; return record.iocName;
} }
function createRecordsRow(record) { function createRecordsRow(record: ApiRecord) {
return { return {
id: record.name, id: record.name,
bulb: ( bulb: (
...@@ -120,13 +125,13 @@ function createRecordsRow(record) { ...@@ -120,13 +125,13 @@ function createRecordsRow(record) {
</Grid> </Grid>
), ),
name: createRecordName(record), name: createRecordName(record),
description: createRecordDescription(record.description), description: createRecordDescription(record?.description),
iocName: createIocLink(record), iocName: createIocLink(record),
hostName: <RecordHostLink fqdn={record.hostName} /> hostName: <RecordHostLink fqdn={record.hostName} />
}; };
} }
function createIocDetailsRow(record) { function createIocDetailsRow(record: ApiRecord) {
return { return {
id: record.name, id: record.name,
bulb: ( bulb: (
...@@ -139,26 +144,41 @@ function createIocDetailsRow(record) { ...@@ -139,26 +144,41 @@ function createIocDetailsRow(record) {
<RecordStatusIcon record={record} /> <RecordStatusIcon record={record} />
</Grid> </Grid>
), ),
description: createRecordDescription(record.description),
name: createRecordName(record), name: createRecordName(record),
description: createRecordDescription(record.description),
iocVersion: <EllipsisText>{record.iocVersion}</EllipsisText> iocVersion: <EllipsisText>{record.iocVersion}</EllipsisText>
}; };
} }
interface RecordTableProps {
records?: PagedRecordResponse;
rowType?: "records" | "iocDetails";
loading: boolean;
pagination: Pagination;
onPage: (params: Pagination) => void;
}
type TableTypeSpecificsType = {
records: [typeof recordsColumns, typeof createRecordsRow];
iocDetails: [typeof iocDetailsColumns, typeof createIocDetailsRow];
};
export function RecordTable({ export function RecordTable({
records, records,
rowType = "records", rowType = "records",
loading, loading,
pagination, pagination,
onPage onPage
}) { }: RecordTableProps) {
const tableTypeSpecifics = { const tableTypeSpecifics: TableTypeSpecificsType = {
records: [recordsColumns, createRecordsRow], records: [recordsColumns, createRecordsRow],
iocDetails: [iocDetailsColumns, createIocDetailsRow] iocDetails: [iocDetailsColumns, createIocDetailsRow]
}; };
const [columns, createRow] = tableTypeSpecifics[rowType]; const [columns, createRow] = tableTypeSpecifics[rowType];
const rows = (records?.recordList ?? []).map((record) => createRow(record)); const rows = (records?.recordList ?? []).map((record: ApiRecord) =>
createRow(record)
);
return ( return (
<Table <Table
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment