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

View File

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

View File

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

View File

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

View File

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

View File

@ -93,7 +93,7 @@ const initialItemShape: any = {
const handleRemove = (targetKey: string) => { const handleRemove = (targetKey: string) => {
const newItems = items.filter((item:any) => item.key !== targetKey); const newItems = items.filter((item:any) => item.key !== targetKey);
const removedItem = values?.Attribute[targetKey] as any; const removedItem = values?.Attribute[targetKey] as any;
if (removedItem?.id) { if (removedItem?.id && removedItem?.id !== null &&removedItem?.id !== 0 ) {
setRemovedAttribute((prevRemovedAttribute) => [...prevRemovedAttribute, removedItem.id]); setRemovedAttribute((prevRemovedAttribute) => [...prevRemovedAttribute, removedItem.id]);
} }
const newActiveKey = newItems.length ? newItems[newItems.length - 1].key : '1'; 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); const newItems = items.filter((item:any) => item?.key !== targetKey);
console.log(newItems,"newItems",targetKey,"targetKey"); console.log(newItems,"newItems",targetKey,"targetKey");
const removedItem = values?.Attribute[parentKey]?.AttributeValue[targetKey] as any; 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"); console.log(removedItem?.id,"removedItem?.id");
setremovedAttributeValue((prevremovedAttributeValue) => [...prevremovedAttributeValue, removedItem.id]); setremovedAttributeValue((prevremovedAttributeValue) => [...prevremovedAttributeValue, removedItem.id]);
} }

View File

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

View File

@ -88,7 +88,9 @@ const initialItemShape: any = {
const handleRemove = (targetKey: string) => { const handleRemove = (targetKey: string) => {
const newItems = items?.filter((item: any) => item.key !== targetKey) as any; const newItems = items?.filter((item: any) => item.key !== targetKey) as any;
const removedItem = values?.Attribute?.[parentKey]?.AttributeValue?.[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]); setRemovedAttributeValues((prevRemovedAttributeValues) => [...prevRemovedAttributeValues, removedItem.id]);
} }

View File

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

View File

@ -14,33 +14,31 @@ const AddCouponPage = () => {
const { mutate, isLoading:IsloadingButton, isSuccess } = useAddCoupon() const { mutate, isLoading:IsloadingButton, isSuccess } = useAddCoupon()
const handleSubmit = (values: any) => { 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') // Apply transformations
values.status = values.active ? "active" : "inactive" 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') || '';
const products = Array.isArray(values?.product_attr) ? transformedValues.status = values.active ? "active" : "inActive";
values?.product_attr.map((item: any) => {
return { "itemable_type": "product", "itemable_id": item }; const products = Array.isArray(values?.product_attr) ?
})?.filter((item: any) => item.itemable_id !== "") || [] : []; values.product_attr
.map((item: any) => ({ "itemable_type": "product", "itemable_id": item }))
// Check if category_attr is an array before mapping over it .filter((item: any) => item.itemable_id !== "") || [] : [];
const category = Array.isArray(values?.category_attr) ?
values?.category_attr.map((item: any) => { const category = Array.isArray(values?.category_attr) ?
return { "itemable_type": "category", "itemable_id": item }; values.category_attr
})?.filter((item: any) => item.itemable_id !== "") || [] : []; .map((item: any) => ({ "itemable_type": "category", "itemable_id": item }))
.filter((item: any) => item.itemable_id !== "") || [] : [];
if (products.length > 0 || category.length > 0 ) {
values['items'] = [...products, ...category]; if (products.length > 0 || category.length > 0) {
transformedValues['items'] = [...products, ...category];
} }
console.log(transformedValues, "transformedValues");
console.log(values, "values"); mutate(transformedValues);
mutate(values)
}; };
const { t } = useTranslation(); const { t } = useTranslation();

View File

@ -22,18 +22,20 @@ const EditPage = () => {
const { mutate, isSuccess } = useUpdateCoupon("put") const { mutate, isSuccess } = useUpdateCoupon("put")
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
const products = values?.product_attr?.map((item: any) => { const products = values?.product_attr?.map((item: any) => {
return { "itemable_type": "product", "itemable_id": item }; const itemableId = typeof item === 'object' ? item.value : item;
})?.filter((item: any) => item.itemable_id !== "") || []; 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 category = values?.category_attr?.map((item: any) => {
})?.filter((item: any) => item.itemable_id !== "") || []; 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 // Create an object to hold the values to be mutated
const mutationData: any = {}; const mutationData: any = {};
if (values?.name !== null) mutationData["name"] = values.name; 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?.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_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; 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]; mutationData['items'] = [...products, ...category];
} }
console.log(mutationData,"mutationData");
// Perform the mutation with the constructed mutationData object // Perform the mutation with the constructed mutationData object
mutate(mutationData); mutate(mutationData);
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -4,30 +4,52 @@ export function AddNewVariation(Varibletaps: any[], data: any, AddVariation: any
Varibletaps?.forEach((dataToSend: any) => { Varibletaps?.forEach((dataToSend: any) => {
const varible = dataToSend; const varible = dataToSend;
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; acc[obj.Description] = obj.key;
return acc; 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') ? { const main_photo = (typeof varible?.main_photo === 'string') ? {} : { main_photo: varible?.main_photo };
copied_assets: { main_photo: varible?.main_photo },
// const copied_assets = [
} : { // ...(typeof varible?.main_photo === 'string' ? [{ main_photo: varible?.main_photo }] : []),
main_photo: varible?.main_photo, // [StringimagesArray]
// ];
}
const images = (typeof varible?.images === 'string') ? {
copied_assets: { images: varible?.images },
} : {
images: varible?.images,
}
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,
};
});
console.log(arrayOfObjects, "arrayOfObjects");
const Newproduct = { const Newproduct = {
name: { name: {
@ -43,12 +65,16 @@ export function AddNewVariation(Varibletaps: any[], data: any, AddVariation: any
// quantity: varible?.quantity, // quantity: varible?.quantity,
...images, ...images,
...main_photo, ...main_photo,
// ...copied_assets,
info: jsonString, info: jsonString,
price: varible?.price, price: varible?.price,
product_attributes: varible?.attribute?.map((item: any, index: any) => { // product_attributes: varible?.attribute?.map((item: any, index: any) => {
return { attribute_value_id: item?.value, attribute_id: item?.id }; // return item?.map((subitem:any,index:any)=>{
}), // return { attribute_value_id: subitem?.value, attribute_id: subitem?.id }
// })
// }),
product_attributes:arrayOfObjects,
base_product_id: baseProductId base_product_id: baseProductId
}; };
console.log(Newproduct); console.log(Newproduct);

View File

@ -25,8 +25,8 @@ const ViewProduct = () => {
const [OldData, setOldData] = useState(data?.data?.products) const [OldData, setOldData] = useState(data?.data?.products)
const { mutate, isSuccess, isLoading: IsloadingButton } = useUpdateProduct('put') const { mutate, isSuccess, isLoading: IsloadingButton } = useUpdateProduct('put')
const { mutate: UpdateVariation, isSuccess: UpdetedSuccessVariation } = useUpdateProductVariation() const { mutate: UpdateVariation } = useUpdateProductVariation()
const { mutate: AddVariation, isSuccess: AddedSuccessVariation, data: ProductVariationData } = useAddProductVariation() const { mutate: AddVariation } = useAddProductVariation()
const { mutate: DeleteVariation } = useDeleteProductVariation() const { mutate: DeleteVariation } = useDeleteProductVariation()
@ -39,7 +39,7 @@ const ViewProduct = () => {
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
// Update removedVarianteValues state // Update removedVarianteValues state
// console.log(values?.removedVariant, "values?.removedVariant"); // console.log(values?.removedVariant, "values?.removedVariant");
console.log(values, "values"); console.log(values?.variable[1], "values");
function isValid() { function isValid() {
setremovedVariant(values?.removedVariant); setremovedVariant(values?.removedVariant);
@ -84,9 +84,9 @@ const ViewProduct = () => {
useEffect(() => { useEffect(() => {
if (isSuccess) { if (isSuccess) {
const baseProductId = id;
const filtered_Variant = filterUndefinedAndEmpty(Variant); const filtered_Variant = filterUndefinedAndEmpty(Variant);
// eslint-disable-next-line array-callback-return
filtered_Variant?.map((dataToSend: any, index: number) => { filtered_Variant?.map((dataToSend: any, index: number) => {
console.log(dataToSend, "dataToSend"); console.log(dataToSend, "dataToSend");
const varible = dataToSend const varible = dataToSend
@ -98,23 +98,38 @@ const ViewProduct = () => {
})) : []; })) : [];
// const info = varible?.info // const info = varible?.info
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; acc[obj.Description] = obj.key;
return acc; 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) => { const images_product = foundObject?.images?.map((item: any) => {
return item?.path return item?.path
}) })
console.log(varible?.images,"varible?.images");
const array1 = images_product; const array1 = images_product;
const array2 = varible?.images; 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 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("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 = { const Editedproduct = {
name: { name: {
en: varible?.name_en, en: varible?.name_en,
@ -206,26 +221,60 @@ const ViewProduct = () => {
} else { } else {
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; acc[obj.Description] = obj.key;
return acc; 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 }, 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 };
main_photo: varible?.main_photo,
} const main_photo = (typeof varible?.main_photo === 'string') ? {} : { main_photo: varible?.main_photo };
const images = (typeof varible?.images === 'string') ? {
copied_assets: { images: varible?.images }, const copied_assets = {
...(typeof varible?.main_photo === 'string' ? { main_photo: varible?.main_photo } : {}),
...(StringimagesArray.length > 0 ? {images:StringimagesArray} : {})
} : { }
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,
};
});
const Newproduct = { const Newproduct = {
name: { name: {
en: varible?.name_en, en: varible?.name_en,
@ -243,18 +292,19 @@ const ViewProduct = () => {
price: varible?.price, price: varible?.price,
base_product_id: id, base_product_id: id,
...main_photo,
...images, ...images,
...main_photo,
...copied_assets_arry,
product_attributes: arrayOfObjects,
product_attributes: varible?.attribute?.map((item: any, index: any) => {
return { attribute_value_id: item?.value, attribute_id: item?.id }
}),
} }
AddVariation(Newproduct) AddVariation(Newproduct)
} }
@ -268,6 +318,7 @@ const ViewProduct = () => {
return DeleteVariation({ id: item }) return DeleteVariation({ id: item })
}) })
} }
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isSuccess]) }, [isSuccess])
@ -279,7 +330,7 @@ const ViewProduct = () => {
// refetch() // refetch()
setObjectToEdit(data?.data); setObjectToEdit(data?.data);
setOldData(data?.data?.products) setOldData(data?.data?.products)
}, [data, data?.data?.products, data?.data, id, isRefetching]); }, [data, data?.data?.products, data?.data, id, isRefetching, setObjectToEdit]);
const getValidationSchema = () => { const getValidationSchema = () => {
return null return null
@ -323,3 +374,28 @@ const ViewProduct = () => {
export default 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 React from 'react';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
import ValidationField from '../../../../../Components/ValidationField/ValidationField';
import { useGetSingleAttribute } from '../../../../../api/attribute'; import { useGetSingleAttribute } from '../../../../../api/attribute';
import { Select } from 'antd'; import { Select } from 'antd';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@ -11,10 +10,16 @@ const Attribute = ({ tabKey }: any) => {
const [t] = useTranslation() const [t] = useTranslation()
const { data: attributeData } = useGetSingleAttribute({ name: "category_id", id: values?.category_id }); const { data: attributeData } = useGetSingleAttribute({ name: "category_id", id: values?.category_id });
const handleAttributeChange = (value: any, option: any) => { 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 ( return (
attributeData?.data?.map((item: any) => { attributeData?.data?.map((item: any) => {
const uniqueOptionsMap = new Map(); 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, label,
value: value.attribute_id, // Change value to attribute_id value: value.attribute_id, // Change value to attribute_id
id: value.id, // Include id in the option id: value.id, // Include id in the option
@ -33,7 +38,9 @@ const Attribute = ({ tabKey }: any) => {
if (options.length === 0) { if (options.length === 0) {
return <></>; // Don't render anything if options are empty 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 ( return (
<div className='ValidationField'> <div className='ValidationField'>
@ -46,8 +53,9 @@ const Attribute = ({ tabKey }: any) => {
size="large" size="large"
className={`w-100`} className={`w-100`}
defaultValue={values?.variable[tabKey]?.attribute}
allowClear defaultValue={values?.variable?.[tabKey]?.attribute?.[options?.[0]?.id]}
allowClear
mode={"multiple" } mode={"multiple" }
onChange={handleAttributeChange} onChange={handleAttributeChange}

View File

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

View File

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

View File

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

View File

@ -59,7 +59,7 @@ export const VariableTabs: React.FC<VariableTabsProps> = ({ tabKey }) => {
type="number" 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} /> <Atteibute tabKey={tabKey} />
} }

View File

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

View File

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

View File

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

View File

@ -542,6 +542,12 @@ padding: 10px 40px;
.Information{ .Information{
margin-block: 20px; margin-block: 20px;
} }
:where(.css-dev-only-do-not-override-6j9yrn).ant-form{ .ant-form{
overflow-x: hidden; 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, params ? [key, params] : key,
async () => { async () => {
const response = await axios.get(url , {params}); 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": "تمت الإضافة بنجاح", "added_successful": "تمت الإضافة بنجاح",
"failed_to_add_data": "فشلت عملية الإضافة", "failed_to_add_data": "فشلت عملية الإضافة",
"deleted_successfully": "تم الحذف بنجاح", "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", "added_successful": "Erfolgreich hinzugefügt",
"failed_to_add_data": "Daten konnten nicht hinzugefügt werden", "failed_to_add_data": "Daten konnten nicht hinzugefügt werden",
"deleted_successfully": "Erfolgreich gelöscht", "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", "added_successful": "added successful",
"failed_to_add_data": "Failed to add data", "failed_to_add_data": "Failed to add data",
"deleted_successfully": "deleted successfully", "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 @@
{ Product_Count_in_your_Application
added_uccessful productCount
failed_to_add_data user_in_your_Application
deleted_successfully userCount
updated_successfully orderCount
} order_count_in_your_Application
You_have
users
orders
month