@aquera/nile-elements 1.0.1-beta-1.4 → 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.
Files changed (211) hide show
  1. package/README.md +31 -0
  2. package/demo/index.html +8 -15
  3. package/dist/index.cjs.js +1 -1
  4. package/dist/index.esm.js +1 -1
  5. package/dist/index.js +689 -620
  6. package/dist/internal/resizable-table-helper.cjs.js +1 -1
  7. package/dist/internal/resizable-table-helper.cjs.js.map +1 -1
  8. package/dist/internal/resizable-table-helper.esm.js +1 -1
  9. package/dist/nile-code-editor/extensionSetup.cjs.js +5 -5
  10. package/dist/nile-code-editor/extensionSetup.cjs.js.map +1 -1
  11. package/dist/nile-code-editor/extensionSetup.esm.js +1 -1
  12. package/dist/nile-code-editor/nile-code-editor.cjs.js +2 -2
  13. package/dist/nile-code-editor/nile-code-editor.cjs.js.map +1 -1
  14. package/dist/nile-code-editor/nile-code-editor.esm.js +3 -3
  15. package/dist/nile-code-editor/theme.cjs.js +1 -1
  16. package/dist/nile-code-editor/theme.cjs.js.map +1 -1
  17. package/dist/nile-code-editor/theme.esm.js +1 -1
  18. package/dist/nile-file-preview/nile-file-preview.cjs.js +1 -1
  19. package/dist/nile-file-preview/nile-file-preview.cjs.js.map +1 -1
  20. package/dist/nile-file-preview/nile-file-preview.css.cjs.js +1 -1
  21. package/dist/nile-file-preview/nile-file-preview.css.cjs.js.map +1 -1
  22. package/dist/nile-file-preview/nile-file-preview.css.esm.js +203 -184
  23. package/dist/nile-file-preview/nile-file-preview.esm.js +1 -3
  24. package/dist/nile-file-preview/nile-file-preview.template.cjs.js +1 -1
  25. package/dist/nile-file-preview/nile-file-preview.template.cjs.js.map +1 -1
  26. package/dist/nile-file-preview/nile-file-preview.template.esm.js +66 -77
  27. package/dist/nile-file-preview/types/nile-file-preview.enums.cjs.js +1 -1
  28. package/dist/nile-file-preview/types/nile-file-preview.enums.cjs.js.map +1 -1
  29. package/dist/nile-file-preview/types/nile-file-preview.enums.esm.js +1 -1
  30. package/dist/nile-file-preview/utils/index.cjs.js +1 -1
  31. package/dist/nile-file-preview/utils/index.esm.js +1 -1
  32. package/dist/nile-file-preview/utils/nile-file-preview.util.cjs.js +1 -1
  33. package/dist/nile-file-preview/utils/nile-file-preview.util.cjs.js.map +1 -1
  34. package/dist/nile-file-preview/utils/nile-file-preview.util.esm.js +1 -1
  35. package/dist/nile-file-upload/index.cjs.js +1 -1
  36. package/dist/nile-file-upload/index.esm.js +1 -1
  37. package/dist/nile-file-upload/nile-file-upload.cjs.js +1 -1
  38. package/dist/nile-file-upload/nile-file-upload.cjs.js.map +1 -1
  39. package/dist/nile-file-upload/nile-file-upload.css.cjs.js +1 -1
  40. package/dist/nile-file-upload/nile-file-upload.css.cjs.js.map +1 -1
  41. package/dist/nile-file-upload/nile-file-upload.css.esm.js +142 -89
  42. package/dist/nile-file-upload/nile-file-upload.esm.js +2 -2
  43. package/dist/nile-file-upload/nile-file-upload.template.cjs.js +3 -3
  44. package/dist/nile-file-upload/nile-file-upload.template.cjs.js.map +1 -1
  45. package/dist/nile-file-upload/nile-file-upload.template.esm.js +50 -108
  46. package/dist/nile-file-upload/nile-file-upload.test.cjs.js +1 -1
  47. package/dist/nile-file-upload/nile-file-upload.test.esm.js +1 -1
  48. package/dist/nile-file-upload/types/file-upload.enums.cjs.js +1 -1
  49. package/dist/nile-file-upload/types/file-upload.enums.cjs.js.map +1 -1
  50. package/dist/nile-file-upload/types/file-upload.enums.esm.js +1 -1
  51. package/dist/nile-file-upload/utils/drag-drop.util.cjs.js +1 -1
  52. package/dist/nile-file-upload/utils/drag-drop.util.cjs.js.map +1 -1
  53. package/dist/nile-file-upload/utils/drag-drop.util.esm.js +1 -1
  54. package/dist/nile-file-upload/utils/file-validation.util.cjs.js +2 -1
  55. package/dist/nile-file-upload/utils/file-validation.util.cjs.js.map +1 -1
  56. package/dist/nile-file-upload/utils/file-validation.util.esm.js +1 -1
  57. package/dist/nile-input/nile-input.css.cjs.js +1 -1
  58. package/dist/nile-input/nile-input.css.cjs.js.map +1 -1
  59. package/dist/nile-input/nile-input.css.esm.js +0 -1
  60. package/dist/nile-option/nile-option.cjs.js +1 -1
  61. package/dist/nile-option/nile-option.cjs.js.map +1 -1
  62. package/dist/nile-option/nile-option.esm.js +3 -3
  63. package/dist/nile-option-group/index.cjs.js +2 -0
  64. package/dist/nile-option-group/index.cjs.js.map +1 -0
  65. package/dist/nile-option-group/index.esm.js +1 -0
  66. package/dist/nile-option-group/nile-option-group.cjs.js +2 -0
  67. package/dist/nile-option-group/nile-option-group.cjs.js.map +1 -0
  68. package/dist/nile-option-group/nile-option-group.css.cjs.js +2 -0
  69. package/dist/nile-option-group/nile-option-group.css.cjs.js.map +1 -0
  70. package/dist/nile-option-group/nile-option-group.css.esm.js +46 -0
  71. package/dist/nile-option-group/nile-option-group.esm.js +14 -0
  72. package/dist/nile-option-group/nile-option-group.interface.cjs.js +2 -0
  73. package/dist/nile-option-group/nile-option-group.interface.cjs.js.map +1 -0
  74. package/dist/nile-option-group/nile-option-group.interface.esm.js +1 -0
  75. package/dist/nile-pagination/nile-pagination.cjs.js +1 -1
  76. package/dist/nile-pagination/nile-pagination.cjs.js.map +1 -1
  77. package/dist/nile-pagination/nile-pagination.css.cjs.js +1 -1
  78. package/dist/nile-pagination/nile-pagination.css.cjs.js.map +1 -1
  79. package/dist/nile-pagination/nile-pagination.css.esm.js +9 -2
  80. package/dist/nile-pagination/nile-pagination.esm.js +3 -1
  81. package/dist/nile-select/nile-select.cjs.js +1 -1
  82. package/dist/nile-select/nile-select.cjs.js.map +1 -1
  83. package/dist/nile-select/nile-select.esm.js +2 -2
  84. package/dist/nile-select/nile-select.interface.cjs.js +2 -0
  85. package/dist/nile-select/nile-select.interface.cjs.js.map +1 -0
  86. package/dist/nile-select/nile-select.interface.esm.js +1 -0
  87. package/dist/nile-table-body/nile-table-body.cjs.js +1 -1
  88. package/dist/nile-table-body/nile-table-body.cjs.js.map +1 -1
  89. package/dist/nile-table-body/nile-table-body.esm.js +2 -1
  90. package/dist/nile-table-cell-item/nile-table-cell-item.cjs.js +1 -1
  91. package/dist/nile-table-cell-item/nile-table-cell-item.cjs.js.map +1 -1
  92. package/dist/nile-table-cell-item/nile-table-cell-item.esm.js +1 -1
  93. package/dist/nile-table-header-item/nile-table-header-item.cjs.js +1 -1
  94. package/dist/nile-table-header-item/nile-table-header-item.cjs.js.map +1 -1
  95. package/dist/nile-table-header-item/nile-table-header-item.esm.js +2 -2
  96. package/dist/nile-virtual-select/renderer.cjs.js +1 -1
  97. package/dist/nile-virtual-select/renderer.cjs.js.map +1 -1
  98. package/dist/nile-virtual-select/renderer.esm.js +13 -12
  99. package/dist/src/index.d.ts +1 -0
  100. package/dist/src/index.js +1 -0
  101. package/dist/src/index.js.map +1 -1
  102. package/dist/src/internal/resizable-table-helper.d.ts +5 -0
  103. package/dist/src/internal/resizable-table-helper.js +27 -4
  104. package/dist/src/internal/resizable-table-helper.js.map +1 -1
  105. package/dist/src/nile-code-editor/nile-code-editor.d.ts +5 -0
  106. package/dist/src/nile-code-editor/nile-code-editor.js +44 -7
  107. package/dist/src/nile-code-editor/nile-code-editor.js.map +1 -1
  108. package/dist/src/nile-code-editor/theme.d.ts +15 -0
  109. package/dist/src/nile-code-editor/theme.js +17 -2
  110. package/dist/src/nile-code-editor/theme.js.map +1 -1
  111. package/dist/src/nile-file-preview/nile-file-preview.css.js +201 -182
  112. package/dist/src/nile-file-preview/nile-file-preview.css.js.map +1 -1
  113. package/dist/src/nile-file-preview/nile-file-preview.d.ts +6 -2
  114. package/dist/src/nile-file-preview/nile-file-preview.js +49 -20
  115. package/dist/src/nile-file-preview/nile-file-preview.js.map +1 -1
  116. package/dist/src/nile-file-preview/nile-file-preview.template.d.ts +3 -2
  117. package/dist/src/nile-file-preview/nile-file-preview.template.js +58 -62
  118. package/dist/src/nile-file-preview/nile-file-preview.template.js.map +1 -1
  119. package/dist/src/nile-file-preview/types/nile-file-preview.enums.d.ts +4 -3
  120. package/dist/src/nile-file-preview/types/nile-file-preview.enums.js +3 -2
  121. package/dist/src/nile-file-preview/types/nile-file-preview.enums.js.map +1 -1
  122. package/dist/src/nile-file-preview/utils/nile-file-preview.util.d.ts +4 -0
  123. package/dist/src/nile-file-preview/utils/nile-file-preview.util.js +25 -0
  124. package/dist/src/nile-file-preview/utils/nile-file-preview.util.js.map +1 -1
  125. package/dist/src/nile-file-upload/nile-file-upload.css.js +140 -87
  126. package/dist/src/nile-file-upload/nile-file-upload.css.js.map +1 -1
  127. package/dist/src/nile-file-upload/nile-file-upload.d.ts +4 -1
  128. package/dist/src/nile-file-upload/nile-file-upload.js +30 -20
  129. package/dist/src/nile-file-upload/nile-file-upload.js.map +1 -1
  130. package/dist/src/nile-file-upload/nile-file-upload.template.d.ts +7 -5
  131. package/dist/src/nile-file-upload/nile-file-upload.template.js +69 -115
  132. package/dist/src/nile-file-upload/nile-file-upload.template.js.map +1 -1
  133. package/dist/src/nile-file-upload/types/file-upload.enums.d.ts +11 -4
  134. package/dist/src/nile-file-upload/types/file-upload.enums.js +8 -1
  135. package/dist/src/nile-file-upload/types/file-upload.enums.js.map +1 -1
  136. package/dist/src/nile-file-upload/utils/drag-drop.util.d.ts +2 -4
  137. package/dist/src/nile-file-upload/utils/drag-drop.util.js +18 -21
  138. package/dist/src/nile-file-upload/utils/drag-drop.util.js.map +1 -1
  139. package/dist/src/nile-file-upload/utils/file-validation.util.d.ts +3 -1
  140. package/dist/src/nile-file-upload/utils/file-validation.util.js +82 -32
  141. package/dist/src/nile-file-upload/utils/file-validation.util.js.map +1 -1
  142. package/dist/src/nile-input/nile-input.css.js +0 -1
  143. package/dist/src/nile-input/nile-input.css.js.map +1 -1
  144. package/dist/src/nile-option/nile-option.d.ts +1 -0
  145. package/dist/src/nile-option/nile-option.js +6 -1
  146. package/dist/src/nile-option/nile-option.js.map +1 -1
  147. package/dist/src/nile-option-group/index.d.ts +1 -0
  148. package/dist/src/nile-option-group/index.js +2 -0
  149. package/dist/src/nile-option-group/index.js.map +1 -0
  150. package/dist/src/nile-option-group/nile-option-group.css.d.ts +12 -0
  151. package/dist/src/nile-option-group/nile-option-group.css.js +58 -0
  152. package/dist/src/nile-option-group/nile-option-group.css.js.map +1 -0
  153. package/dist/src/nile-option-group/nile-option-group.d.ts +23 -0
  154. package/dist/src/nile-option-group/nile-option-group.interface.d.ts +22 -0
  155. package/dist/src/nile-option-group/nile-option-group.interface.js +2 -0
  156. package/dist/src/nile-option-group/nile-option-group.interface.js.map +1 -0
  157. package/dist/src/nile-option-group/nile-option-group.js +76 -0
  158. package/dist/src/nile-option-group/nile-option-group.js.map +1 -0
  159. package/dist/src/nile-pagination/nile-pagination.css.js +7 -0
  160. package/dist/src/nile-pagination/nile-pagination.css.js.map +1 -1
  161. package/dist/src/nile-pagination/nile-pagination.js +3 -1
  162. package/dist/src/nile-pagination/nile-pagination.js.map +1 -1
  163. package/dist/src/nile-select/nile-select.d.ts +6 -0
  164. package/dist/src/nile-select/nile-select.interface.d.ts +5 -0
  165. package/dist/src/nile-select/nile-select.interface.js +2 -0
  166. package/dist/src/nile-select/nile-select.interface.js.map +1 -0
  167. package/dist/src/nile-select/nile-select.js +59 -1
  168. package/dist/src/nile-select/nile-select.js.map +1 -1
  169. package/dist/src/nile-table-body/nile-table-body.d.ts +1 -0
  170. package/dist/src/nile-table-body/nile-table-body.js +4 -0
  171. package/dist/src/nile-table-body/nile-table-body.js.map +1 -1
  172. package/dist/src/nile-table-cell-item/nile-table-cell-item.d.ts +2 -1
  173. package/dist/src/nile-table-cell-item/nile-table-cell-item.js +12 -1
  174. package/dist/src/nile-table-cell-item/nile-table-cell-item.js.map +1 -1
  175. package/dist/src/nile-table-header-item/nile-table-header-item.d.ts +2 -1
  176. package/dist/src/nile-table-header-item/nile-table-header-item.js +12 -1
  177. package/dist/src/nile-table-header-item/nile-table-header-item.js.map +1 -1
  178. package/dist/src/nile-virtual-select/renderer.js +3 -0
  179. package/dist/src/nile-virtual-select/renderer.js.map +1 -1
  180. package/dist/tsconfig.tsbuildinfo +1 -1
  181. package/package.json +3 -2
  182. package/src/index.ts +1 -1
  183. package/src/internal/resizable-table-helper.ts +31 -8
  184. package/src/nile-code-editor/nile-code-editor.ts +49 -9
  185. package/src/nile-code-editor/theme.ts +19 -3
  186. package/src/nile-file-preview/nile-file-preview.css.ts +202 -183
  187. package/src/nile-file-preview/nile-file-preview.template.ts +66 -63
  188. package/src/nile-file-preview/nile-file-preview.ts +54 -22
  189. package/src/nile-file-preview/types/nile-file-preview.enums.ts +4 -3
  190. package/src/nile-file-preview/utils/nile-file-preview.util.ts +25 -0
  191. package/src/nile-file-upload/nile-file-upload.css.ts +141 -88
  192. package/src/nile-file-upload/nile-file-upload.template.ts +133 -121
  193. package/src/nile-file-upload/nile-file-upload.ts +30 -18
  194. package/src/nile-file-upload/types/file-upload.enums.ts +9 -2
  195. package/src/nile-file-upload/utils/drag-drop.util.ts +25 -25
  196. package/src/nile-file-upload/utils/file-validation.util.ts +98 -45
  197. package/src/nile-input/nile-input.css.ts +0 -1
  198. package/src/nile-option/nile-option.ts +4 -1
  199. package/src/nile-option-group/index.ts +1 -0
  200. package/src/nile-option-group/nile-option-group.css.ts +60 -0
  201. package/src/nile-option-group/nile-option-group.interface.ts +25 -0
  202. package/src/nile-option-group/nile-option-group.ts +84 -0
  203. package/src/nile-pagination/nile-pagination.css.ts +7 -0
  204. package/src/nile-pagination/nile-pagination.ts +3 -1
  205. package/src/nile-select/nile-select.interface.ts +5 -0
  206. package/src/nile-select/nile-select.ts +74 -2
  207. package/src/nile-table-body/nile-table-body.ts +2 -0
  208. package/src/nile-table-cell-item/nile-table-cell-item.ts +15 -1
  209. package/src/nile-table-header-item/nile-table-header-item.ts +15 -1
  210. package/src/nile-virtual-select/renderer.ts +3 -0
  211. 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
- let { allowMultiple, uploadedFiles, errorMessage, requestUpdate } = nileFileUpload;
27
-
28
- if (!allowMultiple) {
29
- const total = uploadedFiles.length + files.length;
30
- if (total > 1) {
31
- errorMessage = FileUploadError.MULTIPLE_NOT_ALLOWED;
32
- requestUpdate();
33
- return;
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 newFiles = files;
38
-
39
- if (!nileFileUpload.allowDuplicates) {
40
- newFiles = files.filter(file =>
41
- !nileFileUpload.uploadedFiles.some(
42
- uploaded =>
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
- if (newFiles.length === 0) {
50
- nileFileUpload.errorMessage = FileUploadError.DUPLICATES_NOT_ALLOWED;
51
- nileFileUpload.requestUpdate();
52
- return;
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
- nileFileUpload.uploadedFiles = [...nileFileUpload.uploadedFiles, ...newFiles];
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
- uploadRequests.delete(file);
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
+ }
@@ -541,7 +541,6 @@ export const styles = css`
541
541
  }
542
542
 
543
543
  .input__password {
544
- font-family: 'disc';
545
544
  letter-spacing: 2px;
546
545
  }
547
546
 
@@ -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
+ }
@@ -263,6 +263,13 @@ export const styles = css`
263
263
  transform: rotate(180deg);
264
264
  }
265
265
 
266
+ .prev-button::part(base) {
267
+ border: 1px solid var(--nile-colors-neutral-500, var(--ng-colors-border-primary));
268
+ }
269
+
270
+ .next-button::part(base) {
271
+ border: 1px solid var(--nile-colors-neutral-500, var(--ng-colors-border-primary));
272
+ }
266
273
 
267
274
  `;
268
275
 
@@ -207,6 +207,7 @@ private renderCompactRangeText(): TemplateResult {
207
207
  variant="tertiary"
208
208
  ?disabled=${this.currentPage === 1 || this.disabled}
209
209
  @click=${() => this.goToPage(this.currentPage - 1)}
210
+ class="prev-button"
210
211
  >
211
212
  <nile-icon name="var(--nile-icon-arrow-left, var(--ng-icon-chevron-left))" method="var(--nile-svg-method-fill, var(--ng-svg-method-stroke))" size="14"></nile-icon>
212
213
  </nile-button>
@@ -221,8 +222,9 @@ private renderCompactRangeText(): TemplateResult {
221
222
  variant="tertiary"
222
223
  ?disabled=${this.currentPage === this.totalPages || this.disabled}
223
224
  @click=${() => this.goToPage(this.currentPage + 1)}
225
+ class="next-button"
224
226
  >
225
- <nile-icon name="var(--nile-icon-arrow-right, var(--ng-chevron-right))" method="var(--nile-svg-method-fill, var(--ng-svg-method-stroke))" size="14"></nile-icon>
227
+ <nile-icon name="var(--nile-icon-arrow-right, var(--ng-icon-chevron-right))" method="var(--nile-svg-method-fill, var(--ng-svg-method-stroke))" size="14"></nile-icon>
226
228
  </nile-button>
227
229
  </li>
228
230
  `;
@@ -0,0 +1,5 @@
1
+ export interface GroupAttributes {
2
+ name: string;
3
+ data: any;
4
+ element: HTMLElement;
5
+ }
@@ -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