| import React, { useState } from 'react'; | import React, { useState } from 'react'; | ||||
| import Select from 'react-select' | import Select from 'react-select' | ||||
| import { prices, beds, types, lifeStyles } from '../../constants/filters'; | |||||
| import { baths, beds, types, lifeStyles } from '../../constants/filters'; | |||||
| import './CreateScrapeRequest.scss' | import './CreateScrapeRequest.scss' | ||||
| import PropTypes from 'prop-types'; | import PropTypes from 'prop-types'; | ||||
| import { states } from '../../constants/states' | import { states } from '../../constants/states' | ||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| const handleChangePriceType = async selectedOption => { | |||||
| setRequestObject(s => ({ ...s, price: selectedOption.value })) | |||||
| const handleChangeBathType = async selectedOption => { | |||||
| setRequestObject(s => ({ ...s, baths: selectedOption.value })) | |||||
| }; | }; | ||||
| const handleChangeBedType = async selectedOption => { | const handleChangeBedType = async selectedOption => { | ||||
| setRequestObject(s => ({ ...s, beds: selectedOption.value })) | setRequestObject(s => ({ ...s, beds: selectedOption.value })) | ||||
| console.log("requestObject", requestObject) | console.log("requestObject", requestObject) | ||||
| return ( | return ( | ||||
| <div className="card card-primary"> | <div className="card card-primary"> | ||||
| <div className="card-header"> | |||||
| <h3 className="card-title">{t('createScrapeRequest.Title')}</h3> | |||||
| </div> | |||||
| <form > | <form > | ||||
| <div className="card-body"> | <div className="card-body"> | ||||
| <div className="row"> | <div className="row"> | ||||
| <div className="col-md-3"> | |||||
| <div className="col-md-12"> | |||||
| <div className="form-group"> | <div className="form-group"> | ||||
| <input type="text" className="form-control input-field" value={requestObject.description} placeholder={t('createScrapeRequest.DescriptionPlaceholder')} onChange={e => setRequestObject(s => ({ ...s, description: e.target.value }))} /> | <input type="text" className="form-control input-field" value={requestObject.description} placeholder={t('createScrapeRequest.DescriptionPlaceholder')} onChange={e => setRequestObject(s => ({ ...s, description: e.target.value }))} /> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | |||||
| <div className="row"> | |||||
| <div className="col-md-3"> | <div className="col-md-3"> | ||||
| <div className="form-group"> | <div className="form-group"> | ||||
| <Autocomplete | <Autocomplete | ||||
| </div> | </div> | ||||
| <div className="col-md-2"> | <div className="col-md-2"> | ||||
| <div className="form-group"> | <div className="form-group"> | ||||
| <Select options={prices} onChange={handleChangePriceType} placeholder={t('createScrapeRequest.PricePlaceholder')} /> | |||||
| <Select className="cursor-pointer" options={beds} onChange={handleChangeBedType} placeholder={t('createScrapeRequest.BedsPlaceholder')} /> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div className="col-md-2"> | <div className="col-md-2"> | ||||
| <div className="form-group"> | <div className="form-group"> | ||||
| <Select className="cursor-pointer" options={beds} onChange={handleChangeBedType} placeholder={t('createScrapeRequest.BedsPlaceholder')} /> | |||||
| <Select options={baths} onChange={handleChangeBathType} placeholder={t('createScrapeRequest.BathsPlaceholder')} /> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| <div className="col-md-2"> | <div className="col-md-2"> | ||||
| <Select className="cursor-pointer" options={lifeStyles} onChange={handleChangeLifeStyleType} placeholder={t('createScrapeRequest.LifestylePlaceholder')} /> | <Select className="cursor-pointer" options={lifeStyles} onChange={handleChangeLifeStyleType} placeholder={t('createScrapeRequest.LifestylePlaceholder')} /> | ||||
| </div> | </div> | ||||
| <div className="col-md-1"> | <div className="col-md-1"> | ||||
| <button type="button" onClick={() => { handleRequest(requestObject); setRequestObject({ location: '' }) }} className="btn btn-outline-primary cursor-pointer">Request</button> | |||||
| <button type="button" onClick={() => { handleRequest(requestObject); setRequestObject({ location: '', description: '' }) }} className="btn btn-outline-primary cursor-pointer">Request</button> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> |
| import { SCRAPE_RESULTS_PAGE } from '../../constants/pages' | import { SCRAPE_RESULTS_PAGE } from '../../constants/pages' | ||||
| import { Link } from 'react-router-dom'; | import { Link } from 'react-router-dom'; | ||||
| const ScrapeRequest = ({ scrape, index, handleExecute }) => { | |||||
| const ScrapeRequest = ({ scrape, handleExecute }) => { | |||||
| const { t } = useTranslation(); | const { t } = useTranslation(); | ||||
| return ( | return ( | ||||
| <tr> | <tr> | ||||
| <td> | <td> | ||||
| <p> | <p> | ||||
| {console.log(scrape)} | |||||
| {console.log(scrape)} | |||||
| </p><h3><Link to={{ | </p><h3><Link to={{ | ||||
| pathname: SCRAPE_RESULTS_PAGE.replace(':id', scrape._id), | pathname: SCRAPE_RESULTS_PAGE.replace(':id', scrape._id), | ||||
| id: scrape._id | id: scrape._id | ||||
| }}>#{index} {scrape.location}</Link></h3> | |||||
| }} | |||||
| target="_blank" rel="noopener noreferrer">{scrape.description || 'No name given'}</Link></h3> | |||||
| <p> | <p> | ||||
| <a className='text-sm mr-3' href={scrape.sourceUrl}><i className="fas fa-external-link-square-alt"></i> https://www.apartments.com</a> | |||||
| <span className="lead mr-2">Count : <span className='text-info'>{scrape.count}</span></span> | |||||
| { (scrape.startDate !== undefined && scrape.startDate !== null) ? | |||||
| <span className="lead mr-2">Time: <span className="text-info">{(new Date(scrape.startDate)).toLocaleString() } - {(scrape.endDate != undefined && scrape.endDate!==null) ? (new Date(scrape.endDate)).toLocaleString():''}</span> </span> | |||||
| :<span className="lead mr-2">{t('scrapeRequest.EstimatedTime')} <span className='text-info'>{(new Date(scrape.estimate)).toLocaleString()}</span></span> | |||||
| {scrape.location && <span className="mr-2">Location: <span className='text-info'>{scrape.location}</span></span>} | |||||
| <a className='mr-1' href={scrape.sourceUrl} target="_blank" rel="noopener noreferrer"><i className="fas fa-external-link-square-alt"></i> https://www.apartments.com</a> | |||||
| {/* <span className="text-lg">Id: {scrape._id}</span> */} | |||||
| </p> | |||||
| <p> | |||||
| <span className="mr-1">Count: <span className='text-info'>{scrape.count}</span></span> | |||||
| {scrape.createDate && <span className="mr-1">Creation time: <span className='text-info'>{(new Date(scrape.createDate)).toLocaleString()}</span></span>} | |||||
| {(scrape.startDate !== undefined && scrape.startDate !== null) ? | |||||
| <span className="mr-1">Time: <span className="text-info">{(new Date(scrape.startDate)).toLocaleString()} - {(scrape.endDate != undefined && scrape.endDate !== null) ? (new Date(scrape.endDate)).toLocaleString() : ''}</span> </span> | |||||
| : <span className="mr-1">{t('scrapeRequest.EstimatedTime')} <span className='text-info'>{(new Date(scrape.estimate)).toLocaleString()}</span></span> | |||||
| } | } | ||||
| </p> | </p> | ||||
| </td> | </td> | ||||
| <td> | <td> | ||||
| {scrape.filters.map(element => ( | {scrape.filters.map(element => ( | ||||
| element.value && <span key={element.value} className="badge bg-primary m-1">{element.value}</span> | |||||
| element.value && <span key={element.value} className="badge bg-primary m-1"><span>{element.name}:</span> <br></br> <span>{element.name === 'baths' ? element.value + '+' : element.value}</span></span> | |||||
| ))} | ))} | ||||
| </td> | </td> | ||||
| <td> | <td> | ||||
| ScrapeRequest.propTypes = { | ScrapeRequest.propTypes = { | ||||
| scrape: PropTypes.object, | scrape: PropTypes.object, | ||||
| index: PropTypes.number, | |||||
| handleExecute: PropTypes.func | handleExecute: PropTypes.func | ||||
| }; | }; | ||||
| { value: '4+', label: '4+' } | { value: '4+', label: '4+' } | ||||
| ]; | ]; | ||||
| export const baths = [ | |||||
| { value: '1', label: '1+' }, | |||||
| { value: '2', label: '2+' }, | |||||
| { value: '3', label: '3+' } | |||||
| ]; | |||||
| export const types = [ | export const types = [ | ||||
| { value: 'apartments', label: 'apartments' }, | { value: 'apartments', label: 'apartments' }, | ||||
| { value: 'houses', label: 'houses' }, | { value: 'houses', label: 'houses' }, |
| ClientIpAddressIsNullOrEmpty: "Client Ip address is null or empty" | ClientIpAddressIsNullOrEmpty: "Client Ip address is null or empty" | ||||
| }, | }, | ||||
| createScrapeRequest: { | createScrapeRequest: { | ||||
| Title: "Request new scrappe", | |||||
| Title: "Search criteria", | |||||
| LocationPlaceholder: "Location or Point of Interest", | LocationPlaceholder: "Location or Point of Interest", | ||||
| PricePlaceholder: "price", | PricePlaceholder: "price", | ||||
| BathsPlaceholder: "baths", | |||||
| BedsPlaceholder: "beds", | BedsPlaceholder: "beds", | ||||
| LifestylePlaceholder: "lifestyle", | LifestylePlaceholder: "lifestyle", | ||||
| TypePlaceholder: "type", | TypePlaceholder: "type", |
| <h1 className="lead text-center" style={{ fontSize: '80px' }}>{t('scrapeRequests.Columns.Scrape')} </h1> | <h1 className="lead text-center" style={{ fontSize: '80px' }}>{t('scrapeRequests.Columns.Scrape')} </h1> | ||||
| <hr></hr> | <hr></hr> | ||||
| {/* <h2 className="lead text-center text-muted" style={{ fontSize: '40px' }}>https://www.apartments.com/</h2> */} | {/* <h2 className="lead text-center text-muted" style={{ fontSize: '40px' }}>https://www.apartments.com/</h2> */} | ||||
| <Select className="cursor-pointer" isDisabled defaultValue={scrapeFrom[0]} options={scrapeFrom}></Select> | |||||
| <Select className="cursor-pointer" defaultValue={scrapeFrom[0]} options={scrapeFrom}></Select> | |||||
| <br></br> | <br></br> | ||||
| <CreateScrapeRequest handleRequest={handleRequest} /> | <CreateScrapeRequest handleRequest={handleRequest} /> | ||||
| <ScrapeRequests scrappes={scrappes} handleExecute={handleExecute} /> | <ScrapeRequests scrappes={scrappes} handleExecute={handleExecute} /> |