@swimlane/ngx-datatable 11.1.4 → 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 (196) hide show
  1. package/.npmignore +6 -0
  2. package/README.md +2 -1
  3. package/config/deploy.js +2 -2
  4. package/config/karma.conf.js +5 -0
  5. package/config/webpack.package.js +4 -0
  6. package/package.json +15 -14
  7. package/release/components/body/body-cell.component.js.map +1 -1
  8. package/release/components/body/body-cell.component.metadata.json +1 -1
  9. package/release/components/body/body-group-header-template.directive.js.map +1 -1
  10. package/release/components/body/body-group-header-template.directive.metadata.json +1 -1
  11. package/release/components/body/body-group-header.directive.d.ts +4 -5
  12. package/release/components/body/body-group-header.directive.js +4 -5
  13. package/release/components/body/body-group-header.directive.js.map +1 -1
  14. package/release/components/body/body-group-header.directive.metadata.json +1 -1
  15. package/release/components/body/body-row-wrapper.component.js.map +1 -1
  16. package/release/components/body/body-row-wrapper.component.metadata.json +1 -1
  17. package/release/components/body/body-row.component.js +5 -1
  18. package/release/components/body/body-row.component.js.map +1 -1
  19. package/release/components/body/body-row.component.metadata.json +1 -1
  20. package/release/components/body/body.component.d.ts +2 -1
  21. package/release/components/body/body.component.js +31 -16
  22. package/release/components/body/body.component.js.map +1 -1
  23. package/release/components/body/body.component.metadata.json +1 -1
  24. package/release/components/body/index.js.map +1 -1
  25. package/release/components/body/index.metadata.json +1 -1
  26. package/release/components/body/progress-bar.component.js.map +1 -1
  27. package/release/components/body/progress-bar.component.metadata.json +1 -1
  28. package/release/components/body/scroller.component.d.ts +3 -2
  29. package/release/components/body/scroller.component.js +5 -3
  30. package/release/components/body/scroller.component.js.map +1 -1
  31. package/release/components/body/scroller.component.metadata.json +1 -1
  32. package/release/components/body/selection.component.js.map +1 -1
  33. package/release/components/body/selection.component.metadata.json +1 -1
  34. package/release/components/columns/column-cell.directive.js.map +1 -1
  35. package/release/components/columns/column-cell.directive.metadata.json +1 -1
  36. package/release/components/columns/column-header.directive.js.map +1 -1
  37. package/release/components/columns/column-header.directive.metadata.json +1 -1
  38. package/release/components/columns/column.directive.js.map +1 -1
  39. package/release/components/columns/column.directive.metadata.json +1 -1
  40. package/release/components/columns/index.js.map +1 -1
  41. package/release/components/columns/index.metadata.json +1 -1
  42. package/release/components/datatable.component.css +7 -2
  43. package/release/components/datatable.component.d.ts +8 -3
  44. package/release/components/datatable.component.js +29 -11
  45. package/release/components/datatable.component.js.map +1 -1
  46. package/release/components/datatable.component.metadata.json +1 -1
  47. package/release/components/footer/footer-template.directive.js.map +1 -1
  48. package/release/components/footer/footer-template.directive.metadata.json +1 -1
  49. package/release/components/footer/footer.component.js.map +1 -1
  50. package/release/components/footer/footer.component.metadata.json +1 -1
  51. package/release/components/footer/footer.directive.js.map +1 -1
  52. package/release/components/footer/footer.directive.metadata.json +1 -1
  53. package/release/components/footer/index.js.map +1 -1
  54. package/release/components/footer/index.metadata.json +1 -1
  55. package/release/components/footer/pager.component.js +1 -1
  56. package/release/components/footer/pager.component.js.map +1 -1
  57. package/release/components/footer/pager.component.metadata.json +1 -1
  58. package/release/components/header/header-cell.component.js +2 -1
  59. package/release/components/header/header-cell.component.js.map +1 -1
  60. package/release/components/header/header-cell.component.metadata.json +1 -1
  61. package/release/components/header/header.component.js +1 -0
  62. package/release/components/header/header.component.js.map +1 -1
  63. package/release/components/header/header.component.metadata.json +1 -1
  64. package/release/components/header/index.js.map +1 -1
  65. package/release/components/header/index.metadata.json +1 -1
  66. package/release/components/index.js.map +1 -1
  67. package/release/components/index.metadata.json +1 -1
  68. package/release/components/row-detail/index.js.map +1 -1
  69. package/release/components/row-detail/index.metadata.json +1 -1
  70. package/release/components/row-detail/row-detail-template.directive.js.map +1 -1
  71. package/release/components/row-detail/row-detail-template.directive.metadata.json +1 -1
  72. package/release/components/row-detail/row-detail.directive.js.map +1 -1
  73. package/release/components/row-detail/row-detail.directive.metadata.json +1 -1
  74. package/release/datatable.module.d.ts +0 -1
  75. package/release/datatable.module.js +2 -2
  76. package/release/datatable.module.js.map +1 -1
  77. package/release/datatable.module.metadata.json +1 -1
  78. package/release/directives/draggable.directive.js +3 -3
  79. package/release/directives/draggable.directive.js.map +1 -1
  80. package/release/directives/draggable.directive.metadata.json +1 -1
  81. package/release/directives/index.js.map +1 -1
  82. package/release/directives/index.metadata.json +1 -1
  83. package/release/directives/long-press.directive.js +3 -3
  84. package/release/directives/long-press.directive.js.map +1 -1
  85. package/release/directives/long-press.directive.metadata.json +1 -1
  86. package/release/directives/orderable.directive.js.map +1 -1
  87. package/release/directives/orderable.directive.metadata.json +1 -1
  88. package/release/directives/resizeable.directive.d.ts +3 -2
  89. package/release/directives/resizeable.directive.js +13 -8
  90. package/release/directives/resizeable.directive.js.map +1 -1
  91. package/release/directives/resizeable.directive.metadata.json +1 -1
  92. package/release/directives/visibility.directive.js.map +1 -1
  93. package/release/directives/visibility.directive.metadata.json +1 -1
  94. package/release/events.d.ts +1 -0
  95. package/release/events.js +1 -0
  96. package/release/events.js.map +1 -1
  97. package/release/events.metadata.json +1 -1
  98. package/release/index.css +8 -3
  99. package/release/index.d.ts +1 -0
  100. package/release/index.js +198 -14804
  101. package/release/index.js.map +1 -1
  102. package/release/index.metadata.json +1 -1
  103. package/release/index.min.js +1 -1
  104. package/release/index.min.js.map +1 -1
  105. package/release/services/dimensions-helper.service.d.ts +7 -0
  106. package/release/services/dimensions-helper.service.js +26 -0
  107. package/release/services/dimensions-helper.service.js.map +1 -0
  108. package/release/services/dimensions-helper.service.metadata.json +1 -0
  109. package/release/services/index.d.ts +1 -0
  110. package/release/services/index.js +1 -0
  111. package/release/services/index.js.map +1 -1
  112. package/release/services/index.metadata.json +1 -1
  113. package/release/services/scrollbar-helper.service.js.map +1 -1
  114. package/release/services/scrollbar-helper.service.metadata.json +1 -1
  115. package/release/types/click.type.js.map +1 -1
  116. package/release/types/click.type.metadata.json +1 -1
  117. package/release/types/column-mode.type.js.map +1 -1
  118. package/release/types/column-mode.type.metadata.json +1 -1
  119. package/release/types/contextmenu.type.js.map +1 -1
  120. package/release/types/contextmenu.type.metadata.json +1 -1
  121. package/release/types/index.js.map +1 -1
  122. package/release/types/index.metadata.json +1 -1
  123. package/release/types/selection.type.js.map +1 -1
  124. package/release/types/selection.type.metadata.json +1 -1
  125. package/release/types/sort-direction.type.js.map +1 -1
  126. package/release/types/sort-direction.type.metadata.json +1 -1
  127. package/release/types/sort-prop-dir.type.js.map +1 -1
  128. package/release/types/sort-prop-dir.type.metadata.json +1 -1
  129. package/release/types/sort.type.js.map +1 -1
  130. package/release/types/sort.type.metadata.json +1 -1
  131. package/release/types/table-column.type.js.map +1 -1
  132. package/release/types/table-column.type.metadata.json +1 -1
  133. package/release/utils/camel-case.js.map +1 -1
  134. package/release/utils/camel-case.metadata.json +1 -1
  135. package/release/utils/column-helper.js.map +1 -1
  136. package/release/utils/column-helper.metadata.json +1 -1
  137. package/release/utils/column-prop-getters.js.map +1 -1
  138. package/release/utils/column-prop-getters.metadata.json +1 -1
  139. package/release/utils/column.d.ts +0 -4
  140. package/release/utils/column.js +0 -10
  141. package/release/utils/column.js.map +1 -1
  142. package/release/utils/column.metadata.json +1 -1
  143. package/release/utils/elm-from-point.js.map +1 -1
  144. package/release/utils/elm-from-point.metadata.json +1 -1
  145. package/release/utils/id.js.map +1 -1
  146. package/release/utils/id.metadata.json +1 -1
  147. package/release/utils/index.js.map +1 -1
  148. package/release/utils/index.metadata.json +1 -1
  149. package/release/utils/keys.js.map +1 -1
  150. package/release/utils/keys.metadata.json +1 -1
  151. package/release/utils/math.js +1 -1
  152. package/release/utils/math.js.map +1 -1
  153. package/release/utils/math.metadata.json +1 -1
  154. package/release/utils/prefixes.js +4 -6
  155. package/release/utils/prefixes.js.map +1 -1
  156. package/release/utils/prefixes.metadata.json +1 -1
  157. package/release/utils/row-height-cache.js.map +1 -1
  158. package/release/utils/row-height-cache.metadata.json +1 -1
  159. package/release/utils/selection.js.map +1 -1
  160. package/release/utils/selection.metadata.json +1 -1
  161. package/release/utils/sort.d.ts +2 -1
  162. package/release/utils/sort.js +6 -2
  163. package/release/utils/sort.js.map +1 -1
  164. package/release/utils/sort.metadata.json +1 -1
  165. package/release/utils/throttle.js.map +1 -1
  166. package/release/utils/throttle.metadata.json +1 -1
  167. package/release/utils/translate.js.map +1 -1
  168. package/release/utils/translate.metadata.json +1 -1
  169. package/src/components/body/body-group-header.directive.ts +5 -6
  170. package/src/components/body/body-row.component.ts +5 -5
  171. package/src/components/body/body.component.ts +46 -36
  172. package/src/components/body/scroller.component.ts +7 -5
  173. package/src/components/body/selection.component.ts +1 -1
  174. package/src/components/datatable.component.scss +14 -1
  175. package/src/components/datatable.component.spec.ts +383 -220
  176. package/src/components/datatable.component.ts +26 -13
  177. package/src/components/footer/footer.component.spec.ts +329 -47
  178. package/src/components/footer/pager.component.ts +10 -0
  179. package/src/components/header/header-cell.component.ts +2 -1
  180. package/src/components/header/header.component.ts +1 -0
  181. package/src/datatable.module.ts +6 -3
  182. package/src/directives/draggable.directive.ts +3 -2
  183. package/src/directives/long-press.directive.ts +3 -3
  184. package/src/directives/resizeable.directive.ts +11 -7
  185. package/src/events.ts +1 -0
  186. package/src/index.ts +1 -0
  187. package/src/services/dimensions-helper.service.ts +14 -0
  188. package/src/services/index.ts +1 -0
  189. package/src/utils/column-prop-getters.spec.ts +44 -0
  190. package/src/utils/column.ts +0 -12
  191. package/src/utils/facade/browser.ts +26 -0
  192. package/src/utils/math.ts +1 -1
  193. package/src/utils/sort.ts +7 -3
  194. package/test/index.ts +1 -0
  195. package/test/jasmine-matchers.d.ts +12 -0
  196. package/test/jasmine-matchers.ts +70 -0
@@ -1,10 +1,11 @@
1
1
  import {
2
- Directive, ElementRef, HostListener, Input, Output, EventEmitter, OnDestroy, AfterViewInit
2
+ Directive, ElementRef, HostListener, Input, Output, EventEmitter, OnDestroy, AfterViewInit, Renderer2
3
3
  } from '@angular/core';
4
4
  import { Observable } from 'rxjs/Observable';
5
5
  import { Subscription } from 'rxjs/Subscription';
6
6
  import { MouseEvent } from '../events';
7
7
  import { takeUntil } from 'rxjs/operators';
8
+ import { fromEvent } from 'rxjs/observable/fromEvent';
8
9
 
9
10
  @Directive({
10
11
  selector: '[resizeable]',
@@ -24,16 +25,19 @@ export class ResizeableDirective implements OnDestroy, AfterViewInit {
24
25
  subscription: Subscription;
25
26
  resizing: boolean = false;
26
27
 
27
- constructor(element: ElementRef) {
28
+ constructor(element: ElementRef, private renderer: Renderer2) {
28
29
  this.element = element.nativeElement;
29
30
  }
30
31
 
31
32
  ngAfterViewInit(): void {
33
+ const renderer2 = this.renderer;
34
+ const node = renderer2.createElement('span');
32
35
  if (this.resizeEnabled) {
33
- const node = document.createElement('span');
34
- node.classList.add('resize-handle');
35
- this.element.appendChild(node);
36
+ renderer2.addClass(node, 'resize-handle');
37
+ } else {
38
+ renderer2.addClass(node, 'resize-handle--not-resizable');
36
39
  }
40
+ renderer2.appendChild(this.element, node);
37
41
  }
38
42
 
39
43
  ngOnDestroy(): void {
@@ -59,11 +63,11 @@ export class ResizeableDirective implements OnDestroy, AfterViewInit {
59
63
  event.stopPropagation();
60
64
  this.resizing = true;
61
65
 
62
- const mouseup = Observable.fromEvent(document, 'mouseup');
66
+ const mouseup = fromEvent(document, 'mouseup');
63
67
  this.subscription = mouseup
64
68
  .subscribe((ev: MouseEvent) => this.onMouseup());
65
69
 
66
- const mouseMoveSub = Observable.fromEvent(document, 'mousemove')
70
+ const mouseMoveSub = fromEvent(document, 'mousemove')
67
71
  .pipe(takeUntil(mouseup))
68
72
  .subscribe((e: MouseEvent) => this.move(e, initialWidth, mouseDownScreenX));
69
73
 
package/src/events.ts CHANGED
@@ -3,3 +3,4 @@ declare let global: any;
3
3
  /* tslint:disable:variable-name */
4
4
  export const MouseEvent = (global as any).MouseEvent as MouseEvent;
5
5
  export const KeyboardEvent = (global as any).KeyboardEvent as KeyboardEvent;
6
+ export const Event = (global as any).Event as Event;
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './datatable.module';
2
2
  export * from './types';
3
3
  export * from './components';
4
+ export * from './services';
@@ -0,0 +1,14 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+
3
+ /**
4
+ * Gets the width of the scrollbar. Nesc for windows
5
+ * http://stackoverflow.com/a/13382873/888165
6
+ */
7
+ @Injectable()
8
+ export class DimensionsHelper {
9
+
10
+ getDimensions(element: Element): ClientRect {
11
+ return element.getBoundingClientRect();
12
+ }
13
+
14
+ }
@@ -1 +1,2 @@
1
1
  export * from './scrollbar-helper.service';
2
+ export * from './dimensions-helper.service';
@@ -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
- }
@@ -0,0 +1,26 @@
1
+ /*tslint:disable */
2
+ /**
3
+ * @license
4
+ * Copyright Google Inc. All Rights Reserved.
5
+ *
6
+ * Use of this source code is governed by an MIT-style license that can be
7
+ * found in the LICENSE file at https://angular.io/license
8
+ */
9
+
10
+ /**
11
+ * JS version of browser APIs. This library can only run in the browser.
12
+ */
13
+ var win = (typeof window !== 'undefined' && window) || <any>{};
14
+
15
+ export { win as window };
16
+ export var document = win.document;
17
+ export var location = win.location;
18
+ export var gc = win['gc'] ? () => win['gc']() : (): any => null;
19
+ export var performance = win['performance'] ? win['performance'] : null;
20
+ export const Event = win['Event'];
21
+ export const MouseEvent = win['MouseEvent'];
22
+ export const KeyboardEvent = win['KeyboardEvent'];
23
+ export const EventTarget = win['EventTarget'];
24
+ export const History = win['History'];
25
+ export const Location = win['Location'];
26
+ export const EventListener = win['EventListener'];
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/src/utils/sort.ts CHANGED
@@ -51,18 +51,20 @@ export function orderByComparator(a: any, b: any): number {
51
51
  }
52
52
 
53
53
  /**
54
- * Sorts the rows
54
+ * creates a shallow copy of the `rows` input and returns the sorted copy. this function
55
+ * does not sort the `rows` argument in place
55
56
  */
56
57
  export function sortRows(rows: any[], columns: any[], dirs: SortPropDir[]): any[] {
57
58
  if(!rows) return [];
58
59
  if(!dirs || !dirs.length || !columns) return [...rows];
59
60
 
60
61
  /**
61
- * create a mapping from each row to its row index prior to sorting
62
+ * record the row ordering of results from prior sort operations (if applicable)
63
+ * this is necessary to guarantee stable sorting behavior
62
64
  */
63
65
  const rowToIndexMap = new Map<any, number>();
64
66
  rows.forEach((row, index) => rowToIndexMap.set(row, index));
65
-
67
+
66
68
  const temp = [...rows];
67
69
  const cols = columns.reduce((obj, col) => {
68
70
  if(col.comparator && typeof col.comparator === 'function') {
@@ -107,6 +109,8 @@ export function sortRows(rows: any[], columns: any[], dirs: SortPropDir[]): any[
107
109
  if (comparison !== 0) return comparison;
108
110
  }
109
111
 
112
+ if (!(rowToIndexMap.has(rowA) && rowToIndexMap.has(rowB))) return 0;
113
+
110
114
  /**
111
115
  * all else being equal, preserve original order of the rows (stable sort)
112
116
  */
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
+ }