diff --git a/app/controllers/realEstateFilters.js b/app/controllers/realEstateFilters.js index 8949cc1..7d6c06e 100644 --- a/app/controllers/realEstateFilters.js +++ b/app/controllers/realEstateFilters.js @@ -1,5 +1,10 @@ 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 searchRequest = await currentSearchRequest(req); @@ -19,7 +24,18 @@ const getFilters = async (req, res) => { sizeMin, sizeMax, gardenSizeMin, - gardenSizeMax + gardenSizeMax, + numberOfRoomsMin, + numberOfRoomsMax, + numberOfFloorsMin, + numberOfFloorsMax, + floorMin, + floorMax, + includeIncompleteAds, + balcony, + elevator, + newBuilding, + accessRoadType } = searchRequest; const category = AD_CATEGORY[realEstateType] || AD_CATEGORY.FLAT; @@ -41,6 +57,40 @@ const getFilters = async (req, res) => { 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) { priceSliderOptions.start = [priceMin, priceMax]; } @@ -58,7 +108,14 @@ const getFilters = async (req, res) => { hasGardenSize, priceSliderOptions: JSON.stringify(priceSliderOptions), 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 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.priceMax = priceMax; searchRequest.sizeMin = sizeMin; 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 ( req.body.gardenSizeMin !== undefined && req.body.gardenSizeMax !== undefined diff --git a/app/views/advancedFilters.ejs b/app/views/advancedFilters.ejs index ff54fa7..23e50f7 100644 --- a/app/views/advancedFilters.ejs +++ b/app/views/advancedFilters.ejs @@ -1,30 +1,69 @@
-

- -

+<% for (const filter of advancedBooleanFilterObjects){ %> +

+ +

+<% } %> -

- -

+
+<% for (const filter of advancedRangeFilterObjects){ %> +
+

+ <%= filter.title %> +

+
+ " + > + +
+
+ " + > + +
+
+<% } %> -

- -

+
+<% for (const filter of advancedSegmentSelectFilterObjects){ %> +
+

+ + <% for (const segmentObject of filter.values) { %> + + <% } %> + +
+<% } %>