@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.
Files changed (50) hide show
  1. package/.npmignore +6 -0
  2. package/config/deploy.js +2 -2
  3. package/config/karma.conf.js +5 -0
  4. package/package.json +2 -1
  5. package/release/components/body/body-group-header.directive.d.ts +4 -5
  6. package/release/components/body/body-group-header.directive.js +4 -5
  7. package/release/components/body/body-group-header.directive.js.map +1 -1
  8. package/release/components/body/body-row.component.js +1 -1
  9. package/release/components/body/body-row.component.js.map +1 -1
  10. package/release/components/body/body.component.d.ts +1 -1
  11. package/release/components/body/body.component.js +9 -6
  12. package/release/components/body/body.component.js.map +1 -1
  13. package/release/components/datatable.component.css +7 -2
  14. package/release/components/datatable.component.d.ts +1 -1
  15. package/release/components/footer/pager.component.js +1 -1
  16. package/release/components/footer/pager.component.js.map +1 -1
  17. package/release/components/footer/pager.component.metadata.json +1 -1
  18. package/release/components/header/header-cell.component.js +2 -1
  19. package/release/components/header/header-cell.component.js.map +1 -1
  20. package/release/components/header/header-cell.component.metadata.json +1 -1
  21. package/release/components/header/header.component.js +1 -0
  22. package/release/components/header/header.component.js.map +1 -1
  23. package/release/directives/resizeable.directive.js +5 -2
  24. package/release/directives/resizeable.directive.js.map +1 -1
  25. package/release/index.css +8 -3
  26. package/release/index.js +51 -54
  27. package/release/index.min.js +1 -1
  28. package/release/index.min.js.map +1 -1
  29. package/release/utils/column.d.ts +0 -4
  30. package/release/utils/column.js +0 -10
  31. package/release/utils/column.js.map +1 -1
  32. package/release/utils/column.metadata.json +1 -1
  33. package/release/utils/math.js +1 -1
  34. package/release/utils/math.js.map +1 -1
  35. package/src/components/body/body-group-header.directive.ts +5 -6
  36. package/src/components/body/body-row.component.ts +2 -2
  37. package/src/components/body/body.component.ts +8 -6
  38. package/src/components/datatable.component.scss +14 -1
  39. package/src/components/datatable.component.ts +2 -2
  40. package/src/components/footer/footer.component.spec.ts +329 -47
  41. package/src/components/footer/pager.component.ts +10 -0
  42. package/src/components/header/header-cell.component.ts +2 -1
  43. package/src/components/header/header.component.ts +1 -0
  44. package/src/directives/resizeable.directive.ts +4 -2
  45. package/src/utils/column-prop-getters.spec.ts +44 -0
  46. package/src/utils/column.ts +0 -12
  47. package/src/utils/math.ts +1 -1
  48. package/test/index.ts +1 -0
  49. package/test/jasmine-matchers.d.ts +12 -0
  50. 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
- renderer2.appendChild(this.element, node);
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
  });
@@ -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
+ }