primeng 17.15.0 → 17.16.0

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 (215) hide show
  1. package/api/megamenuitem.d.ts +4 -0
  2. package/api/primengconfig.d.ts +1 -1
  3. package/api/treenode.d.ts +4 -0
  4. package/autocomplete/autocomplete.d.ts +11 -2
  5. package/breadcrumb/breadcrumb.interface.d.ts +11 -0
  6. package/calendar/calendar.d.ts +13 -2
  7. package/cascadeselect/cascadeselect.d.ts +19 -1
  8. package/cascadeselect/cascadeselect.interface.d.ts +4 -0
  9. package/checkbox/checkbox.d.ts +9 -3
  10. package/chips/chips.d.ts +9 -2
  11. package/dropdown/dropdown.d.ts +31 -3
  12. package/esm2022/api/megamenuitem.mjs +1 -1
  13. package/esm2022/api/primengconfig.mjs +3 -3
  14. package/esm2022/api/treenode.mjs +1 -1
  15. package/esm2022/autocomplete/autocomplete.mjs +20 -9
  16. package/esm2022/breadcrumb/breadcrumb.interface.mjs +1 -1
  17. package/esm2022/breadcrumb/breadcrumb.mjs +1 -1
  18. package/esm2022/calendar/calendar.mjs +65 -9
  19. package/esm2022/cascadeselect/cascadeselect.interface.mjs +1 -1
  20. package/esm2022/cascadeselect/cascadeselect.mjs +61 -12
  21. package/esm2022/checkbox/checkbox.mjs +32 -10
  22. package/esm2022/chips/chips.mjs +20 -10
  23. package/esm2022/dropdown/dropdown.mjs +105 -26
  24. package/esm2022/dynamicdialog/dynamicdialog.mjs +3 -3
  25. package/esm2022/fileupload/fileupload.mjs +123 -105
  26. package/esm2022/icons/blank/blank.mjs +25 -0
  27. package/esm2022/icons/blank/primeng-icons-blank.mjs +5 -0
  28. package/esm2022/icons/blank/public_api.mjs +2 -0
  29. package/esm2022/inputmask/inputmask.mjs +31 -13
  30. package/esm2022/inputnumber/inputnumber.mjs +13 -4
  31. package/esm2022/inputotp/inputotp.mjs +3 -3
  32. package/esm2022/inputtext/inputtext.mjs +22 -7
  33. package/esm2022/inputtextarea/inputtextarea.mjs +17 -6
  34. package/esm2022/megamenu/megamenu.interface.mjs +1 -1
  35. package/esm2022/megamenu/megamenu.mjs +2 -2
  36. package/esm2022/menu/menu.mjs +18 -5
  37. package/esm2022/menubar/menubar.interface.mjs +1 -1
  38. package/esm2022/menubar/menubar.mjs +3 -3
  39. package/esm2022/multiselect/multiselect.mjs +83 -30
  40. package/esm2022/organizationchart/organizationchart.mjs +43 -27
  41. package/esm2022/paginator/paginator.mjs +3 -3
  42. package/esm2022/panelmenu/panelmenu.interface.mjs +1 -1
  43. package/esm2022/panelmenu/panelmenu.mjs +51 -41
  44. package/esm2022/password/password.mjs +22 -5
  45. package/esm2022/radiobutton/radiobutton.mjs +32 -10
  46. package/esm2022/scroller/scroller.mjs +4 -4
  47. package/esm2022/splitbutton/splitbutton.mjs +13 -13
  48. package/esm2022/table/table.mjs +3 -3
  49. package/esm2022/tieredmenu/tieredmenu.mjs +19 -12
  50. package/esm2022/timeline/timeline.mjs +2 -2
  51. package/esm2022/tree/tree.mjs +53 -13
  52. package/esm2022/treeselect/treeselect.mjs +12 -4
  53. package/esm2022/treetable/treetable.mjs +8 -6
  54. package/esm2022/tristatecheckbox/tristatecheckbox.mjs +20 -10
  55. package/fesm2022/primeng-api.mjs +2 -2
  56. package/fesm2022/primeng-api.mjs.map +1 -1
  57. package/fesm2022/primeng-autocomplete.mjs +19 -8
  58. package/fesm2022/primeng-autocomplete.mjs.map +1 -1
  59. package/fesm2022/primeng-breadcrumb.mjs.map +1 -1
  60. package/fesm2022/primeng-calendar.mjs +64 -8
  61. package/fesm2022/primeng-calendar.mjs.map +1 -1
  62. package/fesm2022/primeng-cascadeselect.mjs +60 -11
  63. package/fesm2022/primeng-cascadeselect.mjs.map +1 -1
  64. package/fesm2022/primeng-checkbox.mjs +31 -9
  65. package/fesm2022/primeng-checkbox.mjs.map +1 -1
  66. package/fesm2022/primeng-chips.mjs +19 -9
  67. package/fesm2022/primeng-chips.mjs.map +1 -1
  68. package/fesm2022/primeng-dropdown.mjs +104 -25
  69. package/fesm2022/primeng-dropdown.mjs.map +1 -1
  70. package/fesm2022/primeng-dynamicdialog.mjs +2 -2
  71. package/fesm2022/primeng-dynamicdialog.mjs.map +1 -1
  72. package/fesm2022/primeng-fileupload.mjs +122 -104
  73. package/fesm2022/primeng-fileupload.mjs.map +1 -1
  74. package/fesm2022/primeng-icons-blank.mjs +32 -0
  75. package/fesm2022/primeng-icons-blank.mjs.map +1 -0
  76. package/fesm2022/primeng-inputmask.mjs +30 -12
  77. package/fesm2022/primeng-inputmask.mjs.map +1 -1
  78. package/fesm2022/primeng-inputnumber.mjs +12 -3
  79. package/fesm2022/primeng-inputnumber.mjs.map +1 -1
  80. package/fesm2022/primeng-inputotp.mjs +2 -2
  81. package/fesm2022/primeng-inputotp.mjs.map +1 -1
  82. package/fesm2022/primeng-inputtext.mjs +21 -6
  83. package/fesm2022/primeng-inputtext.mjs.map +1 -1
  84. package/fesm2022/primeng-inputtextarea.mjs +16 -5
  85. package/fesm2022/primeng-inputtextarea.mjs.map +1 -1
  86. package/fesm2022/primeng-megamenu.mjs +1 -1
  87. package/fesm2022/primeng-megamenu.mjs.map +1 -1
  88. package/fesm2022/primeng-menu.mjs +17 -4
  89. package/fesm2022/primeng-menu.mjs.map +1 -1
  90. package/fesm2022/primeng-menubar.mjs +2 -2
  91. package/fesm2022/primeng-menubar.mjs.map +1 -1
  92. package/fesm2022/primeng-multiselect.mjs +82 -29
  93. package/fesm2022/primeng-multiselect.mjs.map +1 -1
  94. package/fesm2022/primeng-organizationchart.mjs +42 -26
  95. package/fesm2022/primeng-organizationchart.mjs.map +1 -1
  96. package/fesm2022/primeng-paginator.mjs +2 -2
  97. package/fesm2022/primeng-paginator.mjs.map +1 -1
  98. package/fesm2022/primeng-panelmenu.mjs +50 -40
  99. package/fesm2022/primeng-panelmenu.mjs.map +1 -1
  100. package/fesm2022/primeng-password.mjs +21 -4
  101. package/fesm2022/primeng-password.mjs.map +1 -1
  102. package/fesm2022/primeng-radiobutton.mjs +31 -9
  103. package/fesm2022/primeng-radiobutton.mjs.map +1 -1
  104. package/fesm2022/primeng-scroller.mjs +3 -3
  105. package/fesm2022/primeng-scroller.mjs.map +1 -1
  106. package/fesm2022/primeng-splitbutton.mjs +12 -12
  107. package/fesm2022/primeng-splitbutton.mjs.map +1 -1
  108. package/fesm2022/primeng-table.mjs +2 -2
  109. package/fesm2022/primeng-table.mjs.map +1 -1
  110. package/fesm2022/primeng-tieredmenu.mjs +18 -11
  111. package/fesm2022/primeng-tieredmenu.mjs.map +1 -1
  112. package/fesm2022/primeng-timeline.mjs +2 -2
  113. package/fesm2022/primeng-timeline.mjs.map +1 -1
  114. package/fesm2022/primeng-tree.mjs +52 -12
  115. package/fesm2022/primeng-tree.mjs.map +1 -1
  116. package/fesm2022/primeng-treeselect.mjs +11 -3
  117. package/fesm2022/primeng-treeselect.mjs.map +1 -1
  118. package/fesm2022/primeng-treetable.mjs +7 -5
  119. package/fesm2022/primeng-treetable.mjs.map +1 -1
  120. package/fesm2022/primeng-tristatecheckbox.mjs +19 -9
  121. package/fesm2022/primeng-tristatecheckbox.mjs.map +1 -1
  122. package/fileupload/fileupload.d.ts +2 -0
  123. package/icons/blank/blank.d.ts +6 -0
  124. package/icons/blank/index.d.ts +5 -0
  125. package/icons/blank/public_api.d.ts +1 -0
  126. package/inputmask/inputmask.d.ts +13 -3
  127. package/inputnumber/inputnumber.d.ts +6 -1
  128. package/inputotp/inputotp.d.ts +1 -1
  129. package/inputtext/inputtext.d.ts +14 -3
  130. package/inputtextarea/inputtextarea.d.ts +10 -3
  131. package/megamenu/megamenu.interface.d.ts +12 -0
  132. package/menu/menu.d.ts +1 -0
  133. package/menubar/menubar.interface.d.ts +17 -0
  134. package/multiselect/multiselect.d.ts +21 -1
  135. package/organizationchart/organizationchart.d.ts +10 -2
  136. package/package.json +202 -196
  137. package/paginator/paginator.d.ts +4 -4
  138. package/panelmenu/panelmenu.d.ts +1 -0
  139. package/panelmenu/panelmenu.interface.d.ts +12 -0
  140. package/password/password.d.ts +12 -2
  141. package/radiobutton/radiobutton.d.ts +9 -2
  142. package/resources/components/timeline/timeline.css +2 -0
  143. package/resources/themes/arya-blue/theme.css +117 -1
  144. package/resources/themes/arya-green/theme.css +117 -1
  145. package/resources/themes/arya-orange/theme.css +117 -1
  146. package/resources/themes/arya-purple/theme.css +117 -1
  147. package/resources/themes/aura-dark-amber/theme.css +118 -2
  148. package/resources/themes/aura-dark-blue/theme.css +118 -2
  149. package/resources/themes/aura-dark-cyan/theme.css +118 -2
  150. package/resources/themes/aura-dark-green/theme.css +118 -2
  151. package/resources/themes/aura-dark-indigo/theme.css +118 -2
  152. package/resources/themes/aura-dark-lime/theme.css +118 -2
  153. package/resources/themes/aura-dark-noir/theme.css +118 -2
  154. package/resources/themes/aura-dark-pink/theme.css +118 -2
  155. package/resources/themes/aura-dark-purple/theme.css +118 -2
  156. package/resources/themes/aura-dark-teal/theme.css +118 -2
  157. package/resources/themes/aura-light-amber/theme.css +118 -2
  158. package/resources/themes/aura-light-blue/theme.css +118 -2
  159. package/resources/themes/aura-light-cyan/theme.css +118 -2
  160. package/resources/themes/aura-light-green/theme.css +118 -2
  161. package/resources/themes/aura-light-indigo/theme.css +118 -2
  162. package/resources/themes/aura-light-lime/theme.css +118 -2
  163. package/resources/themes/aura-light-noir/theme.css +118 -2
  164. package/resources/themes/aura-light-pink/theme.css +118 -2
  165. package/resources/themes/aura-light-purple/theme.css +118 -2
  166. package/resources/themes/aura-light-teal/theme.css +118 -2
  167. package/resources/themes/bootstrap4-dark-blue/theme.css +117 -1
  168. package/resources/themes/bootstrap4-dark-purple/theme.css +117 -1
  169. package/resources/themes/bootstrap4-light-blue/theme.css +117 -1
  170. package/resources/themes/bootstrap4-light-purple/theme.css +117 -1
  171. package/resources/themes/fluent-light/theme.css +117 -1
  172. package/resources/themes/lara-dark-blue/theme.css +117 -1
  173. package/resources/themes/lara-dark-indigo/theme.css +117 -1
  174. package/resources/themes/lara-dark-purple/theme.css +117 -1
  175. package/resources/themes/lara-dark-teal/theme.css +117 -1
  176. package/resources/themes/lara-light-blue/theme.css +117 -1
  177. package/resources/themes/lara-light-indigo/theme.css +117 -1
  178. package/resources/themes/lara-light-purple/theme.css +117 -1
  179. package/resources/themes/lara-light-teal/theme.css +117 -1
  180. package/resources/themes/luna-amber/theme.css +117 -1
  181. package/resources/themes/luna-blue/theme.css +117 -1
  182. package/resources/themes/luna-green/theme.css +117 -1
  183. package/resources/themes/luna-pink/theme.css +117 -1
  184. package/resources/themes/md-dark-deeppurple/theme.css +131 -4
  185. package/resources/themes/md-dark-indigo/theme.css +131 -4
  186. package/resources/themes/md-light-deeppurple/theme.css +131 -4
  187. package/resources/themes/md-light-indigo/theme.css +131 -4
  188. package/resources/themes/mdc-dark-deeppurple/theme.css +131 -4
  189. package/resources/themes/mdc-dark-indigo/theme.css +131 -4
  190. package/resources/themes/mdc-light-deeppurple/theme.css +131 -4
  191. package/resources/themes/mdc-light-indigo/theme.css +131 -4
  192. package/resources/themes/mira/theme.css +117 -1
  193. package/resources/themes/nano/theme.css +117 -1
  194. package/resources/themes/nova/theme.css +117 -1
  195. package/resources/themes/nova-accent/theme.css +117 -1
  196. package/resources/themes/nova-alt/theme.css +117 -1
  197. package/resources/themes/rhea/theme.css +117 -1
  198. package/resources/themes/saga-blue/theme.css +117 -1
  199. package/resources/themes/saga-green/theme.css +117 -1
  200. package/resources/themes/saga-orange/theme.css +117 -1
  201. package/resources/themes/saga-purple/theme.css +117 -1
  202. package/resources/themes/soho-dark/theme.css +117 -1
  203. package/resources/themes/soho-light/theme.css +117 -1
  204. package/resources/themes/tailwind-light/theme.css +117 -1
  205. package/resources/themes/vela-blue/theme.css +117 -1
  206. package/resources/themes/vela-green/theme.css +117 -1
  207. package/resources/themes/vela-orange/theme.css +117 -1
  208. package/resources/themes/vela-purple/theme.css +117 -1
  209. package/resources/themes/viva-dark/theme.css +117 -1
  210. package/resources/themes/viva-light/theme.css +117 -1
  211. package/tieredmenu/tieredmenu.d.ts +4 -3
  212. package/tree/tree.d.ts +9 -2
  213. package/treeselect/treeselect.d.ts +7 -1
  214. package/treetable/treetable.d.ts +2 -1
  215. package/tristatecheckbox/tristatecheckbox.d.ts +9 -3
@@ -294,11 +294,13 @@ class FileUpload {
294
294
  dragHighlight;
295
295
  msgs;
296
296
  fileTemplate;
297
+ headerTemplate;
297
298
  contentTemplate;
298
299
  toolbarTemplate;
299
300
  chooseIconTemplate;
300
301
  uploadIconTemplate;
301
302
  cancelIconTemplate;
303
+ emptyTemplate;
302
304
  uploadedFileCount = 0;
303
305
  focus;
304
306
  uploading;
@@ -319,6 +321,9 @@ class FileUpload {
319
321
  ngAfterContentInit() {
320
322
  this.templates?.forEach((item) => {
321
323
  switch (item.getType()) {
324
+ case 'header':
325
+ this.headerTemplate = item.template;
326
+ break;
322
327
  case 'file':
323
328
  this.fileTemplate = item.template;
324
329
  break;
@@ -337,6 +342,9 @@ class FileUpload {
337
342
  case 'cancelicon':
338
343
  this.cancelIconTemplate = item.template;
339
344
  break;
345
+ case 'empty':
346
+ this.emptyTemplate = item.template;
347
+ break;
340
348
  default:
341
349
  this.fileTemplate = item.template;
342
350
  break;
@@ -680,61 +688,63 @@ class FileUpload {
680
688
  }
681
689
  }
682
690
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FileUpload, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.DomSanitizer }, { token: i0.NgZone }, { token: i2.HttpClient }, { token: i0.ChangeDetectorRef }, { token: i3.PrimeNGConfig }], target: i0.ɵɵFactoryTarget.Component });
683
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.1", type: FileUpload, selector: "p-fileUpload", inputs: { name: "name", url: "url", method: "method", multiple: ["multiple", "multiple", booleanAttribute], accept: "accept", disabled: ["disabled", "disabled", booleanAttribute], auto: ["auto", "auto", booleanAttribute], withCredentials: ["withCredentials", "withCredentials", booleanAttribute], maxFileSize: ["maxFileSize", "maxFileSize", numberAttribute], invalidFileSizeMessageSummary: "invalidFileSizeMessageSummary", invalidFileSizeMessageDetail: "invalidFileSizeMessageDetail", invalidFileTypeMessageSummary: "invalidFileTypeMessageSummary", invalidFileTypeMessageDetail: "invalidFileTypeMessageDetail", invalidFileLimitMessageDetail: "invalidFileLimitMessageDetail", invalidFileLimitMessageSummary: "invalidFileLimitMessageSummary", style: "style", styleClass: "styleClass", previewWidth: ["previewWidth", "previewWidth", numberAttribute], chooseLabel: "chooseLabel", uploadLabel: "uploadLabel", cancelLabel: "cancelLabel", chooseIcon: "chooseIcon", uploadIcon: "uploadIcon", cancelIcon: "cancelIcon", showUploadButton: ["showUploadButton", "showUploadButton", booleanAttribute], showCancelButton: ["showCancelButton", "showCancelButton", booleanAttribute], mode: "mode", headers: "headers", customUpload: ["customUpload", "customUpload", booleanAttribute], fileLimit: ["fileLimit", "fileLimit", numberAttribute], uploadStyleClass: "uploadStyleClass", cancelStyleClass: "cancelStyleClass", removeStyleClass: "removeStyleClass", chooseStyleClass: "chooseStyleClass", files: "files" }, outputs: { onBeforeUpload: "onBeforeUpload", onSend: "onSend", onUpload: "onUpload", onError: "onError", onClear: "onClear", onRemove: "onRemove", onSelect: "onSelect", onProgress: "onProgress", uploadHandler: "uploadHandler", onImageError: "onImageError" }, host: { classAttribute: "p-element" }, queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "advancedFileInput", first: true, predicate: ["advancedfileinput"], descendants: true }, { propertyName: "basicFileInput", first: true, predicate: ["basicfileinput"], descendants: true }, { propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: `
691
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.3.1", type: FileUpload, selector: "p-fileUpload", inputs: { name: "name", url: "url", method: "method", multiple: ["multiple", "multiple", booleanAttribute], accept: "accept", disabled: ["disabled", "disabled", booleanAttribute], auto: ["auto", "auto", booleanAttribute], withCredentials: ["withCredentials", "withCredentials", booleanAttribute], maxFileSize: ["maxFileSize", "maxFileSize", numberAttribute], invalidFileSizeMessageSummary: "invalidFileSizeMessageSummary", invalidFileSizeMessageDetail: "invalidFileSizeMessageDetail", invalidFileTypeMessageSummary: "invalidFileTypeMessageSummary", invalidFileTypeMessageDetail: "invalidFileTypeMessageDetail", invalidFileLimitMessageDetail: "invalidFileLimitMessageDetail", invalidFileLimitMessageSummary: "invalidFileLimitMessageSummary", style: "style", styleClass: "styleClass", previewWidth: ["previewWidth", "previewWidth", numberAttribute], chooseLabel: "chooseLabel", uploadLabel: "uploadLabel", cancelLabel: "cancelLabel", chooseIcon: "chooseIcon", uploadIcon: "uploadIcon", cancelIcon: "cancelIcon", showUploadButton: ["showUploadButton", "showUploadButton", booleanAttribute], showCancelButton: ["showCancelButton", "showCancelButton", booleanAttribute], mode: "mode", headers: "headers", customUpload: ["customUpload", "customUpload", booleanAttribute], fileLimit: ["fileLimit", "fileLimit", (value) => numberAttribute(value, null)], uploadStyleClass: "uploadStyleClass", cancelStyleClass: "cancelStyleClass", removeStyleClass: "removeStyleClass", chooseStyleClass: "chooseStyleClass", files: "files" }, outputs: { onBeforeUpload: "onBeforeUpload", onSend: "onSend", onUpload: "onUpload", onError: "onError", onClear: "onClear", onRemove: "onRemove", onSelect: "onSelect", onProgress: "onProgress", uploadHandler: "uploadHandler", onImageError: "onImageError" }, host: { classAttribute: "p-element" }, queries: [{ propertyName: "templates", predicate: PrimeTemplate }], viewQueries: [{ propertyName: "advancedFileInput", first: true, predicate: ["advancedfileinput"], descendants: true }, { propertyName: "basicFileInput", first: true, predicate: ["basicfileinput"], descendants: true }, { propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: `
684
692
  <div [ngClass]="'p-fileupload p-fileupload-advanced p-component'" [ngStyle]="style" [class]="styleClass" *ngIf="mode === 'advanced'" [attr.data-pc-name]="'fileupload'" [attr.data-pc-section]="'root'">
685
693
  <div class="p-fileupload-buttonbar" [attr.data-pc-section]="'buttonbar'">
686
- <span
687
- class="p-button p-component p-fileupload-choose"
688
- [ngClass]="{ 'p-focus': focus, 'p-disabled': disabled || isChooseDisabled() }"
689
- (focus)="onFocus()"
690
- (blur)="onBlur()"
691
- pRipple
692
- (click)="choose()"
693
- (keydown.enter)="choose()"
694
- tabindex="0"
695
- [class]="chooseStyleClass"
696
- [attr.data-pc-section]="'choosebutton'"
697
- >
698
- <input
699
- [attr.aria-label]="browseFilesLabel"
700
- #advancedfileinput
701
- type="file"
702
- (change)="onFileSelect($event)"
703
- [multiple]="multiple"
704
- [accept]="accept"
705
- [disabled]="disabled || isChooseDisabled()"
706
- [attr.title]="''"
707
- [attr.data-pc-section]="'input'"
708
- />
709
- <span *ngIf="chooseIcon" [ngClass]="'p-button-icon p-button-icon-left'" [class]="chooseIcon" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'"></span>
710
- <ng-container *ngIf="!chooseIcon">
711
- <PlusIcon *ngIf="!chooseIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'" />
712
- <span *ngIf="chooseIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'">
713
- <ng-template *ngTemplateOutlet="chooseIconTemplate"></ng-template>
714
- </span>
715
- </ng-container>
716
- <span class="p-button-label" [attr.data-pc-section]="'choosebuttonlabel'">{{ chooseButtonLabel }}</span>
717
- </span>
718
-
719
- <p-button *ngIf="!auto && showUploadButton" type="button" [label]="uploadButtonLabel" (onClick)="upload()" [disabled]="!hasFiles() || isFileLimitExceeded()" [styleClass]="uploadStyleClass">
720
- <span *ngIf="uploadIcon" [ngClass]="uploadIcon" [attr.aria-hidden]="true" class="p-button-icon p-button-icon-left"></span>
721
- <ng-container *ngIf="!uploadIcon">
722
- <UploadIcon *ngIf="!uploadIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" />
723
- <span *ngIf="uploadIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-hidden]="true">
724
- <ng-template *ngTemplateOutlet="uploadIconTemplate"></ng-template>
725
- </span>
726
- </ng-container>
727
- </p-button>
728
- <p-button *ngIf="!auto && showCancelButton" type="button" [label]="cancelButtonLabel" (onClick)="clear()" [disabled]="!hasFiles() || uploading" [styleClass]="cancelStyleClass">
729
- <span *ngIf="cancelIcon" [ngClass]="cancelIcon" class="p-button-icon p-button-icon-left"></span>
730
- <ng-container *ngIf="!cancelIcon">
731
- <TimesIcon *ngIf="!cancelIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" [attr.aria-hidden]="true" />
732
- <span *ngIf="cancelIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-hidden]="true">
733
- <ng-template *ngTemplateOutlet="cancelIconTemplate"></ng-template>
734
- </span>
735
- </ng-container>
736
- </p-button>
694
+ <ng-container *ngIf="!headerTemplate">
695
+ <span
696
+ class="p-button p-component p-fileupload-choose"
697
+ [ngClass]="{ 'p-focus': focus, 'p-disabled': disabled || isChooseDisabled() }"
698
+ (focus)="onFocus()"
699
+ (blur)="onBlur()"
700
+ pRipple
701
+ (click)="choose()"
702
+ (keydown.enter)="choose()"
703
+ tabindex="0"
704
+ [class]="chooseStyleClass"
705
+ [attr.data-pc-section]="'choosebutton'"
706
+ >
707
+ <input
708
+ [attr.aria-label]="browseFilesLabel"
709
+ #advancedfileinput
710
+ type="file"
711
+ (change)="onFileSelect($event)"
712
+ [multiple]="multiple"
713
+ [accept]="accept"
714
+ [disabled]="disabled || isChooseDisabled()"
715
+ [attr.title]="''"
716
+ [attr.data-pc-section]="'input'"
717
+ />
718
+ <span *ngIf="chooseIcon" [ngClass]="'p-button-icon p-button-icon-left'" [class]="chooseIcon" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'"></span>
719
+ <ng-container *ngIf="!chooseIcon">
720
+ <PlusIcon *ngIf="!chooseIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'" />
721
+ <span *ngIf="chooseIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'">
722
+ <ng-template *ngTemplateOutlet="chooseIconTemplate"></ng-template>
723
+ </span>
724
+ </ng-container>
725
+ <span class="p-button-label" [attr.data-pc-section]="'choosebuttonlabel'">{{ chooseButtonLabel }}</span>
726
+ </span>
737
727
 
728
+ <p-button *ngIf="!auto && showUploadButton" type="button" [label]="uploadButtonLabel" (onClick)="upload()" [disabled]="!hasFiles() || isFileLimitExceeded()" [styleClass]="uploadStyleClass">
729
+ <span *ngIf="uploadIcon" [ngClass]="uploadIcon" [attr.aria-hidden]="true" class="p-button-icon p-button-icon-left"></span>
730
+ <ng-container *ngIf="!uploadIcon">
731
+ <UploadIcon *ngIf="!uploadIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" />
732
+ <span *ngIf="uploadIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-hidden]="true">
733
+ <ng-template *ngTemplateOutlet="uploadIconTemplate"></ng-template>
734
+ </span>
735
+ </ng-container>
736
+ </p-button>
737
+ <p-button *ngIf="!auto && showCancelButton" type="button" [label]="cancelButtonLabel" (onClick)="clear()" [disabled]="!hasFiles() || uploading" [styleClass]="cancelStyleClass">
738
+ <span *ngIf="cancelIcon" [ngClass]="cancelIcon" class="p-button-icon p-button-icon-left"></span>
739
+ <ng-container *ngIf="!cancelIcon">
740
+ <TimesIcon *ngIf="!cancelIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" [attr.aria-hidden]="true" />
741
+ <span *ngIf="cancelIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-hidden]="true">
742
+ <ng-template *ngTemplateOutlet="cancelIconTemplate"></ng-template>
743
+ </span>
744
+ </ng-container>
745
+ </p-button>
746
+ </ng-container>
747
+ <ng-container *ngTemplateOutlet="headerTemplate"></ng-container>
738
748
  <ng-container *ngTemplateOutlet="toolbarTemplate"></ng-container>
739
749
  </div>
740
750
  <div #content class="p-fileupload-content" (dragenter)="onDragEnter($event)" (dragleave)="onDragLeave($event)" (drop)="onDrop($event)" [attr.data-pc-section]="'content'">
@@ -761,6 +771,9 @@ class FileUpload {
761
771
  </div>
762
772
  </div>
763
773
  <ng-container *ngTemplateOutlet="contentTemplate; context: { $implicit: files }"></ng-container>
774
+ <div *ngIf="emptyTemplate && !hasFiles() && !uploadedFileCount" class="p-fileupload-empty">
775
+ <ng-container *ngTemplateOutlet="emptyTemplate"></ng-container>
776
+ </div>
764
777
  </div>
765
778
  </div>
766
779
  <div class="p-fileupload p-fileupload-basic p-component" *ngIf="mode === 'basic'" [attr.data-pc-name]="'fileupload'">
@@ -816,58 +829,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImpor
816
829
  args: [{ selector: 'p-fileUpload', template: `
817
830
  <div [ngClass]="'p-fileupload p-fileupload-advanced p-component'" [ngStyle]="style" [class]="styleClass" *ngIf="mode === 'advanced'" [attr.data-pc-name]="'fileupload'" [attr.data-pc-section]="'root'">
818
831
  <div class="p-fileupload-buttonbar" [attr.data-pc-section]="'buttonbar'">
819
- <span
820
- class="p-button p-component p-fileupload-choose"
821
- [ngClass]="{ 'p-focus': focus, 'p-disabled': disabled || isChooseDisabled() }"
822
- (focus)="onFocus()"
823
- (blur)="onBlur()"
824
- pRipple
825
- (click)="choose()"
826
- (keydown.enter)="choose()"
827
- tabindex="0"
828
- [class]="chooseStyleClass"
829
- [attr.data-pc-section]="'choosebutton'"
830
- >
831
- <input
832
- [attr.aria-label]="browseFilesLabel"
833
- #advancedfileinput
834
- type="file"
835
- (change)="onFileSelect($event)"
836
- [multiple]="multiple"
837
- [accept]="accept"
838
- [disabled]="disabled || isChooseDisabled()"
839
- [attr.title]="''"
840
- [attr.data-pc-section]="'input'"
841
- />
842
- <span *ngIf="chooseIcon" [ngClass]="'p-button-icon p-button-icon-left'" [class]="chooseIcon" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'"></span>
843
- <ng-container *ngIf="!chooseIcon">
844
- <PlusIcon *ngIf="!chooseIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'" />
845
- <span *ngIf="chooseIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'">
846
- <ng-template *ngTemplateOutlet="chooseIconTemplate"></ng-template>
847
- </span>
848
- </ng-container>
849
- <span class="p-button-label" [attr.data-pc-section]="'choosebuttonlabel'">{{ chooseButtonLabel }}</span>
850
- </span>
851
-
852
- <p-button *ngIf="!auto && showUploadButton" type="button" [label]="uploadButtonLabel" (onClick)="upload()" [disabled]="!hasFiles() || isFileLimitExceeded()" [styleClass]="uploadStyleClass">
853
- <span *ngIf="uploadIcon" [ngClass]="uploadIcon" [attr.aria-hidden]="true" class="p-button-icon p-button-icon-left"></span>
854
- <ng-container *ngIf="!uploadIcon">
855
- <UploadIcon *ngIf="!uploadIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" />
856
- <span *ngIf="uploadIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-hidden]="true">
857
- <ng-template *ngTemplateOutlet="uploadIconTemplate"></ng-template>
858
- </span>
859
- </ng-container>
860
- </p-button>
861
- <p-button *ngIf="!auto && showCancelButton" type="button" [label]="cancelButtonLabel" (onClick)="clear()" [disabled]="!hasFiles() || uploading" [styleClass]="cancelStyleClass">
862
- <span *ngIf="cancelIcon" [ngClass]="cancelIcon" class="p-button-icon p-button-icon-left"></span>
863
- <ng-container *ngIf="!cancelIcon">
864
- <TimesIcon *ngIf="!cancelIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" [attr.aria-hidden]="true" />
865
- <span *ngIf="cancelIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-hidden]="true">
866
- <ng-template *ngTemplateOutlet="cancelIconTemplate"></ng-template>
867
- </span>
868
- </ng-container>
869
- </p-button>
832
+ <ng-container *ngIf="!headerTemplate">
833
+ <span
834
+ class="p-button p-component p-fileupload-choose"
835
+ [ngClass]="{ 'p-focus': focus, 'p-disabled': disabled || isChooseDisabled() }"
836
+ (focus)="onFocus()"
837
+ (blur)="onBlur()"
838
+ pRipple
839
+ (click)="choose()"
840
+ (keydown.enter)="choose()"
841
+ tabindex="0"
842
+ [class]="chooseStyleClass"
843
+ [attr.data-pc-section]="'choosebutton'"
844
+ >
845
+ <input
846
+ [attr.aria-label]="browseFilesLabel"
847
+ #advancedfileinput
848
+ type="file"
849
+ (change)="onFileSelect($event)"
850
+ [multiple]="multiple"
851
+ [accept]="accept"
852
+ [disabled]="disabled || isChooseDisabled()"
853
+ [attr.title]="''"
854
+ [attr.data-pc-section]="'input'"
855
+ />
856
+ <span *ngIf="chooseIcon" [ngClass]="'p-button-icon p-button-icon-left'" [class]="chooseIcon" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'"></span>
857
+ <ng-container *ngIf="!chooseIcon">
858
+ <PlusIcon *ngIf="!chooseIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'" />
859
+ <span *ngIf="chooseIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-label]="true" [attr.data-pc-section]="'chooseicon'">
860
+ <ng-template *ngTemplateOutlet="chooseIconTemplate"></ng-template>
861
+ </span>
862
+ </ng-container>
863
+ <span class="p-button-label" [attr.data-pc-section]="'choosebuttonlabel'">{{ chooseButtonLabel }}</span>
864
+ </span>
870
865
 
866
+ <p-button *ngIf="!auto && showUploadButton" type="button" [label]="uploadButtonLabel" (onClick)="upload()" [disabled]="!hasFiles() || isFileLimitExceeded()" [styleClass]="uploadStyleClass">
867
+ <span *ngIf="uploadIcon" [ngClass]="uploadIcon" [attr.aria-hidden]="true" class="p-button-icon p-button-icon-left"></span>
868
+ <ng-container *ngIf="!uploadIcon">
869
+ <UploadIcon *ngIf="!uploadIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" />
870
+ <span *ngIf="uploadIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-hidden]="true">
871
+ <ng-template *ngTemplateOutlet="uploadIconTemplate"></ng-template>
872
+ </span>
873
+ </ng-container>
874
+ </p-button>
875
+ <p-button *ngIf="!auto && showCancelButton" type="button" [label]="cancelButtonLabel" (onClick)="clear()" [disabled]="!hasFiles() || uploading" [styleClass]="cancelStyleClass">
876
+ <span *ngIf="cancelIcon" [ngClass]="cancelIcon" class="p-button-icon p-button-icon-left"></span>
877
+ <ng-container *ngIf="!cancelIcon">
878
+ <TimesIcon *ngIf="!cancelIconTemplate" [styleClass]="'p-button-icon p-button-icon-left'" [attr.aria-hidden]="true" />
879
+ <span *ngIf="cancelIconTemplate" class="p-button-icon p-button-icon-left" [attr.aria-hidden]="true">
880
+ <ng-template *ngTemplateOutlet="cancelIconTemplate"></ng-template>
881
+ </span>
882
+ </ng-container>
883
+ </p-button>
884
+ </ng-container>
885
+ <ng-container *ngTemplateOutlet="headerTemplate"></ng-container>
871
886
  <ng-container *ngTemplateOutlet="toolbarTemplate"></ng-container>
872
887
  </div>
873
888
  <div #content class="p-fileupload-content" (dragenter)="onDragEnter($event)" (dragleave)="onDragLeave($event)" (drop)="onDrop($event)" [attr.data-pc-section]="'content'">
@@ -894,6 +909,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImpor
894
909
  </div>
895
910
  </div>
896
911
  <ng-container *ngTemplateOutlet="contentTemplate; context: { $implicit: files }"></ng-container>
912
+ <div *ngIf="emptyTemplate && !hasFiles() && !uploadedFileCount" class="p-fileupload-empty">
913
+ <ng-container *ngTemplateOutlet="emptyTemplate"></ng-container>
914
+ </div>
897
915
  </div>
898
916
  </div>
899
917
  <div class="p-fileupload p-fileupload-basic p-component" *ngIf="mode === 'basic'" [attr.data-pc-name]="'fileupload'">
@@ -1020,7 +1038,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImpor
1020
1038
  args: [{ transform: booleanAttribute }]
1021
1039
  }], fileLimit: [{
1022
1040
  type: Input,
1023
- args: [{ transform: numberAttribute }]
1041
+ args: [{ transform: (value) => numberAttribute(value, null) }]
1024
1042
  }], uploadStyleClass: [{
1025
1043
  type: Input
1026
1044
  }], cancelStyleClass: [{