add dropdown for sucos id

This commit is contained in:
Wikzyy
2025-03-16 12:58:27 +07:00
parent 520a17872d
commit 1fc9d72dd6
5 changed files with 156 additions and 34 deletions

View File

@ -15,6 +15,20 @@ import {
} from '@/components/ui/dialog'; } from '@/components/ui/dialog';
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
import { Button } from '@/components/ui/button'; 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 SucosProps {
sucos_id: number;
sucos_name: string;
}
const API_URL = apiConfig.service_master_data; const API_URL = apiConfig.service_master_data;
@ -22,15 +36,17 @@ const AddDialog = () => {
const parentRef = useRef<any | null>(null); const parentRef = useRef<any | null>(null);
const { showAddDialog, handleAddDialog } = useManageAldeiasContext(); const { showAddDialog, handleAddDialog } = useManageAldeiasContext();
const { reload } = useDataGrid(); const { reload } = useDataGrid();
const { PostData } = useCallApi(); const { PostData, GetData } = useCallApi();
const parsedUser = getAuth()?.user; const parsedUser = getAuth()?.user;
const [sucos, setSucos] = useState<SucosProps[]>([]);
const [open, setOpen] = useState(false);
const [alert, setAlert] = useState({ const [alert, setAlert] = useState({
show: false, show: false,
message: '' message: ''
}); });
const initialState = { const initialState = {
name: '', name: '',
sucos: 0, sucos_id: 0,
created_by: '', created_by: '',
created_at: '' created_at: ''
}; };
@ -65,12 +81,12 @@ const AddDialog = () => {
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => { const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault(); e.preventDefault();
if (formField.name === '' || formField.sucos === 0) { if (formField.name === '' || formField.sucos_id === 0) {
setAlert({ show: true, message: 'Please fill in all required fields.' }); setAlert({ show: true, message: 'Please fill in all required fields.' });
return; return;
} }
// doCreateAldeias(e); doCreateAldeias(e);
console.log(formField); console.log(formField);
setAlert({ show: false, message: '' }); setAlert({ show: false, message: '' });
}; };
@ -85,6 +101,28 @@ const AddDialog = () => {
} }
}, [formattedTime]); }, [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 }]);
}, []);
return ( return (
<Dialog open={showAddDialog} onOpenChange={(open) => handleAddDialog(open)}> <Dialog open={showAddDialog} onOpenChange={(open) => handleAddDialog(open)}>
<DialogContent className="container-fixed max-w-[768px] flex flex-col p-5 overflow-hidden"> <DialogContent className="container-fixed max-w-[768px] flex flex-col p-5 overflow-hidden">
@ -121,16 +159,39 @@ const AddDialog = () => {
<label className="form-label flex items-center gap-1 max-w-56"> <label className="form-label flex items-center gap-1 max-w-56">
Sucos ID<span className="text-red-500">*</span> Sucos ID<span className="text-red-500">*</span>
</label> </label>
<Input <Popover open={open} onOpenChange={setOpen}>
className="input" <PopoverTrigger asChild>
type="number" <button type="button" className="input col-span-5 text-left">
min={0} {sucos.find((suco) => suco.sucos_id === formField.sucos_id)?.sucos_name ||
value={formField.sucos === 0 ? '' : formField.sucos} 'Select Sucos'}
onChange={(e) => { </button>
const value = parseInt(e.target.value, 10); </PopoverTrigger>
setFormField({ ...formField, sucos: isNaN(value) ? 0 : value }); <PopoverContent className="w-[400px] p-0">
}} <Command>
/> <CommandInput placeholder="Search Sucos..." />
<CommandList>
<CommandEmpty>No Sucos found.</CommandEmpty>
<CommandGroup>
{sucos.map((suco) => (
<CommandItem
key={suco.sucos_id}
value={suco.sucos_name}
onSelect={() => {
setFormField({
...formField,
sucos_id: suco.sucos_id
});
setOpen(false);
}}
>
{suco.sucos_name}
</CommandItem>
))}
</CommandGroup>
</CommandList>
</Command>
</PopoverContent>
</Popover>
</div> </div>
</div> </div>

View File

@ -15,21 +15,37 @@ import {
} from '@/components/ui/dialog'; } from '@/components/ui/dialog';
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
import { Button } from '@/components/ui/button'; 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 SucosProps {
sucos_id: number;
sucos_name: string;
}
const API_URL = apiConfig.service_master_data; const API_URL = apiConfig.service_master_data;
const EditDialog = () => { const EditDialog = () => {
const { showEditDialog, handleEditDialog, selectedAldeias } = useManageAldeiasContext(); const { showEditDialog, handleEditDialog, selectedAldeias, aldeias } = useManageAldeiasContext();
const { reload } = useDataGrid(); const { reload } = useDataGrid();
const { PutData } = useCallApi(); const { PutData, GetData } = useCallApi();
const parsedUser = getAuth()?.user; const parsedUser = getAuth()?.user;
const [sucos, setSucos] = useState<SucosProps[]>([]);
const [open, setOpen] = useState(false);
const [alert, setAlert] = useState({ const [alert, setAlert] = useState({
show: false, show: false,
message: '' message: ''
}); });
const initialState = { const initialState = {
name: '', name: '',
sucos: 0, sucos_id: 0,
updated_by: '', updated_by: '',
updated_at: '' updated_at: ''
}; };
@ -64,12 +80,12 @@ const EditDialog = () => {
const handleUpdate = (e: React.FormEvent<HTMLFormElement>) => { const handleUpdate = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault(); e.preventDefault();
if (formField.name === '' || formField.sucos === 0) { if (formField.name === '' || formField.sucos_id === 0) {
setAlert({ show: true, message: 'Please fill in all required fields.' }); setAlert({ show: true, message: 'Please fill in all required fields.' });
return; return;
} }
// doUpdateAldeias(e); doUpdateAldeias(e);
console.log(formField); console.log(formField);
setAlert({ show: false, message: '' }); setAlert({ show: false, message: '' });
}; };
@ -84,6 +100,28 @@ const EditDialog = () => {
} }
}, [formattedTime]); }, [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 }]);
}, []);
return ( return (
<Dialog open={showEditDialog} onOpenChange={(open) => handleEditDialog(open, null)}> <Dialog open={showEditDialog} onOpenChange={(open) => handleEditDialog(open, null)}>
<DialogContent className="container-fixed max-w-[768px] flex flex-col p-5 overflow-hidden"> <DialogContent className="container-fixed max-w-[768px] flex flex-col p-5 overflow-hidden">
@ -120,16 +158,39 @@ const EditDialog = () => {
<label className="form-label flex items-center gap-1 max-w-56"> <label className="form-label flex items-center gap-1 max-w-56">
Sucos ID<span className="text-red-500">*</span> Sucos ID<span className="text-red-500">*</span>
</label> </label>
<Input <Popover open={open} onOpenChange={setOpen}>
className="input" <PopoverTrigger asChild>
type="number" <button type="button" className="input col-span-5 text-left">
min={0} {sucos.find((suco) => suco.sucos_id === formField.sucos_id)?.sucos_name ||
value={formField.sucos === 0 ? '' : formField.sucos} 'Select Sucos'}
onChange={(e) => { </button>
const value = parseInt(e.target.value, 10); </PopoverTrigger>
setFormField({ ...formField, sucos: isNaN(value) ? 0 : value }); <PopoverContent className="w-[400px] p-0">
}} <Command>
/> <CommandInput placeholder="Search Sucos..." />
<CommandList>
<CommandEmpty>No Sucos found.</CommandEmpty>
<CommandGroup>
{sucos.map((suco) => (
<CommandItem
key={suco.sucos_id}
value={suco.sucos_name}
onSelect={() => {
setFormField({
...formField,
sucos_id: suco.sucos_id
});
setOpen(false);
}}
>
{suco.sucos_name}
</CommandItem>
))}
</CommandGroup>
</CommandList>
</Command>
</PopoverContent>
</Popover>
</div> </div>
</div> </div>

View File

@ -31,13 +31,13 @@ const ListToolbar = () => {
<KeenIcon icon="filter" /> <KeenIcon icon="filter" />
</Button> </Button>
</DefaultTooltip> </DefaultTooltip>
<Button {/* <Button
variant="outline" variant="outline"
className="h-7.5 text-[0.8rem]" className="h-7.5 text-[0.8rem]"
onClick={() => handleSearchDialog(true)} onClick={() => handleSearchDialog(true)}
> >
Search Sucos Search Sucos
</Button> </Button> */}
</div> </div>
<div className="flex gap-3 items-center"> <div className="flex gap-3 items-center">
<Button <Button

View File

@ -150,7 +150,7 @@ const ManageAldeiasContextProvider = ({ children }: { children: React.ReactNode
order_direction: sorting[0].desc == false ? 'ASC' : 'DESC', order_direction: sorting[0].desc == false ? 'ASC' : 'DESC',
filter: JSON.stringify(filter) filter: JSON.stringify(filter)
}); });
console.log(response?.data); // console.log(response?.data);
setAldeias(response?.data.list); setAldeias(response?.data.list);
return { data: response?.data.list, totalCount: response?.data.total_count }; return { data: response?.data.list, totalCount: response?.data.total_count };
} catch (error) { } catch (error) {

View File

@ -33,13 +33,13 @@ const ListToolbar = () => {
<KeenIcon icon="filter" /> <KeenIcon icon="filter" />
</Button> </Button>
</DefaultTooltip> </DefaultTooltip>
<Button {/* <Button
variant="outline" variant="outline"
className="h-7.5 text-[0.8rem]" className="h-7.5 text-[0.8rem]"
onClick={() => handleSearchDialog(true)} onClick={() => handleSearchDialog(true)}
> >
Search Sucos Search Sucos
</Button> </Button> */}
</div> </div>
<div className="flex gap-3 items-center"> <div className="flex gap-3 items-center">
<Button <Button