Fix some bugs
This commit is contained in:
parent
7e46f2c38d
commit
57d4c18527
@ -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 (
|
||||||
|
|||||||
@ -12,6 +12,8 @@ export function DayMetrics({
|
|||||||
const [day, setDay] = useState(initialDay);
|
const [day, setDay] = useState(initialDay);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<LoadingSpinner />
|
<span>
|
||||||
|
|
||||||
|
</span>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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>
|
||||||
)
|
)
|
||||||
)}
|
)}
|
||||||
|
|||||||
@ -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))}>
|
||||||
|
|||||||
@ -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>
|
||||||
@ -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`);
|
||||||
@ -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": {
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -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)
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user