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.
- package/README.md +100 -0
- package/components/confirm-dialog/confirm-dialog.component.d.ts +1 -1
- package/components/edit-page/edit-page.component.d.ts +112 -0
- package/components/edit-page/page-edit-data.builder.d.ts +17 -0
- package/components/input/array/array-date-input/array-date-input.component.d.ts +1 -1
- package/components/input/array/array-date-range-input/array-date-range-input.component.d.ts +1 -1
- package/components/input/array/array-date-time-input/array-date-time-input.component.d.ts +1 -1
- package/components/input/array/array-table.class.d.ts +1 -1
- package/components/input/date/date-input/date-input.component.d.ts +1 -1
- package/components/input/date/date-time-input/date-time-input.component.d.ts +1 -1
- package/components/input/file/file-default-input/file-default-input.component.d.ts +1 -1
- package/components/input/file/file-image-input/file-image-input.component.d.ts +1 -1
- package/components/input/file/file-input/file-input.component.d.ts +3 -3
- package/components/input/input.component.d.ts +3 -3
- package/components/input/relations/references-many-input/references-many-input.component.d.ts +1 -1
- package/components/input/string/string-password-input/string-password-input.component.d.ts +1 -1
- package/components/table/create-dialog/create-entity-dialog-data.builder.d.ts +3 -3
- package/components/table/create-dialog/create-entity-dialog-data.d.ts +1 -1
- package/components/table/create-dialog/create-entity-dialog.component.d.ts +4 -4
- package/components/table/edit-dialog/{edit-dialog-data.builder.d.ts → edit-data.builder.d.ts} +7 -7
- package/components/table/edit-dialog/{edit-entity-dialog-data.d.ts → edit-entity-data.d.ts} +5 -5
- package/components/table/edit-dialog/edit-entity-dialog.component.d.ts +6 -6
- package/components/table/edit-dialog/edit-entity.builder.d.ts +24 -0
- package/components/table/table-data.builder.d.ts +9 -7
- package/components/table/table-data.d.ts +18 -8
- package/components/table/table.component.d.ts +11 -7
- package/components/table/table.module.d.ts +4 -3
- package/esm2020/classes/entity.model.mjs +2 -2
- package/esm2020/components/confirm-dialog/confirm-dialog.component.mjs +4 -4
- package/esm2020/components/edit-page/edit-page.component.mjs +203 -0
- package/esm2020/components/edit-page/page-edit-data.builder.mjs +32 -0
- package/esm2020/components/input/array/array-date-input/array-date-input.component.mjs +4 -4
- package/esm2020/components/input/array/array-date-range-input/array-date-range-input.component.mjs +4 -4
- package/esm2020/components/input/array/array-date-time-input/array-date-time-input.component.mjs +4 -4
- package/esm2020/components/input/array/array-table.class.mjs +3 -3
- package/esm2020/components/input/base-input.component.mjs +2 -2
- package/esm2020/components/input/date/date-input/date-input.component.mjs +2 -2
- package/esm2020/components/input/date/date-range-input/date-range-input.component.mjs +5 -5
- package/esm2020/components/input/date/date-time-input/date-time-input.component.mjs +3 -3
- package/esm2020/components/input/file/file-default-input/file-default-input.component.mjs +2 -2
- package/esm2020/components/input/file/file-image-input/file-image-input.component.mjs +3 -3
- package/esm2020/components/input/file/file-input/file-input.component.mjs +5 -5
- package/esm2020/components/input/input.component.mjs +6 -6
- package/esm2020/components/input/relations/references-many-input/references-many-input.component.mjs +4 -4
- package/esm2020/components/input/string/string-password-input/string-password-input.component.mjs +4 -4
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.builder.mjs +2 -2
- package/esm2020/components/table/create-dialog/create-entity-dialog-data.mjs +1 -1
- package/esm2020/components/table/create-dialog/create-entity-dialog.component.mjs +5 -5
- package/esm2020/components/table/edit-dialog/edit-data.builder.mjs +41 -0
- package/esm2020/components/table/edit-dialog/edit-entity-data.mjs +2 -0
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.component.mjs +16 -16
- package/esm2020/components/table/edit-dialog/edit-entity.builder.mjs +28 -0
- package/esm2020/components/table/table-data.builder.mjs +11 -8
- package/esm2020/components/table/table-data.mjs +1 -1
- package/esm2020/components/table/table.component.mjs +42 -29
- package/esm2020/components/table/table.module.mjs +5 -1
- package/esm2020/decorators/array/array-decorator-internal.data.mjs +2 -2
- package/esm2020/decorators/base/base-property.decorator.mjs +2 -2
- package/esm2020/decorators/date/date-decorator-internal.data.mjs +2 -2
- package/esm2020/decorators/date/date.decorator.mjs +2 -2
- package/esm2020/decorators/file/file.decorator.mjs +2 -2
- package/esm2020/decorators/string/string.decorator.mjs +2 -2
- package/esm2020/public-api.mjs +30 -26
- package/esm2020/services/entity.service.mjs +236 -0
- package/esm2020/services/unsaved-changes.guard.mjs +14 -0
- package/esm2020/utilities/date.utilities.mjs +158 -0
- package/esm2020/utilities/entity.utilities.mjs +828 -0
- package/esm2020/utilities/file.utilities.mjs +163 -0
- package/esm2020/utilities/selection.utilities.mjs +50 -0
- package/fesm2015/ngx-material-entity.mjs +882 -613
- package/fesm2015/ngx-material-entity.mjs.map +1 -1
- package/fesm2020/ngx-material-entity.mjs +896 -633
- package/fesm2020/ngx-material-entity.mjs.map +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +27 -25
- package/{classes → services}/entity.service.d.ts +18 -1
- package/services/unsaved-changes.guard.d.ts +4 -0
- package/{classes → utilities}/entity.utilities.d.ts +1 -1
- package/components/table/edit-dialog/edit-entity-dialog.builder.d.ts +0 -24
- package/esm2020/classes/date.utilities.mjs +0 -158
- package/esm2020/classes/entity.service.mjs +0 -213
- package/esm2020/classes/entity.utilities.mjs +0 -828
- package/esm2020/classes/file.utilities.mjs +0 -163
- package/esm2020/classes/selection.utilities.mjs +0 -50
- package/esm2020/components/table/edit-dialog/edit-dialog-data.builder.mjs +0 -41
- package/esm2020/components/table/edit-dialog/edit-entity-dialog-data.mjs +0 -2
- package/esm2020/components/table/edit-dialog/edit-entity-dialog.builder.mjs +0 -28
- /package/{classes → utilities}/date.utilities.d.ts +0 -0
- /package/{classes → utilities}/file.utilities.d.ts +0 -0
- /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==
|