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 (
+
+ );
+ }
+
+ 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
-
+