@aquera/nile-elements 1.0.1-beta-1.5 → 1.0.1-beta-1.6
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 +28 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +679 -618
- package/dist/internal/resizable-table-helper.cjs.js +1 -1
- package/dist/internal/resizable-table-helper.cjs.js.map +1 -1
- package/dist/internal/resizable-table-helper.esm.js +1 -1
- package/dist/nile-code-editor/extensionSetup.cjs.js +5 -5
- package/dist/nile-code-editor/extensionSetup.cjs.js.map +1 -1
- package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
- package/dist/nile-code-editor/nile-code-editor.cjs.js +2 -2
- package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
- package/dist/nile-code-editor/nile-code-editor.esm.js +3 -3
- package/dist/nile-code-editor/theme.cjs.js +1 -1
- package/dist/nile-code-editor/theme.cjs.js.map +1 -1
- package/dist/nile-code-editor/theme.esm.js +1 -1
- package/dist/nile-file-preview/nile-file-preview.cjs.js +1 -1
- package/dist/nile-file-preview/nile-file-preview.cjs.js.map +1 -1
- package/dist/nile-file-preview/nile-file-preview.css.cjs.js +1 -1
- package/dist/nile-file-preview/nile-file-preview.css.cjs.js.map +1 -1
- package/dist/nile-file-preview/nile-file-preview.css.esm.js +203 -184
- package/dist/nile-file-preview/nile-file-preview.esm.js +1 -3
- package/dist/nile-file-preview/nile-file-preview.template.cjs.js +1 -1
- package/dist/nile-file-preview/nile-file-preview.template.cjs.js.map +1 -1
- package/dist/nile-file-preview/nile-file-preview.template.esm.js +66 -77
- package/dist/nile-file-preview/types/nile-file-preview.enums.cjs.js +1 -1
- package/dist/nile-file-preview/types/nile-file-preview.enums.cjs.js.map +1 -1
- package/dist/nile-file-preview/types/nile-file-preview.enums.esm.js +1 -1
- package/dist/nile-file-preview/utils/index.cjs.js +1 -1
- package/dist/nile-file-preview/utils/index.esm.js +1 -1
- package/dist/nile-file-preview/utils/nile-file-preview.util.cjs.js +1 -1
- package/dist/nile-file-preview/utils/nile-file-preview.util.cjs.js.map +1 -1
- package/dist/nile-file-preview/utils/nile-file-preview.util.esm.js +1 -1
- package/dist/nile-file-upload/index.cjs.js +1 -1
- package/dist/nile-file-upload/index.esm.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.cjs.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.cjs.js.map +1 -1
- package/dist/nile-file-upload/nile-file-upload.css.cjs.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.css.cjs.js.map +1 -1
- package/dist/nile-file-upload/nile-file-upload.css.esm.js +142 -89
- package/dist/nile-file-upload/nile-file-upload.esm.js +2 -2
- package/dist/nile-file-upload/nile-file-upload.template.cjs.js +3 -3
- package/dist/nile-file-upload/nile-file-upload.template.cjs.js.map +1 -1
- package/dist/nile-file-upload/nile-file-upload.template.esm.js +50 -108
- package/dist/nile-file-upload/nile-file-upload.test.cjs.js +1 -1
- package/dist/nile-file-upload/nile-file-upload.test.esm.js +1 -1
- package/dist/nile-file-upload/types/file-upload.enums.cjs.js +1 -1
- package/dist/nile-file-upload/types/file-upload.enums.cjs.js.map +1 -1
- package/dist/nile-file-upload/types/file-upload.enums.esm.js +1 -1
- package/dist/nile-file-upload/utils/drag-drop.util.cjs.js +1 -1
- package/dist/nile-file-upload/utils/drag-drop.util.cjs.js.map +1 -1
- package/dist/nile-file-upload/utils/drag-drop.util.esm.js +1 -1
- package/dist/nile-file-upload/utils/file-validation.util.cjs.js +2 -1
- package/dist/nile-file-upload/utils/file-validation.util.cjs.js.map +1 -1
- package/dist/nile-file-upload/utils/file-validation.util.esm.js +1 -1
- package/dist/nile-option/nile-option.cjs.js +1 -1
- package/dist/nile-option/nile-option.cjs.js.map +1 -1
- package/dist/nile-option/nile-option.esm.js +3 -3
- package/dist/nile-option-group/index.cjs.js +2 -0
- package/dist/nile-option-group/index.cjs.js.map +1 -0
- package/dist/nile-option-group/index.esm.js +1 -0
- package/dist/nile-option-group/nile-option-group.cjs.js +2 -0
- package/dist/nile-option-group/nile-option-group.cjs.js.map +1 -0
- package/dist/nile-option-group/nile-option-group.css.cjs.js +2 -0
- package/dist/nile-option-group/nile-option-group.css.cjs.js.map +1 -0
- package/dist/nile-option-group/nile-option-group.css.esm.js +46 -0
- package/dist/nile-option-group/nile-option-group.esm.js +14 -0
- package/dist/nile-option-group/nile-option-group.interface.cjs.js +2 -0
- package/dist/nile-option-group/nile-option-group.interface.cjs.js.map +1 -0
- package/dist/nile-option-group/nile-option-group.interface.esm.js +1 -0
- package/dist/nile-select/nile-select.cjs.js +1 -1
- package/dist/nile-select/nile-select.cjs.js.map +1 -1
- package/dist/nile-select/nile-select.esm.js +2 -2
- package/dist/nile-select/nile-select.interface.cjs.js +2 -0
- package/dist/nile-select/nile-select.interface.cjs.js.map +1 -0
- package/dist/nile-select/nile-select.interface.esm.js +1 -0
- package/dist/nile-table-body/nile-table-body.cjs.js +1 -1
- package/dist/nile-table-body/nile-table-body.cjs.js.map +1 -1
- package/dist/nile-table-body/nile-table-body.esm.js +2 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.cjs.js +1 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.cjs.js.map +1 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.esm.js +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.cjs.js +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.cjs.js.map +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.esm.js +2 -2
- package/dist/nile-virtual-select/renderer.cjs.js +1 -1
- package/dist/nile-virtual-select/renderer.cjs.js.map +1 -1
- package/dist/nile-virtual-select/renderer.esm.js +13 -12
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/internal/resizable-table-helper.d.ts +5 -0
- package/dist/src/internal/resizable-table-helper.js +27 -4
- package/dist/src/internal/resizable-table-helper.js.map +1 -1
- package/dist/src/nile-code-editor/nile-code-editor.d.ts +5 -0
- package/dist/src/nile-code-editor/nile-code-editor.js +44 -7
- package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
- package/dist/src/nile-code-editor/theme.d.ts +15 -0
- package/dist/src/nile-code-editor/theme.js +17 -2
- package/dist/src/nile-code-editor/theme.js.map +1 -1
- package/dist/src/nile-file-preview/nile-file-preview.css.js +201 -182
- package/dist/src/nile-file-preview/nile-file-preview.css.js.map +1 -1
- package/dist/src/nile-file-preview/nile-file-preview.d.ts +6 -2
- package/dist/src/nile-file-preview/nile-file-preview.js +49 -20
- package/dist/src/nile-file-preview/nile-file-preview.js.map +1 -1
- package/dist/src/nile-file-preview/nile-file-preview.template.d.ts +3 -2
- package/dist/src/nile-file-preview/nile-file-preview.template.js +58 -62
- package/dist/src/nile-file-preview/nile-file-preview.template.js.map +1 -1
- package/dist/src/nile-file-preview/types/nile-file-preview.enums.d.ts +4 -3
- package/dist/src/nile-file-preview/types/nile-file-preview.enums.js +3 -2
- package/dist/src/nile-file-preview/types/nile-file-preview.enums.js.map +1 -1
- package/dist/src/nile-file-preview/utils/nile-file-preview.util.d.ts +4 -0
- package/dist/src/nile-file-preview/utils/nile-file-preview.util.js +25 -0
- package/dist/src/nile-file-preview/utils/nile-file-preview.util.js.map +1 -1
- package/dist/src/nile-file-upload/nile-file-upload.css.js +140 -87
- package/dist/src/nile-file-upload/nile-file-upload.css.js.map +1 -1
- package/dist/src/nile-file-upload/nile-file-upload.d.ts +4 -1
- package/dist/src/nile-file-upload/nile-file-upload.js +30 -20
- package/dist/src/nile-file-upload/nile-file-upload.js.map +1 -1
- package/dist/src/nile-file-upload/nile-file-upload.template.d.ts +7 -5
- package/dist/src/nile-file-upload/nile-file-upload.template.js +69 -115
- package/dist/src/nile-file-upload/nile-file-upload.template.js.map +1 -1
- package/dist/src/nile-file-upload/types/file-upload.enums.d.ts +11 -4
- package/dist/src/nile-file-upload/types/file-upload.enums.js +8 -1
- package/dist/src/nile-file-upload/types/file-upload.enums.js.map +1 -1
- package/dist/src/nile-file-upload/utils/drag-drop.util.d.ts +2 -4
- package/dist/src/nile-file-upload/utils/drag-drop.util.js +18 -21
- package/dist/src/nile-file-upload/utils/drag-drop.util.js.map +1 -1
- package/dist/src/nile-file-upload/utils/file-validation.util.d.ts +3 -1
- package/dist/src/nile-file-upload/utils/file-validation.util.js +82 -32
- package/dist/src/nile-file-upload/utils/file-validation.util.js.map +1 -1
- package/dist/src/nile-option/nile-option.d.ts +1 -0
- package/dist/src/nile-option/nile-option.js +6 -1
- package/dist/src/nile-option/nile-option.js.map +1 -1
- package/dist/src/nile-option-group/index.d.ts +1 -0
- package/dist/src/nile-option-group/index.js +2 -0
- package/dist/src/nile-option-group/index.js.map +1 -0
- package/dist/src/nile-option-group/nile-option-group.css.d.ts +12 -0
- package/dist/src/nile-option-group/nile-option-group.css.js +58 -0
- package/dist/src/nile-option-group/nile-option-group.css.js.map +1 -0
- package/dist/src/nile-option-group/nile-option-group.d.ts +23 -0
- package/dist/src/nile-option-group/nile-option-group.interface.d.ts +22 -0
- package/dist/src/nile-option-group/nile-option-group.interface.js +2 -0
- package/dist/src/nile-option-group/nile-option-group.interface.js.map +1 -0
- package/dist/src/nile-option-group/nile-option-group.js +76 -0
- package/dist/src/nile-option-group/nile-option-group.js.map +1 -0
- package/dist/src/nile-select/nile-select.d.ts +6 -0
- package/dist/src/nile-select/nile-select.interface.d.ts +5 -0
- package/dist/src/nile-select/nile-select.interface.js +2 -0
- package/dist/src/nile-select/nile-select.interface.js.map +1 -0
- package/dist/src/nile-select/nile-select.js +59 -1
- package/dist/src/nile-select/nile-select.js.map +1 -1
- package/dist/src/nile-table-body/nile-table-body.d.ts +1 -0
- package/dist/src/nile-table-body/nile-table-body.js +4 -0
- package/dist/src/nile-table-body/nile-table-body.js.map +1 -1
- package/dist/src/nile-table-cell-item/nile-table-cell-item.d.ts +2 -1
- package/dist/src/nile-table-cell-item/nile-table-cell-item.js +12 -1
- package/dist/src/nile-table-cell-item/nile-table-cell-item.js.map +1 -1
- package/dist/src/nile-table-header-item/nile-table-header-item.d.ts +2 -1
- package/dist/src/nile-table-header-item/nile-table-header-item.js +12 -1
- package/dist/src/nile-table-header-item/nile-table-header-item.js.map +1 -1
- package/dist/src/nile-virtual-select/renderer.js +3 -0
- package/dist/src/nile-virtual-select/renderer.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/src/index.ts +1 -1
- package/src/internal/resizable-table-helper.ts +31 -8
- package/src/nile-code-editor/nile-code-editor.ts +49 -9
- package/src/nile-code-editor/theme.ts +19 -3
- package/src/nile-file-preview/nile-file-preview.css.ts +202 -183
- package/src/nile-file-preview/nile-file-preview.template.ts +66 -63
- package/src/nile-file-preview/nile-file-preview.ts +54 -22
- package/src/nile-file-preview/types/nile-file-preview.enums.ts +4 -3
- package/src/nile-file-preview/utils/nile-file-preview.util.ts +25 -0
- package/src/nile-file-upload/nile-file-upload.css.ts +141 -88
- package/src/nile-file-upload/nile-file-upload.template.ts +133 -121
- package/src/nile-file-upload/nile-file-upload.ts +30 -18
- package/src/nile-file-upload/types/file-upload.enums.ts +9 -2
- package/src/nile-file-upload/utils/drag-drop.util.ts +25 -25
- package/src/nile-file-upload/utils/file-validation.util.ts +98 -45
- package/src/nile-option/nile-option.ts +4 -1
- package/src/nile-option-group/index.ts +1 -0
- package/src/nile-option-group/nile-option-group.css.ts +60 -0
- package/src/nile-option-group/nile-option-group.interface.ts +25 -0
- package/src/nile-option-group/nile-option-group.ts +84 -0
- package/src/nile-select/nile-select.interface.ts +5 -0
- package/src/nile-select/nile-select.ts +74 -2
- package/src/nile-table-body/nile-table-body.ts +2 -0
- package/src/nile-table-cell-item/nile-table-cell-item.ts +15 -1
- package/src/nile-table-header-item/nile-table-header-item.ts +15 -1
- package/src/nile-virtual-select/renderer.ts +3 -0
- package/vscode-html-custom-data.json +49 -13
@@ -1,75 +1,89 @@
|
|
1
1
|
import { DragHandler } from "./drag-drop.util";
|
2
2
|
import { FileUploadState, FileUploadError, FileUploadEvent } from "../types";
|
3
3
|
import { NileFileUpload } from "../nile-file-upload";
|
4
|
+
import { RemoveFileDetail } from "../../nile-file-preview/types";
|
4
5
|
|
5
|
-
// write a function to check for duplicatse in the files name it as areDuplicates
|
6
|
-
export const areDuplicates = (files: File[], uploadedFiles: File[]): boolean => {
|
7
|
-
return files.some(file =>
|
8
|
-
uploadedFiles.some(existing =>
|
9
|
-
file.name === existing.name &&
|
10
|
-
file.size === existing.size &&
|
11
|
-
file.lastModified === existing.lastModified
|
12
|
-
)
|
13
|
-
);
|
14
|
-
};
|
15
|
-
|
16
|
-
// set up the drag handler
|
17
6
|
export const setUpDragHandler = (
|
18
7
|
nileFileUpload: NileFileUpload,
|
19
|
-
dragHandler: DragHandler
|
8
|
+
dragHandler: DragHandler,
|
20
9
|
): void => {
|
21
10
|
dragHandler.onStateChange((newState: FileUploadState) => {
|
22
11
|
nileFileUpload.state = newState;
|
23
12
|
});
|
24
13
|
|
25
14
|
dragHandler.onFileDrop((files: File[]) => {
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
}
|
15
|
+
const maxSize = parseSize(nileFileUpload.size);
|
16
|
+
const uploadedFiles = nileFileUpload.uploadedFiles;
|
17
|
+
|
18
|
+
if (!nileFileUpload.allowMultiple && (uploadedFiles.length + files.length > 1)) {
|
19
|
+
nileFileUpload.errorMessage = FileUploadError.MULTIPLE_NOT_ALLOWED;
|
20
|
+
console.error(nileFileUpload.errorMessage);
|
21
|
+
nileFileUpload.requestUpdate();
|
22
|
+
return;
|
35
23
|
}
|
36
|
-
|
37
|
-
let
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
24
|
+
|
25
|
+
let sizeExceeded = false;
|
26
|
+
let duplicatesFound = false;
|
27
|
+
const newFiles: File[] = [];
|
28
|
+
const rejectedFiles: File[] = [];
|
29
|
+
|
30
|
+
for (const file of files) {
|
31
|
+
if (file.size > maxSize) {
|
32
|
+
sizeExceeded = true;
|
33
|
+
rejectedFiles.push(file);
|
34
|
+
continue;
|
35
|
+
}
|
36
|
+
|
37
|
+
if (
|
38
|
+
!nileFileUpload.allowDuplicates &&
|
39
|
+
uploadedFiles.some(
|
40
|
+
(uploaded) =>
|
43
41
|
uploaded.name === file.name &&
|
44
42
|
uploaded.size === file.size &&
|
45
43
|
uploaded.type === file.type
|
46
44
|
)
|
47
|
-
)
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
) {
|
46
|
+
duplicatesFound = true;
|
47
|
+
rejectedFiles.push(file);
|
48
|
+
continue;
|
49
|
+
}
|
50
|
+
|
51
|
+
if(!rejectedFiles.includes(file)) {
|
52
|
+
newFiles.push(file);
|
53
53
|
}
|
54
54
|
}
|
55
55
|
|
56
|
-
|
56
|
+
if (sizeExceeded) {
|
57
|
+
nileFileUpload.errorMessage = FileUploadError.SIZE_LIMIT_EXCEEDED;
|
58
|
+
console.error(nileFileUpload.errorMessage);
|
59
|
+
nileFileUpload.requestUpdate();
|
60
|
+
nileFileUpload.dispatchEvent(new CustomEvent(FileUploadEvent.NILE_SIZE_EXCEED_FILES, {
|
61
|
+
detail: { files: rejectedFiles }
|
62
|
+
}));
|
63
|
+
}
|
64
|
+
|
65
|
+
if (duplicatesFound && newFiles.length === 0) {
|
66
|
+
nileFileUpload.errorMessage = FileUploadError.DUPLICATES_NOT_ALLOWED;
|
67
|
+
console.error(nileFileUpload.errorMessage);
|
68
|
+
nileFileUpload.requestUpdate();
|
69
|
+
}
|
70
|
+
|
71
|
+
nileFileUpload.uploadedFiles = [...uploadedFiles, ...newFiles];
|
57
72
|
nileFileUpload.requestUpdate();
|
58
73
|
});
|
74
|
+
|
59
75
|
|
60
76
|
dragHandler.setErrorMessage((errorMessage: string) => {
|
77
|
+
console.error(nileFileUpload.errorMessage);
|
61
78
|
nileFileUpload.errorMessage = errorMessage;
|
62
79
|
});
|
63
80
|
};
|
64
81
|
|
65
|
-
|
66
|
-
// global listenrers
|
67
82
|
export const addGlobalListeners = (dragHandler: DragHandler): void => {
|
68
83
|
document.addEventListener('dragover', dragHandler.preventDragOver, { passive: false });
|
69
84
|
document.addEventListener('drop', dragHandler.preventDrop, { passive: false });
|
70
85
|
}
|
71
86
|
|
72
|
-
// for hover & dragging functionality
|
73
87
|
export const addInternalListeners = (nileFileUpload: NileFileUpload, dragHandler: DragHandler, uploadRequests: any): void => {
|
74
88
|
nileFileUpload.addEventListener('mouseenter', (e) => handleHoverIn(nileFileUpload.setState, nileFileUpload.state));
|
75
89
|
nileFileUpload.addEventListener('mouseleave', (e) => handleHoverOut(nileFileUpload.setState, nileFileUpload.state));
|
@@ -79,6 +93,7 @@ export const addInternalListeners = (nileFileUpload: NileFileUpload, dragHandler
|
|
79
93
|
nileFileUpload.addEventListener('drop', (e) => dragHandler.drop(e));
|
80
94
|
|
81
95
|
cancelFileUpload(nileFileUpload, uploadRequests);
|
96
|
+
removeFile(nileFileUpload.uploadedFiles, nileFileUpload);
|
82
97
|
}
|
83
98
|
|
84
99
|
export function handleHoverIn(
|
@@ -104,29 +119,32 @@ export function uploadFiles(nileFileUpload: NileFileUpload) {
|
|
104
119
|
if (!fileUploadUrl || !uploadedFiles?.length) return;
|
105
120
|
|
106
121
|
for (const file of uploadedFiles) {
|
122
|
+
if (uploadRequests.has(file)) continue;
|
123
|
+
|
107
124
|
const formData = new FormData();
|
108
125
|
formData.append('file', file);
|
109
126
|
|
110
127
|
const xhr = new XMLHttpRequest();
|
111
128
|
uploadRequests.set(file, xhr);
|
112
129
|
|
130
|
+
nileFileUpload.emit(FileUploadEvent.NILE_UPLOADING);
|
131
|
+
|
113
132
|
xhr.upload.onprogress = (e) => {
|
114
133
|
const percent = Math.floor((e.loaded / e.total) * 100);
|
134
|
+
|
115
135
|
nileFileUpload.dispatchEvent(new CustomEvent(FileUploadEvent.NILE_UPLOAD_PROGRESS, {
|
116
136
|
detail: { file, progress: percent }
|
117
137
|
}));
|
118
138
|
};
|
119
139
|
|
120
140
|
xhr.onload = () => {
|
121
|
-
|
122
|
-
if (xhr.status === 201) {
|
123
|
-
// Remove the successfully uploaded file
|
124
|
-
nileFileUpload.uploadedFiles = nileFileUpload.uploadedFiles.filter(f => f !== file);
|
125
|
-
|
141
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
126
142
|
nileFileUpload.dispatchEvent(new CustomEvent(FileUploadEvent.NILE_UPLOAD_SUCCESS, {
|
127
143
|
detail: { file, response: xhr.response }
|
128
144
|
}));
|
129
145
|
} else {
|
146
|
+
nileFileUpload.errorMessage = FileUploadError.SERVER_SIDE_ERROR;
|
147
|
+
nileFileUpload.requestUpdate();
|
130
148
|
nileFileUpload.dispatchEvent(new CustomEvent(FileUploadEvent.SERVER_SIDE_ERROR, {
|
131
149
|
detail: { file, status: xhr.status, response: xhr.response }
|
132
150
|
}));
|
@@ -135,8 +153,11 @@ export function uploadFiles(nileFileUpload: NileFileUpload) {
|
|
135
153
|
|
136
154
|
xhr.onerror = () => {
|
137
155
|
uploadRequests.delete(file);
|
156
|
+
nileFileUpload.errorMessage = FileUploadError.NETWORK_ERROR;
|
138
157
|
nileFileUpload.dispatchEvent(new CustomEvent(FileUploadEvent.NILE_NETWORK_ERROR, {
|
139
|
-
detail: { file, status: xhr.status, response: xhr.response }
|
158
|
+
detail: { file, status: xhr.status, response: xhr.response },
|
159
|
+
bubbles: true,
|
160
|
+
composed: true,
|
140
161
|
}));
|
141
162
|
};
|
142
163
|
|
@@ -161,3 +182,35 @@ export const cancelFileUpload = (nileFileUpload: NileFileUpload, uploadRequests:
|
|
161
182
|
}));
|
162
183
|
});
|
163
184
|
};
|
185
|
+
|
186
|
+
function parseSize(sizeStr: string): number {
|
187
|
+
const units = { B: 1, KB: 1024, MB: 1024 ** 2, GB: 1024 ** 3 };
|
188
|
+
const num = parseFloat(sizeStr);
|
189
|
+
const unit = sizeStr.replace(/[0-9.\s]/g, '').toUpperCase();
|
190
|
+
const multiplier = units[unit as keyof typeof units] || 1;
|
191
|
+
return num * multiplier;
|
192
|
+
}
|
193
|
+
|
194
|
+
export const preventDefaultAndStopPropagation = (event: Event | DragEvent): void => {
|
195
|
+
event.preventDefault?.();
|
196
|
+
event.stopPropagation();
|
197
|
+
}
|
198
|
+
|
199
|
+
export const removeFile = (uploadedFiles: File[], nileFileUpload: NileFileUpload) => {
|
200
|
+
document.addEventListener('nile-remove', (e: CustomEvent<RemoveFileDetail>) => {
|
201
|
+
const { value } = e.detail;
|
202
|
+
uploadedFiles = uploadedFiles.filter(file => file !== value);
|
203
|
+
nileFileUpload.uploadedFiles = uploadedFiles;
|
204
|
+
nileFileUpload.requestUpdate();
|
205
|
+
});
|
206
|
+
}
|
207
|
+
|
208
|
+
export const truncateString = (nileFileUpload: NileFileUpload): void => {
|
209
|
+
if(nileFileUpload.variant === 'vertical' && nileFileUpload.errorMessage.length > 34) {
|
210
|
+
nileFileUpload.isStringTruncated = true;
|
211
|
+
nileFileUpload.requestUpdate();
|
212
|
+
} else if(nileFileUpload.variant === 'horizontal' && nileFileUpload.errorMessage.length > 96) {
|
213
|
+
nileFileUpload.isStringTruncated = true;
|
214
|
+
nileFileUpload.requestUpdate();
|
215
|
+
}
|
216
|
+
}
|
@@ -68,6 +68,9 @@ export class NileOption extends NileElement {
|
|
68
68
|
/** Indicates whether the option is selected. */
|
69
69
|
@property({ type: Boolean, reflect: true }) selected = false;
|
70
70
|
|
71
|
+
/* used to pass group name to the option, so that grouped options can be shown */
|
72
|
+
@property({ type: String, reflect: true }) groupName: string = '';
|
73
|
+
|
71
74
|
connectedCallback() {
|
72
75
|
super.connectedCallback();
|
73
76
|
this.setAttribute('role', 'option');
|
@@ -181,7 +184,7 @@ export class NileOption extends NileElement {
|
|
181
184
|
@mouseleave=${this.handleMouseLeave}
|
182
185
|
>
|
183
186
|
|
184
|
-
${this.isMultipleSelect ? html`<nile-checkbox class="option--checkbox" .checked=${this.selected}></nile-checkbox>` : ''}
|
187
|
+
${this.isMultipleSelect ? html`<nile-checkbox part="checkbox" class="option--checkbox" .checked=${this.selected}></nile-checkbox>` : ''}
|
185
188
|
|
186
189
|
<slot part="prefix" name="prefix" class="option__prefix"></slot>
|
187
190
|
<slot
|
@@ -0,0 +1 @@
|
|
1
|
+
export { NileOptionGroup } from './nile-option-group';
|
@@ -0,0 +1,60 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2025
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
|
8
|
+
import { css } from 'lit';
|
9
|
+
|
10
|
+
/**
|
11
|
+
* OptionHeader CSS
|
12
|
+
*/
|
13
|
+
export const styles = css`
|
14
|
+
.option-group-header {
|
15
|
+
height: 40px;
|
16
|
+
display: flex;
|
17
|
+
align-items: center;
|
18
|
+
padding: 0px 12px;
|
19
|
+
background-color: var(--nile-colors-dark-200);
|
20
|
+
color: var(--nile-colors-dark-900);
|
21
|
+
font-feature-settings: 'liga' off, 'clig' off;
|
22
|
+
font-family: 'colfax-medium';
|
23
|
+
font-size: 12px;
|
24
|
+
font-weight: 500;
|
25
|
+
width: 100%;
|
26
|
+
box-sizing: border-box;
|
27
|
+
justify-content: space-between;
|
28
|
+
}
|
29
|
+
|
30
|
+
.content-container {
|
31
|
+
display: flex;
|
32
|
+
justify-content: flex-start;
|
33
|
+
align-items: center;
|
34
|
+
}
|
35
|
+
|
36
|
+
.gap-18px {
|
37
|
+
gap: 14px;
|
38
|
+
}
|
39
|
+
|
40
|
+
.option-group-prefix,
|
41
|
+
.option-group-suffix {
|
42
|
+
flex: 0 0 auto;
|
43
|
+
display: flex;
|
44
|
+
align-items: center;
|
45
|
+
}
|
46
|
+
|
47
|
+
.option-group-prefix::slotted(*) {
|
48
|
+
margin-inline-end: 0.5rem;
|
49
|
+
}
|
50
|
+
|
51
|
+
.option-group-suffix::slotted(*) {
|
52
|
+
margin-inline-start: 0.5rem;
|
53
|
+
}
|
54
|
+
|
55
|
+
:host(.nile-group-hidden)::part(option-group-header) {
|
56
|
+
display: none !important;
|
57
|
+
}
|
58
|
+
`;
|
59
|
+
|
60
|
+
export default [styles];
|
@@ -0,0 +1,25 @@
|
|
1
|
+
export interface IconData {
|
2
|
+
name: string;
|
3
|
+
size?: string;
|
4
|
+
color?: string;
|
5
|
+
method?: string;
|
6
|
+
}
|
7
|
+
|
8
|
+
export interface ImageData {
|
9
|
+
src?: string;
|
10
|
+
height?: string;
|
11
|
+
width?: string;
|
12
|
+
}
|
13
|
+
|
14
|
+
export interface PrefixSuffixData {
|
15
|
+
icon?: IconData;
|
16
|
+
prefixText?: string;
|
17
|
+
suffixText?: string;
|
18
|
+
image?: ImageData;
|
19
|
+
}
|
20
|
+
|
21
|
+
export interface OptionGroupData {
|
22
|
+
prefix?: PrefixSuffixData;
|
23
|
+
suffix?: PrefixSuffixData;
|
24
|
+
textContent?: string;
|
25
|
+
}
|
@@ -0,0 +1,84 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2025
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
|
8
|
+
import {LitElement, html, CSSResultArray, TemplateResult} from 'lit';
|
9
|
+
import { customElement, property} from 'lit/decorators.js';
|
10
|
+
import {styles} from './nile-option-group.css';
|
11
|
+
import NileElement from '../internal/nile-element';
|
12
|
+
import { OptionGroupData } from './nile-option-group.interface';
|
13
|
+
|
14
|
+
@customElement('nile-option-group')
|
15
|
+
export class NileOptionGroup extends NileElement {
|
16
|
+
|
17
|
+
public static get styles(): CSSResultArray {
|
18
|
+
return [styles];
|
19
|
+
}
|
20
|
+
|
21
|
+
@property({type: String, reflect: true, attribute: true}) name: string = "";
|
22
|
+
@property({type: Object, attribute: true}) data: OptionGroupData | null = null;
|
23
|
+
|
24
|
+
private checkForImageOrIcon() {
|
25
|
+
return this.data?.prefix?.icon?.name || this.data?.prefix?.image?.src || this.data?.prefix?.prefixText;
|
26
|
+
}
|
27
|
+
|
28
|
+
private normalizeImageDimension(value?: string | number): string {
|
29
|
+
if (value === undefined || value === null || value === "") {
|
30
|
+
return "20";
|
31
|
+
}
|
32
|
+
|
33
|
+
const dimension = Number(value);
|
34
|
+
if (isNaN(dimension) || dimension <= 0) {
|
35
|
+
return "20";
|
36
|
+
}
|
37
|
+
return dimension > 40 ? "25" : dimension.toString();
|
38
|
+
}
|
39
|
+
|
40
|
+
public render(): TemplateResult {
|
41
|
+
return html`
|
42
|
+
<div part="option-group-header" class="option-group-header">
|
43
|
+
<div part="content-container" class="content-container ${this.checkForImageOrIcon() ? 'gap-18px' : ''}">
|
44
|
+
<!-- prefix content -->
|
45
|
+
${
|
46
|
+
this.data?.prefix?.icon?.name
|
47
|
+
? html`<nile-icon part="prefix-icon" name="${this.data?.prefix?.icon?.name}" size="${this.data?.prefix?.icon?.size || "16"}" color="${this.data?.prefix?.icon?.color || "var(--nile-colors-dark-500)"}" method="${this.data?.prefix?.icon?.method || "fill"}"></nile-icon>`
|
48
|
+
: this.data?.prefix?.prefixText
|
49
|
+
? html`<span part="prefix-text">${this.data?.prefix?.prefixText}</span>`
|
50
|
+
: this.data?.prefix?.image?.src
|
51
|
+
? html`<img part="prefix-image" src="${this.data?.prefix?.image?.src}" width="${this.normalizeImageDimension(this.data?.prefix?.image?.width)}" height="${this.normalizeImageDimension(this.data?.prefix?.image?.height)}">`
|
52
|
+
: html`<slot part="prefix" name="prefix" class="option-group-prefix"></slot>`
|
53
|
+
}
|
54
|
+
|
55
|
+
<!-- main content -->
|
56
|
+
${
|
57
|
+
this.data?.textContent
|
58
|
+
? html`<span part="content-text">${this.data?.textContent}</span>`
|
59
|
+
: html`<slot part="content"></slot>`
|
60
|
+
}
|
61
|
+
</div>
|
62
|
+
|
63
|
+
<!-- suffix content -->
|
64
|
+
${
|
65
|
+
this.data?.suffix?.icon?.name
|
66
|
+
? html`<nile-icon part="suffix-icon" name="${this.data?.suffix?.icon?.name}" size="${this.data?.suffix?.icon?.size || "16"}" color="${this.data?.suffix?.icon?.color || "var(--nile-colors-dark-500)"}" method="${this.data?.suffix?.icon?.method || "fill"}"></nile-icon>`
|
67
|
+
: this.data?.suffix?.suffixText
|
68
|
+
? html`<span part="suffix-text">${this.data?.suffix?.suffixText}</span>`
|
69
|
+
: this.data?.suffix?.image?.src
|
70
|
+
? html`<img part="suffix-image" src="${this.data?.prefix?.image?.src}" width="${this.normalizeImageDimension(this.data?.suffix?.image?.width)}" height="${this.normalizeImageDimension(this.data?.suffix?.image?.height)}">`
|
71
|
+
: html`<slot part="suffix" name="suffix" class="option-group-suffix"></slot>`
|
72
|
+
}
|
73
|
+
</div>
|
74
|
+
`;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
export default NileOptionGroup;
|
79
|
+
|
80
|
+
declare global {
|
81
|
+
interface HTMLElementTagNameMap {
|
82
|
+
'nile-option-group': NileOptionGroup;
|
83
|
+
}
|
84
|
+
}
|
@@ -38,6 +38,8 @@ import { unsafeHTML } from 'lit/directives/unsafe-html.js';
|
|
38
38
|
import { ifDefined } from 'lit/directives/if-defined.js';
|
39
39
|
import '../nile-virtual-select/nile-virtual-select';
|
40
40
|
import { VirtualScrollHelper } from './virtual-scroll-helper';
|
41
|
+
import NileOptionGroup from '../nile-option-group/nile-option-group';
|
42
|
+
import { GroupAttributes } from './nile-select.interface';
|
41
43
|
|
42
44
|
type NileRemoveEvent = CustomEvent<Record<PropertyKey, never>>;
|
43
45
|
|
@@ -259,6 +261,9 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
259
261
|
|
260
262
|
@property({ type: Boolean }) enableVirtualScroll = false;
|
261
263
|
|
264
|
+
/** To enable the group header in the select */
|
265
|
+
@property({ type: Boolean, reflect: true, attribute: true }) enableGroupHeader = false;
|
266
|
+
|
262
267
|
/** Gets the validity state object */
|
263
268
|
get validity() {
|
264
269
|
return this.valueInput?.validity;
|
@@ -304,6 +309,10 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
304
309
|
}
|
305
310
|
|
306
311
|
protected firstUpdated(_changedProperties: PropertyValues): void {
|
312
|
+
if(this.enableGroupHeader) {
|
313
|
+
this.handleGroupSearchChange();
|
314
|
+
}
|
315
|
+
|
307
316
|
if(_changedProperties.has('multiple')) {
|
308
317
|
this.setCheckBoxInOption(this.multiple as boolean);
|
309
318
|
}
|
@@ -380,6 +389,9 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
380
389
|
}
|
381
390
|
});
|
382
391
|
|
392
|
+
if(this.enableGroupHeader) {
|
393
|
+
this.handleGroupShowSelected();
|
394
|
+
}
|
383
395
|
// this.requestUpdate();
|
384
396
|
}
|
385
397
|
|
@@ -393,6 +405,9 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
393
405
|
el.selected = false;
|
394
406
|
el.hidden = false;
|
395
407
|
});
|
408
|
+
if(this.enableGroupHeader) {
|
409
|
+
this.handleGroupShowSelected();
|
410
|
+
}
|
396
411
|
this.value = '';
|
397
412
|
this.selectionChanged();
|
398
413
|
this.emit('nile-change', { value: this.value, name: this.name });
|
@@ -542,6 +557,9 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
542
557
|
this.showSelected = false;
|
543
558
|
this.value = '';
|
544
559
|
this.displayInput.focus({ preventScroll: true });
|
560
|
+
if(this.enableGroupHeader) {
|
561
|
+
this.handleGroupShowSelected();
|
562
|
+
}
|
545
563
|
|
546
564
|
// Emit after update
|
547
565
|
this.updateComplete.then(() => {
|
@@ -605,7 +623,9 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
605
623
|
el.hidden = this.showSelected;
|
606
624
|
}
|
607
625
|
});
|
608
|
-
|
626
|
+
if(this.enableGroupHeader) {
|
627
|
+
this.handleGroupShowSelected();
|
628
|
+
}
|
609
629
|
this.requestUpdate();
|
610
630
|
}
|
611
631
|
}
|
@@ -643,6 +663,9 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
643
663
|
el.hidden = this.showSelected;
|
644
664
|
}
|
645
665
|
});
|
666
|
+
if(this.enableGroupHeader) {
|
667
|
+
this.handleGroupShowSelected();
|
668
|
+
}
|
646
669
|
|
647
670
|
// Emit after updating
|
648
671
|
this.updateComplete.then(() => {
|
@@ -812,6 +835,9 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
812
835
|
|
813
836
|
handleSearchChange(e: any) {
|
814
837
|
this.searchValue = e.detail.value;
|
838
|
+
if(this.enableGroupHeader) {
|
839
|
+
this.handleGroupSearchChange();
|
840
|
+
}
|
815
841
|
if (!this.disableLocalSearch) {
|
816
842
|
let filteredOptions = this.filterOptions(this.searchValue);
|
817
843
|
if (filteredOptions.length === 0) {
|
@@ -875,8 +901,14 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
875
901
|
// Reset the current option
|
876
902
|
this.setCurrentOption(this.selectedOptions[0] || this.getFirstOption());
|
877
903
|
|
878
|
-
// Show
|
879
904
|
this.emit('nile-show', { value: this.value, name: this.name });
|
905
|
+
|
906
|
+
if(this.enableGroupHeader) {
|
907
|
+
this.getAllGroupAttributes().forEach((el: GroupAttributes) => {
|
908
|
+
el.element.classList.remove('nile-group-hidden');
|
909
|
+
});
|
910
|
+
}
|
911
|
+
|
880
912
|
this.addOpenListeners();
|
881
913
|
|
882
914
|
this.showNoResults = !this.getAllOptions()?.length;
|
@@ -922,6 +954,46 @@ export class NileSelect extends NileElement implements NileFormControl{
|
|
922
954
|
}
|
923
955
|
}
|
924
956
|
|
957
|
+
private getAllGroupAttributes() {
|
958
|
+
return Array.from(
|
959
|
+
this.querySelectorAll<NileOptionGroup>('nile-option-group[name]')
|
960
|
+
).map((el: HTMLElement) => ({
|
961
|
+
name: el?.getAttribute('name') || '',
|
962
|
+
data: el?.getAttribute('data'),
|
963
|
+
element: el
|
964
|
+
}));
|
965
|
+
}
|
966
|
+
|
967
|
+
getUniqueGroupNames(arr: NileOption[]) {
|
968
|
+
return Array.from(new Set(arr.map(obj => obj?.groupName)));
|
969
|
+
}
|
970
|
+
|
971
|
+
handleGroupSearchChange() {
|
972
|
+
const filtered = new Set(
|
973
|
+
this.getUniqueGroupNames(this.filterOptions(this.searchValue))
|
974
|
+
);
|
975
|
+
this.getAllGroupAttributes().forEach(({ name, element }) => {
|
976
|
+
element?.classList.toggle('nile-group-hidden', !filtered.has(name));
|
977
|
+
});
|
978
|
+
}
|
979
|
+
|
980
|
+
handleGroupShowSelected() {
|
981
|
+
const visibleGroups = new Set<string>();
|
982
|
+
|
983
|
+
if (this.showSelected) {
|
984
|
+
this.getAllOptions().forEach((option: NileOption) => {
|
985
|
+
if (!option.hidden) visibleGroups.add(option.groupName);
|
986
|
+
});
|
987
|
+
}
|
988
|
+
|
989
|
+
this.getAllGroupAttributes().forEach(({ name, element }) => {
|
990
|
+
element?.classList.toggle(
|
991
|
+
'nile-group-hidden',
|
992
|
+
this.showSelected && !visibleGroups.has(name)
|
993
|
+
);
|
994
|
+
});
|
995
|
+
}
|
996
|
+
|
925
997
|
/** Shows the listbox. */
|
926
998
|
async show() {
|
927
999
|
if (this.open || this.disabled) {
|
@@ -42,6 +42,7 @@ export class NileTableBody extends NileElement {
|
|
42
42
|
@query('slot') defaultSlot: HTMLSlotElement;
|
43
43
|
@queryAssignedNodes({ flatten: true }) _childNodes!: Array<HTMLElement>;
|
44
44
|
@property() type: 'primary' | 'secondary' = 'primary';
|
45
|
+
@property() bodyStyle: string;
|
45
46
|
|
46
47
|
@state() private rows_data: any[] = [];
|
47
48
|
@state() private header_rows_data: any[] = [];
|
@@ -123,6 +124,7 @@ export class NileTableBody extends NileElement {
|
|
123
124
|
@slotchange=${this.handleSlotchange}
|
124
125
|
@nile-click-sort=${this.handleSort}
|
125
126
|
class="nile__table__body"
|
127
|
+
style="display: ${this.bodyStyle}"
|
126
128
|
?resizable=${this.hasResizableColumns}
|
127
129
|
@nile-search=${this.handleSearch}
|
128
130
|
></slot>
|
@@ -10,12 +10,13 @@ import {
|
|
10
10
|
html,
|
11
11
|
CSSResultArray,
|
12
12
|
TemplateResult,
|
13
|
+
PropertyValues,
|
13
14
|
} from 'lit';
|
14
15
|
import { customElement, property } from 'lit/decorators.js';
|
15
16
|
import { styles } from './nile-table-cell-item.css';
|
16
17
|
import NileElement from '../internal/nile-element';
|
17
18
|
import { HasSlotController } from '../internal/slot';
|
18
|
-
import { createResizeHandler } from '../internal/resizable-table-helper';
|
19
|
+
import { createResizeHandler, resetAllColumnWidths } from '../internal/resizable-table-helper';
|
19
20
|
|
20
21
|
/**
|
21
22
|
* Nile table Cell Item component.
|
@@ -43,6 +44,19 @@ export class NileTableCellItem extends NileElement {
|
|
43
44
|
|
44
45
|
private handleResizeStart = createResizeHandler(this, 50);
|
45
46
|
|
47
|
+
protected updated(changedProperties: PropertyValues) {
|
48
|
+
super.updated(changedProperties);
|
49
|
+
|
50
|
+
if (changedProperties.has('resizable')) {
|
51
|
+
if (!this.resizable) {
|
52
|
+
const tableBody = this.closest('nile-table-body');
|
53
|
+
if (tableBody) {
|
54
|
+
resetAllColumnWidths(tableBody);
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
46
60
|
/**
|
47
61
|
* Render method
|
48
62
|
* @slot This is a slot test
|
@@ -10,12 +10,13 @@ import {
|
|
10
10
|
html,
|
11
11
|
CSSResultArray,
|
12
12
|
TemplateResult,
|
13
|
+
PropertyValues,
|
13
14
|
} from 'lit';
|
14
15
|
import { customElement, state, property } from 'lit/decorators.js';
|
15
16
|
import { styles } from './nile-table-header-item.css';
|
16
17
|
import NileElement from '../internal/nile-element';
|
17
18
|
import { HasSlotController } from '../internal/slot';
|
18
|
-
import { createResizeHandler } from '../internal/resizable-table-helper';
|
19
|
+
import { createResizeHandler, resetAllColumnWidths } from '../internal/resizable-table-helper';
|
19
20
|
|
20
21
|
/**
|
21
22
|
* Nile icon component.
|
@@ -53,6 +54,19 @@ export class NileTableHeaderItem extends NileElement {
|
|
53
54
|
|
54
55
|
/* #region Methods */
|
55
56
|
|
57
|
+
protected updated(changedProperties: PropertyValues) {
|
58
|
+
super.updated(changedProperties);
|
59
|
+
|
60
|
+
if (changedProperties.has('resizable')) {
|
61
|
+
if (!this.resizable) {
|
62
|
+
const tableBody = this.closest('nile-table-body');
|
63
|
+
if (tableBody) {
|
64
|
+
resetAllColumnWidths(tableBody);
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
56
70
|
/**
|
57
71
|
* Render method
|
58
72
|
* @slot This is a slot test
|
@@ -8,6 +8,7 @@
|
|
8
8
|
import { html, type TemplateResult } from 'lit';
|
9
9
|
import { virtualize } from '@lit-labs/virtualizer/virtualize.js';
|
10
10
|
import { unsafeHTML } from 'lit/directives/unsafe-html.js';
|
11
|
+
import { ifDefined } from 'lit/directives/if-defined.js';
|
11
12
|
|
12
13
|
export class VirtualSelectRenderer {
|
13
14
|
static getVirtualizedContent(
|
@@ -69,6 +70,7 @@ export class VirtualSelectRenderer {
|
|
69
70
|
const optionValue = valueFn(item);
|
70
71
|
const displayText = displayTextFn(item);
|
71
72
|
const isDisabled = item.disabled || false;
|
73
|
+
const className = item.className;
|
72
74
|
|
73
75
|
let isSelected = false;
|
74
76
|
if (multiple) {
|
@@ -83,6 +85,7 @@ export class VirtualSelectRenderer {
|
|
83
85
|
.selected=${isSelected}
|
84
86
|
.disabled=${isDisabled}
|
85
87
|
.showCheckbox=${multiple}
|
88
|
+
class=${ifDefined(className || undefined)}
|
86
89
|
>
|
87
90
|
${unsafeHTML(displayText)}
|
88
91
|
</nile-option>
|