Skip to content

Commit db22c6a

Browse files
authored
AAE-27309 Add selectable property to datatable row (#10368)
* AAE-27309 Add selectable property to datatable row * AAE-27309 Update documentation
1 parent 258f018 commit db22c6a

File tree

6 files changed

+38
-7
lines changed

6 files changed

+38
-7
lines changed

docs/core/interfaces/datatable-adapter.interface.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ An array of [`DataRow`](../../../lib/core/src/lib/datatable/data/data-row.model.
8181
```ts
8282
interface DataRow {
8383
isSelected: boolean;
84+
isSelectable?: boolean;
8485
isDropTarget?: boolean;
8586
cssClass?: string;
8687
hasValue(key: string): boolean;

lib/core/src/lib/datatable/components/datatable/datatable.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@
213213
tabindex="0">
214214
<mat-checkbox
215215
[id]="'select-file-' + idx"
216+
[disabled]="!row?.isSelectable"
216217
[class.adf-datatable-checkbox-selected]="row.isSelected"
217218
[class.adf-datatable-hover-only]="displayCheckboxesOnHover"
218219
[checked]="row.isSelected"

lib/core/src/lib/datatable/components/datatable/datatable.component.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,34 @@ describe('DataTable', () => {
919919
}
920920
});
921921

922+
it('should update only selectable rows on "select all" click', () => {
923+
const data = new ObjectDataTableAdapter([{}, {}, {}], []);
924+
const rows = data.getRows();
925+
926+
rows[0].isSelectable = false;
927+
928+
dataTable.data = data;
929+
dataTable.multiselect = true;
930+
dataTable.ngAfterContentInit();
931+
932+
dataTable.onSelectAllClick({ checked: true } as MatCheckboxChange);
933+
expect(dataTable.isSelectAllChecked).toBe(true);
934+
for (let i = 0; i < rows.length; i++) {
935+
if (i === 0) {
936+
expect(rows[i].isSelected).toBe(false);
937+
continue;
938+
}
939+
940+
expect(rows[i].isSelected).toBe(true);
941+
}
942+
943+
dataTable.onSelectAllClick({ checked: false } as MatCheckboxChange);
944+
expect(dataTable.isSelectAllChecked).toBe(false);
945+
for (let i = 0; i < rows.length; i++) {
946+
expect(rows[i].isSelected).toBe(false);
947+
}
948+
});
949+
922950
it('should allow "select all" calls with no rows', () => {
923951
dataTable.multiselect = true;
924952
dataTable.ngOnChanges({ data: new SimpleChange('123', {}, true) });

lib/core/src/lib/datatable/components/datatable/datatable.component.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges,
446446
}
447447

448448
convertToRowsData(rows: any[]): ObjectDataRow[] {
449-
return rows.map((row) => new ObjectDataRow(row, row.isSelected));
449+
return rows.map((row) => new ObjectDataRow(row, row.isSelected, row?.isSelectable));
450450
}
451451

452452
convertToColumnsData(columns: any[]): ObjectDataColumn[] {
@@ -589,7 +589,7 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges,
589589
}
590590

591591
private handleRowSelection(row: DataRow, e: KeyboardEvent | MouseEvent) {
592-
if (!this.data) {
592+
if (!this.data || !row?.isSelectable) {
593593
return;
594594
}
595595

@@ -713,10 +713,10 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges,
713713
this.isSelectAllIndeterminate = false;
714714

715715
if (this.multiselect) {
716-
const rows = this.data.getRows();
717-
if (rows && rows.length > 0) {
718-
for (let i = 0; i < rows.length; i++) {
719-
this.selectRow(rows[i], matCheckboxChange.checked);
716+
const selectableRows = this.data.getRows().filter(row => row?.isSelectable);
717+
if (selectableRows && selectableRows.length > 0) {
718+
for (let i = 0; i < selectableRows.length; i++) {
719+
this.selectRow(selectableRows[i], matCheckboxChange.checked);
720720
}
721721
}
722722

lib/core/src/lib/datatable/data/data-row.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface DataRow {
1919
[key: string]: any;
2020

2121
isSelected: boolean;
22+
isSelectable?: boolean;
2223
isDropTarget?: boolean;
2324
cssClass?: string;
2425
id?: string;

lib/core/src/lib/datatable/data/object-datarow.model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { DataRow } from './data-row.model';
2121
// Simple implementation of the DataRow interface.
2222
export class ObjectDataRow implements DataRow {
2323

24-
constructor(private obj: any, public isSelected: boolean = false) {
24+
constructor(private obj: any, public isSelected: boolean = false, public isSelectable: boolean = true) {
2525
if (!obj) {
2626
throw new Error('Object source not found');
2727
}

0 commit comments

Comments
 (0)