Merge branch 'add-steps-to-wizard' into 'master'

Add steps to wizard

See merge request saburly/marketalarm/web!6
This commit was merged in pull request #6.
This commit is contained in:
Nedim Uka
2019-05-21 09:39:43 +00:00
22 changed files with 550 additions and 18 deletions

View File

@@ -0,0 +1,23 @@
const { currentRERequest } = require('../helpers/url');
const { gardenSizes } = require('../helpers/enums');
const getGardenSize = (req,res) => {
const nextStep = req.query.nextStep;
res.render('gardenSize', {
nextStep,
gardenSizes
});
};
const postGardenSize = async (req, res) => {
const request = await currentRERequest(req);
const nextStep = req.query.nextStep || `/cijena/${request.uniqueId}`;
request.gardenSize = req.body.gardensize;
await request.save();
res.redirect(nextStep);
};
module.exports = {
getGardenSize,
postGardenSize
};

View File

@@ -0,0 +1,7 @@
const getGoAgain = async (req,res) => {
res.render('goAgain');
};
module.exports = {
getGoAgain
};

View File

@@ -1,4 +1,4 @@
const { currentRERequest } = require('../helpers/url');
const { currentRERequest } = require('../helpers/url');
const { getMunicipalitiesForRegion } = require('../helpers/codes');
const getMunicipality = async (req,res) => {
@@ -12,10 +12,11 @@ const getMunicipality = async (req,res) => {
};
const postMunicipality = async (req, res) => {
let request = await currentRERequest(req);
const request = await currentRERequest(req);
const nextStep = req.query.nextStep || `/povrsina/${request.uniqueId}`;
request.municipality = req.body.municipality;
await request.save();
res.send("Result is " + JSON.stringify(request));
res.redirect(nextStep);
};
module.exports = {

23
app/controllers/prices.js Normal file
View File

@@ -0,0 +1,23 @@
const { currentRERequest } = require('../helpers/url');
const { prices } = require('../helpers/enums');
const getPrice = (req,res) => {
const nextStep = req.query.nextStep;
res.render('price', {
nextStep,
prices
});
};
const postPrice = async (req, res) => {
const request = await currentRERequest(req);
const nextStep = req.query.nextStep || `/pregled/${request.uniqueId}`;
request.price = req.body.price;
await request.save();
res.redirect(nextStep);
};
module.exports = {
getPrice,
postPrice
};

View File

@@ -0,0 +1,73 @@
const { currentRERequest } = require('../helpers/url');
const { getRegionName, getMunicipalityName } = require('../helpers/codes');
const { realEstateTypes, sizes, gardenSizes, prices, getEnumTypeTitle } = require('../helpers/enums');
const getQueryReview = async (req,res) => {
const request = await currentRERequest(req);
const nextStep = req.query.nextStep;
if (!request || !request.dataValues) {
return null;
}
const { realEstateType, region, municipality, size, gardenSize, price } = request.dataValues;
const realEstateTypeTitle = realEstateType ? getEnumTypeTitle(realEstateTypes, realEstateType) : null;
const regionName = region ? getRegionName(region) : null;
const municipalityName = (region && municipality) ? getMunicipalityName(region, municipality) : null;
const sizeTitle = size ? getEnumTypeTitle(sizes, size) : null;
const gardenSizeTitle = gardenSize ? getEnumTypeTitle(gardenSizes, gardenSize) : null;
const priceTitle = price ? getEnumTypeTitle(prices, price) : null;
const uniqueId = request.dataValues.uniqueId ? request.dataValues.uniqueId : '';
const queryData = [
{
id: 'realEstateType',
title: realEstateTypeTitle,
url: `/vrstanekretnine/${uniqueId}`,
},
{
id: 'region',
title: regionName,
url: `/region/${uniqueId}`,
},
{
id: 'municipality',
title: municipalityName,
url: `/mjesto/${uniqueId}`,
},
{
id: 'size',
title: sizeTitle,
url: `/povrsina/${uniqueId}`,
},
{
id: 'gardenSize',
title: gardenSizeTitle,
url: `/okucnica/${uniqueId}`,
},
{
id: 'price',
title: priceTitle,
url: `/cijena/${uniqueId}`
}
];
res.render('queryReview', {
nextStep,
queryData,
});
};
const postQueryReview = async (req, res) => {
const request = await currentRERequest(req);
const nextStep = req.query.nextStep || `/posalji/${request.uniqueId}`;
res.redirect(nextStep);
};
module.exports = {
getQueryReview,
postQueryReview
};

View File

@@ -0,0 +1,23 @@
const { currentRERequest } = require('../helpers/url');
const getQuerySubmit = async (req,res) => {
const nextStep = req.query.nextStep;
res.render('querySubmit', {
nextStep
});
};
const postQuerySubmit = async (req, res) => {
const request = await currentRERequest(req);
const nextStep = req.query.nextStep || '/ponovo';
//TODO: validate email
request.email = req.body.email;
await request.save();
res.redirect(nextStep);
};
module.exports = {
getQuerySubmit,
postQuerySubmit
};

View File

@@ -1,10 +1,5 @@
const db = require('../models/index');
const realEstateTypes = [
{ ime: "Kuća", id: "kuca" },
{ ime: "Stan", id: "stan" },
{ ime: "Vikendica", id: "vikendica" }
];
const { realEstateTypes } = require('../helpers/enums');
const getRealEstateTypes = (req,res) => {
const nextStep = req.query.nextStep;

23
app/controllers/sizes.js Normal file
View File

@@ -0,0 +1,23 @@
const { currentRERequest } = require('../helpers/url');
const { sizes } = require('../helpers/enums');
const getSize = (req,res) => {
const nextStep = req.query.nextStep;
res.render('size', {
nextStep,
sizes
});
};
const postSize = async (req, res) => {
const request = await currentRERequest(req);
const nextStep = req.query.nextStep || `/okucnica/${request.uniqueId}`;
request.size = req.body.size;
await request.save();
res.redirect(nextStep);
};
module.exports = {
getSize,
postSize
};

View File

@@ -876,16 +876,37 @@ const getRegions = () => {
return regions.map( (g) => ({ name: g.name, id: g.id, olxid: g.olxid }) );
};
const getRegion = (regionId) => {
return regions.find(region => region.id === regionId);
};
const getRegionName = (regionId) => {
const region = getRegion(regionId);
return (region && region.name) ? region.name : null;
};
const getMunicipalitiesForRegion = (regionId) => {
for (geo of regions) {
if(geo.id === regionId) {
return geo.municipalities;
}
}
return null;
const region = getRegion(regionId);
return (region && region.municipalities) ? region.municipalities : null;
};
const getMunicipalityName = (regionId, municipalityId) => {
const region = getRegion(regionId);
if (!region){
return null;
}
const municipality = region.municipalities.find(municipality => municipality.id === municipalityId);
if (!municipality) {
return null;
}
return municipality.name;
};
module.exports = {
getRegions,
getMunicipalitiesForRegion
getRegionName,
getMunicipalitiesForRegion,
getMunicipalityName,
};

48
app/helpers/enums.js Normal file
View File

@@ -0,0 +1,48 @@
const realEstateTypes = [
{ title: "Kuća", id: "kuca" },
{ title: "Stan", id: "stan" },
{ title: "Vikendica", id: "vikendica" }
];
const sizes = [
{ title: "do 50 m2", id: "50m2" },
{ title: "do 75 m2", id: "75m2" },
{ title: "do 100 m2", id: "100m2" },
{ title: "do 150 m2", id: "150m2" },
{ title: "do 200 m2", id: "200m2" },
{ title: "preko 200 m2", id: "moreThan200m2" }
];
const gardenSizes = [
{ title: "do 100 m2", id: "100m2" },
{ title: "do 500 m2", id: "500m2" },
{ title: "do 1 dunum", id: "1000m2" },
{ title: "do 2 dunuma", id: "2000m2" },
{ title: "do 3 dunuma", id: "3000m2" },
{ title: "preko 3 dunuma", id: "moreThan3000m2" }
];
const prices = [
{ title: "do 50 000 KM", id: "50kKM" },
{ title: "do 100 000 KM", id: "100kKM" },
{ title: "do 150 000 KM", id: "150kKM" },
{ title: "do 200 000 KM", id: "200kKM" },
{ title: "do 250 000 KM", id: "250kKM" },
{ title: "preko 250 000 KM", id: "moreThan250kKM" }
];
const getEnumTypeTitle = (enumType, enumId) => {
const enumObject = enumType.find(enumValue => enumValue.id === enumId);
if (!enumObject){
return null;
}
return enumObject.title;
};
module.exports = {
realEstateTypes,
sizes,
gardenSizes,
prices,
getEnumTypeTitle,
};

View File

@@ -0,0 +1,21 @@
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn(
'RealEstateRequests',
'size',
{
type: Sequelize.ENUM,
values: ['50m2', '75m2', '100m2', '150m2', '200m2', 'moreThan200m2']
}
);
},
down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn(
'RealEstateRequests',
'size'
);
}
};

View File

@@ -0,0 +1,21 @@
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn(
'RealEstateRequests',
'gardenSize',
{
type: Sequelize.ENUM,
values: ['100m2', '500m2', '1000m2', '2000m2', '3000m2', 'moreThan3000m2']
}
);
},
down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn(
'RealEstateRequests',
'gardenSize'
);
}
};

View File

@@ -0,0 +1,21 @@
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn(
'RealEstateRequests',
'price',
{
type: Sequelize.ENUM,
values: ['50kKM', '100kKM', '150kKM', '200kKM', '250kKM', 'moreThan250kKM']
}
);
},
down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn(
'RealEstateRequests',
'price'
);
}
};

View File

@@ -1,5 +1,13 @@
'use strict';
const {realEstateTypes, sizes, gardenSizes, prices } = require('../helpers/enums');
module.exports = (sequelize, DataTypes) => {
const realEstateTypeValues = realEstateTypes.map(realEstateType => realEstateType.id);
const sizeValues = sizes.map(size => size.id);
const gardenSizeValues = gardenSizes.map(gardenSize => gardenSize.id);
const priceValues = prices.map(price => price.id);
const RealEstateRequest = sequelize.define('RealEstateRequest', {
uniqueId: {
type: DataTypes.UUID,
@@ -8,11 +16,23 @@ module.exports = (sequelize, DataTypes) => {
},
realEstateType: {
type: DataTypes.ENUM,
values: ['kuca','stan','vikendica','plac','poslovni_prostor','apartman','garaza']
values: realEstateTypeValues,
},
email: DataTypes.STRING,
region: DataTypes.STRING,
municipality: DataTypes.STRING,
size: {
type: DataTypes.ENUM,
values: sizeValues,
},
gardenSize: {
type: DataTypes.ENUM,
values: gardenSizeValues,
},
price: {
type: DataTypes.ENUM,
values: priceValues,
}
}, {});
RealEstateRequest.associate = function(models) {
// associations can be defined here

32
app/views/gardenSize.ejs Normal file
View File

@@ -0,0 +1,32 @@
<!--suppress HtmlUnknownAnchorTarget -->
<div class="row center-align">
<h2>Koliko okućnice tražite ?</h2>
</div>
<form method="POST" id="form-gardensize">
<div class="row center-align">
<ul class="collection with-header">
<% for(const gardenSize of gardenSizes) { %>
<li class="collection-item" >
<div id="<%= gardenSize.id %>" ><%= gardenSize.title %>
<a href="#!" class="secondary-content">
<i class="material-icons">send</i>
</a>
</div>
</li>
<% } %>
</ul>
<input type="hidden" name="gardensize" id="gardensize" />
</div>
</form>
<script>
$(document).ready( () => {
$(".collection-item").click( (e) => {
const clickedId = $(e.target).attr("id");
$("#gardensize").val(clickedId);
$("#form-gardensize").submit();
});
});
</script>

25
app/views/goAgain.ejs Normal file
View File

@@ -0,0 +1,25 @@
<!--suppress HtmlUnknownAnchorTarget -->
<div class="row center-align">
<h4>Provjerite Vaš email !</h4>
</div>
<div class="row center-align">
<h4>Želite li pretražiti još jednu nekretninu ?</h4>
</div>
<form method="POST" id="form-goagain">
<div class="row">
<div class="col s3 push-s3">
<a href="/" class="welcome-center-button waves-effect waves-light btn">
Da
</a>
</div>
<div class="col s3 push-s3">
<a href="/" class="welcome-center-button waves-effect waves-light btn">
Ne
</a>
</div>
</div>
</form>

32
app/views/price.ejs Normal file
View File

@@ -0,0 +1,32 @@
<!--suppress HtmlUnknownAnchorTarget -->
<div class="row center-align">
<h2>Koja Vam okvirna cijena odgovara ?</h2>
</div>
<form method="POST" id="form-price">
<div class="row center-align">
<ul class="collection with-header">
<% for(const price of prices) { %>
<li class="collection-item" >
<div id="<%= price.id %>" ><%= price.title %>
<a href="#!" class="secondary-content">
<i class="material-icons">send</i>
</a>
</div>
</li>
<% } %>
</ul>
<input type="hidden" name="price" id="price" />
</div>
</form>
<script>
$(document).ready( () => {
$(".collection-item").click( (e) => {
const clickedId = $(e.target).attr("id");
$("#price").val(clickedId);
$("#form-price").submit();
});
});
</script>

36
app/views/queryReview.ejs Normal file
View File

@@ -0,0 +1,36 @@
<!--suppress HtmlUnknownAnchorTarget -->
<div class="row center-align">
<h2>Da li je ovo to što ste tražili ?</h2>
</div>
<form method="POST" id="form-queryreview">
<div class="row center-align">
<ul class="collection with-header">
<% for(const stepData of queryData) { %>
<li class="collection-item" >
<div id="<%= stepData.id %>" ><%= stepData.title || '-' %>
<a href="<%= stepData.url %>" class="secondary-content">
<i class="material-icons">edit</i>
</a>
</div>
</li>
<% } %>
</ul>
</div>
<div class="row">
<div class="col s6 push-s3">
<a id="submit" href="#" class="welcome-center-button waves-effect waves-light btn">
To je to
</a>
</div>
</div>
</form>
<script>
$(document).ready( () => {
$("#submit").click( () => {
$("#form-queryreview").submit();
});
});
</script>

33
app/views/querySubmit.ejs Normal file
View File

@@ -0,0 +1,33 @@
<!--suppress HtmlUnknownAnchorTarget -->
<div class="row center-align">
<h4>Da Vam javimo kada se Vaša željena nekretnina pojavi u oglasima, upišite svoj e-mail</h4>
</div>
<form method="POST" id="form-submitquery">
<div class="row center-align">
<div class="col s6 push-s3">
<input id="email" name="email" type="email" placeholder="vas.email@mail.com"/>
</div>
</div>
<div class="row">
<div class="col s6 push-s3">
<a id="submit" href="#" class="welcome-center-button waves-effect waves-light btn">
Javi mi
</a>
</div>
</div>
<div class="row">
<div class="col s6 push-s3">
<p>* U svakom trenutku možete prekinuti slanje objava kroz link u e-mailu</p>
</div>
</div>
</form>
<script>
$(document).ready( () => {
$("#submit").click( () => {
$("#form-submitquery").submit();
});
});
</script>

View File

@@ -8,7 +8,7 @@
<ul class="collection with-header">
<% for(const realEstatetype of realEstateTypes) { %>
<li class="collection-item" >
<div id="<%= realEstatetype.id %>" ><%= realEstatetype.ime %>
<div id="<%= realEstatetype.id %>" ><%= realEstatetype.title %>
<a href="#!" class="secondary-content">
<i class="material-icons">send</i>
</a>

32
app/views/size.ejs Normal file
View File

@@ -0,0 +1,32 @@
<!--suppress HtmlUnknownAnchorTarget -->
<div class="row center-align">
<h2>Do koliko kvadrata tražite nekretninu ?</h2>
</div>
<form method="POST" id="form-size">
<div class="row center-align">
<ul class="collection with-header">
<% for(const size of sizes) { %>
<li class="collection-item" >
<div id="<%= size.id %>" ><%= size.title %>
<a href="#!" class="secondary-content">
<i class="material-icons">send</i>
</a>
</div>
</li>
<% } %>
</ul>
<input type="hidden" name="size" id="size" />
</div>
</form>
<script>
$(document).ready( () => {
$(".collection-item").click( (e) => {
const clickedId = $(e.target).attr("id");
$("#size").val(clickedId);
$("#form-size").submit();
});
});
</script>

View File

@@ -2,6 +2,12 @@ const welcome = require('./app/controllers/welcome').getWelcome;
const { getRealEstateTypes, postRealEstateTypes} = require('./app/controllers/realEstateTypes');
const { getRegion, postRegion } = require('./app/controllers/regions');
const { getMunicipality, postMunicipality } = require('./app/controllers/municipalities');
const { getSize, postSize } = require('./app/controllers/sizes');
const { getGardenSize, postGardenSize } = require('./app/controllers/gardenSizes');
const { getPrice, postPrice } = require('./app/controllers/prices');
const { getQueryReview, postQueryReview } = require('./app/controllers/queryReview');
const { getQuerySubmit, postQuerySubmit } = require('./app/controllers/querySubmit');
const { getGoAgain } = require('./app/controllers/goAgain');
let express = require("express");
const path = require("path");
@@ -121,6 +127,22 @@ app.post('/grad/:request_id', postRegion);
app.get('/mjesto/:request_id', getMunicipality);
app.post('/mjesto/:request_id', postMunicipality);
app.get('/povrsina/:request_id', getSize);
app.post('/povrsina/:request_id', postSize);
app.get('/okucnica/:request_id', getGardenSize);
app.post('/okucnica/:request_id', postGardenSize);
app.get('/cijena/:request_id', getPrice);
app.post('/cijena/:request_id', postPrice);
app.get('/pregled/:request_id', getQueryReview);
app.post('/pregled/:request_id', postQueryReview);
app.get('/posalji/:request_id', getQuerySubmit);
app.post('/posalji/:request_id', postQuerySubmit);
app.get('/ponovo', getGoAgain);
app.use('/assets', express.static('./app/public'));