diff --git a/.env b/.env deleted file mode 100644 index 04d3402..0000000 --- a/.env +++ /dev/null @@ -1,7 +0,0 @@ -VITE_APP_NAME=tpay-dashboard-tl -VITE_APP_VERSION=1=9.1.1 -GENERATE_SOURCEMAP=false - -VITE_APP_API_URL=https://tpay.shiblysolution.id/api -# VITE_APP_API_URL=http://0.0.0.0:4001/api -VITE_ENV=default \ No newline at end of file diff --git a/.gitignore b/.gitignore index baee0cd..d2a16d3 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ yarn-error.log* pnpm-debug.log* lerna-debug.log* +.env node_modules dist dist-ssr diff --git a/src/auth/pages/jwt/Login.tsx b/src/auth/pages/jwt/Login.tsx index a7824cc..bea522e 100644 --- a/src/auth/pages/jwt/Login.tsx +++ b/src/auth/pages/jwt/Login.tsx @@ -69,6 +69,12 @@ const Login = () => { setShowPassword(!showPassword); }; + const handleKeyPress = (e: { key: string }) => { + if (e.key === 'Enter') { + formik.handleSubmit(); + } + }; + return (
{ className={clsx('form-control', { 'is-invalid': formik.touched.username && formik.errors.username })} + onKeyPress={handleKeyPress} /> {formik.touched.username && formik.errors.username && ( @@ -112,6 +119,7 @@ const Login = () => { className={clsx('form-control', { 'is-invalid': formik.touched.password && formik.errors.password })} + onKeyPress={handleKeyPress} /> +
- +
@@ -174,9 +215,19 @@ const ManageGroups = () => { *Active Status: - - } label="Yes" /> - } label="No" /> + + } + label="Yes" + /> + } + label="No" + />
diff --git a/src/pages/master/aldeias/AldeiasMaster.tsx b/src/pages/master/aldeias/AldeiasMaster.tsx index 7ec7c77..a3d0ad7 100644 --- a/src/pages/master/aldeias/AldeiasMaster.tsx +++ b/src/pages/master/aldeias/AldeiasMaster.tsx @@ -3,12 +3,27 @@ import { ManageAldeiasContextProvider } from './hooks/ManageAldeiasContext'; import AddDialog from './blocks/AddDialog'; import EditDialog from './blocks/EditDialog'; import DeleteDialog from './blocks/DeleteDialog'; +import { Breadcrumbs, Link } from '@mui/material'; const AldeiasMaster = () => { return (

Aldeias

+ + + Dashboard + + + + Master Data + + + + Manage Aldeias + + +
diff --git a/src/pages/master/aldeias/blocks/AddDialog.tsx b/src/pages/master/aldeias/blocks/AddDialog.tsx index 26c53f3..af089ef 100644 --- a/src/pages/master/aldeias/blocks/AddDialog.tsx +++ b/src/pages/master/aldeias/blocks/AddDialog.tsx @@ -78,6 +78,24 @@ const AddDialog = () => { [formField] ); + const doFetchSucos = async (sorting: any) => { + try { + sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; + const response = await GetData(`${API_URL}/sucos/list`, { + limit: 1000, + page: 1, + with_deleted: false, + order_field: sorting[0].id, + order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' + }); + + // console.log('SUCOS', response?.data); + setSucos(response?.data.list); + } catch (error) { + console.error('Error fetching municipios', error); + } + }; + const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); @@ -102,25 +120,7 @@ const AddDialog = () => { }, [formattedTime]); useEffect(() => { - const fetchSucos = async (sorting: any) => { - try { - sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; - const response = await GetData(`${API_URL}/sucos/list`, { - limit: 100, - page: 1, - with_deleted: false, - order_field: sorting[0].id, - order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' - }); - - // console.log('SUCOS', response?.data); - setSucos(response?.data.list); - } catch (error) { - console.error('Error fetching municipios', error); - } - }; - - fetchSucos([{ id: 'name', desc: false }]); + doFetchSucos([{ id: 'name', desc: false }]); }, []); useEffect(() => { diff --git a/src/pages/master/aldeias/blocks/EditDialog.tsx b/src/pages/master/aldeias/blocks/EditDialog.tsx index 179208c..d69981e 100644 --- a/src/pages/master/aldeias/blocks/EditDialog.tsx +++ b/src/pages/master/aldeias/blocks/EditDialog.tsx @@ -77,6 +77,42 @@ const EditDialog = () => { [selectedAldeias, formField] ); + const doFetchSucos = async (sorting: any) => { + try { + sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; + const response = await GetData(`${API_URL}/sucos/list`, { + limit: 1000, + page: 1, + with_deleted: false, + order_field: sorting[0].id, + order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' + }); + + // console.log('SUCOS', response?.data); + setSucos(response?.data.list); + } catch (error) { + console.error('Error fetching municipios', error); + } + }; + + const doFetchData = useCallback(async (id: string) => { + const response = await GetData(`${API_URL}/aldeias/getdata/${id}`, { id }); + + if (response?.status) { + setFormField((prev) => ({ + ...prev, + name: response.data.name, + sucos_id: response.data.sucos.id + })); + } else { + setFormField((prev) => ({ + ...prev, + name: '', + sucos_id: 0 + })); + } + }, []); + const handleUpdate = (e: React.FormEvent) => { e.preventDefault(); @@ -90,6 +126,18 @@ const EditDialog = () => { setAlert({ show: false, message: '' }); }; + useEffect(() => { + if (selectedAldeias) { + doFetchData(selectedAldeias); + } + }, [selectedAldeias]); + + useEffect(() => { + if (showEditDialog === false) { + resetForm(); + } + }, [showEditDialog]); + useEffect(() => { if (showEditDialog) { setFormField({ @@ -101,25 +149,7 @@ const EditDialog = () => { }, [formattedTime]); useEffect(() => { - const fetchSucos = async (sorting: any) => { - try { - sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; - const response = await GetData(`${API_URL}/sucos/list`, { - limit: 100, - page: 1, - with_deleted: false, - order_field: sorting[0].id, - order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' - }); - - // console.log('SUCOS', response?.data); - setSucos(response?.data.list); - } catch (error) { - console.error('Error fetching municipios', error); - } - }; - - fetchSucos([{ id: 'name', desc: false }]); + doFetchSucos([{ id: 'name', desc: false }]); }, []); return ( diff --git a/src/pages/master/aldeias/hooks/ManageAldeiasContext.tsx b/src/pages/master/aldeias/hooks/ManageAldeiasContext.tsx index a4cf161..f0b9aff 100644 --- a/src/pages/master/aldeias/hooks/ManageAldeiasContext.tsx +++ b/src/pages/master/aldeias/hooks/ManageAldeiasContext.tsx @@ -152,7 +152,7 @@ const ManageAldeiasContextProvider = ({ children }: { children: React.ReactNode order_direction: sorting[0].desc == false ? 'ASC' : 'DESC', filter: JSON.stringify(filter) }); - console.log(response?.data); + // console.log(response?.data); setAldeias(response?.data.list); return { data: response?.data.list, totalCount: response?.data.total_count }; } catch (error) { @@ -179,7 +179,7 @@ const ManageAldeiasContextProvider = ({ children }: { children: React.ReactNode } layout={{ card: true }} sorting={[{ id: 'id', desc: false }]} diff --git a/src/pages/master/municipios/Municipios.tsx b/src/pages/master/municipios/Municipios.tsx index 820900c..388b269 100644 --- a/src/pages/master/municipios/Municipios.tsx +++ b/src/pages/master/municipios/Municipios.tsx @@ -4,12 +4,26 @@ import AddDialog from './blocks/AddDialog'; import SearchDialog from './blocks/SearchDialog'; import EditDialog from './blocks/EditDialog'; import DeleteDialog from './blocks/DeleteDialog'; +import { Breadcrumbs, Link } from '@mui/material'; const Municipios = () => { return ( -

MUNICIPIOS

+

MUNICIPIOS

+ + + Dashboard + + + + Master Data + + + + Manage Municipios + +
diff --git a/src/pages/master/municipios/blocks/EditDialog.tsx b/src/pages/master/municipios/blocks/EditDialog.tsx index 8cf5d5f..50406bc 100644 --- a/src/pages/master/municipios/blocks/EditDialog.tsx +++ b/src/pages/master/municipios/blocks/EditDialog.tsx @@ -25,7 +25,7 @@ const EditDialog = () => { const { showEditDialog, handleEditDialog, selectedMunicipios, municipios } = useManageMunicipiosContext(); const { reload } = useDataGrid(); - const { PutData } = useCallApi(); + const { PutData, GetData } = useCallApi(); const parsedUser = getAuth()?.user; const [alert, setAlert] = useState({ show: false, @@ -44,6 +44,7 @@ const EditDialog = () => { const resetForm = () => { setFormField(initialState); + setAlert({ show: false, message: '' }); }; const doUpdateMunicipios = useCallback( @@ -74,6 +75,22 @@ const EditDialog = () => { [selectedMunicipios, formField] ); + const doFetchData = useCallback(async (id: string) => { + const response = await GetData(`${API_URL}/municipios/getdata/${id}`, { id }); + + if (response?.status) { + setFormField((prev) => ({ + ...prev, + name: response.data.name + })); + } else { + setFormField((prev) => ({ + ...prev, + name: '' + })); + } + }, []); + const handleUpdate = (e: React.FormEvent) => { e.preventDefault(); @@ -82,20 +99,22 @@ const EditDialog = () => { return; } - // setFormField({ - // name: formField.name, - // created_by: parsedUser.email, - // created_at: formattedTime - // }); - doUpdateMunicipios(e); console.log(formField); setAlert({ show: false, message: '' }); }; - // const doFetchMunicipios = useCallback(async (id: string) => { - // const response = await axios.get(`${API_URL}/municipios/${id}`); - // }, []); + useEffect(() => { + if (selectedMunicipios) { + doFetchData(selectedMunicipios); + } + }, [selectedMunicipios]); + + useEffect(() => { + if (showEditDialog === false) { + resetForm(); + } + }, [showEditDialog]); useEffect(() => { if (selectedMunicipios) { @@ -127,7 +146,9 @@ const EditDialog = () => {
- + } layout={{ card: true }} sorting={[{ id: 'id', desc: false }]} diff --git a/src/pages/master/postoadms/PostoAdmsMaster.tsx b/src/pages/master/postoadms/PostoAdmsMaster.tsx index 3ff1138..163b97f 100644 --- a/src/pages/master/postoadms/PostoAdmsMaster.tsx +++ b/src/pages/master/postoadms/PostoAdmsMaster.tsx @@ -4,14 +4,28 @@ import EditDialog from './blocks/EditDialog'; import SearchDialog from './blocks/SearchDialog'; import { ManagePostoAdmsContextProvider } from './hooks/ManagePostoAdmsContext'; import { Container, DataGridInner } from '@/components'; +import { Breadcrumbs, Link } from '@mui/material'; const PostoAdmsMaster = () => { return ( -

+

Postu Administrativo

+ + + Dashboard + + + + Master Data + + + + Manage Postu Administrativo + +
diff --git a/src/pages/master/postoadms/blocks/AddDialog.tsx b/src/pages/master/postoadms/blocks/AddDialog.tsx index 64590bf..fa7c7dd 100644 --- a/src/pages/master/postoadms/blocks/AddDialog.tsx +++ b/src/pages/master/postoadms/blocks/AddDialog.tsx @@ -80,6 +80,24 @@ const AddDialog = () => { [formField] ); + const doFetchMunicipios = async (sorting: any) => { + try { + sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; + const response = await GetData(`${API_URL}/municipios/list`, { + limit: 100, + page: 1, + with_deleted: false, + order_field: sorting[0].id, + order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' + }); + + // console.log(response?.data); + setMunicipios(response?.data.list); + } catch (error) { + console.error('Error fetching municipios', error); + } + }; + const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); @@ -110,25 +128,7 @@ const AddDialog = () => { }, [showAddDialog]); useEffect(() => { - const fetchMunicipios = async (sorting: any) => { - try { - sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; - const response = await GetData(`${API_URL}/municipios/list`, { - limit: 100, - page: 1, - with_deleted: false, - order_field: sorting[0].id, - order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' - }); - - // console.log(response?.data); - setMunicipios(response?.data.list); - } catch (error) { - console.error('Error fetching municipios', error); - } - }; - - fetchMunicipios([{ id: 'name', desc: false }]); + doFetchMunicipios([{ id: 'name', desc: false }]); }, []); return ( diff --git a/src/pages/master/postoadms/blocks/EditDialog.tsx b/src/pages/master/postoadms/blocks/EditDialog.tsx index abb8f0d..d170d1a 100644 --- a/src/pages/master/postoadms/blocks/EditDialog.tsx +++ b/src/pages/master/postoadms/blocks/EditDialog.tsx @@ -80,6 +80,41 @@ const EditDialog = () => { [selectedPostoAdms, formField] ); + const doFetchMunicipios = useCallback(async (sorting: any) => { + try { + sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; + const response = await GetData(`${API_URL}/municipios/list`, { + limit: 100, + page: 1, + with_deleted: false, + order_field: sorting[0].id, + order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' + }); + + // console.log('MUNICIPIOS: ', response?.data); + setMunicipios(response?.data.list); + } catch (error) { + console.error('Error fetching municipios', error); + } + }, []); + + const doFetchData = useCallback(async (id: string) => { + const response = await GetData(`${API_URL}/postoadms/getdata/${id}`, { id }); + + if (response?.status) { + setFormField((prev) => ({ + ...prev, + name: response.data.name, + municipio_id: response.data.municipios.id + })); + } else { + setFormField((prev) => ({ + ...prev, + name: '' + })); + } + }, []); + const handleUpdate = (e: React.FormEvent) => { e.preventDefault(); @@ -93,6 +128,18 @@ const EditDialog = () => { setAlert({ show: false, message: '' }); }; + useEffect(() => { + if (showEditDialog === false) { + resetForm(); + } + }, [showEditDialog]); + + useEffect(() => { + if (selectedPostoAdms) { + doFetchData(selectedPostoAdms); + } + }, [selectedPostoAdms]); + useEffect(() => { if (selectedPostoAdms) { setFormField({ @@ -104,25 +151,7 @@ const EditDialog = () => { }, [formattedTime]); useEffect(() => { - try { - const fetchMunicipios = async (sorting: any) => { - sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; - const response = await GetData(`${API_URL}/municipios/list`, { - limit: 100, - page: 1, - with_deleted: false, - order_field: sorting[0].id, - order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' - }); - - // console.log(response?.data); - setMunicipios(response?.data.list); - }; - - fetchMunicipios([{ id: 'name', desc: false }]); - } catch (error) { - console.error('Error fetching municipios', error); - } + doFetchMunicipios([{ id: 'name', desc: false }]); }, []); // console.log(selectedPostoAdms); diff --git a/src/pages/master/postoadms/blocks/ListToolbar.tsx b/src/pages/master/postoadms/blocks/ListToolbar.tsx index c476994..6d6de9c 100644 --- a/src/pages/master/postoadms/blocks/ListToolbar.tsx +++ b/src/pages/master/postoadms/blocks/ListToolbar.tsx @@ -17,9 +17,9 @@ const ListToolbar = () => { - table.getColumn('PostoAdms_name')?.setFilterValue(event.target.value) + table.getColumn('name')?.setFilterValue(event.target.value) } /> diff --git a/src/pages/master/postoadms/hooks/ManagePostoAdmsContext.tsx b/src/pages/master/postoadms/hooks/ManagePostoAdmsContext.tsx index 4c3ca65..5c2f500 100644 --- a/src/pages/master/postoadms/hooks/ManagePostoAdmsContext.tsx +++ b/src/pages/master/postoadms/hooks/ManagePostoAdmsContext.tsx @@ -84,9 +84,9 @@ const ManagePostoAdmsContextProvider = ({ children }: { children: React.ReactNod const columns = useMemo[]>( () => [ { - // accessorFn: (row) => row.PostoAdms_id, - // id: 'PostoAdms_id', - accessorKey: 'PostoAdms_id', + accessorFn: (row) => row.PostoAdms_id, + id: 'id', + // accessorKey: 'PostoAdms_id', header: ({ column }) => , enableSorting: true, enableHiding: false, @@ -95,26 +95,26 @@ const ManagePostoAdmsContextProvider = ({ children }: { children: React.ReactNod } }, { - // accessorFn: (row) => row.posto_adms_name, - // id: 'posto_adms_name', - accessorKey: 'PostoAdms_name', + accessorFn: (row) => row.PostoAdms_name, + id: 'name', + // accessorKey: 'PostoAdms_name', header: ({ column }) => ( ), enableSorting: true, enableHiding: false, meta: { - headerClassName: 'w-[1000px]' + headerClassName: 'w-[250px]' } }, { accessorFn: (row) => row.municipios_name, id: 'municipios_name', header: ({ column }) => , - enableSorting: true, + enableSorting: false, enableHiding: false, meta: { - headerClassName: 'w-[1000px]' + headerClassName: 'w-[250px]' } }, { @@ -162,7 +162,7 @@ const ManagePostoAdmsContextProvider = ({ children }: { children: React.ReactNod order_direction: sorting[0].desc ? 'DESC' : 'ASC', filter: JSON.stringify(filter) }); - console.log(response?.data); + // console.log(response?.data); // const sortedList = response.data.data.list.sort((a: PostoAdmsProps, b: PostoAdmsProps) => { // if (a.name < b.name) return -1; // if (a.name > b.name) return 1; @@ -195,7 +195,7 @@ const ManagePostoAdmsContextProvider = ({ children }: { children: React.ReactNod } layout={{ card: true }} sorting={[{ id: 'id', desc: false }]} diff --git a/src/pages/master/products/ProductsMaster.tsx b/src/pages/master/products/ProductsMaster.tsx index 49f5eee..b0b9792 100644 --- a/src/pages/master/products/ProductsMaster.tsx +++ b/src/pages/master/products/ProductsMaster.tsx @@ -3,12 +3,26 @@ import { ManageProductsContextProvider } from './hooks/ManageProductsContext'; import AddDialog from './blocks/AddDialog'; import EditDialog from './blocks/EditDialog'; import DeleteDialog from './blocks/DeleteDialog'; +import { Breadcrumbs, Link } from '@mui/material'; const ProductsMaster = () => { return ( -

Manage Products

+

Manage Products

+ + + Dashboard + + + + Master Data + + + + Manage Products + +
diff --git a/src/pages/master/products/blocks/EditDialog.tsx b/src/pages/master/products/blocks/EditDialog.tsx index a34f93d..06eb7b6 100644 --- a/src/pages/master/products/blocks/EditDialog.tsx +++ b/src/pages/master/products/blocks/EditDialog.tsx @@ -20,7 +20,7 @@ const API_URL = apiConfig.service_master_data; const EditDialog = () => { const { showEditDialog, handleEditDialog, selectedProducts } = useManageProductsContext(); const { reload } = useDataGrid(); - const { PutData } = useCallApi(); + const { PutData, GetData } = useCallApi(); const parsedUser = getAuth()?.user; const created_time = new Date(); const formattedTime = created_time.toISOString().slice(0, 19).replace('T', ' '); @@ -66,6 +66,25 @@ const EditDialog = () => { [selectedProducts, formField] ); + const doFetchData = useCallback(async (id: string) => { + const response = await GetData(`${API_URL}/product/getdata/${selectedProducts}`, { id }); + + if (response?.status) { + setFormField((prev) => ({ + ...prev, + name: response.data.name, + description: response.data.description, + price_point: response.data.price_point, + price_cash: response.data.price_cash, + cashback_point: response.data.cashback_point, + cashback_cash: response.data.cashback_cash, + status: response.data.status + })); + } else { + setFormField(initialState); + } + }, []); + const handleUpdate = (e: React.FormEvent) => { e.preventDefault(); @@ -89,6 +108,18 @@ const EditDialog = () => { setAlert({ show: false, message: '' }); }; + useEffect(() => { + if (showEditDialog === false) { + resetForm(); + } + }, [showEditDialog]); + + useEffect(() => { + if (selectedProducts) { + doFetchData(selectedProducts); + } + }, [selectedProducts]); + useEffect(() => { if (showEditDialog) { setFormField({ diff --git a/src/pages/master/products/hooks/ManageProductsContext.tsx b/src/pages/master/products/hooks/ManageProductsContext.tsx index c5b819a..0c23c51 100644 --- a/src/pages/master/products/hooks/ManageProductsContext.tsx +++ b/src/pages/master/products/hooks/ManageProductsContext.tsx @@ -167,7 +167,7 @@ const ManageProductsContextProvider = ({ children }: { children: React.ReactNode order_direction: sorting[0].desc == false ? 'ASC' : 'DESC', filter: JSON.stringify(filter) }); - console.log(response?.data); + // console.log(response?.data); setProducts(response?.data.list); return { data: response?.data.list, totalCount: response?.data.total_count }; } catch (error) { @@ -193,7 +193,7 @@ const ManageProductsContextProvider = ({ children }: { children: React.ReactNode } layout={{ card: true }} sorting={[{ id: 'id', desc: false }]} diff --git a/src/pages/master/profession/ProfessionMaster.tsx b/src/pages/master/profession/ProfessionMaster.tsx index 5f43e43..07583f5 100644 --- a/src/pages/master/profession/ProfessionMaster.tsx +++ b/src/pages/master/profession/ProfessionMaster.tsx @@ -3,12 +3,26 @@ import { ManageProfessionContextProvider } from './hooks/ManageProfessionContext import AddDialog from './blocks/AddDialog'; import EditDialog from './blocks/EditDialog'; import DeleteDialog from './blocks/DeleteDialog'; +import { Breadcrumbs, Link } from '@mui/material'; const ProfessionMaster = () => { return ( -

Manage Profession

+

Manage Profession

+ + + Dashboard + + + + Master Data + + + + Manage Profession + +
diff --git a/src/pages/master/profession/hooks/ManageProfessionContext.tsx b/src/pages/master/profession/hooks/ManageProfessionContext.tsx index c4c4caf..a9a0fc8 100644 --- a/src/pages/master/profession/hooks/ManageProfessionContext.tsx +++ b/src/pages/master/profession/hooks/ManageProfessionContext.tsx @@ -132,7 +132,7 @@ const ManageProfessionContextProvider = ({ children }: { children: React.ReactNo order_direction: sorting[0].desc == false ? 'ASC' : 'DESC', filter: JSON.stringify(filter) }); - console.log(response?.data); + // console.log(response?.data); setProfession(response?.data.list); return { data: response?.data.list, totalCount: response?.data.total_count }; } catch (error) { @@ -158,7 +158,7 @@ const ManageProfessionContextProvider = ({ children }: { children: React.ReactNo } layout={{ card: true }} sorting={[{ id: 'id', desc: false }]} diff --git a/src/pages/master/provider/ProviderMaster.tsx b/src/pages/master/provider/ProviderMaster.tsx index a073e82..dce73d1 100644 --- a/src/pages/master/provider/ProviderMaster.tsx +++ b/src/pages/master/provider/ProviderMaster.tsx @@ -3,12 +3,26 @@ import { ManageProviderContextProvider } from './hooks/ManageProviderContext'; import AddDialog from './blocks/AddDialog'; import EditDialog from './blocks/EditDialog'; import DeleteDialog from './blocks/DeleteDialog'; +import { Breadcrumbs, Link } from '@mui/material'; const ProviderMaster = () => { return ( -

Manage Provider

+

Manage Provider

+ + + Dashboard + + + + Master Data + + + + Manage Provider + +
diff --git a/src/pages/master/provider/hooks/ManageProviderContext.tsx b/src/pages/master/provider/hooks/ManageProviderContext.tsx index 43635b5..2beb2a2 100644 --- a/src/pages/master/provider/hooks/ManageProviderContext.tsx +++ b/src/pages/master/provider/hooks/ManageProviderContext.tsx @@ -194,7 +194,7 @@ const ManageProviderContextProvider = ({ children }: { children: React.ReactNode } layout={{ card: true }} sorting={[{ id: 'id', desc: false }]} diff --git a/src/pages/master/sucos/SucosMaster.tsx b/src/pages/master/sucos/SucosMaster.tsx index 9accaf9..c698cfa 100644 --- a/src/pages/master/sucos/SucosMaster.tsx +++ b/src/pages/master/sucos/SucosMaster.tsx @@ -3,18 +3,36 @@ import { ManageSucosContextProvider } from './hooks/ManageSucosContext'; import AddDialog from './blocks/AddDialog'; import EditDialog from './blocks/EditDialog'; import DeleteDialog from './blocks/DeleteDialog'; +import SearchDialog from './blocks/SearchDialog'; +import { Breadcrumbs, Link } from '@mui/material'; const SucosMaster = () => { return (

Sucos

+ + + Dashboard + + + + Master Data + + + + Manage Sucos + + +
+ +
); diff --git a/src/pages/master/sucos/blocks/AddDialog.tsx b/src/pages/master/sucos/blocks/AddDialog.tsx index c6c4c39..dd5ab57 100644 --- a/src/pages/master/sucos/blocks/AddDialog.tsx +++ b/src/pages/master/sucos/blocks/AddDialog.tsx @@ -15,15 +15,30 @@ import { } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList +} from '@/components/ui/command'; +interface PostoAdmsProps { + PostoAdms_id: number; + PostoAdms_name: string; +} const API_URL = apiConfig.service_master_data; const AddDialog = () => { const parentRef = useRef(null); const { showAddDialog, handleAddDialog } = useManageSucosContext(); const { reload } = useDataGrid(); - const { PostData } = useCallApi(); + const { PostData, GetData } = useCallApi(); const parsedUser = getAuth()?.user; + const [posto_adms, setPostoadms] = useState([]); + const [open, setOpen] = useState(false); const [alert, setAlert] = useState({ show: false, message: '' @@ -44,20 +59,23 @@ const AddDialog = () => { setAlert({ show: false, message: '' }); }; - const doCreateSucos = useCallback(async (e: React.FormEvent) => { - e.preventDefault(); - const response = await PostData(`${API_URL}/sucos/create`, formField); + const doCreateSucos = useCallback( + async (e: React.FormEvent) => { + e.preventDefault(); + const response = await PostData(`${API_URL}/sucos/create`, formField); - if (response?.status) { - resetForm(); - handleAddDialog(false); - reload(); - toast.success('Success Create Sucos'); - } else { - toast.error('Failed Create Sucos'); - setAlert({ show: true, message: response?.message }); - } - }, []); + if (response?.status) { + resetForm(); + handleAddDialog(false); + reload(); + toast.success('Sucos created successfully!'); + } else { + toast.error('Failed to create Sucos Please try again.'); + setAlert({ show: true, message: 'Failed to create Sucos Please try again.' }); + } + }, + [formField] + ); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); @@ -76,7 +94,7 @@ const AddDialog = () => { if (showAddDialog) { setFormField({ ...formField, - created_by: parsedUser.username, + created_by: parsedUser?.username, created_at: formattedTime }); } @@ -88,9 +106,30 @@ const AddDialog = () => { } }, [showAddDialog]); + useEffect(() => { + const fetchPostoAdms = async (sorting: any) => { + try { + sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; + const response = await GetData(`${API_URL}/postoadms/list`, { + limit: 100, + page: 1, + with_deleted: false, + order_field: sorting[0].id, + order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' + }); + console.log('ini data posto :', response?.data); + setPostoadms(response?.data.list || []); + } catch (error) { + console.log('Error fetching posto', error); + } + }; + + fetchPostoAdms([{ id: 'name', desc: false }]); + }, []); + return ( handleAddDialog(open)}> - + Sucos - Create @@ -124,7 +163,40 @@ const AddDialog = () => { - + + + + + + + + No Posto Adms Found. + + {posto_adms.map((posto) => ( + { + setFormField({ + ...formField, + posto_adm_id: posto.PostoAdms_id + }); + setOpen(false); + }} + > + {posto.PostoAdms_name} + + ))} + + + + + + {/* { const value = parseInt(e.target.value, 10); setFormField({ ...formField, posto_adm_id: isNaN(value) ? 0 : value }); }} - /> + /> */}
diff --git a/src/pages/master/sucos/blocks/EditDialog.tsx b/src/pages/master/sucos/blocks/EditDialog.tsx index 64c8b94..0e08201 100644 --- a/src/pages/master/sucos/blocks/EditDialog.tsx +++ b/src/pages/master/sucos/blocks/EditDialog.tsx @@ -2,7 +2,7 @@ import { Alert, useDataGrid } from '@/components'; import { useManageSucosContext } from '../hooks/useManageSucosContext'; import { useCallApi } from '@/hooks'; import { getAuth } from '@/auth'; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import { apiConfig } from '@/config/api.config'; import { toast } from 'sonner'; import { @@ -15,21 +15,40 @@ import { } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList +} from '@/components/ui/command'; + +interface PostoAdmsProps { + PostoAdms_id: number; // Ubah ke PostoAdms_id + PostoAdms_name: string; // Ubah ke PostoAdms_name +} const API_URL = apiConfig.service_master_data; const EditDialog = () => { - const { showEditDialog, handleEditDialog, selectedSucos } = useManageSucosContext(); + const parentRef = useRef(null); + const { showEditDialog, handleEditDialog, selectedSucos, sucos } = useManageSucosContext(); const { reload } = useDataGrid(); - const { PutData } = useCallApi(); + const { PutData, GetData } = useCallApi(); const parsedUser = getAuth()?.user; + const [open, setOpen] = useState(false); + const [postoadms, setPostoadms] = useState([]); + const [alert, setAlert] = useState({ show: false, message: '' }); + const initialState = { name: '', - posto_adm_id: 0, + posto_adm_id: 0, // Pastikan ini sesuai dengan PostoAdms_id updated_by: '', updated_at: '' }; @@ -65,6 +84,42 @@ const EditDialog = () => { [selectedSucos, formField] ); + const doFetchPostoAdms = useCallback(async (sorting: any) => { + try { + sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; + const response = await GetData(`${API_URL}/postoadms/list`, { + limit: 100, + page: 1, + with_deleted: false, + order_field: sorting[0].id, + order_direction: sorting[0].desc == false ? 'ASC' : 'DESC' + }); + + setPostoadms(response?.data.list); + console.log('Data Posto Adms:', response?.data.list); // Log data postoadms + } catch (error) { + console.log('Error fetching postoadms', error); + } + }, []); + + const doFetchData = useCallback(async (id: string) => { + const response = await GetData(`${API_URL}/sucos/getdata/${id}`, { id }); + console.log('Data Sucos:', response?.data); // Log data sucos + + if (response?.status) { + setFormField((prev) => ({ + ...prev, + name: response.data.name, + posto_adm_id: response.data.posto.id // Pastikan ini sesuai dengan PostoAdms_id + })); + } else { + setFormField((prev) => ({ + ...prev, + name: '' + })); + } + }, []); + const handleUpdate = (e: React.FormEvent) => { e.preventDefault(); @@ -73,21 +128,41 @@ const EditDialog = () => { return; } + console.log('Form Field before update:', formField); // Log formField sebelum update doUpdateSucos(e); - console.log(formField); setAlert({ show: false, message: '' }); }; useEffect(() => { if (showEditDialog) { + resetForm(); + console.log('Edit Dialog Opened'); // Log ketika dialog dibuka + } + }, [showEditDialog]); + + useEffect(() => { + if (selectedSucos) { + doFetchData(selectedSucos); + console.log('Selected Sucos ID:', selectedSucos); // Log selectedSucos ID + } + }, [selectedSucos]); + + useEffect(() => { + if (selectedSucos) { setFormField({ ...formField, - updated_by: parsedUser.username, + updated_by: parsedUser?.username, updated_at: formattedTime }); + console.log('Form Field after update:', formField); // Log formField setelah update } }, [formattedTime]); + useEffect(() => { + doFetchPostoAdms([{ id: 'name', desc: false }]); + }, []); + + console.log(selectedSucos); return ( handleEditDialog(open, null)}> @@ -122,23 +197,49 @@ const EditDialog = () => {
- { - const value = parseInt(e.target.value, 10); - setFormField({ ...formField, posto_adm_id: isNaN(value) ? 0 : value }); - }} - /> + + + + + + + + + No Posto Adms Found. + + {postoadms.map((posto) => ( + { + setFormField({ + ...formField, + posto_adm_id: posto.PostoAdms_id // Gunakan PostoAdms_id + }); + setOpen(false); + }} + > + {posto.PostoAdms_name} + + ))} + + + + +
-
+
+
diff --git a/src/pages/master/sucos/blocks/ListToolbar.tsx b/src/pages/master/sucos/blocks/ListToolbar.tsx index d5eaed2..313188e 100644 --- a/src/pages/master/sucos/blocks/ListToolbar.tsx +++ b/src/pages/master/sucos/blocks/ListToolbar.tsx @@ -1,6 +1,6 @@ import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components'; -import { useManageSucosContext } from '../hooks/useManageSucosContext'; import { Button } from '@/components/ui/button'; +import { useManageSucosContext } from '../hooks/useManageSucosContext'; const ListToolbar = () => { const { table, reload } = useDataGrid(); @@ -16,7 +16,7 @@ const ListToolbar = () => { table.getColumn('sucos_name')?.setFilterValue(event.target.value) } @@ -38,7 +38,7 @@ const ListToolbar = () => { className="h-7.5 text-[0.8rem]" onClick={() => handleSearchDialog(true)} > - Search Sucos + Search Aldeias */}
diff --git a/src/pages/master/sucos/blocks/SearchDialog.tsx b/src/pages/master/sucos/blocks/SearchDialog.tsx new file mode 100644 index 0000000..e744347 --- /dev/null +++ b/src/pages/master/sucos/blocks/SearchDialog.tsx @@ -0,0 +1,177 @@ +import { useRef, useState } from 'react'; +import { + Dialog, + DialogBody, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle +} from '@/components/ui/dialog'; +import { Alert, KeenIcon } from '@/components'; +import { Button } from '@/components/ui/button'; +import { apiConfig } from '@/config/api.config'; +import axios from 'axios'; +import { useManageSucosContext } from '../hooks/useManageSucosContext'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList +} from '@/components/ui/command'; +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; + +interface AldeiasProps { + id: number; + name: string; +} + +const API_URL = apiConfig.service_master_data; + +const SearchDialog = () => { + const parentRef = useRef(null); + const [open, setOpen] = useState(false); + const { showSearchDialog, handleSearchDialog, sucos } = useManageSucosContext(); + const [alert, setAlert] = useState({ + show: false, + message: '' + }); + const initialState = { + id: 0, + name: '' + }; + + const [formField, setFormField] = useState(initialState); + const resetForm = () => { + setFormField(initialState); + }; + const [aldeia, setAldeia] = useState([]); + const [isFound, setIsFound] = useState(false); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + const id = Number(formField.id); + + if (formField.id === 0) { + setAlert({ show: true, message: 'Please fill name field.' }); + return; + } + + try { + const response = await axios.get(`${API_URL}/postoadms/sucos/${id}`); + + if (response.data.status) { + setAldeia(response.data.data); + console.log(aldeia); + setIsFound(true); + console.log('Found Sucos: ', response.data.data); + } else { + setAldeia([]); + setIsFound(false); + setAlert({ show: true, message: 'No sucos found.' }); + } + } catch (error) { + console.error('Error fetching sucos', error); + setAlert({ show: true, message: 'Failed to fetch sucos. Please try again.' }); + } + setAlert({ show: false, message: '' }); + }; + + const handleReset = () => { + setFormField(initialState); + setIsFound(false); + setAldeia([]); + }; + + return ( + + + + + +
+
+

Search Aldeias

+
+
{ + handleSearchDialog(false); + handleReset(); + }} + > + +
+
+
+ + + {alert.show && {alert.message}} + +
+ + + + + + + + + + + No PostoAdms found. + + {sucos.map((suco) => ( + { + setFormField({ + id: suco.sucos_id, + name: suco.sucos_name + }); + setOpen(false); + }} + > + {suco.sucos_name} + + ))} + + + + + +
+ + {isFound && sucos.length > 0 && ( +
+

Aldeias:

+
+ + {aldeia.map((aldeias) => aldeias.name).join(', ')} + +
+
+ )} + +
+ + +
+ +
+
+
+ ); +}; + +export default SearchDialog; diff --git a/src/pages/master/sucos/hooks/ManageSucosContext.tsx b/src/pages/master/sucos/hooks/ManageSucosContext.tsx index 5151803..ddcd6c6 100644 --- a/src/pages/master/sucos/hooks/ManageSucosContext.tsx +++ b/src/pages/master/sucos/hooks/ManageSucosContext.tsx @@ -5,10 +5,13 @@ import { useCallApi } from '@/hooks'; import { ColumnDef } from '@tanstack/react-table'; import React, { createContext, useCallback, useMemo, useState } from 'react'; import ListToolbar from '../blocks/ListToolbar'; +import { useNavigate } from 'react-router'; +import axios from 'axios'; interface SucosProps { - id: number; - name: string; + sucos_id: number; + sucos_name: string; + posto_name: string; } interface ContextProps { @@ -34,15 +37,15 @@ interface ContextProps { const initialProps: ContextProps = { sucos: [], showSearchDialog: false, - handleSearchDialog: () => {}, + handleSearchDialog: (show: boolean) => {}, showEditDialog: false, - handleEditDialog: () => {}, + handleEditDialog: (show: boolean, selected_sucos: string | null) => {}, showAddDialog: false, - handleAddDialog: () => {}, + handleAddDialog: (show: boolean) => {}, showDeleteDialog: false, - handleDeleteDialog: () => {}, + handleDeleteDialog: (show: boolean, selected_sucos: string | null) => {}, selectedSucos: null, - getSucosLists: async () => undefined + getSucosLists: async () => ({ data: [], totalCount: 0 }) }; const ManageSucosContext = createContext(initialProps); @@ -56,6 +59,7 @@ const ManageSucosContextProvider = ({ children }: { children: React.ReactNode }) const [showDeleteDialog, setShowDeleteDialog] = useState(false); const [selectedSucos, setSelectedSucos] = useState(null); const { GetData } = useCallApi(); + const navigate = useNavigate(); const handleSearchDialog = useCallback((show: boolean) => { setShowSearchDialog(show); @@ -75,10 +79,14 @@ const ManageSucosContextProvider = ({ children }: { children: React.ReactNode }) setShowDeleteDialog(show); }, []); + const handleNavigate = (path: string) => { + const url = navigate(`${API_URL}/sucos/aldeias/${path}`); + }; + const columns = useMemo[]>( () => [ { - accessorFn: (row) => row.sucos_id, + accessorKey: 'sucos_id', id: 'id', header: ({ column }) => , enableSorting: true, @@ -118,13 +126,13 @@ const ManageSucosContextProvider = ({ children }: { children: React.ReactNode }) <> @@ -145,16 +153,15 @@ const ManageSucosContextProvider = ({ children }: { children: React.ReactNode }) sorting = sorting.length == 0 ? [{ id: 'name', desc: false }] : sorting; filter = filter.length == 0 ? {} : { any: filter[0].value?.toLowerCase() }; const response = await GetData(`${API_URL}/sucos/list`, { - limit, + limit: limit, page: page + 1, with_deleted: true, order_field: sorting[0].id, order_direction: sorting[0].desc == false ? 'ASC' : 'DESC', filter: JSON.stringify(filter) }); - console.log(response?.data); - setSucos(response?.data.list); - // console.log(sucos); + // console.log('Sucos List Response:', response?.data); + setSucos(response?.data.list || []); // Pastikan default value adalah array kosong return { data: response?.data.list, totalCount: response?.data.total_count }; } catch (error) { console.error('Error fetching Sucos', error); @@ -181,7 +188,7 @@ const ManageSucosContextProvider = ({ children }: { children: React.ReactNode }) } layout={{ card: true }} sorting={[{ id: 'id', desc: false }]} diff --git a/src/pages/master/sucos/hooks/useManageSucosContext.tsx b/src/pages/master/sucos/hooks/useManageSucosContext.tsx index 194575a..8a956c8 100644 --- a/src/pages/master/sucos/hooks/useManageSucosContext.tsx +++ b/src/pages/master/sucos/hooks/useManageSucosContext.tsx @@ -4,7 +4,8 @@ import { ManageSucosContext } from './ManageSucosContext'; const useManageSucosContext = () => { const context = useContext(ManageSucosContext); - if (!context) throw new Error('useManageSucosContext must be used within AuthProvider'); + if (!context) + throw new Error('useManageSucosContext must be used within ManageSucosContextProvider'); return context; }; diff --git a/src/pages/members/kyc/Kyc.tsx b/src/pages/members/kyc/Kyc.tsx index e346889..e2cf0a7 100644 --- a/src/pages/members/kyc/Kyc.tsx +++ b/src/pages/members/kyc/Kyc.tsx @@ -11,6 +11,7 @@ import axios from 'axios'; import { toast } from 'sonner'; const BASE_URL = apiConfig.service_customer; import CustomerDialog from '../manage-members/CustomerDetailModal'; +import { Breadcrumbs, Link } from '@mui/material'; export interface IDataGridContextProps { props: TDataGridProps; @@ -42,7 +43,7 @@ const Kyc = () => { const { getUser } = useAuthContext(); useEffect(() => { - fetchGroups() + fetchGroups(); }, []); async function fetchGroups() { @@ -54,37 +55,37 @@ const Kyc = () => { with_deleted: false, order_field: 'fullname', order_direction: 'ASC', - type: "kyc" + type: 'kyc' } }); - let temp = 1 + let temp = 1; let resMembers = groups.data.data.list.map((el: any) => { - el.no = temp++ - el.name = el.fullname - return el - }) - setMembers(resMembers) + el.no = temp++; + el.name = el.fullname; + return el; + }); + setMembers(resMembers); } catch (error: any) { - alert(error.message) + alert(error.message); console.log(error); } } - + const handleUpdate = (data: any) => { - setMember(data) - setIsDialogOpen(true) - } + setMember(data); + setIsDialogOpen(true); + }; async function handleSubmit(data: any) { - setDialogType('update') - setMember(data) - setDialogOpen(true) + setDialogType('update'); + setMember(data); + setDialogOpen(true); } function handleReject(data: any) { - setDialogType('reject') - setMember(data) - setDialogOpen(true) + setDialogType('reject'); + setMember(data); + setDialogOpen(true); } const handleYes = async () => { @@ -92,7 +93,7 @@ const Kyc = () => { const updateData: any = member; const customerId = member.id; const description = member.description; - updateData.updated_by = userLogin.data ? userLogin.data.id : '' + updateData.updated_by = userLogin.data ? userLogin.data.id : ''; let today = new Date(); updateData.updated_at = today.toString(); delete updateData.id; @@ -117,30 +118,31 @@ const Kyc = () => { delete updateData.group_deleted_at; try { if (dialogType === 'reject') { - await axios.post(`${BASE_URL}/customer/reject`, {customerid: customerId}) + await axios.post(`${BASE_URL}/customer/reject`, { customerid: customerId }); } if (dialogType === 'update') { - await axios.put(`${BASE_URL}/customer/update/${customerId}`, updateData) - if (updateData.isneedapproval == 1) await axios.post(`${BASE_URL}/customer/approve`, { - customerid: customerId, - description: description - }) + await axios.put(`${BASE_URL}/customer/update/${customerId}`, updateData); + if (updateData.isneedapproval == 1) + await axios.post(`${BASE_URL}/customer/approve`, { + customerid: customerId, + description: description + }); } await fetchGroups(); - setDialogOpen(false) - setIsDialogOpen(false) + setDialogOpen(false); + setIsDialogOpen(false); toast.success('Success Update Kyc Member'); } catch (error: any) { - alert(error.message) - setDialogOpen(false) - setIsDialogOpen(false) - toast.error(error.message) + alert(error.message); + setDialogOpen(false); + setIsDialogOpen(false); + toast.error(error.message); } - } + }; return (
-
+
setDialogOpen(false)} @@ -149,10 +151,30 @@ const Kyc = () => { onYes={handleYes} onNo={() => setDialogOpen(false)} /> - -

Manage Member KYC

- + +

Manage Member KYC

+ + + Dashboard + + + + Members + + + + Manage Member KYC + + +
); diff --git a/src/pages/members/manage-members/ManageMembers.tsx b/src/pages/members/manage-members/ManageMembers.tsx index 2258819..e3ede28 100644 --- a/src/pages/members/manage-members/ManageMembers.tsx +++ b/src/pages/members/manage-members/ManageMembers.tsx @@ -8,6 +8,7 @@ import ConfirmDialog from '@/components/confirm'; import { useAuthContext } from '@/auth'; import { ScreenLoader } from '@/components'; import { toast } from 'sonner'; +import { Breadcrumbs, Link } from '@mui/material'; const BASE_URL = apiConfig.service_customer; const ManageMembers = () => { @@ -21,9 +22,9 @@ const ManageMembers = () => { const { getUser } = useAuthContext(); useEffect(() => { - setLoading(true) - fetchGroups() - setLoading(false) + setLoading(true); + fetchGroups(); + setLoading(false); }, []); async function fetchGroups() { @@ -34,27 +35,27 @@ const ManageMembers = () => { page: 1, with_deleted: false, order_field: 'fullname', - order_direction: 'ASC', + order_direction: 'ASC' } }); - let temp = 1 + let temp = 1; let resMembers = groups.data.data.list.map((el: any) => { - el.no = temp++ - el.name = el.fullname - return el - }) - setMembers(resMembers) + el.no = temp++; + el.name = el.fullname; + return el; + }); + setMembers(resMembers); } catch (error: any) { - alert(error.message) + alert(error.message); console.log(error); } } const handleUpdate = (data: any) => { setDialogType('update'); - setMember(data) - setIsDialogOpen(true) - } + setMember(data); + setIsDialogOpen(true); + }; function createMember() { setDialogType('create'); @@ -63,15 +64,15 @@ const ManageMembers = () => { } async function handleSubmit(data: any) { - setMember(data) - setDialogOpen(true) + setMember(data); + setDialogOpen(true); } const handleYes = async () => { const userLogin: any = await getUser(); const updateData: any = member; const customerId = member.id; - updateData.updated_by = userLogin.data ? userLogin.data.id : '' + updateData.updated_by = userLogin.data ? userLogin.data.id : ''; let today = new Date(); updateData.updated_at = today.toString(); delete updateData.id; @@ -95,36 +96,61 @@ const ManageMembers = () => { delete updateData.group_deleted_by; delete updateData.group_deleted_at; try { - if (dialogType === 'update') await axios.put(`${BASE_URL}/customer/update/${customerId}`, updateData) + if (dialogType === 'update') + await axios.put(`${BASE_URL}/customer/update/${customerId}`, updateData); // if (dialogType === 'create') await axios.post(`${BASE_URL}/customers/create`, member) await fetchGroups(); - setDialogOpen(false) - setIsDialogOpen(false) + setDialogOpen(false); + setIsDialogOpen(false); toast.success('Success Update Member'); } catch (error: any) { - alert(error.message) - setDialogOpen(false) - setIsDialogOpen(false) - toast.error(error.message) + alert(error.message); + setDialogOpen(false); + setIsDialogOpen(false); + toast.error(error.message); } - } + }; - if (loading) return () + if (loading) return ; return (
- setDialogOpen(false)} - title="Confirm Action" - content={`Are you sure you want to ${dialogType}?`} - onYes={handleYes} - onNo={() => setDialogOpen(false)} - /> - -

Manage Members

- + setDialogOpen(false)} + title="Confirm Action" + content={`Are you sure you want to ${dialogType}?`} + onYes={handleYes} + onNo={() => setDialogOpen(false)} + /> + +

Manage Members

+ + + Dashboard + + + + Members + + + + Manage Members + + +
); diff --git a/src/pages/menu/manage-menu/ManageMenu.tsx b/src/pages/menu/manage-menu/ManageMenu.tsx index 75e0925..7dac58a 100644 --- a/src/pages/menu/manage-menu/ManageMenu.tsx +++ b/src/pages/menu/manage-menu/ManageMenu.tsx @@ -3,12 +3,26 @@ import { ManageMenusContextProvider } from './hooks/ManageMenusContext'; import AddDialog from './blocks/AddDIalog'; import EditDialog from './blocks/EditDialog'; import DeleteDialog from './blocks/DeleteDialog'; +import { Breadcrumbs, Link } from '@mui/material'; const ManageMenu = () => { return (

Manage Menus

+ + + Dashboard + + + + Master Data + + + + Manage Menus + +
diff --git a/src/pages/menu/manage-menu/hooks/ManageMenusContext.tsx b/src/pages/menu/manage-menu/hooks/ManageMenusContext.tsx index 96a82f0..a8a40e6 100644 --- a/src/pages/menu/manage-menu/hooks/ManageMenusContext.tsx +++ b/src/pages/menu/manage-menu/hooks/ManageMenusContext.tsx @@ -175,7 +175,8 @@ const ManageMenusContextProvider = ({ children }: { children: React.ReactNode }) const flattenChildren = (parent: any, parentIdx: number, depth = 0, parentName = '') => { if (parent.link === '/') { - if (!parents.find((el: any) => el.id === parent.id)) setParents((el: any) => [...el, { id: parent.id, name: parent.name }]) // GET PARENTS + if (!parents.find((el: any) => el.id === parent.id)) + setParents((el: any) => [...el, { id: parent.id, name: parent.name }]); // GET PARENTS } if (!parent.children || parent.children.length === 0) { return []; // Jika tidak ada children, kembalikan array kosong @@ -220,8 +221,9 @@ const ManageMenusContextProvider = ({ children }: { children: React.ReactNode }) const total_count = transformedData.length; + console.log(response.data); setMenus(transformedData); - return { data: transformedData, totalCount: total_count }; + return { data: transformedData, totalCount: response.data.total_count }; } catch (error) { console.error('Error fetching Menus', error); return { data: [], totalCount: 0 }; diff --git a/src/pages/notification/ManageNotification.tsx b/src/pages/notification/ManageNotification.tsx index 3f26388..088627b 100644 --- a/src/pages/notification/ManageNotification.tsx +++ b/src/pages/notification/ManageNotification.tsx @@ -1,11 +1,28 @@ import { Container, DataGridInner } from '@/components'; import { ManageNotifContextProvider } from './hooks/ManageNotificationContext'; import AddDialog from './blocks/AddDialog'; +import { Breadcrumbs, Link } from '@mui/material'; const ManageNotification = () => { return ( +

+ Manage Notifications +

+ + + Dashboard + + + + Notification + + + + Manage Notification + +
diff --git a/src/pages/notification/hooks/ManageNotificationContext.tsx b/src/pages/notification/hooks/ManageNotificationContext.tsx index 238922f..f0ece52 100644 --- a/src/pages/notification/hooks/ManageNotificationContext.tsx +++ b/src/pages/notification/hooks/ManageNotificationContext.tsx @@ -108,9 +108,6 @@ const ManageNotifContextProvider = ({ children }: { children: React.ReactNode }) return (
-
-

Manage Notifications

-
+

Log Activity

+ + + Dashboard + + + + Settings + + + + User Management + + + + Log Activity + +
diff --git a/src/pages/settings/user/manage-position/ManagePositionPage.tsx b/src/pages/settings/user/manage-position/ManagePositionPage.tsx index d151f44..6ddcd6d 100644 --- a/src/pages/settings/user/manage-position/ManagePositionPage.tsx +++ b/src/pages/settings/user/manage-position/ManagePositionPage.tsx @@ -3,11 +3,30 @@ import { EditDialog } from './blocks'; import { ManagePositionContextProvider } from './hooks'; import { AddDialog } from './blocks/AddDialog'; import { DeleteDialog } from './blocks/DeleteDialog'; +import { Breadcrumbs, Link } from '@mui/material'; export default function ManagePositionPage() { return ( +

Manage Positions

+ + + Dashboard + + + + Settings + + + + User Management + + + + Manage Position + +
diff --git a/src/pages/settings/user/manage-position/hooks/ManagePositionContext.tsx b/src/pages/settings/user/manage-position/hooks/ManagePositionContext.tsx index ee3f565..2bc9d80 100644 --- a/src/pages/settings/user/manage-position/hooks/ManagePositionContext.tsx +++ b/src/pages/settings/user/manage-position/hooks/ManagePositionContext.tsx @@ -85,11 +85,16 @@ const ManagePositionContextProvider = ({ children }: { children: React.ReactNode enableSorting: false, enableHiding: false, cell: ({ row }) => { + const isActive = row.original.status === 'Y'; + return ( - {}} - /> + + {isActive ? 'Active' : 'Inactive'} + ); }, meta: { diff --git a/src/pages/settings/user/manage-user/ManageUserPage.tsx b/src/pages/settings/user/manage-user/ManageUserPage.tsx index 1d9703e..5f318b0 100644 --- a/src/pages/settings/user/manage-user/ManageUserPage.tsx +++ b/src/pages/settings/user/manage-user/ManageUserPage.tsx @@ -3,11 +3,30 @@ import { EditDialog } from './blocks'; import { ManageUserContextProvider } from './hooks'; import { AddDialog } from './blocks/AddDialog'; import { DeleteDialog } from './blocks/DeleteDialog'; +import { Breadcrumbs, Link } from '@mui/material'; export default function ManageUserPage() { return ( +

Manage User

+ + + Dashboard + + + + Settings + + + + User Management + + + + Manage User + +
diff --git a/src/pages/settings/user/manage-user/hooks/ManageUserContext.tsx b/src/pages/settings/user/manage-user/hooks/ManageUserContext.tsx index 284ce93..efae604 100644 --- a/src/pages/settings/user/manage-user/hooks/ManageUserContext.tsx +++ b/src/pages/settings/user/manage-user/hooks/ManageUserContext.tsx @@ -127,11 +127,16 @@ const ManageUserContextProvider = ({ children }: { children: React.ReactNode }) enableSorting: false, enableHiding: false, cell: ({ row }) => { + const isActive = row.original.status === 'Y'; + return ( - {}} - /> + + {isActive ? 'Active' : 'Inactive'} + ); }, meta: { diff --git a/src/pages/transfer/TransferType.tsx b/src/pages/transfer/TransferType.tsx index 2e5d03e..031c462 100644 --- a/src/pages/transfer/TransferType.tsx +++ b/src/pages/transfer/TransferType.tsx @@ -4,11 +4,26 @@ import { ManageTransferTypeContextProvider } from './hooks/ManageTransferTypeContext'; import AddDialog from './blocks/AddDialog'; +import { Breadcrumbs, Link } from '@mui/material'; const TransferType = () => { return ( +

Manage Access Type

+ + + Dashboard + + + + Transfer Type + + + + Manage Access Type + +
diff --git a/src/pages/transfer/hooks/ManageTransferTypeContext.tsx b/src/pages/transfer/hooks/ManageTransferTypeContext.tsx index 5a3d5d3..f41c7fd 100644 --- a/src/pages/transfer/hooks/ManageTransferTypeContext.tsx +++ b/src/pages/transfer/hooks/ManageTransferTypeContext.tsx @@ -145,9 +145,6 @@ const ManageTransferTypeContextProvider = ({ children }: { children: React.React return (
-
-

Manage Access Type

-