This commit is contained in:
Alexis Svinartchouk 2019-07-16 13:17:46 +02:00
parent 1398ca2931
commit 868a35337c
5 changed files with 65 additions and 56 deletions

View File

@ -43,10 +43,10 @@ interface CompatibilityStatus {
} }
interface DriveSelectorProps { interface DriveSelectorProps {
title: string;
close: () => void; close: () => void;
selectDrive: (drive: Drive) => void; setSelectedDrives: (drives: Drive[]) => void;
deselectDrive: (drive: Drive) => void; isDriveSelected: (drive: Drive) => boolean;
isDriveSelected: (drive: Drive) => boolean;
isDriveValid: (drive: Drive) => boolean; isDriveValid: (drive: Drive) => boolean;
getDriveBadges: (drive: Drive) => CompatibilityStatus[]; getDriveBadges: (drive: Drive) => CompatibilityStatus[];
} }
@ -139,7 +139,7 @@ export class DriveSelector2 extends React.Component<
for (let i = 0; i < drives.length; i++) { for (let i = 0; i < drives.length; i++) {
drives[i] = { ...drives[i] }; drives[i] = { ...drives[i] };
} }
drives = sortBy(drives, 'device'); drives = sortBy(drives, 'device');
const selected = drives.filter(d => this.props.isDriveSelected(d)); const selected = drives.filter(d => this.props.isDriveSelected(d));
const disabledDrives = drives const disabledDrives = drives
.filter(d => !this.props.isDriveValid(d)) .filter(d => !this.props.isDriveValid(d))
@ -192,22 +192,20 @@ export class DriveSelector2 extends React.Component<
); );
} }
result.push( result.push(
...this.props.getDriveBadges(row).map( ...this.props.getDriveBadges(row).map((status: CompatibilityStatus) => {
(status: CompatibilityStatus) => { const props: {
const props: { key: string;
key: string; xsmall: true;
xsmall: true; danger?: boolean;
danger?: boolean; warning?: boolean;
warning?: boolean; } = { xsmall: true, key: status.message };
} = { xsmall: true, key: status.message }; if (status.type === COMPATIBILITY_STATUS_TYPES.ERROR) {
if (status.type === COMPATIBILITY_STATUS_TYPES.ERROR) { props.danger = true;
props.danger = true; } else if (status.type === COMPATIBILITY_STATUS_TYPES.WARNING) {
} else if (status.type === COMPATIBILITY_STATUS_TYPES.WARNING) { props.warning = true;
props.warning = true; }
} return <Badge {...props}>{status.message}</Badge>;
return <Badge {...props}>{status.message}</Badge>; }),
},
),
); );
return <React.Fragment>{result}</React.Fragment>; return <React.Fragment>{result}</React.Fragment>;
} }
@ -231,7 +229,7 @@ export class DriveSelector2 extends React.Component<
<Modal <Modal
titleElement={ titleElement={
<div style={titleStyle}> <div style={titleStyle}>
Available targets {this.props.title}
<span style={subtitleStyle}> <span style={subtitleStyle}>
{this.state.drives.length} found {this.state.drives.length} found
</span> </span>
@ -261,13 +259,6 @@ export class DriveSelector2 extends React.Component<
} }
private onCheck(checkedDrives: Drive[]): void { private onCheck(checkedDrives: Drive[]): void {
const checkedDevices = checkedDrives.map(d => d.device); this.props.setSelectedDrives(checkedDrives);
for (const drive of getDrives()) {
if (checkedDevices.indexOf(drive.device) !== -1) {
this.props.selectDrive(drive);
} else {
this.props.deselectDrive(drive);
}
}
} }
} }

View File

@ -25,10 +25,14 @@ angular
.module(MODULE_NAME, []) .module(MODULE_NAME, [])
.component( .component(
'driveSelector2', 'driveSelector2',
react2angular( react2angular(DriveSelector2, [
DriveSelector2, 'close',
['close', 'selectDrive', 'deselectDrive', 'isDriveSelected', 'isDriveValid', 'getDriveBadges'] 'getDriveBadges',
) 'isDriveSelected',
) 'isDriveValid',
'setSelectedDrives',
'title',
]),
);
export = MODULE_NAME; export = MODULE_NAME;

View File

@ -22,6 +22,7 @@ const prettyBytes = require('pretty-bytes')
const store = require('../../../models/store') const store = require('../../../models/store')
// eslint-disable-next-line node/no-missing-require // eslint-disable-next-line node/no-missing-require
const settings = require('../../../models/settings') const settings = require('../../../models/settings')
const availableDrives = require('../../../models/available-drives')
const selectionState = require('../../../models/selection-state') const selectionState = require('../../../models/selection-state')
const driveConstraints = require('../../../modules/drive-constraints') const driveConstraints = require('../../../modules/drive-constraints')
const analytics = require('../../../modules/analytics') const analytics = require('../../../modules/analytics')
@ -171,12 +172,15 @@ module.exports = function ($timeout, DriveSelectorService) {
$timeout() $timeout()
} }
this.selectDrive = (drive) => { this.setSelectedDrives = (drives) => {
return selectionState.selectDrive(drive.device) const devices = drives.map(d => d.device);
} for (const drive of availableDrives.getDrives()) {
if (devices.indexOf(drive.device) !== -1) {
this.deselectDrive = (drive) => { selectionState.selectDrive(drive.device)
return selectionState.deselectDrive(drive.device) } else {
selectionState.deselectDrive(drive.device)
}
}
} }
this.isDriveSelected = (drive) => { this.isDriveSelected = (drive) => {

View File

@ -277,28 +277,38 @@ module.exports = function (
$timeout() $timeout()
} }
this.closeDriveSelector = () => { this.closeDriveSelectorModal = () => {
this.driveSelectorModalOpen = false; this.driveSelectorModalOpen = false;
$timeout() $timeout()
} }
this.selectDrive = (drive) => { this.setSelectedDrives = (drives) => {
selectionState.selectImage({ const currentlySelected = this.getSelectedDrive()
path: drive.device, if (currentlySelected) {
size: drive.size, drives = drives.filter(d => d.device !== currentlySelected.path)
isDrive: true }
}) if (drives.length === 0) {
this.deselectImage()
} else {
selectionState.selectImage({
path: drives[0].device,
size: drives[0].size,
isDrive: true
})
}
} }
this.deselectDrive = (drive) => { this.getSelectedDrive = () => {
if (this.isDriveSelected(drive)) { const image = selectionState.getImage()
this.deselectImage() if (image && image.isDrive) {
return image
} }
} }
this.isDriveSelected = (drive) => { this.isDriveSelected = (drive) => {
const image = selectionState.getImage() const selectedDrive = this.getSelectedDrive()
return image && image.isDrive && image.path === drive.device return selectedDrive && selectedDrive.path === drive.device
} }
this.isDriveValid = (drive) => { this.isDriveValid = (drive) => {

View File

@ -2,9 +2,9 @@
<div class="col-xs" ng-controller="ImageSelectionController as image"> <div class="col-xs" ng-controller="ImageSelectionController as image">
<drive-selector-2 <drive-selector-2
ng-if="image.driveSelectorModalOpen" ng-if="image.driveSelectorModalOpen"
title="'Select a source drive'"
close="image.closeDriveSelectorModal" close="image.closeDriveSelectorModal"
select-drive="image.selectDrive" set-selected-drives="image.setSelectedDrives"
deselect-drive="image.deselectDrive"
is-drive-selected="image.isDriveSelected" is-drive-selected="image.isDriveSelected"
is-drive-valid="image.isDriveValid" is-drive-valid="image.isDriveValid"
get-drive-badges="image.getDriveBadges" get-drive-badges="image.getDriveBadges"
@ -39,9 +39,9 @@
<div class="col-xs" ng-controller="DriveSelectionController as drive"> <div class="col-xs" ng-controller="DriveSelectionController as drive">
<drive-selector-2 <drive-selector-2
ng-if="drive.driveSelectorModalOpen" ng-if="drive.driveSelectorModalOpen"
title="'Available targets'"
close="drive.closeDriveSelectorModal" close="drive.closeDriveSelectorModal"
select-drive="drive.selectDrive" set-selected-drives="drive.setSelectedDrives"
deselect-drive="drive.deselectDrive"
is-drive-selected="drive.isDriveSelected" is-drive-selected="drive.isDriveSelected"
is-drive-valid="drive.isDriveValid" is-drive-valid="drive.isDriveValid"
get-drive-badges="drive.getDriveBadges" get-drive-badges="drive.getDriveBadges"