mirror of
https://github.com/Radarr/Radarr
synced 2025-12-26 02:03:53 +01:00
Convert Movie History to TypeScript
Closes #10755 Co-authored-by: Mark McDowall <mark@mcdowall.ca>
This commit is contained in:
parent
779292490a
commit
6a7ed22b44
42 changed files with 344 additions and 497 deletions
|
|
@ -37,7 +37,7 @@ interface HistoryDetailsModalProps {
|
|||
sourceTitle: string;
|
||||
data: HistoryData;
|
||||
downloadId?: string;
|
||||
isMarkingAsFailed: boolean;
|
||||
isMarkingAsFailed?: boolean;
|
||||
onMarkAsFailedPress: () => void;
|
||||
onModalClose: () => void;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,13 +1,12 @@
|
|||
import BlocklistAppState from './BlocklistAppState';
|
||||
import CalendarAppState from './CalendarAppState';
|
||||
import CommandAppState from './CommandAppState';
|
||||
import HistoryAppState from './HistoryAppState';
|
||||
import HistoryAppState, { MovieHistoryAppState } from './HistoryAppState';
|
||||
import InteractiveImportAppState from './InteractiveImportAppState';
|
||||
import MovieBlocklistAppState from './MovieBlocklistAppState';
|
||||
import MovieCollectionAppState from './MovieCollectionAppState';
|
||||
import MovieCreditAppState from './MovieCreditAppState';
|
||||
import MovieFilesAppState from './MovieFilesAppState';
|
||||
import MovieHistoryAppState from './MovieHistoryAppState';
|
||||
import MoviesAppState, { MovieIndexAppState } from './MoviesAppState';
|
||||
import OrganizePreviewAppState from './OrganizePreviewAppState';
|
||||
import ParseAppState from './ParseAppState';
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@ import AppSectionState, {
|
|||
} from 'App/State/AppSectionState';
|
||||
import History from 'typings/History';
|
||||
|
||||
export type MovieHistoryAppState = AppSectionState<History>;
|
||||
|
||||
interface HistoryAppState
|
||||
extends AppSectionState<History>,
|
||||
AppSectionFilterState<History>,
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
import AppSectionState from 'App/State/AppSectionState';
|
||||
import History from 'typings/History';
|
||||
|
||||
type MovieHistoryAppState = AppSectionState<History>;
|
||||
|
||||
export default MovieHistoryAppState;
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React from 'react';
|
||||
import Modal from 'Components/Modal/Modal';
|
||||
import { sizes } from 'Helpers/Props';
|
||||
import MovieHistoryModalContentConnector from './MovieHistoryModalContentConnector';
|
||||
|
||||
function MovieHistoryModal(props) {
|
||||
const {
|
||||
isOpen,
|
||||
onModalClose,
|
||||
...otherProps
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<Modal
|
||||
isOpen={isOpen}
|
||||
onModalClose={onModalClose}
|
||||
size={sizes.EXTRA_EXTRA_LARGE}
|
||||
>
|
||||
<MovieHistoryModalContentConnector
|
||||
{...otherProps}
|
||||
onModalClose={onModalClose}
|
||||
/>
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
|
||||
MovieHistoryModal.propTypes = {
|
||||
isOpen: PropTypes.bool.isRequired,
|
||||
onModalClose: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default MovieHistoryModal;
|
||||
28
frontend/src/Movie/History/MovieHistoryModal.tsx
Normal file
28
frontend/src/Movie/History/MovieHistoryModal.tsx
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
import React from 'react';
|
||||
import Modal from 'Components/Modal/Modal';
|
||||
import { sizes } from 'Helpers/Props';
|
||||
import MovieHistoryModalContent, {
|
||||
MovieHistoryModalContentProps,
|
||||
} from 'Movie/History/MovieHistoryModalContent';
|
||||
|
||||
interface MovieHistoryModalProps extends MovieHistoryModalContentProps {
|
||||
isOpen: boolean;
|
||||
}
|
||||
|
||||
function MovieHistoryModal({
|
||||
isOpen,
|
||||
onModalClose,
|
||||
...otherProps
|
||||
}: MovieHistoryModalProps) {
|
||||
return (
|
||||
<Modal
|
||||
isOpen={isOpen}
|
||||
size={sizes.EXTRA_EXTRA_LARGE}
|
||||
onModalClose={onModalClose}
|
||||
>
|
||||
<MovieHistoryModalContent {...otherProps} onModalClose={onModalClose} />
|
||||
</Modal>
|
||||
);
|
||||
}
|
||||
|
||||
export default MovieHistoryModal;
|
||||
|
|
@ -1,141 +0,0 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import Alert from 'Components/Alert';
|
||||
import Icon from 'Components/Icon';
|
||||
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 Table from 'Components/Table/Table';
|
||||
import TableBody from 'Components/Table/TableBody';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import MovieHistoryRowConnector from './MovieHistoryRowConnector';
|
||||
|
||||
const columns = [
|
||||
{
|
||||
name: 'eventType',
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'sourceTitle',
|
||||
label: () => translate('SourceTitle'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'languages',
|
||||
label: () => translate('Languages'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'quality',
|
||||
label: () => translate('Quality'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'customFormats',
|
||||
label: () => translate('CustomFormats'),
|
||||
isSortable: false,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'customFormatScore',
|
||||
label: React.createElement(Icon, {
|
||||
name: icons.SCORE,
|
||||
title: () => translate('CustomFormatScore')
|
||||
}),
|
||||
isSortable: true,
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'date',
|
||||
label: () => translate('Date'),
|
||||
isVisible: true
|
||||
},
|
||||
{
|
||||
name: 'actions',
|
||||
isVisible: true
|
||||
}
|
||||
];
|
||||
|
||||
class MovieHistoryModalContent extends Component {
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
render() {
|
||||
const {
|
||||
isFetching,
|
||||
isPopulated,
|
||||
error,
|
||||
items,
|
||||
onMarkAsFailedPress,
|
||||
onModalClose
|
||||
} = this.props;
|
||||
|
||||
const hasItems = !!items.length;
|
||||
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>
|
||||
{translate('History')}
|
||||
</ModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
{
|
||||
isFetching &&
|
||||
<LoadingIndicator />
|
||||
}
|
||||
|
||||
{
|
||||
!isFetching && !!error &&
|
||||
<Alert kind={kinds.DANGER}>{translate('HistoryLoadError')}</Alert>
|
||||
}
|
||||
|
||||
{
|
||||
isPopulated && !hasItems && !error &&
|
||||
<div>{translate('NoHistory')}</div>
|
||||
}
|
||||
|
||||
{
|
||||
isPopulated && hasItems && !error &&
|
||||
<Table columns={columns}>
|
||||
<TableBody>
|
||||
{
|
||||
items.map((item) => {
|
||||
return (
|
||||
<MovieHistoryRowConnector
|
||||
key={item.id}
|
||||
{...item}
|
||||
onMarkAsFailedPress={onMarkAsFailedPress}
|
||||
/>
|
||||
);
|
||||
})
|
||||
}
|
||||
</TableBody>
|
||||
</Table>
|
||||
}
|
||||
</ModalBody>
|
||||
|
||||
<ModalFooter>
|
||||
<Button onPress={onModalClose}>
|
||||
{translate('Close')}
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
MovieHistoryModalContent.propTypes = {
|
||||
isFetching: PropTypes.bool.isRequired,
|
||||
isPopulated: PropTypes.bool.isRequired,
|
||||
error: PropTypes.object,
|
||||
items: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
onMarkAsFailedPress: PropTypes.func.isRequired,
|
||||
onModalClose: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default MovieHistoryModalContent;
|
||||
148
frontend/src/Movie/History/MovieHistoryModalContent.tsx
Normal file
148
frontend/src/Movie/History/MovieHistoryModalContent.tsx
Normal file
|
|
@ -0,0 +1,148 @@
|
|||
import React, { useCallback, useEffect } from 'react';
|
||||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import AppState from 'App/State/AppState';
|
||||
import Alert from 'Components/Alert';
|
||||
import Icon from 'Components/Icon';
|
||||
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 Column from 'Components/Table/Column';
|
||||
import Table from 'Components/Table/Table';
|
||||
import TableBody from 'Components/Table/TableBody';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import {
|
||||
clearMovieHistory,
|
||||
fetchMovieHistory,
|
||||
movieHistoryMarkAsFailed,
|
||||
} from 'Store/Actions/movieHistoryActions';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import MovieHistoryRow from './MovieHistoryRow';
|
||||
|
||||
const columns: Column[] = [
|
||||
{
|
||||
name: 'eventType',
|
||||
label: '',
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'sourceTitle',
|
||||
label: () => translate('SourceTitle'),
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'languages',
|
||||
label: () => translate('Languages'),
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'quality',
|
||||
label: () => translate('Quality'),
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'customFormats',
|
||||
label: () => translate('CustomFormats'),
|
||||
isSortable: false,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'customFormatScore',
|
||||
label: React.createElement(Icon, {
|
||||
name: icons.SCORE,
|
||||
title: () => translate('CustomFormatScore'),
|
||||
}),
|
||||
isSortable: true,
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'date',
|
||||
label: () => translate('Date'),
|
||||
isVisible: true,
|
||||
},
|
||||
{
|
||||
name: 'actions',
|
||||
label: '',
|
||||
isVisible: true,
|
||||
},
|
||||
];
|
||||
|
||||
export interface MovieHistoryModalContentProps {
|
||||
movieId: number;
|
||||
onModalClose: () => void;
|
||||
}
|
||||
|
||||
function MovieHistoryModalContent({
|
||||
movieId,
|
||||
onModalClose,
|
||||
}: MovieHistoryModalContentProps) {
|
||||
const dispatch = useDispatch();
|
||||
|
||||
const { isFetching, isPopulated, error, items } = useSelector(
|
||||
(state: AppState) => state.movieHistory
|
||||
);
|
||||
|
||||
const hasItems = !!items.length;
|
||||
|
||||
const handleMarkAsFailedPress = useCallback(
|
||||
(historyId: number) => {
|
||||
dispatch(
|
||||
movieHistoryMarkAsFailed({
|
||||
historyId,
|
||||
movieId,
|
||||
})
|
||||
);
|
||||
},
|
||||
[movieId, dispatch]
|
||||
);
|
||||
|
||||
useEffect(() => {
|
||||
dispatch(fetchMovieHistory({ movieId }));
|
||||
|
||||
return () => {
|
||||
dispatch(clearMovieHistory());
|
||||
};
|
||||
}, [movieId, dispatch]);
|
||||
|
||||
return (
|
||||
<ModalContent onModalClose={onModalClose}>
|
||||
<ModalHeader>{translate('History')}</ModalHeader>
|
||||
|
||||
<ModalBody>
|
||||
{isFetching && !isPopulated ? <LoadingIndicator /> : null}
|
||||
|
||||
{!isFetching && !!error ? (
|
||||
<Alert kind={kinds.DANGER}>{translate('HistoryLoadError')}</Alert>
|
||||
) : null}
|
||||
|
||||
{isPopulated && !hasItems && !error ? (
|
||||
<div>{translate('NoHistory')}</div>
|
||||
) : null}
|
||||
|
||||
{isPopulated && hasItems && !error && (
|
||||
<Table columns={columns}>
|
||||
<TableBody>
|
||||
{items.map((item) => {
|
||||
return (
|
||||
<MovieHistoryRow
|
||||
key={item.id}
|
||||
{...item}
|
||||
onMarkAsFailedPress={handleMarkAsFailedPress}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</TableBody>
|
||||
</Table>
|
||||
)}
|
||||
</ModalBody>
|
||||
|
||||
<ModalFooter>
|
||||
<Button onPress={onModalClose}>{translate('Close')}</Button>
|
||||
</ModalFooter>
|
||||
</ModalContent>
|
||||
);
|
||||
}
|
||||
|
||||
export default MovieHistoryModalContent;
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { clearMovieHistory, fetchMovieHistory, movieHistoryMarkAsFailed } from 'Store/Actions/movieHistoryActions';
|
||||
import MovieHistoryModalContent from './MovieHistoryModalContent';
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
(state) => state.movieHistory,
|
||||
(movieHistory) => {
|
||||
return movieHistory;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
const mapDispatchToProps = {
|
||||
fetchMovieHistory,
|
||||
clearMovieHistory,
|
||||
movieHistoryMarkAsFailed
|
||||
};
|
||||
|
||||
class MovieHistoryModalContentConnector extends Component {
|
||||
|
||||
//
|
||||
// Lifecycle
|
||||
|
||||
componentDidMount() {
|
||||
const {
|
||||
movieId
|
||||
} = this.props;
|
||||
|
||||
this.props.fetchMovieHistory({
|
||||
movieId
|
||||
});
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
this.props.clearMovieHistory();
|
||||
}
|
||||
|
||||
//
|
||||
// Listeners
|
||||
|
||||
onMarkAsFailedPress = (historyId) => {
|
||||
const {
|
||||
movieId
|
||||
} = this.props;
|
||||
|
||||
this.props.movieHistoryMarkAsFailed({
|
||||
historyId,
|
||||
movieId
|
||||
});
|
||||
};
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
render() {
|
||||
return (
|
||||
<MovieHistoryModalContent
|
||||
{...this.props}
|
||||
onMarkAsFailedPress={this.onMarkAsFailedPress}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
MovieHistoryModalContentConnector.propTypes = {
|
||||
movieId: PropTypes.number.isRequired,
|
||||
fetchMovieHistory: PropTypes.func.isRequired,
|
||||
clearMovieHistory: PropTypes.func.isRequired,
|
||||
movieHistoryMarkAsFailed: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default connect(createMapStateToProps, mapDispatchToProps)(MovieHistoryModalContentConnector);
|
||||
|
|
@ -1,181 +0,0 @@
|
|||
import PropTypes from 'prop-types';
|
||||
import React, { Component } from 'react';
|
||||
import HistoryDetailsModal from 'Activity/History/Details/HistoryDetailsModal';
|
||||
import HistoryEventTypeCell from 'Activity/History/HistoryEventTypeCell';
|
||||
import IconButton from 'Components/Link/IconButton';
|
||||
import ConfirmModal from 'Components/Modal/ConfirmModal';
|
||||
import RelativeDateCell from 'Components/Table/Cells/RelativeDateCell';
|
||||
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
||||
import TableRow from 'Components/Table/TableRow';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import MovieFormats from 'Movie/MovieFormats';
|
||||
import MovieLanguages from 'Movie/MovieLanguages';
|
||||
import MovieQuality from 'Movie/MovieQuality';
|
||||
import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './MovieHistoryRow.css';
|
||||
|
||||
class MovieHistoryRow extends Component {
|
||||
|
||||
//
|
||||
// Lifecycle
|
||||
|
||||
constructor(props, context) {
|
||||
super(props, context);
|
||||
|
||||
this.state = {
|
||||
isMarkAsFailedModalOpen: false,
|
||||
isDetailsModalOpen: false
|
||||
};
|
||||
}
|
||||
|
||||
//
|
||||
// Listeners
|
||||
|
||||
onMarkAsFailedPress = () => {
|
||||
this.setState({ isMarkAsFailedModalOpen: true });
|
||||
};
|
||||
|
||||
onConfirmMarkAsFailed = () => {
|
||||
this.props.onMarkAsFailedPress(this.props.id);
|
||||
this.setState({ isMarkAsFailedModalOpen: false });
|
||||
};
|
||||
|
||||
onMarkAsFailedModalClose = () => {
|
||||
this.setState({ isMarkAsFailedModalOpen: false });
|
||||
};
|
||||
|
||||
onDetailsPress = () => {
|
||||
this.setState({ isDetailsModalOpen: true });
|
||||
};
|
||||
|
||||
onDetailsModalClose = () => {
|
||||
this.setState({ isDetailsModalOpen: false });
|
||||
};
|
||||
|
||||
//
|
||||
// Render
|
||||
|
||||
render() {
|
||||
const {
|
||||
eventType,
|
||||
sourceTitle,
|
||||
quality,
|
||||
customFormats,
|
||||
customFormatScore,
|
||||
languages,
|
||||
qualityCutoffNotMet,
|
||||
date,
|
||||
data,
|
||||
downloadId,
|
||||
isMarkingAsFailed,
|
||||
shortDateFormat,
|
||||
timeFormat
|
||||
} = this.props;
|
||||
|
||||
const {
|
||||
isMarkAsFailedModalOpen
|
||||
} = this.state;
|
||||
|
||||
return (
|
||||
<TableRow>
|
||||
<HistoryEventTypeCell
|
||||
eventType={eventType}
|
||||
data={data}
|
||||
/>
|
||||
|
||||
<TableRowCell className={styles.sourceTitle}>
|
||||
{sourceTitle}
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell>
|
||||
<MovieLanguages
|
||||
languages={languages}
|
||||
/>
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell>
|
||||
<MovieQuality
|
||||
quality={quality}
|
||||
isCutoffNotMet={qualityCutoffNotMet}
|
||||
/>
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell>
|
||||
<MovieFormats formats={customFormats} />
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.customFormatScore}>
|
||||
{formatCustomFormatScore(customFormatScore, customFormats.length)}
|
||||
</TableRowCell>
|
||||
|
||||
<RelativeDateCell
|
||||
date={date}
|
||||
includeSeconds={true}
|
||||
includeTime={true}
|
||||
/>
|
||||
|
||||
<TableRowCell className={styles.actions}>
|
||||
<IconButton
|
||||
name={icons.INFO}
|
||||
onPress={this.onDetailsPress}
|
||||
/>
|
||||
|
||||
{
|
||||
eventType === 'grabbed' &&
|
||||
<IconButton
|
||||
title={translate('MarkAsFailed')}
|
||||
name={icons.REMOVE}
|
||||
size={14}
|
||||
onPress={this.onMarkAsFailedPress}
|
||||
/>
|
||||
}
|
||||
</TableRowCell>
|
||||
|
||||
<ConfirmModal
|
||||
isOpen={isMarkAsFailedModalOpen}
|
||||
kind={kinds.DANGER}
|
||||
title={translate('MarkAsFailed')}
|
||||
message={translate('MarkAsFailedMessageText', [sourceTitle])}
|
||||
confirmLabel={translate('MarkAsFailed')}
|
||||
onConfirm={this.onConfirmMarkAsFailed}
|
||||
onCancel={this.onMarkAsFailedModalClose}
|
||||
/>
|
||||
|
||||
<HistoryDetailsModal
|
||||
isOpen={this.state.isDetailsModalOpen}
|
||||
eventType={eventType}
|
||||
sourceTitle={sourceTitle}
|
||||
data={data}
|
||||
downloadId={downloadId}
|
||||
isMarkingAsFailed={isMarkingAsFailed}
|
||||
shortDateFormat={shortDateFormat}
|
||||
timeFormat={timeFormat}
|
||||
onMarkAsFailedPress={this.onMarkAsFailedPress}
|
||||
onModalClose={this.onDetailsModalClose}
|
||||
/>
|
||||
</TableRow>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
MovieHistoryRow.propTypes = {
|
||||
id: PropTypes.number.isRequired,
|
||||
eventType: PropTypes.string.isRequired,
|
||||
sourceTitle: PropTypes.string.isRequired,
|
||||
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||
quality: PropTypes.object.isRequired,
|
||||
customFormats: PropTypes.arrayOf(PropTypes.object),
|
||||
customFormatScore: PropTypes.number.isRequired,
|
||||
qualityCutoffNotMet: PropTypes.bool.isRequired,
|
||||
date: PropTypes.string.isRequired,
|
||||
data: PropTypes.object.isRequired,
|
||||
downloadId: PropTypes.string,
|
||||
isMarkingAsFailed: PropTypes.bool,
|
||||
movie: PropTypes.object.isRequired,
|
||||
shortDateFormat: PropTypes.string.isRequired,
|
||||
timeFormat: PropTypes.string.isRequired,
|
||||
onMarkAsFailedPress: PropTypes.func.isRequired
|
||||
};
|
||||
|
||||
export default MovieHistoryRow;
|
||||
134
frontend/src/Movie/History/MovieHistoryRow.tsx
Normal file
134
frontend/src/Movie/History/MovieHistoryRow.tsx
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
import React, { useCallback, useState } from 'react';
|
||||
import HistoryDetailsModal from 'Activity/History/Details/HistoryDetailsModal';
|
||||
import HistoryEventTypeCell from 'Activity/History/HistoryEventTypeCell';
|
||||
import IconButton from 'Components/Link/IconButton';
|
||||
import ConfirmModal from 'Components/Modal/ConfirmModal';
|
||||
import RelativeDateCell from 'Components/Table/Cells/RelativeDateCell';
|
||||
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
||||
import TableRow from 'Components/Table/TableRow';
|
||||
import { icons, kinds } from 'Helpers/Props';
|
||||
import Language from 'Language/Language';
|
||||
import MovieFormats from 'Movie/MovieFormats';
|
||||
import MovieLanguages from 'Movie/MovieLanguages';
|
||||
import MovieQuality from 'Movie/MovieQuality';
|
||||
import { QualityModel } from 'Quality/Quality';
|
||||
import CustomFormat from 'typings/CustomFormat';
|
||||
import { HistoryData, HistoryEventType } from 'typings/History';
|
||||
import formatCustomFormatScore from 'Utilities/Number/formatCustomFormatScore';
|
||||
import translate from 'Utilities/String/translate';
|
||||
import styles from './MovieHistoryRow.css';
|
||||
|
||||
interface MovieHistoryRowProps {
|
||||
id: number;
|
||||
eventType: HistoryEventType;
|
||||
sourceTitle: string;
|
||||
languages?: Language[];
|
||||
quality: QualityModel;
|
||||
qualityCutoffNotMet: boolean;
|
||||
customFormats?: CustomFormat[];
|
||||
customFormatScore: number;
|
||||
date: string;
|
||||
data: HistoryData;
|
||||
downloadId?: string;
|
||||
onMarkAsFailedPress: (historyId: number) => void;
|
||||
}
|
||||
|
||||
function MovieHistoryRow({
|
||||
id,
|
||||
eventType,
|
||||
sourceTitle,
|
||||
languages = [],
|
||||
quality,
|
||||
qualityCutoffNotMet,
|
||||
customFormats = [],
|
||||
customFormatScore,
|
||||
date,
|
||||
data,
|
||||
downloadId,
|
||||
onMarkAsFailedPress,
|
||||
}: MovieHistoryRowProps) {
|
||||
const [isDetailsModalOpen, setIsDetailsModalOpen] = useState(false);
|
||||
const [isMarkAsFailedModalOpen, setIsMarkAsFailedModalOpen] = useState(false);
|
||||
|
||||
const handleDetailsPress = useCallback(() => {
|
||||
setIsDetailsModalOpen(true);
|
||||
}, [setIsDetailsModalOpen]);
|
||||
|
||||
const handleDetailsModalClose = useCallback(() => {
|
||||
setIsDetailsModalOpen(false);
|
||||
}, [setIsDetailsModalOpen]);
|
||||
|
||||
const handleMarkAsFailedPress = useCallback(() => {
|
||||
setIsMarkAsFailedModalOpen(true);
|
||||
}, []);
|
||||
|
||||
const handleConfirmMarkAsFailed = useCallback(() => {
|
||||
onMarkAsFailedPress(id);
|
||||
setIsMarkAsFailedModalOpen(false);
|
||||
}, [id, onMarkAsFailedPress]);
|
||||
|
||||
const handleMarkAsFailedModalClose = useCallback(() => {
|
||||
setIsMarkAsFailedModalOpen(false);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<TableRow>
|
||||
<HistoryEventTypeCell eventType={eventType} data={data} />
|
||||
|
||||
<TableRowCell className={styles.sourceTitle}>{sourceTitle}</TableRowCell>
|
||||
|
||||
<TableRowCell>
|
||||
<MovieLanguages languages={languages} />
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell>
|
||||
<MovieQuality quality={quality} isCutoffNotMet={qualityCutoffNotMet} />
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell>
|
||||
<MovieFormats formats={customFormats} />
|
||||
</TableRowCell>
|
||||
|
||||
<TableRowCell className={styles.customFormatScore}>
|
||||
{formatCustomFormatScore(customFormatScore, customFormats.length)}
|
||||
</TableRowCell>
|
||||
|
||||
<RelativeDateCell date={date} includeSeconds={true} includeTime={true} />
|
||||
|
||||
<TableRowCell className={styles.actions}>
|
||||
<IconButton name={icons.INFO} onPress={handleDetailsPress} />
|
||||
|
||||
{eventType === 'grabbed' ? (
|
||||
<IconButton
|
||||
title={translate('MarkAsFailed')}
|
||||
name={icons.REMOVE}
|
||||
size={14}
|
||||
onPress={handleMarkAsFailedPress}
|
||||
/>
|
||||
) : null}
|
||||
</TableRowCell>
|
||||
|
||||
<ConfirmModal
|
||||
isOpen={isMarkAsFailedModalOpen}
|
||||
kind={kinds.DANGER}
|
||||
title={translate('MarkAsFailed')}
|
||||
message={translate('MarkAsFailedConfirmation', { sourceTitle })}
|
||||
confirmLabel={translate('MarkAsFailed')}
|
||||
onConfirm={handleConfirmMarkAsFailed}
|
||||
onCancel={handleMarkAsFailedModalClose}
|
||||
/>
|
||||
|
||||
<HistoryDetailsModal
|
||||
isOpen={isDetailsModalOpen}
|
||||
eventType={eventType}
|
||||
sourceTitle={sourceTitle}
|
||||
data={data}
|
||||
downloadId={downloadId}
|
||||
onMarkAsFailedPress={handleMarkAsFailedPress}
|
||||
onModalClose={handleDetailsModalClose}
|
||||
/>
|
||||
</TableRow>
|
||||
);
|
||||
}
|
||||
|
||||
export default MovieHistoryRow;
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
import { connect } from 'react-redux';
|
||||
import { createSelector } from 'reselect';
|
||||
import { fetchHistory, markAsFailed } from 'Store/Actions/historyActions';
|
||||
import createMovieSelector from 'Store/Selectors/createMovieSelector';
|
||||
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
|
||||
import MovieHistoryRow from './MovieHistoryRow';
|
||||
|
||||
function createMapStateToProps() {
|
||||
return createSelector(
|
||||
createMovieSelector(),
|
||||
createUISettingsSelector(),
|
||||
(movie, uiSettings) => {
|
||||
return {
|
||||
movie,
|
||||
shortDateFormat: uiSettings.shortDateFormat,
|
||||
timeFormat: uiSettings.timeFormat
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
const mapDispatchToProps = {
|
||||
fetchHistory,
|
||||
markAsFailed
|
||||
};
|
||||
|
||||
export default connect(createMapStateToProps, mapDispatchToProps)(MovieHistoryRow);
|
||||
|
|
@ -879,7 +879,7 @@
|
|||
"MaximumLimits": "الحدود القصوى",
|
||||
"Max": "ماكس",
|
||||
"MassMovieSearch": "البحث الشامل عن الأفلام",
|
||||
"MarkAsFailedMessageText": "هل أنت متأكد أنك تريد وضع علامة \"{0}\" على أنه فشل؟",
|
||||
"MarkAsFailedConfirmation": "هل أنت متأكد أنك تريد وضع علامة \"{0}\" على أنه فشل؟",
|
||||
"MarkAsFailed": "وضع علامة فشل",
|
||||
"MappedNetworkDrivesWindowsService": "لا تتوفر محركات أقراص الشبكة المعينة عند التشغيل كخدمة Windows. يرجى الاطلاع على التعليمات لمزيد من المعلومات",
|
||||
"ManualImportSelectQuality": " استيراد يدوي - حدد الجودة",
|
||||
|
|
|
|||
|
|
@ -329,7 +329,7 @@
|
|||
"ManualImportSelectMovie": "Ръчно импортиране - Изберете филм",
|
||||
"ManualImportSelectQuality": " Ръчен импорт - Изберете качество",
|
||||
"MappedNetworkDrivesWindowsService": "Картографираните мрежови устройства не са налични, когато се изпълняват като услуга на Windows. Моля, вижте често задаваните въпроси за повече информация",
|
||||
"MarkAsFailedMessageText": "Наистина ли искате да маркирате „{0}“ като неуспешен?",
|
||||
"MarkAsFailedConfirmation": "Наистина ли искате да маркирате „{0}“ като неуспешен?",
|
||||
"MassMovieSearch": "Масово търсене на филми",
|
||||
"MaximumLimits": "Максимални граници",
|
||||
"MaximumSize": "Максимален размер",
|
||||
|
|
|
|||
|
|
@ -324,7 +324,7 @@
|
|||
"EditMovie": "Edita pel·lícula",
|
||||
"EnableColorImpairedModeHelpText": "Estil alterat per a permetre als usuaris amb problemes de color distingir millor la informació codificada per colors",
|
||||
"Folder": "Carpeta",
|
||||
"MarkAsFailedMessageText": "Esteu segur que voleu marcar '{0}' com a fallat?",
|
||||
"MarkAsFailedConfirmation": "Esteu segur que voleu marcar '{0}' com a fallat?",
|
||||
"Negated": "Negat",
|
||||
"Profiles": "Perfils",
|
||||
"Real": "Real",
|
||||
|
|
|
|||
|
|
@ -664,7 +664,7 @@
|
|||
"ManualImportSelectMovie": "Ruční import - vyberte Film",
|
||||
"ManualImportSelectQuality": " Ruční import - vyberte kvalitu",
|
||||
"MappedNetworkDrivesWindowsService": "Mapované síťové jednotky nejsou k dispozici, když běží jako služba Windows. Další informace najdete v [FAQ]({url}).",
|
||||
"MarkAsFailedMessageText": "Opravdu chcete označit „{0}“ jako neúspěšné?",
|
||||
"MarkAsFailedConfirmation": "Opravdu chcete označit „{0}“ jako neúspěšné?",
|
||||
"MassMovieSearch": "Hromadné vyhledávání filmů",
|
||||
"MaximumLimits": "Maximální limity",
|
||||
"MaximumSize": "Maximální velikost",
|
||||
|
|
|
|||
|
|
@ -627,7 +627,7 @@
|
|||
"ManualImportSelectLanguage": "Manuel import - Vælg sprog",
|
||||
"ManualImportSelectMovie": "Manuel import - Vælg film",
|
||||
"ManualImportSelectQuality": " Manuel import - Vælg kvalitet",
|
||||
"MarkAsFailedMessageText": "Er du sikker på, at du vil markere '{0}' som mislykket?",
|
||||
"MarkAsFailedConfirmation": "Er du sikker på, at du vil markere '{0}' som mislykket?",
|
||||
"MaximumLimits": "Maksimumgrænser",
|
||||
"MaximumSize": "Maksimal størrelse",
|
||||
"MegabytesPerMinute": "Megabyte pr. Minut",
|
||||
|
|
|
|||
|
|
@ -601,7 +601,7 @@
|
|||
"MovieIsMonitored": "Film wird beobachtet",
|
||||
"MovieExcludedFromAutomaticAdd": "Film vom automatischen hinzufügen ausgeschlossen",
|
||||
"MovieAlreadyExcluded": "Film ist schon ausgeschlossen",
|
||||
"MarkAsFailedMessageText": "'{0}' wirklich als fehlgeschlagen markieren?",
|
||||
"MarkAsFailedConfirmation": "'{0}' wirklich als fehlgeschlagen markieren?",
|
||||
"Manual": "Manuell",
|
||||
"LogLevelTraceHelpTextWarning": "Die Trace-Protokollierung sollte nur vorübergehend aktiviert werden",
|
||||
"LastDuration": "Letzte Dauer",
|
||||
|
|
|
|||
|
|
@ -618,7 +618,7 @@
|
|||
"ManualImportSelectLanguage": "Μη αυτόματη εισαγωγή - Επιλέξτε γλώσσα",
|
||||
"ManualImportSelectQuality": " Μη αυτόματη εισαγωγή - Επιλέξτε Ποιότητα",
|
||||
"MappedNetworkDrivesWindowsService": "Οι αντιστοιχισμένες μονάδες δίσκου δικτύου δεν είναι διαθέσιμες κατά την εκτέλεση ως υπηρεσία Windows. Ανατρέξτε στις Συχνές Ερωτήσεις για περισσότερες πληροφορίες",
|
||||
"MarkAsFailedMessageText": "Είστε βέβαιοι ότι θέλετε να επισημάνετε \"{0}\" ως αποτυχημένο;",
|
||||
"MarkAsFailedConfirmation": "Είστε βέβαιοι ότι θέλετε να επισημάνετε \"{0}\" ως αποτυχημένο;",
|
||||
"MassMovieSearch": "Μαζική αναζήτηση ταινιών",
|
||||
"MaximumLimits": "Μέγιστα όρια",
|
||||
"MaximumSize": "Μέγιστο μέγεθος",
|
||||
|
|
|
|||
|
|
@ -955,7 +955,7 @@
|
|||
"ManualImportSetReleaseGroup": "Manual Import - Set Release Group",
|
||||
"MappedNetworkDrivesWindowsService": "Mapped network drives are not available when running as a Windows Service, see the [FAQ]({url}) for more information.",
|
||||
"MarkAsFailed": "Mark as Failed",
|
||||
"MarkAsFailedMessageText": "Are you sure you want to mark '{0}' as failed?",
|
||||
"MarkAsFailedConfirmation": "Are you sure you want to mark '{sourceTitle}' as failed?",
|
||||
"MassMovieSearch": "Mass Movie Search",
|
||||
"MassSearchCancelWarning": "This cannot be cancelled once started without restarting {appName} or disabling all of your indexers.",
|
||||
"MatchedToMovie": "Matched to Movie",
|
||||
|
|
|
|||
|
|
@ -602,7 +602,7 @@
|
|||
"MovieIsMonitored": "La película está monitorizada",
|
||||
"MovieExcludedFromAutomaticAdd": "Película Excluida de Adición Automática",
|
||||
"MovieAlreadyExcluded": "Película ya Excluida",
|
||||
"MarkAsFailedMessageText": "¿Estás seguro que quieres marcar '{0}' como fallida?",
|
||||
"MarkAsFailedConfirmation": "¿Estás seguro que quieres marcar '{0}' como fallida?",
|
||||
"Manual": "Manual",
|
||||
"LogLevelTraceHelpTextWarning": "El registro de seguimiento sólo debe activarse temporalmente",
|
||||
"LastDuration": "Última Duración",
|
||||
|
|
|
|||
|
|
@ -628,7 +628,7 @@
|
|||
"Lowercase": "Pienet kirjaimet",
|
||||
"ManualImportSelectLanguage": "Manuaalinen tuonti – Valitse kieli",
|
||||
"ManualImportSelectQuality": " Manuaalinen tuonti – Valitse laatu",
|
||||
"MarkAsFailedMessageText": "Haluatko varmasti merkitä kohteen {0} epäonnistuneeksi?",
|
||||
"MarkAsFailedConfirmation": "Haluatko varmasti merkitä kohteen {0} epäonnistuneeksi?",
|
||||
"MassMovieSearch": "Elokuvien massahaku",
|
||||
"MaximumLimits": "Enimmäisrajoitukset",
|
||||
"MaximumSize": "Enimmäiskoko",
|
||||
|
|
|
|||
|
|
@ -653,7 +653,7 @@
|
|||
"RemovingTag": "Supprimer la balise",
|
||||
"RadarrTags": "Étiquettes {appName}",
|
||||
"Paused": "En pause",
|
||||
"MarkAsFailedMessageText": "Voulez-vous vraiment marquer '{0}' comme échoué ?",
|
||||
"MarkAsFailedConfirmation": "Voulez-vous vraiment marquer '{0}' comme échoué ?",
|
||||
"ExistingTag": "Balise existante",
|
||||
"DownloadPropersAndRepacksHelpTextWarning": "Utilisez des formats personnalisés pour les mises à niveau automatiques vers Propers/Repacks",
|
||||
"DownloadPropersAndRepacksHelpTextCustomFormat": "Utiliser 'Ne pas préférer' pour trier par score de mot préféré par rapport aux propres/repacks",
|
||||
|
|
|
|||
|
|
@ -628,7 +628,7 @@
|
|||
"ManualImportSelectMovie": "ייבוא ידני - בחר סרט",
|
||||
"ManualImportSelectQuality": " יבוא ידני - בחר איכות",
|
||||
"MappedNetworkDrivesWindowsService": "כונני רשת ממופים אינם זמינים כאשר הם פועלים כשירות Windows. אנא עיין בשאלות הנפוצות למידע נוסף",
|
||||
"MarkAsFailedMessageText": "האם אתה בטוח שברצונך לסמן את '{0}' ככושל?",
|
||||
"MarkAsFailedConfirmation": "האם אתה בטוח שברצונך לסמן את '{0}' ככושל?",
|
||||
"MassMovieSearch": "חיפוש סרטים המוני",
|
||||
"MaximumLimits": "מגבלות מקסימליות",
|
||||
"MaximumSize": "גודל מקסימלי",
|
||||
|
|
|
|||
|
|
@ -747,7 +747,7 @@
|
|||
"LookingForReleaseProfiles2": "बजाय।",
|
||||
"Lowercase": "लोअर केस",
|
||||
"ManualImportSelectQuality": " मैनुअल आयात - गुणवत्ता का चयन करें",
|
||||
"MarkAsFailedMessageText": "क्या आप वाकई '{0}' को चिह्नित करना चाहते हैं?",
|
||||
"MarkAsFailedConfirmation": "क्या आप वाकई '{0}' को चिह्नित करना चाहते हैं?",
|
||||
"MassMovieSearch": "मास मूवी सर्च",
|
||||
"MaximumLimits": "अधिकतम सीमा",
|
||||
"Message": "संदेश",
|
||||
|
|
|
|||
|
|
@ -544,7 +544,7 @@
|
|||
"MaximumSize": "Maximális méret",
|
||||
"MaximumLimits": "Maximális korlátok",
|
||||
"MassMovieSearch": "Tömeges filmkeresés",
|
||||
"MarkAsFailedMessageText": "Biztosan sikertelennek szeretnéd jelölni a (z) „{0}”-t?",
|
||||
"MarkAsFailedConfirmation": "Biztosan sikertelennek szeretnéd jelölni a (z) „{0}”-t?",
|
||||
"MarkAsFailed": "Megjelölés sikertelenként",
|
||||
"ManualImport": "Kézi importálás",
|
||||
"Manual": "Kézi",
|
||||
|
|
|
|||
|
|
@ -663,7 +663,7 @@
|
|||
"ManualImportSelectMovie": "Handvirkur innflutningur - Veldu kvikmynd",
|
||||
"ManualImportSelectQuality": " Handvirkur innflutningur - Veldu gæði",
|
||||
"MappedNetworkDrivesWindowsService": "Kortlagðar netdrif eru ekki fáanlegar þegar þær eru keyrðar sem Windows þjónusta. Vinsamlegast skoðaðu algengar spurningar fyrir frekari upplýsingar",
|
||||
"MarkAsFailedMessageText": "Ertu viss um að þú viljir merkja '{0}' sem mistókst?",
|
||||
"MarkAsFailedConfirmation": "Ertu viss um að þú viljir merkja '{0}' sem mistókst?",
|
||||
"MaximumLimits": "Hámarksmörk",
|
||||
"MaximumSize": "Hámarksstærð",
|
||||
"MegabytesPerMinute": "Megabæti á mínútu",
|
||||
|
|
|
|||
|
|
@ -502,7 +502,7 @@
|
|||
"MaximumSizeHelpText": "La dimensione massima in MB di una release affinchè sia presa, imposta zero per illimitata",
|
||||
"MaximumSize": "Dimensione Massima",
|
||||
"MaximumLimits": "Limiti massimi",
|
||||
"MarkAsFailedMessageText": "Sei sicuro di voler segnare '{0}' come fallito?",
|
||||
"MarkAsFailedConfirmation": "Sei sicuro di voler segnare '{0}' come fallito?",
|
||||
"MarkAsFailed": "Segna come fallito",
|
||||
"Manual": "Manuale",
|
||||
"MaintenanceRelease": "Release di Manutenzione: correzione di bug e altri miglioramenti. Vedi la storia dei Commit su Github per maggiori dettagli",
|
||||
|
|
|
|||
|
|
@ -615,7 +615,7 @@
|
|||
"ManualImportSelectMovie": "手動インポート-ムービーを選択",
|
||||
"ManualImportSelectQuality": " 手動インポート-品質を選択",
|
||||
"MappedNetworkDrivesWindowsService": "マップされたネットワークドライブは、Windowsサービスとして実行している場合は使用できません。詳細については、FAQを参照してください",
|
||||
"MarkAsFailedMessageText": "'{0}'を失敗としてマークしてもよろしいですか?",
|
||||
"MarkAsFailedConfirmation": "'{0}'を失敗としてマークしてもよろしいですか?",
|
||||
"MassMovieSearch": "マスムービー検索",
|
||||
"MaximumLimits": "最大制限",
|
||||
"MaximumSize": "最大サイズ",
|
||||
|
|
|
|||
|
|
@ -625,7 +625,7 @@
|
|||
"ManualImportSelectMovie": "수동 가져오기 - 동영상 선택",
|
||||
"ManualImportSelectQuality": " 수동 가져오기-품질 선택",
|
||||
"MappedNetworkDrivesWindowsService": "윈도우 서비스로 실행할 때는 매핑 된 네트워크 드라이브를 사용할 수 없습니다, 상세 내용은 FAQ를 참조하세요.",
|
||||
"MarkAsFailedMessageText": "'{0}'을(를) 실패한 것으로 표시 하시겠습니까?",
|
||||
"MarkAsFailedConfirmation": "'{0}'을(를) 실패한 것으로 표시 하시겠습니까?",
|
||||
"MassMovieSearch": "대량 영화 검색",
|
||||
"MaximumLimits": "최대 한도",
|
||||
"MaximumSize": "최대 크기",
|
||||
|
|
|
|||
|
|
@ -608,7 +608,7 @@
|
|||
"MovieIsMonitored": "Film wordt gemonitord",
|
||||
"MovieExcludedFromAutomaticAdd": "Film Uitgesloten Van Automatisch Toevoegen",
|
||||
"MovieAlreadyExcluded": "Film werd al Uitgesloten",
|
||||
"MarkAsFailedMessageText": "Bent u zeker dat u '{0}' als mislukt wilt markeren?",
|
||||
"MarkAsFailedConfirmation": "Bent u zeker dat u '{0}' als mislukt wilt markeren?",
|
||||
"Manual": "Manueel",
|
||||
"LogLevelTraceHelpTextWarning": "Trace log niveau moet enkel tijdelijk worden gebruikt",
|
||||
"LastDuration": "Laatste Looptijd",
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@
|
|||
"KeyboardShortcuts": "Skróty klawiszowe",
|
||||
"LinkHere": "tutaj",
|
||||
"ManualImportSelectQuality": " Import ręczny - wybierz Jakość",
|
||||
"MarkAsFailedMessageText": "Czy na pewno chcesz oznaczyć „{0}” jako nieudany?",
|
||||
"MarkAsFailedConfirmation": "Czy na pewno chcesz oznaczyć „{0}” jako nieudany?",
|
||||
"MinimumAvailability": "Minimalna dostępność",
|
||||
"Months": "Miesięcy",
|
||||
"PreferIndexerFlagsHelpText": "Nadaj priorytet wydaniom za pomocą specjalnych flag",
|
||||
|
|
|
|||
|
|
@ -544,7 +544,7 @@
|
|||
"MinutesNinety": "90 minutos: {0}",
|
||||
"MinutesHundredTwenty": "120 minutos: {0}",
|
||||
"MIA": "Desaparecidos",
|
||||
"MarkAsFailedMessageText": "Tem a certeza que quer marcar \"{0}\" como falhado?",
|
||||
"MarkAsFailedConfirmation": "Tem a certeza que quer marcar \"{0}\" como falhado?",
|
||||
"MarkAsFailed": "Marcar como falhado",
|
||||
"Manual": "Manual",
|
||||
"LoadingMovieFilesFailed": "Falha no carregamento dos ficheiros do filme",
|
||||
|
|
|
|||
|
|
@ -388,7 +388,7 @@
|
|||
"Max": "Máx.",
|
||||
"MassMovieSearch": "Pesquisar filmes em massa",
|
||||
"MarkAsFailed": "Marcar como falha",
|
||||
"MarkAsFailedMessageText": "Tem certeza que deseja marcar \"{0}\" como falhado?",
|
||||
"MarkAsFailedConfirmation": "Tem certeza que deseja marcar \"{0}\" como falhado?",
|
||||
"MappedNetworkDrivesWindowsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Consulte as [FAQ]({url}) para obter mais informações.",
|
||||
"ManualImportSelectQuality": " Importação manual - Selecionar qualidade",
|
||||
"ManualImportSelectMovie": "Importação manual - Selecionar filme",
|
||||
|
|
|
|||
|
|
@ -735,7 +735,7 @@
|
|||
"ManualImportSelectLanguage": "Import manual - Selectați limba",
|
||||
"ManualImportSelectMovie": "Import manual - Selectați film",
|
||||
"ManualImportSelectQuality": " Import manual - Selectați calitatea",
|
||||
"MarkAsFailedMessageText": "Sigur doriți să marcați „{0}” ca eșuat?",
|
||||
"MarkAsFailedConfirmation": "Sigur doriți să marcați „{0}” ca eșuat?",
|
||||
"MaximumLimits": "Limite maxime",
|
||||
"MaximumSize": "Dimensiune maximă",
|
||||
"MegabytesPerMinute": "Megaocteți pe minut",
|
||||
|
|
|
|||
|
|
@ -330,7 +330,7 @@
|
|||
"LogLevel": "Уровень журналирования",
|
||||
"LogLevelTraceHelpTextWarning": "Включение трассировки журнала должно быть временным",
|
||||
"Manual": "Ручной",
|
||||
"MarkAsFailedMessageText": "Вы уверены, что хотите отметить '{0}' как неудачный?",
|
||||
"MarkAsFailedConfirmation": "Вы уверены, что хотите отметить '{0}' как неудачный?",
|
||||
"CustomFilters": "Настраиваемые фильтры",
|
||||
"CustomFormats": "Пользовательский формат",
|
||||
"ConnectSettingsSummary": "Уведомления, подключения к серверам/проигрывателям и настраиваемые скрипты",
|
||||
|
|
|
|||
|
|
@ -599,7 +599,7 @@
|
|||
"InteractiveSearch": "Interaktiv sökning",
|
||||
"LookingForReleaseProfiles1": "Letar du efter utgåvorsprofiler? Prova",
|
||||
"ManualImportSelectQuality": " Manuell import - Välj kvalitet",
|
||||
"MarkAsFailedMessageText": "Är du säker på att du vill markera \"{0}\" som misslyckad?",
|
||||
"MarkAsFailedConfirmation": "Är du säker på att du vill markera \"{0}\" som misslyckad?",
|
||||
"MinimumAgeHelpText": "Endast Usenet: Lägsta ålder i minuter av NZB innan de tas. Använd detta för att ge nya utgåvor tid att sprida sig till din usenet-leverantör.",
|
||||
"RecyclingBinCleanupHelpText": "Ställ in på 0 för att inaktivera automatisk rensning",
|
||||
"RemoveHelpTextWarning": "Om du tar bort tas nedladdningen och filen (filerna) bort från nedladdningsklienten.",
|
||||
|
|
|
|||
|
|
@ -695,7 +695,7 @@
|
|||
"Lowercase": "ตัวพิมพ์เล็ก",
|
||||
"ManualImportSelectLanguage": "นำเข้าด้วยตนเอง - เลือกภาษา",
|
||||
"ManualImportSelectQuality": " นำเข้าด้วยตนเอง - เลือกคุณภาพ",
|
||||
"MarkAsFailedMessageText": "แน่ใจหรือไม่ว่าต้องการทำเครื่องหมาย \"{0}\" ว่าล้มเหลว",
|
||||
"MarkAsFailedConfirmation": "แน่ใจหรือไม่ว่าต้องการทำเครื่องหมาย \"{0}\" ว่าล้มเหลว",
|
||||
"MaximumLimits": "ขีด จำกัด สูงสุด",
|
||||
"MaximumSize": "ขนาดสูงสุด",
|
||||
"MegabytesPerMinute": "เมกะไบต์ต่อนาที",
|
||||
|
|
|
|||
|
|
@ -801,7 +801,7 @@
|
|||
"ManualImportSelectMovie": "Manuel İçe Aktar - Film Seç",
|
||||
"ManualImportSelectQuality": " Manuel İçe Aktar - Kalite Seç",
|
||||
"MappedNetworkDrivesWindowsService": "Windows Hizmeti olarak çalıştırıldığında eşlenen ağ sürücüleri kullanılamaz, daha fazla bilgi için [SSS]({url}) bölümüne bakın.",
|
||||
"MarkAsFailedMessageText": "'{0}' başarısız olarak işaretlemek istediğinizden emin misiniz?",
|
||||
"MarkAsFailedConfirmation": "'{0}' başarısız olarak işaretlemek istediğinizden emin misiniz?",
|
||||
"MaximumLimits": "Maksimum Sınırlar",
|
||||
"MaximumSize": "Maksimum Boyut",
|
||||
"MegabytesPerMinute": "Dakika Başına Megabayt",
|
||||
|
|
|
|||
|
|
@ -667,7 +667,7 @@
|
|||
"ManualImportSetReleaseGroup": "Імпорт вручну - встановити групу випуску",
|
||||
"MappedNetworkDrivesWindowsService": "Підключені мережеві диски недоступні під час роботи як служби Windows. Щоб отримати додаткову інформацію, перегляньте FAQ",
|
||||
"MarkAsFailed": "Позначити як помилку",
|
||||
"MarkAsFailedMessageText": "Ви впевнені, що бажаєте позначити \"{0}\" як невдале?",
|
||||
"MarkAsFailedConfirmation": "Ви впевнені, що бажаєте позначити \"{0}\" як невдале?",
|
||||
"MassMovieSearch": "Масовий пошук фільмів",
|
||||
"Max": "Максимальний",
|
||||
"MaximumSize": "Максимальний розмір",
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@
|
|||
"ManualImportSelectMovie": "Nhập thủ công - Chọn phim",
|
||||
"ManualImportSelectQuality": " Nhập thủ công - Chọn chất lượng",
|
||||
"MappedNetworkDrivesWindowsService": "Các ổ đĩa mạng được ánh xạ không khả dụng khi chạy dưới dạng Dịch vụ Windows. Vui lòng xem Câu hỏi thường gặp để biết thêm thông tin",
|
||||
"MarkAsFailedMessageText": "Bạn có chắc chắn muốn đánh dấu '{0}' là không thành công không?",
|
||||
"MarkAsFailedConfirmation": "Bạn có chắc chắn muốn đánh dấu '{0}' là không thành công không?",
|
||||
"MassMovieSearch": "Tìm kiếm phim hàng loạt",
|
||||
"MaximumLimits": "Giới hạn tối đa",
|
||||
"MaximumSize": "Kích thước tối đa",
|
||||
|
|
|
|||
|
|
@ -568,7 +568,7 @@
|
|||
"MaximumSizeHelpText": "抓取发布资源的最大大小(MB)。设置为零则不限制",
|
||||
"Max": "最大的",
|
||||
"MassMovieSearch": "批量搜索电影",
|
||||
"MarkAsFailedMessageText": "您确定要标记'{0}'为已失败?",
|
||||
"MarkAsFailedConfirmation": "您确定要标记'{0}'为已失败?",
|
||||
"ManualImportSelectQuality": " 手动导入 - 选择质量",
|
||||
"ManualImportSelectMovie": "手动导入 - 选择电影",
|
||||
"ManualImportSelectLanguage": "手动导入 - 选择语言",
|
||||
|
|
|
|||
Loading…
Reference in a new issue