Done
This commit is contained in:
parent
9afd1c4437
commit
c31cbe28f7
19809
package-lock.json
generated
19809
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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 };
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 = () => {
|
||||
|
|
|
|||
|
|
@ -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 !== "") || [] : [];
|
||||
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) {
|
||||
values['items'] = [...products, ...category];
|
||||
|
||||
transformedValues['items'] = [...products, ...category];
|
||||
}
|
||||
|
||||
|
||||
console.log(values, "values");
|
||||
|
||||
mutate(values)
|
||||
|
||||
console.log(transformedValues, "transformedValues");
|
||||
mutate(transformedValues);
|
||||
};
|
||||
|
||||
|
||||
const { t } = useTranslation();
|
||||
|
||||
useNavigateOnSuccess(isSuccess, '/Coupon')
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
</>
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
};
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
|
|
|
|||
|
|
@ -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 });
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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} />
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ export const RoutesLinks: RoutesLinksType[] = [
|
|||
href: "/order",
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
name: "edit_order",
|
||||
element: <EditOrder />,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
14
src/api/home.ts
Normal 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);
|
||||
|
|
@ -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": "شهر"
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
Loading…
Reference in New Issue
Block a user