fix(reports): add controlled fetching + change chart buckets to localized weekday names

This commit is contained in:
2026-04-28 11:03:51 +03:30
parent 581cfab1ac
commit 599e25e836
4 changed files with 81 additions and 34 deletions

View File

@@ -96,12 +96,15 @@ export default function Reports() {
const [dayDetails, setDayDetails] = useState<DayDetailsResponse | null>(null);
const [openDay, setOpenDay] = useState<string | null>(null);
const [isLoading, setIsLoading] = useState(false);
const [isLoadingUsers, setIsLoadingUsers] = useState(false);
const [exportState, setExportState] = useState({
excel: { pending: false, cooldownSeconds: 0 },
pdf: { pending: false, cooldownSeconds: 0 },
});
const canSelectUsers = canWorkspace(activeWorkspace?.my_role, WORKSPACE_MEMBERS_VIEW);
const isWorkspaceRoleResolved = Boolean(activeWorkspace?.my_role);
const showUserFilterLoading = !isWorkspaceRoleResolved || (canSelectUsers && isLoadingUsers);
const [filters, setFilters] = useState<ReportsFilterDraft>({
period: "this_month",
@@ -117,16 +120,14 @@ export default function Reports() {
if (!activeWorkspace?.id) return;
const loadOptions = async () => {
try {
const [projectsResponse, clientsResponse, tagsResponse, membersResponse] = await Promise.all([
const [projectsResponse, clientsResponse, tagsResponse] = await Promise.all([
getProjects(activeWorkspace.id, { limit: 300, offset: 0 }),
getClients(activeWorkspace.id, "", "", 300, 0),
getTags(activeWorkspace.id, { limit: 300, offset: 0 }),
fetchWorkspaceMemberships({ workspace: activeWorkspace.id }),
]);
setProjects(projectsResponse.results || []);
setClients((clientsResponse.results || []).map((client: { id: string; name: string }) => ({ id: client.id, name: client.name })));
setTags(tagsResponse.results || []);
setMemberships(membersResponse.results || []);
} catch {
toast.error(t.reports?.loadFiltersError || "Failed to load report filters.");
}
@@ -134,6 +135,31 @@ export default function Reports() {
void loadOptions();
}, [activeWorkspace?.id, t.reports?.loadFiltersError]);
useEffect(() => {
if (!activeWorkspace?.id || !isWorkspaceRoleResolved) return;
if (!canSelectUsers) {
setMemberships([]);
setIsLoadingUsers(false);
return;
}
const loadUsers = async () => {
setIsLoadingUsers(true);
try {
const membersResponse = await fetchWorkspaceMemberships({ workspace: activeWorkspace.id });
setMemberships(membersResponse.results || []);
} catch {
toast.error(t.reports?.loadFiltersError || "Failed to load report filters.");
setMemberships([]);
} finally {
setIsLoadingUsers(false);
}
};
void loadUsers();
}, [activeWorkspace?.id, canSelectUsers, isWorkspaceRoleResolved, t.reports?.loadFiltersError]);
const buildApiFilters = (draft: ReportsFilterDraft): ReportFilters | null => {
if (!activeWorkspace?.id) return null;
@@ -296,6 +322,7 @@ export default function Reports() {
tags={tags}
users={memberships}
canSelectUsers={canSelectUsers}
isLoadingUsers={showUserFilterLoading}
labels={{
period: t.reports?.period || "Period",
thisWeek: t.reports?.periodThisWeek || "This week",