Fix some bugs

This commit is contained in:
Ryan Pandya 2024-12-07 15:45:00 -08:00
parent 7e46f2c38d
commit 57d4c18527
9 changed files with 25 additions and 24 deletions

View File

@ -1,4 +1,4 @@
import MetricsView from "@/components/dashboard/categories/MetricsView"; import MetricsView from "@/components/dashboard/metrics/MetricsView";
export default async function MetricsPage() { export default async function MetricsPage() {
return ( return (

View File

@ -12,6 +12,8 @@ export function DayMetrics({
const [day, setDay] = useState(initialDay); const [day, setDay] = useState(initialDay);
return ( return (
<LoadingSpinner /> <span>
&nbsp;
</span>
); );
}; };

View File

@ -163,7 +163,7 @@ export default function EditableHour({
<div key={`${m.id}-${index}`} className="hover:cursor-no-drop" onClick={(e) => { <div key={`${m.id}-${index}`} className="hover:cursor-no-drop" onClick={(e) => {
decrementCount({ metricId: m.metricId, hourId: hour.id }); decrementCount({ metricId: m.metricId, hourId: hour.id });
}}> }}>
<Icon name={titleCase(m.icon)} size={24} /> <Icon name={titleCase(m.icon)} size={24} color={hour.foreground} />
</div> </div>
) )
)} )}

View File

@ -37,6 +37,7 @@ import { Textarea } from "@/components/ui/textarea";
import { zMetricSchema } from "@lifetracker/shared/types/metrics"; import { zMetricSchema } from "@lifetracker/shared/types/metrics";
import { Icon, } from "@/components/ui/icon"; import { Icon, } from "@/components/ui/icon";
import { icons } from "lucide-react"; import { icons } from "lucide-react";
import { titleCase } from "title-case";
type CreateMetricSchema = z.infer<typeof zMetricSchema>; type CreateMetricSchema = z.infer<typeof zMetricSchema>;
export default function AddMetricDialog({ export default function AddMetricDialog({
@ -50,7 +51,10 @@ export default function AddMetricDialog({
const [isOpen, onOpenChange] = useState(false); const [isOpen, onOpenChange] = useState(false);
const form = useForm<CreateMetricSchema>({ const form = useForm<CreateMetricSchema>({
resolver: zodResolver(zMetricSchema), resolver: zodResolver(zMetricSchema),
defaultValues: initialMetric defaultValues: {
...initialMetric,
type: "count"
},
}); });
const handleSuccess = (message: string) => { const handleSuccess = (message: string) => {
toast({ toast({
@ -113,7 +117,7 @@ export default function AddMetricDialog({
<DialogTrigger asChild>{children}</DialogTrigger> <DialogTrigger asChild>{children}</DialogTrigger>
<DialogContent> <DialogContent>
<DialogHeader> <DialogHeader>
<DialogTitle>Track a New Metric</DialogTitle> <DialogTitle>Track a New {titleCase(form.watch("type"))} Metric</DialogTitle>
</DialogHeader> </DialogHeader>
<Form {...form}> <Form {...form}>
<form onSubmit={form.handleSubmit((val) => mutate(val))}> <form onSubmit={form.handleSubmit((val) => mutate(val))}>

View File

@ -15,9 +15,11 @@ import { toast } from "@/components/ui/use-toast";
import { api } from "@/lib/trpc"; import { api } from "@/lib/trpc";
import { Pencil, Trash, FilePlus, Palette } from "lucide-react"; import { Pencil, Trash, FilePlus, Palette } from "lucide-react";
import { useSession } from "next-auth/react"; import { useSession } from "next-auth/react";
import AddMetricDialog from "../metrics/AddMetricDialog"; import AddMetricDialog from "./AddMetricDialog";
import Link from "next/link"; import Link from "next/link";
import { ZMetric } from "@lifetracker/shared/types/metrics"; import { ZMetric } from "@lifetracker/shared/types/metrics";
import { titleCase } from "title-case";
import { Icon } from "@/components/ui/icon";
export default function MetricsView() { export default function MetricsView() {
const { data: metrics } = api.metrics.list.useQuery(); const { data: metrics } = api.metrics.list.useQuery();
@ -44,7 +46,10 @@ export default function MetricsView() {
<TableBody> <TableBody>
{metrics.map((m) => ( {metrics.map((m) => (
<TableRow key={m.id} style={{ borderBottom: 0 }}> <TableRow key={m.id} style={{ borderBottom: 0 }}>
<TableCell className="py-1">{m.name}</TableCell> <TableCell className="py-1 flex items-center gap-4">
<Icon name={titleCase(m.icon)} size={32} />
<span>{m.name}</span>
</TableCell>
<TableCell className="py-1">{m.unit}</TableCell> <TableCell className="py-1">{m.unit}</TableCell>
<TableCell className="py-1">{m.type}</TableCell> <TableCell className="py-1">{m.type}</TableCell>
<TableCell className="py-1">{m.description}</TableCell> <TableCell className="py-1">{m.description}</TableCell>

View File

@ -97,7 +97,7 @@ CREATE TABLE `metric` (
`type` text NOT NULL, `type` text NOT NULL,
`unit` text, `unit` text,
`goal` real, `goal` real,
`icon` text, `icon` text NOT NULL,
`createdAt` integer NOT NULL, `createdAt` integer NOT NULL,
FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade FOREIGN KEY (`userId`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade
); );
@ -133,6 +133,5 @@ CREATE UNIQUE INDEX `category_userId_code_unique` ON `category` (`userId`,`code`
CREATE UNIQUE INDEX `color_userId_name_unique` ON `color` (`userId`,`name`);--> statement-breakpoint CREATE UNIQUE INDEX `color_userId_name_unique` ON `color` (`userId`,`name`);--> statement-breakpoint
CREATE UNIQUE INDEX `day_date_unique` ON `day` (`date`);--> statement-breakpoint CREATE UNIQUE INDEX `day_date_unique` ON `day` (`date`);--> statement-breakpoint
CREATE UNIQUE INDEX `hour_dayId_time_unique` ON `hour` (`dayId`,`time`);--> statement-breakpoint CREATE UNIQUE INDEX `hour_dayId_time_unique` ON `hour` (`dayId`,`time`);--> statement-breakpoint
CREATE UNIQUE INDEX `measurement_dayId_metricId_unique` ON `measurement` (`dayId`,`metricId`);--> statement-breakpoint
CREATE UNIQUE INDEX `metric_userId_name_unique` ON `metric` (`userId`,`name`);--> statement-breakpoint CREATE UNIQUE INDEX `metric_userId_name_unique` ON `metric` (`userId`,`name`);--> statement-breakpoint
CREATE UNIQUE INDEX `user_email_unique` ON `user` (`email`); CREATE UNIQUE INDEX `user_email_unique` ON `user` (`email`);

View File

@ -1,7 +1,7 @@
{ {
"version": "6", "version": "6",
"dialect": "sqlite", "dialect": "sqlite",
"id": "31bbb29b-e786-4716-9c91-c9d2217be582", "id": "9a832735-dcfa-42cc-ad15-6be5b898a160",
"prevId": "00000000-0000-0000-0000-000000000000", "prevId": "00000000-0000-0000-0000-000000000000",
"tables": { "tables": {
"account": { "account": {
@ -630,16 +630,7 @@
"autoincrement": false "autoincrement": false
} }
}, },
"indexes": { "indexes": {},
"measurement_dayId_metricId_unique": {
"name": "measurement_dayId_metricId_unique",
"columns": [
"dayId",
"metricId"
],
"isUnique": true
}
},
"foreignKeys": { "foreignKeys": {
"measurement_hourId_hour_id_fk": { "measurement_hourId_hour_id_fk": {
"name": "measurement_hourId_hour_id_fk", "name": "measurement_hourId_hour_id_fk",
@ -753,7 +744,7 @@
"name": "icon", "name": "icon",
"type": "text", "type": "text",
"primaryKey": false, "primaryKey": false,
"notNull": false, "notNull": true,
"autoincrement": false "autoincrement": false
}, },
"createdAt": { "createdAt": {

View File

@ -5,8 +5,8 @@
{ {
"idx": 0, "idx": 0,
"version": "6", "version": "6",
"when": 1733533929464, "when": 1733614471710,
"tag": "0000_gorgeous_sasquatch", "tag": "0000_moaning_thor",
"breakpoints": true "breakpoints": true
} }
] ]

View File

@ -158,7 +158,7 @@ export const measurements = sqliteTable("measurement", {
value: text("value").notNull(), value: text("value").notNull(),
}, },
(m) => ({ (m) => ({
uniq: unique().on(m.dayId, m.metricId) // uniq: unique().on(m.dayId, m.metricId)
}), }),
); );