Skip to content
Snippets Groups Projects
Commit 13f9e645 authored by Hermann's avatar Hermann
Browse files

client side search

parent 71f4da2f
No related branches found
No related tags found
No related merge requests found
......@@ -90,8 +90,6 @@
"user.firstname",
"email"
],
"searchKeys": [
"email"
]
"searchKeys": []
}
}
......@@ -40,10 +40,18 @@ styler.add('eventView', viewLayout);
class ParticipantsTable {
constructor({ attrs: { where } }) {
this.ctrl = new DatalistController('eventsignups', {
embedded: { user: 1 },
where,
}, signupConfig.tableKeys);
this.ctrl = new DatalistController(
'eventsignups', {
embedded: { user: 1 },
where,
},
[
'email',
'user.firstname',
'user.lastname',
],
false,
);
}
getItemData(data) {
......
......@@ -2,10 +2,16 @@ import Stream from 'mithril/stream';
import { ResourceHandler } from './auth';
export default class DatalistController {
constructor(resource, query = {}, searchKeys = false) {
this.handler = new ResourceHandler(resource, searchKeys);
constructor(resource, query = {}, searchKeys = false, onlineSearch = true) {
this.onlineSearch = onlineSearch;
if (onlineSearch) {
this.handler = new ResourceHandler(resource, searchKeys);
} else {
this.handler = new ResourceHandler(resource, false);
this.clientSearchKeys = searchKeys || [];
}
this.query = query || {};
this.items = [];
this.search = null;
// state pointer that is counted up every time the table is refreshed so
// we can tell infinite scroll that the data-version has changed.
this.stateCounter = Stream(0);
......@@ -27,25 +33,66 @@ export default class DatalistController {
getPageData(pageNum) {
// for some reason this is called before the object is instantiated.
// check this and return nothing
const query = {};
Object.keys(this.query).forEach((key) => { query[key] = this.query[key]; });
const query = Object.assign({}, this.query);
query.max_results = 10;
query.page = pageNum;
return new Promise((resolve, reject) => {
this.handler.get(query).then((data) => {
resolve(data._items);
// If onlineSearch is false, we filter the page-results at the client
// because the API would not understand the search pattern, e.g. for
// embedded keys like user.firstname
if (!this.onlineSearch && this.clientSearchKeys.length > 0 && this.search) {
const response = [];
// We go through all response items and will add them to response if
// they match the query.
data._items.forEach((item) => {
// Try every search Key seperately, such that any match with any
// key is sufficient
this.clientSearchKeys.some((key) => {
if (key.match(/.*\..*/)) {
// traverse the key, this is a key pointing to a sub-object
let intermediateObject = Object.assign({}, item);
key.split('.').forEach((subKey) => {
intermediateObject = intermediateObject[subKey];
});
if (intermediateObject.includes(this.search)) {
response.push(item);
// return true to end the search of this object, it is already
// matched
return true;
}
} else if (item[key] && item[key].includes(this.search)) {
response.push(item);
// return true to end the search of this object, it is already
// matched
return true;
}
return false;
});
});
resolve(response);
} else {
resolve(data._items);
}
});
});
}
setSearch(search) {
this.query.search = search;
this.refresh();
if (this.onlineSearch) {
this.search = search;
this.query.search = search;
this.refresh();
} else if (this.clientSearchKeys.length > 0) {
this.search = search;
this.refresh();
}
}
setQuery(query) {
this.query = query;
this.query.search = this.search;
this.refresh();
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment