real-boxing

This commit is contained in:
Samandar Turg'unboev
2025-05-22 10:12:44 +05:00
parent d68d75a0cc
commit e7c4cda9a2
8 changed files with 258 additions and 493 deletions

View File

@@ -15,7 +15,6 @@
"safe_warehouse": "安全仓库", "safe_warehouse": "安全仓库",
"we_proud_to_serve_global": "我们以为全球提供最佳的货运和运输解决方案感到自豪。", "we_proud_to_serve_global": "我们以为全球提供最佳的货运和运输解决方案感到自豪。",
"our_services": "我们的服务", "our_services": "我们的服务",
"air_transport": "空运", "air_transport": "空运",
"air_transport__subtitle": "CPost提供各类大型和重型货物的空运服务。", "air_transport__subtitle": "CPost提供各类大型和重型货物的空运服务。",
"car_transport": "汽车运输", "car_transport": "汽车运输",
@@ -28,13 +27,11 @@
"warehouse_yivu_and_guanchjou__subtitle": "CPost在中国提供仓储物流服务与从中国运输的车辆同时进行。", "warehouse_yivu_and_guanchjou__subtitle": "CPost在中国提供仓储物流服务与从中国运输的车辆同时进行。",
"customs_office_service": "海关清关服务", "customs_office_service": "海关清关服务",
"customs_office_service__subtitle": "CPost重视客户的时间并提供货物的海关申报服务。按照HS和TN编码对货物进行分类。", "customs_office_service__subtitle": "CPost重视客户的时间并提供货物的海关申报服务。按照HS和TN编码对货物进行分类。",
"pricing": { "pricing": {
"title": "价格", "title": "价格",
"limit": "交货时间:", "limit": "交货时间:",
"min_weight": "最小重量", "min_weight": "最小重量",
"more": "更多详情", "more": "更多详情",
"pricing1": { "pricing1": {
"title": "空运", "title": "空运",
"price": "每千克从$10起", "price": "每千克从$10起",
@@ -60,7 +57,6 @@
"min_weight": "1立方米" "min_weight": "1立方米"
} }
}, },
"our_partners": "我们的合作伙伴", "our_partners": "我们的合作伙伴",
"news_subtitle": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", "news_subtitle": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"contacts_subtitle": "Creative mouse is here for you to make sure you can build a more resilient portfolio. We curate bespoke offerings across alternative.", "contacts_subtitle": "Creative mouse is here for you to make sure you can build a more resilient portfolio. We curate bespoke offerings across alternative.",
@@ -70,7 +66,6 @@
"telegram": "Telegram", "telegram": "Telegram",
"instagram": "Instagram", "instagram": "Instagram",
"real_address": "塔什干市奥尔马佐尔区_______街", "real_address": "塔什干市奥尔马佐尔区_______街",
"faq": { "faq": {
"title": "常见问题", "title": "常见问题",
"subtitle": "Creative mouse is here for you to make sure you can build a more resilient portfolio. We curate bespoke offerings across alternative.", "subtitle": "Creative mouse is here for you to make sure you can build a more resilient portfolio. We curate bespoke offerings across alternative.",
@@ -79,7 +74,6 @@
"answer": "大多数物流公司通过其网站或移动应用提供在线追踪服务。您可以输入跟踪号以获取货物的实时位置和状态更新。" "answer": "大多数物流公司通过其网站或移动应用提供在线追踪服务。您可以输入跟踪号以获取货物的实时位置和状态更新。"
} }
}, },
"footer_site_info_text": "可靠且快速的物流服务提供商", "footer_site_info_text": "可靠且快速的物流服务提供商",
"privacy_policy": "隐私政策", "privacy_policy": "隐私政策",
"terms_of_use": "使用条款", "terms_of_use": "使用条款",
@@ -89,7 +83,6 @@
"info": "信息", "info": "信息",
"join_tg": "加入我们的Telegram", "join_tg": "加入我们的Telegram",
"all_rights_reserved": "版权所有", "all_rights_reserved": "版权所有",
"calc_obj": { "calc_obj": {
"title": "计算器", "title": "计算器",
"subtitle": "选择您的订单的运输类型和重量,以了解运费。", "subtitle": "选择您的订单的运输类型和重量,以了解运费。",
@@ -107,7 +100,6 @@
"delivery_type_car": "汽车" "delivery_type_car": "汽车"
}, },
"price": "价格", "price": "价格",
"__dash": "------------------------------------DASHBOARD------------------------------------------------------", "__dash": "------------------------------------DASHBOARD------------------------------------------------------",
"dashboard": "仪表板", "dashboard": "仪表板",
"parties": "派对", "parties": "派对",
@@ -179,13 +171,10 @@
"count_of_boxes": "箱子数量", "count_of_boxes": "箱子数量",
"count_of_items": "物品数量", "count_of_items": "物品数量",
"download_excel": "下载Excel", "download_excel": "下载Excel",
"enter_party_name_to_find": "输入要查找的派对名称...", "enter_party_name_to_find": "输入要查找的派对名称...",
"enter_box_name_to_find": "输入要查找的箱子名称...", "enter_box_name_to_find": "输入要查找的箱子名称...",
"enter_client_name_to_find": "输入要查找的客户名称...", "enter_client_name_to_find": "输入要查找的客户名称...",
"filter_packet_name": "封包名稱過濾器", "filter_packet_name": "封包名稱過濾器",
"filter_party_name": "派对名称过滤器", "filter_party_name": "派对名称过滤器",
"filter_box_name": "箱子名称过滤器", "filter_box_name": "箱子名称过滤器",
"filter_track_id": "跟踪ID过滤器", "filter_track_id": "跟踪ID过滤器",
@@ -193,7 +182,6 @@
"filter_item_name": "产品名称过滤器", "filter_item_name": "产品名称过滤器",
"filter_by_box_status": "箱子状态过滤器", "filter_by_box_status": "箱子状态过滤器",
"filter_by_party_status": "派对状态过滤器", "filter_by_party_status": "派对状态过滤器",
"COLLECTING": "收集中", "COLLECTING": "收集中",
"ON_THE_WAY": "在路上", "ON_THE_WAY": "在路上",
"ARRIVED": "已到达", "ARRIVED": "已到达",
@@ -202,7 +190,6 @@
"IN_CUSTOMS": "在海關", "IN_CUSTOMS": "在海關",
"IN_WAREHOUSE": "接觸客戶", "IN_WAREHOUSE": "接觸客戶",
"DELIVERED": "發表", "DELIVERED": "發表",
"add_photo_to_item": "將照片加入項目", "add_photo_to_item": "將照片加入項目",
"photo": "照片", "photo": "照片",
"summa": "總結", "summa": "總結",
@@ -221,5 +208,7 @@
"passport": "護照", "passport": "護照",
"weight_of_items": "產品重量", "weight_of_items": "產品重量",
"update_packet": "編輯套件", "update_packet": "編輯套件",
"party_weight": "大量重量" "party_weight": "大量重量",
} "qr_code": "二维码",
"created_at": "添加日期"
}

View File

@@ -15,7 +15,6 @@
"safe_warehouse": "Secure Warehouse", "safe_warehouse": "Secure Warehouse",
"we_proud_to_serve_global": "We take pride in providing the best freight and transportation solutions worldwide.", "we_proud_to_serve_global": "We take pride in providing the best freight and transportation solutions worldwide.",
"our_services": "Our Services", "our_services": "Our Services",
"air_transport": "Air Transport", "air_transport": "Air Transport",
"air_transport__subtitle": "CPost offers air transportation for a wide range of large-sized and heavy goods.", "air_transport__subtitle": "CPost offers air transportation for a wide range of large-sized and heavy goods.",
"car_transport": "Car Transport", "car_transport": "Car Transport",
@@ -28,13 +27,11 @@
"warehouse_yivu_and_guanchjou__subtitle": "CPost offers the use of warehouse logistics services in China simultaneously with transporting vehicles from China.", "warehouse_yivu_and_guanchjou__subtitle": "CPost offers the use of warehouse logistics services in China simultaneously with transporting vehicles from China.",
"customs_office_service": "Customs Clearance Services", "customs_office_service": "Customs Clearance Services",
"customs_office_service__subtitle": "CPost values its customers' time and offers customs declaration services for goods. Classification of goods by HS and TN codes.", "customs_office_service__subtitle": "CPost values its customers' time and offers customs declaration services for goods. Classification of goods by HS and TN codes.",
"pricing": { "pricing": {
"title": "Pricing", "title": "Pricing",
"limit": "Delivery time:", "limit": "Delivery time:",
"min_weight": "Minimum Weight", "min_weight": "Minimum Weight",
"more": "More Details", "more": "More Details",
"pricing1": { "pricing1": {
"title": "Air Transport", "title": "Air Transport",
"price": "From $10/KG", "price": "From $10/KG",
@@ -60,7 +57,6 @@
"min_weight": "1m3" "min_weight": "1m3"
} }
}, },
"our_partners": "Our Partners", "our_partners": "Our Partners",
"news_subtitle": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", "news_subtitle": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
"contacts_subtitle": "Creative mouse is here for you to make sure you can build a more resilient portfolio. We curate bespoke offerings across alternative.", "contacts_subtitle": "Creative mouse is here for you to make sure you can build a more resilient portfolio. We curate bespoke offerings across alternative.",
@@ -70,7 +66,6 @@
"telegram": "Telegram", "telegram": "Telegram",
"instagram": "Instagram", "instagram": "Instagram",
"real_address": "Tashkent city, Olmazor district, _______ street", "real_address": "Tashkent city, Olmazor district, _______ street",
"faq": { "faq": {
"title": "Frequently Asked Questions", "title": "Frequently Asked Questions",
"subtitle": "Creative mouse is here for you to make sure you can build a more resilient portfolio. We curate bespoke offerings across alternative.", "subtitle": "Creative mouse is here for you to make sure you can build a more resilient portfolio. We curate bespoke offerings across alternative.",
@@ -79,7 +74,6 @@
"answer": "Most logistics companies provide online tracking services through their websites or mobile apps. You can enter your tracking number to get real-time updates on the delivery location and status." "answer": "Most logistics companies provide online tracking services through their websites or mobile apps. You can enter your tracking number to get real-time updates on the delivery location and status."
} }
}, },
"footer_site_info_text": "Reliable and Fast Logistics Service Provider", "footer_site_info_text": "Reliable and Fast Logistics Service Provider",
"privacy_policy": "Privacy Policy", "privacy_policy": "Privacy Policy",
"terms_of_use": "Terms of Use", "terms_of_use": "Terms of Use",
@@ -89,7 +83,6 @@
"info": "Information", "info": "Information",
"join_tg": "Join our telegram", "join_tg": "Join our telegram",
"all_rights_reserved": "All Rights Reserved", "all_rights_reserved": "All Rights Reserved",
"calc_obj": { "calc_obj": {
"title": "Calculator", "title": "Calculator",
"subtitle": "Select the delivery type and weight of your order to find out the delivery cost", "subtitle": "Select the delivery type and weight of your order to find out the delivery cost",
@@ -107,7 +100,6 @@
"delivery_type_car": "Auto" "delivery_type_car": "Auto"
}, },
"price": "Price", "price": "Price",
"__dash": "------------------------------------DASHBOARD------------------------------------------------------", "__dash": "------------------------------------DASHBOARD------------------------------------------------------",
"dashboard": "Dashboard", "dashboard": "Dashboard",
"parties": "Parties", "parties": "Parties",
@@ -179,12 +171,10 @@
"count_of_boxes": "Count of boxes", "count_of_boxes": "Count of boxes",
"count_of_items": "Count of items", "count_of_items": "Count of items",
"download_excel": "Download excel", "download_excel": "Download excel",
"enter_party_name_to_find": "Enter party name to find...", "enter_party_name_to_find": "Enter party name to find...",
"enter_box_name_to_find": "Enter box name to find...", "enter_box_name_to_find": "Enter box name to find...",
"enter_client_name_to_find": "Enter client name to find...", "enter_client_name_to_find": "Enter client name to find...",
"filter_packet_name": "Packet name filter", "filter_packet_name": "Packet name filter",
"filter_party_name": "Party name filter", "filter_party_name": "Party name filter",
"filter_box_name": "Box name filter", "filter_box_name": "Box name filter",
"filter_track_id": "Track id filter", "filter_track_id": "Track id filter",
@@ -192,7 +182,6 @@
"filter_item_name": "Product name filter", "filter_item_name": "Product name filter",
"filter_by_box_status": "Box Status filter", "filter_by_box_status": "Box Status filter",
"filter_by_party_status": "Party Status filter", "filter_by_party_status": "Party Status filter",
"COLLECTING": "Collecting", "COLLECTING": "Collecting",
"ON_THE_WAY": "On the way", "ON_THE_WAY": "On the way",
"ARRIVED": "Arrived", "ARRIVED": "Arrived",
@@ -201,7 +190,6 @@
"IN_CUSTOMS": "At customs", "IN_CUSTOMS": "At customs",
"IN_WAREHOUSE": "Reaching out to customers", "IN_WAREHOUSE": "Reaching out to customers",
"DELIVERED": "Delivered", "DELIVERED": "Delivered",
"add_photo_to_item": "Add photo to item", "add_photo_to_item": "Add photo to item",
"photo": "photo", "photo": "photo",
"summa": "summa", "summa": "summa",
@@ -220,5 +208,8 @@
"passport": "Passport", "passport": "Passport",
"weight_of_items": "Products weight", "weight_of_items": "Products weight",
"update_packet": "Edit Paket", "update_packet": "Edit Paket",
"party_weight": "Batch weight" "party_weight": "Batch weight",
}
"qr_code": "QR Code",
"created_at": "Date of joining"
}

View File

@@ -221,5 +221,8 @@
"passport": "Паспорт", "passport": "Паспорт",
"weight_of_items": "Вес продукта", "weight_of_items": "Вес продукта",
"update_packet": "Редактировать пакет", "update_packet": "Редактировать пакет",
"party_weight": "Вес партии" "party_weight": "Вес партии",
"qr_code": "QR код",
"created_at": "Дата добавления"
} }

View File

@@ -113,7 +113,7 @@
"parties": "Partiyalar", "parties": "Partiyalar",
"create_party": "Partiya yaratish", "create_party": "Partiya yaratish",
"update_party": "Partiyani yangilash", "update_party": "Partiyani yangilash",
"create_box": "Qutni yaratish", "create_box": "Qutini yaratish",
"create_packet": "Paket yaratish", "create_packet": "Paket yaratish",
"update_box": "Qutni yangilash", "update_box": "Qutni yangilash",
"update_package": "Paketni yangilash", "update_package": "Paketni yangilash",
@@ -220,5 +220,8 @@
"are_you_sure_delete_party": "{name} yuk partiyasini o'chirishga ishonchingiz komilmi?", "are_you_sure_delete_party": "{name} yuk partiyasini o'chirishga ishonchingiz komilmi?",
"passport": "Pasport", "passport": "Pasport",
"update_packet": "Paketni Tahrirlash", "update_packet": "Paketni Tahrirlash",
"party_weight": "Partiya og'irligi" "party_weight": "Partiya og'irligi",
"qr_code": "QR kod",
"created_at": "Qoshilgan sana"
} }

View File

@@ -6,7 +6,7 @@ import { party_requests } from '@/data/party/party.requests';
import { pageLinks } from '@/helpers/constants'; import { pageLinks } from '@/helpers/constants';
import { notifyError, notifyUnknownError } from '@/services/notification'; import { notifyError, notifyUnknownError } from '@/services/notification';
import { Box, Divider, FormHelperText, Grid, Stack, Typography, styled } from '@mui/material'; import { Box, Divider, FormHelperText, Grid, Stack, Typography, styled } from '@mui/material';
import { useParams, useRouter, useSearchParams } from 'next/navigation'; import { useParams, useSearchParams, useRouter } from 'next/navigation';
import React, { useEffect, useMemo, useRef, useState } from 'react'; import React, { useEffect, useMemo, useRef, useState } from 'react';
import { useLocale } from 'use-intl'; import { useLocale } from 'use-intl';
import { Controller, useFieldArray, useForm } from 'react-hook-form'; import { Controller, useFieldArray, useForm } from 'react-hook-form';
@@ -21,7 +21,6 @@ import { customer_requests } from '@/data/customers/customer.requests';
import { useAuthContext } from '@/context/auth-context'; import { useAuthContext } from '@/context/auth-context';
import { useMyNavigation } from '@/hooks/useMyNavigation'; import { useMyNavigation } from '@/hooks/useMyNavigation';
import AsyncSelect from 'react-select/async'; import AsyncSelect from 'react-select/async';
import { Party } from '@/data/party/party.model';
import cloneDeep from 'lodash.clonedeep'; import cloneDeep from 'lodash.clonedeep';
import { item_requests } from '@/data/item/item.requests'; import { item_requests } from '@/data/item/item.requests';
import get from 'lodash.get'; import get from 'lodash.get';
@@ -57,20 +56,16 @@ type Props = {
box_size: string; box_size: string;
status: BoxStatus; status: BoxStatus;
packetId: string; packetId: string;
passportName: string; passportName: string;
passportId: number; passportId: number;
partyId: number; partyId: number;
partyName: string; partyName: string;
clientId: number; clientId: number;
client_id: string; client_id: string;
clientName: string; clientName: string;
products_list: { products_list: {
id: number; id: number;
price: number | string; price: number | string;
cargoId: string; cargoId: string;
trekId: string; trekId: string;
name: string; name: string;
@@ -93,16 +88,14 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
finished: boolean; finished: boolean;
partyFinished: boolean; partyFinished: boolean;
clientFinished: boolean; clientFinished: boolean;
settedDefaultParty: Party | null; settedDefaultParty: any;
settedDefaultClient: Customer | null; settedDefaultClient: Customer | null;
// settedDefaultPartyValue: { value: number; label: string }[] | null;
}>({ }>({
settedDefaultParty: null, settedDefaultParty: null,
settedDefaultClient: null, settedDefaultClient: null,
partyFinished: false, partyFinished: false,
clientFinished: false, clientFinished: false,
finished: false, finished: false,
// settedDefaultPartyValue: partiesData?.[0] || null,
}); });
const { const {
register, register,
@@ -114,28 +107,30 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
} = useForm<any>({ } = useForm<any>({
defaultValues: { defaultValues: {
partyId: params.get('party_id') ? +params.get('party_id')! : '', partyId: params.get('party_id') ? +params.get('party_id')! : '',
paketIds: editMode
? [{ id: initialValues?.partyId }]
: params.get('party_id')
? [{ id: +params.get('party_id')! }]
: [{ id: '' }],
box_weight: 0.9, box_weight: 0.9,
box_type: 'KG', box_type: 'KG',
box_size: '50x40x40', box_size: '50x40x40',
status: 'READY_TO_INVOICE', status: 'READY_TO_INVOICE',
cargoId: initialValues?.client_id, cargoId: initialValues?.client_id,
// passportId: {value: initialValues?.passportId}, products_list: editMode
...(editMode ? initialValues?.products_list
? {} : [
: { {
products_list: [ id: '',
{ cargoId: '',
id: '', trekId: '',
cargoId: '', name: '',
trekId: '', nameRu: '',
name: '', amount: '',
nameRu: '', weight: '',
amount: '', price: '',
weight: '', },
price: '', ],
},
],
}),
...initialValues, ...initialValues,
}, },
}); });
@@ -146,12 +141,17 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
name: 'products_list', name: 'products_list',
keyName: 'key', keyName: 'key',
}); });
const pakets = useFieldArray({
control,
name: 'paketIds',
keyName: 'key',
});
const controlledProductFields = watch('products_list'); const controlledProductFields = watch('products_list');
const partyIdValue = watch('partyId'); const partyIdValue = watch('partyId');
const clientIdValue = watch('client_id'); const clientIdValue = watch('client_id');
const cargoId = watch('cargoId'); const cargoId = watch('cargoId');
const requiredText = t('required'); const requiredText = t('required');
const [selectedPassport, setSelectedPassport] = useState<Passport | null>(null); // Tanlangan passportni saqlash uchun state (tipi Passport yoki null) const [selectedPassport, setSelectedPassport] = useState<Passport | null>(null);
const passportOptionsInitial = initialValues?.passportId && const passportOptionsInitial = initialValues?.passportId &&
initialValues?.passportName && [ initialValues?.passportName && [
@@ -160,20 +160,16 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
label: initialValues?.passportName, label: initialValues?.passportName,
}, },
]; ];
const n = "123ds"
n.toUpperCase()
const { data: passportOptions } = useRequest(() => passport_requests.getAll({ cargoId: cargoId?.toUpperCase() }), { const { data: passportOptions } = useRequest(() => passport_requests.getAll({ cargoId: cargoId?.toUpperCase() }), {
enabled: !!cargoId, enabled: !!cargoId,
selectData: data => { selectData: data => {
// Ma'lumotlarni BaseReactSelect uchun mos formatga o'tkazish
const passportOptions = data.data.data.map((passport: Passport) => ({ const passportOptions = data.data.data.map((passport: Passport) => ({
// data.data endi Passport[] value: passport.id,
value: passport.id, // passport id sini value sifatida label: passport.fullName,
label: passport.fullName, // fullName ni label sifatida
})); }));
const passportId = watch('passportId'); const passportId = watch('passportId');
if (!passportId && initialValues?.passportId && cargoId === initialValues?.client_id) { if (!passportId && initialValues?.passportId && cargoId === initialValues?.client_id) {
const currentOption = passportOptions?.find((item: { value: number }) => item.value === initialValues?.passportId); const currentOption = passportOptions?.find((item: { value: number }) => item.value === initialValues?.passportId);
setValue('passportId', currentOption); setValue('passportId', currentOption);
@@ -182,14 +178,7 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
return passportOptions; return passportOptions;
}, },
dependencies: [cargoId], dependencies: [cargoId],
placeholderData: [], // Kerak emas, chunki server PageAble qaytarmayapti placeholderData: [],
onSuccess(data) {
// if (data?.data.data?.[0]?.id) {
// setValue("passportId", initialValues?.passportId)
// setValue('passport_id', data.data.data[0].id);
// setSelectedPassport(data.data.data[0]); // Birinchi elementni tanlash
// }
},
}); });
useEffect(() => { useEffect(() => {
@@ -205,6 +194,7 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
if (!editMode && data?.data?.data?.data?.[0]) { if (!editMode && data?.data?.data?.data?.[0]) {
helperRef.current.settedDefaultParty = data.data.data.data[0]; helperRef.current.settedDefaultParty = data.data.data.data[0];
setValue('partyId', data.data.data.data[0].id); setValue('partyId', data.data.data.data[0].id);
setValue('paketIds[0].id', data.data.data.data[0].id);
} }
helperRef.current.partyFinished = true; helperRef.current.partyFinished = true;
if (helperRef.current.clientFinished) { if (helperRef.current.clientFinished) {
@@ -223,7 +213,6 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
enabled: !!partyIdValue, enabled: !!partyIdValue,
selectData(data) { selectData(data) {
return data.data.data.data.map(p => ({ value: p.aviaCargoId, label: p.fullName })); return data.data.data.data.map(p => ({ value: p.aviaCargoId, label: p.fullName }));
// return data.data.data.map(p => ({ value: p.id, label: p.fullName }));
}, },
dependencies: [partyIdValue], dependencies: [partyIdValue],
onSuccess(data) { onSuccess(data) {
@@ -241,7 +230,6 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
); );
const onPassportChange = (newValue: Passport | null) => { const onPassportChange = (newValue: Passport | null) => {
// Tipi Passport | null
setSelectedPassport(newValue); setSelectedPassport(newValue);
if (newValue) { if (newValue) {
setValue('passport_id', newValue.id || null); setValue('passport_id', newValue.id || null);
@@ -251,17 +239,15 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
}; };
const onSubmit = handleSubmit(async values => { const onSubmit = handleSubmit(async values => {
try { try {
setLoading(true); setLoading(true);
if (editMode) { if (editMode) {
const updateBody: UpdateBoxBodyType = { const updateBody: UpdateBoxBodyType = {
cargoId: values.client_id, cargoId: values.client_id,
passportId: values.passportId.value, passportId: values.passportId?.value,
status: values.status, status: values.status,
packetId: initialValues?.packetId, packetId: values.paketIds.map((p: any) => p.id), // Bir nechta paketId
items: values.products_list.map((item: any) => { items: values.products_list.map((item: any) => {
const _price = +item.price ? +item.price : 0; const _price = +item.price ? +item.price : 0;
const _amount = +item.amount ? +item.amount : 0; const _amount = +item.amount ? +item.amount : 0;
@@ -269,9 +255,7 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
return { return {
id: item.id, id: item.id,
// cargoId: item.cargoId,
trekId: item.trekId, trekId: item.trekId,
// name: item.name + (item.nameRu ? ` / ${item.nameRu}` : ''),
name: item.name, name: item.name,
nameRu: item?.nameRu, nameRu: item?.nameRu,
weight: +item.weight, weight: +item.weight,
@@ -300,7 +284,7 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
const createBody: CreateBoxBodyType = { const createBody: CreateBoxBodyType = {
status: values.status, status: values.status,
cargoId: values.cargoId, cargoId: values.cargoId,
passportId: values.passportId.value, passportId: values.passportId?.value,
partyId: values.partyId, partyId: values.partyId,
items: values.products_list.map((item: any) => { items: values.products_list.map((item: any) => {
return { return {
@@ -328,11 +312,13 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
}); });
}; };
// const clientOptions = (inputValue: string) => { const appendPaket = () => {
// return customer_requests.getAll({ clientName: inputValue, page: 1 }).then(res => { pakets.append({ id: '' });
// return res.data.data.data.map(p => ({ label: p.fullName, value: p.id })); };
// });
// }; const removePaket = (index: number) => {
pakets.remove(index);
};
const appendProduct = () => { const appendProduct = () => {
products.append({ products.append({
@@ -355,7 +341,6 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
if (!text) return; if (!text) return;
try { try {
// const responseText = await box_requests.translateWithGoogleApi({ text });
const responseText = await box_requests.translateWithMemoryApi({ text }); const responseText = await box_requests.translateWithMemoryApi({ text });
setValue(`products_list.${index}.nameRu`, responseText || ''); setValue(`products_list.${index}.nameRu`, responseText || '');
} catch (error) { } catch (error) {
@@ -380,11 +365,11 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
label: string; label: string;
value: BoxStatus; value: BoxStatus;
}[] = [ }[] = [
{ {
label: t('READY_TO_INVOICE'), label: t('READY_TO_INVOICE'),
value: 'READY_TO_INVOICE', value: 'READY_TO_INVOICE',
}, },
]; ];
if (isAdmin) { if (isAdmin) {
p.push({ p.push({
@@ -408,11 +393,11 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
> >
<Box component={'form'} onSubmit={onSubmit}> <Box component={'form'} onSubmit={onSubmit}>
<Typography variant='h5' mb={3.5}> <Typography variant='h5' mb={3.5}>
{editMode ? t('update_packet') : t('create_packet')} {editMode ? t('update_box') : t('create_box')}
</Typography> </Typography>
<Grid container columnSpacing={2.5} rowSpacing={3} mb={3.5}> <Grid container columnSpacing={2.5} rowSpacing={3} mb={3.5}>
<Grid item xs={5}> <Grid item xs={12}>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}> <Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('party_name')} {t('party_name')}
</Typography> </Typography>
@@ -429,15 +414,15 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
defaultValue={ defaultValue={
editMode editMode
? { ? {
value: initialValues.partyId, value: initialValues.partyId,
label: initialValues.partyName, label: initialValues.partyName,
} }
: partiesData?.length : partiesData?.length
? { ? {
value: partiesData[0].value, value: partiesData[0].value,
label: partiesData[0].label, label: partiesData[0].label,
} }
: null : null
} }
styles={selectDefaultStyles} styles={selectDefaultStyles}
noOptionsMessage={() => t('not_found')} noOptionsMessage={() => t('not_found')}
@@ -451,88 +436,9 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
); );
}} }}
/> />
{/* @ts-expect-error */} {/* {!!errors.partyId?.message && (
{!!errors.partyId?.message && <FormHelperText sx={{ color: 'red' }}>{errors.partyId?.message}</FormHelperText>} <FormHelperText sx={{ color: 'red' }}>{errors.partyId?.message}</FormHelperText>
</Grid> )} */}
<Grid item xs={5}>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('status')}
</Typography>
<Controller
name='status'
control={control}
rules={{ required: requiredText }}
render={({ field, fieldState, formState }) => {
return (
<BaseReactSelect
value={boxStatuses?.find(p => p.value === field.value)}
onChange={(newValue: any) => {
field.onChange(newValue.value);
}}
onBlur={field.onBlur}
name={field.name}
options={boxStatuses}
/>
);
}}
/>
{/* @ts-expect-error */}
{!!errors.box_type?.message && <FormHelperText sx={{ color: 'red' }}>{errors.box_type?.message}</FormHelperText>}
</Grid>
<Grid item xs={5}>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('cargo_id')}
</Typography>
<BaseInput
disabled={!!initialValues}
type='text'
fullWidth
inputProps={{
step: 0.1,
}}
mainBorderColor='#D8D8D8'
placeholder={t('cargo_id')}
{...register('cargoId')}
/>
{!!errors.net_weight?.message && (
// @ts-expect-error
<FormHelperText sx={{ color: 'red' }}>{errors.net_weight?.message}</FormHelperText>
)}
</Grid>
<Grid item xs={5}>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('passport')}
</Typography>
<Controller
name='passportId'
control={control}
rules={{ required: requiredText }}
render={({ field, fieldState, formState }) => {
return (
<BaseReactSelect
// value={selectedPassport}
// onChange={onPassportChange}
// value={field.value}
{...field}
onChange={(newValue: any) => {
onPassportChange(newValue);
field.onChange(newValue);
}}
// options={passportOptions || passportOptionsInitial || []}
options={passportOptions || passportOptionsInitial || []}
// isLoading={passportLoading}
placeholder={t('passport')}
isDisabled={!clientIdValue || !!initialValues}
noOptionsMessage={() => t('not_found')}
loadingMessage={() => t('loading')}
/>
);
}}
/>
</Grid> </Grid>
<Grid item xs={12}> <Grid item xs={12}>
@@ -544,196 +450,69 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
padding: '24px', padding: '24px',
}} }}
> >
{controlledProductFields.map((product: any, index: number) => { <Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
// {t('packet')}
</Typography>
// {pakets.fields.map((field, index) => (
let totalPrice = 0; <Box key={field.key} className="item-row" mb={2}>
<Box className="item-row-field" flex={1}>
try { <Controller
const p = +product.price * +product.amount; name={`paketIds.${index}.id`}
if (!Number.isNaN(p)) { control={control}
totalPrice = p; rules={{ required: requiredText }}
} render={({ field: paketField, fieldState }) => (
} catch (error) {} <AsyncSelect
onChange={(newValue: any) => {
return ( paketField.onChange(newValue?.value);
<Box key={product.key} mb={1.5}>
<Box className='item-row' mb={1.5}>
<Box className='item-row-field'>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('track_id')}
</Typography>
<BaseInput
InputProps={{
startAdornment: (
<Box
sx={{
backgroundColor: '#EBEFF5',
color: '#929191',
alignSelf: 'stretch',
height: 'auto',
display: 'flex',
alignItems: 'center',
pl: '10px',
pr: '10px',
borderRadius: '8px 0 0 8px',
}}
>
<span>ID</span>
</Box>
),
}} }}
fullWidth defaultValue={
placeholder={t('id')} editMode && index === 0
sx={{ ? {
'.MuiInputBase-root': { value: initialValues.partyId,
paddingLeft: 0, label: initialValues.partyName,
}, }
}} : partiesData?.length && index === 0
{...register(`products_list.${index}.trekId`, { required: requiredText })} ? {
value: partiesData[0].value,
label: partiesData[0].label,
}
: null
}
styles={selectDefaultStyles}
noOptionsMessage={() => t('not_found')}
loadingMessage={() => t('loading')}
onBlur={paketField.onBlur}
name={paketField.name}
defaultOptions={defaultParties!}
loadOptions={partyOptions}
placeholder={t('enter_party_name_to_find')}
/> />
{!!get(errors, `products_list.${index}.trekId`) && (
<FormHelperText sx={{ color: 'red' }}>{requiredText}</FormHelperText>
)}
</Box>
<Box className='item-row-field'>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('name')}
</Typography>
<BaseInput
fullWidth
mainBorderColor='#D8D8D8'
placeholder={t('name')}
{...register(`products_list.${index}.name`, { required: requiredText })}
onBlur={event => {
translateAndUpdateRussianName(event.target.value, index);
}}
/>
{!!get(errors, `products_list.${index}.name`) && (
<FormHelperText sx={{ color: 'red' }}>{requiredText}</FormHelperText>
)}
</Box>
<Box className='item-row-field'>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{'NAME_RU'}
</Typography>
<BaseInput
// disabled
fullWidth
mainBorderColor='#D8D8D8'
placeholder={t('name')}
{...register(`products_list.${index}.nameRu`)}
/>
{!!get(errors, `products_list.${index}.name`) && (
<FormHelperText sx={{ color: 'red' }}>{requiredText}</FormHelperText>
)}
</Box>
<Box className='item-row-field'>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('quantity')}
</Typography>
<BaseInput
fullWidth
type='number'
mainBorderColor='#D8D8D8'
placeholder={t('quantity')}
{...register(`products_list.${index}.amount`, { required: requiredText })}
/>
{!!get(errors, `products_list.${index}.amount`) && (
<FormHelperText sx={{ color: 'red' }}>{requiredText}</FormHelperText>
)}
</Box>
<Box className='item-row-field'>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('weight')}
</Typography>
<BaseInput
fullWidth
type='number'
inputProps={{ step: 'any', min: 0, type: 'number' }}
mainBorderColor='#D8D8D8'
placeholder={t('weight')}
{...register(`products_list.${index}.weight`, { required: requiredText })}
/>
{!!get(errors, `products_list.${index}.amount`) && (
<FormHelperText sx={{ color: 'red' }}>{requiredText}</FormHelperText>
)}
</Box>
{isAdmin && (
<React.Fragment>
<Box className='item-row-field'>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('weight')}
</Typography>
<Stack direction={'row'} alignItems={'center'} spacing={2.5}>
<BaseInput
fullWidth
type='text'
inputProps={{
step: 0.1,
}}
mainBorderColor='#D8D8D8'
placeholder={t('weight')}
{...register(`products_list.${index}.weight`)}
/>
</Stack>
</Box>
<Box className='item-row-field'>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('price')}
</Typography>
<BaseInput
fullWidth
type='text'
inputProps={{
step: 0.1,
}}
mainBorderColor='#D8D8D8'
placeholder={t('price')}
{...register(`products_list.${index}.price`, { required: requiredText })}
/>
{!!get(errors, `products_list.${index}.price`) && (
<FormHelperText sx={{ color: 'red' }}>{requiredText}</FormHelperText>
)}
</Box>
<Box className='item-row-field'>
<Typography fontSize={'18px'} fontWeight={500} color='#5D5850' mb={2}>
{t('total_price')}
</Typography>
<BaseInput
fullWidth
type='number'
inputProps={{
step: 0.001,
}}
value={totalPrice}
mainBorderColor='#D8D8D8'
placeholder={t('total_price')}
// {...register(`products_list.${index}.totalPrice`, { required: requiredText })}
/>
</Box>
</React.Fragment>
)} )}
/>
<Box className='item-row-field'> {!!get(errors, `paketIds.${index}.id`) && (
<BaseIconButton <FormHelperText sx={{ color: 'red' }}>{requiredText}</FormHelperText>
size='small' )}
colorVariant='icon-error'
sx={{ flexShrink: 0, height: 'auto', marginTop: 4.5 }}
onClick={() => removeProduct(index)}
>
<Close />
</BaseIconButton>
</Box>
</Box>
<Divider color='#EBEFF6' />
</Box> </Box>
); {pakets.fields.length > 1 && (
})} <Box className="item-row-field">
<BaseIconButton
<Stack alignItems={'center'}> size="small"
<BaseButton sx={{ backgroundColor: '#239D5F' }} startIcon={<AddCircleRounded />} onClick={appendProduct}> colorVariant="icon-error"
sx={{ flexShrink: 0, height: 'auto', marginTop: 1 }}
onClick={() => removePaket(index)}
>
<Close />
</BaseIconButton>
</Box>
)}
</Box>
))}
<Stack alignItems={'center'} mt={2}>
<BaseButton
sx={{ backgroundColor: '#239D5F' }}
startIcon={<AddCircleRounded />}
onClick={appendPaket}
>
{t('add_more')} {t('add_more')}
</BaseButton> </BaseButton>
</Stack> </Stack>
@@ -749,4 +528,4 @@ const DashboardCreateRealBoxPage = ({ initialValues, partiesData }: Props) => {
); );
}; };
export default DashboardCreateRealBoxPage; export default DashboardCreateRealBoxPage;

View File

@@ -6,6 +6,7 @@ import useRequest from '@/hooks/useRequest';
import DashboardCreateBoxPage from '@/routes/private/boxes-create/DashboardCreateBox'; import DashboardCreateBoxPage from '@/routes/private/boxes-create/DashboardCreateBox';
import { useParams } from 'next/navigation'; import { useParams } from 'next/navigation';
import React from 'react'; import React from 'react';
import DashboardCreateRealBoxPage from './DashboardCreateRealBox';
type Props = {}; type Props = {};
@@ -78,7 +79,7 @@ const DashboardEditRealBoxPage = (props: Props) => {
return ( return (
<> <>
<DashboardCreateBoxPage initialValues={getOneBox.data} /> <DashboardCreateRealBoxPage initialValues={getOneBox.data} />
</> </>
); );
}; };

View File

@@ -19,7 +19,7 @@ import useRequest from '@/hooks/useRequest';
import { file_service } from '@/services/file-service'; import { file_service } from '@/services/file-service';
import { notifyUnknownError } from '@/services/notification'; import { notifyUnknownError } from '@/services/notification';
import { getBoxStatusStyles, getStatusColor } from '@/theme/getStatusBoxStyles'; import { getBoxStatusStyles, getStatusColor } from '@/theme/getStatusBoxStyles';
import { Add, AddCircleOutline, Circle, Delete, Download, Edit, FilterList, FilterListOff, Search, PlusOne } from '@mui/icons-material'; import { Add, QrCode, AddCircleOutline, Circle, Delete, Download, Edit, FilterList, FilterListOff, Search, PlusOne } from '@mui/icons-material';
import { Box, Button, Stack, Tooltip, Typography } from '@mui/material'; import { Box, Button, Stack, Tooltip, Typography } from '@mui/material';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import React, { useEffect, useMemo, useState } from 'react'; import React, { useEffect, useMemo, useState } from 'react';
@@ -84,7 +84,6 @@ const DashboardRealBoxesPage = (props: Props) => {
} }
}, [getBoxesQuery]); }, [getBoxesQuery]);
const loading = getBoxesQuery.loading; const loading = getBoxesQuery.loading;
const handleChange = (newPage: number) => { const handleChange = (newPage: number) => {
setTimeout(() => { setTimeout(() => {
setPage(newPage); setPage(newPage);
@@ -158,39 +157,23 @@ const DashboardRealBoxesPage = (props: Props) => {
}, },
}, },
{ {
dataKey: 'id', label: t("qr_code"),
label: "Qo'shish",
width: 120, width: 120,
renderCell: data => { renderCell: data => {
return <Button onClick={() => navigation.push(pageLinks.dashboard.boxes.edit(data.id))}> return <Button>
<Add /> <QrCode />
</Button>; </Button>;
}, },
}, },
{ {
dataKey: 'partyName', dataKey: 'id',
label: t('party_name'), label: t("add_more"),
width: 120,
},
{
dataKey: 'name',
label: t('name'),
width: 120,
},
{
dataKey: 'packetNetWeight',
label: t("weight"),
width: 120,
},
{
dataKey: 'totalItems',
label: t('count_of_items'),
width: 120,
},
{
dataKey: 'totalNetWeight',
label: t("party_weight"),
width: 120, width: 120,
renderCell: data => {
return <Button onClick={() => navigation.push(pageLinks.dashboard.real_boxes.edit(data.id))}>
<Add />
</Button>;
},
}, },
{ {
dataKey: 'cargoId', dataKey: 'cargoId',
@@ -198,73 +181,98 @@ const DashboardRealBoxesPage = (props: Props) => {
width: 120, width: 120,
}, },
{ {
dataKey: 'passportName', dataKey: 'partyName',
label: t('client'), label: t('party_name'),
width: 120, width: 120,
}, },
// {
// dataKey: 'name',
// label: t('name'),
// width: 120,
// },
// {
// dataKey: 'packetNetWeight',
// label: t("weight"),
// width: 120,
// },
{ {
dataKey: 'status', dataKey: 'totalItems',
label: t('status'), label: t('count_of_items'),
width: 240, width: 120,
renderHeaderCell(rowIndex) {
return (
<Stack direction={'row'} alignItems={'center'}>
<span>{t('box_status')}</span>
<ActionPopMenu
buttons={BoxStatusList.map(stat => {
return {
icon: <Circle sx={{ path: { color: getStatusColor(stat) } }} />,
label: t(stat),
onClick() {
setBoxStatusFilter(stat);
setPage(1);
},
};
})}
mainIcon={<FilterList />}
placement={{
anchorOrigin: {
vertical: 'bottom',
horizontal: 'center',
},
transformOrigin: {
horizontal: 'center',
vertical: 'top',
},
}}
/>
</Stack>
);
},
renderCell(data) {
return (
<StatusChangePopup
anchor={{
status: data.status,
text: t(data.status),
}}
loading={changeStatusIds.includes(data.id)}
buttons={boxStatusOptions.map(stat => {
return {
icon: (
<Circle
sx={{
path: {
color: getStatusColor(stat),
},
}}
/>
),
label: t(stat),
onClick: () => {
onChangeStatus(data.id, stat);
},
};
})}
/>
);
},
}, },
// {
// dataKey: 'totalNetWeight',
// label: t("party_weight"),
// width: 120,
// },
// {
// dataKey: 'passportName',
// label: t('client'),
// width: 120,
// },
// {
// dataKey: 'status',
// label: t('status'),
// width: 240,
// renderHeaderCell(rowIndex) {
// return (
// <Stack direction={'row'} alignItems={'center'}>
// <span>{t('box_status')}</span>
// <ActionPopMenu
// buttons={BoxStatusList.map(stat => {
// return {
// icon: <Circle sx={{ path: { color: getStatusColor(stat) } }} />,
// label: t(stat),
// onClick() {
// setBoxStatusFilter(stat);
// setPage(1);
// },
// };
// })}
// mainIcon={<FilterList />}
// placement={{
// anchorOrigin: {
// vertical: 'bottom',
// horizontal: 'center',
// },
// transformOrigin: {
// horizontal: 'center',
// vertical: 'top',
// },
// }}
// />
// </Stack>
// );
// },
// renderCell(data) {
// return (
// <StatusChangePopup
// anchor={{
// status: data.status,
// text: t(data.status),
// }}
// loading={changeStatusIds.includes(data.id)}
// buttons={boxStatusOptions.map(stat => {
// return {
// icon: (
// <Circle
// sx={{
// path: {
// color: getStatusColor(stat),
// },
// }}
// />
// ),
// label: t(stat),
// onClick: () => {
// onChangeStatus(data.id, stat);
// },
// };
// })}
// />
// );
// },
// },
{ {
label: '', label: '',
width: 100, width: 100,
@@ -277,7 +285,7 @@ const DashboardRealBoxesPage = (props: Props) => {
icon: <Edit sx={{ path: { color: '#3489E4' } }} />, icon: <Edit sx={{ path: { color: '#3489E4' } }} />,
label: t('edit'), label: t('edit'),
onClick: () => { onClick: () => {
navigation.push(pageLinks.dashboard.boxes.edit(data.id)); navigation.push(pageLinks.dashboard.real_boxes.edit(data.id));
}, },
}, },
{ {
@@ -289,19 +297,15 @@ const DashboardRealBoxesPage = (props: Props) => {
dontCloseOnClick: true, dontCloseOnClick: true,
loading: deleteIds.includes(data.id), loading: deleteIds.includes(data.id),
}, },
...(data.status === 'READY' {
? [ icon: <Download sx={{ path: { color: '#3489E4' } }} />,
{ label: t('download_excel'),
icon: <Download sx={{ path: { color: '#3489E4' } }} />, onClick: () => {
label: t('download_excel'), onDownloadExcel(data.id);
onClick: () => { },
onDownloadExcel(data.id); loading: downloadIds.includes(data.id),
}, dontCloseOnClick: true,
loading: downloadIds.includes(data.id), },
dontCloseOnClick: true,
},
]
: []),
]} ]}
/> />
); );
@@ -312,8 +316,8 @@ const DashboardRealBoxesPage = (props: Props) => {
return ( return (
<Box> <Box>
<Stack direction={'row'} mb={3} spacing={3}> <Stack direction={'row'} mb={3} spacing={3}>
<BaseButton colorVariant='blue' startIcon={<Add />} href={pageLinks.dashboard.boxes.create}> <BaseButton colorVariant='blue' startIcon={<Add />} href={pageLinks.dashboard.real_boxes.create}>
{t('create_packet')} {t('create_box')}
</BaseButton> </BaseButton>
</Stack> </Stack>
<Box <Box
@@ -335,7 +339,7 @@ const DashboardRealBoxesPage = (props: Props) => {
color: '#000', color: '#000',
}} }}
> >
{t('packet')} {t('boxes')}
</Typography> </Typography>
<Stack direction={'row'} alignItems={'center'} spacing={2}> <Stack direction={'row'} alignItems={'center'} spacing={2}>
<BaseInput <BaseInput

View File

@@ -330,10 +330,10 @@
resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz" resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz"
integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
"@esbuild/darwin-x64@0.21.5": "@esbuild/win32-x64@0.21.5":
version "0.21.5" version "0.21.5"
resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz" resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz"
integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
"@eslint-community/eslint-utils@^4.2.0": "@eslint-community/eslint-utils@^4.2.0":
version "4.4.0" version "4.4.0"
@@ -592,10 +592,10 @@
dependencies: dependencies:
glob "7.1.7" glob "7.1.7"
"@next/swc-darwin-x64@14.0.4": "@next/swc-win32-x64-msvc@14.0.4":
version "14.0.4" version "14.0.4"
resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.4.tgz" resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.4.tgz"
integrity sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw== integrity sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
version "2.1.5" version "2.1.5"
@@ -623,10 +623,10 @@
resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz"
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
"@rollup/rollup-darwin-x64@4.34.8": "@rollup/rollup-win32-x64-msvc@4.34.8":
version "4.34.8" version "4.34.8"
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz" resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz"
integrity sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw== integrity sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==
"@rushstack/eslint-patch@^1.3.3": "@rushstack/eslint-patch@^1.3.3":
version "1.6.1" version "1.6.1"
@@ -2085,11 +2085,6 @@ fs.realpath@^1.0.0:
resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
function-bind@^1.1.1, function-bind@^1.1.2: function-bind@^1.1.1, function-bind@^1.1.2:
version "1.1.2" version "1.1.2"
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"