@ni/nimble-components 18.5.7 → 18.5.8

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 (45) hide show
  1. package/dist/all-components-bundle.js +290 -35
  2. package/dist/all-components-bundle.js.map +1 -1
  3. package/dist/all-components-bundle.min.js +883 -843
  4. package/dist/all-components-bundle.min.js.map +1 -1
  5. package/dist/esm/table/components/cell/index.d.ts +1 -1
  6. package/dist/esm/table/components/cell/index.js.map +1 -1
  7. package/dist/esm/table/components/cell/template.d.ts +1 -1
  8. package/dist/esm/table/components/header/index.d.ts +6 -0
  9. package/dist/esm/table/components/header/index.js +32 -0
  10. package/dist/esm/table/components/header/index.js.map +1 -1
  11. package/dist/esm/table/components/header/styles.js +5 -0
  12. package/dist/esm/table/components/header/styles.js.map +1 -1
  13. package/dist/esm/table/components/header/template.js +15 -2
  14. package/dist/esm/table/components/header/template.js.map +1 -1
  15. package/dist/esm/table/components/row/index.d.ts +5 -1
  16. package/dist/esm/table/components/row/index.js.map +1 -1
  17. package/dist/esm/table/components/row/template.d.ts +1 -1
  18. package/dist/esm/table/index.d.ts +13 -2
  19. package/dist/esm/table/index.js +62 -30
  20. package/dist/esm/table/index.js.map +1 -1
  21. package/dist/esm/table/models/sort-operations.d.ts +7 -0
  22. package/dist/esm/table/models/sort-operations.js +36 -0
  23. package/dist/esm/table/models/sort-operations.js.map +1 -0
  24. package/dist/esm/table/models/table-validator.d.ts +2 -0
  25. package/dist/esm/table/models/table-validator.js +14 -1
  26. package/dist/esm/table/models/table-validator.js.map +1 -1
  27. package/dist/esm/table/template.js +6 -1
  28. package/dist/esm/table/template.js.map +1 -1
  29. package/dist/esm/table/types.d.ts +10 -17
  30. package/dist/esm/table/types.js +8 -1
  31. package/dist/esm/table/types.js.map +1 -1
  32. package/dist/esm/table-column/base/index.d.ts +23 -1
  33. package/dist/esm/table-column/base/index.js +25 -3
  34. package/dist/esm/table-column/base/index.js.map +1 -1
  35. package/dist/esm/table-column/base/types.d.ts +26 -0
  36. package/dist/esm/table-column/base/types.js +15 -0
  37. package/dist/esm/table-column/base/types.js.map +1 -0
  38. package/dist/esm/table-column/text/index.d.ts +7 -1
  39. package/dist/esm/table-column/text/index.js +4 -1
  40. package/dist/esm/table-column/text/index.js.map +1 -1
  41. package/dist/esm/table-column/text/template.d.ts +1 -1
  42. package/package.json +1 -1
  43. package/dist/esm/table/models/table-validator.spec.d.ts +0 -1
  44. package/dist/esm/table/models/table-validator.spec.js +0 -276
  45. package/dist/esm/table/models/table-validator.spec.js.map +0 -1
@@ -1,2 +1,9 @@
1
- export {};
1
+ /**
2
+ * The possible directions a table column can be sorted in.
3
+ */
4
+ export const TableColumnSortDirection = {
5
+ none: undefined,
6
+ ascending: 'ascending',
7
+ descending: 'descending'
8
+ };
2
9
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/table/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/table/types.ts"],"names":[],"mappings":"AAyCA;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACpC,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,WAAW;IACtB,UAAU,EAAE,YAAY;CAClB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { ElementStyles, ViewTemplate } from '@microsoft/fast-element';
2
2
  import { FoundationElement } from '@microsoft/fast-foundation';
3
- import type { TableCellRecord, TableCellState, TableFieldName } from '../../table/types';
3
+ import { TableColumnSortDirection, TableFieldName } from '../../table/types';
4
+ import { TableCellRecord, TableCellState, TableColumnSortOperation } from './types';
4
5
  /**
5
6
  * The base class for table columns
6
7
  */
@@ -9,6 +10,8 @@ export declare abstract class TableColumn<TCellRecord extends TableCellRecord =
9
10
  actionMenuSlot?: string;
10
11
  actionMenuLabel?: string;
11
12
  columnHidden: boolean;
13
+ sortIndex?: number | null;
14
+ sortDirection: TableColumnSortDirection;
12
15
  /**
13
16
  * @internal
14
17
  *
@@ -41,6 +44,25 @@ export declare abstract class TableColumn<TCellRecord extends TableCellRecord =
41
44
  * The relevant, static configuration a column requires its cellTemplate to have access to.
42
45
  */
43
46
  columnConfig?: TColumnConfig;
47
+ /**
48
+ * @internal
49
+ *
50
+ * The name of the data field that will be used for operations on the table, such as sorting and grouping.
51
+ */
52
+ operandDataRecordFieldName?: TableFieldName;
53
+ /**
54
+ * @internal
55
+ *
56
+ * The operation to use when sorting the table by this column.
57
+ */
58
+ sortOperation: TableColumnSortOperation;
59
+ /**
60
+ * @internal
61
+ *
62
+ * Properties prefixed with `internal` are for internal table-use only.
63
+ */
64
+ readonly internalUniqueId: string;
65
+ constructor();
44
66
  /**
45
67
  * @internal
46
68
  */
@@ -1,14 +1,17 @@
1
1
  import { __decorate } from "tslib";
2
- import { attr, observable } from '@microsoft/fast-element';
2
+ import { attr, nullableNumberConverter, observable } from '@microsoft/fast-element';
3
3
  import { FoundationElement } from '@microsoft/fast-foundation';
4
4
  import { uniqueId } from '@microsoft/fast-web-utilities';
5
+ import { TableColumnSortDirection } from '../../table/types';
6
+ import { TableColumnSortOperation } from './types';
5
7
  /**
6
8
  * The base class for table columns
7
9
  */
8
10
  export class TableColumn extends FoundationElement {
9
11
  constructor() {
10
- super(...arguments);
12
+ super();
11
13
  this.columnHidden = false;
14
+ this.sortDirection = TableColumnSortDirection.none;
12
15
  /**
13
16
  * @internal
14
17
  *
@@ -16,13 +19,20 @@ export class TableColumn extends FoundationElement {
16
19
  * This array is parallel with the field names specified by `cellRecordFieldNames`.
17
20
  */
18
21
  this.dataRecordFieldNames = [];
22
+ /**
23
+ * @internal
24
+ *
25
+ * The operation to use when sorting the table by this column.
26
+ */
27
+ this.sortOperation = TableColumnSortOperation.basic;
28
+ this.internalUniqueId = uniqueId('table-column-slot');
19
29
  }
20
30
  /**
21
31
  * @internal
22
32
  */
23
33
  connectedCallback() {
24
34
  super.connectedCallback();
25
- this.setAttribute('slot', uniqueId('table-column-slot'));
35
+ this.setAttribute('slot', this.internalUniqueId);
26
36
  }
27
37
  }
28
38
  __decorate([
@@ -37,10 +47,22 @@ __decorate([
37
47
  __decorate([
38
48
  attr({ attribute: 'column-hidden', mode: 'boolean' })
39
49
  ], TableColumn.prototype, "columnHidden", void 0);
50
+ __decorate([
51
+ attr({ attribute: 'sort-index', converter: nullableNumberConverter })
52
+ ], TableColumn.prototype, "sortIndex", void 0);
53
+ __decorate([
54
+ attr({ attribute: 'sort-direction' })
55
+ ], TableColumn.prototype, "sortDirection", void 0);
40
56
  __decorate([
41
57
  observable
42
58
  ], TableColumn.prototype, "dataRecordFieldNames", void 0);
43
59
  __decorate([
44
60
  observable
45
61
  ], TableColumn.prototype, "columnConfig", void 0);
62
+ __decorate([
63
+ observable
64
+ ], TableColumn.prototype, "operandDataRecordFieldName", void 0);
65
+ __decorate([
66
+ observable
67
+ ], TableColumn.prototype, "sortOperation", void 0);
46
68
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table-column/base/index.ts"],"names":[],"mappings":";AAAA,OAAO,EACH,IAAI,EAEJ,UAAU,EAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAOzD;;GAEG;AACH,MAAM,OAAgB,WAGpB,SAAQ,iBAAiB;IAH3B;;QAcW,iBAAY,GAAG,KAAK,CAAC;QAyB5B;;;;;WAKG;QAEI,yBAAoB,GAA4C,EAAE,CAAC;IAkB9E,CAAC;IARG;;OAEG;IACa,iBAAiB;QAC7B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7D,CAAC;CACJ;AA3DG;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;6CACR;AAGzB;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;mDACT;AAG/B;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;oDACT;AAGhC;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;iDAC1B;AAgC5B;IADC,UAAU;yDAC+D;AAQ1E;IADC,UAAU;iDACyB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table-column/base/index.ts"],"names":[],"mappings":";AAAA,OAAO,EACH,IAAI,EAEJ,uBAAuB,EACvB,UAAU,EAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAkB,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAGH,wBAAwB,EAC3B,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,MAAM,OAAgB,WAGpB,SAAQ,iBAAiB;IAkFvB;QACI,KAAK,EAAE,CAAC;QAxEL,iBAAY,GAAG,KAAK,CAAC;QAMrB,kBAAa,GAA6B,wBAAwB,CAAC,IAAI,CAAC;QAyB/E;;;;;WAKG;QAEI,yBAAoB,GAA4C,EAAE,CAAC;QAkB1E;;;;WAIG;QAEI,kBAAa,GAA6B,wBAAwB,CAAC,KAAK,CAAC;QAW5E,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACa,iBAAiB;QAC7B,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAE1B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrD,CAAC;CACJ;AA7FG;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;6CACR;AAGzB;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;mDACT;AAG/B;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;oDACT;AAGhC;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;iDAC1B;AAG5B;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,uBAAuB,EAAE,CAAC;8CACrC;AAGjC;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;kDACyC;AAgC/E;IADC,UAAU;yDAC+D;AAQ1E;IADC,UAAU;iDACyB;AAQpC;IADC,UAAU;+DACwC;AAQnD;IADC,UAAU;kDACqE"}
@@ -0,0 +1,26 @@
1
+ import type { TableRecord } from '../../table/types';
2
+ /**
3
+ * An object whose fields are defined by a particular TableColumn, which is used by the column's
4
+ * cellTemplate implementation.
5
+ */
6
+ export interface TableCellRecord extends TableRecord {
7
+ }
8
+ export interface TableCellState<TCellRecord extends TableCellRecord = TableCellRecord, TColumnConfig = unknown> {
9
+ cellRecord: TCellRecord;
10
+ columnConfig: TColumnConfig;
11
+ }
12
+ /**
13
+ * The possible operations to use when sorting a table column.
14
+ */
15
+ export declare const TableColumnSortOperation: {
16
+ /**
17
+ * Performs a sort using `===`, `<`, and `>` operators
18
+ */
19
+ readonly basic: "basic";
20
+ /**
21
+ * Performs a locale-aware case-sensitive string sort on the columns.
22
+ * Only use this sort operation if the field is of type `string | undefined | null`.
23
+ */
24
+ readonly localeAwareCaseSensitive: "localeAwareCaseSensitive";
25
+ };
26
+ export declare type TableColumnSortOperation = (typeof TableColumnSortOperation)[keyof typeof TableColumnSortOperation];
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The possible operations to use when sorting a table column.
3
+ */
4
+ export const TableColumnSortOperation = {
5
+ /**
6
+ * Performs a sort using `===`, `<`, and `>` operators
7
+ */
8
+ basic: 'basic',
9
+ /**
10
+ * Performs a locale-aware case-sensitive string sort on the columns.
11
+ * Only use this sort operation if the field is of type `string | undefined | null`.
12
+ */
13
+ localeAwareCaseSensitive: 'localeAwareCaseSensitive'
14
+ };
15
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/table-column/base/types.ts"],"names":[],"mappings":"AAiBA;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACpC;;OAEG;IACH,KAAK,EAAE,OAAO;IACd;;;OAGG;IACH,wBAAwB,EAAE,0BAA0B;CAC9C,CAAC"}
@@ -4,6 +4,11 @@ export declare type TableColumnTextCellRecord = TableStringField<'value'>;
4
4
  export interface TableColumnTextColumnConfig {
5
5
  placeholder: string;
6
6
  }
7
+ declare global {
8
+ interface HTMLElementTagNameMap {
9
+ 'nimble-table-column-text': TableColumnText;
10
+ }
11
+ }
7
12
  /**
8
13
  * The table column for displaying strings.
9
14
  */
@@ -12,7 +17,8 @@ export declare class TableColumnText extends TableColumn<TableColumnTextCellReco
12
17
  fieldName?: string;
13
18
  placeholder?: string;
14
19
  readonly cellStyles: import("@microsoft/fast-element").ElementStyles;
15
- readonly cellTemplate: import("@microsoft/fast-element").ViewTemplate<import("../../table/types").TableCellState<TableColumnTextCellRecord, TableColumnTextColumnConfig>, any>;
20
+ readonly cellTemplate: import("@microsoft/fast-element").ViewTemplate<import("../base/types").TableCellState<TableColumnTextCellRecord, TableColumnTextColumnConfig>, any>;
21
+ constructor();
16
22
  protected fieldNameChanged(): void;
17
23
  protected placeholderChanged(): void;
18
24
  }
@@ -1,6 +1,7 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { attr } from '@microsoft/fast-element';
3
3
  import { DesignSystem } from '@microsoft/fast-foundation';
4
+ import { TableColumnSortOperation } from '../base/types';
4
5
  import { TableColumn } from '../base';
5
6
  import { styles } from '../base/styles';
6
7
  import { template } from '../base/template';
@@ -11,13 +12,15 @@ import { cellTemplate } from './template';
11
12
  */
12
13
  export class TableColumnText extends TableColumn {
13
14
  constructor() {
14
- super(...arguments);
15
+ super();
15
16
  this.cellRecordFieldNames = ['value'];
16
17
  this.cellStyles = cellStyles;
17
18
  this.cellTemplate = cellTemplate;
19
+ this.sortOperation = TableColumnSortOperation.localeAwareCaseSensitive;
18
20
  }
19
21
  fieldNameChanged() {
20
22
  this.dataRecordFieldNames = [this.fieldName];
23
+ this.operandDataRecordFieldName = this.fieldName;
21
24
  }
22
25
  placeholderChanged() {
23
26
  this.columnConfig = { placeholder: this.placeholder ?? '' };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table-column/text/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO1C;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,WAGpC;IAHD;;QAIW,yBAAoB,GAAG,CAAC,OAAO,CAAU,CAAC;QAQjC,eAAU,GAAG,UAAU,CAAC;QAExB,iBAAY,GAAG,YAAY,CAAC;IAShD,CAAC;IAPa,gBAAgB;QACtB,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAU,CAAC;IAC1D,CAAC;IAES,kBAAkB;QACxB,IAAI,CAAC,YAAY,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;IAChE,CAAC;CACJ;AAhBG;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;kDACR;AAG1B;IADC,IAAI;oDACuB;AAehC,MAAM,qBAAqB,GAAG,eAAe,CAAC,OAAO,CAAC;IAClD,QAAQ,EAAE,mBAAmB;IAC7B,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE;KACrB,UAAU,CAAC,QAAQ,CAAC;KACpB,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table-column/text/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa1C;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,WAGpC;IAaG;QACI,KAAK,EAAE,CAAC;QAbL,yBAAoB,GAAG,CAAC,OAAO,CAAU,CAAC;QAQjC,eAAU,GAAG,UAAU,CAAC;QAExB,iBAAY,GAAG,YAAY,CAAC;QAIxC,IAAI,CAAC,aAAa,GAAG,wBAAwB,CAAC,wBAAwB,CAAC;IAC3E,CAAC;IAES,gBAAgB;QACtB,IAAI,CAAC,oBAAoB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAU,CAAC;QACtD,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC,SAAS,CAAC;IACrD,CAAC;IAES,kBAAkB;QACxB,IAAI,CAAC,YAAY,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;IAChE,CAAC;CACJ;AAtBG;IADC,IAAI,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;kDACR;AAG1B;IADC,IAAI;oDACuB;AAqBhC,MAAM,qBAAqB,GAAG,eAAe,CAAC,OAAO,CAAC;IAClD,QAAQ,EAAE,mBAAmB;IAC7B,QAAQ;IACR,MAAM;CACT,CAAC,CAAC;AAEH,YAAY,CAAC,WAAW,EAAE;KACrB,UAAU,CAAC,QAAQ,CAAC;KACpB,QAAQ,CAAC,qBAAqB,EAAE,CAAC,CAAC"}
@@ -1,3 +1,3 @@
1
1
  import type { TableColumnTextCellRecord, TableColumnTextColumnConfig } from '.';
2
- import type { TableCellState } from '../../table/types';
2
+ import type { TableCellState } from '../base/types';
3
3
  export declare const cellTemplate: import("@microsoft/fast-element").ViewTemplate<TableCellState<TableColumnTextCellRecord, TableColumnTextColumnConfig>, any>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ni/nimble-components",
3
- "version": "18.5.7",
3
+ "version": "18.5.8",
4
4
  "description": "Styled web components for the NI Nimble Design System",
5
5
  "scripts": {
6
6
  "build": "npm run generate-icons && npm run build-components && npm run bundle-components && npm run generate-scss && npm run build-storybook",
@@ -1 +0,0 @@
1
- export {};
@@ -1,276 +0,0 @@
1
- import { TableValidator } from './table-validator';
2
- import { getSpecTypeByNamedList } from '../../utilities/tests/parameterized';
3
- describe('TableValidator', () => {
4
- let validator;
5
- beforeEach(() => {
6
- validator = new TableValidator();
7
- });
8
- function getInvalidKeys(tableValidator) {
9
- return Object.entries(tableValidator)
10
- .filter(([_, value]) => value)
11
- .map(([key, _]) => key);
12
- }
13
- describe('record ID validation', () => {
14
- it('setting valid field for ID is valid', () => {
15
- const data = [
16
- { stringField: 'value-1', numberField: 10 },
17
- { stringField: 'value-2', numberField: 11 }
18
- ];
19
- const isValid = validator.validateRecordIds(data, 'stringField');
20
- expect(isValid).toBeTrue();
21
- expect(validator.isValid()).toBeTrue();
22
- expect(getInvalidKeys(validator)).toEqual([]);
23
- });
24
- it('setting `undefined` field for ID is valid', () => {
25
- const data = [
26
- { stringField: 'value-1', numberField: 10 },
27
- { stringField: 'value-2', numberField: 11 }
28
- ];
29
- const isValid = validator.validateRecordIds(data, undefined);
30
- expect(isValid).toBeTrue();
31
- expect(validator.isValid()).toBeTrue();
32
- expect(getInvalidKeys(validator)).toEqual([]);
33
- });
34
- it('setting data with duplicate IDs is invalid', () => {
35
- const data = [
36
- { stringField: 'value-1', numberField: 10 },
37
- { stringField: 'value-1', numberField: 11 }
38
- ];
39
- const isValid = validator.validateRecordIds(data, 'stringField');
40
- expect(isValid).toBeFalse();
41
- expect(validator.isValid()).toBeFalse();
42
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents(['duplicateRecordId']));
43
- });
44
- it('setting data with invalid ID value type is invalid', () => {
45
- const data = [
46
- { stringField: 'value-1', numberField: 10 },
47
- { stringField: 'value-2', numberField: 11 }
48
- ];
49
- const isValid = validator.validateRecordIds(data, 'numberField');
50
- expect(isValid).toBeFalse();
51
- expect(validator.isValid()).toBeFalse();
52
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents(['invalidRecordId']));
53
- });
54
- it('setting data with empty ID value is valid', () => {
55
- const data = [
56
- { stringField: 'value-1', numberField: 10 },
57
- { stringField: '', numberField: 11 }
58
- ];
59
- const isValid = validator.validateRecordIds(data, 'stringField');
60
- expect(isValid).toBeTrue();
61
- expect(validator.isValid()).toBeTrue();
62
- expect(getInvalidKeys(validator)).toEqual([]);
63
- });
64
- it('setting data with undefined ID value is invalid', () => {
65
- const data = [
66
- { stringField: 'value-1', numberField: 10 },
67
- { stringField: undefined, numberField: 11 }
68
- ];
69
- const isValid = validator.validateRecordIds(data, 'stringField');
70
- expect(isValid).toBeFalse();
71
- expect(validator.isValid()).toBeFalse();
72
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents(['invalidRecordId']));
73
- });
74
- it('setting data with null ID value is invalid', () => {
75
- const data = [
76
- { stringField: 'value-1', numberField: 10 },
77
- { stringField: undefined, numberField: 11 }
78
- ];
79
- const isValid = validator.validateRecordIds(data, 'stringField');
80
- expect(isValid).toBeFalse();
81
- expect(validator.isValid()).toBeFalse();
82
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents(['invalidRecordId']));
83
- });
84
- it('setting data with missing IDs is invalid', () => {
85
- const data = [
86
- { stringField: 'value-1', numberField: 10 },
87
- { stringField: 'value-2', numberField: 11 }
88
- ];
89
- const isValid = validator.validateRecordIds(data, 'missingField');
90
- expect(isValid).toBeFalse();
91
- expect(validator.isValid()).toBeFalse();
92
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents(['missingRecordId']));
93
- });
94
- it('multiple errors are reported during validation', () => {
95
- const data = [
96
- { stringField: 'value-1', numberField: 10 },
97
- { stringField: 'value-2', numberField: 11 },
98
- { stringField: 'value-1', numberField: 12 },
99
- { numberField: 12 },
100
- { stringField: true, numberField: 12 }
101
- ];
102
- const isValid = validator.validateRecordIds(data, 'stringField');
103
- expect(isValid).toBeFalse();
104
- expect(validator.isValid()).toBeFalse();
105
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents([
106
- 'missingRecordId',
107
- 'duplicateRecordId',
108
- 'invalidRecordId'
109
- ]));
110
- });
111
- it('setting ID field name to undefined makes configuration valid', () => {
112
- const data = [
113
- { stringField: 'value-1', numberField: 10 },
114
- { stringField: 'value-2', numberField: 11 }
115
- ];
116
- let isValid = validator.validateRecordIds(data, 'missingField');
117
- expect(isValid).toBeFalse();
118
- expect(validator.isValid()).toBeFalse();
119
- isValid = validator.validateRecordIds(data, undefined);
120
- expect(isValid).toBeTrue();
121
- expect(validator.isValid()).toBeTrue();
122
- });
123
- it('setting a valid ID field name makes an invalid configuration valid', () => {
124
- const data = [
125
- { stringField: 'value-1', numberField: 10 },
126
- { stringField: 'value-2', numberField: 11 }
127
- ];
128
- let isValid = validator.validateRecordIds(data, 'missingField');
129
- expect(isValid).toBeFalse();
130
- expect(validator.isValid()).toBeFalse();
131
- isValid = validator.validateRecordIds(data, 'stringField');
132
- expect(isValid).toBeTrue();
133
- expect(validator.isValid()).toBeTrue();
134
- });
135
- it('setting invalid ID field name makes a valid configuration invalid', () => {
136
- const data = [
137
- { stringField: 'value-1', numberField: 10 },
138
- { stringField: 'value-2', numberField: 11 }
139
- ];
140
- let isValid = validator.validateRecordIds(data, 'stringField');
141
- expect(isValid).toBeTrue();
142
- expect(validator.isValid()).toBeTrue();
143
- isValid = validator.validateRecordIds(data, 'missingField');
144
- expect(isValid).toBeFalse();
145
- expect(validator.isValid()).toBeFalse();
146
- });
147
- it('ID field name can be an empty string', () => {
148
- const data = [
149
- // eslint-disable-next-line @typescript-eslint/naming-convention
150
- { stringField: 'value-1', numberField: 10, '': 'empty-1' },
151
- // eslint-disable-next-line @typescript-eslint/naming-convention
152
- { stringField: 'value-2', numberField: 11, '': 'empty-2' }
153
- ];
154
- const isValid = validator.validateRecordIds(data, '');
155
- expect(isValid).toBeTrue();
156
- expect(validator.isValid()).toBeTrue();
157
- expect(getInvalidKeys(validator)).toEqual([]);
158
- });
159
- it('validation occurs when ID field name is an empty string', () => {
160
- const data = [
161
- // eslint-disable-next-line @typescript-eslint/naming-convention
162
- { stringField: 'value-1', numberField: 10, '': 'empty-1' },
163
- // eslint-disable-next-line @typescript-eslint/naming-convention
164
- { stringField: 'value-2', numberField: 11, '': 'empty-1' }
165
- ];
166
- const isValid = validator.validateRecordIds(data, '');
167
- expect(isValid).toBeFalse();
168
- expect(validator.isValid()).toBeFalse();
169
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents(['duplicateRecordId']));
170
- });
171
- });
172
- describe('column ID validation', () => {
173
- const columnConfigurations = [
174
- {
175
- columnIds: [undefined, ''],
176
- isValid: true,
177
- invalidKeys: [],
178
- name: 'does not require column IDs'
179
- },
180
- {
181
- columnIds: ['my-id', undefined, undefined],
182
- isValid: false,
183
- invalidKeys: ['missingColumnId'],
184
- name: 'requires column IDs for all columns if a column ID is defined for at least one'
185
- },
186
- {
187
- columnIds: ['my-id-1', 'my-id-2', 'my-id-3'],
188
- isValid: true,
189
- invalidKeys: [],
190
- name: 'unique defined IDs are valid'
191
- },
192
- {
193
- columnIds: ['my-id-1', 'my-id-2', 'my-id-2'],
194
- isValid: false,
195
- invalidKeys: ['duplicateColumnId'],
196
- name: 'duplicate column IDs is invalid'
197
- },
198
- {
199
- columnIds: ['my-id-1', 'my-id-2', 'my-id-2', undefined],
200
- isValid: false,
201
- invalidKeys: ['missingColumnId', 'duplicateColumnId'],
202
- name: 'reports multiple column ID validation errors'
203
- },
204
- {
205
- columnIds: ['my-id-1', ''],
206
- isValid: false,
207
- invalidKeys: ['missingColumnId'],
208
- name: 'does not allow empty string as a defined column ID'
209
- }
210
- ];
211
- const focused = [];
212
- const disabled = [];
213
- for (const columnConfiguration of columnConfigurations) {
214
- const specType = getSpecTypeByNamedList(columnConfiguration, focused, disabled);
215
- specType(columnConfiguration.name, () => {
216
- const tableValidator = new TableValidator();
217
- const isValid = tableValidator.validateColumnIds(columnConfiguration.columnIds);
218
- expect(isValid).toBe(columnConfiguration.isValid);
219
- expect(tableValidator.isValid()).toBe(columnConfiguration.invalidKeys.length === 0);
220
- expect(getInvalidKeys(tableValidator)).toEqual(jasmine.arrayWithExactContents(columnConfiguration.invalidKeys));
221
- });
222
- }
223
- });
224
- describe('validation checks do not reset unrelated state', () => {
225
- it('invalid record IDs stay invalid when validating column IDs', () => {
226
- const data = [
227
- { stringField: 'value-1', numberField: 10 },
228
- { stringField: 'value-2', numberField: 11 },
229
- { stringField: 'value-1', numberField: 12 },
230
- { numberField: 12 },
231
- { stringField: true, numberField: 12 }
232
- ];
233
- const recordIdsAreValid = validator.validateRecordIds(data, 'stringField');
234
- expect(recordIdsAreValid).toBeFalse();
235
- expect(validator.isValid()).toBeFalse();
236
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents([
237
- 'missingRecordId',
238
- 'duplicateRecordId',
239
- 'invalidRecordId'
240
- ]));
241
- const columnIdsAreValid = validator.validateColumnIds([
242
- 'id-1',
243
- 'id-2',
244
- 'id-3'
245
- ]);
246
- expect(columnIdsAreValid).toBeTrue();
247
- expect(validator.isValid()).toBeFalse();
248
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents([
249
- 'missingRecordId',
250
- 'duplicateRecordId',
251
- 'invalidRecordId'
252
- ]));
253
- });
254
- it('invalid column IDs stay invalid when validating record IDs', () => {
255
- const columnIdsAreValid = validator.validateColumnIds([
256
- 'id-1',
257
- 'id-1',
258
- undefined
259
- ]);
260
- expect(columnIdsAreValid).toBeFalse();
261
- expect(validator.isValid()).toBeFalse();
262
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents([
263
- 'missingColumnId',
264
- 'duplicateColumnId'
265
- ]));
266
- const recordIdsAreValid = validator.validateRecordIds([], undefined);
267
- expect(recordIdsAreValid).toBeTrue();
268
- expect(validator.isValid()).toBeFalse();
269
- expect(getInvalidKeys(validator)).toEqual(jasmine.arrayWithExactContents([
270
- 'missingColumnId',
271
- 'duplicateColumnId'
272
- ]));
273
- });
274
- });
275
- });
276
- //# sourceMappingURL=table-validator.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"table-validator.spec.js","sourceRoot":"","sources":["../../../../src/table/models/table-validator.spec.ts"],"names":[],"mappings":"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"}