Files
redash/client/app/components/items-list/classes/ItemsFetcher.js
Arik Fraimovich 56d3be2248 Prettier all the Javascript code & GitHub Action (#4433)
* Prettier all the JS files

* Add GitHub Action to autoformat code pushed to master

* Fix eslint violation due to formatting.

* Remove GitHub actions for styling

* Add restyled.io config
2019-12-11 17:05:38 +02:00

86 lines
2.7 KiB
JavaScript

import { identity, isFunction, isNil, isString } from "lodash";
class ItemsFetcher {
_getRequest(state, context) {
return this._originalGetRequest({}, context);
}
_processResults({ results, count }, state, context) {
return {
results: this._originalProcessResults(results, context),
count,
};
}
constructor({ getRequest, doRequest, processResults }) {
this._originalGetRequest = isFunction(getRequest) ? getRequest : identity;
this._originalDoRequest = doRequest;
this._originalProcessResults = isFunction(processResults) ? processResults : identity;
}
fetch(changes, state, context) {
const request = this._getRequest(state, context);
return this._originalDoRequest(request, context).then(data => this._processResults(data, state, context));
}
}
// For endpoints that return just an array with items; sorting and pagination
// is performed on client
export class PlainListFetcher extends ItemsFetcher {
_allItems = [];
_getRequest({ searchTerm, selectedTags }, context) {
return this._originalGetRequest(
{
q: isString(searchTerm) && searchTerm !== "" ? searchTerm : undefined,
tags: selectedTags,
},
context
);
}
_processResults(data, { paginator, sorter }, context) {
this._allItems = this._originalProcessResults(data, context);
this._allItems = sorter.sort(this._allItems);
return {
results: paginator.getItemsForPage(this._allItems),
count: this._allItems.length,
allResults: this._allItems,
};
}
fetch(changes, state, context) {
// For plain lists we need to reload items from server only if tags or search changes.
if (isNil(changes) || changes.tags || changes.sorting) {
return super.fetch(changes, state, context);
}
// Sorting and pagination could be updated using previously fetched items.
const { paginator, sorter } = state;
if (changes.sorting) {
this._allItems = sorter.sort(this._allItems);
}
return Promise.resolve({
results: paginator.getItemsForPage(this._allItems),
count: this._allItems.length,
allResults: this._allItems,
});
}
}
// For endpoints that support server-side pagination (return object with
// items for current page and total items count)
export class PaginatedListFetcher extends ItemsFetcher {
_getRequest({ paginator, sorter, searchTerm, selectedTags }, context) {
return this._originalGetRequest(
{
page: paginator.page,
page_size: paginator.itemsPerPage,
order: sorter.compiled,
q: isString(searchTerm) && searchTerm !== "" ? searchTerm : undefined,
tags: selectedTags,
},
context
);
}
}