@swimlane/ngx-datatable 11.1.7 → 11.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.npmignore +6 -0
- package/config/deploy.js +2 -2
- package/config/karma.conf.js +5 -0
- package/package.json +2 -1
- package/release/components/body/body-group-header.directive.d.ts +4 -5
- package/release/components/body/body-group-header.directive.js +4 -5
- package/release/components/body/body-group-header.directive.js.map +1 -1
- package/release/components/body/body-row.component.js +1 -1
- package/release/components/body/body-row.component.js.map +1 -1
- package/release/components/body/body.component.d.ts +1 -1
- package/release/components/body/body.component.js +9 -6
- package/release/components/body/body.component.js.map +1 -1
- package/release/components/datatable.component.css +7 -2
- package/release/components/datatable.component.d.ts +1 -1
- package/release/components/footer/pager.component.js +1 -1
- package/release/components/footer/pager.component.js.map +1 -1
- package/release/components/footer/pager.component.metadata.json +1 -1
- package/release/components/header/header-cell.component.js +2 -1
- package/release/components/header/header-cell.component.js.map +1 -1
- package/release/components/header/header-cell.component.metadata.json +1 -1
- package/release/components/header/header.component.js +1 -0
- package/release/components/header/header.component.js.map +1 -1
- package/release/directives/resizeable.directive.js +5 -2
- package/release/directives/resizeable.directive.js.map +1 -1
- package/release/index.css +8 -3
- package/release/index.js +51 -54
- package/release/index.min.js +1 -1
- package/release/index.min.js.map +1 -1
- package/release/utils/column.d.ts +0 -4
- package/release/utils/column.js +0 -10
- package/release/utils/column.js.map +1 -1
- package/release/utils/column.metadata.json +1 -1
- package/release/utils/math.js +1 -1
- package/release/utils/math.js.map +1 -1
- package/src/components/body/body-group-header.directive.ts +5 -6
- package/src/components/body/body-row.component.ts +2 -2
- package/src/components/body/body.component.ts +8 -6
- package/src/components/datatable.component.scss +14 -1
- package/src/components/datatable.component.ts +2 -2
- package/src/components/footer/footer.component.spec.ts +329 -47
- package/src/components/footer/pager.component.ts +10 -0
- package/src/components/header/header-cell.component.ts +2 -1
- package/src/components/header/header.component.ts +1 -0
- package/src/directives/resizeable.directive.ts +4 -2
- package/src/utils/column-prop-getters.spec.ts +44 -0
- package/src/utils/column.ts +0 -12
- package/src/utils/math.ts +1 -1
- package/test/index.ts +1 -0
- package/test/jasmine-matchers.d.ts +12 -0
- package/test/jasmine-matchers.ts +70 -0
|
@@ -8,6 +8,8 @@ import {
|
|
|
8
8
|
<ul class="pager">
|
|
9
9
|
<li [class.disabled]="!canPrevious()">
|
|
10
10
|
<a
|
|
11
|
+
role="button"
|
|
12
|
+
aria-label="go to first page"
|
|
11
13
|
href="javascript:void(0)"
|
|
12
14
|
(click)="selectPage(1)">
|
|
13
15
|
<i class="{{pagerPreviousIcon}}"></i>
|
|
@@ -15,12 +17,16 @@ import {
|
|
|
15
17
|
</li>
|
|
16
18
|
<li [class.disabled]="!canPrevious()">
|
|
17
19
|
<a
|
|
20
|
+
role="button"
|
|
21
|
+
aria-label="go to previous page"
|
|
18
22
|
href="javascript:void(0)"
|
|
19
23
|
(click)="prevPage()">
|
|
20
24
|
<i class="{{pagerLeftArrowIcon}}"></i>
|
|
21
25
|
</a>
|
|
22
26
|
</li>
|
|
23
27
|
<li
|
|
28
|
+
role="button"
|
|
29
|
+
[attr.aria-label]="'page ' + pg.number"
|
|
24
30
|
class="pages"
|
|
25
31
|
*ngFor="let pg of pages"
|
|
26
32
|
[class.active]="pg.number === page">
|
|
@@ -32,6 +38,8 @@ import {
|
|
|
32
38
|
</li>
|
|
33
39
|
<li [class.disabled]="!canNext()">
|
|
34
40
|
<a
|
|
41
|
+
role="button"
|
|
42
|
+
aria-label="go to next page"
|
|
35
43
|
href="javascript:void(0)"
|
|
36
44
|
(click)="nextPage()">
|
|
37
45
|
<i class="{{pagerRightArrowIcon}}"></i>
|
|
@@ -39,6 +47,8 @@ import {
|
|
|
39
47
|
</li>
|
|
40
48
|
<li [class.disabled]="!canNext()">
|
|
41
49
|
<a
|
|
50
|
+
role="button"
|
|
51
|
+
aria-label="go to last page"
|
|
42
52
|
href="javascript:void(0)"
|
|
43
53
|
(click)="selectPage(totalPages)">
|
|
44
54
|
<i class="{{pagerNextIcon}}"></i>
|
|
@@ -9,7 +9,7 @@ import { MouseEvent } from '../../events';
|
|
|
9
9
|
@Component({
|
|
10
10
|
selector: 'datatable-header-cell',
|
|
11
11
|
template: `
|
|
12
|
-
<div>
|
|
12
|
+
<div class="datatable-header-cell-template-wrap">
|
|
13
13
|
<label
|
|
14
14
|
*ngIf="isCheckboxable"
|
|
15
15
|
class="datatable-checkbox">
|
|
@@ -79,6 +79,7 @@ export class DataTableHeaderCellComponent {
|
|
|
79
79
|
@Input() set sorts(val: any[]) {
|
|
80
80
|
this._sorts = val;
|
|
81
81
|
this.sortDir = this.calcSortDir(val);
|
|
82
|
+
this.cellContext.sortDir = this.sortDir;
|
|
82
83
|
this.sortClass = this.calcSortClass(this.sortDir);
|
|
83
84
|
this.cd.markForCheck();
|
|
84
85
|
}
|
|
@@ -101,6 +101,7 @@ export class DataTableHeaderComponent {
|
|
|
101
101
|
const colsByPin = columnsByPin(val);
|
|
102
102
|
this._columnsByPin = columnsByPinArr(val);
|
|
103
103
|
this._columnGroupWidths = columnGroupWidths(colsByPin, val);
|
|
104
|
+
this.setStylesByGroup();
|
|
104
105
|
}
|
|
105
106
|
|
|
106
107
|
get columns(): any[] {
|
|
@@ -31,11 +31,13 @@ export class ResizeableDirective implements OnDestroy, AfterViewInit {
|
|
|
31
31
|
|
|
32
32
|
ngAfterViewInit(): void {
|
|
33
33
|
const renderer2 = this.renderer;
|
|
34
|
+
const node = renderer2.createElement('span');
|
|
34
35
|
if (this.resizeEnabled) {
|
|
35
|
-
const node = renderer2.createElement('span');
|
|
36
36
|
renderer2.addClass(node, 'resize-handle');
|
|
37
|
-
|
|
37
|
+
} else {
|
|
38
|
+
renderer2.addClass(node, 'resize-handle--not-resizable');
|
|
38
39
|
}
|
|
40
|
+
renderer2.appendChild(this.element, node);
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
ngOnDestroy(): void {
|
|
@@ -50,4 +50,48 @@ describe('deepValueGetter', () => {
|
|
|
50
50
|
expect(deepValueGetter(data, 'a.b.value')).toEqual(5);
|
|
51
51
|
});
|
|
52
52
|
|
|
53
|
+
it('should get array-element two-level deep', () => {
|
|
54
|
+
let data = {
|
|
55
|
+
a: {
|
|
56
|
+
b: [
|
|
57
|
+
123
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
expect(deepValueGetter(data, 'a.b.0')).toEqual(123);
|
|
62
|
+
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('should get value of object inside an array-element', () => {
|
|
66
|
+
let data = {
|
|
67
|
+
a: {
|
|
68
|
+
b: [
|
|
69
|
+
{c: 123}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
expect(deepValueGetter(data, 'a.b.0.c')).toEqual(123);
|
|
74
|
+
});
|
|
75
|
+
it('should get value of object inside a double array-element', () => {
|
|
76
|
+
let data = {
|
|
77
|
+
a: {
|
|
78
|
+
b: [
|
|
79
|
+
[
|
|
80
|
+
123
|
|
81
|
+
]
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
expect(deepValueGetter(data, 'a.b.0.0')).toEqual(123);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
it('should check for root-level fields with square brackets in name', () => {
|
|
90
|
+
let data = {
|
|
91
|
+
'a.b.1.value': 5
|
|
92
|
+
};
|
|
93
|
+
expect(deepValueGetter(data, 'a.b.1.value')).toEqual(5);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
|
|
53
97
|
});
|
package/src/utils/column.ts
CHANGED
|
@@ -76,15 +76,3 @@ export function columnsByPinArr(val: any) {
|
|
|
76
76
|
|
|
77
77
|
return colsByPinArr;
|
|
78
78
|
}
|
|
79
|
-
|
|
80
|
-
export function allColumnsByPinArr(val: any) {
|
|
81
|
-
const colsByPinArr = [];
|
|
82
|
-
const colsByPin = columnsByPin(val);
|
|
83
|
-
const colsTest = [];
|
|
84
|
-
|
|
85
|
-
colsByPinArr.push({ type: 'left', columns: colsByPin['left'] });
|
|
86
|
-
colsByPinArr.push({ type: 'center', columns: colsByPin['center'] });
|
|
87
|
-
colsByPinArr.push({ type: 'right', columns: colsByPin['right'] });
|
|
88
|
-
|
|
89
|
-
return colsByPinArr;
|
|
90
|
-
}
|
package/src/utils/math.ts
CHANGED
|
@@ -36,7 +36,7 @@ function scaleColumns(colsByGroup: any, maxWidth: any, totalFlexGrow: any) {
|
|
|
36
36
|
for(const column of colsByGroup[attr]) {
|
|
37
37
|
if (!column.canAutoResize) {
|
|
38
38
|
maxWidth -= column.width;
|
|
39
|
-
totalFlexGrow -= column.flexGrow;
|
|
39
|
+
totalFlexGrow -= column.flexGrow ? column.flexGrow : 0;
|
|
40
40
|
} else {
|
|
41
41
|
column.width = 0;
|
|
42
42
|
}
|
package/test/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './jasmine-matchers';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
declare namespace jasmine {
|
|
2
|
+
interface Matchers<T> {
|
|
3
|
+
toHaveText(actual: any, expectationFailOutput?: any): jasmine.CustomMatcher;
|
|
4
|
+
toHaveCssClass(expected: any): boolean;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
Copyright 2017-2018 Google Inc. All Rights Reserved.
|
|
10
|
+
Use of this source code is governed by an MIT-style license that
|
|
11
|
+
can be found in the LICENSE file at http://angular.io/license
|
|
12
|
+
*/
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/// <reference path="./jasmine-matchers.d.ts" />
|
|
2
|
+
|
|
3
|
+
export const addMatchers = () => jasmine.addMatchers({
|
|
4
|
+
toHaveText, toHaveCssClass
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* `toHaveText()` adapted from https://angular.io/guide/testing
|
|
9
|
+
*/
|
|
10
|
+
function toHaveText(): jasmine.CustomMatcher {
|
|
11
|
+
return {
|
|
12
|
+
compare(
|
|
13
|
+
actual: any,
|
|
14
|
+
expectedText: string,
|
|
15
|
+
expectationFailOutput?: any
|
|
16
|
+
): jasmine.CustomMatcherResult {
|
|
17
|
+
const actualText = elementText(actual);
|
|
18
|
+
const pass = actualText.indexOf(expectedText) > -1;
|
|
19
|
+
const message = pass ? '' : composeMessage();
|
|
20
|
+
return { pass, message };
|
|
21
|
+
|
|
22
|
+
function composeMessage() {
|
|
23
|
+
const a =
|
|
24
|
+
actualText.length < 100
|
|
25
|
+
? actualText
|
|
26
|
+
: actualText.substr(0, 100) + '...';
|
|
27
|
+
const efo = expectationFailOutput ? ` '${expectationFailOutput}'` : '';
|
|
28
|
+
return `Expected element to have text content '${expectedText}' instead of '${a}'${efo}`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function elementText(n: any): string {
|
|
35
|
+
if (n instanceof Array) {
|
|
36
|
+
return n.map(elementText).join('');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (n.nodeType === Node.COMMENT_NODE) {
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (n.nodeType === Node.ELEMENT_NODE && n.hasChildNodes()) {
|
|
44
|
+
return elementText(Array.prototype.slice.call(n.childNodes));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (n.nativeElement) {
|
|
48
|
+
n = n.nativeElement;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return n.textContent;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* adapted from https://github.com/ng-bootstrap/ng-bootstrap/blob/master/src/test/matchers.ts
|
|
56
|
+
*/
|
|
57
|
+
function toHaveCssClass(util, customEqualityTests) {
|
|
58
|
+
return { compare: buildError(false), negativeCompare: buildError(true) };
|
|
59
|
+
|
|
60
|
+
function buildError(isNot: boolean) {
|
|
61
|
+
return function(actual: HTMLElement, className: string) {
|
|
62
|
+
return {
|
|
63
|
+
pass: actual.classList.contains(className) === !isNot,
|
|
64
|
+
message: `Expected ${actual.outerHTML} ${
|
|
65
|
+
isNot ? 'not ' : ''
|
|
66
|
+
}to contain the CSS class "${className}"`
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|