feat: add totals in projects page
This commit is contained in:
parent
f9ddfa36d5
commit
543cfad176
|
|
@ -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
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -185,7 +187,18 @@ export default function Projects() {
|
||||||
marginLeft: '1rem'
|
marginLeft: '1rem'
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<strong>{project.name}</strong>
|
<div
|
||||||
|
style={{
|
||||||
|
display: 'flex'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<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">
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue