From 1be1d7cc3a9d5f695da42f0d158f3b2c23fe9c72 Mon Sep 17 00:00:00 2001 From: AKILIMAILI CIZUNGU Innocent <51681130+Innocent-Akim@users.noreply.github.com> Date: Wed, 22 Jan 2025 19:27:09 +0200 Subject: [PATCH] [Feat]: Add new API endpoint for daily time log report charts (#3533) * feat: implement time tracking analytics improvements * fix: code rabbit * fix: code rabbit * refactor: improve report activity state management - Move report activity state to global store using timeLogsRapportChartState - Remove local state management in useReportActivity hook - Improve error handling and data reset logic - Add better error logging - Simplify state updates and data flow * feat: Add input validation for required fields. --- .../dashboard/app-url/[teamId]/page.tsx | 68 +++++ .../app/[locale]/dashboard/app-url/page.tsx | 11 - .../components/dashboard-header.tsx | 2 +- .../[teamId]/components/date-range-picker.tsx | 234 ++++++++++++++++++ .../components/team-stats-chart.tsx | 9 +- .../components/team-stats-grid.tsx | 2 +- .../components/team-stats-table.tsx | 0 .../{ => [teamId]}/data/mock-data.ts | 0 .../team-dashboard/{ => [teamId]}/page.tsx | 11 +- .../components/date-range-picker.tsx | 218 ---------------- .../time-log/report/daily-chart/route.ts | 56 +++++ .../app/hooks/features/useReportActivity.ts | 52 ++++ apps/web/app/interfaces/timer/ITimerLog.ts | 31 +++ .../services/client/api/timer/timer-log.ts | 55 +++- .../app/services/server/requests/timesheet.ts | 41 ++- apps/web/app/stores/time-logs.ts | 3 +- apps/web/components/app-sidebar.tsx | 25 +- apps/web/components/ui/export-dialog.tsx | 43 ++++ apps/web/lib/features/task/task-filters.tsx | 6 +- apps/web/lib/features/task/task-input.tsx | 22 +- 20 files changed, 615 insertions(+), 274 deletions(-) create mode 100644 apps/web/app/[locale]/dashboard/app-url/[teamId]/page.tsx delete mode 100644 apps/web/app/[locale]/dashboard/app-url/page.tsx rename apps/web/app/[locale]/dashboard/team-dashboard/{ => [teamId]}/components/dashboard-header.tsx (98%) create mode 100644 apps/web/app/[locale]/dashboard/team-dashboard/[teamId]/components/date-range-picker.tsx rename apps/web/app/[locale]/dashboard/team-dashboard/{ => [teamId]}/components/team-stats-chart.tsx (93%) rename apps/web/app/[locale]/dashboard/team-dashboard/{ => [teamId]}/components/team-stats-grid.tsx (97%) rename apps/web/app/[locale]/dashboard/team-dashboard/{ => [teamId]}/components/team-stats-table.tsx (100%) rename apps/web/app/[locale]/dashboard/team-dashboard/{ => [teamId]}/data/mock-data.ts (100%) rename apps/web/app/[locale]/dashboard/team-dashboard/{ => [teamId]}/page.tsx (91%) delete mode 100644 apps/web/app/[locale]/dashboard/team-dashboard/components/date-range-picker.tsx create mode 100644 apps/web/app/api/timesheet/time-log/report/daily-chart/route.ts create mode 100644 apps/web/app/hooks/features/useReportActivity.ts create mode 100644 apps/web/components/ui/export-dialog.tsx diff --git a/apps/web/app/[locale]/dashboard/app-url/[teamId]/page.tsx b/apps/web/app/[locale]/dashboard/app-url/[teamId]/page.tsx new file mode 100644 index 000000000..21d63ede0 --- /dev/null +++ b/apps/web/app/[locale]/dashboard/app-url/[teamId]/page.tsx @@ -0,0 +1,68 @@ +"use client" +import { fullWidthState } from '@/app/stores/fullWidth'; +import { withAuthentication } from '@/lib/app/authenticator'; +import { MainLayout } from '@/lib/layout'; +import { cn } from '@/lib/utils'; +import { useOrganizationTeams } from '@app/hooks/features/useOrganizationTeams'; +import { useAtomValue } from 'jotai'; +import { useTranslations } from 'next-intl'; +import { useParams } from 'next/navigation'; +import React, { useMemo } from 'react'; +import { ArrowLeftIcon } from '@radix-ui/react-icons'; +import { useRouter } from 'next/navigation'; +import { Breadcrumb, Container } from '@/lib/components'; + + function AppUrls() { + const { activeTeam, isTrackingEnabled } = useOrganizationTeams(); + const router = useRouter(); + const t = useTranslations(); + const fullWidth = useAtomValue(fullWidthState); + const paramsUrl = useParams<{ locale: string }>(); + const currentLocale = paramsUrl?.locale; + + + const breadcrumbPath = useMemo( + () => [ + { title: JSON.parse(t('pages.home.BREADCRUMB')), href: '/' }, + { title: activeTeam?.name || '', href: '/' }, + { title: 'Apps & URLs', href: `/${currentLocale}/dashboard/app-url` } + ], + [activeTeam?.name, currentLocale, t] + ); + + if (!activeTeam) { + return ( +
+

Team not found

+
+ ); + } + + return ( + + +
+ + +
+
+ + } + >
+ ); +} + +export default withAuthentication(AppUrls, { + displayName: 'Apps & URLs', + showPageSkeleton: true +}); diff --git a/apps/web/app/[locale]/dashboard/app-url/page.tsx b/apps/web/app/[locale]/dashboard/app-url/page.tsx deleted file mode 100644 index fd86ca5ad..000000000 --- a/apps/web/app/[locale]/dashboard/app-url/page.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react' - -function AppUrls() { - return ( -
- -
- ) -} - -export default AppUrls diff --git a/apps/web/app/[locale]/dashboard/team-dashboard/components/dashboard-header.tsx b/apps/web/app/[locale]/dashboard/team-dashboard/[teamId]/components/dashboard-header.tsx similarity index 98% rename from apps/web/app/[locale]/dashboard/team-dashboard/components/dashboard-header.tsx rename to apps/web/app/[locale]/dashboard/team-dashboard/[teamId]/components/dashboard-header.tsx index ff2b73248..7e96cffbf 100644 --- a/apps/web/app/[locale]/dashboard/team-dashboard/components/dashboard-header.tsx +++ b/apps/web/app/[locale]/dashboard/team-dashboard/[teamId]/components/dashboard-header.tsx @@ -14,7 +14,7 @@ export function DashboardHeader() {

Team Dashboard

- +