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){ %> ++ +
+<% } %> -- -
++ <%= filter.title %> +
+- -
+