carriera-intern 0.0.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 (597) hide show
  1. package/.cursor/rules/icons.mdc +7 -0
  2. package/.editorconfig +17 -0
  3. package/.vscode/extensions.json +4 -0
  4. package/.vscode/launch.json +20 -0
  5. package/.vscode/tasks.json +42 -0
  6. package/README.md +59 -0
  7. package/angular.json +94 -0
  8. package/carriera-intern@0.0.0 +0 -0
  9. package/package.json +61 -0
  10. package/projects/carriera-intern-components/.storybook/main.ts +12 -0
  11. package/projects/carriera-intern-components/.storybook/preview-head.html +13 -0
  12. package/projects/carriera-intern-components/.storybook/preview.ts +54 -0
  13. package/projects/carriera-intern-components/.storybook/tsconfig.doc.json +10 -0
  14. package/projects/carriera-intern-components/.storybook/tsconfig.json +11 -0
  15. package/projects/carriera-intern-components/.storybook/typings.d.ts +4 -0
  16. package/projects/carriera-intern-components/README.md +63 -0
  17. package/projects/carriera-intern-components/ng-package.json +14 -0
  18. package/projects/carriera-intern-components/package.json +14 -0
  19. package/projects/carriera-intern-components/public/assets/animations/animation-document-update.json +1 -0
  20. package/projects/carriera-intern-components/public/assets/animations/animation-image.json +1 -0
  21. package/projects/carriera-intern-components/public/assets/animations/animation-logo.json +1 -0
  22. package/projects/carriera-intern-components/public/assets/animations/animation-media.json +1 -0
  23. package/projects/carriera-intern-components/public/assets/cdl.png +0 -0
  24. package/projects/carriera-intern-components/public/assets/exampledoc.png +0 -0
  25. package/projects/carriera-intern-components/public/assets/examplelargeview.png +0 -0
  26. package/projects/carriera-intern-components/public/assets/icons/Thumb-active.svg +3 -0
  27. package/projects/carriera-intern-components/public/assets/icons/Thumb.svg +3 -0
  28. package/projects/carriera-intern-components/public/assets/icons/arrows/cai-arrow-primary-up.svg +3 -0
  29. package/projects/carriera-intern-components/public/assets/icons/arrows/cai-arrow-secondary-down.svg +3 -0
  30. package/projects/carriera-intern-components/public/assets/icons/arrows/cai-arrow-secondary-left.svg +3 -0
  31. package/projects/carriera-intern-components/public/assets/icons/arrows/cai-arrow-secondary-right.svg +3 -0
  32. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_bbt.svg +5 -0
  33. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_bmo_harris.svg +13 -0
  34. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_capital_one.svg +11 -0
  35. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_chase.svg +11 -0
  36. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_chime.svg +10 -0
  37. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_citi.svg +8 -0
  38. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_fifth_third.svg +14 -0
  39. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_green_dot.svg +17 -0
  40. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_mb_financial.svg +5 -0
  41. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_meta.svg +11 -0
  42. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_navi_federal.svg +14 -0
  43. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_of_america.svg +5 -0
  44. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_pnc.svg +10 -0
  45. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_regions.svg +14 -0
  46. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_renasant.svg +14 -0
  47. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_tcf.svg +11 -0
  48. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_truist.svg +3 -0
  49. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_us.svg +4 -0
  50. package/projects/carriera-intern-components/public/assets/icons/banks/ic_bank_wells_fargo.svg +3 -0
  51. package/projects/carriera-intern-components/public/assets/icons/cai-color.svg +3 -0
  52. package/projects/carriera-intern-components/public/assets/icons/cai-drop-zone-focus.svg +48 -0
  53. package/projects/carriera-intern-components/public/assets/icons/cai-edit.svg +4 -0
  54. package/projects/carriera-intern-components/public/assets/icons/cai-edit2.svg +3 -0
  55. package/projects/carriera-intern-components/public/assets/icons/cai-expand.svg +3 -0
  56. package/projects/carriera-intern-components/public/assets/icons/cai-gps.svg +3 -0
  57. package/projects/carriera-intern-components/public/assets/icons/cai-illustration-dark.svg +4 -0
  58. package/projects/carriera-intern-components/public/assets/icons/cai-illustration-drop-zone-cover.svg +34 -0
  59. package/projects/carriera-intern-components/public/assets/icons/cai-illustration-drop-zone-profile.svg +58 -0
  60. package/projects/carriera-intern-components/public/assets/icons/cai-illustration-drop-zone-video.svg +41 -0
  61. package/projects/carriera-intern-components/public/assets/icons/cai-illustration-drop-zone.svg +43 -0
  62. package/projects/carriera-intern-components/public/assets/icons/cai-illustration.svg +18 -0
  63. package/projects/carriera-intern-components/public/assets/icons/cai-loader.svg +3 -0
  64. package/projects/carriera-intern-components/public/assets/icons/cai-search.svg +3 -0
  65. package/projects/carriera-intern-components/public/assets/icons/cai-violation-hazmat.svg +3 -0
  66. package/projects/carriera-intern-components/public/assets/icons/fuel-contact/cai-contact.svg +3 -0
  67. package/projects/carriera-intern-components/public/assets/icons/fuel-contact/cai-count.svg +3 -0
  68. package/projects/carriera-intern-components/public/assets/icons/fuel-contact/cai-fuel-card.svg +3 -0
  69. package/projects/carriera-intern-components/public/assets/icons/fuel-contact/cai-people.svg +3 -0
  70. package/projects/carriera-intern-components/public/assets/icons/fuel-contact/cai-share.svg +3 -0
  71. package/projects/carriera-intern-components/public/assets/icons/fuel-contact/cai-user-2.svg +3 -0
  72. package/projects/carriera-intern-components/public/assets/icons/general/cai-address.svg +3 -0
  73. package/projects/carriera-intern-components/public/assets/icons/general/cai-checkmark.svg +3 -0
  74. package/projects/carriera-intern-components/public/assets/icons/general/cai-date.svg +3 -0
  75. package/projects/carriera-intern-components/public/assets/icons/general/cai-email.svg +3 -0
  76. package/projects/carriera-intern-components/public/assets/icons/general/cai-fax.svg +5 -0
  77. package/projects/carriera-intern-components/public/assets/icons/general/cai-label.svg +3 -0
  78. package/projects/carriera-intern-components/public/assets/icons/general/cai-money-additional.svg +3 -0
  79. package/projects/carriera-intern-components/public/assets/icons/general/cai-money.svg +3 -0
  80. package/projects/carriera-intern-components/public/assets/icons/general/cai-phone-extension.svg +3 -0
  81. package/projects/carriera-intern-components/public/assets/icons/general/cai-phone.svg +3 -0
  82. package/projects/carriera-intern-components/public/assets/icons/general/cai-sort-by.svg +3 -0
  83. package/projects/carriera-intern-components/public/assets/icons/general/cai-sort-descending.svg +4 -0
  84. package/projects/carriera-intern-components/public/assets/icons/general/cai-website.svg +3 -0
  85. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_corrosive_8.svg +6 -0
  86. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_dangerous_when_wet_4.svg +4 -0
  87. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_explosives_1_1.svg +6 -0
  88. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_explosives_1_2.svg +6 -0
  89. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_explosives_1_3.svg +6 -0
  90. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_explosives_1_4.svg +6 -0
  91. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_explosives_1_5.svg +6 -0
  92. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_explosives_1_6.svg +6 -0
  93. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_flammable_3.svg +4 -0
  94. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_flammable_gas_2.svg +4 -0
  95. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_flammable_solid_4.svg +5 -0
  96. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_inhalation_hazzard_2.svg +5 -0
  97. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_inhalation_hazzard_6.svg +5 -0
  98. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_organic_peroxide_5_2.svg +7 -0
  99. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_oxidizer_5_1.svg +6 -0
  100. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_oxygen_non_flam_gas_2.svg +6 -0
  101. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_radioactive_7.svg +5 -0
  102. package/projects/carriera-intern-components/public/assets/icons/hazardous/ic_spontaneously_combustible_4.svg +5 -0
  103. package/projects/carriera-intern-components/public/assets/icons/integration/cai-efs.svg +4 -0
  104. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-cancel.svg +3 -0
  105. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-copy.svg +3 -0
  106. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-dislike.svg +3 -0
  107. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-drag.svg +3 -0
  108. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-favorite.svg +3 -0
  109. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-like.svg +3 -0
  110. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-minus.svg +3 -0
  111. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-password-hidden.svg +3 -0
  112. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-password-key.svg +3 -0
  113. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-password-shown.svg +3 -0
  114. package/projects/carriera-intern-components/public/assets/icons/interaction/cai-plus.svg +3 -0
  115. package/projects/carriera-intern-components/public/assets/icons/interaction/cai_time.svg +3 -0
  116. package/projects/carriera-intern-components/public/assets/icons/interaction/cai_x.svg +4 -0
  117. package/projects/carriera-intern-components/public/assets/icons/load/cai-driver.svg +3 -0
  118. package/projects/carriera-intern-components/public/assets/icons/load/cai-load.svg +5 -0
  119. package/projects/carriera-intern-components/public/assets/icons/load/cai-ltl-single.svg +3 -0
  120. package/projects/carriera-intern-components/public/assets/icons/load/cai-parking.svg +3 -0
  121. package/projects/carriera-intern-components/public/assets/icons/load/cai-weight.svg +3 -0
  122. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_atro.svg +6 -0
  123. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_beall.svg +7 -0
  124. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_bedard.svg +8 -0
  125. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_butler.svg +7 -0
  126. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_de_lucio.svg +17 -0
  127. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_dorsey.svg +3 -0
  128. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_east.svg +3 -0
  129. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_fontaine.svg +3 -0
  130. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_fruehauf.svg +3 -0
  131. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_gallegos.svg +3 -0
  132. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_great_dane.svg +3 -0
  133. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_heil.svg +6 -0
  134. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_hudson.svg +3 -0
  135. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_hyndai.svg +3 -0
  136. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_kaufman.svg +3 -0
  137. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_mac.svg +3 -0
  138. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_manac.svg +3 -0
  139. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_polar.svg +3 -0
  140. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_ravens.svg +3 -0
  141. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_reitnouer.svg +12 -0
  142. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_strick.svg +3 -0
  143. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_timpte.svg +8 -0
  144. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_trail_king.svg +7 -0
  145. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_transcraft.svg +12 -0
  146. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_tremcar.svg +10 -0
  147. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_tytal.svg +3 -0
  148. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_utility.svg +3 -0
  149. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_vanguard.svg +3 -0
  150. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_vantage.svg +3 -0
  151. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_wabash.svg +3 -0
  152. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_walinga.svg +8 -0
  153. package/projects/carriera-intern-components/public/assets/icons/makes/trailers/ic_trailer_wilson.svg +3 -0
  154. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_chevrolet.svg +3 -0
  155. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_ford.svg +3 -0
  156. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_freightliner.svg +3 -0
  157. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_gmc.svg +3 -0
  158. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_hino.svg +3 -0
  159. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_international.svg +3 -0
  160. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_isuzu.svg +3 -0
  161. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_kenworth.svg +3 -0
  162. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_mack.svg +3 -0
  163. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_peterbilt.svg +3 -0
  164. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_volvo.svg +3 -0
  165. package/projects/carriera-intern-components/public/assets/icons/makes/trucks/ic_truck_western_star.svg +3 -0
  166. package/projects/carriera-intern-components/public/assets/icons/menu/cai-delete.svg +4 -0
  167. package/projects/carriera-intern-components/public/assets/icons/menu/cai-download.svg +3 -0
  168. package/projects/carriera-intern-components/public/assets/icons/menu/cai-reset.svg +3 -0
  169. package/projects/carriera-intern-components/public/assets/icons/pm/cai-pm-base.svg +3 -0
  170. package/projects/carriera-intern-components/public/assets/icons/pm/trailer/cai-pm-general.svg +3 -0
  171. package/projects/carriera-intern-components/public/assets/icons/pm/trailer/cai-pm-pto-pump.svg +5 -0
  172. package/projects/carriera-intern-components/public/assets/icons/pm/trailer/cai-repair-reefer.svg +3 -0
  173. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-air-filter.svg +5 -0
  174. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-alignment.svg +5 -0
  175. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-battery.svg +3 -0
  176. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-belts.svg +5 -0
  177. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-brake-chamber.svg +3 -0
  178. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-engine-oil-filter.svg +4 -0
  179. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-engine-tune-up.svg +3 -0
  180. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-radiator.svg +3 -0
  181. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-transmission-fluid.svg +4 -0
  182. package/projects/carriera-intern-components/public/assets/icons/pm/truck/cai-pm-turbo.svg +3 -0
  183. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-ab.svg +3 -0
  184. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-bc.svg +35 -0
  185. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-mb.svg +3 -0
  186. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-nb.svg +7 -0
  187. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-nl.svg +4 -0
  188. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-ns.svg +6 -0
  189. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-on.svg +7 -0
  190. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-pe.svg +3 -0
  191. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-qc.svg +4 -0
  192. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-sk.svg +3 -0
  193. package/projects/carriera-intern-components/public/assets/icons/states/ca/cai-ca-yt.svg +3 -0
  194. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ak.svg +14 -0
  195. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-al.svg +3 -0
  196. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ar.svg +3 -0
  197. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-az.svg +3 -0
  198. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ca.svg +3 -0
  199. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-co.svg +3 -0
  200. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ct.svg +3 -0
  201. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-de.svg +3 -0
  202. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-fl.svg +3 -0
  203. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ga.svg +3 -0
  204. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-hi.svg +10 -0
  205. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ia.svg +3 -0
  206. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-id.svg +3 -0
  207. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-il.svg +3 -0
  208. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-in.svg +3 -0
  209. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ks.svg +3 -0
  210. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ky.svg +3 -0
  211. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-la.svg +4 -0
  212. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ma.svg +7 -0
  213. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-md.svg +7 -0
  214. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-me.svg +9 -0
  215. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-mi.svg +11 -0
  216. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-mn.svg +4 -0
  217. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-mo.svg +3 -0
  218. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ms.svg +3 -0
  219. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-mt.svg +3 -0
  220. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-nc.svg +3 -0
  221. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-nd.svg +3 -0
  222. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ne.svg +3 -0
  223. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-nh.svg +3 -0
  224. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-nj.svg +5 -0
  225. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-nm.svg +3 -0
  226. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-nv.svg +3 -0
  227. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ny.svg +4 -0
  228. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-oh.svg +4 -0
  229. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ok.svg +3 -0
  230. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-or.svg +3 -0
  231. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-pa.svg +3 -0
  232. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ri.svg +8 -0
  233. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-sc.svg +3 -0
  234. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-sd.svg +3 -0
  235. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-tn.svg +3 -0
  236. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-tx.svg +3 -0
  237. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-ut.svg +3 -0
  238. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-va.svg +4 -0
  239. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-vt.svg +7 -0
  240. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-wa.svg +15 -0
  241. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-wi.svg +4 -0
  242. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-wv.svg +3 -0
  243. package/projects/carriera-intern-components/public/assets/icons/states/us/cai-us-wy.svg +3 -0
  244. package/projects/carriera-intern-components/public/assets/icons/status/cai-status-warning-lite.svg +3 -0
  245. package/projects/carriera-intern-components/public/assets/icons/status/cai-status-warning.svg +3 -0
  246. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_bottom-dump.svg +5 -0
  247. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_carhauler-stinger.svg +5 -0
  248. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_carhauler.svg +5 -0
  249. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_chassis.svg +5 -0
  250. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_conestoga.svg +13 -0
  251. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_container.svg +6 -0
  252. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_dryvan.svg +5 -0
  253. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_end-dump.svg +5 -0
  254. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_flatbed.svg +5 -0
  255. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_hopper.svg +6 -0
  256. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_low-boy.svg +6 -0
  257. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_reefer.svg +5 -0
  258. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_side-kit.svg +6 -0
  259. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_step-deck.svg +7 -0
  260. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_tanker-pneumatic.svg +5 -0
  261. package/projects/carriera-intern-components/public/assets/icons/trailers/ic_trailer_tanker.svg +5 -0
  262. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_box-truck.svg +7 -0
  263. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_car-hauler.svg +7 -0
  264. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_cargo-van.svg +5 -0
  265. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_cement.svg +8 -0
  266. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_dump.svg +8 -0
  267. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_garbage.svg +10 -0
  268. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_reefer.svg +6 -0
  269. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_semi-truck.svg +8 -0
  270. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_semi-wSleeper.svg +8 -0
  271. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_spotter.svg +6 -0
  272. package/projects/carriera-intern-components/public/assets/icons/trucks/ic_truck_tow-truck.svg +8 -0
  273. package/projects/carriera-intern-components/public/assets/invexample.png +0 -0
  274. package/projects/carriera-intern-components/public/assets/invoice.png +0 -0
  275. package/projects/carriera-intern-components/public/assets/json/icons.json +985 -0
  276. package/projects/carriera-intern-components/public/assets/truck.png +0 -0
  277. package/projects/carriera-intern-components/public/favicon.ico +0 -0
  278. package/projects/carriera-intern-components/src/Changelog.mdx +285 -0
  279. package/projects/carriera-intern-components/src/Icons.mdx +279 -0
  280. package/projects/carriera-intern-components/src/app/app.config.ts +26 -0
  281. package/projects/carriera-intern-components/src/app/components/avatar/avatar.component.html +28 -0
  282. package/projects/carriera-intern-components/src/app/components/avatar/avatar.component.scss +414 -0
  283. package/projects/carriera-intern-components/src/app/components/avatar/avatar.component.spec.ts +23 -0
  284. package/projects/carriera-intern-components/src/app/components/avatar/avatar.component.ts +66 -0
  285. package/projects/carriera-intern-components/src/app/components/avatar/avatar.stories.ts +787 -0
  286. package/projects/carriera-intern-components/src/app/components/avatar/models/avatar.model.ts +52 -0
  287. package/projects/carriera-intern-components/src/app/components/avatar/models/index.ts +1 -0
  288. package/projects/carriera-intern-components/src/app/components/avatar/pipes/avatar-classes.pipe.ts +98 -0
  289. package/projects/carriera-intern-components/src/app/components/avatar/pipes/index.ts +2 -0
  290. package/projects/carriera-intern-components/src/app/components/avatar/pipes/initials.pipe.ts +31 -0
  291. package/projects/carriera-intern-components/src/app/components/content-driven-co/content-driven-co.component.css +0 -0
  292. package/projects/carriera-intern-components/src/app/components/content-driven-co/content-driven-co.component.html +10 -0
  293. package/projects/carriera-intern-components/src/app/components/content-driven-co/content-driven-co.component.spec.ts +23 -0
  294. package/projects/carriera-intern-components/src/app/components/content-driven-co/content-driven-co.component.ts +25 -0
  295. package/projects/carriera-intern-components/src/app/components/content-driven-co/content-driven-co.stories.ts +65 -0
  296. package/projects/carriera-intern-components/src/app/components/copy/copy.component.html +66 -0
  297. package/projects/carriera-intern-components/src/app/components/copy/copy.component.scss +103 -0
  298. package/projects/carriera-intern-components/src/app/components/copy/copy.component.spec.ts +22 -0
  299. package/projects/carriera-intern-components/src/app/components/copy/copy.component.ts +57 -0
  300. package/projects/carriera-intern-components/src/app/components/copy/stories/copy.stories.ts +170 -0
  301. package/projects/carriera-intern-components/src/app/components/counter/counter.component.html +33 -0
  302. package/projects/carriera-intern-components/src/app/components/counter/counter.component.scss +197 -0
  303. package/projects/carriera-intern-components/src/app/components/counter/counter.component.spec.ts +22 -0
  304. package/projects/carriera-intern-components/src/app/components/counter/counter.component.ts +219 -0
  305. package/projects/carriera-intern-components/src/app/components/counter/counter.stories.ts +65 -0
  306. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/dispatch-dropdown.component.html +223 -0
  307. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/dispatch-dropdown.component.scss +792 -0
  308. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/dispatch-dropdown.component.spec.ts +23 -0
  309. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/dispatch-dropdown.component.ts +323 -0
  310. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/dispatch-dropdown.stories.ts +409 -0
  311. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/helpers/dispatch-dropdown.helper.ts +248 -0
  312. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/interfaces/dispatch-dropdown-config.interface.ts +10 -0
  313. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/interfaces/dispatch-dropdown-option.interface.ts +4 -0
  314. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/interfaces/index.ts +2 -0
  315. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/mock/parking-data.json +1550 -0
  316. package/projects/carriera-intern-components/src/app/components/dispatch-dropdown/pipes/dispatch-search-filter.pipe.ts +26 -0
  317. package/projects/carriera-intern-components/src/app/components/dispatch-location/dispatch-location.component.html +76 -0
  318. package/projects/carriera-intern-components/src/app/components/dispatch-location/dispatch-location.component.scss +141 -0
  319. package/projects/carriera-intern-components/src/app/components/dispatch-location/dispatch-location.component.spec.ts +22 -0
  320. package/projects/carriera-intern-components/src/app/components/dispatch-location/dispatch-location.component.ts +268 -0
  321. package/projects/carriera-intern-components/src/app/components/dispatch-location/dispatch-location.stories.ts +184 -0
  322. package/projects/carriera-intern-components/src/app/components/dispatch-location/interfaces/index.ts +1 -0
  323. package/projects/carriera-intern-components/src/app/components/dispatch-location/interfaces/last-status-data.interface.ts +6 -0
  324. package/projects/carriera-intern-components/src/app/components/dispatch-location/pipes/last-status-format.pipe.ts +35 -0
  325. package/projects/carriera-intern-components/src/app/components/document-preview/document-preview.component.html +229 -0
  326. package/projects/carriera-intern-components/src/app/components/document-preview/document-preview.component.scss +1115 -0
  327. package/projects/carriera-intern-components/src/app/components/document-preview/document-preview.component.spec.ts +23 -0
  328. package/projects/carriera-intern-components/src/app/components/document-preview/document-preview.component.ts +277 -0
  329. package/projects/carriera-intern-components/src/app/components/document-preview/document-preview.stories.ts +256 -0
  330. package/projects/carriera-intern-components/src/app/components/document-preview/interfaces/document-tag.interface.ts +4 -0
  331. package/projects/carriera-intern-components/src/app/components/document-preview/interfaces/index.ts +1 -0
  332. package/projects/carriera-intern-components/src/app/components/document-preview/utils/config/button-actions.config.ts +30 -0
  333. package/projects/carriera-intern-components/src/app/components/document-preview/utils/config/index.ts +1 -0
  334. package/projects/carriera-intern-components/src/app/components/drop-zone/drop-zone.component.html +376 -0
  335. package/projects/carriera-intern-components/src/app/components/drop-zone/drop-zone.component.scss +9 -0
  336. package/projects/carriera-intern-components/src/app/components/drop-zone/drop-zone.component.spec.ts +22 -0
  337. package/projects/carriera-intern-components/src/app/components/drop-zone/drop-zone.component.ts +1272 -0
  338. package/projects/carriera-intern-components/src/app/components/drop-zone/drop-zone.stories.ts +1253 -0
  339. package/projects/carriera-intern-components/src/app/components/drop-zone/enums/drop-zone-labels.enum.ts +0 -0
  340. package/projects/carriera-intern-components/src/app/components/drop-zone/enums/drop-zone-variant.enum.ts +7 -0
  341. package/projects/carriera-intern-components/src/app/components/drop-zone/enums/index.ts +1 -0
  342. package/projects/carriera-intern-components/src/app/components/drop-zone/models/app-file.model.ts +28 -0
  343. package/projects/carriera-intern-components/src/app/components/drop-zone/models/file.response.ts +10 -0
  344. package/projects/carriera-intern-components/src/app/components/drop-zone/models/index.ts +2 -0
  345. package/projects/carriera-intern-components/src/app/components/drop-zone/pipes/drag-mode-animation.pipe.ts +40 -0
  346. package/projects/carriera-intern-components/src/app/components/drop-zone/utils/helpers/drop-zone-documents.helper.ts +67 -0
  347. package/projects/carriera-intern-components/src/app/components/drop-zone/utils/helpers/index.ts +1 -0
  348. package/projects/carriera-intern-components/src/app/components/drop-zone/utils/styles/drop-zone-cropper.scss +202 -0
  349. package/projects/carriera-intern-components/src/app/components/drop-zone/utils/styles/drop-zone-documents.scss +166 -0
  350. package/projects/carriera-intern-components/src/app/components/drop-zone/utils/styles/drop-zone-drag-mode.scss +107 -0
  351. package/projects/carriera-intern-components/src/app/components/drop-zone/utils/styles/drop-zone-images.scss +106 -0
  352. package/projects/carriera-intern-components/src/app/components/drop-zone/utils/styles/drop-zone-layout.scss +208 -0
  353. package/projects/carriera-intern-components/src/app/components/drop-zone/utils/styles/drop-zone-states.scss +183 -0
  354. package/projects/carriera-intern-components/src/app/components/drop-zone/utils/styles/drop-zone-variations.scss +189 -0
  355. package/projects/carriera-intern-components/src/app/components/input/directives/helpers/index.ts +1 -0
  356. package/projects/carriera-intern-components/src/app/components/input/directives/helpers/mask.helper.ts +52 -0
  357. package/projects/carriera-intern-components/src/app/components/input/directives/mask.directive.spec.ts +13 -0
  358. package/projects/carriera-intern-components/src/app/components/input/directives/mask.directive.ts +274 -0
  359. package/projects/carriera-intern-components/src/app/components/input/directives/number-format.directive.spec.ts +13 -0
  360. package/projects/carriera-intern-components/src/app/components/input/directives/number-format.directive.ts +442 -0
  361. package/projects/carriera-intern-components/src/app/components/input/directives/password.directive.spec.ts +13 -0
  362. package/projects/carriera-intern-components/src/app/components/input/directives/password.directive.ts +282 -0
  363. package/projects/carriera-intern-components/src/app/components/input/input.component.html +2669 -0
  364. package/projects/carriera-intern-components/src/app/components/input/input.component.scss +3000 -0
  365. package/projects/carriera-intern-components/src/app/components/input/input.component.spec.ts +23 -0
  366. package/projects/carriera-intern-components/src/app/components/input/input.component.ts +1486 -0
  367. package/projects/carriera-intern-components/src/app/components/input/mock/banks.json +249 -0
  368. package/projects/carriera-intern-components/src/app/components/input/mock/basic.json +42 -0
  369. package/projects/carriera-intern-components/src/app/components/input/mock/brokers.json +544 -0
  370. package/projects/carriera-intern-components/src/app/components/input/mock/colors.json +95 -0
  371. package/projects/carriera-intern-components/src/app/components/input/mock/commodities.json +12 -0
  372. package/projects/carriera-intern-components/src/app/components/input/mock/contacts.json +117 -0
  373. package/projects/carriera-intern-components/src/app/components/input/mock/dispatchers.json +83 -0
  374. package/projects/carriera-intern-components/src/app/components/input/mock/dispatches.json +4188 -0
  375. package/projects/carriera-intern-components/src/app/components/input/mock/fuel-list-dropdown.json +968 -0
  376. package/projects/carriera-intern-components/src/app/components/input/mock/fuel-transaction.json +78 -0
  377. package/projects/carriera-intern-components/src/app/components/input/mock/fuelcard.json +472 -0
  378. package/projects/carriera-intern-components/src/app/components/input/mock/hazardous.json +166 -0
  379. package/projects/carriera-intern-components/src/app/components/input/mock/labelColors.json +81 -0
  380. package/projects/carriera-intern-components/src/app/components/input/mock/labels.json +169 -0
  381. package/projects/carriera-intern-components/src/app/components/input/mock/new-load-modal-res.json +1148 -0
  382. package/projects/carriera-intern-components/src/app/components/input/mock/noboard.json +1665 -0
  383. package/projects/carriera-intern-components/src/app/components/input/mock/owner.json +209 -0
  384. package/projects/carriera-intern-components/src/app/components/input/mock/pm.json +112 -0
  385. package/projects/carriera-intern-components/src/app/components/input/mock/shipper.json +1192 -0
  386. package/projects/carriera-intern-components/src/app/components/input/mock/split-driver.json +99 -0
  387. package/projects/carriera-intern-components/src/app/components/input/mock/split-trailer.json +79 -0
  388. package/projects/carriera-intern-components/src/app/components/input/mock/split-truck.json +49 -0
  389. package/projects/carriera-intern-components/src/app/components/input/mock/states.json +605 -0
  390. package/projects/carriera-intern-components/src/app/components/input/mock/toll.json +106 -0
  391. package/projects/carriera-intern-components/src/app/components/input/mock/trailermakes.json +196 -0
  392. package/projects/carriera-intern-components/src/app/components/input/mock/truck_trailer.json +184 -0
  393. package/projects/carriera-intern-components/src/app/components/input/mock/truckmakes.json +76 -0
  394. package/projects/carriera-intern-components/src/app/components/input/models/dropdown.model.ts +376 -0
  395. package/projects/carriera-intern-components/src/app/components/input/models/index.ts +2 -0
  396. package/projects/carriera-intern-components/src/app/components/input/models/input.model.ts +227 -0
  397. package/projects/carriera-intern-components/src/app/components/input/pipes/broker-progress.pipe.ts +36 -0
  398. package/projects/carriera-intern-components/src/app/components/input/pipes/clear-tooltip.pipe.ts +38 -0
  399. package/projects/carriera-intern-components/src/app/components/input/pipes/error-message.pipe.ts +54 -0
  400. package/projects/carriera-intern-components/src/app/components/input/pipes/highlight-search.pipe.ts +42 -0
  401. package/projects/carriera-intern-components/src/app/components/input/pipes/index.ts +6 -0
  402. package/projects/carriera-intern-components/src/app/components/input/pipes/input-class.pipe.ts +109 -0
  403. package/projects/carriera-intern-components/src/app/components/input/pipes/remap-pm-icons.pipe.ts +49 -0
  404. package/projects/carriera-intern-components/src/app/components/input/stories/Documentation.mdx +190 -0
  405. package/projects/carriera-intern-components/src/app/components/input/stories/dropdown-options.ts +80 -0
  406. package/projects/carriera-intern-components/src/app/components/input/stories/dropdown.stories.ts +376 -0
  407. package/projects/carriera-intern-components/src/app/components/input/stories/input-dropdown.stories.ts +405 -0
  408. package/projects/carriera-intern-components/src/app/components/input/stories/input-inverse.stories.ts +232 -0
  409. package/projects/carriera-intern-components/src/app/components/input/stories/input-load.stories.ts +150 -0
  410. package/projects/carriera-intern-components/src/app/components/input/stories/input-placeholder.stories.ts +225 -0
  411. package/projects/carriera-intern-components/src/app/components/input/stories/input-subcontent.stories.ts +264 -0
  412. package/projects/carriera-intern-components/src/app/components/input/stories/input-table.stories.ts +211 -0
  413. package/projects/carriera-intern-components/src/app/components/input/stories/input.stories.ts +1159 -0
  414. package/projects/carriera-intern-components/src/app/components/input/stories/modal.stories.ts +162 -0
  415. package/projects/carriera-intern-components/src/app/components/input/utilities/constants/cast.constants.ts +91 -0
  416. package/projects/carriera-intern-components/src/app/components/input/utilities/constants/index.ts +1 -0
  417. package/projects/carriera-intern-components/src/app/components/input/utilities/helpers/index.ts +2 -0
  418. package/projects/carriera-intern-components/src/app/components/input/utilities/helpers/input.helper.ts +985 -0
  419. package/projects/carriera-intern-components/src/app/components/input/utilities/helpers/keyboard-navigation.helper.ts +402 -0
  420. package/projects/carriera-intern-components/src/app/components/input/utilities/index.ts +2 -0
  421. package/projects/carriera-intern-components/src/app/components/input-address/enums/input-address-layers-string.enum.ts +4 -0
  422. package/projects/carriera-intern-components/src/app/components/input-address/enums/input-address-type-string.enum.ts +7 -0
  423. package/projects/carriera-intern-components/src/app/components/input-address/input-address.component.html +13 -0
  424. package/projects/carriera-intern-components/src/app/components/input-address/input-address.component.scss +0 -0
  425. package/projects/carriera-intern-components/src/app/components/input-address/input-address.component.spec.ts +22 -0
  426. package/projects/carriera-intern-components/src/app/components/input-address/input-address.component.ts +509 -0
  427. package/projects/carriera-intern-components/src/app/components/input-address/models/address-data.model.ts +22 -0
  428. package/projects/carriera-intern-components/src/app/components/input-address/models/address-list.model.ts +6 -0
  429. package/projects/carriera-intern-components/src/app/components/input-address/models/long-lat.model.ts +4 -0
  430. package/projects/carriera-intern-components/src/app/components/input-address/models/sent-address-data.model.ts +25 -0
  431. package/projects/carriera-intern-components/src/app/components/input-address/stories/address.stories.ts +181 -0
  432. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/cai-input-datetime-picker.component.html +180 -0
  433. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/cai-input-datetime-picker.component.scss +862 -0
  434. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/cai-input-datetime-picker.component.ts +1559 -0
  435. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/cai-input-datetime-picker.stories.ts +507 -0
  436. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/cai-custom-datetime-pickers.component.html +134 -0
  437. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/cai-custom-datetime-pickers.component.scss +0 -0
  438. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/cai-custom-datetime-pickers.component.spec.ts +24 -0
  439. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/cai-custom-datetime-pickers.component.ts +331 -0
  440. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-dates-main/cai-custom-datetime-pickers-calendar-dates-main.component.html +190 -0
  441. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-dates-main/cai-custom-datetime-pickers-calendar-dates-main.component.scss +0 -0
  442. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-dates-main/cai-custom-datetime-pickers-calendar-dates-main.component.spec.ts +26 -0
  443. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-dates-main/cai-custom-datetime-pickers-calendar-dates-main.component.ts +234 -0
  444. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-days/cai-custom-datetime-pickers-calendar-days.component.html +23 -0
  445. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-days/cai-custom-datetime-pickers-calendar-days.component.scss +0 -0
  446. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-days/cai-custom-datetime-pickers-calendar-days.component.spec.ts +26 -0
  447. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-days/cai-custom-datetime-pickers-calendar-days.component.ts +60 -0
  448. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-left/cai-custom-datetime-pickers-calendar-left.component.html +27 -0
  449. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-left/cai-custom-datetime-pickers-calendar-left.component.scss +0 -0
  450. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-left/cai-custom-datetime-pickers-calendar-left.component.spec.ts +26 -0
  451. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-calendar-left/cai-custom-datetime-pickers-calendar-left.component.ts +187 -0
  452. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-date-calendars/cai-custom-datetime-pickers-date-calendars.component.html +68 -0
  453. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-date-calendars/cai-custom-datetime-pickers-date-calendars.component.scss +0 -0
  454. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-date-calendars/cai-custom-datetime-pickers-date-calendars.component.spec.ts +26 -0
  455. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/components/cai-custom-datetime-pickers-date-calendars/cai-custom-datetime-pickers-date-calendars.component.ts +163 -0
  456. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/config/cai-input.config.ts +193 -0
  457. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/config/index.ts +1 -0
  458. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/enums/calendar-left-string.enum.ts +5 -0
  459. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/enums/calendar-list-preview-string.enum.ts +4 -0
  460. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/enums/calendar-main-string.enum.ts +5 -0
  461. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/enums/calendar-scroll-type-string.enum.ts +4 -0
  462. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/enums/calendar-string.enum.ts +6 -0
  463. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/enums/calendar-type-string.enum.ts +3 -0
  464. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/enums/config.enum.ts +7 -0
  465. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/models/scroll-change.model.ts +6 -0
  466. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/models/scroll-type.model.ts +8 -0
  467. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/pipes/calendar-months.pipe.ts +23 -0
  468. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/services/calendar-datetime-picker.service.ts +35 -0
  469. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/strategy/calendar-strategy.ts +120 -0
  470. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/components/cai-custom-datetime-pickers/utils/constants/custom-datetime-pickers.constants.ts +48 -0
  471. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/enums/input-config-name-string.enum.ts +7 -0
  472. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/interfaces/index.ts +1 -0
  473. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/interfaces/input-datetime.interface.ts +11 -0
  474. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/models/index.ts +5 -0
  475. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/models/label-color.model.ts +11 -0
  476. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/pipes/input-clear-class.pipe.ts +105 -0
  477. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/pipes/input-date-time-container-class.pipe.ts +66 -0
  478. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/pipes/input-dropdown-arrow-class.pipe.ts +68 -0
  479. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/pipes/input-placeholder-icon.class.pipe.ts +68 -0
  480. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/pipes/show-clear.pipe.ts +20 -0
  481. package/projects/carriera-intern-components/src/app/components/input-datetime-picker/scss/ca-input.colors.scss +287 -0
  482. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/list-contact-dropdown.component.html +194 -0
  483. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/list-contact-dropdown.component.scss +613 -0
  484. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/list-contact-dropdown.component.spec.ts +22 -0
  485. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/list-contact-dropdown.component.ts +208 -0
  486. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/list-contact-dropdown.stories.ts +52 -0
  487. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/mock/brokerContacts.json +74 -0
  488. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/models/contact.interface.ts +23 -0
  489. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/pipes/contact-count.pipe.ts +14 -0
  490. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/pipes/contacts-height.pipe.ts +34 -0
  491. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/pipes/departments-height.pipe.ts +57 -0
  492. package/projects/carriera-intern-components/src/app/components/list-contact-dropdown/pipes/map-contacts.pipe.ts +51 -0
  493. package/projects/carriera-intern-components/src/app/components/pm/mock/repair-pm.json +2743 -0
  494. package/projects/carriera-intern-components/src/app/components/pm/pm.component.html +82 -0
  495. package/projects/carriera-intern-components/src/app/components/pm/pm.component.scss +260 -0
  496. package/projects/carriera-intern-components/src/app/components/pm/pm.component.spec.ts +23 -0
  497. package/projects/carriera-intern-components/src/app/components/pm/pm.component.ts +207 -0
  498. package/projects/carriera-intern-components/src/app/components/pm/pm.stories.ts +104 -0
  499. package/projects/carriera-intern-components/src/app/components/rating_review/enums/filter-type.enum.ts +7 -0
  500. package/projects/carriera-intern-components/src/app/components/rating_review/enums/review-type.enum.ts +5 -0
  501. package/projects/carriera-intern-components/src/app/components/rating_review/pipes/date-formating.pipe.spec.ts +8 -0
  502. package/projects/carriera-intern-components/src/app/components/rating_review/pipes/date-formating.pipe.ts +42 -0
  503. package/projects/carriera-intern-components/src/app/components/rating_review/rating-review/rating-review/rating-review.component.html +57 -0
  504. package/projects/carriera-intern-components/src/app/components/rating_review/rating-review/rating-review/rating-review.component.scss +94 -0
  505. package/projects/carriera-intern-components/src/app/components/rating_review/rating-review/rating-review/rating-review.component.spec.ts +23 -0
  506. package/projects/carriera-intern-components/src/app/components/rating_review/rating-review/rating-review/rating-review.component.ts +105 -0
  507. package/projects/carriera-intern-components/src/app/components/rating_review/rating-review/rating-review/rating-review.stories.ts +451 -0
  508. package/projects/carriera-intern-components/src/app/components/rating_review/review-modal/review-modal.component.html +236 -0
  509. package/projects/carriera-intern-components/src/app/components/rating_review/review-modal/review-modal.component.scss +564 -0
  510. package/projects/carriera-intern-components/src/app/components/rating_review/review-modal/review-modal.component.ts +360 -0
  511. package/projects/carriera-intern-components/src/app/components/rating_review/single-review/single-review.component.html +321 -0
  512. package/projects/carriera-intern-components/src/app/components/rating_review/single-review/single-review.component.scss +887 -0
  513. package/projects/carriera-intern-components/src/app/components/rating_review/single-review/single-review.component.ts +159 -0
  514. package/projects/carriera-intern-components/src/app/components/selected-location-field/interfaces/index.ts +1 -0
  515. package/projects/carriera-intern-components/src/app/components/selected-location-field/interfaces/selected-business-field.interface.ts +11 -0
  516. package/projects/carriera-intern-components/src/app/components/selected-location-field/selected-business-field.component.html +100 -0
  517. package/projects/carriera-intern-components/src/app/components/selected-location-field/selected-business-field.component.scss +239 -0
  518. package/projects/carriera-intern-components/src/app/components/selected-location-field/selected-business-field.component.spec.ts +22 -0
  519. package/projects/carriera-intern-components/src/app/components/selected-location-field/selected-business-field.component.ts +28 -0
  520. package/projects/carriera-intern-components/src/app/components/selected-location-field/selected-business-field.stories.ts +132 -0
  521. package/projects/carriera-intern-components/src/app/components/signature/signature.component.html +63 -0
  522. package/projects/carriera-intern-components/src/app/components/signature/signature.component.scss +229 -0
  523. package/projects/carriera-intern-components/src/app/components/signature/signature.component.spec.ts +23 -0
  524. package/projects/carriera-intern-components/src/app/components/signature/signature.component.ts +102 -0
  525. package/projects/carriera-intern-components/src/app/components/signature/signature.stories.ts +32 -0
  526. package/projects/carriera-intern-components/src/app/components/sticky-scrollbar/enums/index.ts +1 -0
  527. package/projects/carriera-intern-components/src/app/components/sticky-scrollbar/enums/scroll-state.enum.ts +6 -0
  528. package/projects/carriera-intern-components/src/app/components/sticky-scrollbar/sticky-scrollbar.component.html +29 -0
  529. package/projects/carriera-intern-components/src/app/components/sticky-scrollbar/sticky-scrollbar.component.scss +106 -0
  530. package/projects/carriera-intern-components/src/app/components/sticky-scrollbar/sticky-scrollbar.component.spec.ts +23 -0
  531. package/projects/carriera-intern-components/src/app/components/sticky-scrollbar/sticky-scrollbar.component.ts +458 -0
  532. package/projects/carriera-intern-components/src/app/components/sticky-scrollbar/sticky-scrollbar.stories.ts +343 -0
  533. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/interfaces/index.ts +2 -0
  534. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/interfaces/tab-option-config.interface.ts +4 -0
  535. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/interfaces/tab-option.interface.ts +4 -0
  536. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/pipes/index.ts +1 -0
  537. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/pipes/tab-search-filter.pipe.ts +20 -0
  538. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/tab-option-dropdown.component.html +66 -0
  539. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/tab-option-dropdown.component.scss +441 -0
  540. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/tab-option-dropdown.component.spec.ts +22 -0
  541. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/tab-option-dropdown.component.ts +105 -0
  542. package/projects/carriera-intern-components/src/app/components/tab-option-dropdown/tab-option.stories.ts +93 -0
  543. package/projects/carriera-intern-components/src/app/components/text-area/interfaces/index.ts +1 -0
  544. package/projects/carriera-intern-components/src/app/components/text-area/interfaces/text-area.interface.ts +4 -0
  545. package/projects/carriera-intern-components/src/app/components/text-area/text-area.component.html +29 -0
  546. package/projects/carriera-intern-components/src/app/components/text-area/text-area.component.scss +294 -0
  547. package/projects/carriera-intern-components/src/app/components/text-area/text-area.component.spec.ts +23 -0
  548. package/projects/carriera-intern-components/src/app/components/text-area/text-area.component.ts +213 -0
  549. package/projects/carriera-intern-components/src/app/components/text-area/text-area.stories.ts +90 -0
  550. package/projects/carriera-intern-components/src/app/components/toolbar-dropdown/interfaces/index.ts +1 -0
  551. package/projects/carriera-intern-components/src/app/components/toolbar-dropdown/interfaces/interval-dropdown-option.interface.ts +10 -0
  552. package/projects/carriera-intern-components/src/app/components/toolbar-dropdown/interval-dropdown.component.html +98 -0
  553. package/projects/carriera-intern-components/src/app/components/toolbar-dropdown/interval-dropdown.component.scss +437 -0
  554. package/projects/carriera-intern-components/src/app/components/toolbar-dropdown/interval-dropdown.component.spec.ts +22 -0
  555. package/projects/carriera-intern-components/src/app/components/toolbar-dropdown/interval-dropdown.component.ts +160 -0
  556. package/projects/carriera-intern-components/src/app/components/toolbar-dropdown/interval-dropdown.stories.ts +77 -0
  557. package/projects/carriera-intern-components/src/app/components/toolbar-dropdown/pipes/dropdown-filter-input-config.pipe.ts +52 -0
  558. package/projects/carriera-intern-components/src/app/components/toolbar-dropdown/utils/helpers/interval-dropdown.helper.ts +193 -0
  559. package/projects/carriera-intern-components/src/app/directives/hover-svg-directives.ts +49 -0
  560. package/projects/carriera-intern-components/src/app/directives/index.ts +3 -0
  561. package/projects/carriera-intern-components/src/app/directives/infinite-scroll.directive.ts +64 -0
  562. package/projects/carriera-intern-components/src/app/directives/intersection-observer.directive.ts +50 -0
  563. package/projects/carriera-intern-components/src/app/enums/alignment.enum.ts +4 -0
  564. package/projects/carriera-intern-components/src/app/enums/general-actions.enum.ts +71 -0
  565. package/projects/carriera-intern-components/src/app/enums/index.ts +3 -0
  566. package/projects/carriera-intern-components/src/app/enums/string-placeholder.enum.ts +3 -0
  567. package/projects/carriera-intern-components/src/app/models/pm.model.ts +11 -0
  568. package/projects/carriera-intern-components/src/app/models/review.model.ts +29 -0
  569. package/projects/carriera-intern-components/src/app/models/truck.model.ts +5 -0
  570. package/projects/carriera-intern-components/src/app/pipes/bytes-to-human-readable.pipe.spec.ts +8 -0
  571. package/projects/carriera-intern-components/src/app/pipes/bytes-to-human-readable.pipe.ts +29 -0
  572. package/projects/carriera-intern-components/src/app/pipes/currency.pipe.spec.ts +8 -0
  573. package/projects/carriera-intern-components/src/app/pipes/currency.pipe.ts +61 -0
  574. package/projects/carriera-intern-components/src/app/pipes/number-format.pipe.spec.ts +8 -0
  575. package/projects/carriera-intern-components/src/app/pipes/number-format.pipe.ts +30 -0
  576. package/projects/carriera-intern-components/src/app/services/document.service.spec.ts +16 -0
  577. package/projects/carriera-intern-components/src/app/services/document.service.ts +168 -0
  578. package/projects/carriera-intern-components/src/app/utils/autofill-validators.ts +32 -0
  579. package/projects/carriera-intern-components/src/app/utils/constants/index.ts +1 -0
  580. package/projects/carriera-intern-components/src/app/utils/constants/input-character-sets.constants.ts +142 -0
  581. package/projects/carriera-intern-components/src/app/utils/index.ts +2 -0
  582. package/projects/carriera-intern-components/src/app/validators/custom-validators.ts +45 -0
  583. package/projects/carriera-intern-components/src/public-api.ts +31 -0
  584. package/projects/carriera-intern-components/src/styles/README.md +59 -0
  585. package/projects/carriera-intern-components/src/styles/_variables.scss +301 -0
  586. package/projects/carriera-intern-components/src/styles/cropper.scss +39 -0
  587. package/projects/carriera-intern-components/src/styles/custompickers.scss +827 -0
  588. package/projects/carriera-intern-components/src/styles/popover.scss +224 -0
  589. package/projects/carriera-intern-components/src/styles/review_variables.scss +45 -0
  590. package/projects/carriera-intern-components/src/styles/tooltip.scss +119 -0
  591. package/projects/carriera-intern-components/src/styles/utility/colors.scss +265 -0
  592. package/projects/carriera-intern-components/src/styles/utility/utilities.scss +17 -0
  593. package/projects/carriera-intern-components/src/styles.scss +43 -0
  594. package/projects/carriera-intern-components/tsconfig.lib.json +15 -0
  595. package/projects/carriera-intern-components/tsconfig.lib.prod.json +11 -0
  596. package/projects/carriera-intern-components/tsconfig.spec.json +15 -0
  597. package/tsconfig.json +33 -0
@@ -0,0 +1,1272 @@
1
+ import {
2
+ Component,
3
+ ElementRef,
4
+ signal,
5
+ ViewChild,
6
+ inject,
7
+ computed,
8
+ input,
9
+ Input,
10
+ Output,
11
+ EventEmitter,
12
+ HostListener,
13
+ OnDestroy,
14
+ AfterViewChecked,
15
+ } from '@angular/core';
16
+ import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
17
+
18
+ //components
19
+ import { SvgIconComponent } from 'angular-svg-icon';
20
+ import { ImageCropperComponent } from 'ngx-image-cropper';
21
+ import { DocumentPreviewComponent } from '../document-preview/document-preview.component';
22
+ import { AvatarComponent } from '../avatar/avatar.component';
23
+ import { LottieComponent } from 'ngx-lottie';
24
+
25
+ //models
26
+ import { AppFile, FileExtension } from './models';
27
+ import { Driver } from '../avatar/models';
28
+ import { FileResponse } from './models/file.response';
29
+
30
+ //modules
31
+ import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
32
+ import { CommonModule } from '@angular/common';
33
+
34
+ //cropper
35
+ import {
36
+ ImageCroppedEvent,
37
+ LoadedImage,
38
+ ImageTransform,
39
+ base64ToFile,
40
+ } from 'ngx-image-cropper';
41
+
42
+ //services
43
+ import { DocumentService } from '../../services/document.service';
44
+
45
+ //forms
46
+ import { FormGroup } from '@angular/forms';
47
+
48
+ //interfaces
49
+ import { DocumentTag } from '../document-preview/interfaces';
50
+ import { AnimationItem } from 'lottie-web';
51
+
52
+ //enums
53
+ import { DropZoneVariant } from './enums';
54
+
55
+ //pipes
56
+ import { DragModeAnimationPipe } from './pipes/drag-mode-animation.pipe';
57
+
58
+ //helpers
59
+ import { DropZoneDocumentsHelper } from './utils/helpers';
60
+
61
+ /**
62
+ * A component that provides a user interface for file uploading via
63
+ * drag-and-drop or a file input dialog. It displays previews of the
64
+ * selected files in a carousel.
65
+ */
66
+ @Component({
67
+ selector: 'cai-drop-zone',
68
+ imports: [
69
+ // modules
70
+ CommonModule,
71
+ NgbTooltipModule,
72
+
73
+ // components
74
+ SvgIconComponent,
75
+ DocumentPreviewComponent,
76
+ ImageCropperComponent,
77
+ AvatarComponent,
78
+ LottieComponent,
79
+
80
+ //pipes
81
+ DragModeAnimationPipe,
82
+ ],
83
+ templateUrl: './drop-zone.component.html',
84
+ styleUrl: './drop-zone.component.scss',
85
+ providers: [],
86
+ })
87
+ export class DropZoneComponent implements OnDestroy, AfterViewChecked {
88
+ // Signals
89
+ public zoomValue = signal<number>(5.8);
90
+ public smallView = signal<boolean>(false);
91
+ public cropHeight = signal<number>(0);
92
+ public cropWidth = signal<number>(0);
93
+ public showCropper = signal<boolean>(false);
94
+ public isCropperReady = signal<boolean>(false);
95
+ public deletedDocs = signal<number[]>([]);
96
+ public dragMode = signal<boolean>(false);
97
+ public onDragover = signal<boolean>(false);
98
+ public invalidFileSize = signal<boolean>(false);
99
+ public isLoadingSkeleton = signal<boolean>(true);
100
+ public skeletonCount = signal(0);
101
+ public maxCountReached = signal<boolean>(false);
102
+ public carouselIndex = signal(0);
103
+
104
+ public driver = signal<Driver>({
105
+ id: 0,
106
+ firstName: '',
107
+ lastName: '',
108
+ avatarFile: null,
109
+ avatarColor: 'Blue',
110
+ });
111
+
112
+ public transform: ImageTransform = {
113
+ scale: this.zoomValue(),
114
+ };
115
+
116
+ public imageChangedEvent: Event | null = null;
117
+ public croppedImage: SafeUrl | null = '';
118
+ public originalImageWidth: number = 0;
119
+ public originalImageHeight: number = 0;
120
+ private cropperResultFile: File | null = null;
121
+ private cropperPreviewUrl: string | null = null;
122
+
123
+ private lottieAnimation: AnimationItem | null = null;
124
+ public temporaryImageFile: AppFile | null = null;
125
+
126
+ public drawerViewportWidth = signal(0);
127
+ private drawerRo: ResizeObserver | null = null;
128
+ private drawerEl: HTMLElement | null = null;
129
+
130
+ // Inputs
131
+ public crop = input<boolean>(false);
132
+ public size = input<string>();
133
+ public rounded = input<boolean>(false);
134
+ public deletedFileIds = input<number[]>([]);
135
+ public maxCountFiles = input<number>(1);
136
+ public isDetailsSlider = input<boolean>(false);
137
+ public isDrawerMode = input<boolean>(false);
138
+ public isCoverDetails = input<boolean>(false);
139
+ public maxFileSize = input<number>(100); //MB
140
+ public isDocumentsMode = input<boolean>(false);
141
+ public documentsDropZoneOpen = input<boolean>(false);
142
+ public searchText = input<string | null>(null);
143
+
144
+ @Input()
145
+ set files(value: FileResponse[] | null) {
146
+ this._files = value ?? [];
147
+
148
+ if (!this._files.length) {
149
+ this.docs.set([]);
150
+ this.isLoadingSkeleton.set(false);
151
+ return;
152
+ }
153
+
154
+ this.populateDocs(this._files);
155
+ }
156
+
157
+ get files(): FileResponse[] {
158
+ return this._files;
159
+ }
160
+
161
+ //enums
162
+ public dropZoneVariant = DropZoneVariant;
163
+
164
+ //outputs
165
+ @Output() onDeletedFileIds = new EventEmitter<number[]>();
166
+ @Output() onDocsChange = new EventEmitter<AppFile[]>();
167
+ @Output() onDocumentPreviewClick = new EventEmitter<{ fileId: number }>();
168
+ @Output() onDocumentFileNameChange = new EventEmitter<{
169
+ fileId?: number;
170
+ newFileName: string;
171
+ }>();
172
+ @Output() onCropPendingChange = new EventEmitter<boolean>();
173
+ @Output() onDocumentDropZoneOpenChange = new EventEmitter<boolean>();
174
+
175
+ //views
176
+ @ViewChild('inputRange') inputRange!: ElementRef<HTMLInputElement>;
177
+ @ViewChild('dropZoneContainer') dropZoneContainer!: ElementRef<HTMLElement>;
178
+ @ViewChild('docsViewport') docsViewport?: ElementRef<HTMLElement>;
179
+
180
+ //variables
181
+ public coverUrl: string = '';
182
+ public profileUrl: string = '';
183
+ public logoUrl: string = '';
184
+ public categoryTag: string | null = null;
185
+ private _files: FileResponse[] = [];
186
+
187
+ // helpers
188
+ private DropZoneDocumentsHelper = DropZoneDocumentsHelper;
189
+
190
+ /**
191
+ * A input that holds an FormGroup object that is used to update the form validity when the crop mode is closed.
192
+ */
193
+
194
+ public parentForm = input<FormGroup | null>(null);
195
+
196
+ /**
197
+ * A signal that holds an array of `AppFile` objects representing the files
198
+ * that have been selected or dropped by the user.
199
+
200
+ */
201
+ public variant = input<string>(this.dropZoneVariant.DOCUMENT);
202
+
203
+ /**
204
+ * Input that holds an array of `DocumentTag` objects representing the tags for the documents.
205
+ */
206
+ public documentTags = input<DocumentTag[]>([]);
207
+
208
+ /**
209
+ * Injects the DocumentService for file processing tasks like
210
+ * thumbnail generation and PDF page counting.
211
+ * @private
212
+ */
213
+ private documentService = inject(DocumentService);
214
+
215
+ /**
216
+ * An array of file extensions that should be excluded from the supported list.
217
+ * @defaultValue `[]` (an empty array)
218
+ * @type {FileExtension[]}
219
+ */
220
+ excludedFileTypes = input<FileExtension[]>([]);
221
+
222
+ /**
223
+ * The base array of all file extensions that are generally allowed.
224
+ * Supported file types will be derived from this list, after excluding
225
+ * any types specified in `excludedFileTypes`.
226
+ *
227
+ * @defaultValue `['avi', 'mov', 'mp4', 'pdf', 'gif', 'png', 'jpg', 'jpeg']`
228
+ * @type {FileExtension[]}
229
+ */
230
+ fileTypes = input<FileExtension[]>([
231
+ 'pdf',
232
+ 'png',
233
+ 'jpg',
234
+ 'jpeg',
235
+ 'gif',
236
+ 'avi',
237
+ 'mov',
238
+ 'mp4',
239
+ ]);
240
+
241
+ constructor(private sanitizer: DomSanitizer) {}
242
+
243
+ ngOnInit() {
244
+ this.cropDimensions();
245
+ }
246
+
247
+ ngOnDestroy() {
248
+ this.clearCropperPreviewUrl();
249
+ this.clearDrawerRo();
250
+ }
251
+
252
+ ngAfterViewChecked() {
253
+ this.setDrawerRo();
254
+ }
255
+
256
+ private clampDrawerIndex(): void {
257
+ const maxStart = Math.max(
258
+ 0,
259
+ this.docs().length - this.carouselVisibleCount(),
260
+ );
261
+ if (this.carouselIndex() > maxStart) this.carouselIndex.set(maxStart);
262
+ }
263
+
264
+ private setDrawerRo(): void {
265
+ if (!this.isDrawerMode()) {
266
+ this.clearDrawerRo();
267
+ this.drawerEl = null;
268
+ return;
269
+ }
270
+ const el = this.docsViewport?.nativeElement;
271
+ if (!el) {
272
+ this.drawerEl = null;
273
+ return;
274
+ }
275
+ if (el !== this.drawerEl) {
276
+ this.drawerEl = el;
277
+ this.drawerViewportWidth.set(el.getBoundingClientRect().width);
278
+ this.clampDrawerIndex();
279
+ this.drawerRo = new ResizeObserver(() => {
280
+ this.drawerViewportWidth.set(
281
+ this.docsViewport!.nativeElement.getBoundingClientRect().width,
282
+ );
283
+ this.clampDrawerIndex();
284
+ });
285
+ this.drawerRo.observe(el);
286
+ }
287
+ }
288
+
289
+ private clearDrawerRo(): void {
290
+ if (this.drawerRo && this.drawerEl) {
291
+ this.drawerRo.unobserve(this.drawerEl);
292
+ this.drawerRo.disconnect();
293
+ this.drawerRo = null;
294
+ }
295
+ }
296
+
297
+ emitDocs() {
298
+ this.onDocsChange.emit(this.docs());
299
+ }
300
+
301
+ animationCreated(animation: AnimationItem) {
302
+ this.lottieAnimation = animation;
303
+ this.lottieAnimation.goToAndStop(0, true);
304
+ }
305
+
306
+ private playDropAnimation(forward: boolean = true) {
307
+ if (!this.lottieAnimation) {
308
+ return;
309
+ }
310
+
311
+ const speed = forward ? 1 : 4;
312
+ const endFrame = Math.max(0, this.lottieAnimation.totalFrames ?? 0);
313
+ const currentFrame = Math.round(
314
+ Math.min(Math.max(this.lottieAnimation.currentFrame ?? 0, 0), endFrame),
315
+ );
316
+
317
+ this.lottieAnimation.setDirection(forward ? 1 : -1);
318
+ this.lottieAnimation.setSpeed(speed);
319
+ this.lottieAnimation.goToAndPlay(
320
+ forward ? 0 : currentFrame || endFrame,
321
+ true,
322
+ );
323
+ }
324
+
325
+ private stopDropAnimation() {
326
+ if (!this.lottieAnimation) {
327
+ return;
328
+ }
329
+
330
+ this.lottieAnimation.goToAndStop(0, true);
331
+ }
332
+
333
+ getTagIds(tags: string[] | null | undefined, generatedByUser: boolean) {
334
+ if (!generatedByUser) {
335
+ this.categoryTag = tags?.[0] ?? null;
336
+ return null;
337
+ }
338
+
339
+ const tag = this.documentTags().find((tag) => tags?.includes(tag.tagName));
340
+ if (!tag) {
341
+ this.categoryTag = tags?.[0] ?? null;
342
+ return null;
343
+ } else {
344
+ return this.documentTags()
345
+ .filter((tag) => tags?.includes(tag.tagName))
346
+ .map((tag) => tag.tagId);
347
+ }
348
+ }
349
+
350
+ async populateDocs(currentFiles: FileResponse[] | AppFile[]) {
351
+ if (!currentFiles?.length) {
352
+ this.docs.set([]);
353
+ this.isLoadingSkeleton.set(false);
354
+ return;
355
+ }
356
+
357
+ this.skeletonCount.set(currentFiles.length);
358
+
359
+ const filesToProcess =
360
+ this.DropZoneDocumentsHelper.splitExistingAndNewFiles(
361
+ currentFiles,
362
+ this.docs(),
363
+ );
364
+
365
+ const newlyProcessed = await Promise.all(
366
+ filesToProcess.map(async (fileResp) => {
367
+ if ((fileResp as AppFile).imagePreviewUrl) return fileResp as AppFile;
368
+
369
+ const fileExtension =
370
+ fileResp.fileName?.split('.').pop()?.toLowerCase() || 'pdf';
371
+
372
+ let previewUrl = (fileResp as FileResponse)?.url || '';
373
+ let pageCount: number | undefined;
374
+
375
+ const file = await this.DropZoneDocumentsHelper.fetchFileAsFile(
376
+ fileResp as FileResponse,
377
+ );
378
+
379
+ const supportedBase64 = ['profile', 'cover', 'logo'].includes(
380
+ this.variant(),
381
+ );
382
+
383
+ const base64Url =
384
+ supportedBase64 && file
385
+ ? await this.DropZoneDocumentsHelper.fileToBase64(file)
386
+ : null;
387
+
388
+ if (fileExtension === 'pdf' && file) {
389
+ try {
390
+ const [thumb, pages] = await Promise.all([
391
+ this.documentService.generateThumbnail(file),
392
+ this.documentService.getPdfPageCount(file),
393
+ ]);
394
+ previewUrl = thumb;
395
+ pageCount = pages;
396
+ } catch (error) {
397
+ console.error(`Failed ${fileResp.fileName}:`, error);
398
+ }
399
+ }
400
+
401
+ return {
402
+ fileName: fileResp.fileName || '',
403
+ baseName: fileResp.fileName?.split('.').slice(0, -1).join('.') || '',
404
+ fileId: fileResp.fileId || 0,
405
+ type: fileExtension as FileExtension,
406
+ size: (fileResp as FileResponse).fileSize || 0,
407
+ imagePreviewUrl: previewUrl,
408
+ file: file,
409
+ pageCount: pageCount,
410
+ tags: this.getTagIds(
411
+ (fileResp as FileResponse).tags || [],
412
+ (fileResp as FileResponse).tagGeneratedByUser ?? false,
413
+ ),
414
+ tagChanged: false,
415
+ fileNameChanged: false,
416
+ categoryTag: this.categoryTag,
417
+ base64Url,
418
+ };
419
+ }),
420
+ );
421
+
422
+ const validNewFiles = (newlyProcessed.filter(Boolean) as AppFile[]) || [];
423
+
424
+ if (validNewFiles.length > 0) {
425
+ const updatedDocs = [...this.docs(), ...validNewFiles];
426
+ this.docs.set(updatedDocs);
427
+ this.setImagePreviewUrl(updatedDocs[0]?.imagePreviewUrl || '');
428
+ }
429
+
430
+ if (this.crop()) {
431
+ this.submitCrop(true);
432
+ }
433
+
434
+ console.log('this.docs()', this.docs());
435
+ this.isLoadingSkeleton.set(false);
436
+ this.deletedDocs.set(this.deletedFileIds() ?? []);
437
+ }
438
+
439
+ updateRangeBackground(input: HTMLInputElement) {
440
+ if (!input) return;
441
+ const min = Number(input.min);
442
+ const max = Number(input.max);
443
+ var value;
444
+ value = ((this.zoomValue() - min) / (max - min)) * 100;
445
+ input.style.setProperty('--range-progress', `${value}%`);
446
+ }
447
+
448
+ cropDimensions() {
449
+ const variant = this.variant();
450
+ const rounded = this.rounded();
451
+ let width = 0;
452
+ let height = 0;
453
+ switch (variant) {
454
+ case 'profile':
455
+ if (rounded) {
456
+ width = 178;
457
+ height = 178;
458
+ } else {
459
+ width = 160;
460
+ height = 178;
461
+ }
462
+ break;
463
+ case 'logo':
464
+ width = 628;
465
+ height = 214;
466
+ break;
467
+ case 'cover':
468
+ width = 267;
469
+ height = 178;
470
+ break;
471
+ }
472
+
473
+ this.cropWidth.set(width);
474
+ this.cropHeight.set(height);
475
+ }
476
+
477
+ private setImagePreviewUrl(previewUrl: string) {
478
+ if (!previewUrl) return;
479
+
480
+ switch (this.variant()) {
481
+ case this.dropZoneVariant.PROFILE: {
482
+ this.profileUrl = previewUrl;
483
+ break;
484
+ }
485
+ case this.dropZoneVariant.COVER: {
486
+ this.coverUrl = previewUrl;
487
+ if (this.size() === '480px') {
488
+ this.smallView.set(true);
489
+ }
490
+ break;
491
+ }
492
+ case this.dropZoneVariant.LOGO: {
493
+ this.logoUrl = previewUrl;
494
+ break;
495
+ }
496
+ default:
497
+ break;
498
+ }
499
+ }
500
+
501
+ ratioHelper(): number {
502
+ const width = this.cropWidth();
503
+ const height = this.cropHeight();
504
+
505
+ return width && height ? width / height : 1;
506
+ }
507
+
508
+ onZoomChange(event: Event) {
509
+ const input = event.target as HTMLInputElement;
510
+ const zoom = Number(input.value);
511
+ this.zoomValue.set(zoom);
512
+
513
+ this.transform = {
514
+ scale: zoom,
515
+ };
516
+ this.updateRangeBackground(event.target as HTMLInputElement);
517
+ }
518
+
519
+ fileChangeEvent(event: Event): void {
520
+ this.imageChangedEvent = event;
521
+ this.isCropperReady.set(false);
522
+ const target = event.target as HTMLInputElement;
523
+ const file = target.files?.[0];
524
+
525
+ this.zoomValue.set(5.8);
526
+ this.transform = { scale: this.zoomValue() };
527
+
528
+ const fileExtension = file?.name.split('.').pop()?.toLowerCase();
529
+ const isSupportedImage =
530
+ file &&
531
+ file.type.startsWith('image/') &&
532
+ fileExtension &&
533
+ this.supportedFileTypes().includes(fileExtension as FileExtension);
534
+ if (isSupportedImage && this.crop()) {
535
+ this.setInvalid();
536
+ this.showCropper.set(true);
537
+ } else {
538
+ this.showCropper.set(false);
539
+ }
540
+
541
+ this.zoomValue.set(5.8);
542
+ }
543
+
544
+ imageCropped(event: ImageCroppedEvent) {
545
+ if (event.base64) {
546
+ const blob = base64ToFile(event.base64);
547
+ this.setCropperFile(this.createFileFromBlob(blob));
548
+ } else if (event.objectUrl) {
549
+ this.setCropperFileFromObjectUrl(event.objectUrl);
550
+ }
551
+ }
552
+
553
+ private setCropperFile(file: File) {
554
+ this.cropperResultFile = file;
555
+ this.updateCropperPreviewUrl(URL.createObjectURL(file));
556
+ }
557
+
558
+ private createFileFromBlob(blob: Blob): File {
559
+ const name =
560
+ this.temporaryImageFile?.fileName ??
561
+ this.docs()[this.docs().length - 1]?.fileName ??
562
+ 'cropped-image.png';
563
+ return new File([blob], name, {
564
+ type: blob.type,
565
+ lastModified: Date.now(),
566
+ });
567
+ }
568
+
569
+ private async setCropperFileFromObjectUrl(objectUrl: string) {
570
+ try {
571
+ const response = await fetch(objectUrl);
572
+ const blob = await response.blob();
573
+ this.setCropperFile(this.createFileFromBlob(blob));
574
+ } catch (error) {
575
+ console.error('Failed to convert objectUrl to File:', error);
576
+ }
577
+ }
578
+
579
+ private updateCropperPreviewUrl(url: string) {
580
+ if (this.cropperPreviewUrl) {
581
+ URL.revokeObjectURL(this.cropperPreviewUrl);
582
+ }
583
+ this.cropperPreviewUrl = url;
584
+ this.croppedImage = this.sanitizer.bypassSecurityTrustUrl(url);
585
+ }
586
+
587
+ private clearCropperPreviewUrl() {
588
+ if (this.cropperPreviewUrl) {
589
+ URL.revokeObjectURL(this.cropperPreviewUrl);
590
+ this.cropperPreviewUrl = null;
591
+ this.croppedImage = null;
592
+ }
593
+ }
594
+
595
+ imageLoaded(image: LoadedImage) {}
596
+
597
+ cropperReady() {
598
+ this.isCropperReady.set(true);
599
+ if (this.inputRange?.nativeElement) {
600
+ this.updateRangeBackground(this.inputRange.nativeElement);
601
+ }
602
+ }
603
+
604
+ loadImageFailed() {
605
+ // show message
606
+ }
607
+
608
+ onTransformChange(event: ImageTransform) {
609
+ const scale = event?.scale as number;
610
+ this.zoomValue.set(scale);
611
+ }
612
+
613
+ cancelCrop() {
614
+ this.clearInvalid();
615
+ this.isCropperReady.set(false);
616
+ this.showCropper.set(false);
617
+ this.onCropPendingChange.emit(false);
618
+ }
619
+
620
+ async submitCrop(initial: boolean = false) {
621
+ if (!this.cropperResultFile) {
622
+ this.clearInvalid();
623
+ this.showCropper.set(false);
624
+ this.isCropperReady.set(false);
625
+ return;
626
+ }
627
+
628
+ const previewUrl = URL.createObjectURL(this.cropperResultFile);
629
+
630
+ if (this.temporaryImageFile) {
631
+ this.temporaryImageFile.file = this.cropperResultFile;
632
+ this.temporaryImageFile.imagePreviewUrl = previewUrl;
633
+
634
+ if (['profile', 'cover', 'logo'].includes(this.variant())) {
635
+ this.temporaryImageFile.base64Url =
636
+ await this.DropZoneDocumentsHelper.fileToBase64(
637
+ this.cropperResultFile,
638
+ );
639
+ }
640
+
641
+ this.docs.set([this.temporaryImageFile]);
642
+ this.setImagePreviewUrl(previewUrl);
643
+ this.clearInvalid();
644
+ this.showCropper.set(false);
645
+ this.isCropperReady.set(false);
646
+
647
+ if (!initial) this.emitDocs();
648
+ if (previewUrl) {
649
+ this.clearCropperPreviewUrl();
650
+ }
651
+
652
+ this.temporaryImageFile = null;
653
+ this.cropperResultFile = null;
654
+ this.onCropPendingChange.emit(false);
655
+
656
+ return;
657
+ }
658
+
659
+ const lastIndex = this.docs().length - 1;
660
+
661
+ if (lastIndex >= 0) {
662
+ const updatedDocs = [...this.docs()];
663
+ const lastDoc = { ...updatedDocs[lastIndex] };
664
+ lastDoc.imagePreviewUrl = previewUrl;
665
+ lastDoc.file = this.cropperResultFile;
666
+ updatedDocs[lastIndex] = lastDoc;
667
+
668
+ this.docs.set(updatedDocs);
669
+ this.clearInvalid();
670
+
671
+ this.showCropper.set(false);
672
+ }
673
+
674
+ this.setImagePreviewUrl(previewUrl);
675
+ this.cropDimensions();
676
+ if (!initial) this.emitDocs();
677
+ this.isCropperReady.set(false);
678
+ if (previewUrl) {
679
+ this.clearCropperPreviewUrl();
680
+ }
681
+ this.cropperResultFile = null;
682
+ }
683
+
684
+ /**
685
+ * A computed signal that derives the list of currently supported file extensions.
686
+ * It filters the base `fileTypes` array, removing any extensions present
687
+ * in the `excludedFileTypes` input.
688
+ */
689
+ supportedFileTypes = computed(() => {
690
+ const excluded = this.excludedFileTypes();
691
+ const types = this.fileTypes();
692
+
693
+ if (!excluded || excluded.length === 0) {
694
+ return types;
695
+ }
696
+
697
+ return types.filter((type) => !excluded.includes(type));
698
+ });
699
+
700
+ /**
701
+ * A signal that holds an array of `AppFile` objects representing the files
702
+ * that have been selected or dropped by the user.
703
+ */
704
+ docs = signal<AppFile[]>([]);
705
+
706
+ /**
707
+ * A signal that acts as a boolean flag. It is set to `true` when the user
708
+ * attempts to upload a file with an unsupported extension.
709
+ */
710
+ unsupported = signal(false);
711
+
712
+ /**
713
+ * Handles the 'change' event from the hidden file input. It extracts the
714
+ * selected files and passes them to the `processFiles` method.
715
+ * @param event The `Event` object from the file input element.
716
+ */
717
+ onInput(event: Event) {
718
+ const target = event.target as HTMLInputElement;
719
+ const files = target.files as FileList;
720
+ this.processFiles(files);
721
+ }
722
+
723
+ onDrop(event: DragEvent) {
724
+ event.preventDefault();
725
+ this.resetDragState();
726
+ const dropZone = this.dropZoneContainer?.nativeElement;
727
+ const isInDropArea =
728
+ dropZone?.contains(event.target as Node) ||
729
+ (this.dragMode() &&
730
+ dropZone?.parentElement?.contains(event.target as Node));
731
+ if (!isInDropArea || this.unsupported()) return;
732
+ const files = event.dataTransfer?.files;
733
+ if (files && files.length > 0) {
734
+ this.processFiles(files);
735
+ }
736
+ }
737
+
738
+ onDragOver(event: DragEvent) {
739
+ event.preventDefault();
740
+ if (this.unsupported()) return;
741
+ const relatedTarget = event.target as HTMLElement;
742
+
743
+ if (this.dropZoneContainer?.nativeElement?.contains(relatedTarget)) {
744
+ this.onDragover.set(true);
745
+ } else {
746
+ this.onDragover.set(false);
747
+ }
748
+ }
749
+
750
+ onDragLeave(event: DragEvent) {
751
+ event.preventDefault();
752
+
753
+ const relatedTarget = event.relatedTarget as HTMLElement;
754
+ if (
755
+ !relatedTarget ||
756
+ !this.dropZoneContainer?.nativeElement?.contains(relatedTarget)
757
+ ) {
758
+ this.onDragover.set(false);
759
+ this.lottieAnimation?.stop();
760
+ this.playDropAnimation(false);
761
+ } else {
762
+ this.onDragover.set(true);
763
+ }
764
+ }
765
+
766
+ onDragEnter(event: DragEvent) {
767
+ const dropZone = this.dropZoneContainer?.nativeElement;
768
+ const relatedTarget = event.relatedTarget as Node | null;
769
+
770
+ if (
771
+ !dropZone ||
772
+ this.unsupported() ||
773
+ (relatedTarget && dropZone.contains(relatedTarget))
774
+ )
775
+ return;
776
+
777
+ event.preventDefault();
778
+ this.dragMode.set(true);
779
+ this.onDragover.set(false);
780
+ this.playDropAnimation(true);
781
+ }
782
+
783
+ @HostListener('document:dragenter', ['$event'])
784
+ onDocumentDragEnter(event: DragEvent) {
785
+ if (
786
+ (this.isDocumentsMode() && !this.documentsDropZoneOpen()) ||
787
+ this.unsupported() ||
788
+ (this.variant() === this.dropZoneVariant.LOGO && this.logoUrl) ||
789
+ (this.docs().length === this.maxCountFiles() &&
790
+ this.variant() === this.dropZoneVariant.DOCUMENT)
791
+ )
792
+ return;
793
+
794
+ this.dragMode.set(true);
795
+ this.onDragover.set(false);
796
+ }
797
+
798
+ @HostListener('document:dragover', ['$event'])
799
+ onDocumentDragOver(event: DragEvent) {
800
+ const dropZone = this.dropZoneContainer?.nativeElement;
801
+ if (this.dragMode()) {
802
+ event.preventDefault();
803
+ return;
804
+ }
805
+ if (
806
+ (this.isDocumentsMode() && !this.documentsDropZoneOpen()) ||
807
+ dropZone?.contains(event.target as Node) ||
808
+ dropZone?.parentElement?.contains(event.target as Node)
809
+ )
810
+ return;
811
+ if (this.unsupported()) return;
812
+ event.preventDefault();
813
+ event.stopPropagation();
814
+ if (event.dataTransfer) {
815
+ event.dataTransfer.dropEffect = 'none';
816
+ }
817
+ }
818
+
819
+ @HostListener('document:dragleave', ['$event'])
820
+ onWindowDragLeave(event: DragEvent) {
821
+ if (this.isDocumentsMode() && !this.documentsDropZoneOpen()) {
822
+ return;
823
+ }
824
+ event.preventDefault();
825
+ const relatedTarget = event.relatedTarget as HTMLElement;
826
+ if (!relatedTarget) {
827
+ this.resetDragState();
828
+ }
829
+ }
830
+
831
+ @HostListener('document:drop', ['$event'])
832
+ onDocumentDrop(event: DragEvent) {
833
+ if (this.isDocumentsMode() && !this.documentsDropZoneOpen()) {
834
+ return;
835
+ }
836
+ const dropZone = this.dropZoneContainer?.nativeElement;
837
+ if (dropZone?.contains(event.target as Node)) {
838
+ this.resetDragState();
839
+ return;
840
+ }
841
+
842
+ if (
843
+ this.dragMode() &&
844
+ dropZone?.parentElement?.contains(event.target as Node)
845
+ ) {
846
+ this.resetDragState();
847
+ return;
848
+ }
849
+ if (this.dragMode()) {
850
+ event.preventDefault();
851
+ this.resetDragState();
852
+ return;
853
+ }
854
+ event.preventDefault();
855
+ event.stopPropagation();
856
+ if (event.dataTransfer) {
857
+ event.dataTransfer.dropEffect = 'none';
858
+ event.dataTransfer.clearData();
859
+ }
860
+ this.resetDragState();
861
+ }
862
+
863
+ /**
864
+ * Resets the drag state when drag operation ends.
865
+ */
866
+ private resetDragState() {
867
+ this.dragMode.set(false);
868
+ this.onDragover.set(false);
869
+ this.stopDropAnimation();
870
+ }
871
+
872
+ skeletonItems = computed(() => Array.from({ length: this.skeletonCount() }));
873
+
874
+ /**
875
+ * Asynchronously processes a list of files. For each file, it validates
876
+ * the extension against `supportedFileTypes`. If valid, it generates a
877
+ * thumbnail, counts pages for PDFs, creates an `AppFile` object, and adds
878
+ * it to the `docs` signal. If any file is unsupported, the `unsupported`
879
+ * flag is set.
880
+ * @param files The `FileList` object to be processed.
881
+ */
882
+ async processFiles(files: FileList) {
883
+ this.unsupported.set(false);
884
+ this.invalidFileSize.set(false);
885
+ this.inputRef.nativeElement.disabled = false;
886
+ this.maxCountReached.set(false);
887
+
888
+ const fileArray = Array.from(files);
889
+ const maxSizeBytes = this.maxFileSize() * 1024 * 1024;
890
+ const supportedTypes = this.supportedFileTypes();
891
+ const existingNames = new Set(this.docs().map((d) => d.fileName));
892
+
893
+ if (
894
+ (this.variant() === this.dropZoneVariant.DOCUMENT ||
895
+ this.variant() === this.dropZoneVariant.VIDEO) &&
896
+ this.docs().length >= this.maxCountFiles()
897
+ ) {
898
+ this.inputRef.nativeElement.disabled = true;
899
+ this.maxCountReached.set(true);
900
+ return;
901
+ }
902
+
903
+ const toProcess: File[] = [];
904
+ let totalDocsCount = this.docs().length;
905
+
906
+ for (const file of fileArray) {
907
+ const fileExtension = file.name.split('.').pop()?.toLowerCase();
908
+
909
+ if (
910
+ !fileExtension ||
911
+ !supportedTypes.includes(fileExtension as FileExtension)
912
+ ) {
913
+ this.unsupported.set(true);
914
+ continue;
915
+ }
916
+
917
+ if (file.size > maxSizeBytes) {
918
+ this.invalidFileSize.set(true);
919
+ return;
920
+ }
921
+
922
+ if (totalDocsCount >= this.maxCountFiles()) {
923
+ break;
924
+ }
925
+
926
+ if (existingNames.has(file.name)) {
927
+ return;
928
+ }
929
+
930
+ existingNames.add(file.name);
931
+ toProcess.push(file);
932
+ totalDocsCount++;
933
+ }
934
+
935
+ if (toProcess.length === 0) {
936
+ return;
937
+ }
938
+
939
+ // Parallel
940
+ const processedFiles = await Promise.all(
941
+ toProcess.map(async (file) => {
942
+ const fileExtension = file.name.split('.').pop()?.toLowerCase() || '';
943
+ let pageCount: number | undefined;
944
+
945
+ const supportedBase64 = ['profile', 'cover', 'logo'].includes(
946
+ this.variant(),
947
+ );
948
+ const base64Url =
949
+ supportedBase64 && file
950
+ ? await this.DropZoneDocumentsHelper.fileToBase64(file)
951
+ : null;
952
+
953
+ try {
954
+ const [thumbnail, pages] = await Promise.all([
955
+ this.documentService.generateThumbnail(file),
956
+ fileExtension === 'pdf'
957
+ ? this.documentService.getPdfPageCount(file)
958
+ : Promise.resolve(undefined),
959
+ ]);
960
+ pageCount = pages;
961
+
962
+ return {
963
+ fileName: file.name,
964
+ baseName: file.name.split('.').slice(0, -1).join('.'),
965
+ type: fileExtension as FileExtension,
966
+ size: file.size,
967
+ imagePreviewUrl: thumbnail,
968
+ file: file,
969
+ pageCount,
970
+ tags: [] as number[] | null,
971
+ tagChanged: false,
972
+ fileNameChanged: false,
973
+ categoryTag: null,
974
+ base64Url,
975
+ } as AppFile;
976
+ } catch (error) {
977
+ console.error(`Failed processing ${file.name}:`, error);
978
+ return null;
979
+ }
980
+ }),
981
+ );
982
+
983
+ const valid = processedFiles.filter(Boolean) as AppFile[];
984
+
985
+ if (valid.length === 0) return;
986
+
987
+ if (['profile', 'cover', 'logo'].includes(this.variant())) {
988
+ this.temporaryImageFile = valid[0];
989
+ } else {
990
+ this.docs.update((docs) => [...docs, ...valid]);
991
+ }
992
+
993
+ const isSupportedImage =
994
+ valid[0].file?.type.startsWith('image/') &&
995
+ valid[0].type &&
996
+ supportedTypes.includes(valid[0].type as FileExtension);
997
+
998
+ if (isSupportedImage && this.crop()) {
999
+ const dataTransfer = new DataTransfer();
1000
+ dataTransfer.items.add(valid[0].file as File);
1001
+ this.inputRef.nativeElement.files = dataTransfer.files;
1002
+ const syntheticEvent = {
1003
+ target: this.inputRef.nativeElement,
1004
+ } as unknown as Event;
1005
+
1006
+ this.imageChangedEvent = syntheticEvent;
1007
+ this.isCropperReady.set(false);
1008
+ this.zoomValue.set(5.8);
1009
+ this.transform = { scale: this.zoomValue() };
1010
+ this.setInvalid();
1011
+ this.showCropper.set(true);
1012
+ }
1013
+
1014
+ if (!this.crop()) {
1015
+ this.emitDocs();
1016
+ this.resetInput();
1017
+ }
1018
+
1019
+ const total = this.docs().length;
1020
+
1021
+ if (!this.isDocumentsMode()) {
1022
+ const visibleCount = this.carouselVisibleCount();
1023
+ const maxStartIndex = Math.max(0, total - visibleCount);
1024
+ if (total > visibleCount) {
1025
+ this.carouselIndex.set(maxStartIndex);
1026
+ } else {
1027
+ this.carouselIndex.set(0);
1028
+ }
1029
+ }
1030
+
1031
+ if (
1032
+ total === this.maxCountFiles() &&
1033
+ this.variant() === this.dropZoneVariant.DOCUMENT
1034
+ ) {
1035
+ this.inputRef.nativeElement.disabled = true;
1036
+ this.maxCountReached.set(true);
1037
+ }
1038
+ }
1039
+
1040
+ /**
1041
+ * Handles the download action for a specific file.
1042
+ * Note: This is a placeholder and currently only logs the file name.
1043
+ * @param fileName The name of the file to be downloaded.
1044
+ */
1045
+ handleDownload(fileName: string) {
1046
+ const fileToDownload = this.docs().find((doc) => doc.fileName === fileName);
1047
+
1048
+ if (!fileToDownload || !fileToDownload.file) {
1049
+ console.error('File not found or is null');
1050
+ return;
1051
+ }
1052
+
1053
+ const file = fileToDownload.file;
1054
+ const url = URL.createObjectURL(file);
1055
+
1056
+ const a = document.createElement('a');
1057
+ a.href = url;
1058
+ a.download = fileToDownload.fileName;
1059
+ document.body.appendChild(a);
1060
+ a.click();
1061
+ document.body.removeChild(a);
1062
+
1063
+ URL.revokeObjectURL(url);
1064
+ }
1065
+
1066
+ /**
1067
+ * A ViewChild reference to the native `<input type='file'>` element.
1068
+ * Used to programmatically trigger the file selection dialog.
1069
+ */
1070
+ @ViewChild('inputRef') inputRef!: ElementRef<HTMLInputElement>;
1071
+
1072
+ /**
1073
+ * Resets the component's state after an unsupported file type error
1074
+ * by setting the `unsupported` signal to `false`.
1075
+ */
1076
+ cancel() {
1077
+ this.unsupported.set(false);
1078
+ this.invalidFileSize.set(false);
1079
+ this.resetInput();
1080
+ }
1081
+
1082
+ /**
1083
+ * Programmatically triggers a click on the hidden file input element,
1084
+ * which opens the system's file selection dialog.
1085
+ */
1086
+ handleClickToAdd() {
1087
+ this.inputRef.nativeElement.click();
1088
+ }
1089
+
1090
+ /**
1091
+ * Deletes a file from the preview list. It filters the `docs` array to
1092
+ * remove the specified file and adjusts the carousel position.
1093
+ * @param fileName The name of the file to be deleted.
1094
+ */
1095
+ handleDelete(fileName: string) {
1096
+ this.carouselLeft();
1097
+
1098
+ const fileIdToDelete = this.docs().find(
1099
+ (doc) => doc.fileName === fileName,
1100
+ )?.fileId;
1101
+
1102
+ if (fileIdToDelete) {
1103
+ this.deletedDocs.set([...this.deletedDocs(), fileIdToDelete]);
1104
+
1105
+ this.onDeletedFileIds.emit(this.deletedDocs());
1106
+ }
1107
+
1108
+ this.docs.set(this.docs().filter((doc) => doc.fileName !== fileName));
1109
+ this.emitDocs();
1110
+
1111
+ if (this.docs().length === 0) {
1112
+ this.unsupported.set(false);
1113
+ }
1114
+
1115
+ if (this.docs().length < this.maxCountFiles()) {
1116
+ this.inputRef.nativeElement.disabled = false;
1117
+ this.maxCountReached.set(false);
1118
+ }
1119
+
1120
+ if (this.variant() === this.dropZoneVariant.COVER) {
1121
+ this.coverUrl = '';
1122
+ this.smallView.set(false);
1123
+ }
1124
+ if (this.variant() === this.dropZoneVariant.PROFILE) {
1125
+ this.profileUrl = '';
1126
+ }
1127
+ if (this.variant() === this.dropZoneVariant.LOGO) {
1128
+ this.logoUrl = '';
1129
+ }
1130
+
1131
+ this.inputRef.nativeElement.value = '';
1132
+ }
1133
+
1134
+ // Carousel logic
1135
+
1136
+ /**
1137
+ * A computed signal that calculates the CSS `translateX` value for the
1138
+ * carousel container. This creates the sliding effect based on the
1139
+ * `carouselIndex`.
1140
+ */
1141
+ carouselTransform = computed(() => {
1142
+ if (this.isDocumentsMode()) {
1143
+ return 'translateX(0)';
1144
+ }
1145
+ if (this.isDetailsSlider()) {
1146
+ const offset = this.carouselIndex() * -100;
1147
+ return `translateX(${offset}%)`;
1148
+ }
1149
+ if (this.isDrawerMode()) {
1150
+ const cardWidthWithGap = 194 + 4; // 194px width + 4px gap
1151
+ const containerWidth = this.drawerViewportWidth();
1152
+ const contentWidth = this.docs().length * cardWidthWithGap;
1153
+
1154
+ if (containerWidth <= 0 || contentWidth <= containerWidth) {
1155
+ return 'translateX(0)';
1156
+ }
1157
+
1158
+ const step = cardWidthWithGap;
1159
+ const desiredTranslate = step * this.carouselIndex() * -1;
1160
+ const maxTranslate = containerWidth - contentWidth;
1161
+
1162
+ const clampedTranslate = Math.max(desiredTranslate, maxTranslate);
1163
+ return `translateX(${clampedTranslate}px)`;
1164
+ }
1165
+ const gap = this.size() === '480px' ? 6 : 8;
1166
+ const offset = (148 + gap) * this.carouselIndex() * -1;
1167
+ return `translateX(${offset}px)`;
1168
+ });
1169
+
1170
+ /**
1171
+ * Navigates the carousel one step to the left by decrementing the
1172
+ * `carouselIndex`. The index will not go below 0.
1173
+ */
1174
+ carouselLeft() {
1175
+ this.carouselIndex.update((i) => Math.max(0, i - 1));
1176
+ }
1177
+
1178
+ /**
1179
+ * Navigates the carousel one step to the right by incrementing the
1180
+ * `carouselIndex`. The index will not exceed the maximum possible value
1181
+ * based on the number of documents.
1182
+ */
1183
+ carouselRight() {
1184
+ const visibleCount = this.carouselVisibleCount();
1185
+ const maxIndex = Math.max(0, this.docs().length - visibleCount);
1186
+ this.carouselIndex.update((i) => Math.min(maxIndex, i + 1));
1187
+ }
1188
+
1189
+ carouselVisibleCount(): number {
1190
+ if (this.isDetailsSlider()) return 1;
1191
+ if (this.isDrawerMode()) {
1192
+ const width = this.drawerViewportWidth();
1193
+ return width <= 0 ? 1 : Math.max(1, Math.floor((width + 4) / 198));
1194
+ }
1195
+ return this.size() === '480px' ? 2 : 3;
1196
+ }
1197
+
1198
+ isCarouselAtEnd(): boolean {
1199
+ const maxIndex = Math.max(
1200
+ 0,
1201
+ this.docs().length - this.carouselVisibleCount(),
1202
+ );
1203
+ return this.carouselIndex() >= maxIndex;
1204
+ }
1205
+
1206
+ handleTagChange(event: { fileName: string; tag: DocumentTag | null }) {
1207
+ this.docs().forEach((doc) => {
1208
+ if (doc.fileName === event.fileName) {
1209
+ doc.tags = event?.tag?.tagId ? [event?.tag?.tagId] : [];
1210
+ doc.tagChanged = true;
1211
+ }
1212
+ });
1213
+ this.emitDocs();
1214
+ }
1215
+
1216
+ handleFileNameChange(event: { fileId?: number; newFileName: string }) {
1217
+ this.docs().forEach((doc) => {
1218
+ if (doc.fileId === event.fileId) {
1219
+ doc.fileName = event.newFileName;
1220
+ doc.baseName =
1221
+ event.newFileName.split('.').slice(0, -1).join('.') ||
1222
+ event.newFileName;
1223
+ const file = new File([doc.file as BlobPart], event.newFileName, {
1224
+ type: doc.file?.type,
1225
+ lastModified: Date.now(),
1226
+ });
1227
+ doc.file = file;
1228
+ doc.fileNameChanged = true;
1229
+ }
1230
+ });
1231
+ this.emitDocs();
1232
+ this.onDocumentFileNameChange.emit(event);
1233
+ }
1234
+
1235
+ setInvalid() {
1236
+ this.parentForm()?.setErrors({ childInvalid: true });
1237
+ this.onCropPendingChange.emit(true);
1238
+ }
1239
+
1240
+ resetInput() {
1241
+ this.inputRef.nativeElement.value = '';
1242
+ }
1243
+
1244
+ clearInvalid() {
1245
+ const { childInvalid, ...rest } = this.parentForm()?.errors ?? {};
1246
+ const next = Object.keys(rest).length ? rest : null;
1247
+ this.parentForm()?.setErrors(next);
1248
+ this.parentForm()?.updateValueAndValidity({
1249
+ emitEvent: true,
1250
+ onlySelf: true,
1251
+ });
1252
+
1253
+ // Clear the input value to allow the same file to be selected again
1254
+ if (this.inputRef?.nativeElement) {
1255
+ this.resetInput();
1256
+ }
1257
+ }
1258
+
1259
+ handleDocumentPreviewClick(event: { fileId: number }) {
1260
+ this.onDocumentPreviewClick.emit({ fileId: event.fileId });
1261
+ }
1262
+
1263
+ downloadAllFiles(): void {
1264
+ this.DropZoneDocumentsHelper.onDownloadAllFiles(this.docs());
1265
+ }
1266
+
1267
+ onCancel(event: Event) {
1268
+ event.preventDefault();
1269
+ event.stopPropagation();
1270
+ this.onDocumentDropZoneOpenChange.emit(false);
1271
+ }
1272
+ }