@skyux/forms 5.0.0 → 5.5.0-alpha.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 (210) hide show
  1. package/README.md +5 -4
  2. package/bundles/skyux-forms-testing.umd.js +7 -4
  3. package/bundles/skyux-forms.umd.js +343 -367
  4. package/documentation.json +1700 -1244
  5. package/esm2015/index.js +43 -0
  6. package/esm2015/index.js.map +1 -0
  7. package/esm2015/lib/modules/character-counter/character-counter-indicator.component.js +37 -0
  8. package/esm2015/lib/modules/character-counter/character-counter-indicator.component.js.map +1 -0
  9. package/esm2015/lib/modules/character-counter/character-counter.directive.js +83 -0
  10. package/esm2015/lib/modules/character-counter/character-counter.directive.js.map +1 -0
  11. package/esm2015/lib/modules/character-counter/character-counter.module.js +46 -0
  12. package/esm2015/lib/modules/character-counter/character-counter.module.js.map +1 -0
  13. package/esm2015/lib/modules/checkbox/checkbox-change.js +6 -0
  14. package/esm2015/lib/modules/checkbox/checkbox-change.js.map +1 -0
  15. package/esm2015/lib/modules/checkbox/checkbox-label.component.js +17 -0
  16. package/esm2015/lib/modules/checkbox/checkbox-label.component.js.map +1 -0
  17. package/esm2015/lib/modules/checkbox/checkbox-required-validator.directive.js +32 -0
  18. package/esm2015/lib/modules/checkbox/checkbox-required-validator.directive.js.map +1 -0
  19. package/esm2015/lib/modules/checkbox/checkbox.component.js +240 -0
  20. package/esm2015/lib/modules/checkbox/checkbox.component.js.map +1 -0
  21. package/esm2015/lib/modules/checkbox/checkbox.module.js +34 -0
  22. package/esm2015/lib/modules/checkbox/checkbox.module.js.map +1 -0
  23. package/esm2015/lib/modules/file-attachment/file-attachment-label.component.js +19 -0
  24. package/esm2015/lib/modules/file-attachment/file-attachment-label.component.js.map +1 -0
  25. package/esm2015/lib/modules/file-attachment/file-attachment.component.js +331 -0
  26. package/esm2015/lib/modules/file-attachment/file-attachment.component.js.map +1 -0
  27. package/esm2015/lib/modules/file-attachment/file-attachment.service.js +94 -0
  28. package/esm2015/lib/modules/file-attachment/file-attachment.service.js.map +1 -0
  29. package/esm2015/lib/modules/file-attachment/file-attachments.module.js +68 -0
  30. package/esm2015/lib/modules/file-attachment/file-attachments.module.js.map +1 -0
  31. package/esm2015/lib/modules/file-attachment/file-drop.component.js +223 -0
  32. package/esm2015/lib/modules/file-attachment/file-drop.component.js.map +1 -0
  33. package/esm2015/lib/modules/file-attachment/file-item-error-type.js +2 -0
  34. package/esm2015/lib/modules/file-attachment/file-item-error-type.js.map +1 -0
  35. package/esm2015/lib/modules/file-attachment/file-item.component.js +114 -0
  36. package/esm2015/lib/modules/file-attachment/file-item.component.js.map +1 -0
  37. package/esm2015/lib/modules/file-attachment/file-item.js +2 -0
  38. package/esm2015/lib/modules/file-attachment/file-item.js.map +1 -0
  39. package/esm2015/lib/modules/file-attachment/file-item.service.js +72 -0
  40. package/esm2015/lib/modules/file-attachment/file-item.service.js.map +1 -0
  41. package/esm2015/lib/modules/file-attachment/file-link.js +2 -0
  42. package/esm2015/lib/modules/file-attachment/file-link.js.map +1 -0
  43. package/esm2015/lib/modules/file-attachment/file-size.pipe.js +61 -0
  44. package/esm2015/lib/modules/file-attachment/file-size.pipe.js.map +1 -0
  45. package/esm2015/lib/modules/file-attachment/types/file-attachment-change.js +2 -0
  46. package/esm2015/lib/modules/file-attachment/types/file-attachment-change.js.map +1 -0
  47. package/esm2015/lib/modules/file-attachment/types/file-attachment-click.js +2 -0
  48. package/esm2015/lib/modules/file-attachment/types/file-attachment-click.js.map +1 -0
  49. package/esm2015/lib/modules/file-attachment/types/file-drop-change.js +2 -0
  50. package/esm2015/lib/modules/file-attachment/types/file-drop-change.js.map +1 -0
  51. package/esm2015/lib/modules/input-box/input-box-adapter.service.js +35 -0
  52. package/esm2015/lib/modules/input-box/input-box-adapter.service.js.map +1 -0
  53. package/esm2015/lib/modules/input-box/input-box-host.service.js +19 -0
  54. package/esm2015/lib/modules/input-box/input-box-host.service.js.map +1 -0
  55. package/esm2015/lib/modules/input-box/input-box-populate-args.js +2 -0
  56. package/esm2015/lib/modules/input-box/input-box-populate-args.js.map +1 -0
  57. package/esm2015/lib/modules/input-box/input-box.component.js +97 -0
  58. package/esm2015/lib/modules/input-box/input-box.component.js.map +1 -0
  59. package/esm2015/lib/modules/input-box/input-box.module.js +19 -0
  60. package/esm2015/lib/modules/input-box/input-box.module.js.map +1 -0
  61. package/esm2015/lib/modules/radio/radio-group.component.js +223 -0
  62. package/esm2015/lib/modules/radio/radio-group.component.js.map +1 -0
  63. package/esm2015/lib/modules/radio/radio-label.component.js +26 -0
  64. package/esm2015/lib/modules/radio/radio-label.component.js.map +1 -0
  65. package/esm2015/lib/modules/radio/radio.component.js +262 -0
  66. package/esm2015/lib/modules/radio/radio.component.js.map +1 -0
  67. package/esm2015/lib/modules/radio/radio.module.js +28 -0
  68. package/esm2015/lib/modules/radio/radio.module.js.map +1 -0
  69. package/esm2015/lib/modules/radio/types/radio-change.js +2 -0
  70. package/esm2015/lib/modules/radio/types/radio-change.js.map +1 -0
  71. package/esm2015/lib/modules/selection-box/selection-box-adapter.service.js +124 -0
  72. package/esm2015/lib/modules/selection-box/selection-box-adapter.service.js.map +1 -0
  73. package/esm2015/lib/modules/selection-box/selection-box-description.component.js +17 -0
  74. package/esm2015/lib/modules/selection-box/selection-box-description.component.js.map +1 -0
  75. package/esm2015/lib/modules/selection-box/selection-box-grid.component.js +132 -0
  76. package/esm2015/lib/modules/selection-box/selection-box-grid.component.js.map +1 -0
  77. package/esm2015/lib/modules/selection-box/selection-box-header.component.js +17 -0
  78. package/esm2015/lib/modules/selection-box/selection-box-header.component.js.map +1 -0
  79. package/esm2015/lib/modules/selection-box/selection-box.component.js +107 -0
  80. package/esm2015/lib/modules/selection-box/selection-box.component.js.map +1 -0
  81. package/esm2015/lib/modules/selection-box/selection-box.module.js +40 -0
  82. package/esm2015/lib/modules/selection-box/selection-box.module.js.map +1 -0
  83. package/esm2015/lib/modules/selection-box/types/selection-box-grid-align-items-type.js +2 -0
  84. package/esm2015/lib/modules/selection-box/types/selection-box-grid-align-items-type.js.map +1 -0
  85. package/esm2015/lib/modules/selection-box/types/selection-box-grid-align-items.js +2 -0
  86. package/esm2015/lib/modules/selection-box/types/selection-box-grid-align-items.js.map +1 -0
  87. package/esm2015/lib/modules/shared/forms-utility.js +26 -0
  88. package/esm2015/lib/modules/shared/forms-utility.js.map +1 -0
  89. package/esm2015/lib/modules/shared/sky-forms-resources.module.js +89 -0
  90. package/esm2015/lib/modules/shared/sky-forms-resources.module.js.map +1 -0
  91. package/esm2015/lib/modules/toggle-switch/toggle-switch-label.component.js +18 -0
  92. package/esm2015/lib/modules/toggle-switch/toggle-switch-label.component.js.map +1 -0
  93. package/esm2015/lib/modules/toggle-switch/toggle-switch.component.js +158 -0
  94. package/esm2015/lib/modules/toggle-switch/toggle-switch.component.js.map +1 -0
  95. package/esm2015/lib/modules/toggle-switch/toggle-switch.module.js +20 -0
  96. package/esm2015/lib/modules/toggle-switch/toggle-switch.module.js.map +1 -0
  97. package/esm2015/lib/modules/toggle-switch/types/toggle-switch-change.js +2 -0
  98. package/esm2015/lib/modules/toggle-switch/types/toggle-switch-change.js.map +1 -0
  99. package/esm2015/skyux-forms.js +2 -2
  100. package/esm2015/skyux-forms.js.map +1 -0
  101. package/esm2015/testing/checkbox-fixture.js +6 -3
  102. package/esm2015/testing/checkbox-fixture.js.map +1 -0
  103. package/esm2015/testing/public-api.js +1 -1
  104. package/esm2015/testing/public-api.js.map +1 -0
  105. package/esm2015/testing/skyux-forms-testing.js +1 -1
  106. package/esm2015/testing/skyux-forms-testing.js.map +1 -0
  107. package/fesm2015/skyux-forms-testing.js +5 -2
  108. package/fesm2015/skyux-forms-testing.js.map +1 -1
  109. package/fesm2015/skyux-forms.js +333 -355
  110. package/fesm2015/skyux-forms.js.map +1 -1
  111. package/index.d.ts +40 -0
  112. package/{modules → lib/modules}/character-counter/character-counter-indicator.component.d.ts +0 -0
  113. package/{modules → lib/modules}/character-counter/character-counter.directive.d.ts +0 -0
  114. package/{modules → lib/modules}/character-counter/character-counter.module.d.ts +0 -0
  115. package/{modules → lib/modules}/checkbox/checkbox-change.d.ts +0 -0
  116. package/{modules → lib/modules}/checkbox/checkbox-label.component.d.ts +0 -0
  117. package/{modules → lib/modules}/checkbox/checkbox-required-validator.directive.d.ts +0 -0
  118. package/{modules → lib/modules}/checkbox/checkbox.component.d.ts +3 -3
  119. package/{modules → lib/modules}/checkbox/checkbox.module.d.ts +0 -0
  120. package/{modules → lib/modules}/file-attachment/file-attachment-label.component.d.ts +0 -0
  121. package/{modules → lib/modules}/file-attachment/file-attachment.component.d.ts +0 -0
  122. package/{modules → lib/modules}/file-attachment/file-attachment.service.d.ts +0 -0
  123. package/{modules → lib/modules}/file-attachment/file-attachments.module.d.ts +0 -0
  124. package/{modules → lib/modules}/file-attachment/file-drop.component.d.ts +0 -0
  125. package/{modules → lib/modules}/file-attachment/file-item-error-type.d.ts +0 -0
  126. package/{modules → lib/modules}/file-attachment/file-item.component.d.ts +0 -0
  127. package/{modules → lib/modules}/file-attachment/file-item.d.ts +0 -0
  128. package/{modules → lib/modules}/file-attachment/file-item.service.d.ts +0 -0
  129. package/{modules → lib/modules}/file-attachment/file-link.d.ts +0 -0
  130. package/{modules → lib/modules}/file-attachment/file-size.pipe.d.ts +0 -0
  131. package/{modules → lib/modules}/file-attachment/types/file-attachment-change.d.ts +0 -0
  132. package/{modules → lib/modules}/file-attachment/types/file-attachment-click.d.ts +0 -0
  133. package/{modules → lib/modules}/file-attachment/types/file-drop-change.d.ts +0 -0
  134. package/{modules → lib/modules}/input-box/input-box-adapter.service.d.ts +0 -0
  135. package/{modules → lib/modules}/input-box/input-box-host.service.d.ts +0 -0
  136. package/{modules → lib/modules}/input-box/input-box-populate-args.d.ts +0 -0
  137. package/{modules → lib/modules}/input-box/input-box.component.d.ts +0 -0
  138. package/{modules → lib/modules}/input-box/input-box.module.d.ts +0 -0
  139. package/{modules → lib/modules}/radio/radio-group.component.d.ts +2 -2
  140. package/{modules → lib/modules}/radio/radio-label.component.d.ts +0 -0
  141. package/{modules → lib/modules}/radio/radio.component.d.ts +0 -0
  142. package/{modules → lib/modules}/radio/radio.module.d.ts +0 -0
  143. package/{modules → lib/modules}/radio/types/radio-change.d.ts +0 -0
  144. package/{modules → lib/modules}/selection-box/selection-box-adapter.service.d.ts +0 -0
  145. package/{modules → lib/modules}/selection-box/selection-box-description.component.d.ts +0 -0
  146. package/{modules → lib/modules}/selection-box/selection-box-grid.component.d.ts +0 -0
  147. package/{modules → lib/modules}/selection-box/selection-box-header.component.d.ts +0 -0
  148. package/{modules → lib/modules}/selection-box/selection-box.component.d.ts +0 -0
  149. package/{modules → lib/modules}/selection-box/selection-box.module.d.ts +0 -0
  150. package/{modules → lib/modules}/selection-box/types/selection-box-grid-align-items-type.d.ts +0 -0
  151. package/{modules → lib/modules}/selection-box/types/selection-box-grid-align-items.d.ts +0 -0
  152. package/{modules → lib/modules}/shared/forms-utility.d.ts +0 -0
  153. package/{modules → lib/modules}/shared/sky-forms-resources.module.d.ts +0 -0
  154. package/{modules → lib/modules}/toggle-switch/toggle-switch-label.component.d.ts +0 -0
  155. package/{modules → lib/modules}/toggle-switch/toggle-switch.component.d.ts +0 -0
  156. package/{modules → lib/modules}/toggle-switch/toggle-switch.module.d.ts +0 -0
  157. package/{modules → lib/modules}/toggle-switch/types/toggle-switch-change.d.ts +0 -0
  158. package/package.json +8 -8
  159. package/skyux-forms.d.ts +1 -1
  160. package/LICENSE +0 -21
  161. package/bundles/skyux-forms-testing.umd.js.map +0 -1
  162. package/bundles/skyux-forms.umd.js.map +0 -1
  163. package/esm2015/modules/character-counter/character-counter-indicator.component.js +0 -37
  164. package/esm2015/modules/character-counter/character-counter.directive.js +0 -80
  165. package/esm2015/modules/character-counter/character-counter.module.js +0 -46
  166. package/esm2015/modules/checkbox/checkbox-change.js +0 -6
  167. package/esm2015/modules/checkbox/checkbox-label.component.js +0 -17
  168. package/esm2015/modules/checkbox/checkbox-required-validator.directive.js +0 -31
  169. package/esm2015/modules/checkbox/checkbox.component.js +0 -238
  170. package/esm2015/modules/checkbox/checkbox.module.js +0 -44
  171. package/esm2015/modules/file-attachment/file-attachment-label.component.js +0 -21
  172. package/esm2015/modules/file-attachment/file-attachment.component.js +0 -324
  173. package/esm2015/modules/file-attachment/file-attachment.service.js +0 -92
  174. package/esm2015/modules/file-attachment/file-attachments.module.js +0 -74
  175. package/esm2015/modules/file-attachment/file-drop.component.js +0 -226
  176. package/esm2015/modules/file-attachment/file-item-error-type.js +0 -2
  177. package/esm2015/modules/file-attachment/file-item.component.js +0 -113
  178. package/esm2015/modules/file-attachment/file-item.js +0 -2
  179. package/esm2015/modules/file-attachment/file-item.service.js +0 -69
  180. package/esm2015/modules/file-attachment/file-link.js +0 -2
  181. package/esm2015/modules/file-attachment/file-size.pipe.js +0 -58
  182. package/esm2015/modules/file-attachment/types/file-attachment-change.js +0 -2
  183. package/esm2015/modules/file-attachment/types/file-attachment-click.js +0 -2
  184. package/esm2015/modules/file-attachment/types/file-drop-change.js +0 -2
  185. package/esm2015/modules/input-box/input-box-adapter.service.js +0 -35
  186. package/esm2015/modules/input-box/input-box-host.service.js +0 -19
  187. package/esm2015/modules/input-box/input-box-populate-args.js +0 -2
  188. package/esm2015/modules/input-box/input-box.component.js +0 -103
  189. package/esm2015/modules/input-box/input-box.module.js +0 -30
  190. package/esm2015/modules/radio/radio-group.component.js +0 -225
  191. package/esm2015/modules/radio/radio-label.component.js +0 -26
  192. package/esm2015/modules/radio/radio.component.js +0 -266
  193. package/esm2015/modules/radio/radio.module.js +0 -44
  194. package/esm2015/modules/radio/types/radio-change.js +0 -2
  195. package/esm2015/modules/selection-box/selection-box-adapter.service.js +0 -122
  196. package/esm2015/modules/selection-box/selection-box-description.component.js +0 -17
  197. package/esm2015/modules/selection-box/selection-box-grid.component.js +0 -130
  198. package/esm2015/modules/selection-box/selection-box-header.component.js +0 -17
  199. package/esm2015/modules/selection-box/selection-box.component.js +0 -104
  200. package/esm2015/modules/selection-box/selection-box.module.js +0 -51
  201. package/esm2015/modules/selection-box/types/selection-box-grid-align-items-type.js +0 -2
  202. package/esm2015/modules/selection-box/types/selection-box-grid-align-items.js +0 -2
  203. package/esm2015/modules/shared/forms-utility.js +0 -26
  204. package/esm2015/modules/shared/sky-forms-resources.module.js +0 -41
  205. package/esm2015/modules/toggle-switch/toggle-switch-label.component.js +0 -18
  206. package/esm2015/modules/toggle-switch/toggle-switch.component.js +0 -158
  207. package/esm2015/modules/toggle-switch/toggle-switch.module.js +0 -35
  208. package/esm2015/modules/toggle-switch/types/toggle-switch-change.js +0 -2
  209. package/esm2015/public-api.js +0 -43
  210. package/public-api.d.ts +0 -40
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-attachments.module.js","sourceRoot":"","sources":["../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-attachments.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,EAAE,+BAA+B,EAAE,MAAM,mCAAmC,CAAC;AAEpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;;AA2B/E,MAAM,OAAO,wBAAwB;;sHAAxB,wBAAwB;uHAAxB,wBAAwB,iBAvBjC,0BAA0B;QAC1B,+BAA+B;QAC/B,oBAAoB;QACpB,oBAAoB;QACpB,eAAe,aAGf,YAAY;QACZ,WAAW;QACX,uBAAuB;QACvB,aAAa;QACb,aAAa;QACb,cAAc,aAGd,0BAA0B;QAC1B,+BAA+B;QAC/B,oBAAoB;QACpB,oBAAoB;QACpB,eAAe;uHAIN,wBAAwB,aAFxB,CAAC,WAAW,EAAE,kBAAkB,CAAC,YAfnC;YACP,YAAY;YACZ,WAAW;YACX,uBAAuB;YACvB,aAAa;YACb,aAAa;YACb,cAAc;SACf;4FAUU,wBAAwB;kBAzBpC,QAAQ;mBAAC;oBACR,YAAY,EAAE;wBACZ,0BAA0B;wBAC1B,+BAA+B;wBAC/B,oBAAoB;wBACpB,oBAAoB;wBACpB,eAAe;qBAChB;oBACD,OAAO,EAAE;wBACP,YAAY;wBACZ,WAAW;wBACX,uBAAuB;wBACvB,aAAa;wBACb,aAAa;wBACb,cAAc;qBACf;oBACD,OAAO,EAAE;wBACP,0BAA0B;wBAC1B,+BAA+B;wBAC/B,oBAAoB;wBACpB,oBAAoB;wBACpB,eAAe;qBAChB;oBACD,SAAS,EAAE,CAAC,WAAW,EAAE,kBAAkB,CAAC;iBAC7C","sourcesContent":["import { CommonModule, DecimalPipe } from '@angular/common';\n\nimport { FormsModule } from '@angular/forms';\n\nimport { NgModule } from '@angular/core';\n\nimport { SkyI18nModule } from '@skyux/i18n';\n\nimport { SkyIconModule } from '@skyux/indicators';\n\nimport { SkyThemeModule } from '@skyux/theme';\n\nimport { SkyFileAttachmentComponent } from './file-attachment.component';\n\nimport { SkyFileAttachmentLabelComponent } from './file-attachment-label.component';\n\nimport { SkyFileDropComponent } from './file-drop.component';\n\nimport { SkyFileItemComponent } from './file-item.component';\n\nimport { SkyFileItemService } from './file-item.service';\n\nimport { SkyFileSizePipe } from './file-size.pipe';\n\nimport { SkyFormsResourcesModule } from '../shared/sky-forms-resources.module';\n\n@NgModule({\n declarations: [\n SkyFileAttachmentComponent,\n SkyFileAttachmentLabelComponent,\n SkyFileDropComponent,\n SkyFileItemComponent,\n SkyFileSizePipe,\n ],\n imports: [\n CommonModule,\n FormsModule,\n SkyFormsResourcesModule,\n SkyI18nModule,\n SkyIconModule,\n SkyThemeModule,\n ],\n exports: [\n SkyFileAttachmentComponent,\n SkyFileAttachmentLabelComponent,\n SkyFileDropComponent,\n SkyFileItemComponent,\n SkyFileSizePipe,\n ],\n providers: [DecimalPipe, SkyFileItemService],\n})\nexport class SkyFileAttachmentsModule {}\n"]}
@@ -0,0 +1,223 @@
1
+ import { Component, Input, Output, EventEmitter, ElementRef, ViewChild, } from '@angular/core';
2
+ import { SkyFileAttachmentService } from './file-attachment.service';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./file-attachment.service";
5
+ import * as i2 from "@skyux/indicators";
6
+ import * as i3 from "@angular/common";
7
+ import * as i4 from "@angular/forms";
8
+ import * as i5 from "@skyux/i18n";
9
+ /**
10
+ * Provides an element to attach multiple files where users can browse or drag and drop local files
11
+ * or provide hyperlinks to external files. You can leave the contents of the component
12
+ * blank to display the drop zone's default UI, or you can specify custom content to
13
+ * display instead. When the module initializes, it disables the ability to drag and
14
+ * drop files for the entire window to prevent the browser from opening files that are
15
+ * accidentally dropped outside the target zone. If you implement your own file drop functionality
16
+ * outside of the file drop component, you can place the `sky-file-drop-target` CSS class
17
+ * on the element that receives drop events to exempt it from the drop exclusion rule.
18
+ */
19
+ export class SkyFileDropComponent {
20
+ constructor(fileAttachmentService) {
21
+ this.fileAttachmentService = fileAttachmentService;
22
+ /**
23
+ * Fires when users add or remove files.
24
+ */
25
+ this.filesChanged = new EventEmitter();
26
+ /**
27
+ * Fires when the link input box triggers a blur event.
28
+ */
29
+ this.linkInputBlur = new EventEmitter();
30
+ /**
31
+ * Fires when users add or remove links.
32
+ */
33
+ this.linkChanged = new EventEmitter();
34
+ /**
35
+ * Specifies the minimum size in bytes for valid files.
36
+ */
37
+ this.minFileSize = 0;
38
+ /**
39
+ * Specifies the maximum size in bytes for valid files.
40
+ */
41
+ this.maxFileSize = 500000;
42
+ /**
43
+ * Indicates whether users can drag and drop multiple files at the same time.
44
+ */
45
+ this.multiple = true;
46
+ /**
47
+ * Indicates whether to disable the option to browse for files to attach.
48
+ */
49
+ this.noClick = false;
50
+ /**
51
+ * Indicates whether to display the option to attach files from URLs rather than from local devices.
52
+ */
53
+ this.allowLinks = false;
54
+ this.rejectedOver = false;
55
+ this.acceptedOver = false;
56
+ }
57
+ ngOnDestroy() {
58
+ this.filesChanged.complete();
59
+ this.linkChanged.complete();
60
+ this.linkInputBlur.complete();
61
+ }
62
+ dropClicked() {
63
+ if (!this.noClick) {
64
+ this.inputEl.nativeElement.click();
65
+ }
66
+ }
67
+ fileChangeEvent(fileChangeEvent) {
68
+ this.handleFiles(fileChangeEvent.target.files);
69
+ }
70
+ fileDragEnter(dragEnterEvent) {
71
+ // Save this target to know when the drag event leaves
72
+ this.enterEventTarget = dragEnterEvent.target;
73
+ dragEnterEvent.stopPropagation();
74
+ dragEnterEvent.preventDefault();
75
+ }
76
+ fileDragOver(dragOverEvent) {
77
+ const transfer = dragOverEvent.dataTransfer;
78
+ dragOverEvent.stopPropagation();
79
+ dragOverEvent.preventDefault();
80
+ if (transfer) {
81
+ if (transfer.items) {
82
+ const files = transfer.items;
83
+ for (let index = 0; index < files.length; index++) {
84
+ const file = files[index];
85
+ if (file.type &&
86
+ this.fileAttachmentService.fileTypeRejected(file.type, this.acceptedTypes)) {
87
+ this.rejectedOver = true;
88
+ this.acceptedOver = false;
89
+ return;
90
+ }
91
+ }
92
+ if (files.length > 0 && !this.acceptedOver) {
93
+ this.rejectedOver = false;
94
+ this.acceptedOver = true;
95
+ }
96
+ } /* istanbul ignore next: untestable */
97
+ else if (transfer.files) {
98
+ // If the browser does not support DataTransfer.items,
99
+ // defer file-type checking to drop handler.
100
+ // https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility
101
+ this.rejectedOver = false;
102
+ this.acceptedOver = true;
103
+ }
104
+ }
105
+ }
106
+ fileDrop(dropEvent) {
107
+ dropEvent.stopPropagation();
108
+ dropEvent.preventDefault();
109
+ this.enterEventTarget = undefined;
110
+ this.rejectedOver = false;
111
+ this.acceptedOver = false;
112
+ if (dropEvent.dataTransfer && dropEvent.dataTransfer.files) {
113
+ const hasDirectory = this.fileAttachmentService.hasDirectory(dropEvent.dataTransfer.files);
114
+ const invalidNumberOfFiles = !this.multiple && dropEvent.dataTransfer.files.length > 1;
115
+ if (hasDirectory || invalidNumberOfFiles) {
116
+ return;
117
+ }
118
+ this.handleFiles(dropEvent.dataTransfer.files);
119
+ }
120
+ }
121
+ fileDragLeave(dragLeaveEvent) {
122
+ if (this.enterEventTarget === dragLeaveEvent.target) {
123
+ this.rejectedOver = false;
124
+ this.acceptedOver = false;
125
+ }
126
+ }
127
+ addLinkEnter(event) {
128
+ if (event.which === 13) {
129
+ this.addLink(event);
130
+ }
131
+ }
132
+ addLink(event) {
133
+ event.preventDefault();
134
+ this.linkChanged.emit({ url: this.linkUrl });
135
+ this.linkUrl = undefined;
136
+ }
137
+ onLinkBlur() {
138
+ this.linkInputBlur.emit();
139
+ }
140
+ emitFileChangeEvent(totalFiles, rejectedFileArray, validFileArray) {
141
+ if (totalFiles === rejectedFileArray.length + validFileArray.length) {
142
+ this.filesChanged.emit({
143
+ files: validFileArray,
144
+ rejectedFiles: rejectedFileArray,
145
+ });
146
+ this.inputEl.nativeElement.value = '';
147
+ }
148
+ }
149
+ filesRejected(file, validFileArray, rejectedFileArray, totalFiles) {
150
+ rejectedFileArray.push(file);
151
+ this.emitFileChangeEvent(totalFiles, rejectedFileArray, validFileArray);
152
+ }
153
+ loadFile(fileDrop, file, validFileArray, rejectedFileArray, totalFiles) {
154
+ const reader = new FileReader();
155
+ reader.addEventListener('load', (event) => {
156
+ file.url = event.target.result;
157
+ validFileArray.push(file);
158
+ fileDrop.emitFileChangeEvent(totalFiles, rejectedFileArray, validFileArray);
159
+ });
160
+ reader.addEventListener('error', (event) => {
161
+ fileDrop.filesRejected(file, validFileArray, rejectedFileArray, totalFiles);
162
+ });
163
+ reader.addEventListener('abort', (event) => {
164
+ fileDrop.filesRejected(file, validFileArray, rejectedFileArray, totalFiles);
165
+ });
166
+ reader.readAsDataURL(file.file);
167
+ }
168
+ handleFiles(files) {
169
+ let validFileArray = [];
170
+ let rejectedFileArray = [];
171
+ let totalFiles = files.length;
172
+ let fileDrop = this;
173
+ // tslint:disable-next-line: max-line-length
174
+ let processedFiles = this.fileAttachmentService.checkFiles(files, this.minFileSize, this.maxFileSize, this.acceptedTypes, this.validateFn);
175
+ for (let file of processedFiles) {
176
+ if (file.errorType) {
177
+ this.filesRejected(file, validFileArray, rejectedFileArray, totalFiles);
178
+ }
179
+ else {
180
+ this.loadFile(fileDrop, file, validFileArray, rejectedFileArray, totalFiles);
181
+ }
182
+ }
183
+ }
184
+ }
185
+ SkyFileDropComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileDropComponent, deps: [{ token: i1.SkyFileAttachmentService }], target: i0.ɵɵFactoryTarget.Component });
186
+ SkyFileDropComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkyFileDropComponent, selector: "sky-file-drop", inputs: { fileUploadAriaLabel: "fileUploadAriaLabel", linkUploadAriaLabel: "linkUploadAriaLabel", minFileSize: "minFileSize", maxFileSize: "maxFileSize", multiple: "multiple", validateFn: "validateFn", acceptedTypes: "acceptedTypes", noClick: "noClick", allowLinks: "allowLinks" }, outputs: { filesChanged: "filesChanged", linkInputBlur: "linkInputBlur", linkChanged: "linkChanged" }, providers: [SkyFileAttachmentService], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<div\n class=\"sky-file-drop-row\"\n [ngClass]=\"{ 'sky-file-drop-allow-links': allowLinks }\"\n>\n <div\n class=\"sky-file-drop-col\"\n [ngClass]=\"{\n 'sky-file-drop-accept': acceptedOver,\n 'sky-file-drop-reject': rejectedOver\n }\"\n >\n <button\n class=\"sky-file-drop sky-file-drop-target\"\n type=\"button\"\n (click)=\"dropClicked()\"\n (dragover)=\"fileDragOver($event)\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n [attr.aria-label]=\"\n fileUploadAriaLabel ||\n ('skyux_file_attachment_file_upload_drag_or_click' | skyLibResources)\n \"\n ></button>\n\n <input\n tabindex=\"-1\"\n aria-hidden=\"true\"\n type=\"file\"\n class=\"sky-file-input-hidden\"\n [attr.multiple]=\"multiple ? multiple : null\"\n [attr.accept]=\"acceptedTypes ? acceptedTypes : null\"\n (change)=\"fileChangeEvent($event)\"\n #fileInput\n />\n\n <div\n class=\"sky-file-drop-contents sky-padding-even-default\"\n *ngIf=\"customEl.children.length === 0\"\n >\n <div class=\"sky-file-drop-contents-not-over\">\n <div class=\"sky-file-drop-text-header sky-headline\">\n {{\n 'skyux_file_attachment_file_upload_drag_file_here' | skyLibResources\n }}\n </div>\n <div class=\"sky-file-drop-text\">\n {{\n 'skyux_file_attachment_file_upload_or_click_to_browse'\n | skyLibResources\n }}\n </div>\n <sky-icon icon=\"cloud-upload\" class=\"sky-file-upload-icon\"></sky-icon>\n </div>\n\n <!-- This will appear when file is dragged over and is valid -->\n <div class=\"sky-file-drop-contents-accept\">\n <div class=\"sky-file-drop-text-header sky-headline\">\n {{\n 'skyux_file_attachment_file_upload_drop_files_here'\n | skyLibResources\n }}\n </div>\n <sky-icon icon=\"bullseye\" class=\"sky-file-upload-icon\"></sky-icon>\n </div>\n\n <!-- This will appear when file is dragged over and is invalid -->\n <div class=\"sky-file-drop-contents-reject\">\n <div class=\"sky-file-drop-text-header sky-headline\">\n {{\n 'skyux_file_attachment_file_upload_invalid_file' | skyLibResources\n }}\n </div>\n <sky-icon icon=\"times-circle\" class=\"sky-file-upload-icon\"></sky-icon>\n </div>\n </div>\n\n <div class=\"sky-file-drop-contents-custom\" #customEl>\n <ng-content></ng-content>\n </div>\n </div>\n <div class=\"sky-file-drop-col\" *ngIf=\"allowLinks\">\n <div class=\"sky-file-drop-contents sky-padding-even-default\">\n <div class=\"sky-file-drop-link\">\n <div class=\"sky-file-drop-link-header\">\n <div class=\"sky-file-drop-text-header sky-headline\">\n {{\n 'skyux_file_attachment_file_upload_paste_link' | skyLibResources\n }}\n </div>\n </div>\n <div class=\"sky-form-group\">\n <input\n type=\"text\"\n class=\"sky-form-control\"\n [attr.aria-label]=\"\n linkUploadAriaLabel ||\n ('skyux_file_attachment_file_upload_link_input' | skyLibResources)\n \"\n [attr.placeholder]=\"\n 'skyux_file_attachment_file_upload_link_placeholder'\n | skyLibResources\n \"\n [(ngModel)]=\"linkUrl\"\n (blur)=\"onLinkBlur()\"\n (keyup)=\"addLinkEnter($event)\"\n />\n </div>\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-primary\"\n [disabled]=\"!linkUrl\"\n (click)=\"addLink($event)\"\n >\n {{\n 'skyux_file_attachment_file_upload_paste_link_done'\n | skyLibResources\n }}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".sky-file-drop-col{margin-bottom:10px;padding-left:5px;padding-right:5px;position:relative}:host .sky-file-drop-row{display:block}:host .sky-file-drop-col{flex-basis:auto}:host .sky-file-drop-allow-links .sky-file-drop-col{flex-basis:auto}:host-context(.sky-responsive-container-xs) .sky-file-drop-row,:host-context(.sky-responsive-container-sm) .sky-file-drop-row,:host-context(.sky-responsive-container-md) .sky-file-drop-row,:host-context(.sky-responsive-container-lg) .sky-file-drop-row{display:block}:host-context(.sky-responsive-container-xs) .sky-file-drop-col,:host-context(.sky-responsive-container-sm) .sky-file-drop-col,:host-context(.sky-responsive-container-md) .sky-file-drop-col,:host-context(.sky-responsive-container-lg) .sky-file-drop-col{flex-basis:auto}:host-context(.sky-responsive-container-xs) .sky-file-drop-allow-links .sky-file-drop-col,:host-context(.sky-responsive-container-sm) .sky-file-drop-allow-links .sky-file-drop-col,:host-context(.sky-responsive-container-md) .sky-file-drop-allow-links .sky-file-drop-col,:host-context(.sky-responsive-container-lg) .sky-file-drop-allow-links .sky-file-drop-col{flex-basis:auto}@media (min-width: 768px){:host .sky-file-drop-row{display:flex}:host .sky-file-drop-col{flex-basis:100%}:host .sky-file-drop-allow-links .sky-file-drop-col{flex-basis:50%}}:host-context(.sky-responsive-container-sm) .sky-file-drop-row,:host-context(.sky-responsive-container-md) .sky-file-drop-row,:host-context(.sky-responsive-container-lg) .sky-file-drop-row{display:flex}:host-context(.sky-responsive-container-sm) .sky-file-drop-col,:host-context(.sky-responsive-container-md) .sky-file-drop-col,:host-context(.sky-responsive-container-lg) .sky-file-drop-col{flex-basis:100%}:host-context(.sky-responsive-container-sm) .sky-file-drop-allow-links .sky-file-drop-col,:host-context(.sky-responsive-container-md) .sky-file-drop-allow-links .sky-file-drop-col,:host-context(.sky-responsive-container-lg) .sky-file-drop-allow-links .sky-file-drop-col{flex-basis:50%}button.sky-file-drop{height:100%;position:absolute;top:0;right:0;bottom:0;left:0;z-index:1}button.sky-file-drop:hover{cursor:pointer}.sky-file-drop-contents{border-top:1px solid #cdcfd2;border-bottom:1px solid #cdcfd2;border-left:1px solid #cdcfd2;border-right:1px solid #cdcfd2;background-color:#eeeeef;color:#212327;cursor:pointer;width:100%;text-align:center;height:100%}.sky-file-drop-contents .sky-file-drop-link-header{margin-bottom:5px}.sky-file-drop-noclick .sky-file-drop-contents{cursor:default}.sky-file-drop-accept .sky-file-drop-contents,.sky-file-drop-reject .sky-file-drop-contents{border-style:dashed;border-width:1px}.sky-file-drop-accept .sky-file-drop-contents-not-over,.sky-file-drop-reject .sky-file-drop-contents-not-over{display:none}.sky-file-drop-accept .sky-file-drop-contents{border-color:#72bf44;color:#212327}.sky-file-drop-accept .sky-file-drop-contents-accept{display:block}.sky-file-drop-reject .sky-file-drop-contents{border-color:#ef4044;color:#212327}.sky-file-drop-reject .sky-file-drop-contents-reject{display:block}.sky-file-drop-contents-accept,.sky-file-drop-contents-reject{display:none}.sky-file-upload-icon{display:block;font-size:40px;max-height:40px;margin-top:10px}.sky-file-drop-link{cursor:default}.sky-file-drop-text-header{margin:0}.sky-file-drop-text{font-size:15px;margin-top:5px;margin-bottom:20px}.sky-file-drop-text,.sky-file-drop-text-header{line-height:1.1;display:block}.sky-file-upload-icon{color:#686c73}.sky-file-drop{background-color:transparent;border:none;display:block;-webkit-appearance:none;width:100%;padding:0}.sky-file-input-hidden{display:none}\n"], components: [{ type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "skyLibResources": i5.SkyLibResourcesPipe } });
187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileDropComponent, decorators: [{
188
+ type: Component,
189
+ args: [{
190
+ selector: 'sky-file-drop',
191
+ templateUrl: './file-drop.component.html',
192
+ styleUrls: ['./file-drop.component.scss'],
193
+ providers: [SkyFileAttachmentService],
194
+ }]
195
+ }], ctorParameters: function () { return [{ type: i1.SkyFileAttachmentService }]; }, propDecorators: { filesChanged: [{
196
+ type: Output
197
+ }], linkInputBlur: [{
198
+ type: Output
199
+ }], linkChanged: [{
200
+ type: Output
201
+ }], fileUploadAriaLabel: [{
202
+ type: Input
203
+ }], linkUploadAriaLabel: [{
204
+ type: Input
205
+ }], minFileSize: [{
206
+ type: Input
207
+ }], maxFileSize: [{
208
+ type: Input
209
+ }], multiple: [{
210
+ type: Input
211
+ }], validateFn: [{
212
+ type: Input
213
+ }], acceptedTypes: [{
214
+ type: Input
215
+ }], noClick: [{
216
+ type: Input
217
+ }], allowLinks: [{
218
+ type: Input
219
+ }], inputEl: [{
220
+ type: ViewChild,
221
+ args: ['fileInput']
222
+ }] } });
223
+ //# sourceMappingURL=file-drop.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-drop.component.js","sourceRoot":"","sources":["../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-drop.component.ts","../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-drop.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ElementRef,\n OnDestroy,\n ViewChild,\n} from '@angular/core';\n\nimport { SkyFileItem } from './file-item';\n\nimport { SkyFileLink } from './file-link';\n\nimport { SkyFileDropChange } from './types/file-drop-change';\n\nimport { SkyFileAttachmentService } from './file-attachment.service';\n\n/**\n * Provides an element to attach multiple files where users can browse or drag and drop local files\n * or provide hyperlinks to external files. You can leave the contents of the component\n * blank to display the drop zone's default UI, or you can specify custom content to\n * display instead. When the module initializes, it disables the ability to drag and\n * drop files for the entire window to prevent the browser from opening files that are\n * accidentally dropped outside the target zone. If you implement your own file drop functionality\n * outside of the file drop component, you can place the `sky-file-drop-target` CSS class\n * on the element that receives drop events to exempt it from the drop exclusion rule.\n */\n@Component({\n selector: 'sky-file-drop',\n templateUrl: './file-drop.component.html',\n styleUrls: ['./file-drop.component.scss'],\n providers: [SkyFileAttachmentService],\n})\nexport class SkyFileDropComponent implements OnDestroy {\n /**\n * Fires when users add or remove files.\n */\n @Output()\n public filesChanged = new EventEmitter<SkyFileDropChange>();\n\n /**\n * Fires when the link input box triggers a blur event.\n */\n @Output()\n public linkInputBlur = new EventEmitter<void>();\n\n /**\n * Fires when users add or remove links.\n */\n @Output()\n public linkChanged = new EventEmitter<SkyFileLink>();\n\n /**\n * Specifies an ARIA label for the file upload button. This provides a text equivalent for\n * screen readers [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility).\n */\n @Input()\n public fileUploadAriaLabel: string;\n\n /**\n * Specifies an ARIA label for the link upload input. This provides a text equivalent for\n * screen readers [to support accessibility](https://developer.blackbaud.com/skyux/learn/accessibility).\n */\n @Input()\n public linkUploadAriaLabel: string;\n\n /**\n * Specifies the minimum size in bytes for valid files.\n */\n @Input()\n public minFileSize: number = 0;\n\n /**\n * Specifies the maximum size in bytes for valid files.\n */\n @Input()\n public maxFileSize: number = 500000;\n\n /**\n * Indicates whether users can drag and drop multiple files at the same time.\n */\n @Input()\n public multiple: boolean = true;\n\n /**\n * Specifies a custom validation function. This validation runs alongside the internal\n * file validation. This function takes a `SkyFileItem` object as a parameter.\n */\n @Input()\n public validateFn: Function;\n\n /**\n * Specifies a comma-delimited string literal of MIME types that users can attach.\n * By default, all file types are allowed.\n * @required\n */\n @Input()\n public acceptedTypes: string;\n\n /**\n * Indicates whether to disable the option to browse for files to attach.\n */\n @Input()\n public noClick: boolean = false;\n\n /**\n * Indicates whether to display the option to attach files from URLs rather than from local devices.\n */\n @Input()\n public allowLinks: boolean = false;\n\n @ViewChild('fileInput')\n public inputEl: ElementRef;\n\n public rejectedOver: boolean = false;\n public acceptedOver: boolean = false;\n public linkUrl: string;\n\n private enterEventTarget: any;\n\n constructor(private fileAttachmentService: SkyFileAttachmentService) {}\n\n public ngOnDestroy() {\n this.filesChanged.complete();\n this.linkChanged.complete();\n this.linkInputBlur.complete();\n }\n\n public dropClicked() {\n if (!this.noClick) {\n this.inputEl.nativeElement.click();\n }\n }\n\n public fileChangeEvent(fileChangeEvent: any) {\n this.handleFiles(fileChangeEvent.target.files);\n }\n\n public fileDragEnter(dragEnterEvent: any) {\n // Save this target to know when the drag event leaves\n this.enterEventTarget = dragEnterEvent.target;\n dragEnterEvent.stopPropagation();\n dragEnterEvent.preventDefault();\n }\n\n public fileDragOver(dragOverEvent: any) {\n const transfer = dragOverEvent.dataTransfer;\n\n dragOverEvent.stopPropagation();\n dragOverEvent.preventDefault();\n\n if (transfer) {\n if (transfer.items) {\n const files = transfer.items;\n\n for (let index = 0; index < files.length; index++) {\n const file: any = files[index];\n\n if (\n file.type &&\n this.fileAttachmentService.fileTypeRejected(\n file.type,\n this.acceptedTypes\n )\n ) {\n this.rejectedOver = true;\n this.acceptedOver = false;\n return;\n }\n }\n\n if (files.length > 0 && !this.acceptedOver) {\n this.rejectedOver = false;\n this.acceptedOver = true;\n }\n } /* istanbul ignore next: untestable */ else if (transfer.files) {\n // If the browser does not support DataTransfer.items,\n // defer file-type checking to drop handler.\n // https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility\n this.rejectedOver = false;\n this.acceptedOver = true;\n }\n }\n }\n\n public fileDrop(dropEvent: DragEvent): void {\n dropEvent.stopPropagation();\n dropEvent.preventDefault();\n\n this.enterEventTarget = undefined;\n this.rejectedOver = false;\n this.acceptedOver = false;\n\n if (dropEvent.dataTransfer && dropEvent.dataTransfer.files) {\n const hasDirectory = this.fileAttachmentService.hasDirectory(\n dropEvent.dataTransfer.files\n );\n const invalidNumberOfFiles =\n !this.multiple && dropEvent.dataTransfer.files.length > 1;\n\n if (hasDirectory || invalidNumberOfFiles) {\n return;\n }\n\n this.handleFiles(dropEvent.dataTransfer.files);\n }\n }\n\n public fileDragLeave(dragLeaveEvent: any) {\n if (this.enterEventTarget === dragLeaveEvent.target) {\n this.rejectedOver = false;\n this.acceptedOver = false;\n }\n }\n\n public addLinkEnter(event: KeyboardEvent) {\n if (event.which === 13) {\n this.addLink(event);\n }\n }\n\n public addLink(event: Event) {\n event.preventDefault();\n this.linkChanged.emit({ url: this.linkUrl } as SkyFileLink);\n this.linkUrl = undefined;\n }\n\n public onLinkBlur(): void {\n this.linkInputBlur.emit();\n }\n\n private emitFileChangeEvent(\n totalFiles: number,\n rejectedFileArray: Array<SkyFileItem>,\n validFileArray: Array<SkyFileItem>\n ) {\n if (totalFiles === rejectedFileArray.length + validFileArray.length) {\n this.filesChanged.emit({\n files: validFileArray,\n rejectedFiles: rejectedFileArray,\n } as SkyFileDropChange);\n\n this.inputEl.nativeElement.value = '';\n }\n }\n\n private filesRejected(\n file: SkyFileItem,\n validFileArray: Array<SkyFileItem>,\n rejectedFileArray: Array<SkyFileItem>,\n totalFiles: number\n ) {\n rejectedFileArray.push(file);\n this.emitFileChangeEvent(totalFiles, rejectedFileArray, validFileArray);\n }\n\n private loadFile(\n fileDrop: SkyFileDropComponent,\n file: SkyFileItem,\n validFileArray: Array<SkyFileItem>,\n rejectedFileArray: Array<SkyFileItem>,\n totalFiles: number\n ) {\n const reader = new FileReader();\n\n reader.addEventListener('load', (event: any) => {\n file.url = event.target.result;\n validFileArray.push(file);\n fileDrop.emitFileChangeEvent(\n totalFiles,\n rejectedFileArray,\n validFileArray\n );\n });\n\n reader.addEventListener('error', (event: any) => {\n fileDrop.filesRejected(\n file,\n validFileArray,\n rejectedFileArray,\n totalFiles\n );\n });\n\n reader.addEventListener('abort', (event: any) => {\n fileDrop.filesRejected(\n file,\n validFileArray,\n rejectedFileArray,\n totalFiles\n );\n });\n\n reader.readAsDataURL(file.file);\n }\n\n private handleFiles(files: FileList) {\n let validFileArray: Array<SkyFileItem> = [];\n let rejectedFileArray: Array<SkyFileItem> = [];\n let totalFiles = files.length;\n let fileDrop = this;\n\n // tslint:disable-next-line: max-line-length\n let processedFiles = this.fileAttachmentService.checkFiles(\n files,\n this.minFileSize,\n this.maxFileSize,\n this.acceptedTypes,\n this.validateFn\n );\n\n for (let file of processedFiles) {\n if (file.errorType) {\n this.filesRejected(file, validFileArray, rejectedFileArray, totalFiles);\n } else {\n this.loadFile(\n fileDrop,\n file,\n validFileArray,\n rejectedFileArray,\n totalFiles\n );\n }\n }\n }\n}\n","<div\n class=\"sky-file-drop-row\"\n [ngClass]=\"{ 'sky-file-drop-allow-links': allowLinks }\"\n>\n <div\n class=\"sky-file-drop-col\"\n [ngClass]=\"{\n 'sky-file-drop-accept': acceptedOver,\n 'sky-file-drop-reject': rejectedOver\n }\"\n >\n <button\n class=\"sky-file-drop sky-file-drop-target\"\n type=\"button\"\n (click)=\"dropClicked()\"\n (dragover)=\"fileDragOver($event)\"\n (dragenter)=\"fileDragEnter($event)\"\n (dragleave)=\"fileDragLeave($event)\"\n (drop)=\"fileDrop($event)\"\n [attr.aria-label]=\"\n fileUploadAriaLabel ||\n ('skyux_file_attachment_file_upload_drag_or_click' | skyLibResources)\n \"\n ></button>\n\n <input\n tabindex=\"-1\"\n aria-hidden=\"true\"\n type=\"file\"\n class=\"sky-file-input-hidden\"\n [attr.multiple]=\"multiple ? multiple : null\"\n [attr.accept]=\"acceptedTypes ? acceptedTypes : null\"\n (change)=\"fileChangeEvent($event)\"\n #fileInput\n />\n\n <div\n class=\"sky-file-drop-contents sky-padding-even-default\"\n *ngIf=\"customEl.children.length === 0\"\n >\n <div class=\"sky-file-drop-contents-not-over\">\n <div class=\"sky-file-drop-text-header sky-headline\">\n {{\n 'skyux_file_attachment_file_upload_drag_file_here' | skyLibResources\n }}\n </div>\n <div class=\"sky-file-drop-text\">\n {{\n 'skyux_file_attachment_file_upload_or_click_to_browse'\n | skyLibResources\n }}\n </div>\n <sky-icon icon=\"cloud-upload\" class=\"sky-file-upload-icon\"></sky-icon>\n </div>\n\n <!-- This will appear when file is dragged over and is valid -->\n <div class=\"sky-file-drop-contents-accept\">\n <div class=\"sky-file-drop-text-header sky-headline\">\n {{\n 'skyux_file_attachment_file_upload_drop_files_here'\n | skyLibResources\n }}\n </div>\n <sky-icon icon=\"bullseye\" class=\"sky-file-upload-icon\"></sky-icon>\n </div>\n\n <!-- This will appear when file is dragged over and is invalid -->\n <div class=\"sky-file-drop-contents-reject\">\n <div class=\"sky-file-drop-text-header sky-headline\">\n {{\n 'skyux_file_attachment_file_upload_invalid_file' | skyLibResources\n }}\n </div>\n <sky-icon icon=\"times-circle\" class=\"sky-file-upload-icon\"></sky-icon>\n </div>\n </div>\n\n <div class=\"sky-file-drop-contents-custom\" #customEl>\n <ng-content></ng-content>\n </div>\n </div>\n <div class=\"sky-file-drop-col\" *ngIf=\"allowLinks\">\n <div class=\"sky-file-drop-contents sky-padding-even-default\">\n <div class=\"sky-file-drop-link\">\n <div class=\"sky-file-drop-link-header\">\n <div class=\"sky-file-drop-text-header sky-headline\">\n {{\n 'skyux_file_attachment_file_upload_paste_link' | skyLibResources\n }}\n </div>\n </div>\n <div class=\"sky-form-group\">\n <input\n type=\"text\"\n class=\"sky-form-control\"\n [attr.aria-label]=\"\n linkUploadAriaLabel ||\n ('skyux_file_attachment_file_upload_link_input' | skyLibResources)\n \"\n [attr.placeholder]=\"\n 'skyux_file_attachment_file_upload_link_placeholder'\n | skyLibResources\n \"\n [(ngModel)]=\"linkUrl\"\n (blur)=\"onLinkBlur()\"\n (keyup)=\"addLinkEnter($event)\"\n />\n </div>\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-primary\"\n [disabled]=\"!linkUrl\"\n (click)=\"addLink($event)\"\n >\n {{\n 'skyux_file_attachment_file_upload_paste_link_done'\n | skyLibResources\n }}\n </button>\n </div>\n </div>\n </div>\n</div>\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-item-error-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-item-error-type.js","sourceRoot":"","sources":["../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-item-error-type.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Specifies the type of error that was thrown.\n */\nexport type SkyFileItemErrorType =\n | 'fileType'\n | 'minFileSize'\n | 'maxFileSize'\n | 'validate';\n"]}
@@ -0,0 +1,114 @@
1
+ import { Component, Input, Output, KeyValueDiffers, EventEmitter, } from '@angular/core';
2
+ import { SkyFileItemService } from './file-item.service';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./file-item.service";
5
+ import * as i2 from "@skyux/indicators";
6
+ import * as i3 from "@angular/common";
7
+ import * as i4 from "./file-size.pipe";
8
+ import * as i5 from "@skyux/i18n";
9
+ export class SkyFileItemComponent {
10
+ constructor(differs, fileItemService) {
11
+ this.differs = differs;
12
+ this.fileItemService = fileItemService;
13
+ /**
14
+ * Fires when users select the delete button for an item. The deleted item is passed to the
15
+ * function.
16
+ */
17
+ this.deleteFile = new EventEmitter();
18
+ this.differ = this.differs.find({}).create();
19
+ }
20
+ get fileName() {
21
+ return this.fileItem.file.name;
22
+ }
23
+ get fileSize() {
24
+ return this.fileItem.file.size;
25
+ }
26
+ get url() {
27
+ return this.fileItem.url;
28
+ }
29
+ ngDoCheck() {
30
+ let changes = this.differ.diff(this.fileItem);
31
+ if (changes) {
32
+ let cls, extensionUpper = this.fileItemService.getFileExtensionUpper(this.fileItem), fileTypeUpper;
33
+ switch (extensionUpper) {
34
+ case '.PDF':
35
+ cls = 'pdf';
36
+ break;
37
+ case '.GZ':
38
+ case '.RAR':
39
+ case '.TGZ':
40
+ case '.ZIP':
41
+ cls = 'archive';
42
+ break;
43
+ case '.PPT':
44
+ case '.PPTX':
45
+ cls = 'powerpoint';
46
+ break;
47
+ case '.DOC':
48
+ case '.DOCX':
49
+ cls = 'word';
50
+ break;
51
+ case '.XLS':
52
+ case '.XLSX':
53
+ cls = 'excel';
54
+ break;
55
+ case '.TXT':
56
+ cls = 'text';
57
+ break;
58
+ case '.HTM':
59
+ case '.HTML':
60
+ cls = 'code';
61
+ break;
62
+ default:
63
+ break;
64
+ }
65
+ if (!cls) {
66
+ fileTypeUpper = this.fileItemService.getFileTypeUpper(this.fileItem);
67
+ switch (fileTypeUpper.substr(0, fileTypeUpper.indexOf('/'))) {
68
+ case 'AUDIO':
69
+ cls = 'audio';
70
+ break;
71
+ case 'IMAGE':
72
+ // Normally images are displayed as thumbnails, but if an image type is not recognized
73
+ // as being widely supported by modern browsers (e.g. TIFF files) then an icon should
74
+ // be displayed instead.
75
+ cls = 'image';
76
+ break;
77
+ case 'TEXT':
78
+ cls = 'text';
79
+ break;
80
+ case 'VIDEO':
81
+ cls = 'video';
82
+ break;
83
+ default:
84
+ break;
85
+ }
86
+ }
87
+ this.icon = 'file-' + (cls ? cls + '-' : '') + 'o';
88
+ }
89
+ }
90
+ itemDelete() {
91
+ this.deleteFile.emit(this.fileItem);
92
+ }
93
+ isFile() {
94
+ return this.fileItemService.isFile(this.fileItem);
95
+ }
96
+ isImage() {
97
+ return this.fileItemService.isImage(this.fileItem);
98
+ }
99
+ }
100
+ SkyFileItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileItemComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i1.SkyFileItemService }], target: i0.ɵɵFactoryTarget.Component });
101
+ SkyFileItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: SkyFileItemComponent, selector: "sky-file-item", inputs: { fileItem: "fileItem" }, outputs: { deleteFile: "deleteFile" }, ngImport: i0, template: "<div class=\"sky-file-item sky-padding-even-default\">\n <div class=\"sky-file-item-title\">\n <div class=\"sky-file-item-name-container\">\n <div class=\"sky-file-item-name\">\n <strong *ngIf=\"isFile()\">{{ fileName }}</strong>\n <strong *ngIf=\"!isFile()\">{{ url }}</strong>\n </div>\n <div class=\"sky-file-item-size\" *ngIf=\"isFile()\">\n ({{ fileSize | skyFileSize }})\n </div>\n </div>\n <div class=\"sky-file-item-controls\">\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-default sky-file-item-btn-delete\"\n [attr.aria-label]=\"\n 'skyux_file_attachment_file_item_delete' | skyLibResources\n \"\n (click)=\"itemDelete()\"\n >\n <sky-icon icon=\"trash-o\" size=\"lg\"></sky-icon>\n </button>\n </div>\n </div>\n <div class=\"sky-file-item-content\">\n <div class=\"sky-file-item-preview\">\n <div *ngIf=\"isImage()\" class=\"sky-file-item-preview-img-container\">\n <img\n class=\"sky-file-item-preview-img\"\n [src]=\"url\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n />\n </div>\n <div *ngIf=\"!isImage()\" class=\"sky-file-item-preview-other\">\n <sky-icon [icon]=\"icon\"></sky-icon>\n </div>\n </div>\n <div class=\"sky-file-item-content-custom\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [".sky-file-item{border-top:1px solid #e2e3e4;border-bottom:1px solid #e2e3e4;border-left:1px solid #e2e3e4;border-right:1px solid #e2e3e4;background-color:#eeeeef;margin-bottom:10px}.sky-file-item-name-container{flex:1 1 auto;overflow:hidden}.sky-file-item-controls{flex:0 1 auto;padding-left:15px}.sky-file-item-name{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;text-overflow:ellipsis}.sky-file-item-title{margin-bottom:10px;display:flex}.sky-file-item-content{display:flex}.sky-file-item-preview{flex-basis:25%}.sky-file-item-content-custom{flex-basis:75%}.sky-file-item-preview-img-container{text-align:center}.sky-file-item-preview-img{max-width:100%;height:auto;box-shadow:0 0 5px #666}.sky-file-item-preview-other{color:#686c73;font-size:100px;line-height:1;text-align:center;width:100%}\n"], components: [{ type: i2.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "skyFileSize": i4.SkyFileSizePipe, "skyLibResources": i5.SkyLibResourcesPipe } });
102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileItemComponent, decorators: [{
103
+ type: Component,
104
+ args: [{
105
+ selector: 'sky-file-item',
106
+ templateUrl: './file-item.component.html',
107
+ styleUrls: ['./file-item.component.scss'],
108
+ }]
109
+ }], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i1.SkyFileItemService }]; }, propDecorators: { fileItem: [{
110
+ type: Input
111
+ }], deleteFile: [{
112
+ type: Output
113
+ }] } });
114
+ //# sourceMappingURL=file-item.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-item.component.js","sourceRoot":"","sources":["../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-item.component.ts","../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-item.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n DoCheck,\n KeyValueDiffers,\n KeyValueDiffer,\n EventEmitter,\n} from '@angular/core';\n\nimport { SkyFileItem } from './file-item';\n\nimport { SkyFileLink } from './file-link';\n\nimport { SkyFileItemService } from './file-item.service';\n\n@Component({\n selector: 'sky-file-item',\n templateUrl: './file-item.component.html',\n styleUrls: ['./file-item.component.scss'],\n})\nexport class SkyFileItemComponent implements DoCheck {\n /**\n * Specifies the summary information to display about file attachments. For local files,\n * the default summary includes the file name, file size, file preview, and a delete button.\n * For external files, the default summary includes the URL and a delete button.\n * You can include additional inputs to display user-entered metadata.\n * @required\n */\n @Input()\n public fileItem: SkyFileItem | SkyFileLink;\n\n /**\n * Fires when users select the delete button for an item. The deleted item is passed to the\n * function.\n */\n @Output()\n public deleteFile = new EventEmitter<SkyFileLink | SkyFileItem>();\n\n public get fileName(): string {\n return (<SkyFileItem>this.fileItem).file.name;\n }\n\n public get fileSize(): number {\n return (<SkyFileItem>this.fileItem).file.size;\n }\n\n public get url(): string {\n return (<SkyFileLink>this.fileItem).url;\n }\n\n public icon: string;\n\n private differ: KeyValueDiffer<any, any>;\n\n public constructor(\n private differs: KeyValueDiffers,\n private fileItemService: SkyFileItemService\n ) {\n this.differ = this.differs.find({}).create();\n }\n\n public ngDoCheck() {\n let changes = this.differ.diff(this.fileItem);\n\n if (changes) {\n let cls: string,\n extensionUpper = this.fileItemService.getFileExtensionUpper(\n <SkyFileItem>this.fileItem\n ),\n fileTypeUpper: string;\n\n switch (extensionUpper) {\n case '.PDF':\n cls = 'pdf';\n break;\n case '.GZ':\n case '.RAR':\n case '.TGZ':\n case '.ZIP':\n cls = 'archive';\n break;\n case '.PPT':\n case '.PPTX':\n cls = 'powerpoint';\n break;\n case '.DOC':\n case '.DOCX':\n cls = 'word';\n break;\n case '.XLS':\n case '.XLSX':\n cls = 'excel';\n break;\n case '.TXT':\n cls = 'text';\n break;\n case '.HTM':\n case '.HTML':\n cls = 'code';\n break;\n default:\n break;\n }\n\n if (!cls) {\n fileTypeUpper = this.fileItemService.getFileTypeUpper(\n <SkyFileItem>this.fileItem\n );\n\n switch (fileTypeUpper.substr(0, fileTypeUpper.indexOf('/'))) {\n case 'AUDIO':\n cls = 'audio';\n break;\n case 'IMAGE':\n // Normally images are displayed as thumbnails, but if an image type is not recognized\n // as being widely supported by modern browsers (e.g. TIFF files) then an icon should\n // be displayed instead.\n cls = 'image';\n break;\n case 'TEXT':\n cls = 'text';\n break;\n case 'VIDEO':\n cls = 'video';\n break;\n default:\n break;\n }\n }\n this.icon = 'file-' + (cls ? cls + '-' : '') + 'o';\n }\n }\n\n public itemDelete() {\n this.deleteFile.emit(this.fileItem);\n }\n\n public isFile() {\n return this.fileItemService.isFile(<SkyFileItem>this.fileItem);\n }\n\n public isImage() {\n return this.fileItemService.isImage(<SkyFileItem>this.fileItem);\n }\n}\n","<div class=\"sky-file-item sky-padding-even-default\">\n <div class=\"sky-file-item-title\">\n <div class=\"sky-file-item-name-container\">\n <div class=\"sky-file-item-name\">\n <strong *ngIf=\"isFile()\">{{ fileName }}</strong>\n <strong *ngIf=\"!isFile()\">{{ url }}</strong>\n </div>\n <div class=\"sky-file-item-size\" *ngIf=\"isFile()\">\n ({{ fileSize | skyFileSize }})\n </div>\n </div>\n <div class=\"sky-file-item-controls\">\n <button\n type=\"button\"\n class=\"sky-btn sky-btn-default sky-file-item-btn-delete\"\n [attr.aria-label]=\"\n 'skyux_file_attachment_file_item_delete' | skyLibResources\n \"\n (click)=\"itemDelete()\"\n >\n <sky-icon icon=\"trash-o\" size=\"lg\"></sky-icon>\n </button>\n </div>\n </div>\n <div class=\"sky-file-item-content\">\n <div class=\"sky-file-item-preview\">\n <div *ngIf=\"isImage()\" class=\"sky-file-item-preview-img-container\">\n <img\n class=\"sky-file-item-preview-img\"\n [src]=\"url\"\n [alt]=\"\n 'skyux_file_attachment_file_upload_image_preview_alt_text'\n | skyLibResources\n \"\n />\n </div>\n <div *ngIf=\"!isImage()\" class=\"sky-file-item-preview-other\">\n <sky-icon [icon]=\"icon\"></sky-icon>\n </div>\n </div>\n <div class=\"sky-file-item-content-custom\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-item.js","sourceRoot":"","sources":["../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-item.ts"],"names":[],"mappings":"","sourcesContent":["import { SkyFileItemErrorType } from './file-item-error-type';\n\nexport interface SkyFileItem {\n /**\n * The object that was added or removed.\n */\n file: File;\n /**\n * The [data URL](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs)\n * for the file that was added or removed.\n */\n url: string;\n /**\n * The type of error that caused the file to be rejected.\n */\n errorType: SkyFileItemErrorType;\n /**\n * Additional parameters about the error that caused the file to be rejected.\n */\n errorParam: string;\n}\n"]}
@@ -0,0 +1,72 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * @internal
5
+ */
6
+ export class SkyFileItemService {
7
+ isFile(fileItem) {
8
+ let file = fileItem.file;
9
+ /* tslint:disable */
10
+ return (file &&
11
+ file !== undefined &&
12
+ file !== null &&
13
+ file.size !== undefined &&
14
+ file.size !== null);
15
+ /* tslint:enable */
16
+ }
17
+ isImage(fileItem) {
18
+ let fileTypeUpper = this.getFileTypeUpper(fileItem), slashIndex;
19
+ slashIndex = fileTypeUpper.indexOf('/');
20
+ if (slashIndex >= 0) {
21
+ switch (fileTypeUpper.substr(fileTypeUpper.indexOf('/') + 1)) {
22
+ case 'BMP':
23
+ case 'GIF':
24
+ case 'JPEG':
25
+ case 'PNG':
26
+ return true;
27
+ default:
28
+ break;
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ getFileExtensionUpper(fileItem) {
34
+ let extension = '', name;
35
+ /* istanbul ignore else */
36
+ /* sanity check */
37
+ if (fileItem) {
38
+ let file = fileItem.file;
39
+ if (file) {
40
+ /* istanbul ignore next */
41
+ name = file.name || '';
42
+ /* istanbul ignore next */
43
+ extension = name.substr(name.lastIndexOf('.')) || '';
44
+ }
45
+ else {
46
+ extension = '';
47
+ }
48
+ }
49
+ return extension.toUpperCase();
50
+ }
51
+ getFileTypeUpper(fileItem) {
52
+ let fileType = '';
53
+ /* istanbul ignore else */
54
+ /* sanity check */
55
+ if (fileItem) {
56
+ let file = fileItem.file;
57
+ if (file) {
58
+ fileType = file.type || '';
59
+ }
60
+ else {
61
+ fileType = '';
62
+ }
63
+ }
64
+ return fileType.toUpperCase();
65
+ }
66
+ }
67
+ SkyFileItemService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileItemService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
68
+ SkyFileItemService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileItemService });
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileItemService, decorators: [{
70
+ type: Injectable
71
+ }] });
72
+ //# sourceMappingURL=file-item.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-item.service.js","sourceRoot":"","sources":["../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-item.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;;AAI3C;;GAEG;AAEH,MAAM,OAAO,kBAAkB;IACtB,MAAM,CAAC,QAAqB;QACjC,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAEzB,oBAAoB;QACpB,OAAO,CACL,IAAI;YACJ,IAAI,KAAK,SAAS;YAClB,IAAI,KAAK,IAAI;YACb,IAAI,CAAC,IAAI,KAAK,SAAS;YACvB,IAAI,CAAC,IAAI,KAAK,IAAI,CACnB,CAAC;QACF,mBAAmB;IACrB,CAAC;IAEM,OAAO,CAAC,QAAqB;QAClC,IAAI,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EACjD,UAAkB,CAAC;QAErB,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,UAAU,IAAI,CAAC,EAAE;YACnB,QAAQ,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC5D,KAAK,KAAK,CAAC;gBACX,KAAK,KAAK,CAAC;gBACX,KAAK,MAAM,CAAC;gBACZ,KAAK,KAAK;oBACR,OAAO,IAAI,CAAC;gBACd;oBACE,MAAM;aACT;SACF;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,qBAAqB,CAAC,QAAqB;QAChD,IAAI,SAAS,GAAG,EAAE,EAChB,IAAY,CAAC;QAEf,0BAA0B;QAC1B,kBAAkB;QAClB,IAAI,QAAQ,EAAE;YACZ,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YACzB,IAAI,IAAI,EAAE;gBACR,0BAA0B;gBAC1B,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBACvB,0BAA0B;gBAC1B,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;aACtD;iBAAM;gBACL,SAAS,GAAG,EAAE,CAAC;aAChB;SACF;QAED,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAEM,gBAAgB,CAAC,QAAqB;QAC3C,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,0BAA0B;QAC1B,kBAAkB;QAClB,IAAI,QAAQ,EAAE;YACZ,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YACzB,IAAI,IAAI,EAAE;gBACR,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;aAC5B;iBAAM;gBACL,QAAQ,GAAG,EAAE,CAAC;aACf;SACF;QAED,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC;;gHAvEU,kBAAkB;oHAAlB,kBAAkB;4FAAlB,kBAAkB;kBAD9B,UAAU","sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { SkyFileItem } from './file-item';\n\n/**\n * @internal\n */\n@Injectable()\nexport class SkyFileItemService {\n public isFile(fileItem: SkyFileItem): boolean {\n let file = fileItem.file;\n\n /* tslint:disable */\n return (\n file &&\n file !== undefined &&\n file !== null &&\n file.size !== undefined &&\n file.size !== null\n );\n /* tslint:enable */\n }\n\n public isImage(fileItem: SkyFileItem): boolean {\n let fileTypeUpper = this.getFileTypeUpper(fileItem),\n slashIndex: number;\n\n slashIndex = fileTypeUpper.indexOf('/');\n\n if (slashIndex >= 0) {\n switch (fileTypeUpper.substr(fileTypeUpper.indexOf('/') + 1)) {\n case 'BMP':\n case 'GIF':\n case 'JPEG':\n case 'PNG':\n return true;\n default:\n break;\n }\n }\n\n return false;\n }\n\n public getFileExtensionUpper(fileItem: SkyFileItem): string {\n let extension = '',\n name: string;\n\n /* istanbul ignore else */\n /* sanity check */\n if (fileItem) {\n let file = fileItem.file;\n if (file) {\n /* istanbul ignore next */\n name = file.name || '';\n /* istanbul ignore next */\n extension = name.substr(name.lastIndexOf('.')) || '';\n } else {\n extension = '';\n }\n }\n\n return extension.toUpperCase();\n }\n\n public getFileTypeUpper(fileItem: SkyFileItem): string {\n let fileType = '';\n /* istanbul ignore else */\n /* sanity check */\n if (fileItem) {\n let file = fileItem.file;\n if (file) {\n fileType = file.type || '';\n } else {\n fileType = '';\n }\n }\n\n return fileType.toUpperCase();\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-link.js","sourceRoot":"","sources":["../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-link.ts"],"names":[],"mappings":"","sourcesContent":["export interface SkyFileLink {\n /**\n * Specifies the URL for the linked file.\n */\n url: string;\n}\n"]}
@@ -0,0 +1,61 @@
1
+ import { Pipe } from '@angular/core';
2
+ import { DecimalPipe } from '@angular/common';
3
+ import { SkyLibResourcesService } from '@skyux/i18n';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "@skyux/i18n";
7
+ /**
8
+ * @internal
9
+ */
10
+ export class SkyFileSizePipe {
11
+ constructor(decimalPipe, resourcesService) {
12
+ this.decimalPipe = decimalPipe;
13
+ this.resourcesService = resourcesService;
14
+ }
15
+ transform(input) {
16
+ let decimalPlaces = 0, dividend = 1, formattedSize, roundedSize, template;
17
+ /* tslint:disable */
18
+ if (input === null || input === undefined) {
19
+ return '';
20
+ }
21
+ /* tslint:enable */
22
+ if (Math.abs(input) === 1) {
23
+ template = 'skyux_file_attachment_file_size_b_singular';
24
+ }
25
+ else if (input < 1000) {
26
+ template = 'skyux_file_attachment_file_size_b_plural';
27
+ }
28
+ else if (input < 1e6) {
29
+ template = 'skyux_file_attachment_file_size_kb';
30
+ dividend = 1000;
31
+ }
32
+ else if (input < 1e9) {
33
+ template = 'skyux_file_attachment_file_size_mb';
34
+ dividend = 1e6;
35
+ decimalPlaces = 1;
36
+ }
37
+ else {
38
+ template = 'skyux_file_attachment_file_size_gb';
39
+ dividend = 1e9;
40
+ decimalPlaces = 1;
41
+ }
42
+ roundedSize =
43
+ Math.floor(input / (dividend / Math.pow(10, decimalPlaces))) /
44
+ Math.pow(10, decimalPlaces);
45
+ formattedSize = this.decimalPipe.transform(roundedSize, '.0-3');
46
+ return this.getString(template, formattedSize);
47
+ }
48
+ getString(key, ...args) {
49
+ // TODO: Need to implement the async `getString` method in a breaking change.
50
+ return this.resourcesService.getStringForLocale({ locale: 'en-US' }, key, ...args);
51
+ }
52
+ }
53
+ SkyFileSizePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileSizePipe, deps: [{ token: i1.DecimalPipe }, { token: i2.SkyLibResourcesService }], target: i0.ɵɵFactoryTarget.Pipe });
54
+ SkyFileSizePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileSizePipe, name: "skyFileSize" });
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyFileSizePipe, decorators: [{
56
+ type: Pipe,
57
+ args: [{
58
+ name: 'skyFileSize',
59
+ }]
60
+ }], ctorParameters: function () { return [{ type: i1.DecimalPipe }, { type: i2.SkyLibResourcesService }]; } });
61
+ //# sourceMappingURL=file-size.pipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-size.pipe.js","sourceRoot":"","sources":["../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/file-size.pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAiB,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;;;;AAErD;;GAEG;AAIH,MAAM,OAAO,eAAe;IAC1B,YACU,WAAwB,EACxB,gBAAwC;QADxC,gBAAW,GAAX,WAAW,CAAa;QACxB,qBAAgB,GAAhB,gBAAgB,CAAwB;IAC/C,CAAC;IAEG,SAAS,CAAC,KAAa;QAC5B,IAAI,aAAa,GAAG,CAAC,EACnB,QAAQ,GAAG,CAAC,EACZ,aAAqB,EACrB,WAAmB,EACnB,QAAgB,CAAC;QAEnB,oBAAoB;QACpB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;YACzC,OAAO,EAAE,CAAC;SACX;QACD,mBAAmB;QAEnB,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACzB,QAAQ,GAAG,4CAA4C,CAAC;SACzD;aAAM,IAAI,KAAK,GAAG,IAAI,EAAE;YACvB,QAAQ,GAAG,0CAA0C,CAAC;SACvD;aAAM,IAAI,KAAK,GAAG,GAAG,EAAE;YACtB,QAAQ,GAAG,oCAAoC,CAAC;YAChD,QAAQ,GAAG,IAAI,CAAC;SACjB;aAAM,IAAI,KAAK,GAAG,GAAG,EAAE;YACtB,QAAQ,GAAG,oCAAoC,CAAC;YAChD,QAAQ,GAAG,GAAG,CAAC;YACf,aAAa,GAAG,CAAC,CAAC;SACnB;aAAM;YACL,QAAQ,GAAG,oCAAoC,CAAC;YAChD,QAAQ,GAAG,GAAG,CAAC;YACf,aAAa,GAAG,CAAC,CAAC;SACnB;QAED,WAAW;YACT,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;gBAC5D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QAE9B,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAEhE,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACjD,CAAC;IAEO,SAAS,CAAC,GAAW,EAAE,GAAG,IAAW;QAC3C,6EAA6E;QAC7E,OAAO,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAC7C,EAAE,MAAM,EAAE,OAAO,EAAE,EACnB,GAAG,EACH,GAAG,IAAI,CACR,CAAC;IACJ,CAAC;;6GApDU,eAAe;2GAAf,eAAe;4FAAf,eAAe;kBAH3B,IAAI;mBAAC;oBACJ,IAAI,EAAE,aAAa;iBACpB","sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\n\nimport { DecimalPipe } from '@angular/common';\n\nimport { SkyLibResourcesService } from '@skyux/i18n';\n\n/**\n * @internal\n */\n@Pipe({\n name: 'skyFileSize',\n})\nexport class SkyFileSizePipe implements PipeTransform {\n constructor(\n private decimalPipe: DecimalPipe,\n private resourcesService: SkyLibResourcesService\n ) {}\n\n public transform(input: number): string {\n let decimalPlaces = 0,\n dividend = 1,\n formattedSize: string,\n roundedSize: number,\n template: string;\n\n /* tslint:disable */\n if (input === null || input === undefined) {\n return '';\n }\n /* tslint:enable */\n\n if (Math.abs(input) === 1) {\n template = 'skyux_file_attachment_file_size_b_singular';\n } else if (input < 1000) {\n template = 'skyux_file_attachment_file_size_b_plural';\n } else if (input < 1e6) {\n template = 'skyux_file_attachment_file_size_kb';\n dividend = 1000;\n } else if (input < 1e9) {\n template = 'skyux_file_attachment_file_size_mb';\n dividend = 1e6;\n decimalPlaces = 1;\n } else {\n template = 'skyux_file_attachment_file_size_gb';\n dividend = 1e9;\n decimalPlaces = 1;\n }\n\n roundedSize =\n Math.floor(input / (dividend / Math.pow(10, decimalPlaces))) /\n Math.pow(10, decimalPlaces);\n\n formattedSize = this.decimalPipe.transform(roundedSize, '.0-3');\n\n return this.getString(template, formattedSize);\n }\n\n private getString(key: string, ...args: any[]): string {\n // TODO: Need to implement the async `getString` method in a breaking change.\n return this.resourcesService.getStringForLocale(\n { locale: 'en-US' },\n key,\n ...args\n );\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-attachment-change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-attachment-change.js","sourceRoot":"","sources":["../../../../../../../../../libs/components/forms/src/lib/modules/file-attachment/types/file-attachment-change.ts"],"names":[],"mappings":"","sourcesContent":["import { SkyFileItem } from '../file-item';\n\nexport interface SkyFileAttachmentChange {\n /**\n * Specifies the file that was added or removed.\n */\n file: SkyFileItem;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=file-attachment-click.js.map