diff --git a/app/components/file-table.js b/app/components/file-table.js index 19e46a7..5f989c6 100644 --- a/app/components/file-table.js +++ b/app/components/file-table.js @@ -1,4 +1,5 @@ import Component from '@ember/component'; +import { set } from '@ember/object'; const defaultFiles = []; const defaultSelectedFilePaths = []; @@ -8,6 +9,13 @@ export default Component.extend({ selectedFilePaths: defaultSelectedFilePaths, actions: { + toggleSelectAll() { + if (this.selectedFilePaths.length === this.files.length) { + set(this, 'selectedFilePaths', defaultSelectedFilePaths); + } else { + set(this, 'selectedFilePaths', this.files.map(file => file.path)); + } + }, toggleSelectedPath(path) { if (!this.selectedFilePaths.includes(path)) { this.selectedFilePaths.pushObject(path); diff --git a/app/templates/components/file-table.hbs b/app/templates/components/file-table.hbs index fb2fb02..3665288 100644 --- a/app/templates/components/file-table.hbs +++ b/app/templates/components/file-table.hbs @@ -1,7 +1,10 @@
-
diff --git a/tests/integration/components/file-table-test.js b/tests/integration/components/file-table-test.js index fae8768..ec08089 100644 --- a/tests/integration/components/file-table-test.js +++ b/tests/integration/components/file-table-test.js @@ -3,11 +3,12 @@ import { setupRenderingTest } from 'ember-qunit'; import { render, find, findAll, click } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; +const randomNumber = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min; const genericFile = () => { return { name: 'foo.bar', device: 'Baz', - path: '~/foo.bar', + path: `~/foo{${randomNumber(1,9001)}.bar`, status: 'available', }; }; @@ -47,4 +48,30 @@ module('Integration | Component | file-table', function(hooks) { assert.equal(find('[data-test-action=file-table-select-all]').textContent.trim(), 'Selected 0'); assert.equal(find('[data-test-id=file-table-item-selected]').textContent.trim(), '', 'Unselected after second click'); }); + + test('select all, with none selected', async function(assert) { + this.set('files', [genericFile(), genericFile()]); + await render(hbs`{{file-table files=files}}`); + + await click('[data-test-action=file-table-select-all]'); + assert.equal(find('[data-test-action=file-table-select-all]').textContent.trim(), 'Selected ' + this.files.length); + }); + + test('select all, with everything selected', async function(assert) { + this.set('files', [genericFile(), genericFile()]); + this.set('selectedFilePaths', this.files.map(file => file.path)); + await render(hbs`{{file-table files=files selectedFilePaths=selectedFilePaths}}`); + + await click('[data-test-action=file-table-select-all]'); + assert.equal(find('[data-test-action=file-table-select-all]').textContent.trim(), 'Selected 0'); + }); + + test('select all, with some selected', async function(assert) { + this.set('files', [genericFile(), genericFile()]); + this.set('selectedFilePaths', [this.files[0].path]); + await render(hbs`{{file-table files=files selectedFilePaths=selectedFilePaths}}`); + + await click('[data-test-action=file-table-select-all]'); + assert.equal(find('[data-test-action=file-table-select-all]').textContent.trim(), 'Selected ' + this.files.length); + }); }); \ No newline at end of file