1
0
mirror of https://github.com/flarum/core.git synced 2025-07-12 04:16:24 +02:00

Remove app.search instance, cache app.cache.searched (#2151)

* Moved search state logic into search state
This commit is contained in:
Alexander Skvortsov
2020-06-18 18:47:01 -04:00
committed by GitHub
parent f4afb006ed
commit 4a804dbbbc
7 changed files with 169 additions and 131 deletions

View File

@ -2,7 +2,6 @@ import { extend } from '../../common/extend';
import Page from './Page';
import ItemList from '../../common/utils/ItemList';
import listItems from '../../common/helpers/listItems';
import icon from '../../common/helpers/icon';
import DiscussionList from './DiscussionList';
import WelcomeHero from './WelcomeHero';
import DiscussionComposer from './DiscussionComposer';
@ -18,6 +17,8 @@ import SelectDropdown from '../../common/components/SelectDropdown';
* hero, the sidebar, and the discussion list.
*/
export default class IndexPage extends Page {
static providesInitialSearch = true;
init() {
super.init();
@ -36,7 +37,7 @@ export default class IndexPage extends Page {
app.cache.discussionList = null;
}
const params = this.params();
const params = app.search.params();
if (app.cache.discussionList) {
// Compare the requested parameters (sort, search query) to the ones that
@ -187,7 +188,7 @@ export default class IndexPage extends Page {
*/
navItems() {
const items = new ItemList();
const params = this.stickyParams();
const params = app.search.stickyParams();
items.add(
'allDiscussions',
@ -222,15 +223,15 @@ export default class IndexPage extends Page {
'sort',
Dropdown.component({
buttonClassName: 'Button',
label: sortOptions[this.params().sort] || Object.keys(sortMap).map((key) => sortOptions[key])[0],
label: sortOptions[app.search.params().sort] || Object.keys(sortMap).map((key) => sortOptions[key])[0],
children: Object.keys(sortOptions).map((value) => {
const label = sortOptions[value];
const active = (this.params().sort || Object.keys(sortMap)[0]) === value;
const active = (app.search.params().sort || Object.keys(sortMap)[0]) === value;
return Button.component({
children: label,
icon: active ? 'fas fa-check' : true,
onclick: this.changeSort.bind(this, value),
onclick: app.search.changeSort.bind(app.search, value),
active: active,
});
}),
@ -280,72 +281,6 @@ export default class IndexPage extends Page {
return items;
}
/**
* Return the current search query, if any. This is implemented to activate
* the search box in the header.
*
* @see Search
* @return {String}
*/
searching() {
return this.params().q;
}
/**
* Redirect to the index page without a search filter. This is called when the
* 'x' is clicked in the search box in the header.
*
* @see Search
*/
clearSearch() {
const params = this.params();
delete params.q;
m.route(app.route(this.props.routeName, params));
}
/**
* Redirect to the index page using the given sort parameter.
*
* @param {String} sort
*/
changeSort(sort) {
const params = this.params();
if (sort === Object.keys(app.cache.discussionList.sortMap())[0]) {
delete params.sort;
} else {
params.sort = sort;
}
m.route(app.route(this.props.routeName, params));
}
/**
* Get URL parameters that stick between filter changes.
*
* @return {Object}
*/
stickyParams() {
return {
sort: m.route.param('sort'),
q: m.route.param('q'),
};
}
/**
* Get parameters to pass to the DiscussionList component.
*
* @return {Object}
*/
params() {
const params = this.stickyParams();
params.filter = m.route.param('filter');
return params;
}
/**
* Open the composer for a new discussion or prompt the user to login.
*