import React, { useState, useEffect, useCallback } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { Form, Space } from 'antd';
import {
EditFilled,
DeleteFilled,
PlusOutlined,
ReloadOutlined,
} from '@ant-design/icons';
import { InputField } from '../../Components/Forms/InputField';
import { DropDowns } from '../../Components/Forms/DropDown';
import { DefaultModal } from '../../Components/Modal/DefaultModal';
import Buttons from '../../Components/Forms/Buttons';
import { Tables } from '../../Components/Tables/Table';
import { Messages } from '../../Components/Notifications/Messages';
import {
changeBreadCrumb,
getEmpAccess,
} from '../../Features/AppPage/CenterPage.js';
import Imageupload from '../../Components/Forms/Upload.jsx';
import { Search } from '../../Components/Forms/Search';
import FormHeader from '../PageComponents/FormHeader.jsx';
import ConfigExcel from './ConfigExcelUpload.jsx';
import {
configDataSelector,
getConfiguration,
getConfigTypeData,
deleteConfiguration,
postConfiguration,
putConfiguration,
postBulkConfiguration,
postbulkconfigdata,
} from '../../Features/ConfigMasterPage/ConfigMasterPage.js';
import {
configTypeActiveDataSelector,
getActiveConfigTypeNames,
} from '../../Features/ConfigTypePage/ConfigTypePage.js';
import { emptyExcelData } from '../../Features/ExcelUploadPage/ExcelUploadPage.js';
import { getSession, validateSafeInput } from '../../Services/Others';
import TertiaryButton from '../../Components/Forms/tertiaryButton.jsx';
import '../../Components/Forms/main.scss';
import '../../Styles/OverAllStyle/OverAllStyle.scss';
import {
getAllsubcatdata,
getProdCatData,
} from '../../Features/ProductPage/ProductPage.js';
import { useAuth } from '../../AuthContext.jsx';
const subDirectory = import.meta.env.BASE_URL;
const items = [
{
name: 'Home',
link: `${subDirectory}app-page/home`,
},
];
const CommonMaster = () => {
const { SadminuserAccess } = useAuth();
let SAAccessCommonMaster = SadminuserAccess?.find(
(e) => e?.MenuName === 'Common Master'
);
const dispatch = useDispatch();
const [form] = Form.useForm();
const CompId = getSession('CompId');
const BranchId = getSession('BranchId');
const AppId = getSession('AppId');
const UserId = getSession('UserId');
const UserType = getSession('UserType');
const AppType = getSession('AppType');
const CommonData = useSelector(configDataSelector);
const ConfigTypeNames = useSelector(configTypeActiveDataSelector);
const baseConfigTypeOptions = [
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
'Wholesale Designation',
];
const configTypeOptions =
UserType === 'Super Admin' || UserType === 'Super Admin User'
? [...baseConfigTypeOptions, 'Master Access']
: baseConfigTypeOptions;
const TypeNames =
AppType === 'Wholesale'
? ConfigTypeNames.filter((item) =>
baseConfigTypeOptions.includes(item.TypeName)
) // include only these for Wholesale
: ConfigTypeNames.filter(
(item) => !baseConfigTypeOptions.includes(item.TypeName)
);
const [open, setOpen] = useState(false);
const [EditState, setEditState] = useState(false);
const [filteredInfo, setFilteredInfo] = useState({});
const [sortedInfo, setSortedInfo] = useState({});
const [searchedText, setSearchedText] = useState('');
const [selectedRow, setSelectedRow] = useState(null);
const [messageType, setMessageType] = useState(null);
const [messageData, setMessageData] = useState(null);
const [CommonDataFilter, setCommonDataFilter] = useState([]);
const [showHomeComponent, setShowHomeComponent] = useState(false);
const [imageUrl, setImageUrl] = useState('');
const [radioValue, setRadioValue] = useState('single');
const [categoryOpen, setCategoryOpen] = useState(false);
const [categoryData, setCategoryData] = useState([]);
const [selectedCategory, setSelectedCategory] = useState();
const [selectedSubCategory, setSelectedSubCategory] = useState();
const [subCategoryOpen, setSubCategoryOpen] = useState(false);
const [subCategoryData, setSubCategoryData] = useState([]);
const [selectedNumericId, setselectedNumericId] = useState(null);
const [page, setpage] = useState(1);
const [Exceldatasubmit, setExceldatasubmit] = useState(null);
const [openS, setOpenS] = useState(false);
const [ProductCatdata, setProductCatdata] = useState();
const [subCatData, setSubCatData] = useState();
const [empData, setEmpData] = useState();
const [addnewAccess, setaddnewAccess] = useState(true);
const excludeTypeNames = [
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
'Wholesale Designation',
];
const systemTypes = [
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
'PackingType',
];
useEffect(() => {
try {
dispatch(changeBreadCrumb({ items: items }));
if (UserType === 'Super Admin' || UserType === 'Super Admin User') {
dispatch(getConfiguration({ Type: 'SA' })).unwrap();
dispatch(getActiveConfigTypeNames({ Type: 'SA' })).unwrap();
} else if (UserType === 'Admin' || UserType === 'Employee') {
let TypeName = AppType === 'Wholesale' ? 'AW' : 'A';
dispatch(getActiveConfigTypeNames({ Type: TypeName })).unwrap();
dispatch(getConfiguration({ Type: TypeName })).unwrap();
}
} catch (err) {
console.log(err, 'err');
}
// if (UserType === "Employee") {
// fetchApi()
// }
}, []);
useEffect(() => {
if (UserType === 'Employee') {
fetchApi();
}
}, [UserType]);
useEffect(() => {
let hasAccess = false;
if (UserType === 'Admin' || UserType === 'Super Admin') {
hasAccess = true;
} else if (UserType === 'Employee') {
hasAccess = empData?.AddAccess === 'Y';
} else if (UserType === 'Super Admin User') {
hasAccess = SAAccessCommonMaster?.AddAccess === 'Y';
}
setaddnewAccess(!hasAccess);
}, [empData, SAAccessCommonMaster, UserType]);
const fetchApi = async () => {
let data = {
CompId: CompId,
BranchId: BranchId,
AppId: AppId,
EmpId: UserId,
};
let response = await dispatch(getEmpAccess(data)).unwrap();
let datas = response?.data?.data?.[0]?.EmpAccessDetails?.filter(
(item) => item.ConfigName === 'Common Master'
);
setEmpData(datas?.[0]);
};
useEffect(() => {
if (AppType === 'Wholesale') {
updateCommonDataFilter();
} else {
setCommonDataFilter([
...(Array.isArray(CommonData)
? CommonData.filter(
(data) =>
![
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
'Wholesale Designation',
].includes(data?.TypeName)
)
: []),
...(Array.isArray(CommonData)
? CommonData.filter((data) =>
[
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
'PackingType',
].includes(data?.TypeName)
).filter((item) => item.AlphaNumFId == AppId)
: []),
]);
}
}, [CommonData]);
const updateCommonDataFilter = () => {
if (UserType === 'Super Admin' || UserType === 'Super Admin User') {
setCommonDataFilter(
CommonData?.filter(
(data) =>
data?.TypeName === 'Master Access' ||
([
'Designation',
'Product Quality',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
'Wholesale Designation',
].includes(data?.TypeName) &&
data?.AlphaNumFId == AppId)
)
);
} else {
setCommonDataFilter(
CommonData?.filter(
(data) =>
[
'Designation',
'Product Quality',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
'Wholesale Designation',
].includes(data?.TypeName) && data?.AlphaNumFId == AppId
)
);
}
};
const handleChange = (pagination, filters, sorter) => {
setFilteredInfo(filters);
setSortedInfo(sorter);
};
const handlePageChange = (current) => {
setpage(current);
};
const onComplete = useCallback(() => {
setMessageData(null);
setMessageType(null);
}, []);
const updateImageUrl = (url) => {
setImageUrl(url);
};
//edit
const actionsFormatter = async (row) => {
if (row.ActiveStatus !== 'D') {
await setOpen(true);
await setEditState(true);
setImageUrl(row.SmallIcon);
form.setFieldsValue(row);
setSelectedRow(row);
}
};
const statusFormatter = async (row) => {
let deleteData = {
ConfigId: row.ConfigId,
ActiveStatus: row.ActiveStatus == 'A' ? 'D' : 'A',
UpdatedBy: getSession('UserId'),
};
let response = await dispatch(deleteConfiguration(deleteData)).unwrap();
if (response?.data?.statusCode == 1) {
if (UserType === 'Super Admin' || UserType === 'Super Admin User') {
dispatch(getConfiguration({ Type: 'SA' })).unwrap();
} else if (UserType === 'Admin' || UserType === 'Employee') {
let TypeName = AppType === 'Wholesale' ? 'AW' : 'A';
dispatch(getConfiguration({ Type: TypeName })).unwrap();
}
setMessageType('success');
setMessageData(
row.ActiveStatus == 'A'
? 'In-Activated Successfully'
: 'Activated Successfully'
);
}
};
const openModal = () => {
setOpen(true);
setSelectedSubCategory(null);
form.resetFields();
// Reset the editState to false
setEditState(false);
};
const handleDropDownChange = async (value) => {
form.setFieldsValue({ TypeId: value });
let SubCategoryData = TypeNames?.filter(
(item) => item.TypeId == value && item.TypeName == 'Product Sub-Category'
);
if (SubCategoryData?.length > 0) {
setCategoryOpen(true);
setSubCategoryOpen(false);
let CategoryData = await dispatch(
getConfigTypeData({ TypeName: 'Product Category', AppId: AppId })
).unwrap();
if (CategoryData?.data?.statusCode == 1) {
setCategoryData(CategoryData?.data?.data);
setSubCategoryData([]);
}
} else {
setCategoryOpen(false);
form.resetFields(['CategoryId']);
setSelectedCategory();
}
let BrandData = TypeNames?.filter(
(item) => item.TypeId == value && item.TypeName == 'Product Brand'
);
if (BrandData?.length > 0) {
setSubCategoryOpen(true);
setCategoryOpen(false);
let SubCategoryData = await dispatch(
getConfigTypeData({ TypeName: 'Product Sub-Category', AppId: AppId })
).unwrap();
if (SubCategoryData?.data?.statusCode == 1) {
setSubCategoryData(SubCategoryData?.data?.data);
setCategoryData([]);
}
}
if (SubCategoryData?.data?.data?.length == 0 && BrandData?.length == 0) {
setCategoryOpen(false);
setSubCategoryOpen(false);
setSubCategoryData([]);
setCategoryData([]);
form.setFieldsValue({ NumFId: null });
}
};
const handleCategoryDropDownChange = async (value) => {
setSelectedCategory(value);
form.setFieldsValue({ NumFId: value, CategoryId: value });
setselectedNumericId(value);
};
const handleSubCategoryDropDownChange = async (value) => {
setSelectedSubCategory(value);
form.setFieldsValue({ NumFId: value, SubCategoryId: value });
setselectedNumericId(value);
};
const ConfigSelect = async (e) => {
e !== 'Select' && setpage(1);
if (e === 'Select' && AppType != 'Wholesale') {
setCommonDataFilter([
...CommonData?.filter(
(data) =>
![
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
'Wholesale Designation',
].includes(data?.TypeName)
),
...CommonData?.filter((data) =>
[
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
].includes(data?.TypeName)
)?.filter((item) => item.AlphaNumFId == AppId),
]);
} else if (AppType === 'Wholesale' && e === 'Select') {
updateCommonDataFilter();
} else if (AppType === 'Wholesale') {
if (UserType === 'Super Admin' || UserType === 'Super Admin User') {
setCommonDataFilter(
CommonData?.filter(
(data) =>
(data?.TypeName === 'Master Access' ||
([
'Designation',
'Product Quality',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
'Wholesale Designation',
].includes(data?.TypeName) &&
data?.AlphaNumFId == AppId)) &&
data?.TypeId === parseInt(e)
)
);
} else {
setCommonDataFilter(
CommonData?.filter(
(data) =>
[
'Designation',
'Product Quality',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
'Wholesale Designation',
].includes(data?.TypeName) &&
data?.AlphaNumFId == AppId &&
data?.TypeId === parseInt(e)
)
);
}
} else {
const filteredItems = [
...CommonData?.filter(
(data) =>
![
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
'Wholesale Designation',
].includes(data?.TypeName)
),
...CommonData?.filter((data) =>
[
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
'PackingType',
].includes(data?.TypeName)
)?.filter((item) => item.AlphaNumFId == AppId),
]?.filter((item) => item?.TypeId === parseInt(e));
setCommonDataFilter(filteredItems);
}
};
const SearchFilterFun = async (value) => {
const searchValue = value?.toLowerCase();
if (AppType != 'Wholesale') {
const relevantItems =
CommonData?.filter((item) => {
// ❌ Exclude unwanted types first
if (excludeTypeNames.includes(item.TypeName)) return false;
// ✅ For systemTypes, only include if AppId matches
if (systemTypes.includes(item.TypeName)) {
return item.AlphaNumFId == AppId;
}
// ✅ For all other types, include them
return true;
}) || [];
// Optional: for reference, not used directly here
// alert("jhi")
const filteredItems = relevantItems.filter((item) => {
const typeMatch = item?.TypeName?.toLowerCase().includes(searchValue);
const configMatch =
item?.ConfigName?.toLowerCase().includes(searchValue);
return typeMatch || configMatch;
});
// console.log(relevantItems, "filteredItems");
setCommonDataFilter(filteredItems);
}
// Filter by AppId first
else if (AppType === 'Wholesale') {
if (UserType === 'Super Admin' || UserType === 'Super Admin User') {
setCommonDataFilter(
CommonData?.filter(
(data) =>
(data?.TypeName === 'Master Access' ||
([
'Designation',
'Product Quality',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
].includes(data?.TypeName) &&
data?.AlphaNumFId == AppId)) &&
data?.TypeId === parseInt(e)
)
);
} else {
setCommonDataFilter(
CommonData?.filter(
(data) =>
[
'Payment Mode',
'Designation',
'Product Quality',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
].includes(data?.TypeName) &&
data?.AlphaNumFId == AppId &&
data?.TypeId === parseInt(e)
)
);
}
}
};
const handleRadioChange = (value) => {
setRadioValue(value);
// Reset the form values
form.resetFields();
};
const onSearch = (value) => {
setSearchedText(value);
SearchFilterFun(value);
};
const onSearchChange = (e) => {
setSearchedText(e?.target?.value);
SearchFilterFun(e?.target?.value);
};
const columns = [
{
title: 'Sl.No',
key: 'sno',
align: 'center',
width: '100px',
render: (text, object, index) => (
{(page - 1) * 10 + index + 1}
),
},
{
title: 'Type Name',
dataIndex: 'TypeName',
key: 'TypeName',
width: '100px',
render: (text) => (
{text}
),
filteredValue: [searchedText],
onFilter: (value, record) => {
return (
String(record.TypeName)
?.toLowerCase()
.includes(value?.toLowerCase()) ||
String(record.ConfigName)
?.toLowerCase()
.includes(value?.toLowerCase())
);
},
sorter: (a, b) => a?.TypeName?.localeCompare(b.TypeName),
sortOrder: sortedInfo.columnKey === 'TypeName' ? sortedInfo.order : null,
ellipsis: true,
},
{
title: 'Config Name',
dataIndex: 'ConfigName',
key: 'ConfigName',
width: '100px',
render: (text) => {text},
sorter: (a, b) => a?.ConfigName?.localeCompare(b.ConfigName),
sortOrder:
sortedInfo.columnKey === 'ConfigName' ? sortedInfo.order : null,
ellipsis: true,
},
{
title: 'Action',
key: 'Action',
dataIndex: 'Action',
width: '100px',
align: 'center',
render: (_, record, index) =>
[
...CommonData?.filter(
(data) =>
![
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
'Product Quality',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
].includes(data?.TypeName)
),
...CommonData?.filter((data) =>
[
'Product Category',
'Product Sub-Category',
'Product Brand',
'Product Tax',
'Designation',
'Product Quality',
'Wholesale Extra Charges',
'Wholesale Unit Of Measure',
'Wholesale Quantity',
'Wholesale Screen Name',
'Wholesale Payment Mode',
].includes(data?.TypeName)
)?.filter((item) => item.AlphaNumFId == AppId),
]?.length >= 1 ? (