| @@ -48,8 +48,7 @@ | |||
| </head> | |||
| <body class="sidebar-collapse layout-top-nav" data-new-gr-c-s-check-loaded="14.1020.0" data-gr-ext-installed="" style="height: auto;"> | |||
| <noscript>You need to enable JavaScript to run this app.</noscript> | |||
| <div class="wrapper"> | |||
| <div id="root"></div> | |||
| <div id="root" class="wrapper"> | |||
| </div> | |||
| <!-- | |||
| This HTML file is a template. | |||
| @@ -20,7 +20,7 @@ import ErrorPage from './pages/ErrorPages/ErrorPage'; | |||
| //import PrivateRoute from './components/Router/PrivateRoute'; | |||
| const AppRoutes = () => ( | |||
| <div className="container content"> | |||
| <div> | |||
| <Switch> | |||
| <Route exact path={BASE_PAGE} component={HomePage} /> | |||
| <Route exact path={HOME_PAGE} component={HomePage} /> | |||
| @@ -1,6 +1,5 @@ | |||
| import React from 'react'; | |||
| import PropTypes from 'prop-types'; | |||
| import getHours from '../../helpers/GetTodaysWorkingHours'; | |||
| import CardPrice from '../CardPrice/CardPrice'; | |||
| import './CardApartments.scss'; | |||
| @@ -76,10 +75,8 @@ const CardApartments = ({result, index}) => { | |||
| </div> | |||
| </div> | |||
| <div className="col-md-8"> | |||
| {result.name !== undefined ? <h2><a>{result.name} | |||
| </a> | |||
| {result.contact != undefined && result.contact.officeHours && getHours(result.contact.officeHours) !== null ? <span className="text-black-50 text-sm"><i className="fas fa-clock"></i> Open { getHours(result.contact.officeHours)} Today</span>: '' } | |||
| {result.name !== undefined ? <h2><a href={result.url}>{result.name} | |||
| </a> <span className="text-black-50 text-sm"><i className="fas fa-clock"></i> {result.contact.todayHours}</span> | |||
| </h2>: ''} | |||
| {result.address != undefined ? | |||
| <p className="lead"> | |||
| @@ -98,13 +95,12 @@ const CardApartments = ({result, index}) => { | |||
| {result.description !== undefined ? result.description.substr(0,100) + "..." : ''} | |||
| </p> | |||
| <div className="row"> | |||
| <div className="col-md-8"> | |||
| <div className="col-md-9"> | |||
| <div className="row"> | |||
| <div className="col"> | |||
| { | |||
| result.features.map((feature, i) => <p key={i} className="badge badge-primary">{feature}</p>) | |||
| result.features.slice(0, 8).map((feature, i) => <p key={i} className="badge badge-primary ml-1">{feature}</p>) | |||
| } | |||
| </div> | |||
| </div> | |||
| <div className="row"> | |||
| @@ -2,42 +2,45 @@ import React from 'react'; | |||
| import PropTypes from 'prop-types'; | |||
| import { useTranslation } from 'react-i18next'; | |||
| import ScrappeStatus from '../../components/ScrapeRequest/ScrappeStatus' | |||
| const ScrappeDetails = ({details}) => { | |||
| const {t} = useTranslation(); | |||
| const ScrappeDetails = ({ details }) => { | |||
| const { t } = useTranslation(); | |||
| return ( | |||
| (details) ? | |||
| <section> | |||
| <h2>Scrappe Details</h2> | |||
| <br/> | |||
| <div className="row"> | |||
| <div className="com-md-4"> | |||
| { | |||
| (details.location) ? | |||
| <h3>{details.location}</h3> | |||
| : ''} | |||
| { | |||
| (details.estimate) ? | |||
| <span className="text-muted">{t('scrapeRequest.EstimatedTime')} {(new Date(details.estimate)).toLocaleString()}</span> | |||
| : ''} | |||
| </div> | |||
| <div className="col-md-4"> | |||
| { | |||
| (details.filters && details.filters.length > 0) ? | |||
| <div className="filters-cont"> | |||
| <h3>Filters</h3> | |||
| {details.filters.map((filter,i) => <span className="badge bg-primary m-1" key={i}>{filter.name}:{filter.value}</span>) } | |||
| </div> | |||
| :'' } | |||
| </div> | |||
| <div className="col-md-1"> | |||
| {details.status ? <ScrappeStatus status = {details.status} /> : '' } | |||
| (details) ? | |||
| <div className='container'> | |||
| <div className="row mb-2"> | |||
| <div className="col-sm-10"> | |||
| <h2 className="m-0"> Scrappe <a href={details.sourceUrl} className='text-sm'> {details.sourceUrl} </a></h2> | |||
| <br /> | |||
| <div className="row m-0"> | |||
| <div className="com-md-4"> | |||
| { | |||
| (details.location) ? | |||
| <h3>{details.location}</h3> | |||
| : ''} | |||
| { | |||
| (details.estimate) ? | |||
| <span className="text-muted">{t('scrapeRequest.EstimatedTime')} {(new Date(details.estimate)).toLocaleString()}</span> | |||
| : ''} | |||
| </div> | |||
| <div className="col-md-4"> | |||
| { | |||
| (details.filters && details.filters.length > 0) ? | |||
| <div className="filters-cont"> | |||
| <h3>Filters</h3> | |||
| {details.filters.filter((i) => i.value != null).map((filter, i) => <span className="badge bg-primary m-1" key={i}>{filter.name}: {filter.value}</span>)} | |||
| </div> | |||
| : ''} | |||
| </div> | |||
| <div className="col-md-1"> | |||
| {details.status ? <ScrappeStatus status={details.status} /> : ''} | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </section> | |||
| : '' | |||
| </div> | |||
| </div> | |||
| : '' | |||
| ); | |||
| } | |||
| @@ -33,12 +33,16 @@ const HomePage = () => { | |||
| return ( | |||
| <> | |||
| <h1 className="lead text-center" style={{ fontSize: '80px' }}>{t('scrapeRequests.Columns.Scrape')} </h1> | |||
| <hr></hr> | |||
| <h2 className="lead text-center text-muted" style={{ fontSize: '40px' }}>https://www.apartments.com/</h2> | |||
| <br></br> | |||
| <CreateScrapeRequest handleRequest={handleRequest} /> | |||
| <ScrapeRequests scrappes={scrappes} handleExecute={handleExecute} /> | |||
| <div className='content' > | |||
| <div className="container"> | |||
| <h1 className="lead text-center" style={{ fontSize: '80px' }}>{t('scrapeRequests.Columns.Scrape')} </h1> | |||
| <hr></hr> | |||
| <h2 className="lead text-center text-muted" style={{ fontSize: '40px' }}>https://www.apartments.com/</h2> | |||
| <br></br> | |||
| <CreateScrapeRequest handleRequest={handleRequest} /> | |||
| <ScrapeRequests scrappes={scrappes} handleExecute={handleExecute} /> | |||
| </div> | |||
| </div> | |||
| </> | |||
| ); | |||
| }; | |||
| @@ -10,41 +10,45 @@ const ScrapeResultsPage = ({ location }) => { | |||
| const [scrappeResults, setScrappeResults] = useState() | |||
| const [scrappeDetails, setScrappeDetails] = useState() | |||
| useEffect(() => { | |||
| getByIdScrappe(location.id) | |||
| .then(res => { | |||
| .then(res => { | |||
| setScrappeDetails(res.data) | |||
| if(res.data.status==='done') | |||
| setScrappeResults(res.data.result)}) | |||
| if (res.data.status === 'done') | |||
| setScrappeResults(res.data.result) | |||
| }) | |||
| }, [setScrappeResults]) | |||
| console.log("scrappeDetails", scrappeDetails) | |||
| return ( | |||
| <> | |||
| <nav className="main-header navbar navbar-expand-md navbar-light navbar-white"> | |||
| <div className="container"> | |||
| <Link to="/" className="navbar-brand"> | |||
| <Link to="/" className="navbar-brand"> | |||
| <span className="brand-text font-weight-light">Back to Scrape</span> | |||
| </Link> | |||
| </Link> | |||
| </div> | |||
| </nav> | |||
| <div className='content-wrapper'> | |||
| <div className='content-header'> | |||
| <ScrappeDetails details={scrappeDetails} /> | |||
| </div> | |||
| </nav> | |||
| <ScrappeDetails details = {scrappeDetails} /> | |||
| <div className ='content' > | |||
| <div className="container"> | |||
| <div className="row"> | |||
| {(scrappeResults !== undefined) ? | |||
| scrappeResults.map((result, i) => <ScrappeResult key={i} index={i} type={scrappeDetails.filters.find(el => el.name=="type" && el.value !== null)} result = {result} />) | |||
| :'' | |||
| } | |||
| </div> | |||
| </div> | |||
| <div className='content mt-1' > | |||
| <div className="container"> | |||
| <div className="row"> | |||
| {(scrappeResults !== undefined) ? | |||
| scrappeResults.map((result, i) => <ScrappeResult key={i} index={i} type={scrappeDetails.filters.find(el => el.name == "type" && el.value !== null)} result={result} />) | |||
| : '' | |||
| } | |||
| </div> | |||
| </div> | |||
| </> | |||
| </div> | |||
| </div> | |||
| </> | |||
| ); | |||
| }; | |||