| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- // This is the root component for #page-list-search
- import React from 'react';
- import PropTypes from 'prop-types';
- import SearchResult from './SearchPage/SearchResult';
- export default class PageListSearch extends React.Component {
- constructor(props) {
- super(props);
- this.state = {
- location: location,
- tree: $('#search-listpage-input').data('path'),
- searchingKeyword: this.props.query.q || '',
- searchedKeyword: '',
- searchedPages: [],
- searchResultMeta: {},
- searchError: null,
- }
- this.changeURL = this.changeURL.bind(this);
- this.search = this.search.bind(this);
- this.handleChange = this.handleChange.bind(this);
- }
- componentDidMount() {
- const $pageListSearchForm = $('#search-listpage-input');
- // search after page initialized
- if (this.state.searchingKeyword !== '') {
- const keyword = this.state.searchingKeyword;
- $pageListSearchForm.val(keyword);
- this.search({keyword});
- }
- // This is temporary data bind ... (out of component)
- $('#search-listpage-form').on('submit', () => {
- const keyword = $pageListSearchForm.val();
- if (keyword != this.state.searchingKeyword) {
- this.search({keyword});
- }
- return false;
- });
- $('#search-listpage-clear').on('click', () => {
- $pageListSearchForm.val('');
- this.search({keyword: ''});
- return false;
- });
- }
- componentWillUnmount() {
- }
- static getQueryByLocation(location) {
- let search = location.search || '';
- let query = {};
- search.replace(/^\?/, '').split('&').forEach(function(element) {
- let queryParts = element.split('=');
- query[queryParts[0]] = decodeURIComponent(queryParts[1]).replace(/\+/g, ' ');
- });
- return query;
- }
- handleChange(event) {
- // this is not fired now because of force-data-bound by jQuery
- const keyword = event.target.value;
- this.setState({searchedKeyword: keyword});
- //console.log('Changed');
- }
- stopSearching() {
- $('#content-main').show();
- $('#search-listpage-clear').hide();
- $('.main-container').removeClass('aside-hidden');
- }
- startSearching() {
- $('#content-main').hide();
- $('#search-listpage-clear').show();
- $('.main-container').addClass('aside-hidden');
- }
- changeURL(keyword, refreshHash) {
- const tree = this.state.tree;
- let hash = location.hash || '';
- // TODO 整理する
- if (refreshHash || this.state.searchedKeyword !== '') {
- hash = '';
- }
- if (window.history && window.history.pushState){
- window.history.pushState('', `Search - ${keyword}`, `${tree}?q=${keyword}${hash}`);
- }
- }
- search(data) {
- const keyword = data.keyword || '';
- const tree = this.state.tree;
- this.changeURL(keyword);
- if (keyword === '') {
- this.stopSearching();
- this.setState({
- searchingKeyword: '',
- searchedPages: [],
- searchResultMeta: {},
- searchError: null,
- });
- return true;
- }
- this.startSearching();
- this.setState({
- searchingKeyword: keyword,
- });
- this.props.crowi.apiGet('/search', {q: keyword, tree: tree})
- .then((res) => {
- this.setState({
- searchedKeyword: keyword,
- searchedPages: res.data,
- searchResultMeta: res.meta,
- });
- }).catch(err => {
- this.setState({
- searchError: err,
- });
- });
- };
- render() {
- return (
- <div>
- <input
- type="hidden"
- name="q"
- value={this.state.searchingKeyword}
- onChange={this.handleChange}
- className="form-control"
- />
- <SearchResult
- tree={this.state.tree}
- pages={this.state.searchedPages}
- searchingKeyword={this.state.searchingKeyword}
- searchResultMeta={this.state.searchResultMeta}
- searchError={this.state.searchError}
- crowi={this.props.crowi}
- />
- </div>
- );
- }
- }
- PageListSearch.propTypes = {
- query: PropTypes.object,
- crowi: PropTypes.object.isRequired,
- };
- PageListSearch.defaultProps = {
- //pollInterval: 1000,
- query: PageListSearch.getQueryByLocation(location || {}),
- };
|