Skip to content

Commit 54c646c

Browse files
authored
[NEP-12670] Convert SavedSearch into ES query (#106)
* [NEP-12670] adds new way to save search with backward compability * [NEP-12670] converts new saved search to JSON string because Sinatra does not support array within parameters * [NEP-12670] updates dist and example * [NEP-12670] updates docs/API-V1.md to add saved search changes for get and post * [NEP-12670] updates version number & removes TODO * [NEP-12670] updates dist and example * [NEP-12670] Updates version to 2.0.0 because the change is breaking
1 parent adfd8c2 commit 54c646c

File tree

8 files changed

+159
-58
lines changed

8 files changed

+159
-58
lines changed

dist/react-filterbar.js

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16951,13 +16951,21 @@ var FilterBarActor = /*#__PURE__*/function () {
1695116951
}, {
1695216952
key: "loadSavedSearch",
1695316953
value: function loadSavedSearch(searchId) {
16954+
var _this = this;
16955+
1695416956
this.disableAllFilters();
1695516957
var savedSearch = this.filterBarStore.getSavedSearch(searchId);
1695616958
var filters = JSON.parse(savedSearch.configuration);
1695716959

1695816960
if (this.verifySavedFilters(filters)) {
16959-
for (var filter in filters) {
16960-
this.enableFilter(filter, filters[filter]);
16961+
if (filters instanceof Array) {
16962+
filters.forEach(function (filter) {
16963+
return _this.enableFilter(filter.uid, filter.value);
16964+
});
16965+
} else {
16966+
for (var filter in filters) {
16967+
this.enableFilter(filter, filters[filter]);
16968+
}
1696116969
}
1696216970

1696316971
this.applyFilters();
@@ -16968,22 +16976,24 @@ var FilterBarActor = /*#__PURE__*/function () {
1696816976
}, {
1696916977
key: "verifySavedFilters",
1697016978
value: function verifySavedFilters(filters) {
16971-
var filtersArr = Object.keys(filters).map(function (name) {
16972-
return {
16973-
uid: name
16974-
};
16975-
});
16979+
var filtersArr;
16980+
16981+
if (filters instanceof Array) {
16982+
filtersArr = filters;
16983+
} else {
16984+
filtersArr = Object.keys(filters).map(function (name) {
16985+
return {
16986+
uid: name
16987+
};
16988+
});
16989+
}
16990+
1697616991
return new _FilterVerificator.FilterVerificator(this.filterBarStore.getFilters(), filtersArr).verify();
1697716992
}
1697816993
}, {
1697916994
key: "saveFilters",
1698016995
value: function saveFilters(name) {
16981-
var savedSearchPacket = {
16982-
saved_search: {
16983-
filters: {},
16984-
search_title: name
16985-
}
16986-
};
16996+
var filters = [];
1698716997

1698816998
var _iterator = _createForOfIteratorHelper(this.filterBarStore.enabledFilters()),
1698916999
_step;
@@ -16994,14 +17004,26 @@ var FilterBarActor = /*#__PURE__*/function () {
1699417004
filterUid = _step$value[0],
1699517005
filter = _step$value[1];
1699617006

16997-
savedSearchPacket.saved_search.filters[filterUid] = filter.value;
17007+
filters.push({
17008+
uid: filterUid,
17009+
type: filter.type,
17010+
field: filter.field,
17011+
value: filter.value
17012+
});
1699817013
}
1699917014
} catch (err) {
1700017015
_iterator.e(err);
1700117016
} finally {
1700217017
_iterator.f();
1700317018
}
1700417019

17020+
var savedSearchPacket = {
17021+
saved_search: {
17022+
filters: JSON.stringify(filters),
17023+
search_title: name
17024+
}
17025+
};
17026+
1700517027
if (Object.keys(savedSearchPacket.saved_search.filters).length === 0) {
1700617028
return false;
1700717029
}

dist/react-filterbar.min.js

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/API-V1.md

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,9 @@ The saved search endpoint must be able to handle three actions, GET and POST and
343343
344344
### GET
345345
346-
The endpoint GET action expects to be able to receive a JSON array of the following form:
346+
The endpoint GET action expects to be able to receive the save search and convert to Search API. It is backward compatible to version 1 format as well as the current version 2 format. It can receive a JSON array of the following forms:
347+
348+
##### Version 1 format
347349
348350
```javascript
349351
[
@@ -358,6 +360,27 @@ The endpoint GET action expects to be able to receive a JSON array of the follow
358360
]
359361
```
360362
363+
##### Version 2 format
364+
365+
```javascript
366+
[
367+
{
368+
name: NAME,
369+
configuration: [
370+
{
371+
uid: "dt.filterName",
372+
type: "select",
373+
field: "dt.field",
374+
value: "User selected value",
375+
},
376+
...,
377+
],
378+
url: "/saved_searches/my_id",
379+
},
380+
...,
381+
]
382+
```
383+
361384
This is an array of objects, where each object has a key:value pair for a name label, and a configuration object of key:value pairs of a filterUid and a filterValue, where filterUid and Value are of the same form as in the [Search API](#search-api), and a key:value pair for delete url.
362385
363386
### POST
@@ -368,17 +391,31 @@ The endpoint POST action expects to be able to post a JSON payload of the follow
368391
{
369392
"saved_search": {
370393
"search_title": "user entered value",
371-
"filters": {
372-
"dt.filterName": "filterValue",
373-
...
374-
},
394+
"filters": '[{"uid":"dt.filterName","type":"select","field":"dt.field","value":"User selected value"},{"uid":"dt.filterName","type":"text","field":"dt.field","value":"User entered value"}]',
375395
}
376396
}
377397
```
378398
379-
This is an object where the saved_search object has two key:value pairs.
399+
This is an object where the saved_search object has search_title and.
380400
The search_title key:value pair is the user entered title for the search.
381-
The filters key:value pair is an object who's key:value pairs are the enabled filters uids and values at the time of saving.
401+
The filters key:value pair is an stringified JSON which when jsonified returns the array in the following format:
402+
403+
```javascript
404+
[
405+
{
406+
uid: "dt.filterName",
407+
type: "select",
408+
field: "dt.field",
409+
value: "User selected value",
410+
},
411+
{
412+
uid: "dt.filterName",
413+
type: "text",
414+
field: "dt.field",
415+
value: "User entered value",
416+
},
417+
];
418+
```
382419
383420
### DELETE
384421

example/public/js/react-filterbar.js

Lines changed: 37 additions & 15 deletions
Large diffs are not rendered by default.

example/server.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class Server < Sinatra::Base
5151
saved_search = params[:saved_search]
5252
store = YAML::Store.new 'saved_search.yml'
5353
store.transaction do
54-
store[saved_search[:search_title]] = saved_search[:filters].to_json
54+
store[saved_search[:search_title]] = saved_search[:filters]
5555
end
5656
end
5757

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-filterbar",
3-
"version": "1.26",
3+
"version": "2.0",
44
"description": "",
55
"main": "dist/react-filterbar.js",
66
"engines": {

src/actors/FilterBarActor.js

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,14 @@ export class FilterBarActor {
107107
var filters = JSON.parse(savedSearch.configuration);
108108

109109
if (this.verifySavedFilters(filters)) {
110-
for (var filter in filters) {
111-
this.enableFilter(filter, filters[filter]);
110+
if (filters instanceof Array) {
111+
filters.forEach((filter) =>
112+
this.enableFilter(filter.uid, filter.value)
113+
);
114+
} else {
115+
for (var filter in filters) {
116+
this.enableFilter(filter, filters[filter]);
117+
}
112118
}
113119

114120
this.applyFilters();
@@ -118,25 +124,39 @@ export class FilterBarActor {
118124
}
119125

120126
verifySavedFilters(filters) {
121-
var filtersArr = Object.keys(filters)
122-
.map(function(name) {
123-
return { uid: name }
124-
});
127+
var filtersArr;
128+
129+
if (filters instanceof Array) {
130+
filtersArr = filters;
131+
} else {
132+
filtersArr = Object.keys(filters)
133+
.map(function (name) {
134+
return { uid: name }
135+
});
136+
}
137+
125138
return new FilterVerificator(this.filterBarStore.getFilters(), filtersArr).verify();
126139
}
127140

128141
saveFilters(name) {
142+
var filters = [];
143+
for (var [filterUid, filter] of this.filterBarStore.enabledFilters()) {
144+
filters.push({
145+
uid: filterUid,
146+
type: filter.type,
147+
field: filter.field,
148+
value: filter.value,
149+
});
150+
}
151+
129152
var savedSearchPacket = {
130153
saved_search: {
131-
filters: {},
132-
search_title: name
133-
}
154+
filters: JSON.stringify(filters),
155+
search_title: name,
156+
},
134157
};
135158

136-
for (var [filterUid, filter] of this.filterBarStore.enabledFilters()) {
137-
savedSearchPacket.saved_search.filters[filterUid] = filter.value;
138-
}
139-
if(Object.keys(savedSearchPacket.saved_search.filters).length === 0) {
159+
if (Object.keys(savedSearchPacket.saved_search.filters).length === 0) {
140160
return false;
141161
}
142162

0 commit comments

Comments
 (0)