improvement: time period dropdown added to appropriate dashboard charts.

This commit is contained in:
2026-07-19 00:37:59 +03:30
parent 538121d653
commit db515f9630
18 changed files with 557 additions and 95 deletions

View File

@@ -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;
},
};

View File

@@ -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,
};
}