From 0baa3843d86183492e45aba226f5ef515431976d Mon Sep 17 00:00:00 2001 From: Dennis Date: Sat, 15 Jun 2024 17:43:14 -0700 Subject: [PATCH 1/5] get side sheet working and have a simple dropdown menu to do google searches on names --- web/package.json | 5 +- web/src/components/ui/dropdown-menu.tsx | 198 ++++++ web/src/pages/maps/DropdownMenuComponent.tsx | 135 ++++ web/src/pages/maps/Sheet.tsx | 100 ++- web/src/pages/maps/index.tsx | 173 +++-- yarn.lock | 684 ++++++++++--------- 6 files changed, 905 insertions(+), 390 deletions(-) create mode 100644 web/src/components/ui/dropdown-menu.tsx create mode 100644 web/src/pages/maps/DropdownMenuComponent.tsx diff --git a/web/package.json b/web/package.json index 1bee1cf..89af966 100644 --- a/web/package.json +++ b/web/package.json @@ -14,20 +14,23 @@ "@hookform/resolvers": "^3.3.4", "@radix-ui/react-collapsible": "^1.0.3", "@radix-ui/react-dialog": "^1.0.5", + "@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-slot": "^1.0.2", "@radix-ui/themes": "^3.0.3", + "change-case": "^5.4.4", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "deck.gl": "^9.0.17", "lucide-react": "^0.378.0", "mapbox-gl": "^3.4.0", - "next": "14.0.4", + "next": "^14.2.4", "react": "^18", "react-dom": "^18", "react-hook-form": "^7.51.4", "react-map-gl": "^7.1.7", + "react-router-dom": "^6.23.1", "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", "zod": "3.22.4" diff --git a/web/src/components/ui/dropdown-menu.tsx b/web/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..769ff7a --- /dev/null +++ b/web/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,198 @@ +import * as React from "react" +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" +import { Check, ChevronRight, Circle } from "lucide-react" + +import { cn } from "@/lib/utils" + +const DropdownMenu = DropdownMenuPrimitive.Root + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger + +const DropdownMenuGroup = DropdownMenuPrimitive.Group + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal + +const DropdownMenuSub = DropdownMenuPrimitive.Sub + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)) +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)) +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)) +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean + } +>(({ className, inset, ...props }, ref) => ( + +)) +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ) +} +DropdownMenuShortcut.displayName = "DropdownMenuShortcut" + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +} diff --git a/web/src/pages/maps/DropdownMenuComponent.tsx b/web/src/pages/maps/DropdownMenuComponent.tsx new file mode 100644 index 0000000..684eeaf --- /dev/null +++ b/web/src/pages/maps/DropdownMenuComponent.tsx @@ -0,0 +1,135 @@ +import React, { useState } from "react"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Button } from "@/components/ui/button"; +import { ChevronRightIcon } from "@radix-ui/react-icons"; + +// 2 buttons +// 1. do a google search for the person +// 2. do a specific google search with filetype PDF, name, sheets +// 3. edit the name, then do a google search +// 4. click on edit and it turns the component into an input field with a save button +// 5. investor search? + +const dorkingString = "filetype:pdf OR filetype:xlsx OR filetype:docx"; + +interface DropdownMenuComponentProps { + onEdit: () => void; + onRevert: () => void; +} + +interface DropdownMenuComponentProps { + actions: { label: string; action: () => void }[]; +} + +export default function DropdownMenuComponent({ + fullName, +}: // actions, +{ + fullName: string; + onEdit: () => void; + onRevert: () => void; +}) { + return ( + + + + + + My Account + + + { + const encodedName = encodeURIComponent( + '"' + fullName + '"' + " " + dorkingString + ); + const searchUrl = `https://www.google.com/search?q=${encodedName}`; + window.open(searchUrl, "_blank"); + }} + > + Profile Scan + ⇧⌘P + + { + const encodedName = encodeURIComponent('"' + fullName + '"'); + const searchUrl = `https://www.google.com/search?q=${encodedName}`; + window.open(searchUrl, "_blank"); + }} + > + Quote Google Search + ⌘B + + + {/* true people search + https://www.truepeoplesearch.com/results?name=Boesch%20Peter&citystatezip=San%20Francisco,%20CA */} + + { + const encodedName = encodeURIComponent(fullName); + const searchUrl = `https://www.truepeoplesearch.com/results?name=${encodedName}&citystatezip=${encodeURIComponent( + "San Francisco, CA" + )}`; + window.open(searchUrl, "_blank"); + }} + > + True People Search + ⌘S + + + + + {/* {actions.map((item, index) => ( + + {item.label} + + ))} */} + {/* Edit + + Revert to Original + */} + Team + + Invite users + + + Email + Message + + More... + + + + + New Team + ⌘+T + + + + GitHub + Support + API + + + Log out + ⇧⌘Q + + + + ); +} diff --git a/web/src/pages/maps/Sheet.tsx b/web/src/pages/maps/Sheet.tsx index 5e90bea..6ea9d43 100644 --- a/web/src/pages/maps/Sheet.tsx +++ b/web/src/pages/maps/Sheet.tsx @@ -11,31 +11,123 @@ import { SheetTitle, SheetTrigger, } from "@/components/ui/sheet"; +import { Datatype2 } from "."; +import * as changeCase from "change-case"; +import { ChevronRightIcon } from "@radix-ui/react-icons"; +import DropdownMenuComponent from "./DropdownMenuComponent"; +import { useEffect, useState } from "react"; +import { useRouter } from "next/router"; export function SheetDemo({ isSheetOpen, + propertyData, }: // onClose, { isSheetOpen: boolean; + propertyData: Datatype2; // onClose: () => void; }) { + const { + apn, + block, + booknumber, + booktype, + createdat, + documentdate, + documentid, + filingcode, + grantee, + grantor, + id, + latitude, + longitude, + lot, + nameinternalid, + names, + numberofpages, + primarydocnumber, + secondarydocnumber, + totalnamescount, + updatedat, + } = propertyData; + + const router = useRouter(); + const [currentPropertyData, setCurrentPropertyData] = + useState(null); + + const grantorSplit = grantor.split(","); + const granteeSplit = grantee.split(","); + + const grantorSplitFormated = grantorSplit.map((item) => + changeCase.capitalCase(item) + ); + const granteeSplitFormated = granteeSplit.map((item) => + changeCase.capitalCase(item) + ); + + const [editMode, setEditMode] = useState(false); + const [currentItem, setCurrentItem] = useState(propertyData.grantee); + const [originalItem, setOriginalItem] = useState(propertyData.grantee); + + const handleEdit = () => { + setEditMode(true); + }; + + const handleSave = () => { + setOriginalItem(currentItem); + setEditMode(false); + }; + + const handleRevert = () => { + setCurrentItem(originalItem); + setEditMode(false); + }; + return ( - Edit profile + APN: {apn} Make changes to your profile here. Click save when you're done.
- {/*
+ + {/* */} +
+ {grantorSplitFormated.map((item, index) => ( +
+ {item} +
+ ))} +
{/* diff --git a/web/src/pages/maps/index.tsx b/web/src/pages/maps/index.tsx index 2a6718d..21509ad 100644 --- a/web/src/pages/maps/index.tsx +++ b/web/src/pages/maps/index.tsx @@ -7,6 +7,8 @@ import { Database } from "@/generated/db"; import { PickingInfo } from "@deck.gl/core"; import { MjolnirEvent } from "mjolnir.js"; import { SheetDemo } from "./Sheet"; +// import { useNavigate, useLocation } from "react-router-dom"; +import { useRouter } from "next/router"; const supabaseUrl = "https://dimmbajebuxcomgzbzrj.supabase.co"; // Your Supabase Project URL const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!; // Your Supabase Key @@ -52,7 +54,6 @@ const usePaginatedData = () => { if (error) { console.error(error); } else { - console.log(newData, "prevData"); setData((prevData) => [...(prevData || []), ...newData]); } }; @@ -63,43 +64,59 @@ const usePaginatedData = () => { return { data, setPage }; }; -const useIncrementalData = () => { - const [data, setData] = useState([]); - const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)); - - const fetchData = async () => { - let offset = 0; - const limit = 20000; - while (offset < 300000) { - const { data: newData, error } = await supabase - .from("postgrespropertydocuments4") - .select("*") - .range(offset, offset + limit - 1); - if (error) console.error(error); - else setData((prev) => [...prev, ...newData]); - await delay(500); // Wait for 1 second before fetching next batch - offset += limit; - } - }; - - useEffect(() => { - fetchData(); - }, []); - - return { data }; -}; - type DataType = { from: [longitude: number, latitude: number]; to: [longitude: number, latitude: number]; }; -type Datatype2 = { +export type Datatype2 = { longitude: number; latitude: number; message: string; grantee: string; grantor: string; + apn: string; + block: string; + booknumber: string; + booktype: string; + createdat: string; + documentdate: string; + documentid: string; + filingcode: string; + id: number; + lot: string; + nameinternalid: string; + names: string; + numberofpages: number; + primarydocnumber: string; + secondarydocnumber: string; + totalnamescount: number; + updatedat: string; +}; + +const defaultPropertyData: Datatype2 = { + longitude: 0, + latitude: 0, + message: "", + grantee: "", + grantor: "", + apn: "", + block: "", + booknumber: "", + booktype: "", + createdat: "", + documentdate: "", + documentid: "", + filingcode: "", + id: 0, + lot: "", + nameinternalid: "", + names: "", + numberofpages: 0, + primarydocnumber: "", + secondarydocnumber: "", + totalnamescount: 0, + updatedat: "", }; const MapComponent = () => { @@ -110,19 +127,41 @@ const MapComponent = () => { longitude: -122.4376, zoom: 8, }); + const router = useRouter(); const [isSheetOpen, setSheetOpen] = useState(false); const [selectedDataPoint, setSelectedDataPoint] = useState(); - const onClick2 = useCallback( - (info: PickingInfo, event: MjolnirEvent) => { - setSheetOpen(true); - setSelectedDataPoint(info.object as Datatype2); - console.log("Clicked:", info, event); - }, - [] - ); + const useIncrementalData = () => { + const [data, setData] = useState([]); + const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)); + + const fetchData = async () => { + let offset = 0; + const limit = 20000; + while (offset < 300000) { + const { data: newData, error } = await supabase + .from("postgrespropertydocuments4") + .select("*") + .range(offset, offset + limit - 1); + if (error) console.error(error); + else + setData((prev) => { + const updatedData = [...prev, ...newData]; + return updatedData; + }); + await delay(100); // Wait for 1 second before fetching next batch + offset += limit; + } + }; + + useEffect(() => { + fetchData(); + }, []); + + return { data }; + }; // Callback to populate the default tooltip with content const getTooltip = useCallback(({ object }: PickingInfo) => { @@ -143,9 +182,8 @@ const MapComponent = () => { const { data: data2 } = useIncrementalData(); - const onClick = useCallback((info: PickingInfo, event: MjolnirEvent) => { - console.log("Clicked:", info, event); - }, []); + const onClick = useCallback((info: PickingInfo, event: MjolnirEvent) => {}, + []); const scatterplotLayer = new ScatterplotLayer({ id: "scatterplot-layer", @@ -154,24 +192,63 @@ const MapComponent = () => { getRadius: (d) => 15, getColor: (d) => [255, 140, 0], pickable: true, - // highlightColor: [0, 0, 128, 128], + highlightColor: [0, 0, 128, 128], autoHighlight: true, // onHover: (info: PickingInfo, event: MjolnirEvent) => // console.log("Hovered:", info, event), - onClick: onClick2, + // onClick: onClick2, }); // console.log(scatterplotLayer, "scatterplotLayer"); const onClickBesidesScatterPlotLayer = useCallback( - (info: PickingInfo, event: MjolnirEvent) => { - console.log("Clicked:", info, event); - if (!info.layer) { - console.log("no layer clicked"); + (info: PickingInfo, event: MjolnirEvent) => { + if (info.object) { + setSelectedDataPoint(info.object); + const queryParams = new URLSearchParams( + router.query as Record + ); + queryParams.set("selected", info.object.id.toString()); + router.replace( + { + pathname: router.pathname, + query: queryParams.toString(), + }, + undefined, + { shallow: true } + ); + + // Update localStorage cache + const dataPointsCache = JSON.parse( + localStorage.getItem("dataPointsCache") || "[]" + ); + dataPointsCache.push(info.object); + if (dataPointsCache.length > 10) { + dataPointsCache.shift(); // Remove the oldest entry if exceeding 10 + } + localStorage.setItem( + "dataPointsCache", + JSON.stringify(dataPointsCache) + ); + localStorage.setItem("selectedDataPoint", JSON.stringify(info.object)); + } else { setSelectedDataPoint(null); + localStorage.removeItem("selectedDataPoint"); + const queryParams = new URLSearchParams( + router.query as Record + ); + queryParams.delete("selected"); + router.replace( + { + pathname: router.pathname, + query: queryParams.toString(), + }, + undefined, + { shallow: true } + ); } }, - [] + [router] ); return ( @@ -190,9 +267,7 @@ const MapComponent = () => { > { - // setSheetOpen(false); - // }} + propertyData={selectedDataPoint || defaultPropertyData} /> =1.0.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/mapbox-gl/-/mapbox-gl-3.1.0.tgz#81b80950b2e2d8763bdb797fc0f1bd09d80e4fdb" + resolved "https://registry.npmjs.org/@types/mapbox-gl/-/mapbox-gl-3.1.0.tgz" integrity sha512-hI6cQDjw1bkJw7MC/eHMqq5TWUamLwsujnUUeiIX2KDRjxRNSYMjnHz07+LATz9I9XIsKumOtUz4gRYnZOJ/FA== dependencies: "@types/geojson" "*" @@ -1895,12 +1906,12 @@ "@types/offscreencanvas@^2019.6.4": version "2019.7.3" - resolved "https://registry.yarnpkg.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz#90267db13f64d6e9ccb5ae3eac92786a7c77a516" + resolved "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz" integrity sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A== "@types/pako@^1.0.1": version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/pako/-/pako-1.0.7.tgz#aa0e4af9855d81153a29ff84cc44cce25298eda9" + resolved "https://registry.npmjs.org/@types/pako/-/pako-1.0.7.tgz" integrity sha512-YBtzT2ztNF6R/9+UXj2wTGFnC9NklAnASt3sC0h2m1bbH7G6FyBIkt4AN8ThZpNfxUo1b2iMVO0UawiJymEt8A== "@types/pdf-parse@^1.1.4": @@ -2278,7 +2289,7 @@ arg@^5.0.2: argparse@^1.0.10: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" @@ -2304,7 +2315,7 @@ aria-query@^5.3.0: arr-union@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== array-buffer-byte-length@^1.0.0: @@ -2393,7 +2404,7 @@ arraybuffer.prototype.slice@^1.0.2: assign-symbols@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== ast-types-flow@^0.0.8: @@ -2579,15 +2590,15 @@ brace-expansion@^1.1.7: concat-map "0.0.1" braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" brotli@^1.3.2: version "1.3.3" - resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.3.tgz#7365d8cc00f12cf765d2b2c898716bcf4b604d48" + resolved "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz" integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== dependencies: base64-js "^1.1.2" @@ -2604,7 +2615,7 @@ browserslist@^4.21.10: buf-compare@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" + resolved "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz" integrity sha512-Bvx4xH00qweepGc43xFvMs5BKASXTbHaHm6+kDYIK9p/4iFwjATQkmPKHQSgJZzKbAymhztRbXUf1Nqhzl73/Q== buffer-crc32@~0.2.3: @@ -2639,14 +2650,14 @@ bytes@3.1.2: bytewise-core@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" + resolved "https://registry.npmjs.org/bytewise-core/-/bytewise-core-1.2.3.tgz" integrity sha512-nZD//kc78OOxeYtRlVk8/zXqTB4gf/nlguL1ggWA8FuchMyOxcyHR4QPQZMUmA7czC+YnaBrPUCubqAWe50DaA== dependencies: typewise-core "^1.2" bytewise@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" + resolved "https://registry.npmjs.org/bytewise/-/bytewise-1.1.0.tgz" integrity sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ== dependencies: bytewise-core "^1.2.2" @@ -2700,14 +2711,14 @@ camelcase@6: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565: - version "1.0.30001568" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz" - integrity sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A== +caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001565, caniuse-lite@^1.0.30001579: + version "1.0.30001633" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001633.tgz" + integrity sha512-6sT0yf/z5jqf8tISAgpJDrmwOpLsrpnyCdD/lOZKvKkkJK4Dn0X5i7KF7THEZhOq+30bmhwBlNEaqPUiHiKtZg== cartocolor@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/cartocolor/-/cartocolor-5.0.2.tgz#182050da45abe7f14e075df9e3a732ea4489c153" + resolved "https://registry.npmjs.org/cartocolor/-/cartocolor-5.0.2.tgz" integrity sha512-Ihb/wU5V6BVbHwapd8l/zg7bnhZ4YPFVfa7quSpL86lfkPJSf4YuNBT+EvesPRP5vSqhl6vZVsQJwCR8alBooQ== dependencies: colorbrewer "1.5.6" @@ -2729,6 +2740,11 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-case@^5.4.4: + version "5.4.4" + resolved "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz" + integrity sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w== + charenc@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" @@ -2736,7 +2752,7 @@ charenc@0.0.2: cheap-ruler@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/cheap-ruler/-/cheap-ruler-3.0.2.tgz#60d2b3a0cb77a420472c8c5bb8f2c320fba4bb87" + resolved "https://registry.npmjs.org/cheap-ruler/-/cheap-ruler-3.0.2.tgz" integrity sha512-02T332h1/HTN6cDSufLP8x4JzDs2+VC+8qZ/N0kWIVPyc2xUkWwWh3B2fJxR7raXkL4Mq7k554mfuM9ofv/vGg== chokidar@^3.5.3: @@ -2850,7 +2866,7 @@ color-support@^1.1.3: colorbrewer@1.5.6: version "1.5.6" - resolved "https://registry.yarnpkg.com/colorbrewer/-/colorbrewer-1.5.6.tgz#5b6c81bcf2ee584642375143b210a9049d9e5ab5" + resolved "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.5.6.tgz" integrity sha512-fONg2pGXyID8zNgKHBlagW8sb/AMShGzj4rRJfz5biZ7iuHQZYquSCLE/Co1oSQFmt/vvwjyezJCejQl7FG/tg== combined-stream@^1.0.8: @@ -2909,7 +2925,7 @@ cookie@0.5.0: core-assert@^0.2.0: version "0.2.1" - resolved "https://registry.yarnpkg.com/core-assert/-/core-assert-0.2.1.tgz#f85e2cf9bfed28f773cc8b3fa5c5b69bdc02fe3f" + resolved "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz" integrity sha512-IG97qShIP+nrJCXMCgkNZgH7jZQ4n8RpPyPeXX++T6avR/KhLhgLiHKoEn5Rc1KjfycSfA9DMa6m+4C4eguHhw== dependencies: buf-compare "^1.0.0" @@ -2917,7 +2933,7 @@ core-assert@^0.2.0: core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@9.0.0: @@ -2946,7 +2962,7 @@ crypt@0.0.2: csscolorparser@~1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" + resolved "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz" integrity sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w== cssesc@^3.0.0: @@ -2968,36 +2984,36 @@ csv-parser@^3.0.0: "d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.2.0: version "3.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz" integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== dependencies: internmap "1 - 2" "d3-color@1 - 3", d3-color@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + resolved "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== "d3-format@1 - 3", d3-format@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + resolved "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== d3-hexbin@^0.2.1: version "0.2.2" - resolved "https://registry.yarnpkg.com/d3-hexbin/-/d3-hexbin-0.2.2.tgz#9c5837dacfd471ab05337a9e91ef10bfc4f98831" + resolved "https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz" integrity sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w== "d3-interpolate@1.2.0 - 3": version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" d3-scale@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + resolved "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== dependencies: d3-array "2.10.0 - 3" @@ -3008,14 +3024,14 @@ d3-scale@^4.0.0: "d3-time-format@2 - 4": version "4.1.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + resolved "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz" integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== dependencies: d3-time "1 - 3" "d3-time@1 - 3", "d3-time@2.1.1 - 3": version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + resolved "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" @@ -3062,23 +3078,23 @@ decamelize@1.2.0: integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== deck.gl@^9.0.17: - version "9.0.17" - resolved "https://registry.yarnpkg.com/deck.gl/-/deck.gl-9.0.17.tgz#c90eb501aa188f0029a5b00811a32a3dd90f77c1" - integrity sha512-gBdazhIFFDaU4mFCQSQlf+6KVAxeAvq3YJtO+dKy+QwkAWQFYjnTs7E9Bzfj+wUz4V1qOg4YeUK+aYUCihFWjA== - dependencies: - "@deck.gl/aggregation-layers" "9.0.17" - "@deck.gl/arcgis" "9.0.17" - "@deck.gl/carto" "9.0.17" - "@deck.gl/core" "9.0.17" - "@deck.gl/extensions" "9.0.17" - "@deck.gl/geo-layers" "9.0.17" - "@deck.gl/google-maps" "9.0.17" - "@deck.gl/json" "9.0.17" - "@deck.gl/layers" "9.0.17" - "@deck.gl/mapbox" "9.0.17" - "@deck.gl/mesh-layers" "9.0.17" - "@deck.gl/react" "9.0.17" - "@deck.gl/widgets" "9.0.17" + version "9.0.19" + resolved "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.19.tgz" + integrity sha512-FW2m6gR+JqBhfqD8d6/OqRtOXnVeBEgIdOOhlSlSXJOFwF7xY72TecB3iGF5vmmLwbYIK85cVa2zu8Kpk/wz6Q== + dependencies: + "@deck.gl/aggregation-layers" "9.0.19" + "@deck.gl/arcgis" "9.0.19" + "@deck.gl/carto" "9.0.19" + "@deck.gl/core" "9.0.19" + "@deck.gl/extensions" "9.0.19" + "@deck.gl/geo-layers" "9.0.19" + "@deck.gl/google-maps" "9.0.19" + "@deck.gl/json" "9.0.19" + "@deck.gl/layers" "9.0.19" + "@deck.gl/mapbox" "9.0.19" + "@deck.gl/mesh-layers" "9.0.19" + "@deck.gl/react" "9.0.19" + "@deck.gl/widgets" "9.0.19" "@loaders.gl/core" "^4.2.0" "@luma.gl/core" "^9.0.14" "@luma.gl/engine" "^9.0.14" @@ -3102,7 +3118,7 @@ deep-is@^0.1.3: deep-strict-equal@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz#4a078147a8ab57f6a0d4f5547243cd22f44eb4e4" + resolved "https://registry.npmjs.org/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz" integrity sha512-3daSWyvZ/zwJvuMGlzG1O+Ow0YSadGfb3jsh9xoCutv2tWyB9dA4YvR9L9/fSdDZa2dByYQe+TqapSGUrjnkoA== dependencies: core-assert "^0.2.0" @@ -3220,12 +3236,12 @@ dotenv@^16.4.5: draco3d@1.5.7: version "1.5.7" - resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.7.tgz#94f9bce293eb8920c159dc91a4ce9124a9e899e0" + resolved "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz" integrity sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ== earcut@^2.2.4: version "2.2.4" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" + resolved "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz" integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== ee-first@1.1.1: @@ -3686,7 +3702,7 @@ esrecurse@^4.3.0: esri-loader@^3.7.0: version "3.7.0" - resolved "https://registry.yarnpkg.com/esri-loader/-/esri-loader-3.7.0.tgz#be2432664f53d4878b34ab903499248bbca3e087" + resolved "https://registry.npmjs.org/esri-loader/-/esri-loader-3.7.0.tgz" integrity sha512-cB1Sw9EQjtW4mtT7eFBjn/6VaaIWNTjmTd2asnnEyuZk1xVSFRMCfLZSBSjZM7ZarDcVu5WIjOP0t0MYVu4hVQ== estraverse@^4.1.1: @@ -3768,21 +3784,21 @@ express@^4.18.2: expression-eval@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/expression-eval/-/expression-eval-5.0.1.tgz#845758fa9ba64d9edc7b6804ae404934a6cfee6b" + resolved "https://registry.npmjs.org/expression-eval/-/expression-eval-5.0.1.tgz" integrity sha512-7SL4miKp19lI834/F6y156xlNg+i9Q41tteuGNCq9C06S78f1bm3BXuvf0+QpQxv369Pv/P2R7Hb17hzxLpbDA== dependencies: jsep "^0.3.0" extend-shallow@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== dependencies: assign-symbols "^1.0.0" @@ -3837,7 +3853,7 @@ fast-levenshtein@^2.0.6: fast-xml-parser@^4.2.5: version "4.4.0" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz" integrity sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg== dependencies: strnum "^1.0.5" @@ -3866,12 +3882,12 @@ fetch-blob@^3.1.2, fetch-blob@^3.1.4: fflate@0.7.4: version "0.7.4" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.7.4.tgz#61587e5d958fdabb5a9368a302c25363f4f69f50" + resolved "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz" integrity sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw== fflate@^0.8.1: version "0.8.2" - resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + resolved "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz" integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== file-entry-cache@^6.0.1: @@ -3886,10 +3902,10 @@ file-uri-to-path@1.0.0: resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -4056,7 +4072,7 @@ gauge@^4.0.3: geojson-vt@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" + resolved "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz" integrity sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg== get-caller-file@^2.0.5: @@ -4113,7 +4129,7 @@ get-uri@^6.0.1: get-value@^2.0.2, get-value@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== github-from-package@0.0.0: @@ -4123,7 +4139,7 @@ github-from-package@0.0.0: gl-matrix@^3.0.0, gl-matrix@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" + resolved "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz" integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== glob-parent@^5.1.2, glob-parent@~5.1.2: @@ -4140,11 +4156,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - glob@7.1.6, glob@^7.1.4: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" @@ -4214,7 +4225,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4226,17 +4237,17 @@ graphemer@^1.4.0: grid-index@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.1.0.tgz#97f8221edec1026c8377b86446a7c71e79522ea7" + resolved "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz" integrity sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA== h3-js@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/h3-js/-/h3-js-4.1.0.tgz#f8c4a8ad36612489a954f1a0bb3f4b7657d364e5" + resolved "https://registry.npmjs.org/h3-js/-/h3-js-4.1.0.tgz" integrity sha512-LQhmMl1dRQQjMXPzJc7MpZ/CqPOWWuAvVEoVJM9n/s7vHypj+c3Pd5rLQCkAsOgAoAYKbNCsYFE++LF7MvSfCQ== hammerjs@^2.0.8: version "2.0.8" - resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1" + resolved "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz" integrity sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ== has-bigints@^1.0.1, has-bigints@^1.0.2: @@ -4380,12 +4391,12 @@ ignore@^5.2.0: image-size@^0.7.4: version "0.7.5" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.5.tgz#269f357cf5797cb44683dfa99790e54c705ead04" + resolved "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz" integrity sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g== immediate@~3.0.5: version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== import-fresh@^3.2.1, import-fresh@^3.3.0: @@ -4440,7 +4451,7 @@ internal-slot@^1.0.5: "internmap@1 - 2": version "2.0.3" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + resolved "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== invariant@^2.2.4: @@ -4537,17 +4548,17 @@ is-date-object@^1.0.1, is-date-object@^1.0.5: is-error@^2.2.0: version "2.2.2" - resolved "https://registry.yarnpkg.com/is-error/-/is-error-2.2.2.tgz#c10ade187b3c93510c5470a5567833ee25649843" + resolved "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz" integrity sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== is-extendable@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" @@ -4617,7 +4628,7 @@ is-path-inside@^3.0.3: is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" @@ -4690,7 +4701,7 @@ isarray@^2.0.5: isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: @@ -4700,7 +4711,7 @@ isexe@^2.0.0: isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== iterator.prototype@^1.1.2: @@ -4745,7 +4756,7 @@ jsbn@1.1.0: jsep@^0.3.0: version "0.3.5" - resolved "https://registry.yarnpkg.com/jsep/-/jsep-0.3.5.tgz#3fd79ebd92f6f434e4857d5272aaeef7d948264d" + resolved "https://registry.npmjs.org/jsep/-/jsep-0.3.5.tgz" integrity sha512-AoRLBDc6JNnKjNcmonituEABS5bcfqDhQAWWXNTFrqu6nVXBpBAGfcoTGZMFlIrh9FjmE1CQyX9CTNwZrXMMDA== json-buffer@3.0.1: @@ -4770,7 +4781,7 @@ json-stable-stringify-without-jsonify@^1.0.1: json-stringify-pretty-compact@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz#f71ef9d82ef16483a407869556588e91b681d9ab" + resolved "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-3.0.0.tgz" integrity sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA== json5@^1.0.2: @@ -4806,7 +4817,7 @@ jsonpointer@^5.0.1: jszip@^3.1.5: version "3.10.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + resolved "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz" integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: lie "~3.3.0" @@ -4816,7 +4827,7 @@ jszip@^3.1.5: kdbush@^4.0.1, kdbush@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-4.0.2.tgz#2f7b7246328b4657dd122b6c7f025fbc2c868e39" + resolved "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz" integrity sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA== keyv@^4.5.3: @@ -4828,7 +4839,7 @@ keyv@^4.5.3: ktx-parse@^0.0.4: version "0.0.4" - resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-0.0.4.tgz#6fd3eca82490de8a1e48cb8367a9980451fa1ac4" + resolved "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.0.4.tgz" integrity sha512-LY3nrmfXl+wZZdPxgJ3ZmLvG+wkOZZP3/dr4RbQj1Pk3Qwz44esOOSFFVQJcNWpXAtiNIC66WgXufX/SYgYz6A== langchain@^0.0.202: @@ -4893,7 +4904,7 @@ levn@^0.4.1: lie@~3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + resolved "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" @@ -4922,7 +4933,7 @@ locate-path@^6.0.0: lodash.clonedeep@^4.5.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== lodash.merge@^4.6.2: @@ -4932,12 +4943,12 @@ lodash.merge@^4.6.2: long@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" + resolved "https://registry.npmjs.org/long/-/long-3.2.0.tgz" integrity sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg== long@^5.2.1: version "5.2.3" - resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: @@ -4966,12 +4977,12 @@ lucide-react@^0.378.0: lz4js@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/lz4js/-/lz4js-0.2.0.tgz#09f1a397cb2158f675146c3351dde85058cb322f" + resolved "https://registry.npmjs.org/lz4js/-/lz4js-0.2.0.tgz" integrity sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg== lzo-wasm@^0.0.4: version "0.0.4" - resolved "https://registry.yarnpkg.com/lzo-wasm/-/lzo-wasm-0.0.4.tgz#49152521a0b67a1da3a3e113dd38f150f303230a" + resolved "https://registry.npmjs.org/lzo-wasm/-/lzo-wasm-0.0.4.tgz" integrity sha512-VKlnoJRFrB8SdJhlVKvW5vI1gGwcZ+mvChEXcSX6r2xDNc/Q2FD9esfBmGCuPZdrJ1feO+YcVFd2PTk0c137Gw== make-fetch-happen@^9.1.0: @@ -4998,7 +5009,7 @@ make-fetch-happen@^9.1.0: mapbox-gl@^3.4.0: version "3.4.0" - resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-3.4.0.tgz#4db6fde1748937c7c8fd956fea2557f63a37fe11" + resolved "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-3.4.0.tgz" integrity sha512-QWgL28zg/zuIOHeF8DXPvHy1UHTgO5p4Oy6ifCAHwI9/hoI9/Fruya0yI4HkDtX1OgzTLO6SHO13A781BGJvyw== dependencies: "@mapbox/jsonlint-lines-primitives" "^2.0.2" @@ -5166,7 +5177,7 @@ mitt@3.0.1: mjolnir.js@^2.7.0: version "2.7.3" - resolved "https://registry.yarnpkg.com/mjolnir.js/-/mjolnir.js-2.7.3.tgz#b71902edaa387f14c7fe6e9b1f611c0ce814240a" + resolved "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-2.7.3.tgz" integrity sha512-Z5z/+FzZqOSO3juSVKV3zcm4R2eAlWwlKMcqHmyFEJAaLILNcDKnIbnb4/kbcGyIuhtdWrzu8WOIR7uM6I34aw== dependencies: "@types/hammerjs" "^2.0.41" @@ -5220,14 +5231,14 @@ ml-tree-similarity@^1.0.0: moment-timezone@^0.5.33: version "0.5.45" - resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.45.tgz#cb685acd56bac10e69d93c536366eb65aa6bcf5c" + resolved "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz" integrity sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ== dependencies: moment "^2.29.4" moment@^2.29.4: version "2.30.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae" + resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== ms@2.0.0: @@ -5247,7 +5258,7 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1: murmurhash-js@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" + resolved "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz" integrity sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw== mz@^2.7.0: @@ -5289,29 +5300,28 @@ netmask@^2.0.2: resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -next@14.0.4: - version "14.0.4" - resolved "https://registry.npmjs.org/next/-/next-14.0.4.tgz" - integrity sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA== +next@^14.2.4: + version "14.2.4" + resolved "https://registry.npmjs.org/next/-/next-14.2.4.tgz" + integrity sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ== dependencies: - "@next/env" "14.0.4" - "@swc/helpers" "0.5.2" + "@next/env" "14.2.4" + "@swc/helpers" "0.5.5" busboy "1.6.0" - caniuse-lite "^1.0.30001406" + caniuse-lite "^1.0.30001579" graceful-fs "^4.2.11" postcss "8.4.31" styled-jsx "5.1.1" - watchpack "2.4.0" optionalDependencies: - "@next/swc-darwin-arm64" "14.0.4" - "@next/swc-darwin-x64" "14.0.4" - "@next/swc-linux-arm64-gnu" "14.0.4" - "@next/swc-linux-arm64-musl" "14.0.4" - "@next/swc-linux-x64-gnu" "14.0.4" - "@next/swc-linux-x64-musl" "14.0.4" - "@next/swc-win32-arm64-msvc" "14.0.4" - "@next/swc-win32-ia32-msvc" "14.0.4" - "@next/swc-win32-x64-msvc" "14.0.4" + "@next/swc-darwin-arm64" "14.2.4" + "@next/swc-darwin-x64" "14.2.4" + "@next/swc-linux-arm64-gnu" "14.2.4" + "@next/swc-linux-arm64-musl" "14.2.4" + "@next/swc-linux-x64-gnu" "14.2.4" + "@next/swc-linux-x64-musl" "14.2.4" + "@next/swc-win32-arm64-msvc" "14.2.4" + "@next/swc-win32-ia32-msvc" "14.2.4" + "@next/swc-win32-x64-msvc" "14.2.4" node-abi@^3.3.0: version "3.63.0" @@ -5665,7 +5675,7 @@ path-type@^4.0.0: pbf@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.2.1.tgz#b4c1b9e72af966cd82c6531691115cc0409ffe2a" + resolved "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz" integrity sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ== dependencies: ieee754 "^1.1.12" @@ -5901,12 +5911,12 @@ postgres-range@^1.1.1: potpack@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/potpack/-/potpack-2.0.0.tgz#61f4dd2dc4b3d5e996e3698c0ec9426d0e169104" + resolved "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz" integrity sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw== preact@^10.17.0: version "10.22.0" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.22.0.tgz#a50f38006ae438d255e2631cbdaf7488e6dd4e16" + resolved "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz" integrity sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw== prebuild-install@^7.1.1: @@ -5946,7 +5956,7 @@ prettier@^2.8.3: process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== progress@2.0.3: @@ -5978,7 +5988,7 @@ prop-types@^15.8.1: protocol-buffers-schema@^3.3.1: version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" + resolved "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz" integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== proxy-addr@~2.0.7: @@ -6051,7 +6061,7 @@ qs@6.11.0: quadbin@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/quadbin/-/quadbin-0.2.0.tgz#ee962448bc009967a85c463790269af136d1cccb" + resolved "https://registry.npmjs.org/quadbin/-/quadbin-0.2.0.tgz" integrity sha512-bPgyRreIsFVwKxHRY+GFdaXatNmfQ1LzaQZj7aKEz07/gL893uWREhmRZpG6UuvlGHdTOPw/NGvqLsJica2goA== dependencies: "@mapbox/tile-cover" "3.0.1" @@ -6068,7 +6078,7 @@ queue-tick@^1.0.1: quickselect@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + resolved "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== range-parser@~1.2.1: @@ -6116,7 +6126,7 @@ react-is@^16.13.1: react-map-gl@^7.1.7: version "7.1.7" - resolved "https://registry.yarnpkg.com/react-map-gl/-/react-map-gl-7.1.7.tgz#f9b7d76cccad6d0bf1627d1827a0a378696ac1d0" + resolved "https://registry.npmjs.org/react-map-gl/-/react-map-gl-7.1.7.tgz" integrity sha512-mwjc0obkBJOXCcoXQr3VoLqmqwo9vS4bXfbGsdxXzEgVCv/PM0v+1QggL7W0d/ccIy+VCjbXNlGij+PENz6VNg== dependencies: "@maplibre/maplibre-gl-style-spec" "^19.2.1" @@ -6141,6 +6151,21 @@ react-remove-scroll@2.5.5: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-router-dom@^6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.23.1.tgz#30cbf266669693e9492aa4fc0dde2541ab02322f" + integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ== + dependencies: + "@remix-run/router" "1.16.1" + react-router "6.23.1" + +react-router@6.23.1: + version "6.23.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.23.1.tgz#d08cbdbd9d6aedc13eea6e94bc6d9b29cb1c4be9" + integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ== + dependencies: + "@remix-run/router" "1.16.1" + react-style-singleton@^2.2.1: version "2.2.1" resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" @@ -6180,7 +6205,7 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: readable-stream@~2.3.6: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -6241,7 +6266,7 @@ resolve-pkg-maps@^1.0.0: resolve-protobuf-schema@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz#9ca9a9e69cf192bbdaf1006ec1973948aa4a3758" + resolved "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz" integrity sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ== dependencies: protocol-buffers-schema "^3.3.1" @@ -6295,7 +6320,7 @@ run-parallel@^1.1.9: rw@^1.3.3: version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== safe-array-concat@^1.0.1: @@ -6315,7 +6340,7 @@ safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex-test@^1.0.0: @@ -6372,7 +6397,7 @@ send@0.18.0: serialize-to-js@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/serialize-to-js/-/serialize-to-js-3.1.2.tgz#844b8a1c2d72412f68ea30da55090b3fc8e95790" + resolved "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-3.1.2.tgz" integrity sha512-owllqNuDDEimQat7EPG0tH7JjO090xKNzUtYz6X+Sk2BXDnOCilDdNLwjWeFywG9xkJul1ULvtUQa9O4pUaY0w== serve-static@1.15.0: @@ -6411,7 +6436,7 @@ set-function-name@^2.0.0, set-function-name@^2.0.1: set-value@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== dependencies: extend-shallow "^2.0.1" @@ -6421,7 +6446,7 @@ set-value@^2.0.1: setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.2.0: @@ -6486,7 +6511,7 @@ smart-buffer@^4.2.0: snappyjs@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/snappyjs/-/snappyjs-0.6.1.tgz#9bca9ff8c54b133a9cc84a71d22779e97fc51878" + resolved "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz" integrity sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg== socks-proxy-agent@^6.0.0: @@ -6517,17 +6542,17 @@ socks@^2.6.2, socks@^2.7.1: sort-asc@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/sort-asc/-/sort-asc-0.2.0.tgz#00a49e947bc25d510bfde2cbb8dffda9f50eb2fc" + resolved "https://registry.npmjs.org/sort-asc/-/sort-asc-0.2.0.tgz" integrity sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA== sort-desc@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/sort-desc/-/sort-desc-0.2.0.tgz#280c1bdafc6577887cedbad1ed2e41c037976646" + resolved "https://registry.npmjs.org/sort-desc/-/sort-desc-0.2.0.tgz" integrity sha512-NqZqyvL4VPW+RAxxXnB8gvE1kyikh8+pR+T+CXLksVRN9eiQqkQlPwqWYU0mF9Jm7UnctShlxLyAt1CaBOTL1w== sort-object@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/sort-object/-/sort-object-3.0.3.tgz#945727165f244af9dc596ad4c7605a8dee80c269" + resolved "https://registry.npmjs.org/sort-object/-/sort-object-3.0.3.tgz" integrity sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ== dependencies: bytewise "^1.1.0" @@ -6557,7 +6582,7 @@ source-map@^0.6.0, source-map@~0.6.1: split-string@^3.0.1: version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" @@ -6574,7 +6599,7 @@ sprintf-js@^1.1.3: sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sqlite3@^5.1.7: @@ -6682,7 +6707,7 @@ string_decoder@^1.1.1: string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" @@ -6711,7 +6736,7 @@ strip-json-comments@~2.0.1: strnum@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== styled-jsx@5.1.1: @@ -6746,7 +6771,7 @@ supabase@>=1.8.1: supercluster@^8.0.0: version "8.0.1" - resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-8.0.1.tgz#9946ba123538e9e9ab15de472531f604e7372df5" + resolved "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz" integrity sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ== dependencies: kdbush "^4.0.2" @@ -6882,7 +6907,7 @@ text-table@^0.2.0: texture-compressor@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/texture-compressor/-/texture-compressor-1.0.2.tgz#b5a54a9e5f9eb884d7c33b149f1f23a429465cd4" + resolved "https://registry.npmjs.org/texture-compressor/-/texture-compressor-1.0.2.tgz" integrity sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig== dependencies: argparse "^1.0.10" @@ -6909,17 +6934,17 @@ through@^2.3.8: tilebelt@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/tilebelt/-/tilebelt-1.0.1.tgz#3bbf7113b3fec468efb0d9148f4bb71ef126a21a" + resolved "https://registry.npmjs.org/tilebelt/-/tilebelt-1.0.1.tgz" integrity sha512-cxHzpa5JgsugY9NUVRH43gPaGJw/29LecAn4X7UGOP64+kB8pU4VQ3bIhSyfb5Mk4jDxwl3yk330L/EIhbJ5aw== tiny-lru@^11.2.6: version "11.2.6" - resolved "https://registry.yarnpkg.com/tiny-lru/-/tiny-lru-11.2.6.tgz#86a4fd0ad615eac1639adf92010e8b944e209fdb" + resolved "https://registry.npmjs.org/tiny-lru/-/tiny-lru-11.2.6.tgz" integrity sha512-0PU3c9PjMnltZaFo2sGYv/nnJsMjG0Cxx8X6FXHPPGjFyoo1SJDxvUXW1207rdiSxYizf31roo+GrkIByQeZoA== tinyqueue@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" + resolved "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz" integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== to-regex-range@^5.0.1: @@ -6964,16 +6989,16 @@ tslib@^1.11.1, tslib@^1.8.1: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.4.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" - integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== - -tslib@^2.0.1: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.4.0: + version "2.6.3" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" @@ -7043,7 +7068,7 @@ turbo@latest: tweakpane@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/tweakpane/-/tweakpane-4.0.3.tgz#6bb8a24706916a33d59ab0e478c2a66a9928fc60" + resolved "https://registry.npmjs.org/tweakpane/-/tweakpane-4.0.3.tgz" integrity sha512-BlcWOAe8oe4c+k9pmLBARGdWB6MVZMszayekkixQXTgkxTaYoTUpHpwVEp+3HkoamZkomodpbBf0CkguIHTgLg== type-check@^0.4.0, type-check@~0.4.0: @@ -7112,12 +7137,12 @@ typescript@^5, typescript@^5.0.0: typewise-core@^1.2, typewise-core@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" + resolved "https://registry.npmjs.org/typewise-core/-/typewise-core-1.2.0.tgz" integrity sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg== typewise@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" + resolved "https://registry.npmjs.org/typewise/-/typewise-1.0.3.tgz" integrity sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ== dependencies: typewise-core "^1.2.0" @@ -7152,7 +7177,7 @@ undici-types@~5.26.4: union-value@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== dependencies: arr-union "^3.1.0" @@ -7241,21 +7266,13 @@ vary@~1.1.2: vt-pbf@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.3.tgz#68fd150756465e2edae1cc5c048e063916dcfaac" + resolved "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz" integrity sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA== dependencies: "@mapbox/point-geometry" "0.1.0" "@mapbox/vector-tile" "^1.3.1" pbf "^3.2.1" -watchpack@2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz" @@ -7365,16 +7382,11 @@ write-file-atomic@^5.0.0: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@8.17.0: +ws@8.17.0, ws@^8.14.2: version "8.17.0" resolved "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz" integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== -ws@^8.14.2: - version "8.15.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz" - integrity sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw== - xtend@^4.0.0: version "4.0.2" resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" @@ -7438,5 +7450,5 @@ zod@3.22.4, zod@^3.22.3, zod@^3.22.4: zstd-codec@^0.1: version "0.1.4" - resolved "https://registry.yarnpkg.com/zstd-codec/-/zstd-codec-0.1.4.tgz#6abb311b63cfacbd06e72797ee6c6e1c7c65248c" + resolved "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.4.tgz" integrity sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A== From 991c889c815157551b4020f9aa3e8539b8a722a2 Mon Sep 17 00:00:00 2001 From: Dennis Date: Sat, 15 Jun 2024 20:07:05 -0700 Subject: [PATCH 2/5] clean up formatting on the sidePanel, add all the document date, filing code, documentID to the side panel and make it scrollable --- web/package.json | 1 + web/src/components/ui/scroll-area.tsx | 46 +++++++++ web/src/pages/maps/Sheet.tsx | 130 ++++++++++++++++---------- yarn.lock | 2 +- 4 files changed, 130 insertions(+), 49 deletions(-) create mode 100644 web/src/components/ui/scroll-area.tsx diff --git a/web/package.json b/web/package.json index 89af966..98fe52f 100644 --- a/web/package.json +++ b/web/package.json @@ -17,6 +17,7 @@ "@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-scroll-area": "^1.0.5", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/themes": "^3.0.3", "change-case": "^5.4.4", diff --git a/web/src/components/ui/scroll-area.tsx b/web/src/components/ui/scroll-area.tsx new file mode 100644 index 0000000..cf253cf --- /dev/null +++ b/web/src/components/ui/scroll-area.tsx @@ -0,0 +1,46 @@ +import * as React from "react" +import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area" + +import { cn } from "@/lib/utils" + +const ScrollArea = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + {children} + + + + +)) +ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName + +const ScrollBar = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, orientation = "vertical", ...props }, ref) => ( + + + +)) +ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName + +export { ScrollArea, ScrollBar } diff --git a/web/src/pages/maps/Sheet.tsx b/web/src/pages/maps/Sheet.tsx index 6ea9d43..1945473 100644 --- a/web/src/pages/maps/Sheet.tsx +++ b/web/src/pages/maps/Sheet.tsx @@ -17,6 +17,31 @@ import { ChevronRightIcon } from "@radix-ui/react-icons"; import DropdownMenuComponent from "./DropdownMenuComponent"; import { useEffect, useState } from "react"; import { useRouter } from "next/router"; +import { Fragment } from "react"; +import { ScrollArea } from "@/components/ui/scroll-area"; + +// Define the reusable function +const renderFormattedItems = ( + items: string[], + handleEdit: () => void, + handleRevert: () => void +) => { + if (items.length === 0) { + return
No Owner
; + } else if (items.length === 1 && items[0] === "") { + return
No Owner
; + } + return items.map((item, index) => ( +
+
{item}
+ +
+ )); +}; export function SheetDemo({ isSheetOpen, @@ -85,60 +110,69 @@ export function SheetDemo({ return ( - - - APN: {apn} - - Make changes to your profile here. Click save when you're done. - - -
-
- - {/* */} -
- {granteeSplitFormated.map((item, index) => { - return ( -
-
{item}
- -
- ); - })} + + + + APN: {apn} + + Make changes to your profile here. Click save when you're + done. + + +
+
+ +
+ {renderFormattedItems( + granteeSplitFormated, + handleEdit, + handleRevert + )} +
+
+
+ + {/* */} +
+ {renderFormattedItems( + grantorSplitFormated, + handleEdit, + handleRevert + )} +
- - {/* */} -
- {grantorSplitFormated.map((item, index) => ( -
- {item} -
- ))} -
- {/* - */} + {Object.entries(propertyData).map(([key, value]) => { + if (!["grantor", "grantee", "apn"].includes(key)) { + return ( + +

+ {key.charAt(0).toUpperCase() + key.slice(1)} +

+

{value}

+
+ ); + } + return null; + })}
-
- - {/* + + {/* */} - + + ); diff --git a/yarn.lock b/yarn.lock index 8c6634d..4cc76bb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1377,7 +1377,7 @@ "@radix-ui/react-scroll-area@^1.0.5": version "1.0.5" - resolved "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz#01160c6893f24a2ddb5aa399ae5b3ba84ad4d3cc" integrity sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw== dependencies: "@babel/runtime" "^7.13.10" From b364586e2147312232eb298a251143a9e69bf163 Mon Sep 17 00:00:00 2001 From: Dennis Date: Sat, 22 Jun 2024 01:23:52 -0700 Subject: [PATCH 3/5] clicking edit on the dropdown opens up a card with input to edit the name, and clicking cancel returns it back to the original state --- web/package.json | 4 +- web/src/components/ui/card.tsx | 79 ++++++++++ web/src/components/ui/select.tsx | 158 +++++++++++++++++++ web/src/pages/maps/DropdownMenuComponent.tsx | 45 ++++-- web/src/pages/maps/EditCard.tsx | 101 ++++++++++++ web/src/pages/maps/Sheet.tsx | 66 ++++++-- web/src/stores/useItemEditStore.ts | 20 +++ yarn.lock | 14 +- 8 files changed, 459 insertions(+), 28 deletions(-) create mode 100644 web/src/components/ui/card.tsx create mode 100644 web/src/components/ui/select.tsx create mode 100644 web/src/pages/maps/EditCard.tsx create mode 100644 web/src/stores/useItemEditStore.ts diff --git a/web/package.json b/web/package.json index 98fe52f..a404001 100644 --- a/web/package.json +++ b/web/package.json @@ -18,6 +18,7 @@ "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-label": "^2.0.2", "@radix-ui/react-scroll-area": "^1.0.5", + "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/themes": "^3.0.3", "change-case": "^5.4.4", @@ -34,7 +35,8 @@ "react-router-dom": "^6.23.1", "tailwind-merge": "^2.3.0", "tailwindcss-animate": "^1.0.7", - "zod": "3.22.4" + "zod": "3.22.4", + "zustand": "^4.5.2" }, "devDependencies": { "@types/node": "^20", diff --git a/web/src/components/ui/card.tsx b/web/src/components/ui/card.tsx new file mode 100644 index 0000000..afa13ec --- /dev/null +++ b/web/src/components/ui/card.tsx @@ -0,0 +1,79 @@ +import * as React from "react" + +import { cn } from "@/lib/utils" + +const Card = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +Card.displayName = "Card" + +const CardHeader = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardHeader.displayName = "CardHeader" + +const CardTitle = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardTitle.displayName = "CardTitle" + +const CardDescription = React.forwardRef< + HTMLParagraphElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardDescription.displayName = "CardDescription" + +const CardContent = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +

+)) +CardContent.displayName = "CardContent" + +const CardFooter = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)) +CardFooter.displayName = "CardFooter" + +export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent } diff --git a/web/src/components/ui/select.tsx b/web/src/components/ui/select.tsx new file mode 100644 index 0000000..fe56d4d --- /dev/null +++ b/web/src/components/ui/select.tsx @@ -0,0 +1,158 @@ +import * as React from "react" +import * as SelectPrimitive from "@radix-ui/react-select" +import { Check, ChevronDown, ChevronUp } from "lucide-react" + +import { cn } from "@/lib/utils" + +const Select = SelectPrimitive.Root + +const SelectGroup = SelectPrimitive.Group + +const SelectValue = SelectPrimitive.Value + +const SelectTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + span]:line-clamp-1", + className + )} + {...props} + > + {children} + + + + +)) +SelectTrigger.displayName = SelectPrimitive.Trigger.displayName + +const SelectScrollUpButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName + +const SelectScrollDownButton = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + +)) +SelectScrollDownButton.displayName = + SelectPrimitive.ScrollDownButton.displayName + +const SelectContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, position = "popper", ...props }, ref) => ( + + + + + {children} + + + + +)) +SelectContent.displayName = SelectPrimitive.Content.displayName + +const SelectLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectLabel.displayName = SelectPrimitive.Label.displayName + +const SelectItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + + {children} + +)) +SelectItem.displayName = SelectPrimitive.Item.displayName + +const SelectSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +SelectSeparator.displayName = SelectPrimitive.Separator.displayName + +export { + Select, + SelectGroup, + SelectValue, + SelectTrigger, + SelectContent, + SelectLabel, + SelectItem, + SelectSeparator, + SelectScrollUpButton, + SelectScrollDownButton, +} diff --git a/web/src/pages/maps/DropdownMenuComponent.tsx b/web/src/pages/maps/DropdownMenuComponent.tsx index 684eeaf..e90482d 100644 --- a/web/src/pages/maps/DropdownMenuComponent.tsx +++ b/web/src/pages/maps/DropdownMenuComponent.tsx @@ -15,6 +15,7 @@ import { } from "@/components/ui/dropdown-menu"; import { Button } from "@/components/ui/button"; import { ChevronRightIcon } from "@radix-ui/react-icons"; +import useItemEditStore from "@/stores/useItemEditStore"; // 2 buttons // 1. do a google search for the person @@ -36,12 +37,25 @@ interface DropdownMenuComponentProps { export default function DropdownMenuComponent({ fullName, + onEdit, + onRevert, + index, + type, }: // actions, { fullName: string; onEdit: () => void; onRevert: () => void; + index: number; + type: "grantor" | "grantee"; }) { + const { + setGranteeEditIndex, + setGrantorEditIndex, + granteeEditIndex, + grantorEditIndex, + } = useItemEditStore(); + return ( @@ -94,15 +108,28 @@ export default function DropdownMenuComponent({ - {/* {actions.map((item, index) => ( - - {item.label} - - ))} */} - {/* Edit - - Revert to Original - */} + { + if (type === "grantee") { + setGranteeEditIndex(index); + } else { + setGrantorEditIndex(index); + } + }} + > + Edit name + + { + if (type === "grantee") { + setGranteeEditIndex(null); + } else { + setGrantorEditIndex(null); + } + }} + > + Revert name to original + Team Invite users diff --git a/web/src/pages/maps/EditCard.tsx b/web/src/pages/maps/EditCard.tsx new file mode 100644 index 0000000..842cb01 --- /dev/null +++ b/web/src/pages/maps/EditCard.tsx @@ -0,0 +1,101 @@ +import React, { useState } from "react"; + +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import useItemEditStore from "@/stores/useItemEditStore"; + +export function CardWithForm({ + initialName, + // onNameChange, + // onSave, + // onCancel, + type, +}: { + initialName: string; + // onNameChange: (name: string) => void; + // onSave: () => void; + // onCancel: () => void; + type: "grantee" | "grantor"; +}) { + const [name, setName] = useState(initialName); + + const { + granteeEditIndex, + grantorEditIndex, + setGranteeEditIndex, + setGrantorEditIndex, + } = useItemEditStore(); + + const handleChange = (e: React.ChangeEvent) => { + setName(e.target.value); + // onNameChange(e.target.value); + }; + + const onCancel = () => { + if (type === "grantee") { + setGranteeEditIndex(null); + } else { + setGrantorEditIndex(null); + } + }; + + return ( + + + Edit name + Deploy your new project in one-click. + + +
+
+
+ + +
+
+ {/* + */} +
+
+
+
+ + + + +
+ ); +} diff --git a/web/src/pages/maps/Sheet.tsx b/web/src/pages/maps/Sheet.tsx index 1945473..3df059d 100644 --- a/web/src/pages/maps/Sheet.tsx +++ b/web/src/pages/maps/Sheet.tsx @@ -19,28 +19,52 @@ import { useEffect, useState } from "react"; import { useRouter } from "next/router"; import { Fragment } from "react"; import { ScrollArea } from "@/components/ui/scroll-area"; +import { CardWithForm } from "./EditCard"; +import useItemEditStore from "@/stores/useItemEditStore"; +import { Card } from "@/components/ui/card"; // Define the reusable function -const renderFormattedItems = ( +const RenderFormattedItems = ( items: string[], handleEdit: () => void, - handleRevert: () => void + handleRevert: () => void, + type: "grantor" | "grantee" ) => { + const { granteeEditIndex, grantorEditIndex } = useItemEditStore(); + if (items.length === 0) { return
No Owner
; } else if (items.length === 1 && items[0] === "") { return
No Owner
; } - return items.map((item, index) => ( -
-
{item}
- -
- )); + { + console.log(items); + } + return items.map((item, index) => { + const currentEditIndex = + type === "grantee" ? granteeEditIndex : grantorEditIndex; + + return ( +
+
+ {index === currentEditIndex ? ( + + ) : ( + <> +
{item}
+ + + )} +
+
+ ); + }); }; export function SheetDemo({ @@ -108,8 +132,14 @@ export function SheetDemo({ setEditMode(false); }; + const { resetEditIndices } = useItemEditStore(); + + const handleClose = () => { + resetEditIndices(); + }; + return ( - + @@ -128,10 +158,11 @@ export function SheetDemo({ Current Owner
- {renderFormattedItems( + {RenderFormattedItems( granteeSplitFormated, handleEdit, - handleRevert + handleRevert, + "grantee" )}
@@ -144,10 +175,11 @@ export function SheetDemo({ {/* */}
- {renderFormattedItems( + {RenderFormattedItems( grantorSplitFormated, handleEdit, - handleRevert + handleRevert, + "grantor" )}
diff --git a/web/src/stores/useItemEditStore.ts b/web/src/stores/useItemEditStore.ts new file mode 100644 index 0000000..7dbdf11 --- /dev/null +++ b/web/src/stores/useItemEditStore.ts @@ -0,0 +1,20 @@ +import { create } from "zustand"; + +interface ItemEditState { + granteeEditIndex: number | null; + grantorEditIndex: number | null; + setGranteeEditIndex: (index: number | null) => void; + setGrantorEditIndex: (index: number | null) => void; + resetEditIndices: () => void; +} + +const useItemEditStore = create((set) => ({ + granteeEditIndex: null, + grantorEditIndex: null, + setGranteeEditIndex: (index) => set({ granteeEditIndex: index }), + setGrantorEditIndex: (index) => set({ grantorEditIndex: index }), + resetEditIndices: () => + set({ granteeEditIndex: null, grantorEditIndex: null }), +})); + +export default useItemEditStore; diff --git a/yarn.lock b/yarn.lock index 4cc76bb..eb84d13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1393,7 +1393,7 @@ "@radix-ui/react-select@^2.0.0": version "2.0.0" - resolved "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/@radix-ui/react-select/-/react-select-2.0.0.tgz#a3511792a51a7018d6559357323a7f52e0e38887" integrity sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w== dependencies: "@babel/runtime" "^7.13.10" @@ -7244,6 +7244,11 @@ use-sidecar@^1.1.2: detect-node-es "^1.1.0" tslib "^2.0.0" +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" @@ -7452,3 +7457,10 @@ zstd-codec@^0.1: version "0.1.4" resolved "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.4.tgz" integrity sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A== + +zustand@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.2.tgz#fddbe7cac1e71d45413b3682cdb47b48034c3848" + integrity sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g== + dependencies: + use-sync-external-store "1.2.0" From 46dc08c2cb971efbcfba7cf8780158d561beeca7 Mon Sep 17 00:00:00 2001 From: Dennis Date: Sat, 22 Jun 2024 12:04:07 -0700 Subject: [PATCH 4/5] edit names shows a card and clicking cancel returns it back to original state, while save updates the name --- web/src/pages/maps/EditCard.tsx | 33 +++++++++++++++---- web/src/pages/maps/Sheet.tsx | 47 ++++++++++++++++++++++++-- web/src/stores/useItemEditStore.ts | 53 ++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 9 deletions(-) diff --git a/web/src/pages/maps/EditCard.tsx b/web/src/pages/maps/EditCard.tsx index 842cb01..c7a7d24 100644 --- a/web/src/pages/maps/EditCard.tsx +++ b/web/src/pages/maps/EditCard.tsx @@ -18,7 +18,7 @@ import { SelectTrigger, SelectValue, } from "@/components/ui/select"; -import useItemEditStore from "@/stores/useItemEditStore"; +import useItemEditStore, { useEditStore } from "@/stores/useItemEditStore"; export function CardWithForm({ initialName, @@ -26,14 +26,16 @@ export function CardWithForm({ // onSave, // onCancel, type, + editIndex, }: { initialName: string; // onNameChange: (name: string) => void; // onSave: () => void; // onCancel: () => void; type: "grantee" | "grantor"; + editIndex: number; }) { - const [name, setName] = useState(initialName); + const [editedName, setEditedName] = useState(initialName); const { granteeEditIndex, @@ -43,7 +45,7 @@ export function CardWithForm({ } = useItemEditStore(); const handleChange = (e: React.ChangeEvent) => { - setName(e.target.value); + setEditedName(e.target.value); // onNameChange(e.target.value); }; @@ -55,6 +57,25 @@ export function CardWithForm({ } }; + const onSave = () => { + if (type === "grantee") { + setGranteeName(editIndex, editedName); + setGranteeEditIndex(null); + } else { + setGrantorName(editIndex, editedName); + setGrantorEditIndex(null); + } + }; + + const { + grantorNames, + granteeNames, + setGrantorName, + setGranteeName, + revertGrantorName, + revertGranteeName, + } = useEditStore(); + return ( @@ -68,8 +89,8 @@ export function CardWithForm({

@@ -94,7 +115,7 @@ export function CardWithForm({ - + ); diff --git a/web/src/pages/maps/Sheet.tsx b/web/src/pages/maps/Sheet.tsx index 3df059d..43cddeb 100644 --- a/web/src/pages/maps/Sheet.tsx +++ b/web/src/pages/maps/Sheet.tsx @@ -22,6 +22,7 @@ import { ScrollArea } from "@/components/ui/scroll-area"; import { CardWithForm } from "./EditCard"; import useItemEditStore from "@/stores/useItemEditStore"; import { Card } from "@/components/ui/card"; +import { useEditStore } from "@/stores/useItemEditStore"; // Define the reusable function const RenderFormattedItems = ( @@ -48,7 +49,11 @@ const RenderFormattedItems = (
{index === currentEditIndex ? ( - + ) : ( <>
{item}
@@ -138,6 +143,42 @@ export function SheetDemo({ resetEditIndices(); }; + const { + initializeGrantorNames, + initializeGranteeNames, + grantorNames, + granteeNames, + initializeOriginalGrantorNames, + initializeOriginalGranteeNames, + originalGrantorNames, + originalGranteeNames, + } = useEditStore(); + + // initialize the original names to use for later + useEffect(() => { + const grantorSplit = grantor.split(","); + const granteeSplit = grantee.split(","); + + const grantorSplitFormated = grantorSplit.map((item) => + changeCase.capitalCase(item) + ); + const granteeSplitFormated = granteeSplit.map((item) => + changeCase.capitalCase(item) + ); + + initializeGrantorNames(grantorSplitFormated); + initializeGranteeNames(granteeSplitFormated); + initializeOriginalGrantorNames(grantorSplitFormated); + initializeOriginalGranteeNames(granteeSplitFormated); + }, [ + grantee, + grantor, + initializeGranteeNames, + initializeGrantorNames, + initializeOriginalGranteeNames, + initializeOriginalGrantorNames, + ]); + return ( @@ -159,7 +200,7 @@ export function SheetDemo({
{RenderFormattedItems( - granteeSplitFormated, + granteeNames, handleEdit, handleRevert, "grantee" @@ -176,7 +217,7 @@ export function SheetDemo({ {/* */}
{RenderFormattedItems( - grantorSplitFormated, + grantorNames, handleEdit, handleRevert, "grantor" diff --git a/web/src/stores/useItemEditStore.ts b/web/src/stores/useItemEditStore.ts index 7dbdf11..93c30f3 100644 --- a/web/src/stores/useItemEditStore.ts +++ b/web/src/stores/useItemEditStore.ts @@ -1,4 +1,5 @@ import { create } from "zustand"; +import { persist } from "zustand/middleware"; interface ItemEditState { granteeEditIndex: number | null; @@ -17,4 +18,56 @@ const useItemEditStore = create((set) => ({ set({ granteeEditIndex: null, grantorEditIndex: null }), })); +interface EditState { + grantorNames: string[]; + granteeNames: string[]; + originalGrantorNames: string[]; + originalGranteeNames: string[]; + setGrantorName: (index: number, name: string) => void; + setGranteeName: (index: number, name: string) => void; + revertGrantorName: (index: number, originalName: string) => void; + revertGranteeName: (index: number, originalName: string) => void; + initializeGrantorNames: (names: string[]) => void; + initializeGranteeNames: (names: string[]) => void; + initializeOriginalGrantorNames: (names: string[]) => void; + initializeOriginalGranteeNames: (names: string[]) => void; +} + +export const useEditStore = create((set) => ({ + grantorNames: [], + granteeNames: [], + originalGrantorNames: [], + originalGranteeNames: [], + initializeGrantorNames: (names) => set({ grantorNames: names }), + initializeGranteeNames: (names) => set({ granteeNames: names }), + initializeOriginalGrantorNames: (names) => + set({ originalGrantorNames: names }), + initializeOriginalGranteeNames: (names) => + set({ originalGranteeNames: names }), + setGrantorName: (index, name) => + set((state) => { + const newNames = [...state.grantorNames]; + newNames[index] = name; + return { grantorNames: newNames }; + }), + setGranteeName: (index, name) => + set((state) => { + const newNames = [...state.granteeNames]; + newNames[index] = name; + return { granteeNames: newNames }; + }), + revertGrantorName: (index, originalName) => + set((state) => { + const newNames = [...state.grantorNames]; + newNames[index] = originalName; + return { grantorNames: newNames }; + }), + revertGranteeName: (index, originalName) => + set((state) => { + const newNames = [...state.granteeNames]; + newNames[index] = originalName; + return { granteeNames: newNames }; + }), +})); + export default useItemEditStore; From 535a5b172af368e9aae72292de3b85a0452fe714 Mon Sep 17 00:00:00 2001 From: Dennis Date: Sun, 23 Jun 2024 18:42:24 -0700 Subject: [PATCH 5/5] reverting a name, properly changes it back to original. also, editing a name changes the color with an additional tooltip. --- web/package.json | 1 + web/src/components/ui/tooltip.tsx | 28 ++++ web/src/pages/maps/DropdownMenuComponent.tsx | 13 +- web/src/pages/maps/Sheet.tsx | 32 +++- yarn.lock | 154 +++++++++++++++++++ 5 files changed, 224 insertions(+), 4 deletions(-) create mode 100644 web/src/components/ui/tooltip.tsx diff --git a/web/package.json b/web/package.json index a404001..68a6c77 100644 --- a/web/package.json +++ b/web/package.json @@ -20,6 +20,7 @@ "@radix-ui/react-scroll-area": "^1.0.5", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-tooltip": "^1.1.1", "@radix-ui/themes": "^3.0.3", "change-case": "^5.4.4", "class-variance-authority": "^0.7.0", diff --git a/web/src/components/ui/tooltip.tsx b/web/src/components/ui/tooltip.tsx new file mode 100644 index 0000000..e121f0a --- /dev/null +++ b/web/src/components/ui/tooltip.tsx @@ -0,0 +1,28 @@ +import * as React from "react" +import * as TooltipPrimitive from "@radix-ui/react-tooltip" + +import { cn } from "@/lib/utils" + +const TooltipProvider = TooltipPrimitive.Provider + +const Tooltip = TooltipPrimitive.Root + +const TooltipTrigger = TooltipPrimitive.Trigger + +const TooltipContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + +)) +TooltipContent.displayName = TooltipPrimitive.Content.displayName + +export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider } diff --git a/web/src/pages/maps/DropdownMenuComponent.tsx b/web/src/pages/maps/DropdownMenuComponent.tsx index e90482d..a90ae3f 100644 --- a/web/src/pages/maps/DropdownMenuComponent.tsx +++ b/web/src/pages/maps/DropdownMenuComponent.tsx @@ -15,7 +15,7 @@ import { } from "@/components/ui/dropdown-menu"; import { Button } from "@/components/ui/button"; import { ChevronRightIcon } from "@radix-ui/react-icons"; -import useItemEditStore from "@/stores/useItemEditStore"; +import useItemEditStore, { useEditStore } from "@/stores/useItemEditStore"; // 2 buttons // 1. do a google search for the person @@ -56,6 +56,13 @@ export default function DropdownMenuComponent({ grantorEditIndex, } = useItemEditStore(); + const { + setGranteeName, + setGrantorName, + originalGranteeNames, + originalGrantorNames, + } = useEditStore(); + return ( @@ -122,9 +129,9 @@ export default function DropdownMenuComponent({ { if (type === "grantee") { - setGranteeEditIndex(null); + setGranteeName(index, originalGranteeNames[index]); } else { - setGrantorEditIndex(null); + setGrantorName(index, originalGrantorNames[index]); } }} > diff --git a/web/src/pages/maps/Sheet.tsx b/web/src/pages/maps/Sheet.tsx index 43cddeb..15ca604 100644 --- a/web/src/pages/maps/Sheet.tsx +++ b/web/src/pages/maps/Sheet.tsx @@ -23,6 +23,12 @@ import { CardWithForm } from "./EditCard"; import useItemEditStore from "@/stores/useItemEditStore"; import { Card } from "@/components/ui/card"; import { useEditStore } from "@/stores/useItemEditStore"; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; // Define the reusable function const RenderFormattedItems = ( @@ -32,6 +38,7 @@ const RenderFormattedItems = ( type: "grantor" | "grantee" ) => { const { granteeEditIndex, grantorEditIndex } = useItemEditStore(); + const { originalGrantorNames, originalGranteeNames } = useEditStore(); if (items.length === 0) { return
No Owner
; @@ -45,6 +52,16 @@ const RenderFormattedItems = ( const currentEditIndex = type === "grantee" ? granteeEditIndex : grantorEditIndex; + let isEdited; + + if (type === "grantor") { + isEdited = item !== originalGrantorNames[index]; + } else { + isEdited = item !== originalGranteeNames[index]; + } + + const textStyle = isEdited ? `text-cyan-700 ` : ``; + return (
@@ -56,7 +73,20 @@ const RenderFormattedItems = ( /> ) : ( <> -
{item}
+ {isEdited ? ( + + + +
{item}
+
+ +

edited. revert in dropdown menu

+
+
+
+ ) : ( +
{item}
+ )}