mirror of
https://github.com/TheRealOwenRees/echecsfrance.git
synced 2026-07-23 12:36:57 +00:00
Implement region based filtering of clubs
replace cancel button with X use search params instead of path fix routes for filtering clubs by URL, add loading map spinner, remove useEffect normalised region name in url will set filter search region by url params add i8n to region filtering use jotai useSetAtom select value becomes the name of the region on selection fix geojson types fix region names apply same regional filtering logic to tournaments that we have for clubs type fixes for GeoJson Feature basic filtering of clubs by region working remove comments two column layout change text colours accept undefined in region data state selecting a region from modal sets state with region data of Feature type. Types currently not all correct. by region filter satisfies types, with no functionality yet remove unused imports add region option in dropdown rename file to reflect its function json file for region names comment out analytics script for testing loading upgrade mongo unformat file to keep line count small add json of French regions coordinates upgrade next to last v14
This commit is contained in:
+2
-2
@@ -35,8 +35,8 @@
|
|||||||
"leaflet.markercluster": "^1.5.3",
|
"leaflet.markercluster": "^1.5.3",
|
||||||
"leaflet.smooth_marker_bouncing": "3.0.3",
|
"leaflet.smooth_marker_bouncing": "3.0.3",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mongodb": "^6.4.0",
|
"mongodb": "^6.19.0",
|
||||||
"next": "^14.0.4",
|
"next": "^14.2.3",
|
||||||
"next-auth": "^5.0.0-beta.16",
|
"next-auth": "^5.0.0-beta.16",
|
||||||
"next-intl": "^3.3.2",
|
"next-intl": "^3.3.2",
|
||||||
"next-pwa": "^5.6.0",
|
"next-pwa": "^5.6.0",
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
self.__WB_DISABLE_DEV_LOGS=!0;
|
||||||
@@ -1,10 +1,15 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
|
import { Feature, GeoJsonProperties, MultiPolygon, Polygon } from "geojson";
|
||||||
|
import { useSetAtom } from "jotai";
|
||||||
import { useHydrateAtoms } from "jotai/utils";
|
import { useHydrateAtoms } from "jotai/utils";
|
||||||
import dynamic from "next/dynamic";
|
import dynamic from "next/dynamic";
|
||||||
|
import { useSearchParams } from "next/navigation";
|
||||||
|
|
||||||
import { clubsAtom } from "@/atoms";
|
import { clubsAtom, regionFilterAtom } from "@/atoms";
|
||||||
import LoadingMap from "@/components/LoadingMap";
|
import LoadingMap from "@/components/LoadingMap";
|
||||||
|
import regionNames from "@/resources/regionNames.json";
|
||||||
|
import regionGeoJson from "@/resources/regionsGeoJson.json";
|
||||||
import { Club } from "@/types";
|
import { Club } from "@/types";
|
||||||
|
|
||||||
import ClubTable from "./ClubTable";
|
import ClubTable from "./ClubTable";
|
||||||
@@ -24,6 +29,31 @@ const ClubMap = dynamic(() => import("./ClubMap"), {
|
|||||||
|
|
||||||
export default function ClubsDisplay({ clubs }: ClubsDisplayProps) {
|
export default function ClubsDisplay({ clubs }: ClubsDisplayProps) {
|
||||||
useHydrateAtoms([[clubsAtom, clubs]]);
|
useHydrateAtoms([[clubsAtom, clubs]]);
|
||||||
|
const setRegionFilter = useSetAtom(regionFilterAtom);
|
||||||
|
|
||||||
|
const searchParams = useSearchParams();
|
||||||
|
const regionSearchParam = searchParams.get("region");
|
||||||
|
|
||||||
|
if (regionSearchParam) {
|
||||||
|
const matchedRegion = regionNames.name.find(
|
||||||
|
(name) =>
|
||||||
|
name
|
||||||
|
.toLowerCase()
|
||||||
|
.replaceAll(" ", "-")
|
||||||
|
.normalize("NFD")
|
||||||
|
.replace(/[\u0300-\u036f]/g, "") === regionSearchParam.toLowerCase(),
|
||||||
|
);
|
||||||
|
|
||||||
|
const regionData = regionGeoJson.features.find(
|
||||||
|
(f) => f.properties.nom === matchedRegion,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (regionData) {
|
||||||
|
setRegionFilter(
|
||||||
|
regionData as Feature<Polygon | MultiPolygon, GeoJsonProperties>,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className="relative grid h-full w-full lg:grid-cols-2">
|
<main className="relative grid h-full w-full lg:grid-cols-2">
|
||||||
|
|||||||
@@ -80,10 +80,10 @@ export default async function RootLayout({
|
|||||||
<Footer />
|
<Footer />
|
||||||
</NextIntlClientProvider>
|
</NextIntlClientProvider>
|
||||||
|
|
||||||
<Script
|
{/*<Script*/}
|
||||||
defer
|
{/* defer*/}
|
||||||
src="https://app.tinyanalytics.io/pixel/HyoumUokLr9exPgX"
|
{/* src="https://app.tinyanalytics.io/pixel/HyoumUokLr9exPgX"*/}
|
||||||
/>
|
{/*/>*/}
|
||||||
</Providers>
|
</Providers>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+49
-3
@@ -8,7 +8,13 @@ import {
|
|||||||
startOfDay,
|
startOfDay,
|
||||||
} from "date-fns";
|
} from "date-fns";
|
||||||
import { fr } from "date-fns/locale";
|
import { fr } from "date-fns/locale";
|
||||||
import { FeatureCollection } from "geojson";
|
import {
|
||||||
|
Feature,
|
||||||
|
FeatureCollection,
|
||||||
|
GeoJsonProperties,
|
||||||
|
MultiPolygon,
|
||||||
|
Polygon,
|
||||||
|
} from "geojson";
|
||||||
import { atom } from "jotai";
|
import { atom } from "jotai";
|
||||||
import { LatLngBounds } from "leaflet";
|
import { LatLngBounds } from "leaflet";
|
||||||
|
|
||||||
@@ -21,12 +27,25 @@ setDefaultOptions({ locale: fr });
|
|||||||
type RegionFilter =
|
type RegionFilter =
|
||||||
| "all"
|
| "all"
|
||||||
| "map"
|
| "map"
|
||||||
|
| "region"
|
||||||
|
| Feature<Polygon | MultiPolygon, GeoJsonProperties>
|
||||||
| {
|
| {
|
||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
features: FeatureCollection;
|
features: FeatureCollection;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function isFeature(obj: any): obj is Feature {
|
||||||
|
return (
|
||||||
|
obj &&
|
||||||
|
typeof obj === "object" &&
|
||||||
|
obj.type === "Feature" &&
|
||||||
|
obj.properties !== undefined &&
|
||||||
|
obj.geometry !== undefined &&
|
||||||
|
(obj.geometry.type === "Polygon" || obj.geometry.type === "MultiPolygon")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export const burgerMenuIsOpenAtom = atom(false);
|
export const burgerMenuIsOpenAtom = atom(false);
|
||||||
export const mapBoundsAtom = atom<LatLngBounds | null>(null);
|
export const mapBoundsAtom = atom<LatLngBounds | null>(null);
|
||||||
export const regionFilterAtom = atom<RegionFilter>("map");
|
export const regionFilterAtom = atom<RegionFilter>("map");
|
||||||
@@ -79,9 +98,22 @@ export const filteredTournamentsByTimeControlAndZoneAtom = atom((get) => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (regionFilter === "all" || regionFilter === "map")
|
if (
|
||||||
|
regionFilter === "all" ||
|
||||||
|
regionFilter === "map" ||
|
||||||
|
regionFilter === "region"
|
||||||
|
)
|
||||||
return filterByTimeControl;
|
return filterByTimeControl;
|
||||||
|
|
||||||
|
if (isFeature(regionFilter)) {
|
||||||
|
return filterByTimeControl.filter((tournament) => {
|
||||||
|
return booleanPointInPolygon(
|
||||||
|
[tournament.latLng.lng, tournament.latLng.lat],
|
||||||
|
regionFilter.geometry,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return filterByTimeControl.filter((tournament) => {
|
return filterByTimeControl.filter((tournament) => {
|
||||||
return regionFilter.features?.features?.some(
|
return regionFilter.features?.features?.some(
|
||||||
(feature) =>
|
(feature) =>
|
||||||
@@ -127,7 +159,21 @@ export const filteredClubsByZoneAtom = atom((get) => {
|
|||||||
const clubs = get(clubsAtom);
|
const clubs = get(clubsAtom);
|
||||||
const regionFilter = get(regionFilterAtom);
|
const regionFilter = get(regionFilterAtom);
|
||||||
|
|
||||||
if (regionFilter === "all" || regionFilter === "map") return clubs;
|
if (
|
||||||
|
regionFilter === "all" ||
|
||||||
|
regionFilter === "map" ||
|
||||||
|
regionFilter === "region"
|
||||||
|
)
|
||||||
|
return clubs;
|
||||||
|
|
||||||
|
if (isFeature(regionFilter)) {
|
||||||
|
return clubs.filter((club) => {
|
||||||
|
return booleanPointInPolygon(
|
||||||
|
[club.latLng.lng, club.latLng.lat],
|
||||||
|
regionFilter.geometry,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return clubs.filter((club) => {
|
return clubs.filter((club) => {
|
||||||
return regionFilter.features?.features?.some(
|
return regionFilter.features?.features?.some(
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
import gd from "date-fns/locale/gd";
|
import { useState } from "react";
|
||||||
|
|
||||||
import { useAtom } from "jotai";
|
import { useAtom } from "jotai";
|
||||||
import { useTranslations } from "next-intl";
|
import { useTranslations } from "next-intl";
|
||||||
import { IoAdd } from "react-icons/io5";
|
import { IoAdd } from "react-icons/io5";
|
||||||
import {
|
import { GroupBase, OnChangeValue, OptionsOrGroups } from "react-select";
|
||||||
GroupBase,
|
|
||||||
OnChangeValue,
|
|
||||||
OptionsOrGroups,
|
|
||||||
SingleValue,
|
|
||||||
} from "react-select";
|
|
||||||
|
|
||||||
import { regionFilterAtom } from "@/atoms";
|
import { isFeature, regionFilterAtom } from "@/atoms";
|
||||||
|
import { RegionSelectModal } from "@/components/RegionSelectModal";
|
||||||
import { BaseOption, Select, SelectProps } from "@/components/form/Select";
|
import { BaseOption, Select, SelectProps } from "@/components/form/Select";
|
||||||
import { useZones } from "@/hooks/useZones";
|
import { useZones } from "@/hooks/useZones";
|
||||||
import { Zone } from "@/server/myZones";
|
import { Zone } from "@/server/myZones";
|
||||||
@@ -32,6 +29,7 @@ export const RegionSelect = ({
|
|||||||
const t = useTranslations("Zones");
|
const t = useTranslations("Zones");
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const [regionFilter, setRegionFilter] = useAtom(regionFilterAtom);
|
const [regionFilter, setRegionFilter] = useAtom(regionFilterAtom);
|
||||||
|
const [isRegionModalOpen, setIsRegionModalOpen] = useState(false);
|
||||||
const { zones } = useZones();
|
const { zones } = useZones();
|
||||||
|
|
||||||
const zoneFilterOptions: OptionsOrGroups<RegionOption, GroupedOption> = [
|
const zoneFilterOptions: OptionsOrGroups<RegionOption, GroupedOption> = [
|
||||||
@@ -40,6 +38,11 @@ export const RegionSelect = ({
|
|||||||
label: syncTitle,
|
label: syncTitle,
|
||||||
data: null,
|
data: null,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
value: "region",
|
||||||
|
label: t("RegionFilter.regionSelectValue"),
|
||||||
|
data: null,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
value: "all",
|
value: "all",
|
||||||
label: t("ignoreMapOption"),
|
label: t("ignoreMapOption"),
|
||||||
@@ -68,14 +71,22 @@ export const RegionSelect = ({
|
|||||||
option: OnChangeValue<BaseOption<string, Zone | null>, false>,
|
option: OnChangeValue<BaseOption<string, Zone | null>, false>,
|
||||||
) => {
|
) => {
|
||||||
if (!option) return;
|
if (!option) return;
|
||||||
|
|
||||||
if (option.value === "create") {
|
if (option.value === "create") {
|
||||||
router.push("/zones/create");
|
router.push("/zones/create");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (option.value === "map" || option.value === "all")
|
if (option.value === "region") {
|
||||||
|
setIsRegionModalOpen(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (option.value === "map" || option.value === "all") {
|
||||||
setRegionFilter(option.value);
|
setRegionFilter(option.value);
|
||||||
else setRegionFilter(option.data!);
|
} else {
|
||||||
|
setRegionFilter(option.data!);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const formatGroupLabel = (data: GroupedOption) => (
|
const formatGroupLabel = (data: GroupedOption) => (
|
||||||
@@ -102,19 +113,43 @@ export const RegionSelect = ({
|
|||||||
"options" in groupOrOption ? groupOrOption.options : groupOrOption,
|
"options" in groupOrOption ? groupOrOption.options : groupOrOption,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const getValue = () => {
|
||||||
|
if (
|
||||||
|
regionFilter === "all" ||
|
||||||
|
regionFilter === "map" ||
|
||||||
|
regionFilter === "region"
|
||||||
|
) {
|
||||||
|
return allOptions.find((o) => o.value === regionFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFeature(regionFilter) && regionFilter.properties) {
|
||||||
|
// Display the region name from properties.nom when it's a Feature
|
||||||
|
return {
|
||||||
|
value: "region",
|
||||||
|
label: regionFilter.properties.nom,
|
||||||
|
data: null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return allOptions.find((o) => o.value === regionFilter.id);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<>
|
||||||
<Select
|
<Select
|
||||||
options={zoneFilterOptions}
|
options={zoneFilterOptions}
|
||||||
value={allOptions.find((o) =>
|
value={getValue()}
|
||||||
regionFilter === "all" || regionFilter === "map"
|
|
||||||
? o.value === regionFilter
|
|
||||||
: o.value === regionFilter.id,
|
|
||||||
)}
|
|
||||||
isMulti={false}
|
isMulti={false}
|
||||||
formatGroupLabel={formatGroupLabel}
|
formatGroupLabel={formatGroupLabel}
|
||||||
formatOptionLabel={formatOptionLabel}
|
formatOptionLabel={formatOptionLabel}
|
||||||
onChange={onChange}
|
onChange={onChange}
|
||||||
{...selectProps}
|
{...selectProps}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<RegionSelectModal
|
||||||
|
isRegionModalOpen={isRegionModalOpen}
|
||||||
|
setIsRegionModalOpen={setIsRegionModalOpen}
|
||||||
|
/>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,96 @@
|
|||||||
|
import type { Dispatch, SetStateAction } from "react";
|
||||||
|
|
||||||
|
import {
|
||||||
|
type Feature,
|
||||||
|
GeoJsonProperties,
|
||||||
|
MultiPolygon,
|
||||||
|
Polygon,
|
||||||
|
} from "geojson";
|
||||||
|
import { useSetAtom } from "jotai";
|
||||||
|
import { useTranslations } from "next-intl";
|
||||||
|
import { IoClose } from "react-icons/io5";
|
||||||
|
|
||||||
|
import { regionFilterAtom } from "@/atoms";
|
||||||
|
import { Modal } from "@/components/Modal";
|
||||||
|
import regionNames from "@/resources/regionNames.json";
|
||||||
|
import regionGeoJson from "@/resources/regionsGeoJson.json";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
isRegionModalOpen: boolean;
|
||||||
|
setIsRegionModalOpen: Dispatch<SetStateAction<boolean>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const RegionSelectModal = ({
|
||||||
|
isRegionModalOpen,
|
||||||
|
setIsRegionModalOpen,
|
||||||
|
}: IProps) => {
|
||||||
|
const t = useTranslations("Zones");
|
||||||
|
const setRegionFilter = useSetAtom(regionFilterAtom);
|
||||||
|
|
||||||
|
const handleCloseModal = () => {
|
||||||
|
setIsRegionModalOpen(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleRegionSelect = (region: string) => {
|
||||||
|
const regionData = regionGeoJson.features.find(
|
||||||
|
(f) => f.properties.nom === region,
|
||||||
|
);
|
||||||
|
if (regionData) {
|
||||||
|
setRegionFilter(
|
||||||
|
regionData as Feature<Polygon | MultiPolygon, GeoJsonProperties>,
|
||||||
|
);
|
||||||
|
handleCloseModal();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const regions = [...regionNames.name];
|
||||||
|
|
||||||
|
const midPoint = Math.ceil(regions.length / 2);
|
||||||
|
const leftColumnRegions = regions.slice(0, midPoint);
|
||||||
|
const rightColumnRegions = regions.slice(midPoint);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
open={isRegionModalOpen}
|
||||||
|
onClose={handleCloseModal}
|
||||||
|
title={t("RegionFilter.regionModalTitle")}
|
||||||
|
panelClass="max-w-3xl relative"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
onClick={handleCloseModal}
|
||||||
|
className="absolute right-4 top-0 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"
|
||||||
|
aria-label="Close"
|
||||||
|
>
|
||||||
|
<IoClose size={24} />
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<div className="space-y-4">
|
||||||
|
<div className="grid grid-cols-2 gap-4">
|
||||||
|
<div className="space-y-3">
|
||||||
|
{leftColumnRegions.map((region) => (
|
||||||
|
<button
|
||||||
|
key={region}
|
||||||
|
onClick={() => handleRegionSelect(region)}
|
||||||
|
className="w-full rounded-lg border border-gray-300 p-3 text-left text-gray-900 hover:bg-gray-100 dark:border-gray-500 dark:text-gray-100 dark:hover:bg-gray-700"
|
||||||
|
>
|
||||||
|
{region}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="space-y-3">
|
||||||
|
{rightColumnRegions.map((region) => (
|
||||||
|
<button
|
||||||
|
key={region}
|
||||||
|
onClick={() => handleRegionSelect(region)}
|
||||||
|
className="w-full rounded-lg border border-gray-300 p-3 text-left text-gray-900 hover:bg-gray-100 dark:border-gray-500 dark:text-gray-100 dark:hover:bg-gray-700"
|
||||||
|
>
|
||||||
|
{region}
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -241,7 +241,12 @@
|
|||||||
"createFailure": "Oops, something went wrong. Please try again later.",
|
"createFailure": "Oops, something went wrong. Please try again later.",
|
||||||
|
|
||||||
"deleteZoneTitle": "Delete Zone",
|
"deleteZoneTitle": "Delete Zone",
|
||||||
"deleteZoneInfo": "Are you sure you want to delete this zone? This action cannot be undone."
|
"deleteZoneInfo": "Are you sure you want to delete this zone? This action cannot be undone.",
|
||||||
|
|
||||||
|
"RegionFilter": {
|
||||||
|
"regionSelectValue": "By region",
|
||||||
|
"regionModalTitle": "Select region"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"SignIn": {
|
"SignIn": {
|
||||||
|
|||||||
@@ -243,7 +243,12 @@
|
|||||||
"createFailure": "Oups, quelque chose s'est mal passé. Veuillez réessayer.",
|
"createFailure": "Oups, quelque chose s'est mal passé. Veuillez réessayer.",
|
||||||
|
|
||||||
"deleteZoneTitle": "Supprimer la région",
|
"deleteZoneTitle": "Supprimer la région",
|
||||||
"deleteZoneInfo": "Êtes-vous sûr de vouloir supprimer cette région\u00a0?"
|
"deleteZoneInfo": "Êtes-vous sûr de vouloir supprimer cette région\u00a0?",
|
||||||
|
|
||||||
|
"RegionFilter": {
|
||||||
|
"regionSelectValue": "Par région",
|
||||||
|
"regionModalTitle": "Selectionnez une région"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"SignIn": {
|
"SignIn": {
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"name": [
|
||||||
|
"Auvergne-Rhône-Alpes",
|
||||||
|
"Bourgogne-Franche-Comté",
|
||||||
|
"Bretagne",
|
||||||
|
"Centre-Val de Loire",
|
||||||
|
"Corse",
|
||||||
|
"Grand Est",
|
||||||
|
"Hauts-de-France",
|
||||||
|
"Île-de-France",
|
||||||
|
"Normandie",
|
||||||
|
"Nouvelle-Aquitaine",
|
||||||
|
"Occitanie",
|
||||||
|
"Pays de la Loire",
|
||||||
|
"Provence-Alpes-Côte d’Azur"
|
||||||
|
]
|
||||||
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -1570,10 +1570,10 @@
|
|||||||
"@jridgewell/resolve-uri" "^3.1.0"
|
"@jridgewell/resolve-uri" "^3.1.0"
|
||||||
"@jridgewell/sourcemap-codec" "^1.4.14"
|
"@jridgewell/sourcemap-codec" "^1.4.14"
|
||||||
|
|
||||||
"@mongodb-js/saslprep@^1.1.5":
|
"@mongodb-js/saslprep@^1.1.9":
|
||||||
version "1.1.9"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz#e974bab8eca9faa88677d4ea4da8d09a52069004"
|
resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.3.0.tgz#75bb770b4b0908047b6c6ac2ec841047660e1c82"
|
||||||
integrity sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==
|
integrity sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
sparse-bitfield "^3.0.3"
|
sparse-bitfield "^3.0.3"
|
||||||
|
|
||||||
@@ -1584,10 +1584,10 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
webpack-bundle-analyzer "4.10.1"
|
webpack-bundle-analyzer "4.10.1"
|
||||||
|
|
||||||
"@next/env@14.2.13":
|
"@next/env@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.13.tgz#ba341ba9eb70db428fc1c754f49c3c516f7bab47"
|
resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.32.tgz#6d1107e2b7cc8649ff3730b8b46deb4e8a6d38fa"
|
||||||
integrity sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==
|
integrity sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==
|
||||||
|
|
||||||
"@next/eslint-plugin-next@14.2.13":
|
"@next/eslint-plugin-next@14.2.13":
|
||||||
version "14.2.13"
|
version "14.2.13"
|
||||||
@@ -1596,50 +1596,50 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
glob "10.3.10"
|
glob "10.3.10"
|
||||||
|
|
||||||
"@next/swc-darwin-arm64@14.2.13":
|
"@next/swc-darwin-arm64@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.13.tgz#76f08d78360c4d27d444df7f35a56f59a48f4808"
|
resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.32.tgz#83482a7282df899b73d916e02b02a189771e706c"
|
||||||
integrity sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg==
|
integrity sha512-osHXveM70zC+ilfuFa/2W6a1XQxJTvEhzEycnjUaVE8kpUS09lDpiDDX2YLdyFCzoUbvbo5r0X1Kp4MllIOShw==
|
||||||
|
|
||||||
"@next/swc-darwin-x64@14.2.13":
|
"@next/swc-darwin-x64@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.13.tgz#1d4821d54bb01dacc6a6c32408f8468a4f4af269"
|
resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.32.tgz#1a9eb676a014e1fc999251f10288c25a0f81d6d1"
|
||||||
integrity sha512-Dv1RBGs2TTjkwEnFMVL5XIfJEavnLqqwYSD6LXgTPdEy/u6FlSrLBSSfe1pcfqhFEXRAgVL3Wpjibe5wXJzWog==
|
integrity sha512-P9NpCAJuOiaHHpqtrCNncjqtSBi1f6QUdHK/+dNabBIXB2RUFWL19TY1Hkhu74OvyNQEYEzzMJCMQk5agjw1Qg==
|
||||||
|
|
||||||
"@next/swc-linux-arm64-gnu@14.2.13":
|
"@next/swc-linux-arm64-gnu@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.13.tgz#79d9af8d3408df9990c8911889eca1ca6a308f19"
|
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.32.tgz#7713a49abd555d6f698e766b1631b67d881b4ee4"
|
||||||
integrity sha512-yB1tYEFFqo4ZNWkwrJultbsw7NPAAxlPXURXioRl9SdW6aIefOLS+0TEsKrWBtbJ9moTDgU3HRILL6QBQnMevg==
|
integrity sha512-v7JaO0oXXt6d+cFjrrKqYnR2ubrD+JYP7nQVRZgeo5uNE5hkCpWnHmXm9vy3g6foMO8SPwL0P3MPw1c+BjbAzA==
|
||||||
|
|
||||||
"@next/swc-linux-arm64-musl@14.2.13":
|
"@next/swc-linux-arm64-musl@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.13.tgz#b13180645865b120591db2f1e831743ebc02ab36"
|
resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.32.tgz#327efdffe97e56f5389a7889cdedbd676fdbb519"
|
||||||
integrity sha512-v5jZ/FV/eHGoWhMKYrsAweQ7CWb8xsWGM/8m1mwwZQ/sutJjoFaXchwK4pX8NqwImILEvQmZWyb8pPTcP7htWg==
|
integrity sha512-tA6sIKShXtSJBTH88i0DRd6I9n3ZTirmwpwAqH5zdJoQF7/wlJXR8DkPmKwYl5mFWhEKr5IIa3LfpMW9RRwKmQ==
|
||||||
|
|
||||||
"@next/swc-linux-x64-gnu@14.2.13":
|
"@next/swc-linux-x64-gnu@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.13.tgz#8cb8480dfeee512648e4e08c2095aac0461b876f"
|
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.32.tgz#a3e7444613d0fe5c8ea4ead08d6a9c818246758c"
|
||||||
integrity sha512-aVc7m4YL7ViiRv7SOXK3RplXzOEe/qQzRA5R2vpXboHABs3w8vtFslGTz+5tKiQzWUmTmBNVW0UQdhkKRORmGA==
|
integrity sha512-7S1GY4TdnlGVIdeXXKQdDkfDysoIVFMD0lJuVVMeb3eoVjrknQ0JNN7wFlhCvea0hEk0Sd4D1hedVChDKfV2jw==
|
||||||
|
|
||||||
"@next/swc-linux-x64-musl@14.2.13":
|
"@next/swc-linux-x64-musl@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.13.tgz#df5ca922fa1e1ee81b15a06a2d3d3ace0efd2bd7"
|
resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.32.tgz#a2ec5b0a06c740d6740c938b1d4a614f1a13f018"
|
||||||
integrity sha512-4wWY7/OsSaJOOKvMsu1Teylku7vKyTuocvDLTZQq0TYv9OjiYYWt63PiE1nTuZnqQ4RPvME7Xai+9enoiN0Wrg==
|
integrity sha512-OHHC81P4tirVa6Awk6eCQ6RBfWl8HpFsZtfEkMpJ5GjPsJ3nhPe6wKAJUZ/piC8sszUkAgv3fLflgzPStIwfWg==
|
||||||
|
|
||||||
"@next/swc-win32-arm64-msvc@14.2.13":
|
"@next/swc-win32-arm64-msvc@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.13.tgz#8a7db6e71f526212587975f743b28e4d1cb829d1"
|
resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.32.tgz#b4d3e47c6b276fc4711deb978d04015d029d198d"
|
||||||
integrity sha512-uP1XkqCqV2NVH9+g2sC7qIw+w2tRbcMiXFEbMihkQ8B1+V6m28sshBwAB0SDmOe0u44ne1vFU66+gx/28RsBVQ==
|
integrity sha512-rORQjXsAFeX6TLYJrCG5yoIDj+NKq31Rqwn8Wpn/bkPNy5rTHvOXkW8mLFonItS7QC6M+1JIIcLe+vOCTOYpvg==
|
||||||
|
|
||||||
"@next/swc-win32-ia32-msvc@14.2.13":
|
"@next/swc-win32-ia32-msvc@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.13.tgz#6aa664f36f2d70c5ae6ffcbbc56784d33f24522d"
|
resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.32.tgz#d1f1f854a1fbbaeefa8f81271437448653f33494"
|
||||||
integrity sha512-V26ezyjPqQpDBV4lcWIh8B/QICQ4v+M5Bo9ykLN+sqeKKBxJVDpEc6biDVyluTXTC40f5IqCU0ttth7Es2ZuMw==
|
integrity sha512-jHUeDPVHrgFltqoAqDB6g6OStNnFxnc7Aks3p0KE0FbwAvRg6qWKYF5mSTdCTxA3axoSAUwxYdILzXJfUwlHhA==
|
||||||
|
|
||||||
"@next/swc-win32-x64-msvc@14.2.13":
|
"@next/swc-win32-x64-msvc@14.2.32":
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.13.tgz#5a920eea82a58affa6146192586716cec6c87fed"
|
resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.32.tgz#8212d681cf6858a9e3204728f8f2b161000683ed"
|
||||||
integrity sha512-WwzOEAFBGhlDHE5Z73mNU8CO8mqMNLqaG+AO9ETmzdCQlJhVtWZnOl2+rqgVQS+YHunjOWptdFmNfbpwcUuEsw==
|
integrity sha512-2N0lSoU4GjfLSO50wvKpMQgKd4HdI2UHEhQPPPnlgfBJlOgJxkjpkYBqzk08f1gItBB6xF/n+ykso2hgxuydsA==
|
||||||
|
|
||||||
"@nodelib/fs.scandir@2.1.5":
|
"@nodelib/fs.scandir@2.1.5":
|
||||||
version "2.1.5"
|
version "2.1.5"
|
||||||
@@ -2496,10 +2496,10 @@ browserslist@^4.23.0, browserslist@^4.23.3:
|
|||||||
node-releases "^2.0.18"
|
node-releases "^2.0.18"
|
||||||
update-browserslist-db "^1.1.0"
|
update-browserslist-db "^1.1.0"
|
||||||
|
|
||||||
bson@^6.7.0:
|
bson@^6.10.4:
|
||||||
version "6.8.0"
|
version "6.10.4"
|
||||||
resolved "https://registry.yarnpkg.com/bson/-/bson-6.8.0.tgz#5063c41ba2437c2b8ff851b50d9e36cb7aaa7525"
|
resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.4.tgz#d530733bb5bb16fb25c162e01a3344fab332fd2b"
|
||||||
integrity sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==
|
integrity sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==
|
||||||
|
|
||||||
buffer-from@^1.0.0:
|
buffer-from@^1.0.0:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
@@ -4487,13 +4487,13 @@ mongodb-connection-string-url@^3.0.0:
|
|||||||
"@types/whatwg-url" "^11.0.2"
|
"@types/whatwg-url" "^11.0.2"
|
||||||
whatwg-url "^13.0.0"
|
whatwg-url "^13.0.0"
|
||||||
|
|
||||||
mongodb@^6.4.0:
|
mongodb@^6.19.0:
|
||||||
version "6.9.0"
|
version "6.19.0"
|
||||||
resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.9.0.tgz#743ebfff6b3c14b04ac6e00a55e30d4127d3016d"
|
resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-6.19.0.tgz#d28df0ae4cb3bea4381206e2d9efc3c7b77531fe"
|
||||||
integrity sha512-UMopBVx1LmEUbW/QE0Hw18u583PEDVQmUmVzzBRH0o/xtE9DBRA5ZYLOjpLIa03i8FXjzvQECJcqoMvCXftTUA==
|
integrity sha512-H3GtYujOJdeKIMLKBT9PwlDhGrQfplABNF1G904w6r5ZXKWyv77aB0X9B+rhmaAwjtllHzaEkvi9mkGVZxs2Bw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@mongodb-js/saslprep" "^1.1.5"
|
"@mongodb-js/saslprep" "^1.1.9"
|
||||||
bson "^6.7.0"
|
bson "^6.10.4"
|
||||||
mongodb-connection-string-url "^3.0.0"
|
mongodb-connection-string-url "^3.0.0"
|
||||||
|
|
||||||
mrmime@^2.0.0:
|
mrmime@^2.0.0:
|
||||||
@@ -4568,12 +4568,12 @@ next-safe-action@^7.9.3:
|
|||||||
resolved "https://registry.yarnpkg.com/next-safe-action/-/next-safe-action-7.9.3.tgz#74df2030cbb5a05ff48b3a258297fefa3c4d2c68"
|
resolved "https://registry.yarnpkg.com/next-safe-action/-/next-safe-action-7.9.3.tgz#74df2030cbb5a05ff48b3a258297fefa3c4d2c68"
|
||||||
integrity sha512-2GH7/iRiM5R/y6sIQZsNHGeRr/iKQJsg8ejP63WhTS7fXS9KzxVbEKrWwLNNhL33V9cn0448cPSI/aiSK/PUbA==
|
integrity sha512-2GH7/iRiM5R/y6sIQZsNHGeRr/iKQJsg8ejP63WhTS7fXS9KzxVbEKrWwLNNhL33V9cn0448cPSI/aiSK/PUbA==
|
||||||
|
|
||||||
next@^14.0.4:
|
next@^14.2.3:
|
||||||
version "14.2.13"
|
version "14.2.32"
|
||||||
resolved "https://registry.yarnpkg.com/next/-/next-14.2.13.tgz#32da2ee0afbe729e2d4a467c3570def90e1c974d"
|
resolved "https://registry.yarnpkg.com/next/-/next-14.2.32.tgz#279b544f0c8ed023c33454ce4d563d3e05c2f3fb"
|
||||||
integrity sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg==
|
integrity sha512-fg5g0GZ7/nFc09X8wLe6pNSU8cLWbLRG3TZzPJ1BJvi2s9m7eF991se67wliM9kR5yLHRkyGKU49MMx58s3LJg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@next/env" "14.2.13"
|
"@next/env" "14.2.32"
|
||||||
"@swc/helpers" "0.5.5"
|
"@swc/helpers" "0.5.5"
|
||||||
busboy "1.6.0"
|
busboy "1.6.0"
|
||||||
caniuse-lite "^1.0.30001579"
|
caniuse-lite "^1.0.30001579"
|
||||||
@@ -4581,15 +4581,15 @@ next@^14.0.4:
|
|||||||
postcss "8.4.31"
|
postcss "8.4.31"
|
||||||
styled-jsx "5.1.1"
|
styled-jsx "5.1.1"
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@next/swc-darwin-arm64" "14.2.13"
|
"@next/swc-darwin-arm64" "14.2.32"
|
||||||
"@next/swc-darwin-x64" "14.2.13"
|
"@next/swc-darwin-x64" "14.2.32"
|
||||||
"@next/swc-linux-arm64-gnu" "14.2.13"
|
"@next/swc-linux-arm64-gnu" "14.2.32"
|
||||||
"@next/swc-linux-arm64-musl" "14.2.13"
|
"@next/swc-linux-arm64-musl" "14.2.32"
|
||||||
"@next/swc-linux-x64-gnu" "14.2.13"
|
"@next/swc-linux-x64-gnu" "14.2.32"
|
||||||
"@next/swc-linux-x64-musl" "14.2.13"
|
"@next/swc-linux-x64-musl" "14.2.32"
|
||||||
"@next/swc-win32-arm64-msvc" "14.2.13"
|
"@next/swc-win32-arm64-msvc" "14.2.32"
|
||||||
"@next/swc-win32-ia32-msvc" "14.2.13"
|
"@next/swc-win32-ia32-msvc" "14.2.32"
|
||||||
"@next/swc-win32-x64-msvc" "14.2.13"
|
"@next/swc-win32-x64-msvc" "14.2.32"
|
||||||
|
|
||||||
node-releases@^2.0.14, node-releases@^2.0.18:
|
node-releases@^2.0.14, node-releases@^2.0.18:
|
||||||
version "2.0.18"
|
version "2.0.18"
|
||||||
|
|||||||
Reference in New Issue
Block a user