feat: add totals in projects page

This commit is contained in:
Nicola Zambello 2023-05-03 10:03:24 +02:00
parent f9ddfa36d5
commit 543cfad176
Signed by: nzambello
GPG key ID: 56E4A92C2C1E50BA
2 changed files with 40 additions and 1 deletions

View file

@ -47,6 +47,9 @@ export async function getProjects({
orderBy: { orderBy: {
[orderBy || 'createdAt']: order || 'desc' [orderBy || 'createdAt']: order || 'desc'
}, },
include: {
timeEntries: true
},
skip: page && size ? (page - 1) * size : 0, skip: page && size ? (page - 1) * size : 0,
take: size take: size
}); });

View file

@ -24,6 +24,8 @@ import {
import { AlertTriangle, Edit3, Plus, Settings, Trash } from 'react-feather'; import { AlertTriangle, Edit3, Plus, Settings, Trash } from 'react-feather';
import { requireUserId } from '~/session.server'; import { requireUserId } from '~/session.server';
import { getProjects } from '~/models/project.server'; import { getProjects } from '~/models/project.server';
import SectionTimeElapsed from '~/components/SectionTimeElapsed';
import { TimeEntry } from '~/models/timeEntry.server';
export const meta: MetaFunction = () => { export const meta: MetaFunction = () => {
return { return {
@ -184,8 +186,19 @@ export default function Projects() {
marginRight: 'auto', marginRight: 'auto',
marginLeft: '1rem' marginLeft: '1rem'
}} }}
>
<div
style={{
display: 'flex'
}}
> >
<strong>{project.name}</strong> <strong>{project.name}</strong>
{!!project.timeEntries.length && (
<Text size="sm" color="darkgray" ml="lg">
{project.timeEntries.length} entries
</Text>
)}
</div>
<span <span
style={{ style={{
fontSize: '0.8em' fontSize: '0.8em'
@ -194,6 +207,29 @@ export default function Projects() {
{project.description} {project.description}
</span> </span>
</div> </div>
{project.timeEntries.length > 0 && (
<div
style={{
marginLeft: 'auto',
marginRight: '2rem'
}}
>
<SectionTimeElapsed
timeEntries={project.timeEntries as any as TimeEntry[]}
size="sm"
total={project.timeEntries.reduce((acc, timeEntry) => {
let duration =
(timeEntry.endTime
? new Date(timeEntry.endTime).getTime() -
new Date(timeEntry.startTime).getTime()
: Date.now() -
new Date(timeEntry.startTime).getTime()) / 1000;
return acc + duration;
}, 0)}
/>
</div>
)}
<Menu shadow="md" width={200}> <Menu shadow="md" width={200}>
<Menu.Target> <Menu.Target>
<ActionIcon title="Edit" mr="xs"> <ActionIcon title="Edit" mr="xs">