This commit is contained in:
KarimAldeen 2024-03-25 09:20:07 +03:00
parent 9afd1c4437
commit c31cbe28f7
34 changed files with 353 additions and 19978 deletions

19809
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,7 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@ant-design/icons": "^4.8.3",
"@emotion/styled": "^11.11.0",
"@mui/icons-material": "^5.14.19",
"@mui/x-charts": "^6.19.4",
@ -30,6 +31,7 @@
"i18next-browser-languagedetector": "^7.1.0",
"json-server": "^0.17.4",
"moment": "^2.30.1",
"prop-types": "^15.8.1",
"react": "^18.2.0",
"react-apexcharts": "^1.4.1",
"react-bootstrap": "^2.9.1",

View File

@ -1,7 +1,7 @@
import React, { FC, useState } from "react";
import { ErrorMessage, useField, Field } from "formik";
import { FormGroup } from "reactstrap";
import PropTypes from "prop-types";
// import PropTypes from "prop-types";
import { Eye, EyeOff } from "react-feather";
import "./index.css";
@ -50,8 +50,8 @@ const PasswordField: FC<PasswordFieldProps> = ({ name, label, ...props }) => {
);
};
PasswordField.propTypes = {
name: PropTypes.string.isRequired,
};
// PasswordField.propTypes = {
// name: PropTypes.string.isRequired,
// };
export { PasswordField };

View File

@ -32,7 +32,7 @@ const StatisticsCard = (props :StatisticsCardProps) => {
} = props;
return (
<Card className="p-4" {...rest} onClick={()=>navigate(pathWhenClick , {replace:true})}>
<Card className="p-4 gomecards" {...rest} onClick={()=>navigate(pathWhenClick , {replace:true})}>
<CardBody
className={`${
className ? className : "stats-card-body"

View File

@ -2,7 +2,6 @@ import { Button, Upload, UploadFile } from 'antd'
import useFormField from '../../../Hooks/useFormField';
import { UploadOutlined } from '@ant-design/icons';
import { ImageBaseURL } from '../../../api/config';
import { useTranslation } from 'react-i18next';
const File = ({ name, label, onChange, isDisabled,placholder,className, props }: any) => {

View File

@ -1,5 +1,5 @@
import React, { FC } from "react";
import PropTypes from "prop-types";
// import PropTypes from "";
import { HtmlEditor } from "./HtmlEditor";
import { useFormikContext } from "formik";
import { useTranslation } from "react-i18next";
@ -35,9 +35,9 @@ const SingleLangEditor: FC<SingleLangEditorProps> = ({ langCode, property }) =>
);
};
SingleLangEditor.propTypes = {
langCode: PropTypes.oneOf([1, 2]).isRequired,
property: PropTypes.oneOf(PROPERTY_TYPES).isRequired,
};
// SingleLangEditor.propTypes = {
// langCode: PropTypes.oneOf([1, 2]).isRequired,
// property: PropTypes.oneOf(PROPERTY_TYPES).isRequired,
// };
export default SingleLangEditor;

View File

@ -93,7 +93,7 @@ const initialItemShape: any = {
const handleRemove = (targetKey: string) => {
const newItems = items.filter((item:any) => item.key !== targetKey);
const removedItem = values?.Attribute[targetKey] as any;
if (removedItem?.id) {
if (removedItem?.id && removedItem?.id !== null &&removedItem?.id !== 0 ) {
setRemovedAttribute((prevRemovedAttribute) => [...prevRemovedAttribute, removedItem.id]);
}
const newActiveKey = newItems.length ? newItems[newItems.length - 1].key : '1';

View File

@ -85,7 +85,7 @@ export const TabsContainer= ({parentKey}:any) => {
const newItems = items.filter((item:any) => item?.key !== targetKey);
console.log(newItems,"newItems",targetKey,"targetKey");
const removedItem = values?.Attribute[parentKey]?.AttributeValue[targetKey] as any;
if (removedItem?.id) {
if (removedItem?.id && removedItem?.id !== null &&removedItem?.id !== 0 ) {
console.log(removedItem?.id,"removedItem?.id");
setremovedAttributeValue((prevremovedAttributeValue) => [...prevremovedAttributeValue, removedItem.id]);
}

View File

@ -2,20 +2,17 @@
import React, { useEffect, useState } from 'react';
import { Tabs, Space } from 'antd';
import { CopyOutlined } from '@ant-design/icons';
import { toast } from 'react-toastify';
import { FormikValues, useFormikContext } from 'formik';
import { useTranslation } from 'react-i18next';
import { AttributeTabs } from './AttributeTabs';
import { AttributeTabs as AddAttributeTabs} from '../../Add/AttributeTab/AttributeTabs';
const { TabPane } = Tabs;
export const TabsContainer: React.FC = () => {
const [activeKey, setActiveKey] = useState('1');
const { setFieldValue } = useFormikContext();
const formikContext = useFormikContext<FormikValues>();
const { values, handleChange } = formikContext;
const { values } = formikContext;
const [width, setWidth] = useState(window.innerWidth);
const [t] = useTranslation()
@ -28,6 +25,7 @@ export const TabsContainer: React.FC = () => {
const varianCount = values?.Attribute?.slice(1)?.map((item:any,index:any)=>{
return {
// eslint-disable-next-line no-useless-concat
label: `${t(`Attribute`)}`+ `${index+1}`,
key: index+1,
closable: true,
@ -79,22 +77,27 @@ export const TabsContainer: React.FC = () => {
const originalValues = values?.Attribute?.[targetKey];
const AttributeValue = originalValues?.AttributeValue?.slice(1)?.map((item:any,index:any)=>{
return {...item,id:null}
})
const newValue = { ...originalValues, id: null,AttributeValue:[{},...AttributeValue] };
setFieldValue(`Attribute.${newKey}`, {...originalValues,id:null});
console.log(newValue,"newValue");
setFieldValue(`Attribute.${newKey}`, newValue);
}
};
const [removedAttribute, setRemovedAttribute] = useState<string[]>([]);
useEffect(() => {
setFieldValue(`removedAttribute`, removedAttribute);
}, [removedAttribute]);
}, [removedAttribute,setFieldValue]);
const handleRemove = (targetKey: string) => {
const newItems = items.filter((item:any) => item.key !== targetKey);
const removedItem = values?.Attribute[targetKey] as any;
if (removedItem?.id) {
if (removedItem?.id && removedItem?.id !== null &&removedItem?.id !== 0 ) {
setRemovedAttribute((prevRemovedAttribute) => [...prevRemovedAttribute, removedItem.id]);
}
const newActiveKey = newItems.length ? newItems[newItems.length - 1].key : '1';

View File

@ -88,7 +88,9 @@ const initialItemShape: any = {
const handleRemove = (targetKey: string) => {
const newItems = items?.filter((item: any) => item.key !== targetKey) as any;
const removedItem = values?.Attribute?.[parentKey]?.AttributeValue?.[targetKey] as any;
if (removedItem?.id) {
console.log(removedItem?.id,"attrrubute value?.id");
if (removedItem?.id && removedItem?.id !== null &&removedItem?.id !== 0 ) {
setRemovedAttributeValues((prevRemovedAttributeValues) => [...prevRemovedAttributeValues, removedItem.id]);
}

View File

@ -288,8 +288,8 @@ const EditPage = () => {
id: EditAttributeValue?.id,
value: {
en: EditAttributeValue?.value_en,
ar: EditAttributeValue?.value_ar,
de: EditAttributeValue?.value_de
ar: EditAttributeValue?.value_ar ?? EditAttributeValue?.value_en,
de: EditAttributeValue?.value_de ?? EditAttributeValue?.value_en
},
image: EditAttributeValue?.image,
// attribute_id:EditAttribute?.id,
@ -431,8 +431,8 @@ const EditPage = () => {
const NewAddAttributeValue = {
value: {
en: AddAttributeValue?.value_en,
ar: AddAttributeValue?.value_ar,
de: AddAttributeValue?.value_de
ar: AddAttributeValue?.value_ar ?? AddAttributeValue?.value_en,
de: AddAttributeValue?.value_de ?? AddAttributeValue?.value_en
},
...IMage,
attribute_id: AttributeId,
@ -483,7 +483,7 @@ const EditPage = () => {
return item?.attribute_value
}))
}, [data?.category, Atrribute?.data,isRefetching,AttributeisRefetching]);
}, [data?.category, Atrribute?.data, isRefetching, AttributeisRefetching, setObjectToEdit]);
const getValidationSchema = () => {

View File

@ -14,34 +14,32 @@ const AddCouponPage = () => {
const { mutate, isLoading:IsloadingButton, isSuccess } = useAddCoupon()
const handleSubmit = (values: any) => {
const transformedValues = { ...values }; // Create a new object
values.active_at = values.active[0].format('YYYY-MM-DD HH:mm:ss.SSS')
values.active_to = values.active[1].format('YYYY-MM-DD HH:mm:ss.SSS')
values.status = values.active ? "active" : "inactive"
// Apply transformations
transformedValues.active_at = values.active[0]?.format('YYYY-MM-DD HH:mm:ss.SSS') || '';
transformedValues.active_to = values.active[1]?.format('YYYY-MM-DD HH:mm:ss.SSS') || '';
transformedValues.status = values.active ? "active" : "inActive";
const products = Array.isArray(values?.product_attr) ?
values?.product_attr.map((item: any) => {
return { "itemable_type": "product", "itemable_id": item };
})?.filter((item: any) => item.itemable_id !== "") || [] : [];
values.product_attr
.map((item: any) => ({ "itemable_type": "product", "itemable_id": item }))
.filter((item: any) => item.itemable_id !== "") || [] : [];
// Check if category_attr is an array before mapping over it
const category = Array.isArray(values?.category_attr) ?
values?.category_attr.map((item: any) => {
return { "itemable_type": "category", "itemable_id": item };
})?.filter((item: any) => item.itemable_id !== "") || [] : [];
if (products.length > 0 || category.length > 0 ) {
values['items'] = [...products, ...category];
values.category_attr
.map((item: any) => ({ "itemable_type": "category", "itemable_id": item }))
.filter((item: any) => item.itemable_id !== "") || [] : [];
if (products.length > 0 || category.length > 0) {
transformedValues['items'] = [...products, ...category];
}
console.log(values, "values");
mutate(values)
console.log(transformedValues, "transformedValues");
mutate(transformedValues);
};
const { t } = useTranslation();
useNavigateOnSuccess(isSuccess, '/Coupon')

View File

@ -22,18 +22,20 @@ const EditPage = () => {
const { mutate, isSuccess } = useUpdateCoupon("put")
const handleSubmit = (values: any) => {
const products = values?.product_attr?.map((item: any) => {
return { "itemable_type": "product", "itemable_id": item };
const itemableId = typeof item === 'object' ? item.value : item;
return { "itemable_type": "product", "itemable_id": itemableId };
})?.filter((item: any) => item.itemable_id !== "") || [];
const category = values?.category_attr?.map((item: any) => {
return { "itemable_type": "category", "itemable_id": item };
const itemableId = typeof item === 'object' ? item.value : item;
return { "itemable_type": "category", "itemable_id": itemableId };
})?.filter((item: any) => item.itemable_id !== "") || [];
// Create an object to hold the values to be mutated
const mutationData: any = {};
if (values?.name !== null) mutationData["name"] = values.name;
if (values?.status !== null) mutationData["status"] = values.status ? "active" : "inactive";
if (values?.status !== null) mutationData["status"] = values.status ? "active" : "inActive";
if (values?.minimum_total_to_order !== null) mutationData["minimum_total_to_order"] = values.minimum_total_to_order;
if (values?.maximum_number_of_uses_per_user !== null) mutationData["maximum_number_of_uses_per_user"] = values.maximum_number_of_uses_per_user;
if (values?.maximum_number_of_uses !== null) mutationData["maximum_number_of_uses"] = values.maximum_number_of_uses;
@ -48,6 +50,8 @@ const EditPage = () => {
mutationData['items'] = [...products, ...category];
}
console.log(mutationData,"mutationData");
// Perform the mutation with the constructed mutationData object
mutate(mutationData);
}

View File

@ -18,25 +18,24 @@ const chartSetting = {
};
const BarsDataset = () => {
const [t] = useTranslation()
const dataset = [
{london: 59, paris: 57, newYork: 86, seoul: 21, month: t('January')},
{london: 59, paris: 57, newYork: 86, seoul: 21, month: t('February')},
{london: 59, paris: 57, newYork: 86, seoul: 21, month: t('March')},
{london: 59, paris: 57, newYork: 86, seoul: 21, month: t('April')},
const BarsDataset = ({dataMonth}:any) => {
const [t] = useTranslation()
const dataset = dataMonth;
];
const series = [
{ dataKey: 'london', label: t('London'), valueFormatter: (value: number) => `${value}mm` },
{ dataKey: 'paris', label: t('Paris'), valueFormatter: (value: number) => `${value}mm` },
{ dataKey: 'newYork', label: t('New York'), valueFormatter: (value: number) => `${value}mm` },
{ dataKey: 'seoul', label: t('Seoul'), valueFormatter: (value: number) => `${value}mm` },
{ dataKey: 'users', label: t('users'), valueFormatter: (value: number) => `${value}` },
{ dataKey: 'orders', label: t('orders'), valueFormatter: (value: number) => `${value}` }
];
const months = dataset.map(data => data.month);
if(!dataMonth){
return <>
</>;
}
return (
<div className="Card BarChart" >
<BarChart

View File

@ -1,39 +1,46 @@
import React from "react";
import StatisticsCard from "../../Components/Ui/StaticsCard/StaticCard";
import { FaRedRiver } from "react-icons/fa";
import { FaFirstOrder, FaProductHunt, FaUser } from "react-icons/fa";
import { useTranslation } from "react-i18next";
import { Card, Col, Row } from "reactstrap";
import { AiOutlineUser } from 'react-icons/ai';
import { BsCart3 } from "react-icons/bs";
import { Col, Row } from "reactstrap";
import Chart from "./Chart";
import { useGetHome } from "../../api/home";
import { Spin } from "antd";
export default function HomePage() {
const { t } = useTranslation();
const {data,isLoading} = useGetHome()
console.log(data);
const cardsData = [
{
icon: <FaRedRiver className="warning" size={24} />,
count: 20, // Example count
pathWhenClick: "products",
titleKey: "products",
contentKey: "Product_in_your_Application"
icon: <FaUser className="warning" size={20} />,
count: data?.userCount, // Example count
pathWhenClick: '/',
titleKey: "userCount",
contentKey: "user_in_your_Application"
},
{
icon: <AiOutlineUser className="warning" size={24} />,
count: 20, // Example count
pathWhenClick: "categories",
titleKey: "categories",
contentKey: "categories_in_your_Application"
icon: <FaProductHunt className="warning" size={20} />,
count: data?.productCount, // Example count
pathWhenClick: "/",
titleKey: "productCount",
contentKey: "Product_Count_in_your_Application"
},
{
icon: <BsCart3 className="warning" size={24} />,
count: 20, // Example count
pathWhenClick: "order",
titleKey: "order",
contentKey: "Order_in_your_Application"
icon: <FaFirstOrder className="warning" size={20} />,
count: data?.orderCount, // Example count
pathWhenClick: "/",
titleKey: "orderCount",
contentKey: "order_count_in_your_Application"
}
];
if(isLoading){
return <Spin/>
}
return (
<>
<Row xs={1} sm={1} md={1} lg={3} xl={3}>
@ -53,7 +60,7 @@ export default function HomePage() {
</Row>
<Row xs={1} sm={1} md={1} lg={2} xl={2} style={{ margin: "30px 0 " }}>
<Chart />
<Chart dataMonth={data?.getMonthlyData}/>
</Row>
</>
);

View File

@ -1,22 +1,18 @@
import React, { useEffect } from 'react'
import DashBody from '../../Layout/Dashboard/DashBody'
import DashHeader from '../../Layout/Dashboard/DashHeader'
import LyTable from '../../Layout/Dashboard/LyTable'
import useTableColumns from './useTableColumns'
import { QueryStatusEnum } from '../../config/QueryStatus'
import { useGetProduct } from '../../api/product'
import { useTranslation } from 'react-i18next'
import { useNavigate } from 'react-router-dom'
import AddButton from '../../Layout/Dashboard/AddButton/AddButton'
import SearchField from '../../Layout/Dashboard/SearchField'
import { usePageState } from '../../lib/state mangment/LayoutPagestate'
function ProductsPage() {
const column =useTableColumns()
const {data ,status } = useGetProduct()
const [t] = useTranslation()
const navigate = useNavigate()
const totalRows = data?.meta?.total;

View File

@ -19,7 +19,7 @@ const AddProductPage = () => {
const { mutate, isLoading:IsloadingButton, data, isSuccess } = useAddProduct()
const { mutate: AddVariation, isSuccess: SuccessVariation } = useAddProductVariation()
const { mutate: AddVariation } = useAddProductVariation()
const [IsValed, setIsValed] = useState(false)
@ -27,6 +27,9 @@ const AddProductPage = () => {
const handleSubmit = (values: any) => {
console.log(values.variable[1], "values.variable[1]");
function isValid() {
setVaribleTaps(values?.variable?.slice(1))
@ -54,13 +57,15 @@ const AddProductPage = () => {
if (isSuccess) {
AddNewVariation(Varibletaps, data, AddVariation);
}
}, [isSuccess])
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isSuccess,AddNewVariation])
const { setObjectToEdit } = usePageState()
useEffect(() => {
setObjectToEdit([]);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
const { t } = useTranslation();

View File

@ -4,29 +4,51 @@ export function AddNewVariation(Varibletaps: any[], data: any, AddVariation: any
Varibletaps?.forEach((dataToSend: any) => {
const varible = dataToSend;
const info = varible?.info ?? [];
const convertedArray = Array.isArray(info) ?? info.reduce((acc: any, obj: any) => {
const convertedArray = info?.reduce((acc: any, obj: any) => {
acc[obj.Description] = obj.key;
return acc;
}, {});
const jsonString = JSON.stringify(convertedArray);
const jsonString = Object.keys(convertedArray).length === 0 ? null : JSON.stringify(convertedArray);
const StringimagesArray = varible?.images?.filter((item: any) => typeof item === 'string') || [];
const FileimagesArray = varible?.images?.filter((item: any) => typeof item !== 'string') || [];
const images = { images: FileimagesArray };
console.log(FileimagesArray,"FileimagesArray");
console.log(StringimagesArray,"StringimagesArray");
const main_photo = (typeof varible?.main_photo === 'string') ? {} : { main_photo: varible?.main_photo };
// const copied_assets = [
// ...(typeof varible?.main_photo === 'string' ? [{ main_photo: varible?.main_photo }] : []),
// [StringimagesArray]
// ];
const main_photo = (typeof varible?.main_photo === 'string') ? {
copied_assets: { main_photo: varible?.main_photo },
const mappedAttributes = varible.attribute?.map((item: any) => {
return item?.map((subitem: any) => ({
attribute_value_id: subitem?.value,
attribute_id: subitem?.id
}));
});
} : {
main_photo: varible?.main_photo,
console.log(mappedAttributes, "mappedAttributes");
}
const images = (typeof varible?.images === 'string') ? {
copied_assets: { images: varible?.images },
// Flatten the array of arrays
const flattenedAttributes = mappedAttributes?.flat();
} : {
images: varible?.images,
const arrayOfObjects = flattenedAttributes?.map((subArray: any, index: any) => {
console.log(subArray, "subArray");
console.log(index, "index");
}
return {
...subArray,
};
});
console.log(arrayOfObjects, "arrayOfObjects");
const Newproduct = {
@ -43,12 +65,16 @@ export function AddNewVariation(Varibletaps: any[], data: any, AddVariation: any
// quantity: varible?.quantity,
...images,
...main_photo,
// ...copied_assets,
info: jsonString,
price: varible?.price,
product_attributes: varible?.attribute?.map((item: any, index: any) => {
return { attribute_value_id: item?.value, attribute_id: item?.id };
}),
// product_attributes: varible?.attribute?.map((item: any, index: any) => {
// return item?.map((subitem:any,index:any)=>{
// return { attribute_value_id: subitem?.value, attribute_id: subitem?.id }
// })
// }),
product_attributes:arrayOfObjects,
base_product_id: baseProductId
};
console.log(Newproduct);

View File

@ -25,8 +25,8 @@ const ViewProduct = () => {
const [OldData, setOldData] = useState(data?.data?.products)
const { mutate, isSuccess, isLoading: IsloadingButton } = useUpdateProduct('put')
const { mutate: UpdateVariation, isSuccess: UpdetedSuccessVariation } = useUpdateProductVariation()
const { mutate: AddVariation, isSuccess: AddedSuccessVariation, data: ProductVariationData } = useAddProductVariation()
const { mutate: UpdateVariation } = useUpdateProductVariation()
const { mutate: AddVariation } = useAddProductVariation()
const { mutate: DeleteVariation } = useDeleteProductVariation()
@ -39,7 +39,7 @@ const ViewProduct = () => {
const handleSubmit = (values: any) => {
// Update removedVarianteValues state
// console.log(values?.removedVariant, "values?.removedVariant");
console.log(values, "values");
console.log(values?.variable[1], "values");
function isValid() {
setremovedVariant(values?.removedVariant);
@ -84,9 +84,9 @@ const ViewProduct = () => {
useEffect(() => {
if (isSuccess) {
const baseProductId = id;
const filtered_Variant = filterUndefinedAndEmpty(Variant);
// eslint-disable-next-line array-callback-return
filtered_Variant?.map((dataToSend: any, index: number) => {
console.log(dataToSend, "dataToSend");
const varible = dataToSend
@ -98,23 +98,38 @@ const ViewProduct = () => {
})) : [];
// const info = varible?.info
const info = varible?.info ?? [];
const convertedArray = Array.isArray(info) ?? info.reduce((acc: any, obj: any) => {
const convertedArray = info?.reduce((acc: any, obj: any) => {
acc[obj.Description] = obj.key;
return acc;
}, {});
const jsonString = JSON.stringify(convertedArray);
const jsonString = Object.keys(convertedArray).length === 0 ? null : JSON.stringify(convertedArray);
const images_product = foundObject?.images?.map((item: any) => {
return item?.path
})
console.log(varible?.images,"varible?.images");
const array1 = images_product;
const array2 = varible?.images;
const Oldimages = isthereequal(array2 || [], foundObject.images || []);
const finalImageData= removeStrings(array2 || [])
const isEqual_images = array1.length === array2.length && array1.every((value: any, index: any) => value === array2[index]);
// const Newimages = varible?.images?.map((item: any) => {
// const value = typeof item === 'object' ? item.url : item;
// return [value];
// });
console.log("Arrays are equal:", isEqual_images);
console.log("finalImageData", finalImageData);
console.log("Oldimages", Oldimages);
const filteredOldimages = Oldimages.filter(item => item !== undefined);
const images = isEqual_images ? { } : { images:[...finalImageData,...filteredOldimages] }
const images = isEqual_images ? { } : { images: varible?.images }
const Editedproduct = {
name: {
en: varible?.name_en,
@ -206,26 +221,60 @@ const ViewProduct = () => {
} else {
const info = varible?.info ?? [];
const convertedArray = Array.isArray(info) ?? info.reduce((acc: any, obj: any) => {
const convertedArray = info?.reduce((acc: any, obj: any) => {
acc[obj.Description] = obj.key;
return acc;
}, {});
const jsonString = JSON.stringify(convertedArray);
const jsonString = Object.keys(convertedArray).length === 0 ? null : JSON.stringify(convertedArray);
const main_photo = (typeof varible?.main_photo === 'string') ? {
copied_assets: { main_photo: varible?.main_photo },
} : {
main_photo: varible?.main_photo,
const StringimagesArray = varible?.images?.filter((item: any) => typeof item === 'string') || [];
const FileimagesArray = varible?.images?.filter((item: any) => typeof item !== 'string') || [];
console.log(FileimagesArray,"FileimagesArray");
console.log(StringimagesArray,"StringimagesArray");
const images = { images: FileimagesArray };
const main_photo = (typeof varible?.main_photo === 'string') ? {} : { main_photo: varible?.main_photo };
const copied_assets = {
...(typeof varible?.main_photo === 'string' ? { main_photo: varible?.main_photo } : {}),
...(StringimagesArray.length > 0 ? {images:StringimagesArray} : {})
}
const images = (typeof varible?.images === 'string') ? {
copied_assets: { images: varible?.images },
const copied_assets_arry = Object.keys(copied_assets).length !== 0 ? { copied_assets: copied_assets } : {};
console.log(images,"images");
console.log(main_photo,"main_photo");
console.log(copied_assets,"copied_assets");
const mappedAttributes = varible.attribute?.map((item: any) => {
return item?.map((subitem: any) => ({
attribute_value_id: subitem?.value,
attribute_id: subitem?.id
}));
});
console.log(mappedAttributes, "mappedAttributes");
// Flatten the array of arrays
const flattenedAttributes = mappedAttributes?.flat();
const arrayOfObjects = flattenedAttributes?.map((subArray: any, index: any) => {
console.log(subArray, "subArray");
console.log(index, "index");
return {
...subArray,
};
});
} : {
images: varible?.images,
}
const Newproduct = {
name: {
en: varible?.name_en,
@ -243,18 +292,19 @@ const ViewProduct = () => {
price: varible?.price,
base_product_id: id,
...main_photo,
...images,
...main_photo,
...copied_assets_arry,
product_attributes: varible?.attribute?.map((item: any, index: any) => {
return { attribute_value_id: item?.value, attribute_id: item?.id }
}),
product_attributes: arrayOfObjects,
}
AddVariation(Newproduct)
}
@ -268,6 +318,7 @@ const ViewProduct = () => {
return DeleteVariation({ id: item })
})
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isSuccess])
@ -279,7 +330,7 @@ const ViewProduct = () => {
// refetch()
setObjectToEdit(data?.data);
setOldData(data?.data?.products)
}, [data, data?.data?.products, data?.data, id, isRefetching]);
}, [data, data?.data?.products, data?.data, id, isRefetching, setObjectToEdit]);
const getValidationSchema = () => {
return null
@ -323,3 +374,28 @@ const ViewProduct = () => {
export default ViewProduct
function isthereequal(arr1: any[], arr2: any[]): any[] {
console.log("arr1:", arr1);
console.log("arr2:", arr2);
const equalItems = arr2
.filter(item2 => arr1.some(item1 => item1 === item2?.path))
.map(item => item.id);
console.log("Equal items found in arr2:", equalItems);
return equalItems;
}
function removeDuplicates(arr1: any[], arr2: any[]): any[] {
const combinedArray = [...arr1, ...arr2];
const uniqueArray = combinedArray.filter((item, index) => {
return combinedArray.indexOf(item) === index;
});
return uniqueArray;
}
function removeStrings(arr: any[]): any[] {
return arr.filter(item => typeof item !== 'string');
}

View File

@ -1,6 +1,5 @@
import React from 'react';
import { useFormikContext } from 'formik';
import ValidationField from '../../../../../Components/ValidationField/ValidationField';
import { useGetSingleAttribute } from '../../../../../api/attribute';
import { Select } from 'antd';
import { useTranslation } from 'react-i18next';
@ -11,10 +10,16 @@ const Attribute = ({ tabKey }: any) => {
const [t] = useTranslation()
const { data: attributeData } = useGetSingleAttribute({ name: "category_id", id: values?.category_id });
const handleAttributeChange = (value: any, option: any) => {
setFieldValue(`variable[${tabKey}].attribute`, option);
// console.log(option[0],"option");
setFieldValue(`variable[${tabKey}].attribute[${option[0].id}]`, option);
};
return (
attributeData?.data?.map((item: any) => {
const uniqueOptionsMap = new Map();
@ -24,7 +29,7 @@ const Attribute = ({ tabKey }: any) => {
}
});
const options = Array.from(uniqueOptionsMap.entries()).map(([label, value]) => ({
const options = Array?.from(uniqueOptionsMap?.entries())?.map(([label, value]) => ({
label,
value: value.attribute_id, // Change value to attribute_id
id: value.id, // Include id in the option
@ -33,6 +38,8 @@ const Attribute = ({ tabKey }: any) => {
if (options.length === 0) {
return <></>; // Don't render anything if options are empty
}
// console.log(options[0].id,"options");
// console.log(values?.variable[tabKey]?.attribute,"values?.[options[0].id");
return (
<div className='ValidationField'>
@ -46,7 +53,8 @@ const Attribute = ({ tabKey }: any) => {
size="large"
className={`w-100`}
defaultValue={values?.variable[tabKey]?.attribute}
defaultValue={values?.variable?.[tabKey]?.attribute?.[options?.[0]?.id]}
allowClear
mode={"multiple" }
onChange={handleAttributeChange}

View File

@ -16,11 +16,13 @@ const MaltyFile = ({ tabKey }: any) => {
const FormikimageUrl = file ? ImageBaseURL + file : '';
const imageUrl = typeof file === "string" ? (FormikimageUrl)?.replace("public", "/storage") : (file instanceof File) ? URL.createObjectURL(file) : "";
// console.log(imageUrl?.replace("public", "/storage"),"imageUrl");
return {
uid: `-${index}`,
name: file?.name || '',
status: 'done',
url: imageUrl?.replace("public", "/storage"),
url: file,
thumbUrl: imageUrl?.replace("public", "/storage")
};
});

View File

@ -16,6 +16,8 @@ const ObjectField = ({ tabKey }: any) => {
updatedItems[index][fieldKey] = value;
setFieldItems(updatedItems);
formik.setFieldValue(`variable.${tabKey}.info`, updatedItems);
console.log(updatedItems,"updatedItems");
};
useEffect(() => {
@ -35,6 +37,8 @@ const ObjectField = ({ tabKey }: any) => {
useEffect(() => {
// console.log(initialValues);
console.log(initialValues,"initialValues");
}, [initialValues])
return (

View File

@ -7,6 +7,7 @@ import { FormikValues, useFormikContext } from 'formik';
import { useTranslation } from 'react-i18next';
import { useProductVarianState } from '../../../../lib/state mangment/Pages/Products';
import { VariableTabs } from './VariableTabs';
import { log } from 'console';
const { TabPane } = Tabs;
@ -70,11 +71,16 @@ export const TabsContainer: React.FC = () => {
setActiveKey(newKey);
const originalValues = values?.variable?.[targetKey];
if(originalValues.id === null){
console.log(originalValues?.id,'originalValues?.id');
if(originalValues?.id === null){
console.log(originalValues?.id,'`1`');
setFieldValue(`variable.${newKey}`, { ...originalValues, id: 0 });
}else{
console.log(originalValues?.id,'2');
setFieldValue(`variable.${newKey}`, { ...originalValues, id: null });
}

View File

@ -59,7 +59,7 @@ export const VariableTabs: React.FC<VariableTabsProps> = ({ tabKey }) => {
type="number"
/> */}
{(values?.category_id && (!values?.variable?.[tabKey]?.id || values?.variable?.[tabKey]?.id == null || values?.variable?.[tabKey]?.id == 0) ) &&
{(values?.category_id && (!values?.variable?.[tabKey]?.id || values?.variable?.[tabKey]?.id == null ) ) &&
<Atteibute tabKey={tabKey} />
}

View File

@ -33,6 +33,7 @@ export const getInitialValues = (objectToEdit: any) => {
description_en: item?.description["en"],
description_de: item?.description["de"],
images: images_product,
main_photo: item?.main_photo,
price: item?.price,
// quantity: item?.quantity,

View File

@ -5,7 +5,7 @@ import {
DropdownMenu,
DropdownItem,
} from 'reactstrap';
import PropTypes from 'prop-types';
// import PropTypes from 'prop-types';
import {BsArrowDownShort} from 'react-icons/bs'
import { useTranslation } from 'utility/language';
@ -44,8 +44,8 @@ function SelectType({ direction, title , setSelectType,setRefreshPage}) {
);
}
SelectType.propTypes = {
direction: PropTypes.string,
};
// SelectType.propTypes = {
// direction: PropTypes.string,
// };
export default SelectType;

View File

@ -105,6 +105,7 @@ export const RoutesLinks: RoutesLinksType[] = [
href: "/order",
},
{
name: "edit_order",
element: <EditOrder />,

View File

@ -542,6 +542,12 @@ padding: 10px 40px;
.Information{
margin-block: 20px;
}
:where(.css-dev-only-do-not-override-6j9yrn).ant-form{
.ant-form{
overflow-x: hidden;
}
// .ant-tabs{
// min-height: 200px;
// }
.gomecards{
min-height: 220px;
}

View File

@ -11,7 +11,7 @@ function useGetQuery(key: string, url: string , params:any={},options:any={}) {
params ? [key, params] : key,
async () => {
const response = await axios.get(url , {params});
return response.data.data;
return response.data;
},

14
src/api/home.ts Normal file
View File

@ -0,0 +1,14 @@
import useGetQuery from "./helper/useGetQuery"
const API = {
ADD: `home/overview`,
GET_ALL: `home/overview`,
DELETE: `home/overview`,
UPDATE: `home/overview`,
};
const KEY = "Home"
export const useGetHome = (params?:any) => useGetQuery(KEY, API.GET_ALL,params);

View File

@ -143,7 +143,14 @@
"added_successful": "تمت الإضافة بنجاح",
"failed_to_add_data": "فشلت عملية الإضافة",
"deleted_successfully": "تم الحذف بنجاح",
"updated_successfully": "تم التحديث بنجاح"
"updated_successfully": "تم التحديث بنجاح",
"Product_Count_in_your_Application": "عدد المنتجات في تطبيقك",
"productCount": "عدد المنتجات",
"user_in_your_Application": "المستخدمون في تطبيقك",
"userCount": "عدد المستخدمين",
"orderCount": "عدد الطلبات",
"order_count_in_your_Application": "عدد الطلبات في تطبيقك",
"month": "شهر"

View File

@ -140,7 +140,14 @@
"added_successful": "Erfolgreich hinzugefügt",
"failed_to_add_data": "Daten konnten nicht hinzugefügt werden",
"deleted_successfully": "Erfolgreich gelöscht",
"updated_successfully": "Erfolgreich aktualisiert"
"updated_successfully": "Erfolgreich aktualisiert",
"Product_Count_in_your_Application": "Anzahl der Produkte in Ihrer Anwendung",
"productCount": "Anzahl der Produkte",
"user_in_your_Application": "Benutzer in Ihrer Anwendung",
"userCount": "Anzahl der Benutzer",
"orderCount": "Anzahl der Bestellungen",
"order_count_in_your_Application": "Anzahl der Bestellungen in Ihrer Anwendung",
"month": "Monat"

View File

@ -141,7 +141,14 @@
"added_successful": "added successful",
"failed_to_add_data": "Failed to add data",
"deleted_successfully": "deleted successfully",
"updated_successfully": "updated successfully"
"updated_successfully": "updated successfully",
"Product_Count_in_your_Application": "Number of Products in Your Application",
"productCount": "Count of Products",
"user_in_your_Application": "Users in Your Application",
"userCount": "Count of Users",
"orderCount": "Count of Orders",
"order_count_in_your_Application": "Number of Orders in Your Application",
"month": "Month"
}

View File

@ -1,6 +1,10 @@
{
added_uccessful
failed_to_add_data
deleted_successfully
updated_successfully
}
Product_Count_in_your_Application
productCount
user_in_your_Application
userCount
orderCount
order_count_in_your_Application
You_have
users
orders
month