diff --git a/src/pages/master/aldeias/AldeiasMaster.tsx b/src/pages/master/aldeias/AldeiasMaster.tsx
index 851f5f1..7ec7c77 100644
--- a/src/pages/master/aldeias/AldeiasMaster.tsx
+++ b/src/pages/master/aldeias/AldeiasMaster.tsx
@@ -1,10 +1,22 @@
+import { Container, DataGridInner } from '@/components';
+import { ManageAldeiasContextProvider } from './hooks/ManageAldeiasContext';
+import AddDialog from './blocks/AddDialog';
+import EditDialog from './blocks/EditDialog';
+import DeleteDialog from './blocks/DeleteDialog';
+
const AldeiasMaster = () => {
return (
-
-
-
Aldeias Master Data
-
-
+
+
+ Aldeias
+
+
+
+
+
+
+
+
);
};
diff --git a/src/pages/master/aldeias/blocks/AddDialog.tsx b/src/pages/master/aldeias/blocks/AddDialog.tsx
new file mode 100644
index 0000000..66286dd
--- /dev/null
+++ b/src/pages/master/aldeias/blocks/AddDialog.tsx
@@ -0,0 +1,152 @@
+import { apiConfig } from '@/config/api.config';
+import { useManageAldeiasContext } from '../hooks/useManageAldeiasContext';
+import { Alert, useDataGrid } from '@/components';
+import { useCallApi } from '@/hooks';
+import { getAuth } from '@/auth';
+import React, { useCallback, useEffect, useRef, useState } from 'react';
+import { toast } from 'sonner';
+import {
+ Dialog,
+ DialogBody,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle
+} from '@/components/ui/dialog';
+import { Input } from '@/components/ui/input';
+import { Button } from '@/components/ui/button';
+
+const API_URL = apiConfig.service_master_data;
+
+const AddDialog = () => {
+ const parentRef = useRef(null);
+ const { showAddDialog, handleAddDialog } = useManageAldeiasContext();
+ const { reload } = useDataGrid();
+ const { PostData } = useCallApi();
+ const parsedUser = getAuth()?.user;
+ const [alert, setAlert] = useState({
+ show: false,
+ message: ''
+ });
+ const initialState = {
+ name: '',
+ sucos: 0,
+ created_by: '',
+ created_at: ''
+ };
+ const [formField, setFormField] = useState(initialState);
+ const created_time = new Date();
+ const formattedTime = created_time.toISOString().slice(0, 19).replace('T', ' ');
+
+ const resetForm = () => {
+ setFormField(initialState);
+ setAlert({ show: false, message: '' });
+ };
+
+ const doCreateAldeias = useCallback(
+ async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ const response = await PostData(`${API_URL}/aldeias/create`, formField);
+
+ if (response?.status) {
+ resetForm();
+ handleAddDialog(false);
+ toast.success('Success Create Aldeias');
+ reload();
+ } else {
+ toast.error('Error Create Aldeias');
+ setAlert({ show: true, message: 'Failed to create Aldeias. Please try again.' });
+ }
+ },
+ [formField]
+ );
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault();
+
+ if (formField.name === '' || formField.sucos === 0) {
+ setAlert({ show: true, message: 'Please fill in all required fields.' });
+ return;
+ }
+
+ // doCreateAldeias(e);
+ console.log(formField);
+ setAlert({ show: false, message: '' });
+ };
+
+ useEffect(() => {
+ if (showAddDialog) {
+ setFormField({
+ ...formField,
+ created_by: parsedUser.username,
+ created_at: formattedTime
+ });
+ }
+ }, [formattedTime]);
+
+ return (
+
+ );
+};
+
+export default AddDialog;
diff --git a/src/pages/master/aldeias/blocks/DeleteDialog.tsx b/src/pages/master/aldeias/blocks/DeleteDialog.tsx
new file mode 100644
index 0000000..44fc4c1
--- /dev/null
+++ b/src/pages/master/aldeias/blocks/DeleteDialog.tsx
@@ -0,0 +1,74 @@
+import { apiConfig } from '@/config/api.config';
+import { useManageAldeiasContext } from '../hooks/useManageAldeiasContext';
+import { Alert, useDataGrid } from '@/components';
+import { useCallApi } from '@/hooks';
+import { ChangeEvent, useCallback, useState } from 'react';
+import { toast } from 'sonner';
+import { Dialog, DialogContent, DialogFooter, DialogHeader } from '@/components/ui/dialog';
+import { EnforceSwitch } from '@/components/switch';
+import { Button } from '@/components/ui/button';
+
+const API_URL = apiConfig.service_master_data;
+const DeleteDialog = () => {
+ const { showDeleteDialog, handleDeleteDialog, selectedAldeias } = useManageAldeiasContext();
+ const { reload } = useDataGrid();
+ const { DeleteData } = useCallApi();
+ const [enforce, setEnforce] = useState(false);
+ const [alert, setAlert] = useState({
+ show: false,
+ message: ''
+ })
+
+ const doDeleteAldeias = useCallback(async () => {
+ const response = await DeleteData(`${API_URL}/aldeias/delete/${selectedAldeias}/${enforce}`, {
+ id: selectedAldeias
+ });
+
+ if (response?.status) {
+ setAlert((prev) => ({ ...prev, show: false, message: '' }));
+ handleDeleteDialog(false, null);
+ toast.success('Success Delete Aldeias');
+ reload();
+ } else {
+ toast.error('Failed Delete Aldeias');
+ setAlert((prev) => ({ ...prev, show: true, message: response?.message }));
+ }
+ }, [selectedAldeias, enforce]);
+
+ return (
+
+ );
+};
+
+export default DeleteDialog;
diff --git a/src/pages/master/aldeias/blocks/EditDialog.tsx b/src/pages/master/aldeias/blocks/EditDialog.tsx
new file mode 100644
index 0000000..d34e30c
--- /dev/null
+++ b/src/pages/master/aldeias/blocks/EditDialog.tsx
@@ -0,0 +1,148 @@
+import { apiConfig } from '@/config/api.config';
+import { useManageAldeiasContext } from '../hooks/useManageAldeiasContext';
+import { Alert, useDataGrid } from '@/components';
+import { useCallApi } from '@/hooks';
+import { getAuth } from '@/auth';
+import React, { useCallback, useEffect, useState } from 'react';
+import { toast } from 'sonner';
+import {
+ Dialog,
+ DialogBody,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle
+} from '@/components/ui/dialog';
+import { Input } from '@/components/ui/input';
+import { Button } from '@/components/ui/button';
+
+const API_URL = apiConfig.service_master_data;
+
+const EditDialog = () => {
+ const { showEditDialog, handleEditDialog, selectedAldeias } = useManageAldeiasContext();
+ const { reload } = useDataGrid();
+ const { PutData } = useCallApi();
+ const parsedUser = getAuth()?.user;
+ const [alert, setAlert] = useState({
+ show: false,
+ message: ''
+ });
+ const initialState = {
+ name: '',
+ sucos: 0,
+ updated_by: '',
+ updated_at: ''
+ };
+ const [formField, setFormField] = useState(initialState);
+ const created_time = new Date();
+ const formattedTime = created_time.toISOString().slice(0, 19).replace('T', ' ');
+
+ const resetForm = () => {
+ setFormField(initialState);
+ setAlert({ show: false, message: '' });
+ };
+
+ const doUpdateAldeias = useCallback(
+ async (e: React.FormEvent) => {
+ e.preventDefault();
+
+ const response = await PutData(`${API_URL}/aldeias/update/${selectedAldeias}`, formField);
+
+ if (response?.status) {
+ resetForm();
+ handleEditDialog(false, null);
+ toast.success('Success Update Aldeias');
+ reload();
+ } else {
+ toast.error('Error Update Aldeias');
+ setAlert({ show: true, message: 'Error Update Aldeias' });
+ }
+ },
+ [selectedAldeias, formField]
+ );
+
+ const handleUpdate = (e: React.FormEvent) => {
+ e.preventDefault();
+
+ if (formField.name === '' || formField.sucos === 0) {
+ setAlert({ show: true, message: 'Please fill in all required fields.' });
+ return;
+ }
+
+ // doUpdateAldeias(e);
+ console.log(formField);
+ setAlert({ show: false, message: '' });
+ };
+
+ useEffect(() => {
+ if (showEditDialog) {
+ setFormField({
+ ...formField,
+ updated_by: parsedUser?.username,
+ updated_at: formattedTime
+ });
+ }
+ }, [formattedTime]);
+
+ return (
+
+ );
+};
+
+export default EditDialog;
diff --git a/src/pages/master/aldeias/blocks/ListToolbar.tsx b/src/pages/master/aldeias/blocks/ListToolbar.tsx
index e69de29..7cc5369 100644
--- a/src/pages/master/aldeias/blocks/ListToolbar.tsx
+++ b/src/pages/master/aldeias/blocks/ListToolbar.tsx
@@ -0,0 +1,62 @@
+import { DefaultTooltip, KeenIcon, useDataGrid } from '@/components';
+import { Button } from '@/components/ui/button';
+import { useManageAldeiasContext } from '../hooks/useManageAldeiasContext';
+
+const ListToolbar = () => {
+ const { table, reload } = useDataGrid();
+ const { handleAddDialog, handleSearchDialog } = useManageAldeiasContext();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ListToolbar;
diff --git a/src/pages/master/aldeias/hooks/ManageAldeiasContext.tsx b/src/pages/master/aldeias/hooks/ManageAldeiasContext.tsx
new file mode 100644
index 0000000..d4cf6d3
--- /dev/null
+++ b/src/pages/master/aldeias/hooks/ManageAldeiasContext.tsx
@@ -0,0 +1,196 @@
+import { DataGridColumnHeader, DataGridProvider, KeenIcon } from '@/components';
+import { apiConfig } from '@/config/api.config';
+import { useCallApi } from '@/hooks';
+import { ColumnDef } from '@tanstack/react-table';
+import React, { createContext, useCallback, useMemo, useState } from 'react';
+import { Toaster } from 'sonner';
+import ListToolbar from '../blocks/ListToolbar';
+
+interface AldeiasProps {
+ id: number;
+ name: string;
+}
+
+interface ContextProps {
+ aldeias: AldeiasProps[];
+ showSearchDialog: boolean;
+ handleSearchDialog: (show: boolean) => void;
+ showEditDialog: boolean;
+ handleEditDialog: (show: boolean, selected_postoAdms: string | null) => void;
+ showAddDialog: boolean;
+ handleAddDialog: (show: boolean) => void;
+ showDeleteDialog: boolean;
+ handleDeleteDialog: (show: boolean, selected_postoAdms: string | null) => void;
+ selectedAldeias: string | null;
+ getAldeiasLists: (
+ limit: number,
+ page: number,
+ with_deleted: boolean,
+ order_field: any,
+ order_direction: any
+ ) => Promise<{ data: AldeiasProps[]; totalCount: number } | undefined>;
+}
+
+const initialProps: ContextProps = {
+ aldeias: [],
+ showSearchDialog: false,
+ handleSearchDialog: () => {},
+ showEditDialog: false,
+ handleEditDialog: () => {},
+ showAddDialog: false,
+ handleAddDialog: () => {},
+ showDeleteDialog: false,
+ handleDeleteDialog: () => {},
+ selectedAldeias: null,
+ getAldeiasLists: async () => undefined
+};
+
+const ManageAldeiasContext = createContext(initialProps);
+const API_URL = apiConfig.service_master_data;
+
+const ManageAldeiasContextProvider = ({ children }: { children: React.ReactNode }) => {
+ const [aldeias, setAldeias] = useState([]);
+ const [showSearchDialog, setShowSearchDialog] = useState(false);
+ const [showAddDialog, setShowAddDialog] = useState(false);
+ const [showEditDialog, setShowEditDialog] = useState(false);
+ const [showDeleteDialog, setShowDeleteDialog] = useState(false);
+ const [selectedAldeias, setSelectedAldeias] = useState(null);
+ const { GetData } = useCallApi();
+
+ const handleAddDialog = useCallback((show: boolean) => {
+ setShowAddDialog(show);
+ }, []);
+
+ const handleEditDialog = useCallback((show: boolean, selected_aldeias: string | null) => {
+ setSelectedAldeias(show ? selected_aldeias : null);
+ setShowEditDialog(show);
+ }, []);
+
+ const handleDeleteDialog = useCallback((show: boolean, selected_aldeias: string | null) => {
+ setSelectedAldeias(show ? selected_aldeias : null);
+ setShowDeleteDialog(show);
+ }, []);
+
+ const handleSearchDialog = useCallback((show: boolean) => {
+ setShowSearchDialog(show);
+ }, []);
+
+ const columns = useMemo[]>(
+ () => [
+ {
+ accessorFn: (row) => row.id,
+ id: 'id',
+ header: ({ column }) => ,
+ enableSorting: true,
+ enableHiding: false,
+ meta: {
+ headerClassName: 'w-[100px]'
+ }
+ },
+ {
+ accessorFn: (row) => row.name,
+ id: 'name',
+ header: ({ column }) => ,
+ enableSorting: true,
+ enableHiding: false,
+ meta: {
+ headerClassName: 'w-[250px]'
+ }
+ },
+ {
+ accessorFn: (row) => row.sucos.name,
+ id: 'sucos',
+ header: ({ column }) => ,
+ enableSorting: true,
+ enableHiding: false,
+ meta: {
+ headerClassName: 'w-[250px]'
+ }
+ },
+ {
+ id: 'actions',
+ header: ({ column }) => ,
+ enableSorting: false,
+ enableHiding: false,
+ cell: (data) => {
+ const row = data.row.original;
+ return (
+ <>
+
+
+ >
+ );
+ },
+ meta: {
+ headerClassName: 'w-[100px]',
+ cellClassName: 'text-center'
+ }
+ }
+ ],
+ []
+ );
+
+ const getAldeiasLists = async (page: number, limit: number, sorting: any, filter: any) => {
+ try {
+ const response = await GetData(`${API_URL}/aldeias/list`, {
+ 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);
+ setAldeias(response?.data.list);
+ return { data: response?.data.list, totalCount: response?.data.total_count };
+ } catch (error) {
+ console.error('Error fetching Aldeias', error);
+ }
+ };
+
+ return (
+
+
+ }
+ layout={{ card: true }}
+ sorting={[{ id: 'id', desc: false }]}
+ serverSide={true}
+ onFetchData={({ pageIndex, pageSize, sorting, columnFilters }) =>
+ getAldeiasLists(pageIndex, pageSize, sorting, columnFilters)
+ }
+ >
+ {children}
+
+
+ );
+};
+
+export { ManageAldeiasContext, ManageAldeiasContextProvider };
+export type { AldeiasProps };
diff --git a/src/pages/master/aldeias/hooks/useManageAldeiasContext.tsx b/src/pages/master/aldeias/hooks/useManageAldeiasContext.tsx
new file mode 100644
index 0000000..c042a04
--- /dev/null
+++ b/src/pages/master/aldeias/hooks/useManageAldeiasContext.tsx
@@ -0,0 +1,12 @@
+import { useContext } from 'react';
+import { ManageAldeiasContext } from './ManageAldeiasContext';
+
+const useManageAldeiasContext = () => {
+ const context = useContext(ManageAldeiasContext);
+
+ if (!context) throw new Error('useManageAldeiasContext must be used within AuthProvider');
+
+ return context;
+};
+
+export { useManageAldeiasContext };