Row click toggles selection, aware in both components
This commit is contained in:
parent
7229af4fdb
commit
0fb5d4668b
7 changed files with 70 additions and 32 deletions
|
@ -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);
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
7
app/controllers/application.js
Normal file
7
app/controllers/application.js
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
import Controller from '@ember/controller';
|
||||||
|
|
||||||
|
const files = []; // Put sample data here...
|
||||||
|
|
||||||
|
export default Controller.extend({
|
||||||
|
files,
|
||||||
|
});
|
|
@ -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}}
|
|
@ -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"
|
||||||
>
|
>
|
||||||
|
|
||||||
</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>
|
|
|
@ -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>
|
||||||
|
|
|
@ -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');
|
||||||
|
});
|
||||||
});
|
});
|
Loading…
Add table
Reference in a new issue