diff --git a/frontend/src/App/AppRoutes.js b/frontend/src/App/AppRoutes.js index 58ce900ee..17aa034e0 100644 --- a/frontend/src/App/AppRoutes.js +++ b/frontend/src/App/AppRoutes.js @@ -9,7 +9,6 @@ import StatsConnector from 'Indexer/Stats/StatsConnector'; import SearchIndexConnector from 'Search/SearchIndexConnector'; import ApplicationSettings from 'Settings/Applications/ApplicationSettings'; import GeneralSettingsConnector from 'Settings/General/GeneralSettingsConnector'; -import IndexerSettingsConnector from 'Settings/Indexers/IndexerSettingsConnector'; import NotificationSettings from 'Settings/Notifications/NotificationSettings'; import Settings from 'Settings/Settings'; import TagSettings from 'Settings/Tags/TagSettings'; @@ -94,11 +93,6 @@ function AppRoutes(props) { component={ApplicationSettings} /> - - { - this._saveCallback = saveCallback; - } - - onChildStateChange = (payload) => { - this.setState(payload); - } - - onSavePress = () => { - if (this._saveCallback) { - this._saveCallback(); - } - } - - // - // Render - - render() { - const { - isTestingAll, - dispatchTestAllIndexers - } = this.props; - - const { - isSaving, - hasPendingChanges - } = this.state; - - return ( - - - - - - - } - onSavePress={this.onSavePress} - /> - - - - - - - - ); - } -} - -IndexerSettings.propTypes = { - isTestingAll: PropTypes.bool.isRequired, - dispatchTestAllIndexers: PropTypes.func.isRequired -}; - -export default IndexerSettings; diff --git a/frontend/src/Settings/Indexers/IndexerSettingsConnector.js b/frontend/src/Settings/Indexers/IndexerSettingsConnector.js deleted file mode 100644 index 9767b7b04..000000000 --- a/frontend/src/Settings/Indexers/IndexerSettingsConnector.js +++ /dev/null @@ -1,21 +0,0 @@ -import { connect } from 'react-redux'; -import { createSelector } from 'reselect'; -import { testAllIndexers } from 'Store/Actions/indexerActions'; -import IndexerSettings from './IndexerSettings'; - -function createMapStateToProps() { - return createSelector( - (state) => state.indexers.isTestingAll, - (isTestingAll) => { - return { - isTestingAll - }; - } - ); -} - -const mapDispatchToProps = { - dispatchTestAllIndexers: testAllIndexers -}; - -export default connect(createMapStateToProps, mapDispatchToProps)(IndexerSettings); diff --git a/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.css b/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.css deleted file mode 100644 index 1010221e1..000000000 --- a/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.css +++ /dev/null @@ -1,44 +0,0 @@ -.indexer { - composes: card from '~Components/Card.css'; - - position: relative; - width: 300px; - height: 100px; -} - -.underlay { - @add-mixin cover; -} - -.overlay { - @add-mixin linkOverlay; - - padding: 10px; -} - -.name { - text-align: center; - font-weight: lighter; - font-size: 24px; -} - -.actions { - margin-top: 20px; - text-align: right; -} - -.presetsMenu { - composes: menu from '~Components/Menu/Menu.css'; - - display: inline-block; - margin: 0 5px; -} - -.presetsMenuButton { - composes: button from '~Components/Link/Button.css'; - - &::after { - margin-left: 5px; - content: '\25BE'; - } -} diff --git a/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.js b/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.js deleted file mode 100644 index 2dadcffb2..000000000 --- a/frontend/src/Settings/Indexers/Indexers/AddIndexerItem.js +++ /dev/null @@ -1,112 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import Button from 'Components/Link/Button'; -import Link from 'Components/Link/Link'; -import Menu from 'Components/Menu/Menu'; -import MenuContent from 'Components/Menu/MenuContent'; -import { sizes } from 'Helpers/Props'; -import translate from 'Utilities/String/translate'; -import AddIndexerPresetMenuItem from './AddIndexerPresetMenuItem'; -import styles from './AddIndexerItem.css'; - -class AddIndexerItem extends Component { - - // - // Listeners - - onIndexerSelect = () => { - const { - implementation, - name - } = this.props; - - this.props.onIndexerSelect({ implementation, name }); - } - - // - // Render - - render() { - const { - name, - implementation, - infoLink, - presets, - onIndexerSelect - } = this.props; - - const hasPresets = !!presets && !!presets.length; - - return ( -
- - -
-
- {name} -
- -
- { - hasPresets && - - - - - - - - { - presets.map((preset) => { - return ( - - ); - }) - } - - - - } - - -
-
-
- ); - } -} - -AddIndexerItem.propTypes = { - name: PropTypes.string.isRequired, - implementation: PropTypes.string.isRequired, - infoLink: PropTypes.string.isRequired, - presets: PropTypes.arrayOf(PropTypes.object), - onIndexerSelect: PropTypes.func.isRequired -}; - -export default AddIndexerItem; diff --git a/frontend/src/Settings/Indexers/Indexers/AddIndexerModalContent.css b/frontend/src/Settings/Indexers/Indexers/AddIndexerModalContent.css index 946305dff..9e175cacf 100644 --- a/frontend/src/Settings/Indexers/Indexers/AddIndexerModalContent.css +++ b/frontend/src/Settings/Indexers/Indexers/AddIndexerModalContent.css @@ -3,3 +3,28 @@ justify-content: center; flex-wrap: wrap; } + +.modalBody { + composes: modalBody from '~Components/Modal/ModalBody.css'; + + display: flex; + flex: 1 1 auto; + flex-direction: column; +} + +.filterInput { + composes: input from '~Components/Form/TextInput.css'; + + flex: 0 0 auto; + margin-bottom: 20px; +} + +.alert { + composes: alert from '~Components/Alert.css'; + + margin-bottom: 20px; +} + +.scroller { + flex: 1 1 auto; +} diff --git a/frontend/src/Settings/Indexers/Indexers/AddIndexerModalContent.js b/frontend/src/Settings/Indexers/Indexers/AddIndexerModalContent.js index 6b6702912..3243729f9 100644 --- a/frontend/src/Settings/Indexers/Indexers/AddIndexerModalContent.js +++ b/frontend/src/Settings/Indexers/Indexers/AddIndexerModalContent.js @@ -1,102 +1,152 @@ import PropTypes from 'prop-types'; import React, { Component } from 'react'; import Alert from 'Components/Alert'; -import FieldSet from 'Components/FieldSet'; +import TextInput from 'Components/Form/TextInput'; import Button from 'Components/Link/Button'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import ModalBody from 'Components/Modal/ModalBody'; import ModalContent from 'Components/Modal/ModalContent'; import ModalFooter from 'Components/Modal/ModalFooter'; import ModalHeader from 'Components/Modal/ModalHeader'; -import { kinds } from 'Helpers/Props'; +import Scroller from 'Components/Scroller/Scroller'; +import Table from 'Components/Table/Table'; +import TableBody from 'Components/Table/TableBody'; +import { kinds, scrollDirections } from 'Helpers/Props'; +import getErrorMessage from 'Utilities/Object/getErrorMessage'; import translate from 'Utilities/String/translate'; -import AddIndexerItem from './AddIndexerItem'; +import SelectIndexerRow from './SelectIndexerRow'; import styles from './AddIndexerModalContent.css'; +const columns = [ + { + name: 'protocol', + label: 'Protocol', + isSortable: true, + isVisible: true + }, + { + name: 'name', + label: 'Name', + isSortable: true, + isVisible: true + }, + { + name: 'privacy', + label: 'Privacy', + isSortable: true, + isVisible: true + } +]; + class AddIndexerModalContent extends Component { + // + // Lifecycle + + constructor(props, context) { + super(props, context); + + this.state = { + filter: '' + }; + } + + // + // Listeners + + onFilterChange = ({ value }) => { + this.setState({ filter: value }); + } + // // Render render() { const { - isSchemaFetching, - isSchemaPopulated, - schemaError, - usenetIndexers, - torrentIndexers, + indexers, onIndexerSelect, + sortKey, + sortDirection, + isFetching, + isPopulated, + error, + onSortPress, onModalClose } = this.props; + const filter = this.state.filter; + const filterLower = filter.toLowerCase(); + + const errorMessage = getErrorMessage(error, 'Unable to load indexers'); + return ( Add Indexer - - { - isSchemaFetching && - - } - - { - !isSchemaFetching && !!schemaError && -
- {translate('UnableToAddANewIndexerPleaseTryAgain')} -
- } - - { - isSchemaPopulated && !schemaError && -
- - -
- {translate('ProwlarrSupportsAnyIndexer')} -
-
- {translate('ForMoreInformationOnTheIndividualIndexers')} -
-
- -
-
- { - usenetIndexers.map((indexer) => { - return ( - - ); - }) - } -
-
+ + + + +
+ {translate('ProwlarrSupportsAnyIndexer')} +
+
-
-
+ + { + isFetching ? : null + } + { + error ?
{errorMessage}
: null + } + { + isPopulated && !!indexers.length ? + + { - torrentIndexers.map((indexer) => { - return ( - - ); + indexers.map((indexer) => { + return indexer.name.toLowerCase().includes(filterLower) ? + ( + + ) : + null; }) } - - - - } + +
: + null + } +
+