Skip to content

Commit

Permalink
[NEP-12629] Fix default filters URLs with old format for SavedSearches.
Browse files Browse the repository at this point in the history
  • Loading branch information
Sergei Aksiutin committed Mar 6, 2022
1 parent 828327a commit d52e253
Show file tree
Hide file tree
Showing 7 changed files with 272 additions and 126 deletions.
134 changes: 91 additions & 43 deletions dist/react-filterbar.js
Original file line number Diff line number Diff line change
Expand Up @@ -16940,7 +16940,7 @@ var FilterBarActor = /*#__PURE__*/function () {
value: function loadSavedSearch(searchId) {
this.disableAllFilters();
var savedSearch = this.filterBarStore.getSavedSearch(searchId);
var filters = JSON.parse(savedSearch.configuration);
var filters = this.parseSavedSearch(savedSearch);

if (this.verifySavedFilters(filters)) {
this.filterBarStore.setActiveFilters(filters);
Expand All @@ -16951,21 +16951,29 @@ var FilterBarActor = /*#__PURE__*/function () {
}
}
}, {
key: "verifySavedFilters",
value: function verifySavedFilters(filters) {
var filtersArr;
key: "parseSavedSearch",
value: function parseSavedSearch(savedSearch) {
var savedSearchFilters = JSON.parse(savedSearch.configuration);
var filters = savedSearchFilters;

if (filters instanceof Array) {
filtersArr = filters;
} else {
filtersArr = Object.keys(filters).map(function (name) {
if (!Array.isArray(savedSearchFilters)) {
filters = Object.keys(savedSearchFilters).map(function (name) {
return {
uid: name
};
});
}

return new _FilterVerificator.FilterVerificator(this.filterBarStore.getFilters(), filtersArr).verify();
if (!Array.isArray(filters[0])) {
filters = [filters];
}

return filters;
}
}, {
key: "verifySavedFilters",
value: function verifySavedFilters(parsedFilters) {
return new _FilterVerificator.FilterVerificator(this.filterBarStore.getFilters(), parsedFilters).verify();
}
}, {
key: "saveFilters",
Expand Down Expand Up @@ -17138,40 +17146,12 @@ function setupConfiguration(configuration) {
var activeFilters = JSON.parse(url.query(true).q);
configuration.filterBarConfiguration.activeFilters = [];

var _iterator = _createForOfIteratorHelper(activeFilters),
_step;

try {
var _loop = function _loop() {
groupFilters = _step.value;
var _groupFilters = [];
groupFilters.map(function (filter) {
var configFilter = configuration.filterBarConfiguration.filters[filter.uid];

if (configFilter) {
configFilter.filterUid = filter.uid;
configFilter.uid = filter.uid;
configFilter.value = filter.value;

if (filter.operator) {
configFilter.operator = filter.operator;
}
}

_groupFilters.push(configFilter);
});
configuration.filterBarConfiguration.activeFilters.push(_groupFilters);
};

for (_iterator.s(); !(_step = _iterator.n()).done;) {
var groupFilters;

_loop();
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
if (Array.isArray(activeFilters[0])) {
// Case 1: Filters with new format
configuration.filterBarConfiguration.activeFilters = parseQueryVersion2(activeFilters, configuration);
} else {
// Case 2: Filters with old format
configuration.filterBarConfiguration.activeFilters = parseQueryVersion1(activeFilters, configuration);
}
}

Expand All @@ -17187,6 +17167,74 @@ function setupConfiguration(configuration) {
return configuration;
}

function parseQueryVersion1(activeFilters, configuration) {
var _groupFilters = [];

var _iterator = _createForOfIteratorHelper(activeFilters),
_step;

try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var filter = _step.value;
var configFilter = parseAndGetFilter(filter, configuration);

_groupFilters.push(configFilter);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}

return [_groupFilters];
}

function parseQueryVersion2(activeFilters, configuration) {
var results = [];

var _iterator2 = _createForOfIteratorHelper(activeFilters),
_step2;

try {
var _loop = function _loop() {
var groupFilters = _step2.value;
var _groupFilters = [];
groupFilters.map(function (filter) {
var configFilter = parseAndGetFilter(filter, configuration);

_groupFilters.push(configFilter);
});
results.push(_groupFilters);
};

for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
_loop();
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}

return results;
}

function parseAndGetFilter(filter, configuration) {
var configFilter = configuration.filterBarConfiguration.filters[filter.uid];

if (configFilter) {
configFilter.filterUid = filter.uid;
configFilter.uid = filter.uid;
configFilter.value = filter.value;

if (filter.operator) {
configFilter.operator = filter.operator;
}
}

return configFilter;
}

document.addEventListener("DOMContentLoaded", function () {
var configuration = {},
filterableTableNode = document.getElementsByClassName("react-filterable-table")[0];
Expand Down
12 changes: 6 additions & 6 deletions dist/react-filterbar.min.js

Large diffs are not rendered by default.

136 changes: 92 additions & 44 deletions example/public/js/react-filterbar.js

Large diffs are not rendered by default.

14 changes: 8 additions & 6 deletions example/saved_search.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
---
TEST: "[]"
Book 1: "[]"
Book 10: '[[{"field":"title","type":"text","label":"Title","filterUid":"title","uid":"title","value":"Book
10"}]]'
Title wit OR: '[[{"field":"author","type":"select","label":"Author","url":"/authors","default":"Author
31","filterUid":"author","uid":"author","value":"Author 31"}],[{"field":"title","type":"text","label":"Title","filterUid":"title","uid":"title","value":"Book
New Format: '[[{"field":"title","type":"text","label":"Title","filterUid":"title","uid":"title","value":"Book
10"}]]'
Old Format: '[{"uid":"author","type":"select","field":"author","value":"Author 35"},{"uid":"title","type":"text","field":"title","value":"Book
10"}]'
Old Fromat 2: '[{"uid":"author_multi_test","type":"multi_select","field":"author","value":["Author
10"]},{"uid":"author_multi_test","type":"multi_select","field":"author","value":["Author
20"]},{"uid":"author_multi_test","type":"multi_select","field":"author","value":["Author
30"]},{"uid":"author_multi_test","type":"multi_select","field":"author","value":["Author
40"]}]'
11 changes: 10 additions & 1 deletion example/server.rb
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,16 @@ def loop_over_queries(queries, haystack)
end

def search(needle, haystack)
field, type, value = needle.first.values_at(*%w(field type value))
field, type, value = nil

if needle.is_a? Array
# Case 1: Filters with new format
field, type, value = needle.first.values_at(*%w(field type value))
else
# Case 2: Filters with old format
field, type, value = needle.values_at(*%w(field type value))
end

value ||= ""
case type.to_sym
when :date
Expand Down
25 changes: 16 additions & 9 deletions src/actors/FilterBarActor.js
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ export class FilterBarActor {
loadSavedSearch(searchId) {
this.disableAllFilters();

var savedSearch = this.filterBarStore.getSavedSearch(searchId);
var filters = JSON.parse(savedSearch.configuration);
const savedSearch = this.filterBarStore.getSavedSearch(searchId);
const filters = this.parseSavedSearch(savedSearch);

if (this.verifySavedFilters(filters)) {
this.filterBarStore.setActiveFilters(filters);
Expand All @@ -118,19 +118,26 @@ export class FilterBarActor {
}
}

verifySavedFilters(filters) {
var filtersArr;
parseSavedSearch(savedSearch) {
const savedSearchFilters = JSON.parse(savedSearch.configuration)
var filters = savedSearchFilters;

if (filters instanceof Array) {
filtersArr = filters;
} else {
filtersArr = Object.keys(filters)
if (!Array.isArray(savedSearchFilters)) {
filters = Object.keys(savedSearchFilters)
.map(function (name) {
return { uid: name }
});
}

return new FilterVerificator(this.filterBarStore.getFilters(), filtersArr).verify();
if (!Array.isArray(filters[0])) {
filters = [filters]
}

return filters;
}

verifySavedFilters(parsedFilters) {
return new FilterVerificator(this.filterBarStore.getFilters(), parsedFilters).verify();
}

saveFilters(name) {
Expand Down
66 changes: 49 additions & 17 deletions src/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,23 +50,13 @@ function setupConfiguration(configuration) {
if (url.query(true).q !== "") {
const activeFilters = JSON.parse(url.query(true).q);
configuration.filterBarConfiguration.activeFilters = [];
for (var groupFilters of activeFilters) {
const _groupFilters = []
groupFilters.map(function(filter) {
var configFilter = configuration.filterBarConfiguration.filters[filter.uid];

if (configFilter) {
configFilter.filterUid = filter.uid;
configFilter.uid = filter.uid;
configFilter.value = filter.value;

if (filter.operator) {
configFilter.operator = filter.operator;
}
}
_groupFilters.push(configFilter);
});
configuration.filterBarConfiguration.activeFilters.push(_groupFilters);

if (Array.isArray(activeFilters[0])) {
// Case 1: Filters with new format
configuration.filterBarConfiguration.activeFilters = parseQueryVersion2(activeFilters, configuration);
} else {
// Case 2: Filters with old format
configuration.filterBarConfiguration.activeFilters = parseQueryVersion1(activeFilters, configuration);
}
}

Expand All @@ -81,6 +71,48 @@ function setupConfiguration(configuration) {
return configuration;
}

function parseQueryVersion1(activeFilters, configuration) {
const _groupFilters = [];

for (const filter of activeFilters) {
const configFilter = parseAndGetFilter(filter, configuration)
_groupFilters.push(configFilter);
}

return [_groupFilters];
}

function parseQueryVersion2(activeFilters, configuration) {
const results = [];

for (const groupFilters of activeFilters) {
const _groupFilters = []
groupFilters.map(function(filter) {
const configFilter = parseAndGetFilter(filter, configuration)
_groupFilters.push(configFilter);
});
results.push(_groupFilters);
}

return results;
}

function parseAndGetFilter(filter, configuration) {
const configFilter = configuration.filterBarConfiguration.filters[filter.uid];

if (configFilter) {
configFilter.filterUid = filter.uid;
configFilter.uid = filter.uid;
configFilter.value = filter.value;

if (filter.operator) {
configFilter.operator = filter.operator;
}
}

return configFilter;
}

document.addEventListener("DOMContentLoaded", function(){
var configuration = {},
filterableTableNode = document.getElementsByClassName("react-filterable-table")[0];
Expand Down

0 comments on commit d52e253

Please sign in to comment.