This commit is contained in:
KarimAldeen 2024-03-20 10:15:54 +03:00
parent 8c6c1fd6cb
commit 4b22add13e
41 changed files with 682 additions and 344 deletions

View File

@ -27,7 +27,7 @@ const Date = ({ name, label,picker="date" ,isDisabled,props,onChange,placeholder
placeholder={placeholder} placeholder={placeholder}
allowClear allowClear
className={`${className} w-100`} className={`${className} w-100`}
// defaultValue={formik.values[name]} defaultValue={formik.values[name]}
size="large" size="large"
onChange={onChange || onCalendarChange} onChange={onChange || onCalendarChange}
disabled={isDisabled} disabled={isDisabled}

View File

@ -48,7 +48,8 @@ const SearchField = ({ name, label, placeholder, isDisabled, searchBy, option, i
options={option} options={option}
size="large" size="large"
className={`${className} w-100`} className={`${className} w-100`}
defaultValue={formik.values[name]} value={formik.values[name]}
// defaultValue={formik.values[name]}
allowClear allowClear
{...(isMulti && { mode: "multiple" })} {...(isMulti && { mode: "multiple" })}
onChange={onChange || SelecthandleChange} onChange={onChange || SelecthandleChange}

View File

@ -25,7 +25,7 @@ const SelectField = ({ name, label, placeholder, isDisabled,option,isMulti,onCha
options={option} options={option}
size="large" size="large"
className={`${className} w-100`} className={`${className} w-100`}
defaultValue={formik.values[name]} value={formik.values[name]}
allowClear allowClear
{...(isMulti && { mode: "multiple" })} {...(isMulti && { mode: "multiple" })}
onChange={onChange || SelecthandleChange} onChange={onChange || SelecthandleChange}

View File

@ -14,10 +14,10 @@ type TViewPage ={
getDataToSend:any, getDataToSend:any,
handleSubmit:any, handleSubmit:any,
// BarStatus:any, // BarStatus:any,
showProgressBar?:boolean, IsloadingButton:boolean
} }
const ViewPage: React.FC<TViewPage>= ({children,getInitialValues, getValidationSchema,handleSubmit,showProgressBar = true})=> { const ViewPage: React.FC<TViewPage>= ({children,getInitialValues, getValidationSchema,handleSubmit,IsloadingButton})=> {
const {objectToEdit} = usePageState() const {objectToEdit} = usePageState()
const {t} = useTranslation(); const {t} = useTranslation();
@ -43,23 +43,18 @@ const ViewPage: React.FC<TViewPage>= ({children,getInitialValues, getValidation
<Form> <Form>
{/* <HeadTabs tabs={tabs} /> */} {/* <HeadTabs tabs={tabs} /> */}
{children} {children}
{showProgressBar && {
<> <>
{/* <ProgressBar
value={BarStatus?.value}
isLoading={BarStatus?.isLoading}
isError={BarStatus?.isError}
isSuccess={BarStatus?.isSuccess}
/> */}
<div className="d-flex mt-4 justify-content-center align-items-center"> <div className="d-flex mt-4 justify-content-center align-items-center">
{/* <LoadingButton <LoadingButton
type="submit" type="submit"
color="primary" color="primary"
// isLoading={BarStatus?.isLoading} isLoading={IsloadingButton}
> >
{t("save")} {t("save")}
</LoadingButton> */} </LoadingButton>
<Button type="submit" color="primary"> {t("save")} </Button> {/* <Button disabled={isLoading} type="submit" color="primary"> {t("save")} </Button> */}
</div> </div>
</> </>
} }

View File

@ -5,13 +5,18 @@ import { Button, Upload, UploadFile } from 'antd'
import { UploadOutlined } from '@ant-design/icons'; import { UploadOutlined } from '@ant-design/icons';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
import { ImageBaseURL } from '../../../../../../api/config';
const File = ({ parentKey,tabKey}:any) => { const FileAttributeaValue = ({ parentKey,tabKey}:any) => {
const { t } = useTranslation(); const { t } = useTranslation();
const formik = useFormikContext<any>(); const formik = useFormikContext<any>();
const name = `Attribute.[${parentKey}].AttributeValue[${tabKey}].${"image"}`; const name = `Attribute.[${parentKey}].AttributeValue[${tabKey}].${"image"}`;
const imageUrl = formik?.values?.Attribute?.[parentKey]?.AttributeValue?.[tabKey]?.["image"] ? URL.createObjectURL(formik?.values?.Attribute?.[parentKey]?.AttributeValue?.[tabKey]?.["image"]) : "" ; const fileObject = formik?.values?.Attribute?.[parentKey]?.AttributeValue?.[tabKey]?.["image"];
const FormikimageUrl = fileObject ? ImageBaseURL + fileObject : '';
const imageUrl = typeof fileObject === "string" ? (FormikimageUrl)?.replace("public", "/storage") : (fileObject instanceof File) ? URL.createObjectURL(fileObject) : "";
const fileList: UploadFile[] = [ const fileList: UploadFile[] = [
@ -59,4 +64,4 @@ const File = ({ parentKey,tabKey}:any) => {
) )
} }
export default File export default FileAttributeaValue

View File

@ -1,5 +1,5 @@
// TabsContainer.tsx // TabsContainer.tsx
import React, { useEffect, useState } from 'react'; import React, { useEffect, useRef, 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 { toast } from 'react-toastify';
@ -74,8 +74,9 @@ export const TabsContainer= ({parentKey}:any) => {
}; };
const [removedAttributeValue, setremovedAttributeValue] = useState<string[]>([]); const [removedAttributeValue, setremovedAttributeValue] = useState<string[]>([]);
useEffect(() => { useEffect(() => {
setFieldValue(`removedAttributeValue`, removedAttributeValue); setFieldValue(`removedAttributeValue[${parentKey}]`, removedAttributeValue);
}, [removedAttributeValue]); }, [removedAttributeValue]);

View File

@ -1,7 +1,7 @@
import { toast } from 'react-toastify'; import { toast } from 'react-toastify';
export const isvalidation = (attributes: any[] | undefined, t: any) => { export const isvalidation = (attributes: any[] , t: any) => {
const validationResults: boolean[] = []; const validationResults: boolean[] = [];
let previousNames: { [key: string]: string } = {}; let previousNames: { [key: string]: string } = {};

View File

@ -14,12 +14,13 @@ import { useAddAttributeValue } from '../../../api/attributeValue';
import useNavigateOnSuccess from '../../../Hooks/useNavigateOnSuccess'; import useNavigateOnSuccess from '../../../Hooks/useNavigateOnSuccess';
import { isvalidation } from './Add/fn/isvalidation'; import { isvalidation } from './Add/fn/isvalidation';
import { toast } from 'react-toastify';
const AddcategoriesPage = () => { const AddcategoriesPage = () => {
const { setObjectToEdit, objectToEdit } = usePageState() const { setObjectToEdit, objectToEdit } = usePageState()
const {mutate ,isSuccess,data } = useAddCategories() const {mutate,isLoading:IsloadingButton ,isSuccess,data } = useAddCategories()
const {mutateAsync} = useAddAttribute() const {mutateAsync} = useAddAttribute()
const {mutate:AddAttributeValue } = useAddAttributeValue() const {mutate:AddAttributeValue } = useAddAttributeValue()
@ -28,40 +29,121 @@ const AddcategoriesPage = () => {
const handleSubmit = (values:any)=>{ const handleSubmit = (values:any)=>{
console.log(values,"values"); console.log(values,"values");
function isValid(){ function isValid(){
values?.Attribute?.slice(1)?.forEach((item:any) => { values?.Attribute?.slice(1)?.forEach((item:any) => {
if (item && Object.keys(item).length > 0){ if (item && Object.keys(item).length > 0){
setAttribute((prevAddAttributeValue) => [...prevAddAttributeValue, item]); setAttribute((prevAddAttributeValue) => [...prevAddAttributeValue, item]);
}
});
setAttributeValues(values?.Attribute?.slice(1)?.map((item:any)=>{
if (item && Object.keys(item).length > 0){
return item?.AttributeValue
}
}))
const CategoriesValues = {
name: {
en:values?.name_en,
ar:values?.name_ar,
de:values?.name_de
},
parent_id:values?.parent_id,
photo:values?.photo,
}
mutate(CategoriesValues)
} }
const validationResults = isvalidation(values?.Attribute, t);
});
setAttributeValues(values?.Attribute?.slice(1)?.map((item:any)=>{
if (item && Object.keys(item).length > 0){
return item?.AttributeValue
}
}))
const CategoriesValues = {
name: {
en:values?.name_en,
ar:values?.name_ar,
de:values?.name_de
},
parent_id:values?.parent_id,
photo:values?.photo,
}
mutate(CategoriesValues)
}
const validationResults: boolean[] = [];
let previousNames: any = {};
values?.Attribute?.slice(1)?.forEach((item: any, index: any) => {
if (item && Object.keys(item).length > 0) {
const itemName = t('name');
const itemNumber = index + 1;
// Check if the names are unique across items
const currentItemNames = {
name_ar: item?.name_ar,
name_en: item?.name_en,
name_de: item?.name_de,
};
if (
previousNames.name_ar === currentItemNames.name_ar ||
previousNames.name_en === currentItemNames.name_en ||
previousNames.name_de === currentItemNames.name_de
) {
toast.error(`${itemName} ${t('unique_error_names')}`);
validationResults.push(false);
}
previousNames = currentItemNames;
// Check for other validation rules
if (!item?.name_ar || !item?.name_en || !item?.name_de) {
toast.error(`${t('required_name')} ${itemNumber}`);
validationResults.push(false);
} else if (!item?.type) {
toast.error(`${t('required_type')} ${itemNumber}`);
validationResults.push(false);
} else if (item?.type === "image") {
if (Array.isArray(item.AttributeValue)) {
item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => {
if (attrItem && Object.keys(attrItem).length > 0) {
if (attrItem.image === null) {
toast.error(`${t('required_image')} ${index + 1}`);
validationResults.push(false);
} else if (!attrItem?.value_ar || !attrItem?.value_en || !attrItem?.value_de) {
toast.error(`${t('required_text')} ${index + 1}`);
validationResults.push(false);
} else {
validationResults.push(true);
}
}
});
}
} else if (item?.type === "color") {
if (Array.isArray(item.AttributeValue)) {
item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => {
if (attrItem && Object.keys(attrItem).length > 0) {
const hexColorRegex = /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
if (attrItem && !hexColorRegex.test(attrItem?.value_en)) {
toast.error(`${t('required_color')} ${index + 1}`);
validationResults.push(false);
} else {
validationResults.push(true);
}
}
});
}
} else if (item?.type === "text") {
if (Array.isArray(item.AttributeValue)) {
item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => {
if (attrItem && Object.keys(attrItem).length > 0) {
if (attrItem && (!attrItem?.value_ar || !attrItem?.value_en || !attrItem?.value_de)) {
toast.error(` ${t('required_text')} ${index + 1}`);
validationResults.push(false);
} else {
validationResults.push(true);
}
}
});
}
} else {
validationResults.push(true);
}
}
});
if (validationResults.every((result) => result)) { if (validationResults.every((result) => result)) {
isValid(); isValid();
} }
} }
useEffect(()=>{ useEffect(()=>{
if(isSuccess){ if(isSuccess){
@ -87,13 +169,21 @@ const AddcategoriesPage = () => {
AttributeValues[index]?.slice(1)?.map((dataToSend:any , index:number)=>{ AttributeValues[index]?.slice(1)?.map((dataToSend:any , index:number)=>{
const AttributeValue = dataToSend const AttributeValue = dataToSend
const IMage =
(typeof AttributeValue?.image === 'string') ?
{
copied_assets: { image: AttributeValue?.image }
} :
{
image: AttributeValue?.image
};
const NewAttributeValues = { const NewAttributeValues = {
value:{ value:{
en:AttributeValue?.value_en, en:AttributeValue?.value_en,
ar:AttributeValue?.value_ar, ar:AttributeValue?.value_ar,
de:AttributeValue?.value_de de:AttributeValue?.value_de
}, },
image:AttributeValue?.main_photo, ...IMage,
attribute_id:AttributeId, attribute_id:AttributeId,
} }
if (NewAttribute.type === "color") { if (NewAttribute.type === "color") {
@ -125,7 +215,7 @@ const AddcategoriesPage = () => {
}, []); }, []);
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
return ( return (

View File

@ -81,7 +81,7 @@ const initialItemShape: any = {
const [removedAttributeValues, setRemovedAttributeValues] = useState<string[]>([]); const [removedAttributeValues, setRemovedAttributeValues] = useState<string[]>([]);
useEffect(() => { useEffect(() => {
setFieldValue(`removedAttributeValues`, removedAttributeValues); setFieldValue(`removedAttributeValue[${parentKey}]`, removedAttributeValues);
}, [removedAttributeValues]); }, [removedAttributeValues]);

View File

@ -4,7 +4,7 @@ import { Tab, TabList, TabPanel as TabBody, Tabs } from 'react-tabs'
import 'react-tabs/style/react-tabs.css'; import 'react-tabs/style/react-tabs.css';
import { MdLanguage } from 'react-icons/md' import { MdLanguage } from 'react-icons/md'
import ViewPage from '../../../Layout/Dashboard/ViewPage'; import ViewPage from '../../../Layout/Dashboard/ViewPage';
import { Rate, Spin } from 'antd'; import { Spin } from 'antd';
import { usePageState } from '../../../lib/state mangment/LayoutPagestate'; import { usePageState } from '../../../lib/state mangment/LayoutPagestate';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import LoadingPage from '../../../Layout/app/LoadingPage'; import LoadingPage from '../../../Layout/app/LoadingPage';
@ -15,9 +15,9 @@ import { TabsContainer } from './Edit/AttributeTab/TabsContainer';
import { useAddAttribute, useGetSingleAttribute } from '../../../api/attribute'; import { useAddAttribute, useGetSingleAttribute } from '../../../api/attribute';
import { useDeleteAttribute, useUpdateAttribute } from '../../../api/attribute'; import { useDeleteAttribute, useUpdateAttribute } from '../../../api/attribute';
import { useAddAttributeValue, useDeleteAttributeValue, useUpdateAttributeValue } from '../../../api/attributeValue'; import { useAddAttributeValue, useDeleteAttributeValue, useUpdateAttributeValue } from '../../../api/attributeValue';
import { toast } from 'react-toastify';
import Form from './Add/AddForm'; import Form from './Add/AddForm';
import filterUndefinedAndEmpty from '../../../utils/Array/filterUndefinedAndEmpty'; import filterUndefinedAndEmpty from '../../../utils/Array/filterUndefinedAndEmpty';
import { isvalidation } from './Add/fn/isvalidation';
const EditPage = () => { const EditPage = () => {
const { setObjectToEdit, objectToEdit } = usePageState() const { setObjectToEdit, objectToEdit } = usePageState()
@ -26,13 +26,13 @@ const EditPage = () => {
const { id } = useParams() const { id } = useParams()
const { data: Atrribute, isLoading: isLoadingAtrribute, isRefetching: AttributeisRefetching } = useGetSingleAttribute({ name: "category_id", id: id }, {}) const { data: Atrribute, isLoading: isLoadingAtrribute, isRefetching: AttributeisRefetching } = useGetSingleAttribute({ name: "category_id", id: id }, {})
const { mutate, isError, isSuccess } = useUpdateCategories() const { mutate, isSuccess,isLoading:IsloadingButton } = useUpdateCategories()
const { mutateAsync, isSuccess: isSuccessAddAttribute, data: AttributeData, isError: isErrorAddAttribute } = useAddAttribute() const { mutateAsync } = useAddAttribute()
const { mutate: mutateAttributeValue, isSuccess: isSuccessAddAttributeValue, data: AttributeValueData, isError: isErrorAddAttributeValue } = useAddAttributeValue() const { mutate: mutateAttributeValue } = useAddAttributeValue()
const { mutate: UpdateAttribute, isSuccess: isSuccessAttribute, isError: isErrorUpdateAttribute } = useUpdateAttribute("put") const { mutate: UpdateAttribute } = useUpdateAttribute("put")
const { mutate: UpdateAttributeValue, isSuccess: isSuccessAttributeValue, isError: isErrorUpdateAttributeValue } = useUpdateAttributeValue() const { mutate: UpdateAttributeValue } = useUpdateAttributeValue()
const { mutate: DeleteAttributeValue, isError: isErrorDeleteAttributeValue } = useDeleteAttributeValue() const { mutate: DeleteAttributeValue } = useDeleteAttributeValue()
const { mutate: DeleteAttribute, isError: isErrorDeleteAttribute } = useDeleteAttribute() const { mutate: DeleteAttribute } = useDeleteAttribute()
const [removedAttribute, setremovedAttribute] = useState<any[]>([]) const [removedAttribute, setremovedAttribute] = useState<any[]>([])
@ -49,35 +49,41 @@ const EditPage = () => {
const [OldDataValues, setOldDataValues] = useState([]) const [OldDataValues, setOldDataValues] = useState([])
const handleSubmit = (values: any const handleSubmit = (values: any) => {
) => {
function isValid() { function isValid() {
const attributes = values?.Attribute?.slice(1); const attributes = values?.Attribute?.slice(1);
const flattenedAndFiltered = values?.removedAttributeValue?.flat().filter((value:any) => value !== undefined);
console.log(flattenedAndFiltered,"flattenedAndFiltered");
setremovedAttribute(values?.removedAttribute) setremovedAttribute(values?.removedAttribute)
setremovedAttributeValue(values?.removedAttributeValue) setremovedAttributeValue(flattenedAndFiltered)
console.log(attributes, "attributes");
if (attributes) { if (attributes) {
attributes.forEach((item: any, index: number) => { attributes.forEach((item: any, index: number) => {
if (item?.id && item?.id !== null) { if (item?.id && item?.id !== null) {
console.log(item,"setEditAttribute");
setEditAttribute((prevEditAttribute) => [...prevEditAttribute, item]); setEditAttribute((prevEditAttribute) => [...prevEditAttribute, item]);
console.log(item, "item");
if (item?.AttributeValue) { if (item?.AttributeValue) {
item.AttributeValue.slice(1).forEach((attrValueItem: any) => { item.AttributeValue.slice(1).forEach((attrValueItem: any) => {
if (attrValueItem && Object.keys(attrValueItem).length > 0) { // Check if attrValueItem is defined and not empty if (attrValueItem && Object.keys(attrValueItem).length > 0) { // Check if attrValueItem is defined and not empty
setEditAttributeValue((prevEditAttributeValue) => [...prevEditAttributeValue, [index, attrValueItem]]); setEditAttributeValue((prevEditAttributeValue) => [...prevEditAttributeValue, [index, attrValueItem]]);
console.log(attrValueItem,"setEditAttributeValue");
} }
}); });
} }
} else { } else {
setAddAttribute((prevAddAttribute) => [...prevAddAttribute, item]); setAddAttribute((prevAddAttribute) => [...prevAddAttribute, item]);
console.log(item,"setAddAttribute");
if (item?.AttributeValue) { if (item?.AttributeValue) {
item?.AttributeValue?.slice(1)?.forEach((attrValueItem: any) => { item?.AttributeValue?.slice(1)?.forEach((attrValueItem: any) => {
console.log(attrValueItem, "attrValueItemadd");
if (attrValueItem && Object.keys(attrValueItem)?.length > 0) { // Check if attrValueItem is defined and not empty if (attrValueItem && Object.keys(attrValueItem)?.length > 0) { // Check if attrValueItem is defined and not empty
console.log(attrValueItem,"setAddAttributeValue");
setAddAttributeValue((prevEditAttributeValue) => [...prevEditAttributeValue, [index, attrValueItem]]); setAddAttributeValue((prevEditAttributeValue) => [...prevEditAttributeValue, [index, attrValueItem]]);
} }
}); });
@ -102,15 +108,94 @@ const EditPage = () => {
delete EditedCategory['photo'] delete EditedCategory['photo']
} }
console.log(EditedCategory, "EditedCategory");
mutate(EditedCategory) mutate(EditedCategory)
} }
const validationResults = isvalidation(values?.Attribute, t); const validationResults: boolean[] = [];
let previousNames: any = {};
if (validationResults.every((result) => result)) { values?.Attribute?.slice(1)?.forEach((item: any, index: any) => {
if (item && Object.keys(item).length > 0) {
const itemName = t('name');
const itemNumber = index + 1;
// Check if the names are unique across items
const currentItemNames = {
name_ar: item?.name_ar,
name_en: item?.name_en,
name_de: item?.name_de,
};
if (
previousNames.name_ar === currentItemNames.name_ar ||
previousNames.name_en === currentItemNames.name_en ||
previousNames.name_de === currentItemNames.name_de
) {
toast.error(`${itemName} ${t('unique_error_names')}`);
validationResults.push(false);
}
previousNames = currentItemNames;
// Check for other validation rules
if (!item?.name_ar || !item?.name_en || !item?.name_de) {
toast.error(`${t('required_name')} ${itemNumber}`);
validationResults.push(false);
} else if (!item?.type) {
toast.error(`${t('required_type')} ${itemNumber}`);
validationResults.push(false);
} else if (item?.type === "image") {
if (Array.isArray(item.AttributeValue)) {
item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => {
if (attrItem && Object.keys(attrItem).length > 0) {
if (attrItem.image === null) {
toast.error(`${t('required_image')} ${index + 1}`);
validationResults.push(false);
} else if (!attrItem?.value_ar || !attrItem?.value_en || !attrItem?.value_de) {
toast.error(`${t('required_text')} ${index + 1}`);
validationResults.push(false);
} else {
validationResults.push(true);
}
}
});
}
} else if (item?.type === "color") {
if (Array.isArray(item.AttributeValue)) {
item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => {
if (attrItem && Object.keys(attrItem).length > 0) {
const hexColorRegex = /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
if (attrItem && !hexColorRegex.test(attrItem?.value_en)) {
toast.error(`${t('required_color')} ${index + 1}`);
validationResults.push(false);
} else {
validationResults.push(true);
}
}
});
}
} else if (item?.type === "text") {
if (Array.isArray(item.AttributeValue)) {
item?.AttributeValue.slice(1)?.forEach((attrItem: any, index: number) => {
if (attrItem && Object.keys(attrItem).length > 0) {
if (attrItem && (!attrItem?.value_ar || !attrItem?.value_en || !attrItem?.value_de)) {
toast.error(` ${t('required_text')} ${index + 1}`);
validationResults.push(false);
} else {
validationResults.push(true);
}
}
});
}
} else {
validationResults.push(true);
}
}
});
if (validationResults.every((result) => result)) {
isValid(); isValid();
} }
} }
@ -125,7 +210,6 @@ const EditPage = () => {
useEffect(() => { useEffect(() => {
if (isSuccess) { if (isSuccess) {
console.log(isSuccess, "isSuccess");
const categoryId = id; const categoryId = id;
@ -134,7 +218,6 @@ const EditPage = () => {
filteredEditAttribute?.map((dataToSend: any, index: number) => { filteredEditAttribute?.map((dataToSend: any, index: number) => {
console.log(index, "index");
const EditAttribute = dataToSend const EditAttribute = dataToSend
const foundObject = OldData.find((item: any) => item.id === EditAttribute?.id) as any; const foundObject = OldData.find((item: any) => item.id === EditAttribute?.id) as any;
@ -188,20 +271,19 @@ const EditPage = () => {
} }
const result: [number, any][] = filterByIndex(index, EditAttributeValue); const result: [number, any][] = filterByIndex(index, EditAttributeValue);
console.log(result, "result");
const filteredresult = filterUndefinedAndEmpty(result); const filteredresult = filterUndefinedAndEmpty(result);
console.log(filteredresult, "EditAttributeValue");
filteredresult?.map((dataToSend: any) => { filteredresult?.map((dataToSend: any) => {
if (dataToSend?.id && dataToSend.id !== null) { if (dataToSend?.id && dataToSend.id !== null) {
console.log(OldDataValues, "OldDataValues");
const foundObjectValue = (OldDataValues[index] as any).find((item: any) => item.id === dataToSend?.id) as any; const foundObjectValue = (OldDataValues[index] as any).find((item: any) => item.id === dataToSend?.id) as any;
console.log(foundObjectValue, "foundObjectValue");
console.log(OldDataValues[index], "OldDataValues[index]");
const EditAttributeValue = dataToSend const EditAttributeValue = dataToSend
console.log(EditAttributeValue); console.log(EditAttributeValue);
const NewEditAttributeValue = { const NewEditAttributeValue = {
id: EditAttributeValue?.id, id: EditAttributeValue?.id,
value: { value: {
@ -209,7 +291,7 @@ const EditPage = () => {
ar: EditAttributeValue?.value_ar, ar: EditAttributeValue?.value_ar,
de: EditAttributeValue?.value_de de: EditAttributeValue?.value_de
}, },
image: EditAttributeValue?.main_photo, image: EditAttributeValue?.image,
// attribute_id:EditAttribute?.id, // attribute_id:EditAttribute?.id,
// id: EditAttributeValue?.id, // id: EditAttributeValue?.id,
} }
@ -225,8 +307,8 @@ const EditPage = () => {
delete NewEditAttributeValue['image'] delete NewEditAttributeValue['image']
} }
if (foundObjectValue) { if (foundObjectValue) {
console.log(foundObjectValue, "foundObjectValue");
Object.keys(NewEditAttributeValue).forEach((propName: any) => { Object.keys(NewEditAttributeValue).forEach((propName: any) => {
if (foundObjectValue.hasOwnProperty(propName)) { if (foundObjectValue.hasOwnProperty(propName)) {
@ -253,9 +335,6 @@ const EditPage = () => {
//@ts-ignore //@ts-ignore
delete NewEditAttributeValue.value; delete NewEditAttributeValue.value;
} }
console.log(foundObjectValue.value, "foundObjectValue.value");
console.log(NewEditAttributeValue.value, "NewEditAttributeValue.value");
if (Object.keys(NewEditAttributeValue).length > 0) { if (Object.keys(NewEditAttributeValue).length > 0) {
//@ts-ignore //@ts-ignore
@ -264,7 +343,6 @@ const EditPage = () => {
NewEditAttributeValue.id = foundObjectValue?.id; NewEditAttributeValue.id = foundObjectValue?.id;
console.log(NewEditAttributeValue, "EditAttribute");
UpdateAttributeValue(NewEditAttributeValue) UpdateAttributeValue(NewEditAttributeValue)
} }
@ -274,15 +352,16 @@ const EditPage = () => {
} }
else { else {
console.log("mutateAttributeValue");
const EditAttributeValue = dataToSend const EditAttributeValue = dataToSend
const IMages = EditAttributeValue?.id !== null ? { const IMage =
main_photo: EditAttributeValue?.main_photo, (typeof EditAttributeValue?.image === 'string') ?
image: EditAttributeValue?.image, {
} : { copied_assets: { image: EditAttributeValue?.image }
copied_assets: { image: EditAttributeValue?.image }, } :
} {
image: EditAttributeValue?.image
};
const NewEditAttributeValue = { const NewEditAttributeValue = {
value: { value: {
@ -290,9 +369,7 @@ const EditPage = () => {
ar: EditAttributeValue?.value_ar, ar: EditAttributeValue?.value_ar,
de: EditAttributeValue?.value_de de: EditAttributeValue?.value_de
}, },
// image: EditAttributeValue?.main_photo, ...IMage,
...IMages,
// attribute_id:EditAttribute?.id,
attribute_id: EditAttribute?.id, attribute_id: EditAttribute?.id,
} }
if (EditAttribute.type === "color") { if (EditAttribute.type === "color") {
@ -317,8 +394,8 @@ const EditPage = () => {
DeleteAttribute({ id: item }) DeleteAttribute({ id: item })
}) })
console.log(AddAttribute, "AddAttribute");
const filteredAddAttribute = filterUndefinedAndEmpty(AddAttribute); const filteredAddAttribute = filterUndefinedAndEmpty(AddAttribute);
console.log(filteredAddAttribute,"AddAttribute");
filteredAddAttribute?.map((dataToSend: any, index: number) => { filteredAddAttribute?.map((dataToSend: any, index: number) => {
@ -337,18 +414,27 @@ const EditPage = () => {
mutateAsync(NewAddAttribute).then((data: any) => { mutateAsync(NewAddAttribute).then((data: any) => {
const AttributeId = (data as any)?.id; const AttributeId = (data as any)?.id;
// console.log(AttributeValues[0]?.slice(1),"AttributeValues"); // console.log(AttributeValues[0]?.slice(1),"AttributeValues");
const result: [number, any][] = filterByIndex(0, AddAttributeValue); const result: [number, any][] = filterByIndex(index, AddAttributeValue);
console.log(AddAttribute?.AttributeValue,"AddAttribute?.AttributeValue");
result?.map((dataToSend: any, index: number) => { AddAttribute?.AttributeValue?.slice(1)?.map((dataToSend: any, index: number) => {
const AddAttributeValue = dataToSend const AddAttributeValue = dataToSend
const IMage =
(typeof AddAttributeValue?.image === 'string') ?
{
copied_assets: { image: AddAttributeValue?.image }
} :
{
image: AddAttributeValue?.image
};
const NewAddAttributeValue = { const NewAddAttributeValue = {
value: { value: {
en: AddAttributeValue?.value_en, en: AddAttributeValue?.value_en,
ar: AddAttributeValue?.value_ar, ar: AddAttributeValue?.value_ar,
de: AddAttributeValue?.value_de de: AddAttributeValue?.value_de
}, },
image: AddAttributeValue?.main_photo, ...IMage,
attribute_id: AttributeId, attribute_id: AttributeId,
} }
mutateAttributeValue(NewAddAttributeValue) mutateAttributeValue(NewAddAttributeValue)
@ -396,9 +482,8 @@ const EditPage = () => {
setOldDataValues(Atrribute?.data?.map((item: any) => { setOldDataValues(Atrribute?.data?.map((item: any) => {
return item?.attribute_value return item?.attribute_value
})) }))
console.log(OldDataValues, "OldDataValues");
}, [data?.category, Atrribute?.data, isRefetching, AttributeisRefetching]); }, [data?.category, Atrribute?.data,isRefetching,AttributeisRefetching]);
const getValidationSchema = () => { const getValidationSchema = () => {
@ -406,7 +491,7 @@ const EditPage = () => {
}; };
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
if (AttributeisRefetching || isRefetching || isLoadingAtrribute || isLoading || !objectToEdit || (Array.isArray(objectToEdit) && objectToEdit.some(item => item === undefined))) { if (AttributeisRefetching || isRefetching || isLoadingAtrribute || isLoading || !objectToEdit || (Array.isArray(objectToEdit) && objectToEdit.some(item => item === undefined))) {
return <Spin /> return <Spin />

View File

@ -12,25 +12,28 @@ import Form from './AddForm';
const AddCouponPage = () => { const AddCouponPage = () => {
const { mutate, isLoading, isSuccess } = useAddCoupon() const { mutate, isLoading:IsloadingButton, isSuccess } = useAddCoupon()
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
values.active_at = values.active[0].format('YYYY-MM-DD HH:mm:ss.SSS') 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.active_to = values.active[1].format('YYYY-MM-DD HH:mm:ss.SSS')
values.status = values.active ? "active" : "inactive" values.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 !== "") || [] : [];
// 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];
const products = values?.product_attr?.map((item: any) => { }
return { "itemable_type": "product", "itemable_id": item };
})?.filter((item: any) => item.itemable_id !== "")|| [];
const category = values?.category_attr?.map((item: any) => {
return { "itemable_type": "category", "itemable_id": item };
})?.filter((item: any) => item.itemable_id !== "") || [];
values['items'] = [...products, ...category];
console.log(values, "values"); console.log(values, "values");
@ -45,7 +48,7 @@ mutate(values)
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
return ( return (

View File

@ -1,5 +1,5 @@
import React from 'react' import React, { useEffect } from 'react'
import { Col, Row } from 'reactstrap'; import { Col, Row } from 'reactstrap';
import ValidationField from '../../../Components/ValidationField/ValidationField'; import ValidationField from '../../../Components/ValidationField/ValidationField';
import { useFormikContext } from 'formik'; import { useFormikContext } from 'formik';
@ -12,7 +12,7 @@ import useFormatToSelect from '../../../Hooks/useFormatToSelect';
import { useGetProduct } from '../../../api/product'; import { useGetProduct } from '../../../api/product';
function Form() { function Form() {
const { values } = useFormikContext<any>(); const { values,setFieldValue } = useFormikContext<any>();
const [t] = useTranslation(); // FLAT coupn not be spacified && flate const [t] = useTranslation(); // FLAT coupn not be spacified && flate
const coupon_type = [{ lable: "general", value: "general" },{ lable: "specified", value: "specified" }] const coupon_type = [{ lable: "general", value: "general" },{ lable: "specified", value: "specified" }]
const coupon_type_discount_flat = [{ lable: "general", value: "general" }] const coupon_type_discount_flat = [{ lable: "general", value: "general" }]
@ -23,6 +23,16 @@ function Form() {
const SelectCategoriesData = useFormatToSelect(CategoriesData?.categories) const SelectCategoriesData = useFormatToSelect(CategoriesData?.categories)
const SelectProductData = useFormatToSelect(ProductData?.BaseProducts) const SelectProductData = useFormatToSelect(ProductData?.BaseProducts)
useEffect(() => {
if (values?.discount_type === 'flat') {
console.log(values?.coupon_type,"values?.coupon_type");
setFieldValue("coupon_type","general")
}
}, [values?.discount_type])
return ( return (
<Row xs={1} sm={1} md={1} lg={2} xl={2}> <Row xs={1} sm={1} md={1} lg={2} xl={2}>
<Col> <Col>

View File

@ -18,7 +18,7 @@ import Form from './EditForm';
const EditPage = () => { const EditPage = () => {
const { setObjectToEdit, objectToEdit } = usePageState() const { setObjectToEdit, objectToEdit } = usePageState()
const { t } = useTranslation(); const { t } = useTranslation();
const { data,isLoading,isRefetching } = useGetOneCoupon() const { data,isLoading:IsloadingButton,isRefetching } = useGetOneCoupon()
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) => {
@ -66,13 +66,13 @@ const EditPage = () => {
const getValidationSchema = () => { const getValidationSchema = () => {
return null return null
}; };
if ( isLoading || !objectToEdit || isRefetching) { if ( IsloadingButton || !objectToEdit || isRefetching) {
return <Spin /> return <Spin />
} }
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
return ( return (

View File

@ -38,7 +38,7 @@ export const getInitialValues = (objectToEdit: any | null = null): any => {
} }
}); });
return { return {
id: objectToEdit?.id ?? 0, id: objectToEdit?.id ?? null,
name: objectToEdit?.name , name: objectToEdit?.name ,
code: objectToEdit?.code , code: objectToEdit?.code ,
//@ts-ignore //@ts-ignore
@ -60,19 +60,19 @@ export const getInitialValues = (objectToEdit: any | null = null): any => {
export const getInitialValuesForAdd = (objectToEdit: any | null = null): any => { export const getInitialValuesForAdd = (objectToEdit: any | null = null): any => {
return { return {
id: '', // id: '',
name: '', name: null,
code: '', code: null,
active: '', active: null,
minimum_total_to_order: '', minimum_total_to_order: null,
maximum_number_of_uses_per_user: '', maximum_number_of_uses_per_user: null,
maximum_number_of_uses: '', maximum_number_of_uses: null,
coupon_value: '', coupon_value: null,
coupon_type: 'general', coupon_type: null,
discount_type: '', discount_type: null,
product_attr: '', product_attr: null,
category_attr: '', category_attr: null,
status: '', status: 0,

View File

@ -1,28 +1,69 @@
import { Col, Row } from 'reactstrap'; import { Col, Row } from 'reactstrap';
import ValidationField from '../../../Components/ValidationField/ValidationField'; import ValidationField from '../../../Components/ValidationField/ValidationField';
import { useGetUsers } from '../../../api/users';
import { useTranslation } from 'react-i18next';
import { useFormikContext } from 'formik';
import { useEffect } from 'react';
function Form() { function Form() {
const type = [{ lable: "other", value: "other" },{ lable: "product", value: "product"},{ lable: "order", value: "order" }] const type = [{ lable: "other", value: "other" }, { lable: "product", value: "product" }, { lable: "order", value: "order" }]
const { data: user } = useGetUsers()
const [t]=useTranslation()
const useFormatToSelect = (Data : any) => {
const format = (data :any) => {
if (!data) return [];
return data.map((item :any) => ({
value: item?.id,
label: item?.name,
}));
};
return format(Data);
};
const SelectData = useFormatToSelect(user?.data)
// const selectAllOption = [{ label: t("Select All"), value: "*" }];
const selectAllOption = { label: "Select All", value: "*" };
const optionsWithSelectAll = [selectAllOption, ...SelectData];
const { values,setFieldValue} = useFormikContext<any>();
const hasAsterisk = values?.user_ids.some((item:any) => typeof item === 'string' && item.includes('*'));
const option = hasAsterisk ? [selectAllOption] : optionsWithSelectAll;
useEffect(() => {
if(hasAsterisk){
setFieldValue("user_ids",["*"])
}
}, [hasAsterisk])
useEffect(() => {
console.log(values?.user_ids,"user_ids");
}, [values.user_ids])
return ( return (
<Row xs={1} sm={1} md={1} lg={2} xl={2}> <Row xs={1} sm={1} md={1} lg={2} xl={2}>
<Col> <Col>
<ValidationField name="body_en" /> <ValidationField name="body_en" />
<ValidationField name="body_ar" /> <ValidationField name="body_ar" />
<ValidationField name="body_de" /> <ValidationField name="body_de" />
{/* <ValidationField name="meta" /> */} {/* <ValidationField name="meta" /> */}
<ValidationField name="user_ids" label='user' type="Search" option={option} searchBy={"name"} isMulti />
</Col> </Col>
<Col> <Col>
<ValidationField name="title_en" /> <ValidationField name="title_en" />
<ValidationField name="title_ar" /> <ValidationField name="title_ar" />
<ValidationField name="title_de" /> <ValidationField name="title_de" />
{/* <ValidationField name="type" type="Select" option={type} /> */} {/* <ValidationField name="type" type="Select" option={type} /> */}

View File

@ -14,30 +14,36 @@ import { useAddNotification } from '../../../api/notification';
const AddPage = () => { const AddPage = () => {
const { mutate, isLoading, isSuccess } = useAddNotification() const { mutate, isLoading:IsloadingButton, isSuccess } = useAddNotification()
const {id} = useParams() const {id} = useParams()
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
const hasAsterisk = values?.user_ids.some((item:any) => typeof item === 'string' && item.includes('*'));
const userIds = hasAsterisk ? { notifyAll: 1 } : { user_ids: values?.user_ids };
const body = { const body = {
en: values.body_en, en: values.body_en,
ar: values.body_ar, ar: values.body_ar,
du: values.body_de de: values.body_de
} };
const meta = {}
const meta = {};
const title = { const title = {
en: values.title_en, en: values.title_en,
ar: values.title_ar, ar: values.title_ar,
du: values.title_de de: values.title_de
}
const dataToSend = {
body: JSON.stringify(body),
meta: JSON.stringify(meta),
title:JSON.stringify(title),
user_ids: [id],
type: "other",
}; };
const dataToSend = {
body: body,
meta: meta,
title: title,
type: "other",
...userIds
};
console.log(dataToSend?.notifyAll);
mutate(dataToSend); mutate(dataToSend);
}; };
@ -45,11 +51,11 @@ const AddPage = () => {
const { t } = useTranslation(); const { t } = useTranslation();
useNavigateOnSuccess(isSuccess, '/users') useNavigateOnSuccess(isSuccess, '/notification')
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
return ( return (

View File

@ -37,7 +37,7 @@ export const getValidationSchema = (editMode: boolean = false): Yup.Schema<any>
body_en: Yup.string().required('Required'), body_en: Yup.string().required('Required'),
body_ar: Yup.string().required('Required'), body_ar: Yup.string().required('Required'),
body_de: Yup.string().required('Required'), body_de: Yup.string().required('Required'),
// meta: Yup.string().required('Required'), user_ids: Yup.array().min(1, 'At least one user must be selected').required('Required'),
title_en: Yup.string().required('Required'), title_en: Yup.string().required('Required'),
title_ar: Yup.string().required('Required'), title_ar: Yup.string().required('Required'),

View File

@ -1,5 +1,5 @@
import React from 'react' 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'
@ -10,6 +10,7 @@ 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() {
@ -19,6 +20,8 @@ function ProductsPage() {
const navigate = useNavigate() const navigate = useNavigate()
const totalRows = data?.meta?.total; const totalRows = data?.meta?.total;
return ( return (
<DashBody status={status as QueryStatusEnum} > <DashBody status={status as QueryStatusEnum} >
<DashHeader showAddButton={false} title={'products'}> <DashHeader showAddButton={false} title={'products'}>

View File

@ -18,7 +18,7 @@ import { AddNewVariation } from './Addfn/AddNewVariation';
const AddProductPage = () => { const AddProductPage = () => {
const { mutate, isLoading, data, isSuccess } = useAddProduct() const { mutate, isLoading:IsloadingButton, data, isSuccess } = useAddProduct()
const { mutate: AddVariation, isSuccess: SuccessVariation } = useAddProductVariation() const { mutate: AddVariation, isSuccess: SuccessVariation } = useAddProductVariation()
const [IsValed, setIsValed] = useState(false) const [IsValed, setIsValed] = useState(false)
@ -65,11 +65,11 @@ const AddProductPage = () => {
const { t } = useTranslation(); const { t } = useTranslation();
useNavigateOnSuccess(SuccessVariation, '/products') useNavigateOnSuccess(isSuccess, '/products')
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
return ( return (

View File

@ -3,19 +3,21 @@ export function AddNewVariation(Varibletaps: any[], data: any, AddVariation: any
const baseProductId = data?.id; const baseProductId = data?.id;
Varibletaps?.forEach((dataToSend: any) => { Varibletaps?.forEach((dataToSend: any) => {
const varible = dataToSend; const varible = dataToSend;
const info = varible?.info; const info = varible?.info ?? [];
const convertedArray = info?.reduce((acc: any, obj: any) => { const convertedArray = Array.isArray(info) ?? 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 = JSON.stringify(convertedArray);
const IMages = varible?.id !== null ? {
const IMages = (varible?.id !== null || varible?.id !== 0) ? {
main_photo: varible?.main_photo, main_photo: varible?.main_photo,
images: varible?.images, images: varible?.images,
} : { } : {
copied_assets: { main_photo: varible?.main_photo, images: varible?.images }, copied_assets: { main_photo: varible?.main_photo, images: varible?.images },
} }
const Newproduct = { const Newproduct = {
name: { name: {
en: varible?.name_en, en: varible?.name_en,

View File

@ -24,7 +24,7 @@ const ViewProduct = () => {
const { data, isLoading, isRefetching } = useGetOneProduct({ id: id }) const { data, isLoading, isRefetching } = useGetOneProduct({ id: id })
const [OldData, setOldData] = useState(data?.data?.products) const [OldData, setOldData] = useState(data?.data?.products)
const { mutate, isSuccess } = useUpdateProduct('put') const { mutate, isSuccess, isLoading: IsloadingButton } = useUpdateProduct('put')
const { mutate: UpdateVariation, isSuccess: UpdetedSuccessVariation } = useUpdateProductVariation() const { mutate: UpdateVariation, isSuccess: UpdetedSuccessVariation } = useUpdateProductVariation()
const { mutate: AddVariation, isSuccess: AddedSuccessVariation, data: ProductVariationData } = useAddProductVariation() const { mutate: AddVariation, isSuccess: AddedSuccessVariation, data: ProductVariationData } = useAddProductVariation()
@ -38,7 +38,9 @@ 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");
function isValid() { function isValid() {
setremovedVariant(values?.removedVariant); setremovedVariant(values?.removedVariant);
const variables = values?.variable?.slice(1); const variables = values?.variable?.slice(1);
@ -59,9 +61,9 @@ const ViewProduct = () => {
mutate(newData); mutate(newData);
} }
const validationResults = isvalidation(values.variable, t); const validationResults = isvalidation(values.variable, t);
if (validationResults.every((result) => result)) { // if (validationResults.every((result) => result)) {
isValid(); // isValid();
} // }
}; };
@ -69,6 +71,15 @@ const ViewProduct = () => {
function arraysAreEqual(array1: any, array2: any) {
// Sort both arrays
const sortedArray1 = array1.slice().sort();
const sortedArray2 = array2.slice().sort();
// Compare the sorted arrays
return JSON.stringify(sortedArray1) === JSON.stringify(sortedArray2);
}
useEffect(() => { useEffect(() => {
@ -79,18 +90,29 @@ const ViewProduct = () => {
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
if (varible?.id && varible?.id !== null) { if (varible?.id && varible?.id !== null && varible?.id !== 0) {
const foundObject = OldData.find((item: any) => item.id === varible?.id) as any; const foundObject = OldData.find((item: any) => item.id === varible?.id) as any;
const info = varible?.info const formattedOldInfoData = foundObject?.info ? Object.entries(foundObject?.info).map(([key, value], index) => ({
console.log(info, "info"); [`Description`]: key,
[`key`]: value,
const convertedArray = info.reduce((acc: any, obj: any) => { })) : [];
// const info = varible?.info
const info = varible?.info ?? [];
const convertedArray = Array.isArray(info) ?? 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 = JSON.stringify(convertedArray);
console.log(jsonString, "jsonStringinfo");
const images_product = foundObject?.images?.map((item: any) => {
return item?.path
})
const array1 =images_product;
const array2 =varible?.images;
const isEqual2 = array1.length === array2.length && array1.every((value:any, index:any) => value === array2[index]);
console.log("Arrays are equal:", isEqual2);
const Editedproduct = { const Editedproduct = {
name: { name: {
@ -103,16 +125,16 @@ const ViewProduct = () => {
ar: varible?.description_ar, ar: varible?.description_ar,
de: varible?.description_de de: varible?.description_de
}, },
// quantity: varible?.quantity, quantity: varible?.quantity,
main_photo: varible?.main_photo, main_photo: varible?.main_photo,
images: varible?.images, images: varible?.images,
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 { attribute_value_id: item?.value, attribute_id: item?.id }
}), // }),
} }
if (foundObject) { if (foundObject) {
@ -154,35 +176,45 @@ const ViewProduct = () => {
delete Editedproduct[key]; delete Editedproduct[key];
} }
}); });
if (convertedArray && foundObject.info) { console.log(foundObject.info, "foundObject.info");
const editedInfoKeys = Object.keys(convertedArray);
const foundInfoKeys = Object.keys(foundObject.info);
console.log(editedInfoKeys, "editedInfoKeys");
console.log(foundInfoKeys, "foundInfoKeys");
// Check if the number of keys is the same const isEqual = arraysAreEqual(formattedOldInfoData, varible?.info);
if (editedInfoKeys.length === foundInfoKeys.length) { console.log(isEqual, "isEqual");
// Check if all keys and their corresponding values are the same
const keysAreEqual = editedInfoKeys.every((key: any) => { if (isEqual) {
//@ts-ignore //@ts-ignore
console.log(convertedArray[key], "convertedArray[key] "); delete Editedproduct?.info;
console.log(foundObject.info[key], "foundObject.info[key]");
return convertedArray[key] === foundObject.info[key];
});
if (keysAreEqual) {
// Remove the info property from Editedproduct
//@ts-ignore
delete Editedproduct.info;
}
}
if (Object.keys(Editedproduct.info).length === 0) {
//@ts-ignore
delete Editedproduct.info;
}
} }
// if (convertedArray && foundObject.info) {
// const editedInfoKeys = Object.keys(convertedArray);
// const foundInfoKeys = Object.keys(foundObject.info);
// console.log(editedInfoKeys, "editedInfoKeys");
// console.log(foundInfoKeys, "foundInfoKeys");
// // Check if the number of keys is the same
// if (editedInfoKeys.length === foundInfoKeys.length) {
// // Check if all keys and their corresponding values are the same
// const keysAreEqual = editedInfoKeys.every((key: any) => {
// //@ts-ignore
// console.log(convertedArray[key], "convertedArray[key] ");
// console.log(foundObject.info[key], "foundObject.info[key]");
// return convertedArray[key] === foundObject.info[key];
// });
// if (keysAreEqual) {
// // Remove the info property from Editedproduct
// //@ts-ignore
// delete Editedproduct.info;
// }
// }
// if (Object.keys(Editedproduct.info).length === 0) {
// //@ts-ignore
// delete Editedproduct.info;
// }
// }
if (Object.keys(Editedproduct).length > 0) { if (Object.keys(Editedproduct).length > 0) {
//@ts-ignore //@ts-ignore
Editedproduct._method = "PUT"; Editedproduct._method = "PUT";
@ -197,19 +229,21 @@ const ViewProduct = () => {
} else { } else {
const info = varible?.info const info = varible?.info ?? [];
const convertedArray = info?.reduce((acc: any, obj: any) => { const convertedArray = Array.isArray(info) ?? 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 = JSON.stringify(convertedArray);
const IMages =
const IMages = varible?.id !== null ? { (typeof varible?.main_photo === 'string' || typeof varible?.images === 'string') ?
main_photo: varible?.main_photo, {
images: varible?.images, copied_assets: { main_photo: varible?.main_photo, images: varible?.images }
} : { } :
copied_assets: { main_photo: varible?.main_photo, images: varible?.images }, {
} main_photo: varible?.main_photo,
images: varible?.images
};
const Newproduct = { const Newproduct = {
name: { name: {
@ -245,8 +279,9 @@ const ViewProduct = () => {
console.log(removedVariant); console.log(removedVariant);
const filtered_removedVariant = filterUndefinedAndEmpty(removedVariant); const filtered_removedVariant = filterUndefinedAndEmpty(removedVariant);
console.log(filtered_removedVariant);
filtered_removedVariant?.map((item: any) => { removedVariant?.map((item: any) => {
return DeleteVariation({ id: item }) return DeleteVariation({ id: item })
}) })
} }
@ -254,23 +289,23 @@ const ViewProduct = () => {
useNavigateOnSuccess(isSuccess , '/products') useNavigateOnSuccess(isSuccess, '/products')
useEffect(() => { useEffect(() => {
// refetch() // refetch()
setObjectToEdit(data?.data); setObjectToEdit(data?.data);
setOldData(data?.data?.products) setOldData(data?.data?.products)
}, [data, data?.data, id, isRefetching]); }, [data, data?.data?.products, data?.data, id, isRefetching]);
const getValidationSchema = () => { const getValidationSchema = () => {
return null return null
}; };
if (isRefetching) { if (isRefetching || isLoading) {
return <Spin /> return <Spin />
} }
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit, IsloadingButton };
return ( return (
@ -289,7 +324,7 @@ const ViewProduct = () => {
<div className=" mt-4"><BasicInfo /></div> <div className=" mt-4"><BasicInfo /></div>
</TabBody> </TabBody>
<TabBody > <TabBody >
<div className=" mt-4"> {isLoading && objectToEdit ? <Spin /> : <TabsContainer />} </div> <div className=" mt-4"> {isLoading && objectToEdit && isRefetching ? <Spin /> : <TabsContainer />} </div>
</TabBody> </TabBody>
</Tabs> </Tabs>

View File

@ -20,7 +20,7 @@ const Attribute = ({ tabKey }: any) => {
const uniqueOptionsMap = new Map(); const uniqueOptionsMap = new Map();
item?.attribute_value.forEach((attr: any) => { item?.attribute_value.forEach((attr: any) => {
if (!uniqueOptionsMap.has(attr.value[language])) { if (!uniqueOptionsMap.has(attr.value[language])) {
uniqueOptionsMap.set(attr.value[language], { attribute_id: attr.attribute_id, id: attr.id }); uniqueOptionsMap.set(attr.value[language], { attribute_id: attr.id, id: attr.attribute_id });
} }
}); });
@ -30,6 +30,10 @@ const Attribute = ({ tabKey }: any) => {
id: value.id, // Include id in the option id: value.id, // Include id in the option
})); }));
if (options.length === 0) {
return <></>; // Don't render anything if options are empty
}
return ( return (
<div className='ValidationField'> <div className='ValidationField'>

View File

@ -8,20 +8,23 @@ import { useFormikContext } from 'formik';
import { ImageBaseURL } from '../../../../../api/config'; import { ImageBaseURL } from '../../../../../api/config';
const File = ({ tabKey}:any) => { const FileProduct = ({ tabKey}:any) => {
const { t } = useTranslation(); const { t } = useTranslation();
const formik = useFormikContext<any>(); const formik = useFormikContext<any>();
const name = `variable[${tabKey}].${"main_photo"}`; const name = `variable[${tabKey}].${"main_photo"}`;
let FormikName = formik.values?.variable[tabKey]?.main_photo; let FormikName = formik?.values?.variable[tabKey]?.main_photo as any;
const imageUrl = FormikName ? ImageBaseURL + FormikName : ''; const FormikimageUrl = FormikName ? ImageBaseURL + FormikName : '';
const imageUrl = typeof FormikName === "string" ? (FormikimageUrl)?.replace("public", "/storage") : (FormikName instanceof File) ? URL.createObjectURL(FormikName) : "";
const fileList: UploadFile[] = [ const fileList: UploadFile[] = [
{ {
uid: '-1', uid: '-1',
name: '', name: '',
status: 'done', status: 'done',
url: imageUrl?.replace("public", "/storage"), url: imageUrl,
thumbUrl: imageUrl?.replace("public", "/storage") thumbUrl: imageUrl
} }
]; ];
const FilehandleChange = (value:any) => { const FilehandleChange = (value:any) => {
@ -60,4 +63,4 @@ const File = ({ tabKey}:any) => {
) )
} }
export default File export default FileProduct

View File

@ -11,8 +11,11 @@ const MaltyFile = ({ tabKey }: any) => {
// Construct imageUrl and fileList for each file // Construct imageUrl and fileList for each file
const files = formik.values?.variable[tabKey]?.images || []; const files = formik.values?.variable[tabKey]?.images || [];
const fileItems = files.map((file: any, index: number) => { const fileItems = files.map((file: any, index: number) => {
const imageUrl = file ? ImageBaseURL + file : '';
const FormikimageUrl = file ? ImageBaseURL + file : '';
const imageUrl = typeof file === "string" ? (FormikimageUrl)?.replace("public", "/storage") : (file instanceof File) ? URL.createObjectURL(file) : "";
return { return {
uid: `-${index}`, uid: `-${index}`,
name: file?.name || '', name: file?.name || '',

View File

@ -34,7 +34,7 @@ const ObjectField = ({ tabKey }: any) => {
}; };
useEffect(() => { useEffect(() => {
console.log(initialValues); // console.log(initialValues);
}, [initialValues]) }, [initialValues])
return ( return (

View File

@ -3,7 +3,7 @@ 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 { 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 { useProductVarianState } from '../../../../lib/state mangment/Pages/Products'; import { useProductVarianState } from '../../../../lib/state mangment/Pages/Products';
import { VariableTabs } from './VariableTabs'; import { VariableTabs } from './VariableTabs';
@ -15,24 +15,24 @@ export const TabsContainer: React.FC = () => {
const [activeKey, setActiveKey] = useState('1'); const [activeKey, setActiveKey] = useState('1');
const [t] = useTranslation() const [t] = useTranslation()
const initialItemShape: any = { const initialItemShape: any = {
label: `${t(`variant`)} 1`, label: `${t(`variant`)} 1`,
key: '1', key: '1',
closable: true, closable: true,
}; };
const formikContext = useFormikContext<FormikValues>(); const formikContext = useFormikContext<FormikValues>();
const { setFieldValue } = useFormikContext(); const { setFieldValue } = useFormikContext();
const { values, handleChange } = formikContext; const { values, handleChange } = formikContext;
const varianCount = values?.variable?.slice(1)?.map((item:any,index:any)=>{ const varianCount = values?.variable?.slice(1)?.map((item: any, index: any) => {
return { return {
label: `${t(`variant`)}`+ `${index+1}`, label: `${t(`variant`)}` + `${index + 1}`,
key: index+1, key: index + 1,
closable: true, closable: true,
} }
})?? initialItemShape }) ?? initialItemShape
const [items, setItems] = useState(varianCount ?? [initialItemShape]); // Ensure items is always an array const [items, setItems] = useState(varianCount ?? [initialItemShape]); // Ensure items is always an array
const [width, setWidth] = useState(window.innerWidth); const [width, setWidth] = useState(window.innerWidth);
const findFirstMissingKey = (itemKeys:string[]) => { const findFirstMissingKey = (itemKeys: string[]) => {
const keysAsNumbers = itemKeys.map(Number); // Convert strings to numbers const keysAsNumbers = itemKeys.map(Number); // Convert strings to numbers
for (let i = 1; i <= keysAsNumbers.length + 1; i++) { for (let i = 1; i <= keysAsNumbers.length + 1; i++) {
if (!keysAsNumbers.includes(i)) { if (!keysAsNumbers.includes(i)) {
@ -62,7 +62,7 @@ const [width, setWidth] = useState(window.innerWidth);
}; };
const handleDuplicate = (targetKey: string) => { const handleDuplicate = (targetKey: string) => {
const targetItem = items.find((item:any) => item.key === targetKey); const targetItem = items.find((item: any) => item.key === targetKey);
if (targetItem) { if (targetItem) {
const newKey = `${nextKey}`; const newKey = `${nextKey}`;
const newItem = { ...targetItem, key: newKey, label: `${t(`variant`)} ${newKey}` }; const newItem = { ...targetItem, key: newKey, label: `${t(`variant`)} ${newKey}` };
@ -70,7 +70,14 @@ const [width, setWidth] = useState(window.innerWidth);
setActiveKey(newKey); setActiveKey(newKey);
const originalValues = values?.variable?.[targetKey]; const originalValues = values?.variable?.[targetKey];
setFieldValue(`variable.${newKey}`, {...originalValues,id:null}); if(originalValues.id === null){
setFieldValue(`variable.${newKey}`, { ...originalValues, id: 0 });
}else{
setFieldValue(`variable.${newKey}`, { ...originalValues, id: null });
}
const originalInfo = values?.info?.[targetKey]; const originalInfo = values?.info?.[targetKey];
@ -83,40 +90,40 @@ const [width, setWidth] = useState(window.innerWidth);
} }
}; };
const [removedVariant, setremovedVariant] = useState<string[]>([]); const [removedVariant, setremovedVariant] = useState<string[]>([]);
useEffect(() => { useEffect(() => {
setFieldValue(`removedVariant`, removedVariant); setFieldValue(`removedVariant`, removedVariant);
}, [removedVariant]); }, [removedVariant]);
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?.variable[targetKey] as any; const removedItem = values?.variable[targetKey] as any;
if (removedItem?.id) { if (removedItem?.id) {
setremovedVariant((prevRemovedvariable) => [...prevRemovedvariable, removedItem.id]); setremovedVariant((prevRemovedvariable) => [...prevRemovedvariable, removedItem.id]);
} }
const newActiveKey = newItems.length ? newItems[newItems.length - 1].key : '1'; const newActiveKey = newItems.length ? newItems[newItems.length - 1].key : '1';
setItems(newItems); setItems(newItems);
setActiveKey(newActiveKey); setActiveKey(newActiveKey);
setFieldValue(`variable.${targetKey}`, undefined); setFieldValue(`variable.${targetKey}`, undefined);
setFieldValue(`info.${targetKey}`, undefined); setFieldValue(`info.${targetKey}`, undefined);
}; };
useEffect(() => { useEffect(() => {
const handleResize = () => { const handleResize = () => {
setWidth(window.innerWidth); setWidth(window.innerWidth);
}; };
window.addEventListener('resize', handleResize); window.addEventListener('resize', handleResize);
return () => { return () => {
window.removeEventListener('resize', handleResize); window.removeEventListener('resize', handleResize);
}; };
}, []); }, []);
const tabPosition = width > 1000 ? 'left' : 'top'; const tabPosition = width > 1000 ? 'left' : 'top';
return ( return (
<> <>
<Tabs <Tabs
type="editable-card" type="editable-card"
@ -125,21 +132,21 @@ const tabPosition = width > 1000 ? 'left' : 'top';
onEdit={(targetKey: any, action) => (action === 'add' ? handleAdd() : handleRemove(targetKey))} onEdit={(targetKey: any, action) => (action === 'add' ? handleAdd() : handleRemove(targetKey))}
tabPosition={tabPosition} tabPosition={tabPosition}
items={ items={
items.map((item: any) => ({ items.map((item: any) => ({
label: <Space>{t(`${item.label}`)} <CopyOutlined onClick={() => handleDuplicate(item.key)} /></Space>, label: <Space>{t(`${item.label}`)} <CopyOutlined onClick={() => handleDuplicate(item.key)} /></Space>,
children: <VariableTabs tabKey={item.key} />, children: <VariableTabs tabKey={item.key} />,
key: item.key, key: item.key,
closable: item.closable, closable: item.closable,
})) }))
} }
> >
</Tabs> </Tabs>
{ items.length === 0 && ( {items.length === 0 && (
<h6 className='AddNewTabText'>{t("Add New Variant")}</h6> <h6 className='AddNewTabText'>{t("Add New Variant")}</h6>
)} )}
</> </>
); );
}; };

View File

@ -9,6 +9,7 @@ import ObjectField from './Field/Object';
import Atteibute from './Field/Atteibute'; import Atteibute from './Field/Atteibute';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
import { useParams } from 'react-router-dom';
interface VariableTabsProps { interface VariableTabsProps {
tabKey: string; tabKey: string;
@ -18,6 +19,7 @@ export const VariableTabs: React.FC<VariableTabsProps> = ({ tabKey }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const formikContext = useFormikContext<FormikValues>(); const formikContext = useFormikContext<FormikValues>();
const { values, handleChange } = formikContext; const { values, handleChange } = formikContext;
// const {id}= useParams()
const handleFieldChange = (fieldName: string) => ( const handleFieldChange = (fieldName: string) => (
e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> | any e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement> | any
@ -56,14 +58,8 @@ export const VariableTabs: React.FC<VariableTabsProps> = ({ tabKey }) => {
onChange={handleFieldChange('quantity')} onChange={handleFieldChange('quantity')}
type="number" type="number"
/> */} /> */}
<FormItem
label={t(`price`)}
value={FormikName("price")}
onChange={handleFieldChange('price')}
type="number"
/>
{values?.category_id && {(values?.category_id && (!values?.variable?.[tabKey]?.id || values?.variable?.[tabKey]?.id == null || values?.variable?.[tabKey]?.id == 0) ) &&
<Atteibute tabKey={tabKey} /> <Atteibute tabKey={tabKey} />
} }
@ -85,7 +81,12 @@ export const VariableTabs: React.FC<VariableTabsProps> = ({ tabKey }) => {
value={FormikName("description_de")} value={FormikName("description_de")}
onChange={handleFieldChange('description_de')} onChange={handleFieldChange('description_de')}
/> />
<FormItem
label={t(`price`)}
value={FormikName("price")}
onChange={handleFieldChange('price')}
type="number"
/>
<File tabKey={tabKey} /> <File tabKey={tabKey} />
<MaltyFile tabKey={tabKey} /> <MaltyFile tabKey={tabKey} />
</Col> </Col>

View File

@ -9,14 +9,20 @@ export const getInitialValues = (objectToEdit: any) => {
return {}; return {};
} }
const products = objectToEdit?.products?.map((item: any) => { const products = objectToEdit?.products?.map((item: any) => {
console.log(item,"item"); // console.log(item,"item");
const formattedData = item?.info ? Object.entries(item?.info).map(([key, value], index) => ({ const formattedData = item?.info ? Object.entries(item?.info).map(([key, value], index) => ({
[`${index}.Description`]: key, [`Description`]: key,
[`${index}.key`]: value, [`key`]: value,
})) : []; })) : [];
// console.log(formattedData,"formattedData");
const images_product = item?.images?.map((item:any)=>{
return item?.path
})
console.log(images_product,"images_product");
return ({ return ({
@ -26,11 +32,11 @@ export const getInitialValues = (objectToEdit: any) => {
description_ar: item?.description["ar"], description_ar: item?.description["ar"],
description_en: item?.description["en"], description_en: item?.description["en"],
description_de: item?.description["de"], description_de: item?.description["de"],
images: item?.images, 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,
products_attributes: item?.products_attributes, // products_attributes: item?.products_attributes,
id:item?.id, id:item?.id,
info:formattedData info:formattedData
@ -43,7 +49,6 @@ export const getInitialValues = (objectToEdit: any) => {
[`${index}.key`]: value, [`${index}.key`]: value,
})); }));
console.log(products,"products"); console.log(products,"products");
console.log(objectToEdit,"objectToEdit");
return { return {
@ -60,7 +65,7 @@ export const getInitialValues = (objectToEdit: any) => {
price: objectToEdit?.price ?? "", price: objectToEdit?.price ?? "",
variable: [{}, ...products], variable: [{}, ...products],
info: [undefined, ...formattedData] ?? [], // info: [undefined, ...formattedData] ?? [],
removedVariant:[], removedVariant:[],
} }
}; };

View File

@ -13,7 +13,7 @@ import Form from './AddForm';
const AddSliderPage = () => { const AddSliderPage = () => {
const {mutate , isLoading , isSuccess} = useAddSlider() const {mutate , isLoading:IsloadingButton , isSuccess} = useAddSlider()
const handleSubmit = (values:any)=>{ const handleSubmit = (values:any)=>{
mutate(values) mutate(values)
@ -26,7 +26,7 @@ const AddSliderPage = () => {
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
return ( return (

View File

@ -19,7 +19,7 @@ const EditPage = () => {
const { setObjectToEdit, objectToEdit } = usePageState() const { setObjectToEdit, objectToEdit } = usePageState()
const {t} = useTranslation(); const {t} = useTranslation();
const { data } = useGetOneSlider() const { data } = useGetOneSlider()
const {mutate ,isSuccess} = useUpdateSlider() const {mutate ,isSuccess,isLoading:IsloadingButton} = useUpdateSlider()
const FormatedData = data?.data ; const FormatedData = data?.data ;
const handleSubmit = (values:any)=>{ const handleSubmit = (values:any)=>{
@ -51,7 +51,7 @@ const EditPage = () => {
}; };
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
return ( return (

View File

@ -14,25 +14,25 @@ import { useAddNotification } from '../../../../api/notification';
const AddPage = () => { const AddPage = () => {
const { mutate, isLoading, isSuccess } = useAddNotification() const { mutate, isLoading:IsloadingButton, isSuccess } = useAddNotification()
const {id} = useParams() const {id} = useParams()
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
const body = { const body = {
en: values.body_en, en: values.body_en,
ar: values.body_ar, ar: values.body_ar,
du: values.body_de de: values.body_de
} }
const meta = {} const meta = {}
const title = { const title = {
en: values.title_en, en: values.title_en,
ar: values.title_ar, ar: values.title_ar,
du: values.title_de de: values.title_de
} }
const dataToSend = { const dataToSend = {
body: JSON.stringify(body), body: body,
meta: JSON.stringify(meta), meta: meta,
title:JSON.stringify(title), title:title,
user_ids: [id], user_ids: [id],
type: "other", type: "other",
@ -48,7 +48,7 @@ const AddPage = () => {
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
return ( return (

View File

@ -12,7 +12,7 @@ import Form from './AddForm';
const AddPage = () => { const AddPage = () => {
const { mutate, isLoading, isSuccess } = useAddUsers() const { mutate, isLoading:IsloadingButton, isSuccess } = useAddUsers()
const handleSubmit = (values: any) => { const handleSubmit = (values: any) => {
@ -26,7 +26,7 @@ mutate(values)
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
return ( return (

View File

@ -21,7 +21,7 @@ import { useGetOneOrder, useUpdateOrder } from '../../../api/order';
const EditPage = () => { const EditPage = () => {
const { setObjectToEdit, objectToEdit } = usePageState() const { setObjectToEdit, objectToEdit } = usePageState()
const {t} = useTranslation(); const {t} = useTranslation();
const {mutate ,isSuccess} = useUpdateOrder("put") const {mutate ,isSuccess,isLoading:IsloadingButton} = useUpdateOrder("put")
const { id } = useParams(); const { id } = useParams();
const { data, isLoading } = useGetOneOrder({id: id }) const { data, isLoading } = useGetOneOrder({id: id })
const handleSubmit = (values:any)=>{ const handleSubmit = (values:any)=>{
@ -48,7 +48,7 @@ const EditPage = () => {
}; };
const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit }; const ViewProps = { getInitialValues, getValidationSchema, getDataToSend, handleSubmit,IsloadingButton };
if ( isLoading || !objectToEdit) { if ( isLoading || !objectToEdit) {
return <Spin /> return <Spin />
} }

View File

@ -1,6 +1,7 @@
import * as Yup from "yup"; import * as Yup from "yup";
import { buildFormData } from "../../../api/helper/buildFormData"; import { buildFormData } from "../../../api/helper/buildFormData";
import * as dayjs from 'dayjs'
interface formUtilCommon { interface formUtilCommon {
number:number, number:number,
@ -25,7 +26,8 @@ export const getInitialValues = (objectToEdit: any | null = null): any => {
id: objectToEdit?.id ?? 0, id: objectToEdit?.id ?? 0,
state:objectToEdit?.state ?? "", state:objectToEdit?.state ?? "",
admin_note: objectToEdit?.admin_note ?? '', admin_note: objectToEdit?.admin_note ?? '',
deliviration_estimated_time:objectToEdit?.deliviration_estimated_time ??"", //@ts-ignore
deliviration_estimated_time: dayjs(objectToEdit?.deliviration_estimated_time,"YYYY-MM-DD") ??"",
delivery_link:objectToEdit?.delivery_link ??"", delivery_link:objectToEdit?.delivery_link ??"",
}; };

View File

@ -21,7 +21,7 @@ const useTableColumns = () => {
name: t("name"), name: t("name"),
sortable: false, sortable: false,
center:true, center:true,
selector:(row:any) => row?.user?.name[language], selector:(row:any) => row?.user?.name,
}, },
{ {

View File

@ -19,7 +19,7 @@ const navigate = useNavigate()
}, },
{ {
onError: (error:any) => { onError: (error:any) => {
if(error.response.status == 401 || error.response.status == 403){ if(error?.response?.status == 401 || error?.response?.status == 403){
logout() logout()
navigate("/auth") navigate("/auth")

View File

@ -26,7 +26,7 @@ function useAddMutation(key: string, url: string): UseMutationResult<AxiosRespo
{ {
onSuccess: (data) => { onSuccess: (data) => {
queryClient.invalidateQueries([key]); queryClient.invalidateQueries([key]);
toast.success(data.message || t("added_uccessful")); toast.success(data.message || t("added_successful"));
}, },
onError: (error:any) => { onError: (error:any) => {
const message = error?.response?.data?.message || t("failed_to_add_data"); const message = error?.response?.data?.message || t("failed_to_add_data");

View File

@ -0,0 +1,35 @@
import { useMutation, useQueryClient, UseMutationResult } from 'react-query';
import { toast } from 'react-toastify';
import useAxios from './useAxios';
import { useTranslation } from 'react-i18next';
type AxiosResponse = {
message: string;
data:any ,
success:true
};
function useAddMutationJson(key: string, url: string): UseMutationResult<AxiosResponse, unknown, any, unknown> {
const axios = useAxios();
const [t] = useTranslation();
const queryClient = useQueryClient();
return useMutation<AxiosResponse, unknown, any, unknown>(
async (dataToSend) => {
const { data } = await axios.post(url, dataToSend);
return data;
},
{
onSuccess: (data) => {
queryClient.invalidateQueries([key]);
toast.success(data.message || t("added_successful"));
},
onError: (error:any) => {
const message = error?.response?.data?.message || t("failed_to_add_data");
toast.error(message);
}
}
);
}
export default useAddMutationJson;

View File

@ -27,6 +27,7 @@ function useGetOneQuery(key: string, url: string , params:any={},options:any={})
} }
}, },
cacheTime: 0, // Set cacheTime to 0 to disable caching
refetchOnWindowFocus: false, refetchOnWindowFocus: false,
...options ...options

View File

@ -19,11 +19,11 @@ const API = {
}; };
const KEY = "Product" const KEY = "Product"
const ONEKEY = "OneProduct" // const ONEKEY = "Product"
export const useGetProduct = (params?:any) => useGetQueryPagination(KEY, API.GET_ALL,params); export const useGetProduct = (params?:any) => useGetQueryPagination(KEY, API.GET_ALL,params);
export const useGetOneProduct = (params?:any) => useGetOneQuery(ONEKEY, API.GET_ALL,params); export const useGetOneProduct = (params?:any) => useGetOneQuery(KEY, API.GET_ALL,params);
export const useAddProduct = () => useAddMutation(KEY, API.ADD); export const useAddProduct = () => useAddMutation(KEY, API.ADD);
export const useAddProductVariation = () => useAddMutation(KEY, API.ADD_VAR); export const useAddProductVariation = () => useAddMutation(KEY, API.ADD_VAR);

View File

@ -1,5 +1,5 @@
const filterUndefinedAndEmpty = (array:any) => { const filterUndefinedAndEmpty = (array:any) => {
return array.filter((data:any) => data !== undefined && Object.keys(data).length !== 0); return array?.filter((data:any) => data !== undefined && Object.keys(data).length !== 0);
}; };
export default filterUndefinedAndEmpty; export default filterUndefinedAndEmpty;