frontend_adaptive_learning/src/roles/admin/manage_section/views/ManageSections.jsx

306 lines
19 KiB
JavaScript

import React, { useState } from 'react';
import { Table, Row, Col, Nav, Tab, Button, Form, InputGroup, Dropdown, DropdownButton, Modal, Spinner } from 'react-bootstrap';
import useSections from '../hooks/useSections';
import ModalOperation from '../../../../components/ui/adminMessageModal/ModalOperation';
import TablePaginate from '../../../../components/ui/TablePaginate';
const ManageSections = () => {
const {
sections,
selectedImage,
loading,
error,
selectedSection,
formData,
show,
showLoader,
loaderState,
createSection,
editSection,
deleteSection,
handleFormChange,
handleImageChange,
resetForm,
handleShow,
handleClose,
handleShowLoader,
handleCloseLoader,
setLoaderState,
thumbPath,
page,
totalData,
totalPages,
setSearch,
handlePageChange,
handleLimitsChange,
handleSerachChange
} = useSections();
return (
<div className='admin-teachers'>
<h2 className='page-title strip'>Sections</h2>
<p className='page-desc'>Description of Sectionss.</p>
<Tab.Container id="left-tabs-example" defaultActiveKey="detail" onSelect={resetForm}>
<Row className='mb-45'>
<Col xs={12}>
<Nav variant="pills" className='col-tabs'>
<Nav.Item>
<Nav.Link eventKey="detail">View Entries</Nav.Link>
</Nav.Item>
<Nav.Item>
<Nav.Link eventKey="create">Create Data</Nav.Link>
</Nav.Item>
</Nav>
</Col>
</Row>
<Row className='mb-45'>
<Col xs={12} className='col-tabs-content'>
<Tab.Content>
<Tab.Pane eventKey="detail">
<div className="cards">
<div className="cards-title">
<h4>Section List</h4>
</div>
<div className="cards-body">
<Form className="mb-3 d-flex align-items-strech" onSubmit={(e) => { e.preventDefault(); handleSerachChange(); }}>
<Form.Control type='search'
aria-label="Large"
aria-describedby="inputGroup-sizing-sm"
placeholder='Search'
className='table-input-search mb-0 me-2 rounded-3'
onChange={(e) => { setSearch(e.target.value); }}
/>
<Button type='submit' variant='blue rounded-3'>Search</Button>
</Form>
<Table hover>
<thead>
<tr>
<th>No</th>
<th>Section</th>
<th>Section Description</th>
<th className='text-center'>Action</th>
</tr>
</thead>
<tbody>
{loading?(
<tr>
<td colSpan={5} style={{height:"20vh"}}>
<Spinner animation="grow" variant="primary" />
<Spinner animation="grow" variant="secondary" />
<Spinner animation="grow" variant="success" />
<Spinner animation="grow" variant="danger" />
<Spinner animation="grow" variant="warning" />
<Spinner animation="grow" variant="info" />
</td>
</tr>
):(
sections.length > 0 ?(
sections.map((section, index) => (
<tr key={section.ID_SECTION}>
<td>{index + 1}</td>
<td>{section.NAME_SECTION}</td>
<td>{section.DESCRIPTION_SECTION}</td>
<td className='text-center action-col'>
<Button size='sm' className='btn-edit' onClick={() => handleShow(section)}>
<i className="bi bi-pencil-square"></i>
</Button>
<Button size='sm' className='btn-delete' onClick={() => deleteSection(section.ID_SECTION)}>
<i className="bi bi-trash3"></i>
</Button>
</td>
</tr>
))
):(
<tr>
<td colSpan={5} style={{height:'20vh'}}>
<h3>Empty Data</h3>
</td>
</tr>
)
)}
</tbody>
</Table>
<div className="mt-2 w-100 d-flex justify-content-between align-items-center">
<div className='d-flex align-items-center'>
<small className="me-2">Item per page</small>
<Form.Select
size='sm'
className='py-0 px-1 me-2'
aria-label="Default select example"
defaultValue='7'
onChange={handleLimitsChange}
style={{ width: '50px' }}
>
<option value="7">7</option>
<option value="10">10</option>
<option value="20">20</option>
</Form.Select>
<small>of {totalData}</small>
</div>
<TablePaginate
totalPages={totalPages}
currentPage={page}
onPageChange={handlePageChange}
/>
</div>
</div>
</div>
</Tab.Pane>
<Tab.Pane eventKey="create">
<div className="cards">
<div className="cards-title">
<h4>Add Student Data</h4>
</div>
<div className="cards-body">
<Form onSubmit={(e) => { e.preventDefault(); createSection(); }}>
<Row className="mb-2">
<Form.Group as={Col} controlId="formGridName">
<Form.Label>Section Name<sup className='text-red fw-bold'>*</sup></Form.Label>
<InputGroup className="mb-2 input-group-icon">
<InputGroup.Text id="basic-addon1"><i className="bi bi-book"></i></InputGroup.Text>
<Form.Control
placeholder="Enter Section Name"
name="sectionName"
value={formData.sectionName || ''}
onChange={handleFormChange}
/>
</InputGroup>
</Form.Group>
</Row>
<Row className="mb-2">
<Form.Group as={Col} controlId="formGridDescription">
<Form.Label>Section Description<sup className='text-red fw-bold'>*</sup></Form.Label>
<Form.Control
name="description"
className='mb-2'
as="textarea"
rows={3}
placeholder='Type the section description here...'
value={formData.description || ''}
onChange={handleFormChange}
/>
</Form.Group>
</Row>
<Row className="mb-2">
<Form.Group as={Col} controlId="formGridThumbnail" className='mb-3 col-12 col-md-6'>
<Form.Label>Thumbnail<sup className='text-red fw-bold'>*</sup></Form.Label><br/>
<img
src={selectedImage ? URL.createObjectURL(selectedImage) : " "}
alt="thumbnail"
className={`mb-2 ${selectedImage ? "d-block" : "d-none"}`}
style={{width:"30%"}}
/>
<InputGroup className="mb-2 input-group-icon">
<InputGroup.Text id="basic-addon1" className='border-dashed'><i className="bi bi-cloud-arrow-up"></i></InputGroup.Text>
<Form.Control type='file' accept="image/*"
placeholder="Choose Image"
aria-label="fullname"
aria-describedby="basic-addon1"
className='border-dashed'
onChange={handleImageChange}
/>
</InputGroup>
<small>Ensure the file size is no larger than 5 MB</small>
</Form.Group>
</Row>
<div className="d-flex justify-content-end">
<Button variant="outline-blue" type="reset" className='ms-auto py-2 rounded-35' onClick={resetForm}>
reset
</Button>
<Button variant="blue" type="submit" className='ms-2 py-2 px-5 rounded-35'>
Add
</Button>
</div>
</Form>
</div>
</div>
</Tab.Pane>
</Tab.Content>
</Col>
</Row>
</Tab.Container>
<Modal show={show} onHide={handleClose} className='modal-admin' size='lg' centered>
<Modal.Header closeButton>
<Modal.Title>Update Teacher Data</Modal.Title>
</Modal.Header>
<Modal.Body>
<Form onSubmit={(e) => { e.preventDefault(); editSection(); }}>
<Row className="mb-2">
<Form.Label>Thumbnail<sup className='text-red fw-bold'>*</sup></Form.Label>
<Col className='col-12'>
<img
src={selectedImage ? URL.createObjectURL(selectedImage) : formData.thumbnail ? `${thumbPath}${formData.thumbnail}` : " "}
alt="thumbnail"
className='mb-2'
style={{width:"30%"}}
/>
</Col>
<Form.Group as={Col} controlId="updateGridDescription" className='col-12 col-md-6 mb-2'>
<InputGroup className="input-group-icon">
<InputGroup.Text id="basic-addon1" className='border-dashed'><i className="bi bi-cloud-arrow-up"></i></InputGroup.Text>
<Form.Control type='file'
placeholder="Choose Image"
aria-label="fullname"
aria-describedby="basic-addon1"
className='border-dashed'
onChange={handleImageChange}
/>
</InputGroup>
<small>Ensure the file size is no larger than 5 MB</small>
</Form.Group>
</Row>
<Row className="mb-2">
<Form.Group as={Col} controlId="updateGridName" className='col-12 col-md-6'>
<Form.Label>Section Name<sup className='text-red fw-bold'>*</sup></Form.Label>
<InputGroup className="mb-2 input-group-icon">
<InputGroup.Text id="basic-addon1"><i className="bi bi-book"></i></InputGroup.Text>
<Form.Control
placeholder="Enter Section Name"
name="sectionName"
value={formData.sectionName || ''}
onChange={handleFormChange}
/>
</InputGroup>
</Form.Group>
</Row>
<Row className="mb-2">
<Form.Group as={Col} controlId="updateGridThumbnail">
<Form.Label>Section Description<sup className='text-red fw-bold'>*</sup></Form.Label>
<Form.Control
name="description"
className='mb-2'
as="textarea"
rows={3}
placeholder='Type the section description here...'
value={formData.description || ''}
onChange={handleFormChange}
/>
</Form.Group>
</Row>
<div className="d-flex justify-content-end">
<Button variant="blue" type="submit" className='py-2 px-5 w-100 rounded-35'>
Update
</Button>
</div>
</Form>
</Modal.Body>
</Modal>
<ModalOperation
show={showLoader}
handleClose={handleCloseLoader}
title={loaderState.title}
description={loaderState.description}
loading={loaderState.loading}
successMessage={loaderState.successMessage}
confirmAction={loaderState.confirmAction}
handleConfirm={loaderState.handleConfirm}
/>
</div>
);
};
export default ManageSections;