improvement: time period dropdown added to appropriate dashboard charts.
This commit is contained in:
@@ -1,15 +1,33 @@
|
||||
import { apiClient } from './client';
|
||||
import type { TodaySummaryResponse } from '@/types/today';
|
||||
import type { TodayChartPeriods } from '@/components/today/chart-periods';
|
||||
|
||||
export interface TodaySummaryParams {
|
||||
from: string;
|
||||
to: string;
|
||||
utcOffsetMinutes?: number;
|
||||
chartPeriods?: TodayChartPeriods;
|
||||
}
|
||||
|
||||
function chartPeriodQuery(periods?: TodayChartPeriods) {
|
||||
if (!periods) return {};
|
||||
return {
|
||||
appointmentsWeekPeriod: periods.appointmentsWeekAll,
|
||||
appointmentsWeekMinePeriod: periods.appointmentsWeekMine,
|
||||
labTaskActivityPeriod: periods.labTaskActivity,
|
||||
casesDuePeriod: periods.casesDue,
|
||||
treatmentMixPeriod: periods.treatmentMix,
|
||||
casePartnersPeriod: periods.casePartners,
|
||||
efficiencyPeriod: periods.efficiency,
|
||||
};
|
||||
}
|
||||
|
||||
export const todayApi = {
|
||||
summary: async (params: TodaySummaryParams): Promise<TodaySummaryResponse> => {
|
||||
const response = await apiClient.get('/today/summary', { params });
|
||||
const { chartPeriods, ...range } = params;
|
||||
const response = await apiClient.get('/today/summary', {
|
||||
params: { ...range, ...chartPeriodQuery(chartPeriods) },
|
||||
});
|
||||
return response.data;
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
import { getLocalDayIsoRange } from '@/components/appointments/appointmentTime';
|
||||
import {
|
||||
loadTodayChartPeriods,
|
||||
saveTodayChartPeriods,
|
||||
type TodayChartPeriod,
|
||||
type TodayChartPeriodKey,
|
||||
type TodayChartPeriods,
|
||||
TODAY_CHART_PERIOD_DEFAULTS,
|
||||
} from '@/components/today/chart-periods';
|
||||
import { todayApi } from '@/lib/api/today';
|
||||
import type { TodaySummaryData } from '@/types/today';
|
||||
import type { ApiError } from '@/types/api';
|
||||
@@ -11,6 +19,8 @@ interface UseTodaySummaryResult {
|
||||
loading: boolean;
|
||||
isInitialLoad: boolean;
|
||||
error: ApiError | null;
|
||||
chartPeriods: TodayChartPeriods;
|
||||
setChartPeriod: (key: TodayChartPeriodKey, period: TodayChartPeriod) => void;
|
||||
reload: () => Promise<void>;
|
||||
}
|
||||
|
||||
@@ -19,6 +29,17 @@ export function useTodaySummary(organizationId?: string | null): UseTodaySummary
|
||||
const [data, setData] = useState<TodaySummaryData | null>(null);
|
||||
const [loading, setLoading] = useState(enabled);
|
||||
const [error, setError] = useState<ApiError | null>(null);
|
||||
const [chartPeriods, setChartPeriods] = useState<TodayChartPeriods>(() =>
|
||||
organizationId ? loadTodayChartPeriods(organizationId) : TODAY_CHART_PERIOD_DEFAULTS,
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
if (!organizationId) {
|
||||
setChartPeriods(TODAY_CHART_PERIOD_DEFAULTS);
|
||||
return;
|
||||
}
|
||||
setChartPeriods(loadTodayChartPeriods(organizationId));
|
||||
}, [organizationId]);
|
||||
|
||||
const reload = useCallback(async () => {
|
||||
if (!organizationId) {
|
||||
@@ -34,14 +55,18 @@ export function useTodaySummary(organizationId?: string | null): UseTodaySummary
|
||||
try {
|
||||
const range = getLocalDayIsoRange(new Date());
|
||||
const utcOffsetMinutes = -new Date().getTimezoneOffset();
|
||||
const response = await todayApi.summary({ ...range, utcOffsetMinutes });
|
||||
const response = await todayApi.summary({
|
||||
...range,
|
||||
utcOffsetMinutes,
|
||||
chartPeriods,
|
||||
});
|
||||
setData(response.data);
|
||||
} catch (err) {
|
||||
setError(err as ApiError);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [organizationId]);
|
||||
}, [organizationId, chartPeriods]);
|
||||
|
||||
useEffect(() => {
|
||||
setData(null);
|
||||
@@ -54,11 +79,25 @@ export function useTodaySummary(organizationId?: string | null): UseTodaySummary
|
||||
void reload();
|
||||
}, [organizationId, reload]);
|
||||
|
||||
const setChartPeriod = useCallback(
|
||||
(key: TodayChartPeriodKey, period: TodayChartPeriod) => {
|
||||
setChartPeriods((prev) => {
|
||||
if (prev[key] === period) return prev;
|
||||
const next = { ...prev, [key]: period };
|
||||
if (organizationId) saveTodayChartPeriods(organizationId, next);
|
||||
return next;
|
||||
});
|
||||
},
|
||||
[organizationId],
|
||||
);
|
||||
|
||||
return {
|
||||
data,
|
||||
loading,
|
||||
isInitialLoad: loading && !data,
|
||||
error,
|
||||
chartPeriods,
|
||||
setChartPeriod,
|
||||
reload,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user