170 lines
6.4 KiB
JavaScript
Executable File
170 lines
6.4 KiB
JavaScript
Executable File
import { useState, useRef } from 'react';
|
|
import EditableMediaService from '../../services/editable-media-service'
|
|
import {
|
|
Card,
|
|
CardImg,
|
|
CardTitle,
|
|
CardText,
|
|
CardBody,
|
|
Input, InputGroup, InputGroupText, FormFeedback, Button, ButtonGroup
|
|
} from 'reactstrap';
|
|
import { Link } from 'react-router-dom';
|
|
import ModalComponent from './modal-component';
|
|
|
|
function CardListViewer(props) {
|
|
|
|
const [nameFieldInvalid, setNameFieldInvalid] = useState(false)
|
|
const [descriptionFieldInvalid, setDescriptionFieldInvalid] = useState(false)
|
|
const [taglineFieldInvalid, setTaglineFieldInvalid] = useState(false)
|
|
const [modal, setModal] = useState(false);
|
|
const [modalText, setModalText] = useState(false);
|
|
const [modalTitle, setModalTitle] = useState(false);
|
|
|
|
const toggle = () => setModal(!modal);
|
|
|
|
const nameField = useRef(null)
|
|
const descriptionField = useRef(null)
|
|
const taglineField = useRef(null)
|
|
|
|
const handleInputUpdate = (elementValue, fieldType) => {
|
|
if (fieldType === 'nameField'){
|
|
if (elementValue === '')
|
|
setNameFieldInvalid(true)
|
|
else
|
|
setNameFieldInvalid(false)
|
|
}
|
|
if (fieldType === 'descriptionField'){
|
|
if (elementValue === '')
|
|
setDescriptionFieldInvalid(true)
|
|
else
|
|
setDescriptionFieldInvalid(false)
|
|
}
|
|
if (fieldType === 'taglineField'){
|
|
if (elementValue === '')
|
|
setTaglineFieldInvalid(true)
|
|
else
|
|
setTaglineFieldInvalid(false)
|
|
}
|
|
props.addToIdsToUpdate({
|
|
'id': props.id,
|
|
'name': nameField.current.value,
|
|
'featuredBlog': '',
|
|
'description': descriptionField.current.value,
|
|
'tagLine': taglineField.current.value,
|
|
})
|
|
}
|
|
|
|
const showModal = () => {
|
|
setModalTitle('Confirm')
|
|
setModalText('Are you sure that you wish to delete this category?')
|
|
toggle()
|
|
}
|
|
|
|
const deleteResource = () => {
|
|
props.deleteResource(props.id)
|
|
toggle()
|
|
}
|
|
|
|
const itemObject = props.itemObject
|
|
|
|
if (props.totalItems > 0 && itemObject && Object.keys(itemObject).length !== 0){
|
|
if (props.resourceType === 'categories')
|
|
return (
|
|
<>
|
|
<ModalComponent modalText={modalText} modalTitle={modalTitle} modal={modal} toggle={toggle} confirmAction={deleteResource}/>
|
|
<Card outline className={`my-2 ${props.borderColor} ${props.bgColor}`} style={{'width': props.cardType === 'smallCard' ? '18rem': '100%'}}>
|
|
<CardBody>
|
|
<CardTitle className={`mb-3 ${props.textColor}`} tag='h5'>
|
|
<InputGroup>
|
|
<InputGroupText>
|
|
Name
|
|
</InputGroupText>
|
|
<Input defaultValue={itemObject.name} invalid={nameFieldInvalid} innerRef={nameField} onChange={() => handleInputUpdate(nameField.current.value, 'nameField')}/>
|
|
{nameFieldInvalid ? <FormFeedback tooltip className='mt-1'>
|
|
This field cannot be empty
|
|
</FormFeedback>:''}
|
|
</InputGroup>
|
|
</CardTitle>
|
|
<CardText className={`${props.textColor}`}>
|
|
<InputGroup>
|
|
<InputGroupText>
|
|
Description
|
|
</InputGroupText>
|
|
<Input defaultValue={itemObject.description} invalid={descriptionFieldInvalid} innerRef={descriptionField} onChange={() => handleInputUpdate(descriptionField.current.value, 'descriptionField')}/>
|
|
{descriptionFieldInvalid ? <FormFeedback tooltip className='mt-1'>
|
|
This field cannot be empty
|
|
</FormFeedback>:''}
|
|
</InputGroup>
|
|
</CardText>
|
|
<CardText>
|
|
<small className={`${props.textColor}`}>
|
|
<InputGroup>
|
|
<InputGroupText>
|
|
Tagline
|
|
</InputGroupText>
|
|
<Input defaultValue={itemObject.tagLine} invalid={taglineFieldInvalid} innerRef={taglineField} onChange={() => handleInputUpdate(taglineField.current.value, 'taglineField')} />
|
|
{taglineFieldInvalid ? <FormFeedback tooltip className='mt-1'>
|
|
This field cannot be empty
|
|
</FormFeedback>:''}
|
|
</InputGroup>
|
|
</small>
|
|
</CardText>
|
|
<CardText>
|
|
<Link className={`${props.textColor}`} to={`/${props.resourceType}/${itemObject.id}`}>
|
|
<Button color='success'>
|
|
Open this resource
|
|
</Button>
|
|
</Link>
|
|
<Button color='danger' onClick={() => showModal()} className='m-2'>Delete Category</Button>
|
|
</CardText>
|
|
</CardBody>
|
|
</Card>
|
|
</>
|
|
)
|
|
else
|
|
return (
|
|
<Card outline className={`my-2 ${props.borderColor} ${props.bgColor}`} style={{'width': props.cardType === 'smallCard' ? '18rem': '100%'}}>
|
|
{itemObject.coverImage !== '' ? <CardImg src={EditableMediaService.getMedia(itemObject.coverImage)} style={{ 'height': '180px', 'objectFit': 'cover' }} top width='100%' /> : ''}
|
|
<CardBody>
|
|
<Link to={`/${props.resourceType}/${itemObject.id}`}>
|
|
<CardTitle className={`${props.textColor}`} tag='h3'>
|
|
{itemObject.name}
|
|
</CardTitle>
|
|
<CardText className={`${props.textColor}`} tag='h5'>
|
|
{itemObject.description}
|
|
</CardText>
|
|
<CardText tag='h6'>
|
|
<small className={`${props.textColor}`}>
|
|
{itemObject.tagLine}
|
|
</small>
|
|
</CardText>
|
|
</Link>
|
|
</CardBody>
|
|
{
|
|
props.showSetFeaturedBlog ?
|
|
<ButtonGroup>
|
|
<Button
|
|
outline
|
|
active={itemObject.id === props.featuredBlog}
|
|
color={props.buttonColor}
|
|
onClick={() => props.updateFeaturedBlog(itemObject.id)}
|
|
>
|
|
Set this as featured
|
|
</Button>
|
|
<Button
|
|
outline
|
|
color={props.buttonColor}
|
|
onClick={() => props.updateFeaturedBlog('')}
|
|
>
|
|
Unset featured blog
|
|
</Button>
|
|
</ButtonGroup> : ''
|
|
}
|
|
</Card>
|
|
)
|
|
}
|
|
else
|
|
return(<h3 className={`${props.textColor}`}>No items found in this section</h3>)
|
|
}
|
|
|
|
export default CardListViewer |