118 Commits

Author SHA1 Message Date
Juan Cruz Viotti
dcff257f20 Upgrade Electron to v0.37.6 (#350)
* Upgrade Electron to v0.37.6

The main motiviation for such upgrade is that an error manifesting
itself as `Cannot read property 'object' of undefined` on certain Linux
systems was fixed in v0.37.4.

See https://github.com/electron/electron/issues/5229
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>

* Make use of shell module by requiring `shell`

Otherwise we get a strange issue when trying to stub it:

    TypeError: Attempted to wrap undefined property openExternal as function

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-21 10:26:29 -04:00
Juan Cruz Viotti
4d70676612 Distinguish between flash and validation events in Mixpanel (#347)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-20 14:56:58 -04:00
Juan Cruz Viotti
5baf8e5407 Improve UX when closing the drive selector modal (#339)
The current "Close" button makes it confusing to the user to know if
he's accepting his changes, or just discarding them.

The "Close" button in the top right corner was replaced with a standard
cross icon, and there is a new "Continue" block button fixed in the
bottom of the modal.

Fixes: https://github.com/resin-io/etcher/issues/294
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-18 13:16:17 -04:00
Juan Cruz Viotti
ed592f0597 Add application version to footer (#335)
* Implement ManifestBind directive

This directive is useful to bind the contents of an element to a
property in the `package.json` manifest.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>

* Add application version to footer

Fixes: https://github.com/resin-io/etcher/issues/292
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-17 23:57:56 -04:00
Juan Cruz Viotti
34ae49df38 Reset writer state on flash error (#330)
Not doing so leads the writer state to have a `progress` of `100%`,
while `isFlashing()` is `false`, which is an inconsistent state.

Fixes: https://github.com/resin-io/etcher/issues/327
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-15 16:43:42 -04:00
Juan Cruz Viotti
0dcc7b22b8 Implement SVGIcon Angular directive (#324)
* Inherit current scope in osOpenExternal directive

This directive attempts to create a new isolated scope, which leads the
errors when using this directive on top of another directive in the same
element.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>

* Implement SVGIcon Angular directive

This directive replaces part of `hero-icon`, the old Polymer component.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 16:14:46 -04:00
Juan Cruz Viotti
04efd16ca3 Misc changes (#322)
* Fix lint warnings about missing empty line above `module.exports`

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>

* Re-build CSS

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 15:45:52 -04:00
Juan Cruz Viotti
66b38105ca Require ui.router and ui.bootstrap using NPM style (#321)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 15:37:05 -04:00
Juan Cruz Viotti
79c19ef341 Document directives with JSDoc (#320)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 15:36:52 -04:00
Juan Cruz Viotti
a874d4b808 Make all angular modules export the name of the module (#318)
This makes them very nicely require-able, for example:

    angular.module('MyModule', [
      require('my-dependency');
    ]);

From https://medium.com/@kentcdodds/how-to-distribute-your-angularjs-module-e04d4dd58ddc#.yqg2zo8im
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 14:22:51 -04:00
Juan Cruz Viotti
39786e3271 Don't require angular-ui-bootstrap in main module (#319)
This dependency is only required by `Etcher.Components.DriveSelector`.

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 14:17:31 -04:00
Juan Cruz Viotti
bd9b4d0a3a Promisify drivelist.list() with angular-q-promisify (#317)
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 13:57:38 -04:00
Juan Cruz Viotti
42db5992fa Reorganize utilities and desktop integration modules (#316)
- Rename `Etcher.Utils.Dropzone` to `Etcher.OS.Dropzone`
- Rename `Etcher.Utils.OpenExternal` to `Etcher.OS.OpenExternal`
- Rename `Etcher.Utils.WindowProgress` to `Etcher.OS.WindowProgress`
- Rename `Etcher.notification` to `Etcher.OS.Notification`
- Rename `Etcher.notifier` to `Etcher.Utils.Notifier`
- Rename `Etcher.path` to `Etcher.Utils.Path`

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 13:34:31 -04:00
Juan Cruz Viotti
fedde73a02 Improve UX when re-selecting a single available drive (#313)
Currently, if you have only one connected drive, Etcher will auto-select
it. One the single drive is auto-selected, if you attempt to change your
drive selection by clicking on the "Change" link button, the
re-selection is undone, and redone in a matter of milliseconds, making
it very difficult to get the drive selector modal to open.

A simple solution to this problem is making "Change" links trigger the
reselection action (e.g: opening modals, dialogs, etc) instead of simply
undoing the selection.

Fixes: https://github.com/resin-io/etcher/issues/296
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 12:12:19 -04:00
Juan Cruz Viotti
fd00a4ae0e Add a Mixpanel event when the application starts (#311)
Fixes: https://github.com/resin-io/etcher/issues/310
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-13 10:05:53 -04:00
Juan Cruz Viotti
e3bac8dc64 Connect DriveSelector with SelectionStateModel (#305)
Previously, `DriveSelector` kept a temporary selection state until the
modal was closed, which caused the selected drives to be passed to
`SelectionStateModel`.

This proves to be problematic when attempting to pass changes to
`SelectionStateModel` to `DriveSelector`. For example, consider the case
where the `DriveSelector` modal is opened with two drives, and one is
ejected. The remaining drive will be auto-selected by Etcher in the
background, but `DriveSelector` will not update itself with such change.

Fixes: https://github.com/resin-io/etcher/issues/304
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-12 14:42:51 -04:00
Juan Cruz Viotti
aba6e946e3 Hide drive selector modal if no available drives (#303)
If you have the drive selector modal opened, but you eject all the
available drives, the modal will be closed automatically.

Fixes: https://github.com/resin-io/etcher/issues/295
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-12 13:02:10 -04:00
Juan Cruz Viotti
3efea5b308 Replace all occurrences of "burn" with "flash" (#300)
Technically, a removable drive is flashed, not burned.

Fixes: https://github.com/resin-io/etcher/issues/297
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-12 12:00:43 -04:00
Juan Cruz Viotti
8417f94649 Allow to drag and drop an image to the first step (#288)
See https://github.com/electron/electron/blob/master/docs/api/file-object.md
Fixes: https://github.com/resin-io/etcher/issues/279
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-11 15:40:13 -04:00
Juan Cruz Viotti
2f65bd512f Implement OS notifications on burn completion (#283)
Its helpful to have an auditive/visual cue when a burn operation
completed.

Instead of adding a setting entry to enable/disable notifications, you
can use the standard way to control notifications from your operating
system. For example, in OS X, you might go to "System Preferences" ->
"Notifications" and disable notifications for "Etcher".

Fixes: https://github.com/resin-io/etcher/issues/280
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-11 11:49:55 -04:00
Juan Cruz Viotti
67daf086a2 Detect removal of selected drive (#264)
Suppose you plug a device, select it in Etcher, but then eject it from
your computer. Etcher will keep the selection thinking the drive is
still there.

With this PR, the selected drive, if any, is ensured its still inside
the array of available drives, otherwise the selected is cleared.

Fixes: https://github.com/resin-io/etcher/issues/254
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-08 12:17:36 -04:00
Juan Cruz Viotti
2862663ca7 Invert progress bar stripes (#260)
Make the progress bar background striped, and the actual bar solid.

Fixes: https://github.com/resin-io/etcher/issues/251
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-08 10:06:56 -04:00
Juan Cruz Viotti
1bfe88f2f4 Show drive name in drive selector modal (#259)
The `name` property equals the drive letter in Windows, and the mount
point in UNIX based operating systems.

Fixes: https://github.com/resin-io/etcher/issues/258
Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-08 09:49:11 -04:00
Juan Cruz Viotti
3392a5eca1 Implement write validation support
* Extend ProgressButton to support a striped progress bar

This feature will be used to implement the burn validation step.

* Implement alert-ribbon CSS component

This component will be used to inform an error situation to the user
during the burn/check processes.

* Add "Enable write validation on success" setting

* Implement write validation support

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
Fixes: https://github.com/resin-io/etcher/issues/45
2016-04-06 21:53:35 -04:00
Juan Cruz Viotti
e8516b1727 Fix shell.openExternal() freezing GNU/Linux
Electron's `shell.openExternal()` fails on GNU/Linux when Electron is

ran with `sudo`.  The issue was reported, and this is a workaround until

its fixed on the Electron side.



`node-open` is smart enough to check the `$SUDO_USER` environment

variable and to prepend `sudo -u <user>` if needed.



We keep `shell.openExternal()` for OSes other than Linux since we intend

to fully rely on it when the issue is fixed, and since its closer

integration with the operating system might lead to more accurate

results than a third party NPM module.



See https://github.com/electron/electron/issues/5039

Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-06 11:12:46 -04:00
Juan Cruz Viotti
912373a389 Log Etcher version in Mixpanel and TrackJS
Its hard to attempt to debug or reproduce an issue if we don't know the

version the user is running.



Signed-off-by: Juan Cruz Viotti <jviottidc@gmail.com>
2016-04-05 13:10:22 -04:00
Juan Cruz Viotti
ea19c771d5 Merge pull request #239 from resin-io/refactor/drive-selector
Split DriveSelector components into separate files
2016-04-01 13:06:55 -04:00
Juan Cruz Viotti
06f74d140b Merge pull request #237 from resin-io/refactor/if-state-directive
Implement `showIfState` and `hideIfState` directives
2016-04-01 13:06:47 -04:00
Juan Cruz Viotti
a14e5235ff Split DriveSelector components into separate files 2016-04-01 12:30:42 -04:00
Juan Cruz Viotti
5001d84e9a Mark DriveScannerService.setDrives() as private 2016-04-01 12:13:12 -04:00
Juan Cruz Viotti
53b3daa335 Implement showIfState and hideIfState directives
This directives will be used in the header navigation instead of
re-using this logic from the `NavigationController`.

A consequence of this change is that `NavigationController` is no longer
needed, and therefore is removed.
2016-04-01 12:09:00 -04:00
Juan Cruz Viotti
a4ebe8af50 Implement an openExternal attribute directive.
This directive will be used in the header and footer instead of having
to rely on `NavigationController` to expose `shell.openExternal`.
2016-04-01 11:03:10 -04:00
Juan Cruz Viotti
3bdaadcfb8 Decouple DriveScannerService from Dialog 2016-04-01 10:32:34 -04:00
Juan Cruz Viotti
f879245fce Merge pull request #234 from resin-io/refactor/selection-state-model
Convert SelectionStateService into a model
2016-04-01 10:31:51 -04:00
Juan Cruz Viotti
70034afc61 Merge pull request #233 from resin-io/refactor/window-progress
Extract browser window progress into WindowProgressService
2016-04-01 10:31:33 -04:00
Juan Cruz Viotti
244d5ca727 Convert SelectionStateService into a model 2016-04-01 10:18:59 -04:00
Juan Cruz Viotti
832d6843df Extract browser window progress into WindowProgressService 2016-04-01 10:08:14 -04:00
Juan Cruz Viotti
d418139def Merge pull request #232 from resin-io/refactor/settings-model
Transform SettingsService into the SettingsModel module
2016-04-01 10:07:59 -04:00
Juan Cruz Viotti
61cd5a1ffe Transform SettingsService into the SettingsModel module 2016-04-01 09:28:28 -04:00
Juan Cruz Viotti
10b714a2ce Add vertical spacing to unmount on success message on finish screen 2016-04-01 09:14:10 -04:00
Juan Cruz Viotti
4ef7dae3c4 Use SettingsService in FinishController
EXposing the settings from the `FinishController` is a better approach
that instantiating the `SettingsController` in the Finish page template.
2016-04-01 09:04:55 -04:00
Juan Cruz Viotti
f5c9a3a32a Move all settings related components to a settings page subdirectory 2016-03-31 15:58:00 -04:00
Juan Cruz Viotti
472f91a504 Group finish page components in a common directory 2016-03-31 15:33:03 -04:00
Juan Cruz Viotti
797a253158 Group all parts of the progress-button component in a single directory 2016-03-31 15:14:10 -04:00
Juan Cruz Viotti
18a1606988 Implement a drive selector modal
This modal provides a more advanced way to select a drive. It prevents
certain issues the dropdown was having, like the contents overflowing
when there were many connected drives.

Fixes: https://github.com/resin-io/etcher/issues/202
2016-03-31 12:18:23 -04:00
Juan Cruz Viotti
50e0fcb7e9 Merge pull request #223 from resin-io/refactor/merge-drives-and-drive-scanner
Merge src/drives.js with DriveScannerService
2016-03-31 08:49:36 -04:00
Juan Cruz Viotti
ef16f69df9 Merge pull request #222 from resin-io/fix/use-same-image
Fix "Use same image" not preserving the image selection
2016-03-31 08:49:18 -04:00
Juan Cruz Viotti
34907765df Merge src/drives.js with DriveScannerService
`src/drives.js` made little on its own, and only caused extra thinking
overhead due to indirection.
2016-03-30 16:51:39 -04:00
Juan Cruz Viotti
e541357450 Fix "Use same image" not preserving the image selection 2016-03-30 16:28:22 -04:00
Juan Cruz Viotti
6f7ea4e772 Convert hero-progress-button into an Angular directive 2016-03-30 15:46:48 -04:00