@diagramers/admin
Version:
Diagramers Admin Template - React starter for admin dashboards.
135 lines (121 loc) • 4.65 kB
JavaScript
import React, { useState, useEffect } from 'react';
import { Button, Modal, Form } from 'react-bootstrap';
import CsLineIcons from 'cs-line-icons/CsLineIcons';
import { useSelector, useDispatch } from 'react-redux';
import Select from 'react-select';
import { createTask, updateTask } from '../tasksSlice';
const tagOptions = [
{ value: 'Project', title: 'Project', bg: 'outline-primary', textColor: 'primary' },
{ value: 'Personal', title: 'Personal', bg: 'outline-warning', textColor: 'warning' },
{ value: 'Urgent', title: 'Urgent', bg: 'outline-danger', textColor: 'danger' },
{ value: 'List', title: 'List', bg: 'outline-success', textColor: 'success' },
];
const statusOptions = [
{ value: 'Active', label: 'Active' },
{ value: 'Done', label: 'Done' },
];
const AddEditModal = ({ show, onHide }) => {
const { selectedTask } = useSelector((state) => state.tasks);
const dispatch = useDispatch();
const [currentTask, setCurrentTask] = useState(selectedTask);
const [selectedTags, setSelectedTags] = useState([]);
const [selectedStatus, setSelectedStatus] = useState(statusOptions[0]);
useEffect(() => {
if (selectedTask && selectedTask.tags) {
const currentTaskTags = [];
selectedTask.tags.map((t) => {
currentTaskTags.push(tagOptions.find((x) => x.value === t.title));
return true;
});
setSelectedTags(currentTaskTags);
}
return () => {};
// eslint-disable-next-line
}, []);
useEffect(() => {
if (selectedTask && selectedTask.status) {
setSelectedStatus(statusOptions.find((x) => x.value === selectedTask.status));
}
return () => {};
// eslint-disable-next-line
}, []);
const formatOptionLabel = ({ title, bg, textColor }) => (
<div>
<span className={`align-middle d-inline-block option-circle me-2 rounded-xl bg-${bg}`} />{' '}
<span className={`align-middle d-inline-block lh-1 text-${textColor}`}>{title}</span>
</div>
);
const onChangeTitle = (event) => {
setCurrentTask({ ...currentTask, title: event.currentTarget.value });
};
const onChangeDetail = (event) => {
setCurrentTask({ ...currentTask, detail: event.currentTarget.value });
};
const onChangeTags = (tags) => {
setSelectedTags(tags);
};
const onChangeStatus = (status) => {
setSelectedStatus(status);
};
const onSaveClick = () => {
onHide();
const item = {
...currentTask,
tags: selectedTags.map((x) => ({ title: x.title, bg: x.bg })),
status: selectedStatus.value,
deleted: false,
};
if (selectedTask && selectedTask.id) {
dispatch(updateTask({ item }));
} else {
dispatch(createTask({ item }));
}
};
return (
<Modal className="modal-right" show={show} onHide={onHide}>
<Modal.Header closeButton>
<Modal.Title>{selectedTask ? 'Edit' : 'New Task'}</Modal.Title>
</Modal.Header>
<Modal.Body className="d-flex flex-column">
<div className="mb-3 filled">
<CsLineIcons icon="edit-square" />
<Form.Control type="text" value={currentTask ? currentTask.title : ''} onChange={onChangeTitle} placeholder="Title" />
</div>
<div className="mb-3 filled">
<Form.Control as="textarea" rows="4" value={currentTask ? currentTask.detail : ''} onChange={onChangeDetail} placeholder="Detail" />
<CsLineIcons icon="notebook-1" />
</div>
<div className="mb-3 filled w-100">
<CsLineIcons icon="bookmark" />
<Select
classNamePrefix="react-select"
isClearable={false}
isMulti
options={tagOptions}
value={selectedTags}
formatOptionLabel={formatOptionLabel}
onChange={onChangeTags}
placeholder="Tags"
/>
</div>
<div className="mb-3 filled mb-0 w-100">
<CsLineIcons icon="activity" />
<Select classNamePrefix="react-select" options={statusOptions} value={selectedStatus} onChange={onChangeStatus} placeholder="Status" />
</div>
</Modal.Body>
<Modal.Footer className="border-0">
{selectedTask === null ? (
<Button variant="primary" className="btn-icon btn-icon-end" onClick={onSaveClick}>
<span>Add</span>
<CsLineIcons icon="plus" />
</Button>
) : (
<Button variant="primary" className="btn-icon btn-icon-end" onClick={onSaveClick}>
<span>Save</span> <CsLineIcons icon="check" />
</Button>
)}
</Modal.Footer>
</Modal>
);
};
export default React.memo(AddEditModal);