src/components/reports/react/runtime/Selectors.tsx (114 lines of code) (raw):
import * as React from "react";
import * as moment from "moment/moment";
import { Stack } from "@fluentui/react";
import { Dropdown, Option, OptionGroup } from "@fluentui/react-components";
export enum optionsReportsCharts {
"API Calls" = "apiCalls",
"Data transfer" = "dataTransfer",
"API response time" = "apiResponseTime",
}
export enum optionsReportsTables {
"Products" = "products",
"Subscriptions" = "subscriptions",
"APIs" = "apis",
"Operations" = "operations",
}
export const optionsReports = [
Object.values(optionsReportsCharts),
Object.values(optionsReportsTables),
].flat();
const reportsDropdownLabel = (selectedReports: string[]) => {
if (selectedReports.length === optionsReports.length) return "All reports";
if (selectedReports.length !== 1)
return `${selectedReports.length} out of ${optionsReports.length} reports selected`;
const key = selectedReports[0];
return Object.entries({
...optionsReportsCharts,
...optionsReportsTables,
}).find(([_, value]) => value === key)?.[0];
};
const optionsTime = {
"1hour": "Last hour",
"1day": "Today",
"7days": "Last 7 days",
"30days": "Last 30 days",
"90days": "Last 90 days",
};
export type TimeRange = { startTime: Date, endTime: Date };
const getTimeRange1Hour = (): TimeRange => ({
startTime: moment().subtract(1, "hours").toDate(),
endTime: moment().toDate(),
});
const getTimeRange1Day = (): TimeRange => ({
startTime: moment().subtract(1, "days").toDate(),
endTime: moment().toDate(),
});
const getTimeRange7Days = (): TimeRange => ({
startTime: moment().subtract(7, "days").toDate(),
endTime: moment().toDate(),
});
const getTimeRange30Days = (): TimeRange => ({
startTime: moment().subtract(30, "days").toDate(),
endTime: moment().toDate(),
});
const getTimeRange90Days = (): TimeRange => ({
startTime: moment().subtract(90, "days").toDate(),
endTime: moment().toDate(),
});
export const optionTimeRangeDefault = getTimeRange7Days;
const optionTimeDefault: keyof typeof optionsTime = "7days";
const timeRangeMap: Record<keyof typeof optionsTime, () => TimeRange> = {
"1hour": getTimeRange1Hour,
"1day": getTimeRange1Day,
"7days": getTimeRange7Days,
"30days": getTimeRange30Days,
"90days": getTimeRange90Days,
};
type TSelectorsProps = {
selectedReportsState: [
string[],
React.Dispatch<React.SetStateAction<string[]>>
];
setTimeRange: React.Dispatch<React.SetStateAction<TimeRange>>;
};
export const Selectors = ({
selectedReportsState: [selectedReports, setSelectedReports],
setTimeRange,
}: TSelectorsProps) => (
<Stack horizontal tokens={{ childrenGap: 20 }}>
<Dropdown
multiselect
onOptionSelect={(_, data) =>
setSelectedReports(data.selectedOptions)
}
value={reportsDropdownLabel(selectedReports)}
selectedOptions={selectedReports}
>
<OptionGroup label={"Charts"}>
{Object.entries(optionsReportsCharts).map(([label, value]) => (
<Option key={value} value={value}>
{label}
</Option>
))}
</OptionGroup>
<OptionGroup label={"Tables"}>
{Object.entries(optionsReportsTables).map(([label, value]) => (
<Option key={value} value={value}>
{label}
</Option>
))}
</OptionGroup>
</Dropdown>
<Dropdown
onOptionSelect={(_, data) => setTimeRange(timeRangeMap[data.selectedOptions[0]])}
defaultValue={optionsTime[optionTimeDefault]}
defaultSelectedOptions={[optionTimeDefault]}
>
{Object.entries(optionsTime).map(([value, label]) => (
<Option key={value} value={value}>
{label}
</Option>
))}
</Dropdown>
</Stack>
);