Sonarr/frontend/src/Settings/Profiles/Delay/DelayProfiles.js

170 lines
4.9 KiB
JavaScript
Raw Normal View History

2018-01-13 02:01:27 +00:00
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import FieldSet from 'Components/FieldSet';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link';
import Measure from 'Components/Measure';
import PageSectionContent from 'Components/Page/PageSectionContent';
import Scroller from 'Components/Scroller/Scroller';
2022-05-20 04:15:43 +00:00
import { icons, scrollDirections } from 'Helpers/Props';
2023-07-22 19:14:33 +00:00
import translate from 'Utilities/String/translate';
2018-01-13 02:01:27 +00:00
import DelayProfile from './DelayProfile';
2022-05-20 04:15:43 +00:00
import DelayProfileDragPreview from './DelayProfileDragPreview';
import DelayProfileDragSource from './DelayProfileDragSource';
2018-01-13 02:01:27 +00:00
import EditDelayProfileModalConnector from './EditDelayProfileModalConnector';
import styles from './DelayProfiles.css';
class DelayProfiles extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this.state = {
isAddDelayProfileModalOpen: false,
width: 0
};
}
//
// Listeners
onAddDelayProfilePress = () => {
this.setState({ isAddDelayProfileModalOpen: true });
2022-05-20 04:15:43 +00:00
};
2018-01-13 02:01:27 +00:00
onModalClose = () => {
this.setState({ isAddDelayProfileModalOpen: false });
2022-05-20 04:15:43 +00:00
};
2018-01-13 02:01:27 +00:00
onMeasure = ({ width }) => {
this.setState({ width });
2022-05-20 04:15:43 +00:00
};
2018-01-13 02:01:27 +00:00
//
// Render
render() {
const {
defaultProfile,
items,
tagList,
dragIndex,
dropIndex,
onConfirmDeleteDelayProfile,
...otherProps
} = this.props;
const {
isAddDelayProfileModalOpen,
width
} = this.state;
const isDragging = dropIndex !== null;
const isDraggingUp = isDragging && dropIndex < dragIndex;
const isDraggingDown = isDragging && dropIndex > dragIndex;
return (
<Measure onMeasure={this.onMeasure}>
2023-07-22 19:14:33 +00:00
<FieldSet legend={translate('DelayProfiles')}>
2018-01-13 02:01:27 +00:00
<PageSectionContent
2023-07-22 19:14:33 +00:00
errorMessage={translate('DelayProfilesLoadError')}
2018-01-13 02:01:27 +00:00
{...otherProps}
>
<Scroller
className={styles.horizontalScroll}
scrollDirection={
scrollDirections.HORIZONTAL
2018-01-13 02:01:27 +00:00
}
autoFocus={false}
>
<div>
<div className={styles.delayProfilesHeader}>
2023-07-22 19:14:33 +00:00
<div className={styles.column}>
{translate('PreferredProtocol')}
</div>
<div className={styles.column}>
{translate('UsenetDelay')}
</div>
<div className={styles.column}>
{translate('TorrentDelay')}
</div>
<div className={styles.tags}>
{translate('Tags')}
</div>
</div>
2018-01-13 02:01:27 +00:00
<div className={styles.delayProfiles}>
{
items.map((item, index) => {
return (
<DelayProfileDragSource
key={item.id}
tagList={tagList}
{...item}
{...otherProps}
index={index}
isDragging={isDragging}
isDraggingUp={isDraggingUp}
isDraggingDown={isDraggingDown}
onConfirmDeleteDelayProfile={onConfirmDeleteDelayProfile}
/>
);
})
}
<DelayProfileDragPreview
width={width}
2018-01-13 02:01:27 +00:00
/>
</div>
{
defaultProfile ?
<div>
<DelayProfile
tagList={tagList}
isDragging={false}
onConfirmDeleteDelayProfile={onConfirmDeleteDelayProfile}
{...defaultProfile}
/>
</div> :
null
}
</div>
</Scroller>
2018-01-13 02:01:27 +00:00
<div className={styles.addDelayProfile}>
<Link
className={styles.addButton}
onPress={this.onAddDelayProfilePress}
>
<Icon name={icons.ADD} />
</Link>
</div>
<EditDelayProfileModalConnector
isOpen={isAddDelayProfileModalOpen}
onModalClose={this.onModalClose}
/>
</PageSectionContent>
</FieldSet>
</Measure>
);
}
}
DelayProfiles.propTypes = {
isFetching: PropTypes.bool.isRequired,
error: PropTypes.object,
defaultProfile: PropTypes.object,
items: PropTypes.arrayOf(PropTypes.object).isRequired,
tagList: PropTypes.arrayOf(PropTypes.object).isRequired,
dragIndex: PropTypes.number,
dropIndex: PropTypes.number,
onConfirmDeleteDelayProfile: PropTypes.func.isRequired
};
export default DelayProfiles;