1
0
Fork 0

Row click toggles selection, aware in both components

This commit is contained in:
Joe Wroten 2018-12-16 14:32:24 -06:00
parent 7229af4fdb
commit 0fb5d4668b
7 changed files with 70 additions and 32 deletions

View file

@ -5,10 +5,16 @@ const defaultFile = {};
const defaultSelectedFilePaths = []; const defaultSelectedFilePaths = [];
export default Component.extend({ export default Component.extend({
tagName: 'tr',
attributeBindings: ['data-test-id', 'data-test-action'],
'data-test-id': 'file-table-item',
'data-test-action': 'file-table-item-toggle',
file: defaultFile, file: defaultFile,
selectedFilePaths: defaultSelectedFilePaths, selectedFilePaths: defaultSelectedFilePaths,
isSelected: computed('file.path', 'selectedFilePaths', function() { isSelected: computed('file.path', 'selectedFilePaths.[]', function() {
return this.selectedFilePaths.includes(this.file.path); return this.selectedFilePaths.includes(this.file.path);
}), }),
}); });

View file

@ -6,4 +6,14 @@ const defaultSelectedFilePaths = [];
export default Component.extend({ export default Component.extend({
files: defaultFiles, files: defaultFiles,
selectedFilePaths: defaultSelectedFilePaths, selectedFilePaths: defaultSelectedFilePaths,
actions: {
toggleSelectedPath(path) {
if (!this.selectedFilePaths.includes(path)) {
this.selectedFilePaths.pushObject(path);
} else {
this.selectedFilePaths.removeObject(path);
}
},
}
}); });

View file

@ -0,0 +1,7 @@
import Controller from '@ember/controller';
const files = []; // Put sample data here...
export default Controller.extend({
files,
});

View file

@ -1,5 +1,5 @@
{{!-- The following component displays Ember's default welcome message. --}} <h1>Ember File Download List</h1>
{{welcome-page}}
{{!-- Feel free to remove this! --}} {{file-table files=files}}
{{outlet}} {{outlet}}

View file

@ -1,25 +1,23 @@
<tr data-test-id="file-table-item"> <td data-test-id="file-table-item-selected">
<td data-test-id="file-table-item-selected">
{{if isSelected "Selected"}} {{if isSelected "Selected"}}
</td> </td>
<td data-test-id="file-table-item-name"> <td data-test-id="file-table-item-name">
{{file.name}} {{file.name}}
</td> </td>
<td data-test-id="file-table-item-device"> <td data-test-id="file-table-item-device">
{{file.device}} {{file.device}}
</td> </td>
<td data-test-id="file-table-item-path"> <td data-test-id="file-table-item-path">
{{file.path}} {{file.path}}
</td> </td>
<td> <td>
<i <i
class="file-table-item-status-{{file.status}}" class="file-table-item-status-{{file.status}}"
data-test-id="file-table-status-icon" data-test-id="file-table-status-icon"
> >
&nbsp; &nbsp;
</i> </i>
</td> </td>
<td data-test-id="file-table-item-status"> <td data-test-id="file-table-item-status">
{{file.status}} {{file.status}}
</td> </td>
</tr>

View file

@ -1,6 +1,7 @@
<header data-test-id="file-table-action-bar"> <header data-test-id="file-table-action-bar">
<label data-test-action="file-table-select-all"></label> <label data-test-action="file-table-select-all">
Selected {{selectedFilePaths.length}}
</label>
<button data-test-action="file-table-download-selected">Download Selected</button> <button data-test-action="file-table-download-selected">Download Selected</button>
</header> </header>
@ -18,6 +19,7 @@
{{file-table-item {{file-table-item
file=file file=file
selectedFilePaths=selectedFilePaths selectedFilePaths=selectedFilePaths
click=(action "toggleSelectedPath" file.path)
}} }}
{{/each}} {{/each}}
</tbody> </tbody>

View file

@ -1,6 +1,6 @@
import { module, test } from 'qunit'; import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit'; import { setupRenderingTest } from 'ember-qunit';
import { render, find, findAll } from '@ember/test-helpers'; import { render, find, findAll, click } from '@ember/test-helpers';
import hbs from 'htmlbars-inline-precompile'; import hbs from 'htmlbars-inline-precompile';
const genericFile = () => { const genericFile = () => {
@ -32,4 +32,19 @@ module('Integration | Component | file-table', function(hooks) {
assert.equal(findAll('[data-test-id=file-table-item]').length, 2, 'Found expected two rows'); assert.equal(findAll('[data-test-id=file-table-item]').length, 2, 'Found expected two rows');
}); });
test('it can select toggle a row with clicks', async function(assert) {
this.set('files', [genericFile(), genericFile()]);
await render(hbs`{{file-table files=files}}`);
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(), '', 'Not selected by default');
await click('[data-test-action=file-table-item-toggle]');
assert.equal(find('[data-test-action=file-table-select-all]').textContent.trim(), 'Selected 1');
assert.equal(find('[data-test-id=file-table-item-selected]').textContent.trim(), 'Selected', 'Selected after click');
await click('[data-test-action=file-table-item-toggle]');
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');
});
}); });