UNPKG

passbolt-styleguide

Version:

Passbolt styleguide contains common styling assets used by the different sites, plugin, etc.

137 lines (123 loc) 3.61 kB
/** * Passbolt ~ Open source password manager for teams * Copyright (c) 2020 Passbolt SA (https://www.passbolt.com) * * Licensed under GNU Affero General Public License version 3 of the or any later version. * For full copyright and license information, please see the LICENSE.txt * Redistributions of files must retain the above copyright notice. * * @copyright Copyright (c) 2020 Passbolt SA (https://www.passbolt.com) * @license https://opensource.org/licenses/AGPL-3.0 AGPL License * @link https://www.passbolt.com Passbolt(tm) * @since 2.13.0 */ import React, { Component } from "react"; import PropTypes from "prop-types"; import { withRouter } from "react-router-dom"; import SearchBar from "../../Common/Navigation/Search/SearchBar"; import { ResourceWorkspaceFilterTypes, withResourceWorkspace } from "../../../contexts/ResourceWorkspaceContext"; class FilterResourcesByText extends Component { /** * Constructor * @param {Object} props */ constructor(props) { super(props); this.state = this.defaultState; this.debounceTimeoutId = null; // Set the debounce timeout identifier this.bindCallbacks(); } /** * Bind callbacks methods */ bindCallbacks() { this.handleSearchEvent = this.handleSearchEvent.bind(this); } /** * Get default state * @returns {*} */ get defaultState() { return { text: "", // Current search text }; } /** * Whenever the component was updated */ componentDidUpdate(previousProps) { this.handleFilterChanged(previousProps.resourceWorkspaceContext.filter); } /** * Whenever the component will unmount */ componentWillUnmount() { clearTimeout(this.debounceTimeoutId); } /** * Whenever the resource filter changed */ handleFilterChanged(previousFilter) { const wasTextFilter = previousFilter.type === ResourceWorkspaceFilterTypes.TEXT; const isTextFilter = this.props.resourceWorkspaceContext.filter.type === ResourceWorkspaceFilterTypes.TEXT; const isNotTextFilterAnymore = wasTextFilter && !isTextFilter; if (isNotTextFilterAnymore) { this.setState({ text: "" }); } } /** * Handle search input change * @params {string} text The entered text */ handleSearchEvent(text) { this.search(text); } /** * Search for the text * @param text */ search(text) { clearTimeout(this.debounceTimeoutId); this.debounceTimeoutId = setTimeout(() => { const filter = this.generateFilter(text); this.props.history.push({ pathname: "/app/passwords", state: { filter } }); }, 300); this.setState({ text }); } /** * Generate the filter to apply on resources * @param text * @returns {{payload, type: string}|{type: string}} */ generateFilter(text) { if (text.length > 0) { return { type: ResourceWorkspaceFilterTypes.TEXT, payload: text }; } return { type: ResourceWorkspaceFilterTypes.ALL }; } /** * Render the component * @return {JSX} */ render() { return ( <SearchBar disabled={this.props.disabled} onSearch={this.handleSearchEvent} placeholder={this.props.placeholder} value={this.state.text} /> ); } } FilterResourcesByText.propTypes = { disabled: PropTypes.bool, placeholder: PropTypes.string, resourceWorkspaceContext: PropTypes.object, history: PropTypes.object, }; FilterResourcesByText.defaultProps = { disabled: false, placeholder: "Search", }; export default withRouter(withResourceWorkspace(FilterResourcesByText));