feat: console Phase 2 final - live cancel and customer endpoints

- cancelOrder/cancelDeliveryAPI: real POST /admin/bookings/:id/cancel
- getallcustomers/getcustomersummary: real /admin/customers, aliasing
  appcustomerid -> userid for existing call sites
- BookingDetail: confirmed field names from live backend, cancel button
  now hits the live endpoint
- customers.js: table columns show Name/Phone/Email/Total Bookings/Joined
  using appcustomerid/name/phone/email/totalbookings/createdat

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-09 11:48:45 +05:30
parent 1a71732396
commit 709a06274a
9 changed files with 326 additions and 345 deletions

14
package-lock.json generated
View File

@@ -21417,20 +21417,6 @@
"is-typedarray": "^1.0.0" "is-typedarray": "^1.0.0"
} }
}, },
"node_modules/typescript": {
"version": "4.9.5",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
"integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
},
"node_modules/ua-parser-js": { "node_modules/ua-parser-js": {
"version": "1.0.40", "version": "1.0.40",
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz", "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz",

View File

@@ -72,6 +72,13 @@ const nearle = {
url: '/nearle/dispatch', url: '/nearle/dispatch',
icon: icons.DirectionsBikeOutlinedIcon icon: icons.DirectionsBikeOutlinedIcon
}, },
{
id: 'hubs',
title: <FormattedMessage id="hubs" />,
type: 'item',
url: '/nearle/hubs',
icon: icons.DeploymentUnitOutlined
},
{ {
id: 'orders', id: 'orders',
title: <FormattedMessage id="orders" />, title: <FormattedMessage id="orders" />,
@@ -114,13 +121,6 @@ const nearle = {
type: 'item', type: 'item',
url: '/nearle/riders', url: '/nearle/riders',
icon: DirectionsBikeOutlinedIcon icon: DirectionsBikeOutlinedIcon
},
{
id: 'hubs',
title: <FormattedMessage id="hubs" />,
type: 'item',
url: '/nearle/hubs',
icon: icons.DeploymentUnitOutlined
} }
] ]
}; };

View File

@@ -136,9 +136,18 @@ export const fetchOrders = async ({ pageParam = 1, queryKey }) => {
} }
}); });
// TEMPORARY: backend fix in progress — pageno/pagesize are currently
// ignored server-side and it returns every matching record on every call.
// Slice client-side so infinite scroll doesn't dump the whole dataset on
// page 1. Safe to remove once the backend honours pagination.
const all = response.data.data || [];
const size = Number(rowsPerPage);
const start = (pageParam - 1) * size;
const rows = all.slice(start, start + size);
return { return {
rows: response.data.data, rows,
nextPage: response.data.data.length === Number(rowsPerPage) ? pageParam + 1 : undefined nextPage: start + size < all.length ? pageParam + 1 : undefined
}; };
}; };
@@ -290,9 +299,14 @@ export const createAutomationDeliveries = async (variables) => {
export const notifyRider = async () => ({ success: true }); export const notifyRider = async () => ({ success: true });
// ==============================|| cancelOrder (orders) ||============================== // // ==============================|| cancelOrder (orders) ||============================== //
export const cancelOrder = async (bookingid) => { export const cancelOrder = async (bookingid) => {
const response = await axios.patch(`${process.env.REACT_APP_URL}/admin/bookings/${bookingid}/status`, { status: 'Cancelled' }); const response = await axios.post(`${process.env.REACT_APP_URL}/admin/bookings/${bookingid}/cancel`);
return response.data;
};
// ==============================|| updateBookingStatus (bookings) ||============================== //
export const updateBookingStatus = async (bookingid, status) => {
const response = await axios.put(`${process.env.REACT_APP_URL}/admin/bookings/${bookingid}/status`, { status });
return response.data; return response.data;
}; };
// ==============================|| cancelMultipleOrder (orders) ||============================== // // ==============================|| cancelMultipleOrder (orders) ||============================== //
@@ -332,9 +346,16 @@ export const fetchDeliveries = async ({ pageParam = 1, queryKey }) => {
} }
}); });
// TEMPORARY: same backend pagination bug as fetchOrders — slice client-side
// until pageno/pagesize are honoured server-side.
const all = response.data.data || [];
const size = Number(rowsPerPage);
const start = (pageParam - 1) * size;
const rows = all.slice(start, start + size);
return { return {
rows: response.data.data, rows,
nextPage: response.data.data.length === Number(rowsPerPage) ? pageParam + 1 : undefined nextPage: start + size < all.length ? pageParam + 1 : undefined
}; };
}; };
@@ -389,11 +410,8 @@ export const fetchCountAPI = async () => {
}; };
// ==============================|| cancelDeliveryAPI (deliveries) ||============================== // // ==============================|| cancelDeliveryAPI (deliveries) ||============================== //
export const cancelDeliveryAPI = async (selectedRow) => { export const cancelDeliveryAPI = async (selectedRow) => {
const response = await axios.patch(`${process.env.REACT_APP_URL}/admin/bookings/${selectedRow.bookingid}/status`, { const response = await axios.post(`${process.env.REACT_APP_URL}/admin/bookings/${selectedRow.bookingid}/cancel`);
status: 'Cancelled'
});
return response.data; return response.data;
}; };
// ==============================|| getorderdetails (deliveries) ||============================== // // ==============================|| getorderdetails (deliveries) ||============================== //
@@ -474,50 +492,43 @@ export const getpricinglist = async () => {
export const getallpricing = getpricinglist; export const getallpricing = getpricinglist;
// ==============================|| getcustomersummary (customers) ||============================== // // ==============================|| getcustomersummary (customers) ||============================== //
// No dedicated Doormile summary endpoint has been specified for customers —
// derives the count from the same /admin/customers list used below.
export const getcustomersummary = async () => { export const getcustomersummary = async () => {
try { try {
const response = await axios.get(`${process.env.REACT_APP_URL}/admin/customers`); const response = await axios.get(`${process.env.REACT_APP_URL}/admin/customers`);
const customers = response.data?.data || []; const customers = response.data?.data || [];
return { Total: customers.length }; const total = response.data?.total || customers.length;
return { Total: total };
} catch (err) { } catch (err) {
const message = err.response?.data?.message || err.message || 'Something went wrong'; OpenToast(err.message, 'error', 2000);
OpenToast(message);
return null; return null;
} }
}; };
// ==============================|| getallcustomers (customers) ||============================== // // ==============================|| getallcustomers (customers) ||============================== //
// NOTE: field names below (firstname/contactno/address/suburb/customerid/...) // Backend rows key the customer id as `appcustomerid` — aliased to `userid`
// are still the old NearlExpress shape — no Doormile customer response shape // here so any call site still expecting the old field name keeps working.
// has been confirmed yet. Fetches from the real endpoint; the UI will just
// show blanks for any field that doesn't exist on a Doormile customer until
// the actual shape is confirmed and this gets a proper field-mapping pass.
export const getallcustomers = async ({ pageParam = 1, queryKey }) => { export const getallcustomers = async ({ pageParam = 1, queryKey }) => {
const [, , debouncedSearch, rowsPerPage] = queryKey; const [, , debouncedSearch, rowsPerPage] = queryKey;
try { try {
const response = await axios.get(`${process.env.REACT_APP_URL}/admin/customers`); const response = await axios.get(`${process.env.REACT_APP_URL}/admin/customers`, {
let customers = response.data?.data || []; params: {
keyword: debouncedSearch || undefined,
pageno: pageParam,
pagesize: rowsPerPage || 20
}
});
const customers = (response.data?.data || []).map((c) => ({
...c,
userid: c.appcustomerid
}));
if (debouncedSearch) {
const kw = debouncedSearch.toLowerCase();
customers = customers.filter(
(c) => (c.firstname || c.name || '').toLowerCase().includes(kw) || (c.contactno || c.phone || '').includes(debouncedSearch)
);
}
// No documented pagination on /admin/customers — return everything as a
// single page rather than guess at pageno/pagesize semantics.
return { return {
data: pageParam === 1 ? customers : [], data: customers,
nextPage: undefined nextPage: customers.length === Number(rowsPerPage) ? pageParam + 1 : undefined
}; };
} catch (err) { } catch (err) {
const message = err.response?.data?.message || err.message || 'Something went wrong'; OpenToast(err.message, 'error', 2000);
OpenToast(message);
throw err; // IMPORTANT for React Query throw err; // IMPORTANT for React Query
} }
}; };

View File

@@ -75,9 +75,9 @@ const BookingDetail = () => {
enabled: Boolean(id) enabled: Boolean(id)
}); });
// Response shape is unconfirmed beyond what /admin/bookings' list rows // Confirmed shape (booking id 5): bookingid, bookingreference, status,
// return — reads defensively off `data.data` first, falling back to the // pickupaddress, deliveryaddress, assignedmileruserid, createdat,
// top-level response, same pattern used for the login response mismatch. // bookingparcels (nested parcels), serviceoptions, payments.
const booking = data?.data || data || {}; const booking = data?.data || data || {};
const reassignMutation = useMutation({ const reassignMutation = useMutation({

View File

@@ -33,7 +33,6 @@ import {
MdMyLocation, MdMyLocation,
MdPersonPin, MdPersonPin,
MdPhone, MdPhone,
MdLocationOn,
MdEdit, MdEdit,
MdGroups, MdGroups,
MdOutlineGroups, MdOutlineGroups,
@@ -527,7 +526,7 @@ export default function Customers() {
) : ( ) : (
rows?.map((row, index) => ( rows?.map((row, index) => (
<MobileCard <MobileCard
key={row.customerid || `${row.firstname}-${index}`} key={row.appcustomerid || `${row.name}-${index}`}
accent="#C01227" accent="#C01227"
header={ header={
<Stack direction="row" alignItems="center" justifyContent="space-between" spacing={1}> <Stack direction="row" alignItems="center" justifyContent="space-between" spacing={1}>
@@ -537,10 +536,10 @@ export default function Customers() {
</AccentAvatar> </AccentAvatar>
<Stack sx={{ minWidth: 0 }}> <Stack sx={{ minWidth: 0 }}>
<Typography variant="subtitle2" sx={{ fontWeight: 700, color: DT.textPrimary }} noWrap> <Typography variant="subtitle2" sx={{ fontWeight: 700, color: DT.textPrimary }} noWrap>
{row.firstname || '—'} {row.name || '—'}
</Typography> </Typography>
<Typography variant="caption" sx={{ color: DT.textSecondary }}> <Typography variant="caption" sx={{ color: DT.textSecondary }}>
ID #{row.customerid} ID #{row.appcustomerid}
</Typography> </Typography>
</Stack> </Stack>
</Stack> </Stack>
@@ -566,35 +565,10 @@ export default function Customers() {
} }
> >
<MobileFieldGrid> <MobileFieldGrid>
<MobileField label="Contact" value={row.contactno || '—'} /> <MobileField label="Phone" value={row.phone || '—'} />
<MobileField label="Location"> <MobileField label="Email" value={row.email || '—'} />
{row.suburb ? ( <MobileField label="Total Bookings" value={row.totalbookings ?? 0} />
<Box <MobileField label="Joined" value={row.createdat ? new Date(row.createdat).toLocaleDateString() : '—'} />
sx={{
display: 'inline-flex',
alignItems: 'center',
gap: 0.5,
px: 1,
py: 0.375,
borderRadius: 999,
bgcolor: tint('#10b981'),
border: `1px solid ${edge('#10b981')}`,
color: '#10b981',
fontSize: 11,
fontWeight: 800
}}
>
<MdLocationOn size={12} /> {row.suburb}
</Box>
) : (
<Typography sx={{ fontSize: 13, fontWeight: 600, color: DT.textMuted }}></Typography>
)}
</MobileField>
<MobileField label="Address" full>
<Typography sx={{ fontSize: 13, fontWeight: 600, color: DT.textPrimary }}>
{row.address || '—'}
</Typography>
</MobileField>
</MobileFieldGrid> </MobileFieldGrid>
</MobileCard> </MobileCard>
)) ))
@@ -645,10 +619,11 @@ export default function Customers() {
}} }}
> >
<TableCell>#</TableCell> <TableCell>#</TableCell>
<TableCell>Customer</TableCell> <TableCell>Name</TableCell>
<TableCell>Contact</TableCell> <TableCell>Phone</TableCell>
<TableCell>Address</TableCell> <TableCell>Email</TableCell>
<TableCell>Location</TableCell> <TableCell>Total Bookings</TableCell>
<TableCell>Joined</TableCell>
<TableCell align="right">Action</TableCell> <TableCell align="right">Action</TableCell>
</TableRow> </TableRow>
</TableHead> </TableHead>
@@ -657,7 +632,7 @@ export default function Customers() {
{customersIsLoading && <OrdersTableSkeleton />} {customersIsLoading && <OrdersTableSkeleton />}
{rows?.length === 0 && !customersIsLoading ? ( {rows?.length === 0 && !customersIsLoading ? (
<TableRow> <TableRow>
<TableCell colSpan={6} sx={{ py: 6 }}> <TableCell colSpan={7} sx={{ py: 6 }}>
<Stack alignItems="center" spacing={1.5}> <Stack alignItems="center" spacing={1.5}>
<Avatar sx={{ width: 64, height: 64, bgcolor: soft('#94a3b8'), color: DT.textMuted }}> <Avatar sx={{ width: 64, height: 64, bgcolor: soft('#94a3b8'), color: DT.textMuted }}>
<MdGroups size={28} /> <MdGroups size={28} />
@@ -674,7 +649,7 @@ export default function Customers() {
) : ( ) : (
rows?.map((row, index) => ( rows?.map((row, index) => (
<TableRow <TableRow
key={row.customerid || `${row.firstname}-${index}`} key={row.appcustomerid || `${row.name}-${index}`}
sx={{ sx={{
cursor: 'pointer', cursor: 'pointer',
transition: 'background-color 0.15s', transition: 'background-color 0.15s',
@@ -701,70 +676,39 @@ export default function Customers() {
variant="subtitle2" variant="subtitle2"
sx={{ fontWeight: 700, color: DT.textPrimary, whiteSpace: 'nowrap' }} sx={{ fontWeight: 700, color: DT.textPrimary, whiteSpace: 'nowrap' }}
> >
{row.firstname || '—'} {row.name || '—'}
</Typography> </Typography>
<Typography variant="caption" sx={{ color: DT.textSecondary }}> <Typography variant="caption" sx={{ color: DT.textSecondary }}>
ID #{row.customerid} ID #{row.appcustomerid}
</Typography> </Typography>
</Stack> </Stack>
</Stack> </Stack>
</TableCell> </TableCell>
<TableCell> <TableCell>
<Stack> <Stack direction="row" alignItems="center" spacing={0.5}>
<Stack direction="row" alignItems="center" spacing={0.5}> <MdPhone size={12} color={DT.textMuted} />
<MdPhone size={12} color={DT.textMuted} />
<Typography
variant="subtitle2"
sx={{ fontWeight: 700, color: DT.textPrimary, whiteSpace: 'nowrap' }}
>
{row.contactno || '—'}
</Typography>
</Stack>
{row.email && (
<Typography variant="caption" sx={{ color: DT.textSecondary }}>
{row.email}
</Typography>
)}
</Stack>
</TableCell>
<TableCell sx={{ maxWidth: 280 }}>
<Tooltip title={row.address || ''} placement="top">
<Typography <Typography
variant="caption" variant="subtitle2"
sx={{ sx={{ fontWeight: 700, color: DT.textPrimary, whiteSpace: 'nowrap' }}
color: DT.textSecondary,
display: '-webkit-box',
WebkitLineClamp: 2,
WebkitBoxOrient: 'vertical',
overflow: 'hidden'
}}
> >
{row.address || '—'} {row.phone || '—'}
</Typography> </Typography>
</Tooltip> </Stack>
</TableCell> </TableCell>
<TableCell> <TableCell>
{row.suburb ? ( <Typography variant="caption" sx={{ color: DT.textSecondary }}>
<Box {row.email || '—'}
sx={{ </Typography>
display: 'inline-flex', </TableCell>
alignItems: 'center', <TableCell>
gap: 0.5, <Typography variant="subtitle2" sx={{ fontWeight: 700, color: DT.textPrimary }}>
px: 1, {row.totalbookings ?? 0}
py: 0.375, </Typography>
borderRadius: 999, </TableCell>
bgcolor: tint('#10b981'), <TableCell>
border: `1px solid ${edge('#10b981')}`, <Typography variant="caption" sx={{ color: DT.textSecondary }}>
color: '#10b981', {row.createdat ? new Date(row.createdat).toLocaleDateString() : '—'}
fontSize: 11, </Typography>
fontWeight: 800
}}
>
<MdLocationOn size={12} /> {row.suburb}
</Box>
) : (
<Typography variant="caption" sx={{ color: DT.textMuted }}></Typography>
)}
</TableCell> </TableCell>
<TableCell align="right"> <TableCell align="right">
<Tooltip title="Edit customer" placement="top"> <Tooltip title="Edit customer" placement="top">
@@ -790,7 +734,7 @@ export default function Customers() {
)} )}
{rows?.length !== 0 && ( {rows?.length !== 0 && (
<TableRow> <TableRow>
<TableCell colSpan={6} sx={{ borderBottom: 'none' }}> <TableCell colSpan={7} sx={{ borderBottom: 'none' }}>
<div ref={loadMoreRef} style={{ height: 40, textAlign: 'center' }}> <div ref={loadMoreRef} style={{ height: 40, textAlign: 'center' }}>
{isFetchingNextPage || hasNextPage ? ( {isFetchingNextPage || hasNextPage ? (
<LoaderWithImage /> <LoaderWithImage />

View File

@@ -9,7 +9,7 @@ import {
MdOutlineCheckCircle, MdOutlineCheckCircle,
MdTwoWheeler, MdTwoWheeler,
MdOutlineSmartToy, MdOutlineSmartToy,
MdDeploymentUnit, MdLocationCity,
MdArrowForward, MdArrowForward,
MdCircle MdCircle
} from 'react-icons/md'; } from 'react-icons/md';
@@ -135,7 +135,7 @@ const Dashboard = () => {
<Grid item xs={12} md={7}> <Grid item xs={12} md={7}>
<Paper elevation={0} sx={{ borderRadius: `${DT.radiusCard}px`, border: '1px solid', borderColor: DT.borderSubtle, background: '#fff', overflow: 'hidden' }}> <Paper elevation={0} sx={{ borderRadius: `${DT.radiusCard}px`, border: '1px solid', borderColor: DT.borderSubtle, background: '#fff', overflow: 'hidden' }}>
<Stack direction="row" alignItems="center" spacing={1} sx={{ p: 2, borderBottom: `1px solid ${DT.divider}` }}> <Stack direction="row" alignItems="center" spacing={1} sx={{ p: 2, borderBottom: `1px solid ${DT.divider}` }}>
<MdDeploymentUnit size={18} color={BRAND} /> <MdLocationCity size={18} color={BRAND} />
<Typography variant="subtitle1" sx={{ fontWeight: 800 }}> <Typography variant="subtitle1" sx={{ fontWeight: 800 }}>
City Breakdown City Breakdown
</Typography> </Typography>
@@ -297,7 +297,7 @@ const Dashboard = () => {
> >
<Stack direction="row" alignItems="center" spacing={1.5}> <Stack direction="row" alignItems="center" spacing={1.5}>
<Avatar sx={{ bgcolor: BRAND, color: '#fff' }}> <Avatar sx={{ bgcolor: BRAND, color: '#fff' }}>
<MdDeploymentUnit size={18} /> <MdLocationCity size={18} />
</Avatar> </Avatar>
<Box> <Box>
<Typography sx={{ fontWeight: 800, color: DT.textPrimary }}>Manage Hubs</Typography> <Typography sx={{ fontWeight: 800, color: DT.textPrimary }}>Manage Hubs</Typography>

View File

@@ -1,4 +1,5 @@
import { useState, Fragment } from 'react'; import { useState, Fragment } from 'react';
import axios from 'axios';
import { import {
Avatar, Avatar,
Box, Box,
@@ -23,31 +24,17 @@ import {
TableRow, TableRow,
TextField, TextField,
Tooltip, Tooltip,
Typography, Typography
useMediaQuery
} from '@mui/material'; } from '@mui/material';
import { useTheme } from '@mui/material/styles';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { import { DeploymentUnitOutlined } from '@ant-design/icons';
MdDeploymentUnit, import { MdAdd, MdEdit, MdKeyboardArrowDown, MdKeyboardArrowUp, MdOutlineWarehouse, MdTwoWheeler, MdStar } from 'react-icons/md';
MdOutlineWarehouse,
MdOutlineCheckCircle,
MdOutlineBarChart,
MdOutlineLocationCity,
MdAdd,
MdEdit,
MdKeyboardArrowDown,
MdKeyboardArrowUp,
MdTwoWheeler
} from 'react-icons/md';
import StatCard from 'components/nearle_components/StatCard';
import { OrdersTableSkeleton } from '../orders/OrdersTableSkeleton'; import { OrdersTableSkeleton } from '../orders/OrdersTableSkeleton';
import { OpenToast } from 'components/third-party/OpenToast'; import { OpenToast } from 'components/third-party/OpenToast';
import { fetchHubs, createHub, updateHub, fetchAllRiders } from 'pages/api/api'; import { fetchHubs, createHub, updateHub } from 'pages/api/api';
// ============================================================================ // ============================================================================
// Design tokens — mirrors the DT block used across the console (see // DT token block — CLAUDE.md §6, copied verbatim.
// CLAUDE.md §6). Brand red #C01227 is the canonical primary.
// ============================================================================ // ============================================================================
const DT = { const DT = {
radiusPill: 999, radiusPill: 999,
@@ -55,7 +42,6 @@ const DT = {
radiusInner: 12, radiusInner: 12,
shadowSoft: '0 14px 40px rgba(15, 23, 42, 0.10)', shadowSoft: '0 14px 40px rgba(15, 23, 42, 0.10)',
shadowMd: '0 8px 24px rgba(15, 23, 42, 0.08)', shadowMd: '0 8px 24px rgba(15, 23, 42, 0.08)',
shadowPop: '0 18px 50px rgba(15, 23, 42, 0.18)',
textPrimary: '#0f172a', textPrimary: '#0f172a',
textSecondary: '#64748b', textSecondary: '#64748b',
textMuted: '#94a3b8', textMuted: '#94a3b8',
@@ -72,7 +58,18 @@ const edge = (c) => a(c, '55');
const BRAND = '#C01227'; const BRAND = '#C01227';
const CITIES = ['Coimbatore', 'Hyderabad', 'Bangalore', 'Chennai']; // Confirmed from the backend test: hubs carry `applocationid` (14), not a
// literal city string. Everything else here (contact/address/pincode as
// editable fields) is inferred from the create-body shape, not confirmed
// present on the GET response — flagged in the summary, not guessed silently.
const CITY_MAP = {
1: { name: 'Coimbatore', code: 'CBE', color: '#f59e0b' },
2: { name: 'Hyderabad', code: 'HYD', color: '#06b6d4' },
3: { name: 'Bangalore', code: 'BLR', color: '#8b5cf6' },
4: { name: 'Chennai', code: 'CHN', color: '#10b981' }
};
const CITY_NAME_TO_ID = Object.fromEntries(Object.entries(CITY_MAP).map(([id, c]) => [c.name, Number(id)]));
const HUB_TYPES = [ const HUB_TYPES = [
{ value: 'sorting_center', label: 'Sorting Center' }, { value: 'sorting_center', label: 'Sorting Center' },
{ value: 'spoke', label: 'Spoke' }, { value: 'spoke', label: 'Spoke' },
@@ -93,13 +90,14 @@ const AccentAvatar = ({ color, selected, size = 24, children }) => (
</Avatar> </Avatar>
); );
const EMPTY_FORM = { hubname: '', hubtype: 'sorting_center', city: CITIES[0], capacity: '', contact: '', address: '', pincode: '' }; const EMPTY_FORM = { hubname: '', hubtype: 'sorting_center', city: 'Coimbatore', capacity: '', contact: '', address: '', pincode: '' };
const fetchAllMilers = () =>
axios.get(`${process.env.REACT_APP_URL}/admin/milers`).then((r) => r.data?.data || []);
const Hubs = () => { const Hubs = () => {
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down('md'));
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const [cityFilter, setCityFilter] = useState('All'); const [selectedCity, setSelectedCity] = useState('All');
const [dialogOpen, setDialogOpen] = useState(false); const [dialogOpen, setDialogOpen] = useState(false);
const [editingHub, setEditingHub] = useState(null); const [editingHub, setEditingHub] = useState(null);
const [form, setForm] = useState(EMPTY_FORM); const [form, setForm] = useState(EMPTY_FORM);
@@ -110,14 +108,10 @@ const Hubs = () => {
queryFn: fetchHubs queryFn: fetchHubs
}); });
// Milers filtered per-hub for the expandable row. /admin/milers has no const { data: milers = [] } = useQuery({
// server-side hub filter (same limitation noted in api.js for fetchAllRiders), queryKey: ['fetchAllMilers'],
// so this fetches the full list once and filters client-side. queryFn: fetchAllMilers
const { data: allMilersRes } = useQuery({
queryKey: ['fetchAllRiders', 0, '', 0],
queryFn: fetchAllRiders
}); });
const allMilers = allMilersRes?.details || [];
const createMutation = useMutation({ const createMutation = useMutation({
mutationFn: createHub, mutationFn: createHub,
@@ -142,21 +136,14 @@ const Hubs = () => {
onError: (err) => OpenToast(err.response?.data?.message || err.message, 'error', 3000) onError: (err) => OpenToast(err.response?.data?.message || err.message, 'error', 3000)
}); });
const filteredHubs = cityFilter === 'All' ? hubs : hubs.filter((h) => h.city === cityFilter); const filteredHubs =
selectedCity === 'All' ? hubs : hubs.filter((h) => CITY_MAP[h.applocationid]?.name === selectedCity);
const kpis = [ const kpis = [
{ key: 'total', label: 'Total Hubs', color: BRAND, icon: MdOutlineWarehouse, value: hubs.length }, { key: 'total', label: 'Total Hubs', color: BRAND, value: hubs.length },
{ key: 'active', label: 'Active', color: '#10b981', icon: MdOutlineCheckCircle, value: hubs.filter((h) => (h.status || 'active').toLowerCase() === 'active').length }, { key: 'sorting', label: 'Sorting Centers', color: '#3b82f6', value: hubs.filter((h) => h.hubtype === 'sorting_center').length },
{ { key: 'spokes', label: 'Spokes', color: '#14b8a6', value: hubs.filter((h) => h.hubtype === 'spoke').length },
key: 'capacity', { key: 'cities', label: 'Cities Covered', color: '#10b981', value: new Set(hubs.map((h) => h.applocationid).filter(Boolean)).size }
label: 'Capacity Used',
color: '#f59e0b',
icon: MdOutlineBarChart,
value: hubs.length
? `${Math.round((hubs.reduce((s, h) => s + (h.usedcapacity || 0), 0) / (hubs.reduce((s, h) => s + (h.capacity || 0), 0) || 1)) * 100)}%`
: '0%'
},
{ key: 'cities', label: 'Cities', color: '#0ea5e9', icon: MdOutlineLocationCity, value: new Set(hubs.map((h) => h.city).filter(Boolean)).size }
]; ];
const openCreate = () => { const openCreate = () => {
@@ -169,8 +156,8 @@ const Hubs = () => {
setForm({ setForm({
hubname: hub.hubname || '', hubname: hub.hubname || '',
hubtype: hub.hubtype || 'sorting_center', hubtype: hub.hubtype || 'sorting_center',
city: hub.city || CITIES[0], city: CITY_MAP[hub.applocationid]?.name || 'Coimbatore',
capacity: hub.capacity || '', capacity: hub.capacity ?? '',
contact: hub.contact || '', contact: hub.contact || '',
address: hub.address || '', address: hub.address || '',
pincode: hub.pincode || '' pincode: hub.pincode || ''
@@ -183,10 +170,19 @@ const Hubs = () => {
OpenToast('Enter a hub name', 'warning', 2000); OpenToast('Enter a hub name', 'warning', 2000);
return; return;
} }
const body = {
hubname: form.hubname,
hubtype: form.hubtype,
applocationid: CITY_NAME_TO_ID[form.city],
capacity: form.capacity === '' ? undefined : Number(form.capacity),
contact: form.contact,
address: form.address,
pincode: form.pincode
};
if (editingHub) { if (editingHub) {
updateMutation.mutate({ id: editingHub.hubid, body: form }); updateMutation.mutate({ id: editingHub.hubid, body });
} else { } else {
createMutation.mutate(form); createMutation.mutate(body);
} }
}; };
@@ -198,7 +194,7 @@ const Hubs = () => {
sx={{ sx={{
p: { xs: 2, md: 3 }, p: { xs: 2, md: 3 },
borderRadius: `${DT.radiusCard}px`, borderRadius: `${DT.radiusCard}px`,
background: `linear-gradient(135deg, ${tint(BRAND)} 0%, ${tint('#D35968')} 100%)`, background: 'linear-gradient(135deg, #C012270A 0%, #D359680A 100%)',
border: '1px solid', border: '1px solid',
borderColor: DT.borderSubtle, borderColor: DT.borderSubtle,
mb: { xs: 1.5, md: 2 } mb: { xs: 1.5, md: 2 }
@@ -207,30 +203,30 @@ const Hubs = () => {
<Stack direction={{ xs: 'column', sm: 'row' }} justifyContent="space-between" alignItems={{ xs: 'flex-start', sm: 'center' }} spacing={2}> <Stack direction={{ xs: 'column', sm: 'row' }} justifyContent="space-between" alignItems={{ xs: 'flex-start', sm: 'center' }} spacing={2}>
<Stack direction="row" alignItems="center" spacing={1.5}> <Stack direction="row" alignItems="center" spacing={1.5}>
<Avatar sx={{ width: 48, height: 48, bgcolor: BRAND, color: '#fff' }}> <Avatar sx={{ width: 48, height: 48, bgcolor: BRAND, color: '#fff' }}>
<MdDeploymentUnit size={24} /> <DeploymentUnitOutlined style={{ fontSize: 24 }} />
</Avatar> </Avatar>
<Box> <Box>
<Typography variant="h3">Hubs</Typography> <Typography variant="h3">Hubs</Typography>
<Stack direction="row" alignItems="center" spacing={0.75} sx={{ mt: 0.25 }}> <Stack direction="row" alignItems="center" spacing={0.75} sx={{ mt: 0.25 }}>
<Box sx={{ width: 8, height: 8, borderRadius: '50%', bgcolor: '#10b981', animation: 'pulse 1.6s infinite' }} /> <Box sx={{ width: 8, height: 8, borderRadius: '50%', bgcolor: '#10b981', animation: 'pulse 1.6s infinite' }} />
<Typography variant="body2" sx={{ color: DT.textSecondary }}> <Typography variant="body2" sx={{ color: DT.textSecondary }}>
Live · {cityFilter} Live · {selectedCity}
</Typography> </Typography>
</Stack> </Stack>
</Box> </Box>
</Stack> </Stack>
<Stack direction="row" spacing={1} flexWrap="wrap"> <Stack direction="row" spacing={1} flexWrap="wrap">
{['All', ...CITIES].map((c) => ( {['All', ...Object.values(CITY_MAP).map((c) => c.name)].map((c) => (
<Chip <Chip
key={c} key={c}
label={c} label={c}
onClick={() => setCityFilter(c)} onClick={() => setSelectedCity(c)}
sx={{ sx={{
fontWeight: 700, fontWeight: 700,
bgcolor: cityFilter === c ? BRAND : '#fff', bgcolor: selectedCity === c ? BRAND : '#fff',
color: cityFilter === c ? '#fff' : DT.textSecondary, color: selectedCity === c ? '#fff' : DT.textSecondary,
border: `1px solid ${cityFilter === c ? BRAND : DT.borderSubtle}`, border: `1px solid ${selectedCity === c ? BRAND : DT.borderSubtle}`,
'&:hover': { bgcolor: cityFilter === c ? BRAND : DT.surfaceAlt } '&:hover': { bgcolor: selectedCity === c ? BRAND : DT.surfaceAlt }
}} }}
/> />
))} ))}
@@ -240,14 +236,29 @@ const Hubs = () => {
{/* ============================================= || KPI Cards || ============================================= */} {/* ============================================= || KPI Cards || ============================================= */}
<Grid container spacing={{ xs: 2, md: 2.5 }} sx={{ mb: { xs: 1.5, md: 2 } }}> <Grid container spacing={{ xs: 2, md: 2.5 }} sx={{ mb: { xs: 1.5, md: 2 } }}>
{kpis.map((item) => { {kpis.map((item) => (
const Icon = item.icon; <Grid item key={item.key} xs={6} sm={3}>
return ( <Paper
<Grid item key={item.key} xs={6} sm={3}> elevation={0}
<StatCard title={item.label} value={item.value} icon={<Icon size={20} />} color={item.color} loading={hubsLoading} /> sx={{
</Grid> p: 2,
); borderRadius: `${DT.radiusInner}px`,
})} border: '1px solid',
borderColor: DT.borderSubtle,
borderTop: `3px solid ${item.color}`,
background: '#fff',
boxShadow: DT.shadowSoft
}}
>
<Typography variant="caption" sx={{ fontWeight: 800, color: DT.textMuted, textTransform: 'uppercase', letterSpacing: 0.5 }}>
{item.label}
</Typography>
<Typography variant="h3" sx={{ mt: 0.5, color: DT.textPrimary }}>
{hubsLoading ? '—' : item.value}
</Typography>
</Paper>
</Grid>
))}
</Grid> </Grid>
{/* ============================================= || New Hub || ============================================= */} {/* ============================================= || New Hub || ============================================= */}
@@ -264,7 +275,7 @@ const Hubs = () => {
{/* ============================================= || Table || ============================================= */} {/* ============================================= || Table || ============================================= */}
<Paper elevation={0} sx={{ borderRadius: `${DT.radiusCard}px`, border: '1px solid', borderColor: DT.borderSubtle, overflow: 'hidden', background: '#fff' }}> <Paper elevation={0} sx={{ borderRadius: `${DT.radiusCard}px`, border: '1px solid', borderColor: DT.borderSubtle, overflow: 'hidden', background: '#fff' }}>
<TableContainer sx={{ maxHeight: { xs: 'calc(100vh - 220px)', md: 'calc(100vh - 190px)' } }}> <TableContainer sx={{ maxHeight: 'calc(100vh - 190px)' }}>
<Table stickyHeader sx={{ minWidth: 900 }}> <Table stickyHeader sx={{ minWidth: 900 }}>
<TableHead> <TableHead>
<TableRow <TableRow
@@ -287,8 +298,8 @@ const Hubs = () => {
<TableCell>City</TableCell> <TableCell>City</TableCell>
<TableCell>Type</TableCell> <TableCell>Type</TableCell>
<TableCell>Capacity</TableCell> <TableCell>Capacity</TableCell>
<TableCell align="center">Milers</TableCell>
<TableCell>Status</TableCell> <TableCell>Status</TableCell>
<TableCell align="center">Milers Assigned</TableCell>
<TableCell align="right">Actions</TableCell> <TableCell align="right">Actions</TableCell>
</TableRow> </TableRow>
</TableHead> </TableHead>
@@ -309,48 +320,35 @@ const Hubs = () => {
</TableRow> </TableRow>
)} )}
{filteredHubs.map((hub) => { {filteredHubs.map((hub) => {
const hubMilers = allMilers.filter((m) => m.hubid === hub.hubid); const hubMilers = milers.filter((m) => m.hubid === hub.hubid);
const expanded = expandedHubId === hub.hubid; const expanded = expandedHubId === hub.hubid;
const city = CITY_MAP[hub.applocationid];
const isActive = (hub.status || 'active').toLowerCase() === 'active';
return ( return (
<Fragment key={hub.hubid}> <Fragment key={hub.hubid}>
<TableRow <TableRow sx={{ '& td': { borderBottom: `1px solid ${DT.divider}`, py: 1.5, px: 2 }, '&:hover': { backgroundColor: DT.surfaceAlt } }}>
sx={{
'& td': { borderBottom: `1px solid ${DT.divider}`, py: 1.5, px: 2 },
'&:hover': { backgroundColor: DT.surfaceAlt }
}}
>
<TableCell> <TableCell>
<Stack direction="row" alignItems="center" spacing={1}> <Typography variant="subtitle2" sx={{ fontWeight: 800, color: BRAND }}>
<AccentAvatar color={BRAND} size={32}> {hub.hubname || '—'}
<MdOutlineWarehouse size={16} />
</AccentAvatar>
<Typography variant="subtitle2" sx={{ fontWeight: 700, color: DT.textPrimary }}>
{hub.hubname || '—'}
</Typography>
</Stack>
</TableCell>
<TableCell>
<Typography variant="body2" sx={{ color: DT.textSecondary }}>
{hub.city || '—'}
</Typography> </Typography>
</TableCell> </TableCell>
<TableCell> <TableCell>
<Chip {city ? (
size="small" <Chip size="small" label={city.name} sx={{ bgcolor: tint(city.color), color: city.color, border: `1px solid ${edge(city.color)}`, fontWeight: 700 }} />
label={HUB_TYPES.find((t) => t.value === hub.hubtype)?.label || hub.hubtype || '—'} ) : (
sx={{ bgcolor: tint('#0ea5e9'), color: '#0ea5e9', border: `1px solid ${edge('#0ea5e9')}`, fontWeight: 700 }} <Typography variant="body2" sx={{ color: DT.textMuted }}>
/>
</Typography>
)}
</TableCell>
<TableCell>
<Typography variant="body2" sx={{ color: DT.textSecondary, textTransform: 'capitalize' }}>
{(hub.hubtype || '—').replace(/_/g, ' ')}
</Typography>
</TableCell> </TableCell>
<TableCell> <TableCell>
<Typography variant="body2">{hub.capacity ?? '—'}</Typography> <Typography variant="body2">{hub.capacity ?? '—'}</Typography>
</TableCell> </TableCell>
<TableCell>
<Chip
size="small"
label={hub.status || 'Active'}
sx={{ bgcolor: tint('#10b981'), color: '#10b981', border: `1px solid ${edge('#10b981')}`, fontWeight: 700 }}
/>
</TableCell>
<TableCell align="center"> <TableCell align="center">
<Tooltip title="View milers at this hub"> <Tooltip title="View milers at this hub">
<Chip <Chip
@@ -362,6 +360,18 @@ const Hubs = () => {
/> />
</Tooltip> </Tooltip>
</TableCell> </TableCell>
<TableCell>
<Chip
size="small"
label={isActive ? 'Active' : 'Inactive'}
sx={{
bgcolor: tint(isActive ? '#10b981' : '#ef4444'),
color: isActive ? '#10b981' : '#ef4444',
border: `1px solid ${edge(isActive ? '#10b981' : '#ef4444')}`,
fontWeight: 700
}}
/>
</TableCell>
<TableCell align="right"> <TableCell align="right">
<Stack direction="row" justifyContent="flex-end" spacing={0.75}> <Stack direction="row" justifyContent="flex-end" spacing={0.75}>
<Tooltip title="Edit hub"> <Tooltip title="Edit hub">
@@ -391,17 +401,55 @@ const Hubs = () => {
No milers assigned to this hub. No milers assigned to this hub.
</Typography> </Typography>
) : ( ) : (
<Stack direction="row" spacing={1} flexWrap="wrap" useFlexGap sx={{ mt: 1 }}> <TableContainer sx={{ mt: 1, borderRadius: 2, border: `1px solid ${DT.borderSubtle}`, background: '#fff' }}>
{hubMilers.map((m) => ( <Table size="small">
<Chip <TableHead>
key={m.userid} <TableRow sx={{ '& th': { color: DT.textSecondary, fontWeight: 800, fontSize: 10.5, textTransform: 'uppercase' } }}>
size="small" <TableCell>Miler</TableCell>
icon={<MdTwoWheeler size={13} />} <TableCell>Phone</TableCell>
label={`${m.displayname || `Miler #${m.userid}`} · ${m.availabilitystatus || '—'}`} <TableCell>Status</TableCell>
sx={{ bgcolor: '#fff', border: `1px solid ${DT.borderSubtle}`, fontWeight: 600 }} <TableCell align="right">Rating</TableCell>
/> </TableRow>
))} </TableHead>
</Stack> <TableBody>
{hubMilers.map((m) => {
const availColor = m.availabilitystatus === 'Available' ? '#10b981' : m.availabilitystatus === 'On_Break' ? '#f59e0b' : '#94a3b8';
return (
<TableRow key={m.userid}>
<TableCell>
<Stack direction="row" alignItems="center" spacing={1}>
<AccentAvatar color={BRAND} size={26}>
<MdTwoWheeler size={13} />
</AccentAvatar>
<Typography variant="body2" sx={{ fontWeight: 600 }}>
{m.displayname || `Miler #${m.userid}`}
</Typography>
</Stack>
</TableCell>
<TableCell>
<Typography variant="body2" sx={{ color: DT.textSecondary }}>
{m.phone || '—'}
</Typography>
</TableCell>
<TableCell>
<Chip
size="small"
label={m.availabilitystatus || '—'}
sx={{ bgcolor: tint(availColor), color: availColor, border: `1px solid ${edge(availColor)}`, fontWeight: 700 }}
/>
</TableCell>
<TableCell align="right">
<Stack direction="row" alignItems="center" justifyContent="flex-end" spacing={0.5}>
<MdStar size={13} style={{ color: '#f59e0b' }} />
<Typography variant="body2">{m.rating ?? '—'}</Typography>
</Stack>
</TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</TableContainer>
)} )}
</Box> </Box>
</Collapse> </Collapse>
@@ -416,9 +464,9 @@ const Hubs = () => {
</Paper> </Paper>
{/* ============================================= || Create / Edit dialog || ============================================= */} {/* ============================================= || Create / Edit dialog || ============================================= */}
<Dialog open={dialogOpen} onClose={() => setDialogOpen(false)} maxWidth="sm" fullWidth fullScreen={isMobile} PaperProps={{ sx: { borderRadius: { xs: 0, sm: 3 } } }}> <Dialog open={dialogOpen} onClose={() => setDialogOpen(false)} maxWidth="sm" fullWidth PaperProps={{ sx: { borderRadius: 3 } }}>
<DialogTitle sx={{ background: `linear-gradient(135deg, ${BRAND} 0%, #D35968 100%)`, color: '#fff' }}> <DialogTitle sx={{ background: 'linear-gradient(135deg, #C01227 0%, #D35968 100%)', color: '#fff' }}>
{editingHub ? `Edit ${editingHub.hubname}` : 'New Hub'} {editingHub ? `Edit ${editingHub.hubname}` : 'Create New Hub'}
</DialogTitle> </DialogTitle>
<DialogContent sx={{ mt: 2 }}> <DialogContent sx={{ mt: 2 }}>
<Grid container spacing={2.5} sx={{ mt: 0.5 }}> <Grid container spacing={2.5} sx={{ mt: 0.5 }}>
@@ -439,9 +487,9 @@ const Hubs = () => {
<Grid item xs={12} sm={6}> <Grid item xs={12} sm={6}>
<Typography sx={{ mb: 1 }}>City</Typography> <Typography sx={{ mb: 1 }}>City</Typography>
<Select fullWidth value={form.city} onChange={(e) => setForm({ ...form, city: e.target.value })}> <Select fullWidth value={form.city} onChange={(e) => setForm({ ...form, city: e.target.value })}>
{CITIES.map((c) => ( {Object.values(CITY_MAP).map((c) => (
<MenuItem key={c} value={c}> <MenuItem key={c.name} value={c.name}>
{c} {c.name}
</MenuItem> </MenuItem>
))} ))}
</Select> </Select>
@@ -456,7 +504,7 @@ const Hubs = () => {
</Grid> </Grid>
<Grid item xs={12} sm={6}> <Grid item xs={12} sm={6}>
<Typography sx={{ mb: 1 }}>Pincode</Typography> <Typography sx={{ mb: 1 }}>Pincode</Typography>
<TextField fullWidth value={form.pincode} onChange={(e) => setForm({ ...form, pincode: e.target.value })} /> <TextField fullWidth inputProps={{ maxLength: 6 }} value={form.pincode} onChange={(e) => setForm({ ...form, pincode: e.target.value.replace(/\D/g, '') })} />
</Grid> </Grid>
<Grid item xs={12}> <Grid item xs={12}>
<Typography sx={{ mb: 1 }}>Address</Typography> <Typography sx={{ mb: 1 }}>Address</Typography>

View File

@@ -221,9 +221,6 @@ const Orders = () => {
}); });
// ==============================|| cancelOrder ||============================== // // ==============================|| cancelOrder ||============================== //
// NOTE: no Doormile "cancel booking" endpoint has been specified anywhere in
// the conversion work so far — this still calls the old /orders/updateorder
// path and will fail against api.doormile.com until a real endpoint exists.
const cancelOrderMutation = useMutation({ const cancelOrderMutation = useMutation({
mutationFn: cancelOrder, mutationFn: cancelOrder,
onSuccess: () => { onSuccess: () => {

135
yarn.lock
View File

@@ -101,7 +101,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz"
integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==
"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.16.0", "@babel/core@^7.21.3", "@babel/core@^7.21.4", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.4.0-0", "@babel/core@^7.7.2", "@babel/core@^7.8.0", "@babel/core@>=7.11.0": "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.21.3", "@babel/core@^7.21.4", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
version "7.21.4" version "7.21.4"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz" resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz"
integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA== integrity sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==
@@ -462,7 +462,7 @@
dependencies: dependencies:
"@babel/helper-plugin-utils" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7"
"@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.16.7": "@babel/plugin-syntax-flow@^7.16.7":
version "7.26.0" version "7.26.0"
resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz" resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz"
integrity sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg== integrity sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==
@@ -912,7 +912,7 @@
dependencies: dependencies:
"@babel/plugin-transform-react-jsx" "^7.27.1" "@babel/plugin-transform-react-jsx" "^7.27.1"
"@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.27.1": "@babel/plugin-transform-react-jsx@^7.27.1":
version "7.27.1" version "7.27.1"
resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz" resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz"
integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==
@@ -1370,7 +1370,7 @@
resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz"
integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.10.6", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.7.1", "@emotion/react@^11.9.0": "@emotion/react@^11.10.6":
version "11.10.6" version "11.10.6"
resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz" resolved "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz"
integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw== integrity sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==
@@ -1400,7 +1400,7 @@
resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz" resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz"
integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
"@emotion/styled@^11.10.6", "@emotion/styled@^11.3.0", "@emotion/styled@^11.6.0", "@emotion/styled@^11.8.1": "@emotion/styled@^11.10.6":
version "11.10.6" version "11.10.6"
resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz" resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz"
integrity sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og== integrity sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==
@@ -1533,7 +1533,7 @@
"@firebase/util" "1.10.0" "@firebase/util" "1.10.0"
tslib "^2.1.0" tslib "^2.1.0"
"@firebase/app-compat@0.2.43", "@firebase/app-compat@0.x": "@firebase/app-compat@0.2.43":
version "0.2.43" version "0.2.43"
resolved "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.43.tgz" resolved "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.2.43.tgz"
integrity sha512-HM96ZyIblXjAC7TzE8wIk2QhHlSvksYkQ4Ukh1GmEenzkucSNUmUX4QvoKrqeWsLEQ8hdcojABeCV8ybVyZmeg== integrity sha512-HM96ZyIblXjAC7TzE8wIk2QhHlSvksYkQ4Ukh1GmEenzkucSNUmUX4QvoKrqeWsLEQ8hdcojABeCV8ybVyZmeg==
@@ -1544,12 +1544,12 @@
"@firebase/util" "1.10.0" "@firebase/util" "1.10.0"
tslib "^2.1.0" tslib "^2.1.0"
"@firebase/app-types@0.9.2", "@firebase/app-types@0.x": "@firebase/app-types@0.9.2":
version "0.9.2" version "0.9.2"
resolved "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz" resolved "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.2.tgz"
integrity sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ== integrity sha512-oMEZ1TDlBz479lmABwWsWjzHwheQKiAgnuKxE0pz0IXCVx7/rtlkx1fQ6GfgK24WCrxDKMplZrT50Kh04iMbXQ==
"@firebase/app@0.10.13", "@firebase/app@0.x": "@firebase/app@0.10.13":
version "0.10.13" version "0.10.13"
resolved "https://registry.npmjs.org/@firebase/app/-/app-0.10.13.tgz" resolved "https://registry.npmjs.org/@firebase/app/-/app-0.10.13.tgz"
integrity sha512-OZiDAEK/lDB6xy/XzYAyJJkaDqmQ+BCtOEPLqFvxWKUz5JbBmej7IiiRHdtiIOD/twW7O5AxVsfaaGA/V1bNsA== integrity sha512-OZiDAEK/lDB6xy/XzYAyJJkaDqmQ+BCtOEPLqFvxWKUz5JbBmej7IiiRHdtiIOD/twW7O5AxVsfaaGA/V1bNsA==
@@ -1846,7 +1846,7 @@
tslib "^2.1.0" tslib "^2.1.0"
undici "6.19.7" undici "6.19.7"
"@firebase/util@1.10.0", "@firebase/util@1.x": "@firebase/util@1.10.0":
version "1.10.0" version "1.10.0"
resolved "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz" resolved "https://registry.npmjs.org/@firebase/util/-/util-1.10.0.tgz"
integrity sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ== integrity sha512-xKtx4A668icQqoANRxyDLBLz51TAbDP9KRfpbKGxiCAW346d0BeJe5vN6/hKxxmWwnZ0mautyv39JxviwwQMOQ==
@@ -2356,7 +2356,7 @@
resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.14.tgz" resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.14.tgz"
integrity sha512-sbjXW+BBSvmzn61XyTMun899E7nGPTXwqD9drm1jBUAvWEhJpPFIRxwQQiATWZnd9rvdxtnhhdsDxEGWI0jxqA== integrity sha512-sbjXW+BBSvmzn61XyTMun899E7nGPTXwqD9drm1jBUAvWEhJpPFIRxwQQiATWZnd9rvdxtnhhdsDxEGWI0jxqA==
"@mui/icons-material@^5.0.4", "@mui/icons-material@^5.14.19": "@mui/icons-material@^5.14.19":
version "5.16.14" version "5.16.14"
resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.14.tgz" resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.14.tgz"
integrity sha512-heL4S+EawrP61xMXBm59QH6HODsu0gxtZi5JtnXF2r+rghzyU/3Uftlt1ij8rmJh+cFdKTQug1L9KkZB5JgpMQ== integrity sha512-heL4S+EawrP61xMXBm59QH6HODsu0gxtZi5JtnXF2r+rghzyU/3Uftlt1ij8rmJh+cFdKTQug1L9KkZB5JgpMQ==
@@ -2376,7 +2376,7 @@
clsx "^2.1.0" clsx "^2.1.0"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/material@^5.0.0", "@mui/material@^5.12.1", "@mui/material@^5.2.6", "@mui/material@^5.8.6", "@mui/material@>=5.15.0": "@mui/material@^5.12.1":
version "5.16.14" version "5.16.14"
resolved "https://registry.npmjs.org/@mui/material/-/material-5.16.14.tgz" resolved "https://registry.npmjs.org/@mui/material/-/material-5.16.14.tgz"
integrity sha512-eSXQVCMKU2xc7EcTxe/X/rC9QsV2jUe8eLM3MUCPYbo6V52eCE436akRIvELq/AqZpxx2bwkq7HC0cRhLB+yaw== integrity sha512-eSXQVCMKU2xc7EcTxe/X/rC9QsV2jUe8eLM3MUCPYbo6V52eCE436akRIvELq/AqZpxx2bwkq7HC0cRhLB+yaw==
@@ -2413,7 +2413,7 @@
csstype "^3.1.3" csstype "^3.1.3"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/system@^5.0.6", "@mui/system@^5.16.12", "@mui/system@^5.16.14", "@mui/system@^5.8.0": "@mui/system@^5.16.12", "@mui/system@^5.16.14":
version "5.16.14" version "5.16.14"
resolved "https://registry.npmjs.org/@mui/system/-/system-5.16.14.tgz" resolved "https://registry.npmjs.org/@mui/system/-/system-5.16.14.tgz"
integrity sha512-KBxMwCb8mSIABnKvoGbvM33XHyT+sN0BzEBG+rsSc0lLQGzs7127KWkCA6/H8h6LZ00XpBEME5MAj8mZLiQ1tw== integrity sha512-KBxMwCb8mSIABnKvoGbvM33XHyT+sN0BzEBG+rsSc0lLQGzs7127KWkCA6/H8h6LZ00XpBEME5MAj8mZLiQ1tw==
@@ -2922,16 +2922,6 @@
"@svgr/babel-plugin-transform-react-native-svg" "^7.0.0" "@svgr/babel-plugin-transform-react-native-svg" "^7.0.0"
"@svgr/babel-plugin-transform-svg-component" "^7.0.0" "@svgr/babel-plugin-transform-svg-component" "^7.0.0"
"@svgr/core@*", "@svgr/core@^7.0.0":
version "7.0.0"
resolved "https://registry.npmjs.org/@svgr/core/-/core-7.0.0.tgz"
integrity sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==
dependencies:
"@babel/core" "^7.21.3"
"@svgr/babel-preset" "^7.0.0"
camelcase "^6.2.0"
cosmiconfig "^8.1.3"
"@svgr/core@^5.5.0": "@svgr/core@^5.5.0":
version "5.5.0" version "5.5.0"
resolved "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz" resolved "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz"
@@ -2941,6 +2931,16 @@
camelcase "^6.2.0" camelcase "^6.2.0"
cosmiconfig "^7.0.0" cosmiconfig "^7.0.0"
"@svgr/core@^7.0.0":
version "7.0.0"
resolved "https://registry.npmjs.org/@svgr/core/-/core-7.0.0.tgz"
integrity sha512-ztAoxkaKhRVloa3XydohgQQCb0/8x9T63yXovpmHzKMkHO6pkjdsIAWKOS4bE95P/2quVh1NtjSKlMRNzSBffw==
dependencies:
"@babel/core" "^7.21.3"
"@svgr/babel-preset" "^7.0.0"
camelcase "^6.2.0"
cosmiconfig "^8.1.3"
"@svgr/hast-util-to-babel-ast@^5.5.0": "@svgr/hast-util-to-babel-ast@^5.5.0":
version "5.5.0" version "5.5.0"
resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz" resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz"
@@ -3044,7 +3044,7 @@
resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.9": "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
version "7.1.19" version "7.1.19"
resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz"
integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==
@@ -3164,7 +3164,7 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/hoist-non-react-statics@^3.3.1", "@types/hoist-non-react-statics@>= 3.3.1", "@types/hoist-non-react-statics@3": "@types/hoist-non-react-statics@^3.3.1", "@types/hoist-non-react-statics@3":
version "3.3.1" version "3.3.1"
resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz"
integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
@@ -3230,7 +3230,7 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/node@*", "@types/node@>= 12", "@types/node@>=12.12.47", "@types/node@>=13.7.0": "@types/node@*", "@types/node@>=12.12.47", "@types/node@>=13.7.0":
version "22.13.5" version "22.13.5"
resolved "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz" resolved "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz"
integrity sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg== integrity sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==
@@ -3272,7 +3272,7 @@
resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz" resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz"
integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==
"@types/react@*", "@types/react@^16.8 || ^17.0 || ^18.0", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@>= 16", "@types/react@16 || 17 || 18": "@types/react@*", "@types/react@16 || 17 || 18":
version "18.3.18" version "18.3.18"
resolved "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz" resolved "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz"
integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ== integrity sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==
@@ -3369,7 +3369,7 @@
dependencies: dependencies:
"@types/yargs-parser" "*" "@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^4.0.0 || ^5.0.0", "@typescript-eslint/eslint-plugin@^5.5.0": "@typescript-eslint/eslint-plugin@^5.5.0":
version "5.62.0" version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz"
integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
@@ -3392,7 +3392,7 @@
dependencies: dependencies:
"@typescript-eslint/utils" "5.62.0" "@typescript-eslint/utils" "5.62.0"
"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.5.0": "@typescript-eslint/parser@^5.5.0":
version "5.62.0" version "5.62.0"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz"
integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==
@@ -3627,16 +3627,16 @@ acorn-walk@^7.1.1:
resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0, acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0:
version "8.14.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz"
integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
acorn@^7.1.1: acorn@^7.1.1:
version "7.4.1" version "7.4.1"
resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.14.0, acorn@^8.2.4, acorn@^8.8.2, acorn@^8.9.0:
version "8.14.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz"
integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
address@^1.0.1, address@^1.1.2: address@^1.0.1, address@^1.1.2:
version "1.2.2" version "1.2.2"
resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz"
@@ -3681,7 +3681,7 @@ ajv-keywords@^5.1.0:
dependencies: dependencies:
fast-deep-equal "^3.1.3" fast-deep-equal "^3.1.3"
ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5:
version "6.12.6" version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -3701,7 +3701,7 @@ ajv@^8.0.0:
json-schema-traverse "^1.0.0" json-schema-traverse "^1.0.0"
require-from-string "^2.0.2" require-from-string "^2.0.2"
ajv@^8.6.0, ajv@>=8: ajv@^8.6.0:
version "8.17.1" version "8.17.1"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
@@ -3711,7 +3711,7 @@ ajv@^8.6.0, ajv@>=8:
json-schema-traverse "^1.0.0" json-schema-traverse "^1.0.0"
require-from-string "^2.0.2" require-from-string "^2.0.2"
ajv@^8.8.2, ajv@^8.9.0: ajv@^8.9.0:
version "8.17.1" version "8.17.1"
resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz"
integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
@@ -4396,7 +4396,7 @@ browserify-sign@^4.2.3:
readable-stream "^2.3.8" readable-stream "^2.3.8"
safe-buffer "^5.2.1" safe-buffer "^5.2.1"
browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.25.0, "browserslist@>= 4", "browserslist@>= 4.21.0", browserslist@>=4: browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.25.0:
version "4.25.1" version "4.25.1"
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz"
integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==
@@ -5175,7 +5175,7 @@ cssstyle@^2.3.0:
dependencies: dependencies:
cssom "~0.3.6" cssom "~0.3.6"
csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.3: csstype@^3.0.2, csstype@^3.1.3:
version "3.1.3" version "3.1.3"
resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
@@ -5221,14 +5221,14 @@ data-view-byte-offset@^1.0.1:
es-errors "^1.3.0" es-errors "^1.3.0"
is-data-view "^1.0.1" is-data-view "^1.0.1"
"date-fns@^2.25.0 || ^3.2.0", date-fns@^2.28.0, date-fns@^2.30.0, "date-fns@>= 2.x": date-fns@^2.30.0:
version "2.30.0" version "2.30.0"
resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz"
integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
dependencies: dependencies:
"@babel/runtime" "^7.21.0" "@babel/runtime" "^7.21.0"
dayjs@^1.10.7, dayjs@^1.11.10, dayjs@^1.11.11, "dayjs@>= 1.x": dayjs@^1.11.10, dayjs@^1.11.11:
version "1.11.13" version "1.11.13"
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz" resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz"
integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
@@ -6042,7 +6042,7 @@ eslint-webpack-plugin@^3.1.1:
normalize-path "^3.0.0" normalize-path "^3.0.0"
schema-utils "^4.0.0" schema-utils "^4.0.0"
eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.5.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.1.0, eslint@^8.3.0, eslint@^8.38.0, "eslint@>= 6", eslint@>=7.0.0, eslint@>=7.28.0: eslint@^8.3.0, eslint@^8.38.0:
version "8.57.1" version "8.57.1"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz"
integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
@@ -7752,7 +7752,7 @@ jest-resolve-dependencies@^27.5.1:
jest-regex-util "^27.5.1" jest-regex-util "^27.5.1"
jest-snapshot "^27.5.1" jest-snapshot "^27.5.1"
jest-resolve@*, jest-resolve@^27.4.2, jest-resolve@^27.5.1: jest-resolve@^27.4.2, jest-resolve@^27.5.1:
version "27.5.1" version "27.5.1"
resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz"
integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==
@@ -7962,7 +7962,7 @@ jest-worker@^28.0.2:
merge-stream "^2.0.0" merge-stream "^2.0.0"
supports-color "^8.0.0" supports-color "^8.0.0"
"jest@^27.0.0 || ^28.0.0", jest@^27.4.3: jest@^27.4.3:
version "27.5.1" version "27.5.1"
resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz" resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz"
integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==
@@ -8206,7 +8206,7 @@ launch-editor@^2.6.0:
picocolors "^1.0.0" picocolors "^1.0.0"
shell-quote "^1.8.1" shell-quote "^1.8.1"
leaflet@^1.9.0, leaflet@^1.9.4: leaflet@^1.9.4:
version "1.9.4" version "1.9.4"
resolved "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz" resolved "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz"
integrity sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA== integrity sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==
@@ -9645,15 +9645,6 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.1.4, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3, postcss@^8.3.5, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.4, postcss@^8.4.47, postcss@^8.4.6, "postcss@>= 8", postcss@>=8, postcss@>=8.0.9:
version "8.5.3"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz"
integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
dependencies:
nanoid "^3.3.8"
picocolors "^1.1.1"
source-map-js "^1.2.1"
postcss@^7.0.35: postcss@^7.0.35:
version "7.0.39" version "7.0.39"
resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz"
@@ -9662,6 +9653,15 @@ postcss@^7.0.35:
picocolors "^0.2.1" picocolors "^0.2.1"
source-map "^0.6.1" source-map "^0.6.1"
postcss@^8.3.5, postcss@^8.4.33, postcss@^8.4.4, postcss@^8.4.47:
version "8.5.3"
resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz"
integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==
dependencies:
nanoid "^3.3.8"
picocolors "^1.1.1"
source-map-js "^1.2.1"
prelude-ls@^1.2.1: prelude-ls@^1.2.1:
version "1.2.1" version "1.2.1"
resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
@@ -9679,7 +9679,7 @@ prettier-linter-helpers@^1.0.0:
dependencies: dependencies:
fast-diff "^1.1.2" fast-diff "^1.1.2"
prettier@^2.8.7, prettier@>=2.0.0: prettier@^2.8.7:
version "2.8.8" version "2.8.8"
resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
@@ -10299,7 +10299,7 @@ react-dnd@^16.0.1:
fast-deep-equal "^3.1.3" fast-deep-equal "^3.1.3"
hoist-non-react-statics "^3.3.2" hoist-non-react-statics "^3.3.2"
react-dom@*, "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17 || ^18 || ^19", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", react-dom@^17.0.2, react-dom@^18.0.0, react-dom@^18.2.0, "react-dom@>= 0.14.0", react-dom@>=16.0.0, react-dom@>=16.11.0, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=16.9.0, "react-dom@16.2.0 - 18": react-dom@^18.2.0:
version "18.3.1" version "18.3.1"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz"
integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
@@ -10395,7 +10395,7 @@ react-loading-icons@^1.1.0:
resolved "https://registry.npmjs.org/react-loading-icons/-/react-loading-icons-1.1.0.tgz" resolved "https://registry.npmjs.org/react-loading-icons/-/react-loading-icons-1.1.0.tgz"
integrity sha512-Y9eZ6HAufmUd8DIQd6rFrx5Bt/oDlTM9Nsjvf8YpajTa3dI8cLNU8jUN5z7KTANU+Yd6/KJuBjxVlrU2dMw33g== integrity sha512-Y9eZ6HAufmUd8DIQd6rFrx5Bt/oDlTM9Nsjvf8YpajTa3dI8cLNU8jUN5z7KTANU+Yd6/KJuBjxVlrU2dMw33g==
"react-redux@^7.2.1 || ^8.0.2", react-redux@^8.0.5: react-redux@^8.0.5:
version "8.1.3" version "8.1.3"
resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz" resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz"
integrity sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw== integrity sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==
@@ -10407,7 +10407,7 @@ react-loading-icons@^1.1.0:
react-is "^18.0.0" react-is "^18.0.0"
use-sync-external-store "^1.0.0" use-sync-external-store "^1.0.0"
react-refresh@^0.11.0, "react-refresh@>=0.10.0 <1.0.0": react-refresh@^0.11.0:
version "0.11.0" version "0.11.0"
resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz" resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz"
integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==
@@ -10427,7 +10427,7 @@ react-router@^6.10.0, react-router@6.29.0:
dependencies: dependencies:
"@remix-run/router" "1.22.0" "@remix-run/router" "1.22.0"
react-scripts@^5.0.1, react-scripts@>=2.1.3: react-scripts@^5.0.1:
version "5.0.1" version "5.0.1"
resolved "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz" resolved "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz"
integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==
@@ -10502,7 +10502,7 @@ react-transition-group@^4.4.5:
loose-envify "^1.4.0" loose-envify "^1.4.0"
prop-types "^15.6.2" prop-types "^15.6.2"
react@*, "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.6.0 || 17 || 18", "react@^16.8 || ^17 || ^18 || ^19", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17.0.0 || ^18", "react@^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0 || ^19.0.0", react@^17.0.2, react@^18.0.0, react@^18.2.0, react@^18.3.1, "react@>= 0.14.0", "react@>= 16", "react@>= 16.14", react@>=16.0.0, react@>=16.11.0, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0, "react@16.2.0 - 18": react@^18.2.0:
version "18.3.1" version "18.3.1"
resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz"
integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
@@ -10571,7 +10571,7 @@ redux-thunk@^2.4.2:
resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz"
integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==
redux@^4, "redux@^4 || ^5.0.0-beta.0", redux@^4.2.0, redux@^4.2.1: redux@^4.2.0, redux@^4.2.1:
version "4.2.1" version "4.2.1"
resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz"
integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==
@@ -10792,7 +10792,7 @@ rollup-plugin-terser@^7.0.0:
serialize-javascript "^4.0.0" serialize-javascript "^4.0.0"
terser "^5.0.0" terser "^5.0.0"
"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^2.0.0, rollup@^2.43.1: rollup@^2.43.1:
version "2.79.2" version "2.79.2"
resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz" resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz"
integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ== integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==
@@ -11554,7 +11554,7 @@ stylis-plugin-rtl@^2.1.1:
dependencies: dependencies:
cssjanus "^2.0.1" cssjanus "^2.0.1"
stylis@^4.3.4, stylis@4.x: stylis@^4.3.4:
version "4.3.6" version "4.3.6"
resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz" resolved "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz"
integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==
@@ -11930,7 +11930,7 @@ type-fest@^0.20.2:
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
type-fest@^0.21.3, "type-fest@>=0.17.0 <4.0.0": type-fest@^0.21.3:
version "0.21.3" version "0.21.3"
resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz"
integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
@@ -12000,11 +12000,6 @@ typedarray-to-buffer@^3.1.5:
dependencies: dependencies:
is-typedarray "^1.0.0" is-typedarray "^1.0.0"
"typescript@^3.2.1 || ^4", "typescript@^4.7 || 5", "typescript@>= 2.7", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.9.5:
version "4.9.5"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz"
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
ua-parser-js@^1.0.33: ua-parser-js@^1.0.33:
version "1.0.40" version "1.0.40"
resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz" resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.40.tgz"
@@ -12245,7 +12240,7 @@ webpack-dev-middleware@^5.3.4:
range-parser "^1.2.1" range-parser "^1.2.1"
schema-utils "^4.0.0" schema-utils "^4.0.0"
webpack-dev-server@^4.6.0, "webpack-dev-server@3.x || 4.x": webpack-dev-server@^4.6.0:
version "4.15.2" version "4.15.2"
resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz" resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz"
integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==
@@ -12310,7 +12305,7 @@ webpack-sources@^3.2.3:
resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz"
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.9.0", "webpack@^4.44.2 || ^5.47.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.64.4, "webpack@>= 4", webpack@>=2, "webpack@>=4.43.0 <6.0.0": webpack@^5.64.4:
version "5.98.0" version "5.98.0"
resolved "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz" resolved "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz"
integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA== integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==