include new fields for search request
This commit is contained in:
@@ -1,5 +1,10 @@
|
|||||||
const { currentSearchRequest } = require("../helpers/url");
|
const { currentSearchRequest } = require("../helpers/url");
|
||||||
const { AD_CATEGORY, AD_TYPE } = require("../common/enums");
|
const { AD_CATEGORY, AD_TYPE, ACCESS_ROAD_TYPE } = require("../common/enums");
|
||||||
|
const {
|
||||||
|
ADVANCED_BOOLEAN_FILTERS,
|
||||||
|
ADVANCED_SEGMENT_SELECT_FILTERS,
|
||||||
|
ADVANCED_RANGE_FILTERS
|
||||||
|
} = require("../common/filterEnums");
|
||||||
|
|
||||||
const getFilters = async (req, res) => {
|
const getFilters = async (req, res) => {
|
||||||
const searchRequest = await currentSearchRequest(req);
|
const searchRequest = await currentSearchRequest(req);
|
||||||
@@ -19,7 +24,18 @@ const getFilters = async (req, res) => {
|
|||||||
sizeMin,
|
sizeMin,
|
||||||
sizeMax,
|
sizeMax,
|
||||||
gardenSizeMin,
|
gardenSizeMin,
|
||||||
gardenSizeMax
|
gardenSizeMax,
|
||||||
|
numberOfRoomsMin,
|
||||||
|
numberOfRoomsMax,
|
||||||
|
numberOfFloorsMin,
|
||||||
|
numberOfFloorsMax,
|
||||||
|
floorMin,
|
||||||
|
floorMax,
|
||||||
|
includeIncompleteAds,
|
||||||
|
balcony,
|
||||||
|
elevator,
|
||||||
|
newBuilding,
|
||||||
|
accessRoadType
|
||||||
} = searchRequest;
|
} = searchRequest;
|
||||||
const category = AD_CATEGORY[realEstateType] || AD_CATEGORY.FLAT;
|
const category = AD_CATEGORY[realEstateType] || AD_CATEGORY.FLAT;
|
||||||
|
|
||||||
@@ -41,6 +57,40 @@ const getFilters = async (req, res) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Maybe this is slow, pay attention to this
|
||||||
|
const filterFilters = filterObject => {
|
||||||
|
const filterCategories = filterObject.categoriesToShow;
|
||||||
|
return filterCategories.indexOf(category) !== -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
const advancedBooleanFilterObjects = ADVANCED_BOOLEAN_FILTERS.filter(
|
||||||
|
filterFilters
|
||||||
|
);
|
||||||
|
const advancedSegmentSelectFilterObjects = ADVANCED_SEGMENT_SELECT_FILTERS.filter(
|
||||||
|
filterFilters
|
||||||
|
);
|
||||||
|
const advancedRangeFilterObjects = ADVANCED_RANGE_FILTERS.filter(
|
||||||
|
filterFilters
|
||||||
|
);
|
||||||
|
|
||||||
|
const advancedBooleanFilterValues = {
|
||||||
|
includeIncompleteAds,
|
||||||
|
balcony,
|
||||||
|
elevator,
|
||||||
|
newBuilding
|
||||||
|
};
|
||||||
|
const advancedSegmentSelectFilterValues = {
|
||||||
|
accessRoadType
|
||||||
|
};
|
||||||
|
const advancedRangeFilterValues = {
|
||||||
|
numberOfFloorsMin,
|
||||||
|
numberOfFloorsMax,
|
||||||
|
numberOfRoomsMin,
|
||||||
|
numberOfRoomsMax,
|
||||||
|
floorMin,
|
||||||
|
floorMax
|
||||||
|
};
|
||||||
|
|
||||||
if (priceMin || priceMax) {
|
if (priceMin || priceMax) {
|
||||||
priceSliderOptions.start = [priceMin, priceMax];
|
priceSliderOptions.start = [priceMin, priceMax];
|
||||||
}
|
}
|
||||||
@@ -58,7 +108,14 @@ const getFilters = async (req, res) => {
|
|||||||
hasGardenSize,
|
hasGardenSize,
|
||||||
priceSliderOptions: JSON.stringify(priceSliderOptions),
|
priceSliderOptions: JSON.stringify(priceSliderOptions),
|
||||||
sizeSliderOptions: JSON.stringify(sizeSliderOptions),
|
sizeSliderOptions: JSON.stringify(sizeSliderOptions),
|
||||||
gardenSizeSliderOptions: JSON.stringify(gardenSizeSliderOptions)
|
gardenSizeSliderOptions: JSON.stringify(gardenSizeSliderOptions),
|
||||||
|
advancedBooleanFilterObjects,
|
||||||
|
advancedBooleanFilterValues,
|
||||||
|
advancedSegmentSelectFilterObjects,
|
||||||
|
advancedSegmentSelectFilterValues,
|
||||||
|
advancedRangeFilterObjects,
|
||||||
|
advancedRangeFilterValues,
|
||||||
|
includeIncompleteAds
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -78,13 +135,91 @@ const postFilters = async (req, res) => {
|
|||||||
const sizeMin = parseInt(req.body.sizeMin) || 0;
|
const sizeMin = parseInt(req.body.sizeMin) || 0;
|
||||||
const sizeMax = parseInt(req.body.sizeMax) || 0;
|
const sizeMax = parseInt(req.body.sizeMax) || 0;
|
||||||
|
|
||||||
//TODO: Filter validation
|
const advancedRangeFilters = {};
|
||||||
|
|
||||||
|
ADVANCED_RANGE_FILTERS.forEach(filter => {
|
||||||
|
let parsingFunction = parseInt;
|
||||||
|
if (filter.decimalPlaces) {
|
||||||
|
parsingFunction = parseFloat;
|
||||||
|
}
|
||||||
|
|
||||||
|
advancedRangeFilters[filter.dbFieldMin] = parsingFunction(
|
||||||
|
req.body[filter.dbFieldMin]
|
||||||
|
);
|
||||||
|
advancedRangeFilters[filter.dbFieldMax] = parsingFunction(
|
||||||
|
req.body[filter.dbFieldMax]
|
||||||
|
);
|
||||||
|
|
||||||
|
advancedRangeFilters[filter.dbFieldMin] = isNaN(
|
||||||
|
advancedRangeFilters[filter.dbFieldMin]
|
||||||
|
)
|
||||||
|
? null
|
||||||
|
: advancedRangeFilters[filter.dbFieldMin];
|
||||||
|
advancedRangeFilters[filter.dbFieldMax] = isNaN(
|
||||||
|
advancedRangeFilters[filter.dbFieldMax]
|
||||||
|
)
|
||||||
|
? null
|
||||||
|
: advancedRangeFilters[filter.dbFieldMax];
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (filter.decimalPlaces) {
|
||||||
|
advancedRangeFilters[filter.dbFieldMin] = advancedRangeFilters[
|
||||||
|
filter.dbFieldMin
|
||||||
|
].toFixed(filter.decimalPlaces);
|
||||||
|
advancedRangeFilters[filter.dbFieldMax] = advancedRangeFilters[
|
||||||
|
filter.dbFieldMax
|
||||||
|
].toFixed(filter.decimalPlaces);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
advancedRangeFilters[filter.dbFieldMin] = null;
|
||||||
|
advancedRangeFilters[filter.dbFieldMax] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
advancedRangeFilters[filter.dbFieldMin] < filter.validValueMin ||
|
||||||
|
advancedRangeFilters[filter.dbFieldMin] > filter.validValueMax
|
||||||
|
) {
|
||||||
|
advancedRangeFilters[filter.dbFieldMin] = filter.validValueMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
advancedRangeFilters[filter.dbFieldMax] < filter.validValueMin ||
|
||||||
|
advancedRangeFilters[filter.dbFieldMax] > filter.validValueMax
|
||||||
|
) {
|
||||||
|
advancedRangeFilters[filter.dbFieldMax] = filter.validValueMax;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const includeIncompleteAds = req.body.includeIncompleteAds === "on";
|
||||||
|
|
||||||
|
const balcony = req.body.balcony === "on";
|
||||||
|
const elevator = req.body.elevator === "on";
|
||||||
|
const newBuilding = req.body.newBuilding === "on";
|
||||||
|
|
||||||
|
const accessRoadType = req.body.accessRoadType;
|
||||||
|
if (!ACCESS_ROAD_TYPE[accessRoadType]) {
|
||||||
|
res.render("notFound", { title: " Greška !" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: Filter validation
|
||||||
searchRequest.priceMin = priceMin;
|
searchRequest.priceMin = priceMin;
|
||||||
searchRequest.priceMax = priceMax;
|
searchRequest.priceMax = priceMax;
|
||||||
searchRequest.sizeMin = sizeMin;
|
searchRequest.sizeMin = sizeMin;
|
||||||
searchRequest.sizeMax = sizeMax;
|
searchRequest.sizeMax = sizeMax;
|
||||||
|
|
||||||
|
for (const filter of Object.keys(advancedRangeFilters)) {
|
||||||
|
searchRequest[filter] = advancedRangeFilters[filter];
|
||||||
|
}
|
||||||
|
|
||||||
|
searchRequest.balcony = balcony;
|
||||||
|
searchRequest.elevator = elevator;
|
||||||
|
searchRequest.newBuilding = newBuilding;
|
||||||
|
|
||||||
|
searchRequest.includeIncompleteAds = includeIncompleteAds;
|
||||||
|
|
||||||
|
searchRequest.accessRoadType = accessRoadType;
|
||||||
|
|
||||||
if (
|
if (
|
||||||
req.body.gardenSizeMin !== undefined &&
|
req.body.gardenSizeMin !== undefined &&
|
||||||
req.body.gardenSizeMax !== undefined
|
req.body.gardenSizeMax !== undefined
|
||||||
|
|||||||
@@ -1,30 +1,69 @@
|
|||||||
<br>
|
<br>
|
||||||
|
|
||||||
<p>
|
<% for (const filter of advancedBooleanFilterObjects){ %>
|
||||||
<label class="checkbox-label">
|
<p>
|
||||||
<input type="checkbox" class="filled-in" />
|
<label class="checkbox-label">
|
||||||
<span>Balkon</span>
|
<input type="checkbox" class="filled-in" name="<%= filter.dbField %>"
|
||||||
</label>
|
<% if (advancedBooleanFilterValues[filter.dbField]) { %>
|
||||||
</p>
|
checked
|
||||||
|
<% } %>>
|
||||||
|
<span><%= filter.title %></span>
|
||||||
|
</label>
|
||||||
|
</p>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
<p>
|
<br>
|
||||||
<label class="checkbox-label">
|
<% for (const filter of advancedRangeFilterObjects){ %>
|
||||||
<input type="checkbox" class="filled-in" />
|
<div class="row">
|
||||||
<span>Novogradnja</span>
|
<p class="column-label col s5 m3 l2">
|
||||||
</label>
|
<%= filter.title %>
|
||||||
</p>
|
</p>
|
||||||
|
<div class="input-field col s3 m4 l5">
|
||||||
|
<input
|
||||||
|
id="<%= filter.dbFieldMin %>"
|
||||||
|
name="<%= filter.dbFieldMin %>"
|
||||||
|
type="number"
|
||||||
|
value="<%= advancedRangeFilterValues[filter.dbFieldMin] !== undefined ? advancedRangeFilterValues[filter.dbFieldMin] : ""%>"
|
||||||
|
>
|
||||||
|
<label for="<%= filter.dbFieldMin %>">Od</label>
|
||||||
|
</div>
|
||||||
|
<div class="input-field col s3 m4 l5">
|
||||||
|
<input
|
||||||
|
id="<%= filter.dbFieldMax %>"
|
||||||
|
name="<%= filter.dbFieldMax %>"
|
||||||
|
type="number"
|
||||||
|
value="<%= advancedRangeFilterValues[filter.dbFieldMax] !== undefined ? advancedRangeFilterValues[filter.dbFieldMax] : ""%>"
|
||||||
|
>
|
||||||
|
<label for="<%= filter.dbFieldMax %>">Do</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
<p>
|
<br>
|
||||||
<label class="checkbox-label">
|
<% for (const filter of advancedSegmentSelectFilterObjects){ %>
|
||||||
<input type="checkbox" class="filled-in" />
|
<div>
|
||||||
<span>Lift</span>
|
<label class="checkbox-label"><%= filter.title %>: </label><br><br>
|
||||||
</label>
|
<span class="segmented small">
|
||||||
</p>
|
<% for (const segmentObject of filter.values) { %>
|
||||||
|
<label>
|
||||||
|
<input type="radio" name="<%= filter.dbField %>" value="<%= segmentObject.id %>"
|
||||||
|
<% if (advancedSegmentSelectFilterValues[filter.dbField] === segmentObject.id) { %>
|
||||||
|
checked
|
||||||
|
<% } %>>
|
||||||
|
<span class="label"><%= segmentObject.title %></span>
|
||||||
|
</label>
|
||||||
|
<% } %>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<% } %>
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
<p class="distinguished">
|
<p class="distinguished">
|
||||||
<label class="checkbox-label">
|
<label class="checkbox-label">
|
||||||
<input type="checkbox" class="filled-in" />
|
<input type="checkbox" class="filled-in" name="includeIncompleteAds"
|
||||||
<span>Uključi oglase koji nemaju potpune informacije</span>
|
<% if (includeIncompleteAds) { %>
|
||||||
|
checked
|
||||||
|
<% } %>>
|
||||||
|
<span>Uključi i oglase bez potpunih informacija</span>
|
||||||
</label>
|
</label>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
Reference in New Issue
Block a user