From 7539b8a57749b674d208a6bb45e2d883fdcce2ff Mon Sep 17 00:00:00 2001 From: andrzej Date: Fri, 14 Jun 2024 11:42:31 +0200 Subject: [PATCH] working shadcn date picker --- package-lock.json | 71 +++++++++++ package.json | 4 + src/@/components/ui/calendar.tsx | 66 ++++++++++ src/@/components/ui/popover.tsx | 31 +++++ src/app/tailwind.css | 181 ++++++++++++++++++++++++++++ src/app/ui/forms/datePickerDemo.tsx | 103 ++++++++++++++++ src/app/ui/forms/sub.tsx | 58 ++++++++- submissions | Bin 40960 -> 0 bytes 8 files changed, 513 insertions(+), 1 deletion(-) create mode 100644 src/@/components/ui/calendar.tsx create mode 100644 src/@/components/ui/popover.tsx create mode 100644 src/app/ui/forms/datePickerDemo.tsx delete mode 100644 submissions diff --git a/package-lock.json b/package-lock.json index cd64a05..6198408 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,16 +12,20 @@ "@prisma/client": "^5.15.0", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-toast": "^1.1.5", "@tanstack/react-table": "^8.17.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "date-fns": "^3.6.0", "lucide-react": "^0.394.0", "next": "14.2.3", "react": "^18", + "react-day-picker": "^8.10.1", "react-dom": "^18", "react-hook-form": "^7.51.5", "tailwind-merge": "^2.3.0", @@ -802,6 +806,14 @@ } } }, + "node_modules/@radix-ui/react-icons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-icons/-/react-icons-1.3.0.tgz", + "integrity": "sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==", + "peerDependencies": { + "react": "^16.x || ^17.x || ^18.x" + } + }, "node_modules/@radix-ui/react-id": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", @@ -883,6 +895,43 @@ } } }, + "node_modules/@radix-ui/react-popover": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.0.7.tgz", + "integrity": "sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/primitive": "1.0.1", + "@radix-ui/react-compose-refs": "1.0.1", + "@radix-ui/react-context": "1.0.1", + "@radix-ui/react-dismissable-layer": "1.0.5", + "@radix-ui/react-focus-guards": "1.0.1", + "@radix-ui/react-focus-scope": "1.0.4", + "@radix-ui/react-id": "1.0.1", + "@radix-ui/react-popper": "1.1.3", + "@radix-ui/react-portal": "1.0.4", + "@radix-ui/react-presence": "1.0.1", + "@radix-ui/react-primitive": "1.0.3", + "@radix-ui/react-slot": "1.0.2", + "@radix-ui/react-use-controllable-state": "1.0.1", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.5" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz", @@ -2231,6 +2280,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", @@ -4936,6 +4994,19 @@ "node": ">=0.10.0" } }, + "node_modules/react-day-picker": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", + "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0 || ^3.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", diff --git a/package.json b/package.json index 913ff23..d1453d1 100644 --- a/package.json +++ b/package.json @@ -14,16 +14,20 @@ "@prisma/client": "^5.15.0", "@radix-ui/react-checkbox": "^1.0.4", "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-toast": "^1.1.5", "@tanstack/react-table": "^8.17.3", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", + "date-fns": "^3.6.0", "lucide-react": "^0.394.0", "next": "14.2.3", "react": "^18", + "react-day-picker": "^8.10.1", "react-dom": "^18", "react-hook-form": "^7.51.5", "tailwind-merge": "^2.3.0", diff --git a/src/@/components/ui/calendar.tsx b/src/@/components/ui/calendar.tsx new file mode 100644 index 0000000..2f02434 --- /dev/null +++ b/src/@/components/ui/calendar.tsx @@ -0,0 +1,66 @@ +"use client" + +import * as React from "react" +import { ChevronLeft, ChevronRight } from "lucide-react" +import { DayPicker } from "react-day-picker" + +import { cn } from "@/lib/utils" +import { buttonVariants } from "@/components/ui/button" + +export type CalendarProps = React.ComponentProps + +function Calendar({ + className, + classNames, + showOutsideDays = true, + ...props +}: CalendarProps) { + return ( + , + IconRight: ({ ...props }) => , + }} + {...props} + /> + ) +} +Calendar.displayName = "Calendar" + +export { Calendar } diff --git a/src/@/components/ui/popover.tsx b/src/@/components/ui/popover.tsx new file mode 100644 index 0000000..a0ec48b --- /dev/null +++ b/src/@/components/ui/popover.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import * as PopoverPrimitive from "@radix-ui/react-popover" + +import { cn } from "@/lib/utils" + +const Popover = PopoverPrimitive.Root + +const PopoverTrigger = PopoverPrimitive.Trigger + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = "center", sideOffset = 4, ...props }, ref) => ( + + + +)) +PopoverContent.displayName = PopoverPrimitive.Content.displayName + +export { Popover, PopoverTrigger, PopoverContent } diff --git a/src/app/tailwind.css b/src/app/tailwind.css index d534ecb..52b9544 100644 --- a/src/app/tailwind.css +++ b/src/app/tailwind.css @@ -604,6 +604,10 @@ body { pointer-events: auto; } +.invisible { + visibility: hidden; +} + .fixed { position: fixed; } @@ -632,6 +636,14 @@ body { top: 0.5rem; } +.left-1 { + left: 0.25rem; +} + +.right-1 { + right: 0.25rem; +} + .z-50 { z-index: 50; } @@ -743,6 +755,10 @@ body { height: 2rem; } +.h-7 { + height: 1.75rem; +} + .max-h-96 { max-height: 24rem; } @@ -783,6 +799,26 @@ body { width: 66.666667%; } +.w-72 { + width: 18rem; +} + +.w-7 { + width: 1.75rem; +} + +.w-9 { + width: 2.25rem; +} + +.w-\[240px\] { + width: 240px; +} + +.w-auto { + width: auto; +} + .min-w-\[8rem\] { min-width: 8rem; } @@ -803,6 +839,10 @@ body { caption-side: bottom; } +.border-collapse { + border-collapse: collapse; +} + .cursor-default { cursor: default; } @@ -817,6 +857,10 @@ body { flex-direction: row; } +.flex-col { + flex-direction: column; +} + .flex-col-reverse { flex-direction: column-reverse; } @@ -887,6 +931,24 @@ body { margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); } +.space-x-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.25rem * var(--tw-space-x-reverse)); + margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + .overflow-auto { overflow: auto; } @@ -968,6 +1030,10 @@ body { background-color: transparent; } +.bg-accent { + background-color: hsl(var(--accent)); +} + .fill-current { fill: currentColor; } @@ -984,6 +1050,14 @@ body { padding: 1.5rem; } +.p-0 { + padding: 0px; +} + +.p-3 { + padding: 0.75rem; +} + .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; @@ -1041,6 +1115,14 @@ body { padding-right: 2rem; } +.pt-1 { + padding-top: 0.25rem; +} + +.pl-3 { + padding-left: 0.75rem; +} + .text-left { text-align: left; } @@ -1073,6 +1155,10 @@ body { line-height: 1rem; } +.text-\[0\.8rem\] { + font-size: 0.8rem; +} + .font-black { font-weight: 900; } @@ -1146,6 +1232,10 @@ body { color: hsl(var(--foreground) / 0.5); } +.text-accent-foreground { + color: hsl(var(--accent-foreground)); +} + .underline { text-decoration-line: underline; } @@ -1256,6 +1346,14 @@ body { color: hsl(var(--muted-foreground)); } +.focus-within\:relative:focus-within { + position: relative; +} + +.focus-within\:z-20:focus-within { + z-index: 20; +} + .hover\:bg-accent:hover { background-color: hsl(var(--accent)); } @@ -1280,6 +1378,10 @@ body { background-color: hsl(var(--secondary)); } +.hover\:bg-primary:hover { + background-color: hsl(var(--primary)); +} + .hover\:text-accent-foreground:hover { color: hsl(var(--accent-foreground)); } @@ -1288,18 +1390,34 @@ body { color: hsl(var(--foreground)); } +.hover\:text-primary-foreground:hover { + color: hsl(var(--primary-foreground)); +} + .hover\:underline:hover { text-decoration-line: underline; } +.hover\:opacity-100:hover { + opacity: 1; +} + .focus\:bg-accent:focus { background-color: hsl(var(--accent)); } +.focus\:bg-primary:focus { + background-color: hsl(var(--primary)); +} + .focus\:text-accent-foreground:focus { color: hsl(var(--accent-foreground)); } +.focus\:text-primary-foreground:focus { + color: hsl(var(--primary-foreground)); +} + .focus\:opacity-100:focus { opacity: 1; } @@ -1405,6 +1523,30 @@ body { opacity: 0.7; } +.aria-selected\:bg-accent[aria-selected="true"] { + background-color: hsl(var(--accent)); +} + +.aria-selected\:bg-accent\/50[aria-selected="true"] { + background-color: hsl(var(--accent) / 0.5); +} + +.aria-selected\:text-accent-foreground[aria-selected="true"] { + color: hsl(var(--accent-foreground)); +} + +.aria-selected\:text-muted-foreground[aria-selected="true"] { + color: hsl(var(--muted-foreground)); +} + +.aria-selected\:opacity-100[aria-selected="true"] { + opacity: 1; +} + +.aria-selected\:opacity-30[aria-selected="true"] { + opacity: 0.3; +} + .data-\[disabled\]\:pointer-events-none[data-disabled] { pointer-events: none; } @@ -1555,10 +1697,26 @@ body { top: auto; } + .sm\:flex-row { + flex-direction: row; + } + .sm\:flex-col { flex-direction: column; } + .sm\:space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); + } + + .sm\:space-y-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0px * var(--tw-space-y-reverse)); + } + .data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open] { --tw-enter-translate-y: 100%; } @@ -1570,6 +1728,29 @@ body { } } +.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]) { + background-color: hsl(var(--accent)); +} + +.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:has([aria-selected]):first-child { + border-top-left-radius: calc(var(--radius) - 2px); + border-bottom-left-radius: calc(var(--radius) - 2px); +} + +.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:has([aria-selected]):last-child { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside) { + background-color: hsl(var(--accent) / 0.5); +} + +.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end) { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + .\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]) { padding-right: 0px; } diff --git a/src/app/ui/forms/datePickerDemo.tsx b/src/app/ui/forms/datePickerDemo.tsx new file mode 100644 index 0000000..f51de2b --- /dev/null +++ b/src/app/ui/forms/datePickerDemo.tsx @@ -0,0 +1,103 @@ +"use client" + +import { zodResolver } from "@hookform/resolvers/zod" +import { CalendarIcon } from "@radix-ui/react-icons" +import { format } from "date-fns" +import { useForm } from "react-hook-form" +import { z } from "zod" + +import { cn } from "@/lib/utils" +import { Button } from "@/components/ui/button" +import { Calendar } from "@/components/ui/calendar" +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from "@/components/ui/form" +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover" +import { toast } from "@/components/ui/use-toast" + +const FormSchema = z.object({ + dob: z.date({ + required_error: "A date of birth is required.", + }), +}) + +export function DatePickerForm() { + const form = useForm>({ + resolver: zodResolver(FormSchema), + }) + + function onSubmit(data: z.infer) { + toast({ + title: "You submitted the following values:", + description: ( +
+					{JSON.stringify(data, null, 2)}
+				
+ ), + }) + } + + return ( +
+ + ( + + Date of birth + + + + + + + + + date > new Date() || date < new Date("1900-01-01") + } + initialFocus + /> + + + + Your date of birth is used to calculate your age. + + + + )} + /> + + + + + ) +} + diff --git a/src/app/ui/forms/sub.tsx b/src/app/ui/forms/sub.tsx index 2e66892..8c574f9 100644 --- a/src/app/ui/forms/sub.tsx +++ b/src/app/ui/forms/sub.tsx @@ -5,6 +5,16 @@ import { zodResolver } from "@hookform/resolvers/zod" import { useForm } from "react-hook-form" import { Button } from "@/components/ui/button" import { toast } from "@/components/ui/use-toast" +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover" + +import { Calendar } from "@/components/ui/calendar" +import { CalendarIcon } from "@radix-ui/react-icons" +import { cn } from "@/lib/utils" +import { format } from "date-fns" import { Form, FormItem, @@ -26,7 +36,7 @@ import { ItemText, SelectItemIndicator, SelectItemText } from "@radix-ui/react-s const FormSchema = z.object({ storyId: z.string(), pubId: z.string(), - // submitted: z.date(), + submitted: z.date(), // responded: z.date(), // responseId: z.string() }) @@ -131,6 +141,52 @@ export default function SubmissionForm({ stories, pubs, responses }) { )} /> + ( + + Date of birth + + + + + + + + + date > new Date() || date < new Date("1900-01-01") + } + initialFocus + /> + + + + The date you sent it + + + + )} + /> + + diff --git a/submissions b/submissions deleted file mode 100644 index 9be69fd04a29f40eca7794150ccae6efefe5db98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40960 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