refactor(GUI): generalize the concept of a "pending" drive (#1777)

This commit introduces a boolean `disabled` property rather than a
`pending` flag. Making this distinction clearer means that we can now
treat pending drives in different ways needed to improve the usbboot
experience.

Also, for usbboot, this commit removes the "pending" badge and uses a
more descriptive drive description instead.

Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
This commit is contained in:
Juan Cruz Viotti 2017-10-16 12:09:38 +01:00 committed by GitHub
parent 6acfcfd23c
commit 444072db13
5 changed files with 32 additions and 51 deletions

View File

@ -168,25 +168,25 @@ exports.isDriveLargeEnough = (drive, image) => {
} }
/** /**
* @summary Check if a drive is pending (i.e. not ready for selection) * @summary Check if a drive is disabled (i.e. not ready for selection)
* @function * @function
* @public * @public
* *
* @param {Object} drive - drive * @param {Object} drive - drive
* @returns {Boolean} whether the drive is pending * @returns {Boolean} whether the drive is disabled
* *
* @example * @example
* if (constraints.isDrivePending({ * if (constraints.isDriveDisabled({
* device: '/dev/disk2', * device: '/dev/disk2',
* name: 'My Drive', * name: 'My Drive',
* size: 1000000000, * size: 1000000000,
* pending: true * disabled: true
* })) { * })) {
* console.log('The drive is pending'); * console.log('The drive is disabled');
* } * }
*/ */
exports.isDrivePending = (drive) => { exports.isDriveDisabled = (drive) => {
return _.get(drive, [ 'pending' ], false) return _.get(drive, [ 'disabled' ], false)
} }
/** /**
@ -217,7 +217,7 @@ exports.isDriveValid = (drive, image) => {
!this.isDriveLocked(drive), !this.isDriveLocked(drive),
this.isDriveLargeEnough(drive, image), this.isDriveLargeEnough(drive, image),
!this.isSourceDrive(drive, image), !this.isSourceDrive(drive, image),
!this.isDrivePending(drive) !this.isDriveDisabled(drive)
]) ])
} }
@ -301,15 +301,6 @@ exports.COMPATIBILITY_STATUS_MESSAGES = {
*/ */
SYSTEM: 'System Drive', SYSTEM: 'System Drive',
/**
* @property {String} PENDING
* @memberof COMPATIBILITY_STATUS_MESSAGES
*
* @description
* The drive is not fully loaded.
*/
PENDING: 'Pending',
/** /**
* @property {String} CONTAINS_IMAGE * @property {String} CONTAINS_IMAGE
* @memberof COMPATIBILITY_STATUS_MESSAGES * @memberof COMPATIBILITY_STATUS_MESSAGES
@ -374,12 +365,7 @@ exports.getDriveImageCompatibilityStatuses = (drive, image) => {
const statusList = [] const statusList = []
// Mind the order of the if-statements if you modify. // Mind the order of the if-statements if you modify.
if (exports.isDrivePending(drive)) { if (exports.isSourceDrive(drive, image)) {
statusList.push({
type: exports.COMPATIBILITY_STATUS_TYPES.ERROR,
message: exports.COMPATIBILITY_STATUS_MESSAGES.PENDING
})
} else if (exports.isSourceDrive(drive, image)) {
statusList.push({ statusList.push({
type: exports.COMPATIBILITY_STATUS_TYPES.ERROR, type: exports.COMPATIBILITY_STATUS_TYPES.ERROR,
message: exports.COMPATIBILITY_STATUS_MESSAGES.CONTAINS_IMAGE message: exports.COMPATIBILITY_STATUS_MESSAGES.CONTAINS_IMAGE

View File

@ -49,7 +49,6 @@ exports.scan = (options = {}) => {
return drivelist.listAsync().filter((drive) => { return drivelist.listAsync().filter((drive) => {
return options.includeSystemDrives || !drive.system return options.includeSystemDrives || !drive.system
}).map((drive) => { }).map((drive) => {
drive.pending = false
drive.adaptor = exports.name drive.adaptor = exports.name
// TODO: Find a better way to detect that a certain // TODO: Find a better way to detect that a certain

View File

@ -327,13 +327,13 @@ exports.scan = (options) => {
], ':') ], ':')
device.device = idPair device.device = idPair
device.displayName = idPair device.displayName = 'Initializing device'
device.raw = idPair device.raw = idPair
device.size = null device.size = null
device.mountpoints = [] device.mountpoints = []
device.protected = false device.protected = false
device.system = false device.system = false
device.pending = true device.disabled = true
device.adaptor = exports.name device.adaptor = exports.name
// We need to open the device in order to access _configDescriptor // We need to open the device in order to access _configDescriptor

View File

@ -160,7 +160,6 @@ describe('Browser: driveScanner', function () {
path: '/mnt/foo' path: '/mnt/foo'
} }
], ],
pending: false,
adaptor: 'standard', adaptor: 'standard',
system: false system: false
}, },
@ -174,7 +173,6 @@ describe('Browser: driveScanner', function () {
path: '/mnt/bar' path: '/mnt/bar'
} }
], ],
pending: false,
adaptor: 'standard', adaptor: 'standard',
system: false system: false
} }
@ -256,7 +254,6 @@ describe('Browser: driveScanner', function () {
description: 'Foo', description: 'Foo',
size: '14G', size: '14G',
mountpoints: [], mountpoints: [],
pending: false,
adaptor: 'standard', adaptor: 'standard',
system: false system: false
}, },
@ -270,7 +267,6 @@ describe('Browser: driveScanner', function () {
path: 'F:' path: 'F:'
} }
], ],
pending: false,
adaptor: 'standard', adaptor: 'standard',
system: false system: false
} }

View File

@ -527,33 +527,33 @@ describe('Shared: DriveConstraints', function () {
}) })
}) })
describe('.isDrivePending()', function () { describe('.isDriveDisabled()', function () {
it('should return true if the drive is pending', function () { it('should return true if the drive is disabled', function () {
const result = constraints.isDrivePending({ const result = constraints.isDriveDisabled({
device: '/dev/disk1', device: '/dev/disk1',
name: 'USB Drive', name: 'USB Drive',
size: 1000000000, size: 1000000000,
protected: false, protected: false,
pending: true disabled: true
}) })
m.chai.expect(result).to.be.true m.chai.expect(result).to.be.true
}) })
it('should return false if the drive is not pending', function () { it('should return false if the drive is not disabled', function () {
const result = constraints.isDrivePending({ const result = constraints.isDriveDisabled({
device: '/dev/disk1', device: '/dev/disk1',
name: 'USB Drive', name: 'USB Drive',
size: 1000000000, size: 1000000000,
protected: false, protected: false,
pending: false disabled: false
}) })
m.chai.expect(result).to.be.false m.chai.expect(result).to.be.false
}) })
it('should return false if "pending" is undefined', function () { it('should return false if "disabled" is undefined', function () {
const result = constraints.isDrivePending({ const result = constraints.isDriveDisabled({
device: '/dev/disk1', device: '/dev/disk1',
name: 'USB Drive', name: 'USB Drive',
size: 1000000000, size: 1000000000,
@ -676,9 +676,9 @@ describe('Shared: DriveConstraints', function () {
this.drive.protected = true this.drive.protected = true
}) })
describe('given the drive is pending', function () { describe('given the drive is disabled', function () {
beforeEach(function () { beforeEach(function () {
this.drive.pending = true this.drive.disabled = true
}) })
it('should return false if the drive is not large enough and is a source drive', function () { it('should return false if the drive is not large enough and is a source drive', function () {
@ -734,9 +734,9 @@ describe('Shared: DriveConstraints', function () {
}) })
}) })
describe('given the drive is not pending', function () { describe('given the drive is not disabled', function () {
beforeEach(function () { beforeEach(function () {
this.drive.pending = false this.drive.disabled = false
}) })
it('should return false if the drive is not large enough and is a source drive', function () { it('should return false if the drive is not large enough and is a source drive', function () {
@ -798,9 +798,9 @@ describe('Shared: DriveConstraints', function () {
this.drive.protected = false this.drive.protected = false
}) })
describe('given the drive is pending', function () { describe('given the drive is disabled', function () {
beforeEach(function () { beforeEach(function () {
this.drive.pending = true this.drive.disabled = true
}) })
it('should return false if the drive is not large enough and is a source drive', function () { it('should return false if the drive is not large enough and is a source drive', function () {
@ -856,9 +856,9 @@ describe('Shared: DriveConstraints', function () {
}) })
}) })
describe('given the drive is not pending', function () { describe('given the drive is not disabled', function () {
beforeEach(function () { beforeEach(function () {
this.drive.pending = false this.drive.disabled = false
}) })
it('should return false if the drive is not large enough and is a source drive', function () { it('should return false if the drive is not large enough and is a source drive', function () {
@ -931,7 +931,7 @@ describe('Shared: DriveConstraints', function () {
name: 'My Drive', name: 'My Drive',
protected: false, protected: false,
system: false, system: false,
pending: false, disabled: false,
mountpoints: [ mountpoints: [
{ {
path: this.mountpoint path: this.mountpoint
@ -975,15 +975,15 @@ describe('Shared: DriveConstraints', function () {
}) })
}) })
describe('given the drive is pending', () => { describe('given the drive is disabled', () => {
it('should return an empty list', function () { it('should return an empty list', function () {
this.drive.pending = true this.drive.disabled = true
const result = constraints.getDriveImageCompatibilityStatuses(this.drive, { const result = constraints.getDriveImageCompatibilityStatuses(this.drive, {
path: '/mnt/disk2/rpi.img', path: '/mnt/disk2/rpi.img',
size: 1000000000 size: 1000000000
}) })
const expectedTuples = [ [ 'ERROR', 'PENDING' ] ] const expectedTuples = []
expectStatusTypesAndMessagesToBe(result, expectedTuples) expectStatusTypesAndMessagesToBe(result, expectedTuples)
}) })
}) })