ngx-material-entity 15.1.3 → 15.1.4

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 (90) hide show
  1. package/README.md +100 -0
  2. package/components/confirm-dialog/confirm-dialog.component.d.ts +1 -1
  3. package/components/edit-page/edit-page.component.d.ts +112 -0
  4. package/components/edit-page/page-edit-data.builder.d.ts +17 -0
  5. package/components/input/array/array-date-input/array-date-input.component.d.ts +1 -1
  6. package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +1 -1
  7. package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +1 -1
  8. package/components/input/array/array-table.class.d.ts +1 -1
  9. package/components/input/date/date-input/date-input.component.d.ts +1 -1
  10. package/components/input/date/date-time-input/date-time-input.component.d.ts +1 -1
  11. package/components/input/file/file-default-input/file-default-input.component.d.ts +1 -1
  12. package/components/input/file/file-image-input/file-image-input.component.d.ts +1 -1
  13. package/components/input/file/file-input/file-input.component.d.ts +3 -3
  14. package/components/input/input.component.d.ts +3 -3
  15. package/components/input/relations/references-many-input/references-many-input.component.d.ts +1 -1
  16. package/components/input/string/string-password-input/string-password-input.component.d.ts +1 -1
  17. package/components/table/create-dialog/create-entity-dialog-data.builder.d.ts +3 -3
  18. package/components/table/create-dialog/create-entity-dialog-data.d.ts +1 -1
  19. package/components/table/create-dialog/create-entity-dialog.component.d.ts +4 -4
  20. package/components/table/edit-dialog/{edit-dialog-data.builder.d.ts → edit-data.builder.d.ts} +7 -7
  21. package/components/table/edit-dialog/{edit-entity-dialog-data.d.ts → edit-entity-data.d.ts} +5 -5
  22. package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +6 -6
  23. package/components/table/edit-dialog/edit-entity.builder.d.ts +24 -0
  24. package/components/table/table-data.builder.d.ts +9 -7
  25. package/components/table/table-data.d.ts +18 -8
  26. package/components/table/table.component.d.ts +11 -7
  27. package/components/table/table.module.d.ts +4 -3
  28. package/esm2020/classes/entity.model.mjs +2 -2
  29. package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +4 -4
  30. package/esm2020/components/edit-page/edit-page.component.mjs +203 -0
  31. package/esm2020/components/edit-page/page-edit-data.builder.mjs +32 -0
  32. package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +4 -4
  33. package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +4 -4
  34. package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +4 -4
  35. package/esm2020/components/input/array/array-table.class.mjs +3 -3
  36. package/esm2020/components/input/base-input.component.mjs +2 -2
  37. package/esm2020/components/input/date/date-input/date-input.component.mjs +2 -2
  38. package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +5 -5
  39. package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +3 -3
  40. package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +2 -2
  41. package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +3 -3
  42. package/esm2020/components/input/file/file-input/file-input.component.mjs +5 -5
  43. package/esm2020/components/input/input.component.mjs +6 -6
  44. package/esm2020/components/input/relations/references-many-input/references-many-input.component.mjs +4 -4
  45. package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +4 -4
  46. package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +2 -2
  47. package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +1 -1
  48. package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +5 -5
  49. package/esm2020/components/table/edit-dialog/edit-data.builder.mjs +41 -0
  50. package/esm2020/components/table/edit-dialog/edit-entity-data.mjs +2 -0
  51. package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +16 -16
  52. package/esm2020/components/table/edit-dialog/edit-entity.builder.mjs +28 -0
  53. package/esm2020/components/table/table-data.builder.mjs +11 -8
  54. package/esm2020/components/table/table-data.mjs +1 -1
  55. package/esm2020/components/table/table.component.mjs +42 -29
  56. package/esm2020/components/table/table.module.mjs +5 -1
  57. package/esm2020/decorators/array/array-decorator-internal.data.mjs +2 -2
  58. package/esm2020/decorators/base/base-property.decorator.mjs +2 -2
  59. package/esm2020/decorators/date/date-decorator-internal.data.mjs +2 -2
  60. package/esm2020/decorators/date/date.decorator.mjs +2 -2
  61. package/esm2020/decorators/file/file.decorator.mjs +2 -2
  62. package/esm2020/decorators/string/string.decorator.mjs +2 -2
  63. package/esm2020/public-api.mjs +30 -26
  64. package/esm2020/services/entity.service.mjs +236 -0
  65. package/esm2020/services/unsaved-changes.guard.mjs +14 -0
  66. package/esm2020/utilities/date.utilities.mjs +158 -0
  67. package/esm2020/utilities/entity.utilities.mjs +828 -0
  68. package/esm2020/utilities/file.utilities.mjs +163 -0
  69. package/esm2020/utilities/selection.utilities.mjs +50 -0
  70. package/fesm2015/ngx-material-entity.mjs +882 -613
  71. package/fesm2015/ngx-material-entity.mjs.map +1 -1
  72. package/fesm2020/ngx-material-entity.mjs +896 -633
  73. package/fesm2020/ngx-material-entity.mjs.map +1 -1
  74. package/package.json +1 -1
  75. package/public-api.d.ts +27 -25
  76. package/{classes → services}/entity.service.d.ts +18 -1
  77. package/services/unsaved-changes.guard.d.ts +4 -0
  78. package/{classes → utilities}/entity.utilities.d.ts +1 -1
  79. package/components/table/edit-dialog/edit-entity-dialog.builder.d.ts +0 -24
  80. package/esm2020/classes/date.utilities.mjs +0 -158
  81. package/esm2020/classes/entity.service.mjs +0 -213
  82. package/esm2020/classes/entity.utilities.mjs +0 -828
  83. package/esm2020/classes/file.utilities.mjs +0 -163
  84. package/esm2020/classes/selection.utilities.mjs +0 -50
  85. package/esm2020/components/table/edit-dialog/edit-dialog-data.builder.mjs +0 -41
  86. package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +0 -2
  87. package/esm2020/components/table/edit-dialog/edit-entity-dialog.builder.mjs +0 -28
  88. /package/{classes → utilities}/date.utilities.d.ts +0 -0
  89. /package/{classes → utilities}/file.utilities.d.ts +0 -0
  90. /package/{classes → utilities}/selection.utilities.d.ts +0 -0
@@ -0,0 +1,163 @@
1
+ import { LodashUtilities } from '../encapsulation/lodash.utilities';
2
+ import { JSZipUtilities } from '../encapsulation/jszip.utilities';
3
+ /**
4
+ * Provides functionality regarding files.
5
+ */
6
+ export class FileUtilities {
7
+ /**
8
+ * Gets the accept value for the html input.
9
+ *
10
+ * @param mimeTypes - The mimeTypes to get the accept string from.
11
+ * @returns A comma separated string of all the provided mime types.
12
+ */
13
+ static getAcceptString(mimeTypes) {
14
+ if (!mimeTypes?.length) {
15
+ return '*';
16
+ }
17
+ return mimeTypes.join(', ');
18
+ }
19
+ // TODO: Find a way to use blobs with jest
20
+ /* istanbul ignore next */
21
+ /**
22
+ * Reads a url to display the given file.
23
+ *
24
+ * @param file - The file to get the url from.
25
+ * @returns A promise of the url. Undefined if no file was provided.
26
+ */
27
+ static async getDataURLFromFile(file) {
28
+ if (!file) {
29
+ return undefined;
30
+ }
31
+ return new Promise((resolve, reject) => {
32
+ const reader = new FileReader();
33
+ reader.onload = e => resolve(e.target?.result);
34
+ reader.onerror = e => reject(e);
35
+ reader.readAsDataURL(file);
36
+ });
37
+ }
38
+ // TODO: Find a way to use blobs with jest
39
+ /* istanbul ignore next */
40
+ /**
41
+ * Gets a file from the given url.
42
+ *
43
+ * @param url - The url to get the file from.
44
+ * @returns A promise of the File.
45
+ */
46
+ static async getFileFromUrl(url) {
47
+ const res = await fetch(url);
48
+ if (!res.ok) {
49
+ // TODO make error more robust
50
+ throw new Error(`Error fetching the file from the url ${url}`);
51
+ }
52
+ return await res.blob();
53
+ }
54
+ // TODO: Find a way to use blobs with jest
55
+ /* istanbul ignore next */
56
+ /**
57
+ * Gets the file data with the blob from the given File Data.
58
+ *
59
+ * @param data - The File Data to get the file data with blob from.
60
+ * @returns FileDataWithFile.
61
+ */
62
+ static async getFileData(data) {
63
+ if (data.file) {
64
+ return {
65
+ file: data.file,
66
+ name: data.name,
67
+ url: data.url,
68
+ type: data.type,
69
+ size: data.size
70
+ };
71
+ }
72
+ else {
73
+ return {
74
+ file: await FileUtilities.getFileFromUrl(data.url),
75
+ name: data.name,
76
+ url: data.url,
77
+ type: data.type,
78
+ size: data.size
79
+ };
80
+ }
81
+ }
82
+ // TODO: Find a way to use blobs with jest
83
+ /* istanbul ignore next */
84
+ /**
85
+ * Downloads a single file from the given File Data.
86
+ *
87
+ * @param fileData - The file data. Needs to contain a blob.
88
+ */
89
+ static downloadSingleFile(fileData) {
90
+ const a = document.createElement('a');
91
+ const objectUrl = URL.createObjectURL(fileData.file);
92
+ a.href = objectUrl;
93
+ a.download = fileData.name;
94
+ a.click();
95
+ URL.revokeObjectURL(objectUrl);
96
+ }
97
+ // TODO: Find a way to use blobs with jest
98
+ /* istanbul ignore next */
99
+ /**
100
+ * Downloads multiple files as a zip with the given name.
101
+ *
102
+ * @param name - The name of the zip file to generate.
103
+ * @param multiFileData - The file data array to put in the zip.
104
+ */
105
+ static async downloadMultipleFiles(name, multiFileData) {
106
+ const zip = JSZipUtilities.new();
107
+ for (let i = 0; i < multiFileData.length; i++) {
108
+ multiFileData[i] = await FileUtilities.getFileData(multiFileData[i]);
109
+ zip.file(multiFileData[i].name, multiFileData[i].file);
110
+ }
111
+ const zipBlob = await zip.generateAsync({ type: 'blob' });
112
+ const fileData = {
113
+ name: name,
114
+ file: zipBlob,
115
+ type: 'application/zip',
116
+ size: zipBlob.size
117
+ };
118
+ FileUtilities.downloadSingleFile(fileData);
119
+ }
120
+ /**
121
+ * Checks if the given file has a valid mime type.
122
+ *
123
+ * @param type - The type of the file to check.
124
+ * @param allowedMimeTypes - The allowed mime types.
125
+ * @returns Whether or not the given file has a valid mime type.
126
+ */
127
+ static isMimeTypeValid(type, allowedMimeTypes) {
128
+ if (allowedMimeTypes.includes('*')) {
129
+ return true;
130
+ }
131
+ for (const t of allowedMimeTypes) {
132
+ if (t === type) {
133
+ return true;
134
+ }
135
+ if (t.endsWith('*') && type.startsWith(t.split('*')[0])) {
136
+ return true;
137
+ }
138
+ }
139
+ return false;
140
+ }
141
+ /**
142
+ * Transform the given value to Megabytes.
143
+ *
144
+ * @param value - The original value.
145
+ * @param unit - If the value is B, KB or GB.
146
+ * @returns The given value as bytes.
147
+ */
148
+ static transformToMegaBytes(value, unit) {
149
+ const bytes = this.transformToBytes(LodashUtilities.cloneDeep(value), unit);
150
+ return bytes / 1000000;
151
+ }
152
+ static transformToBytes(value, unit) {
153
+ switch (unit) {
154
+ case 'B':
155
+ return value;
156
+ case 'KB':
157
+ return value * 1000;
158
+ case 'GB':
159
+ return value * 1000000000;
160
+ }
161
+ }
162
+ }
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS51dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy91dGlsaXRpZXMvZmlsZS51dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUdsRTs7R0FFRztBQUNILE1BQU0sT0FBZ0IsYUFBYTtJQUMvQjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBb0I7UUFDdkMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUU7WUFDcEIsT0FBTyxHQUFHLENBQUM7U0FDZDtRQUNELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsMENBQTBDO0lBQzFDLDBCQUEwQjtJQUMxQjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBVztRQUN2QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFDRCxPQUFPLElBQUksT0FBTyxDQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNDLE1BQU0sTUFBTSxHQUFlLElBQUksVUFBVSxFQUFFLENBQUM7WUFDNUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQWdCLENBQUMsQ0FBQztZQUN6RCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENB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b2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRmlsZURhdGFXaXRoRmlsZSB9IGZyb20gJy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEZpbGVEYXRhIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLmRhdGEnO1xuaW1wb3J0IHsgSlNaaXBVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL2pzemlwLnV0aWxpdGllcyc7XG5pbXBvcnQgSlNaaXAgZnJvbSAnanN6aXAnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgcmVnYXJkaW5nIGZpbGVzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRmlsZVV0aWxpdGllcyB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYWNjZXB0IHZhbHVlIGZvciB0aGUgaHRtbCBpbnB1dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtaW1lVHlwZXMgLSBUaGUgbWltZVR5cGVzIHRvIGdldCB0aGUgYWNjZXB0IHN0cmluZyBmcm9tLlxuICAgICAqIEByZXR1cm5zIEEgY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZiBhbGwgdGhlIHByb3ZpZGVkIG1pbWUgdHlwZXMuXG4gICAgICovXG4gICAgc3RhdGljIGdldEFjY2VwdFN0cmluZyhtaW1lVHlwZXM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghbWltZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAnKic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbWVUeXBlcy5qb2luKCcsICcpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEZpbmQgYSB3YXkgdG8gdXNlIGJsb2JzIHdpdGggamVzdFxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgLyoqXG4gICAgICogUmVhZHMgYSB1cmwgdG8gZGlzcGxheSB0aGUgZ2l2ZW4gZmlsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgdG8gZ2V0IHRoZSB1cmwgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb2YgdGhlIHVybC4gVW5kZWZpbmVkIGlmIG5vIGZpbGUgd2FzIHByb3ZpZGVkLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBnZXREYXRhVVJMRnJvbUZpbGUoZmlsZT86IEJsb2IpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVhZGVyOiBGaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHJlc29sdmUoZS50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSBlID0+IHJlamVjdChlKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHVzZSBibG9icyB3aXRoIGplc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIC8qKlxuICAgICAqIEdldHMgYSBmaWxlIGZyb20gdGhlIGdpdmVuIHVybC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1cmwgLSBUaGUgdXJsIHRvIGdldCB0aGUgZmlsZSBmcm9tLlxuICAgICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvZiB0aGUgRmlsZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBnZXRGaWxlRnJvbVVybCh1cmw6IHN0cmluZyk6IFByb21pc2U8QmxvYj4ge1xuICAgICAgICBjb25zdCByZXM6IFJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICAgIC8vIFRPRE8gbWFrZSBlcnJvciBtb3JlIHJvYnVzdFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmZXRjaGluZyB0aGUgZmlsZSBmcm9tIHRoZSB1cmwgJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcy5ibG9iKCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byB1c2UgYmxvYnMgd2l0aCBqZXN0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaWxlIGRhdGEgd2l0aCB0aGUgYmxvYiBmcm9tIHRoZSBnaXZlbiBGaWxlIERhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBGaWxlIERhdGEgdG8gZ2V0IHRoZSBmaWxlIGRhdGEgd2l0aCBibG9iIGZyb20uXG4gICAgICogQHJldHVybnMgRmlsZURhdGFXaXRoRmlsZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZ2V0RmlsZURhdGEoZGF0YTogRmlsZURhdGEpOiBQcm9taXNlPEZpbGVEYXRhV2l0aEZpbGU+IHtcbiAgICAgICAgaWYgKGRhdGEuZmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBmaWxlOiBkYXRhLmZpbGUsXG4gICAgICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogZGF0YS51cmwsXG4gICAgICAgICAgICAgICAgdHlwZTogZGF0YS50eXBlLFxuICAgICAgICAgICAgICAgIHNpemU6IGRhdGEuc2l6ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZmlsZTogYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRnJvbVVybChkYXRhLnVybCBhcyBzdHJpbmcpLFxuICAgICAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSxcbiAgICAgICAgICAgICAgICB1cmw6IGRhdGEudXJsLFxuICAgICAgICAgICAgICAgIHR5cGU6IGRhdGEudHlwZSxcbiAgICAgICAgICAgICAgICBzaXplOiBkYXRhLnNpemVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHVzZSBibG9icyB3aXRoIGplc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIC8qKlxuICAgICAqIERvd25sb2FkcyBhIHNpbmdsZSBmaWxlIGZyb20gdGhlIGdpdmVuIEZpbGUgRGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWxlRGF0YSAtIFRoZSBmaWxlIGRhdGEuIE5lZWRzIHRvIGNvbnRhaW4gYSBibG9iLlxuICAgICAqL1xuICAgIHN0YXRpYyBkb3dubG9hZFNpbmdsZUZpbGUoZmlsZURhdGE6IEZpbGVEYXRhV2l0aEZpbGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYTogSFRNTEFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGNvbnN0IG9iamVjdFVybDogc3RyaW5nID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlRGF0YS5maWxlKTtcbiAgICAgICAgYS5ocmVmID0gb2JqZWN0VXJsO1xuICAgICAgICBhLmRvd25sb2FkID0gZmlsZURhdGEubmFtZTtcbiAgICAgICAgYS5jbGljaygpO1xuICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKG9iamVjdFVybCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byB1c2UgYmxvYnMgd2l0aCBqZXN0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvKipcbiAgICAgKiBEb3dubG9hZHMgbXVsdGlwbGUgZmlsZXMgYXMgYSB6aXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHppcCBmaWxlIHRvIGdlbmVyYXRlLlxuICAgICAqIEBwYXJhbSBtdWx0aUZpbGVEYXRhIC0gVGhlIGZpbGUgZGF0YSBhcnJheSB0byBwdXQgaW4gdGhlIHppcC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZG93bmxvYWRNdWx0aXBsZUZpbGVzKG5hbWU6IHN0cmluZywgbXVsdGlGaWxlRGF0YTogRmlsZURhdGFbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB6aXA6IEpTWmlwID0gSlNaaXBVdGlsaXRpZXMubmV3KCk7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBtdWx0aUZpbGVEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBtdWx0aUZpbGVEYXRhW2ldID0gYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRGF0YShtdWx0aUZpbGVEYXRhW2ldKTtcbiAgICAgICAgICAgIHppcC5maWxlKG11bHRpRmlsZURhdGFbaV0ubmFtZSwgKG11bHRpRmlsZURhdGFbaV0gYXMgRmlsZURhdGFXaXRoRmlsZSkuZmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgemlwQmxvYjogQmxvYiA9IGF3YWl0IHppcC5nZW5lcmF0ZUFzeW5jKHsgdHlwZTogJ2Jsb2InIH0pO1xuICAgICAgICBjb25zdCBmaWxlRGF0YTogRmlsZURhdGFXaXRoRmlsZSA9IHtcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBmaWxlOiB6aXBCbG9iLFxuICAgICAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcsXG4gICAgICAgICAgICBzaXplOiB6aXBCbG9iLnNpemVcbiAgICAgICAgfTtcbiAgICAgICAgRmlsZVV0aWxpdGllcy5kb3dubG9hZFNpbmdsZUZpbGUoZmlsZURhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gZmlsZSBoYXMgYSB2YWxpZCBtaW1lIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBmaWxlIHRvIGNoZWNrLlxuICAgICAqIEBwYXJhbSBhbGxvd2VkTWltZVR5cGVzIC0gVGhlIGFsbG93ZWQgbWltZSB0eXBlcy5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZmlsZSBoYXMgYSB2YWxpZCBtaW1lIHR5cGUuXG4gICAgICovXG4gICAgc3RhdGljIGlzTWltZVR5cGVWYWxpZCh0eXBlOiBzdHJpbmcsIGFsbG93ZWRNaW1lVHlwZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChhbGxvd2VkTWltZVR5cGVzLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiBhbGxvd2VkTWltZVR5cGVzKSB7XG4gICAgICAgICAgICBpZiAodCA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHQuZW5kc1dpdGgoJyonKSAmJiB0eXBlLnN0YXJ0c1dpdGgodC5zcGxpdCgnKicpWzBdKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gdGhlIGdpdmVuIHZhbHVlIHRvIE1lZ2FieXRlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvcmlnaW5hbCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gdW5pdCAtIElmIHRoZSB2YWx1ZSBpcyBCLCBLQiBvciBHQi5cbiAgICAgKiBAcmV0dXJucyBUaGUgZ2l2ZW4gdmFsdWUgYXMgYnl0ZXMuXG4gICAgICovXG4gICAgc3RhdGljIHRyYW5zZm9ybVRvTWVnYUJ5dGVzKHZhbHVlOiBudW1iZXIsIHVuaXQ6ICdCJyB8ICdLQicgfCAnR0InKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgYnl0ZXM6IG51bWJlciA9IHRoaXMudHJhbnNmb3JtVG9CeXRlcyhMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlKSwgdW5pdCk7XG4gICAgICAgIHJldHVybiBieXRlcyAvIDEwMDAwMDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgdHJhbnNmb3JtVG9CeXRlcyh2YWx1ZTogbnVtYmVyLCB1bml0OiAnQicgfCAnS0InIHwgJ0dCJyk6IG51bWJlciB7XG4gICAgICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgICAgICAgY2FzZSAnQic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY2FzZSAnS0InOlxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAqIDEwMDA7XG4gICAgICAgICAgICBjYXNlICdHQic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICogMTAwMDAwMDAwMDtcbiAgICAgICAgfVxuICAgIH1cbn0iXX0=
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Provides functionality around material selections inside of tables.
3
+ */
4
+ export class SelectionUtilities {
5
+ /**
6
+ * Checks if all items in the table have been selected.
7
+ * This is needed to display the "masterToggle"-checkbox correctly.
8
+ *
9
+ * @param selection - The selection to check.
10
+ * @param dataSource - The dataSource of the selection.
11
+ * @returns Whether or not all items in the table have been selected.
12
+ */
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ static isAllSelected(selection, dataSource) {
15
+ const numSelected = selection.selected.length;
16
+ const numRows = dataSource.data.length;
17
+ return numSelected === numRows;
18
+ }
19
+ /**
20
+ * Toggles all items in the table.
21
+ *
22
+ * @param selection - The selection to toggle.
23
+ * @param dataSource - The dataSource of the selection.
24
+ */
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ static masterToggle(selection, dataSource) {
27
+ if (SelectionUtilities.isAllSelected(selection, dataSource)) {
28
+ selection.clear();
29
+ }
30
+ else {
31
+ dataSource.data.forEach(row => selection.select(row));
32
+ }
33
+ }
34
+ /**
35
+ * Removes all selected entries from the array.
36
+ *
37
+ * @param selection - The selection containing the items to remove.
38
+ * @param values - The values of the dataSource.
39
+ * @param dataSource - The dataSource.
40
+ */
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ static remove(selection, values, dataSource) {
43
+ selection.selected.forEach(s => {
44
+ values.splice(values.indexOf(s), 1);
45
+ });
46
+ dataSource.data = values;
47
+ selection.clear();
48
+ }
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL3V0aWxpdGllcy9zZWxlY3Rpb24udXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixrQkFBa0I7SUFFcEM7Ozs7Ozs7T0FPRztJQUNILDhEQUE4RDtJQUM5RCxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQThCLEVBQUUsVUFBbUM7UUFDcEYsTUFBTSxXQUFXLEdBQVcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDdEQsTUFBTSxPQUFPLEdBQVcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDL0MsT0FBTyxXQUFXLEtBQUssT0FBTyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILDhEQUE4RDtJQUM5RCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQThCLEVBQUUsVUFBbUM7UUFDbkYsSUFBSSxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQ3pELFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNyQjthQUNJO1lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDekQ7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsOERBQThEO0lBQzlELE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBOEIsRUFBRSxNQUFhLEVBQUUsVUFBbUM7UUFDNUYsU0FBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDM0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsVUFBVSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUM7UUFDekIsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcblxuLyoqXG4gKiBQcm92aWRlcyBmdW5jdGlvbmFsaXR5IGFyb3VuZCBtYXRlcmlhbCBzZWxlY3Rpb25zIGluc2lkZSBvZiB0YWJsZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTZWxlY3Rpb25VdGlsaXRpZXMge1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGFsbCBpdGVtcyBpbiB0aGUgdGFibGUgaGF2ZSBiZWVuIHNlbGVjdGVkLlxuICAgICAqIFRoaXMgaXMgbmVlZGVkIHRvIGRpc3BsYXkgdGhlIFwibWFzdGVyVG9nZ2xlXCItY2hlY2tib3ggY29ycmVjdGx5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbiAtIFRoZSBzZWxlY3Rpb24gdG8gY2hlY2suXG4gICAgICogQHBhcmFtIGRhdGFTb3VyY2UgLSBUaGUgZGF0YVNvdXJjZSBvZiB0aGUgc2VsZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IGFsbCBpdGVtcyBpbiB0aGUgdGFibGUgaGF2ZSBiZWVuIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgc3RhdGljIGlzQWxsU2VsZWN0ZWQoc2VsZWN0aW9uOiBTZWxlY3Rpb25Nb2RlbDxhbnk+LCBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBudW1TZWxlY3RlZDogbnVtYmVyID0gc2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcbiAgICAgICAgY29uc3QgbnVtUm93czogbnVtYmVyID0gZGF0YVNvdXJjZS5kYXRhLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgYWxsIGl0ZW1zIGluIHRoZSB0YWJsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb24gLSBUaGUgc2VsZWN0aW9uIHRvIHRvZ2dsZS5cbiAgICAgKiBAcGFyYW0gZGF0YVNvdXJjZSAtIFRoZSBkYXRhU291cmNlIG9mIHRoZSBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgbWFzdGVyVG9nZ2xlKHNlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8YW55PiwgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPGFueT4pOiB2b2lkIHtcbiAgICAgICAgaWYgKFNlbGVjdGlvblV0aWxpdGllcy5pc0FsbFNlbGVjdGVkKHNlbGVjdGlvbiwgZGF0YVNvdXJjZSkpIHtcbiAgICAgICAgICAgIHNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGF0YVNvdXJjZS5kYXRhLmZvckVhY2gocm93ID0+IHNlbGVjdGlvbi5zZWxlY3Qocm93KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGFsbCBzZWxlY3RlZCBlbnRyaWVzIGZyb20gdGhlIGFycmF5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHNlbGVjdGlvbiAtIFRoZSBzZWxlY3Rpb24gY29udGFpbmluZyB0aGUgaXRlbXMgdG8gcmVtb3ZlLlxuICAgICAqIEBwYXJhbSB2YWx1ZXMgLSBUaGUgdmFsdWVzIG9mIHRoZSBkYXRhU291cmNlLlxuICAgICAqIEBwYXJhbSBkYXRhU291cmNlIC0gVGhlIGRhdGFTb3VyY2UuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBzdGF0aWMgcmVtb3ZlKHNlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8YW55PiwgdmFsdWVzOiBhbnlbXSwgZGF0YVNvdXJjZTogTWF0VGFibGVEYXRhU291cmNlPGFueT4pOiB2b2lkIHtcbiAgICAgICAgc2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICB2YWx1ZXMuc3BsaWNlKHZhbHVlcy5pbmRleE9mKHMpLCAxKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGFTb3VyY2UuZGF0YSA9IHZhbHVlcztcbiAgICAgICAgc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgfVxufSJdfQ==