Files
redash/client/app/components/items-list/classes/StateStorage.js

61 lines
1.6 KiB
JavaScript

import { defaults } from 'lodash';
import { clientConfig } from '@/services/auth';
import { $location } from '@/services/ng';
import { parse as parseOrderBy, compile as compileOrderBy } from './Sorter';
export class StateStorage {
constructor(state = {}) {
this._state = { ...state };
}
getState() {
return defaults(this._state, {
page: 1,
itemsPerPage: clientConfig.pageSize,
orderByField: 'created_at',
orderByReverse: false,
searchTerm: '',
tags: [],
});
}
// eslint-disable-next-line class-methods-use-this
setState() {
}
}
export class UrlStateStorage extends StateStorage {
getState() {
const defaultState = super.getState();
const params = $location.search();
const searchTerm = params.q || '';
// in search mode order by should be explicitly specified in url, otherwise use default
const defaultOrderBy = searchTerm !== '' ? '' : compileOrderBy(defaultState.orderByField, defaultState.orderByReverse);
const {
field: orderByField,
reverse: orderByReverse,
} = parseOrderBy(params.order || defaultOrderBy);
return {
page: parseInt(params.page, 10) || defaultState.page,
itemsPerPage: parseInt(params.page_size, 10) || defaultState.itemsPerPage,
orderByField,
orderByReverse,
searchTerm,
};
}
// eslint-disable-next-line class-methods-use-this
setState({ page, itemsPerPage, orderByField, orderByReverse, searchTerm }) {
$location.search({
page,
page_size: itemsPerPage,
order: compileOrderBy(orderByField, orderByReverse),
q: searchTerm !== '' ? searchTerm : null,
});
}
}