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:
14
package-lock.json
generated
14
package-lock.json
generated
@@ -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",
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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({
|
||||||
|
|||||||
@@ -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 />
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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` (1–4), 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>
|
||||||
|
|||||||
@@ -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
135
yarn.lock
@@ -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==
|
||||||
|
|||||||
Reference in New Issue
Block a user