@dflat-core/web 1.7.2072 → 1.7.2074

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 (710) hide show
  1. package/README.md +211 -207
  2. package/assets/components/bootstrap-lite.scss +1667 -0
  3. package/assets/components/icons.scss +723 -0
  4. package/assets/components/modals.scss +216 -62
  5. package/assets/images/icons/fa/500px.svg +6 -0
  6. package/assets/images/icons/fa/address-book-o.svg +4 -0
  7. package/assets/images/icons/fa/address-book.svg +3 -0
  8. package/assets/images/icons/fa/adjust.svg +1 -0
  9. package/assets/images/icons/fa/adn.svg +1 -0
  10. package/assets/images/icons/fa/align-center.svg +2 -0
  11. package/assets/images/icons/fa/align-justify.svg +2 -0
  12. package/assets/images/icons/fa/align-left.svg +2 -0
  13. package/assets/images/icons/fa/align-right.svg +2 -0
  14. package/assets/images/icons/fa/amazon.svg +5 -0
  15. package/assets/images/icons/fa/ambulance.svg +3 -0
  16. package/assets/images/icons/fa/anchor.svg +3 -0
  17. package/assets/images/icons/fa/android.svg +3 -0
  18. package/assets/images/icons/fa/angellist.svg +6 -0
  19. package/assets/images/icons/fa/angle-double-down.svg +2 -0
  20. package/assets/images/icons/fa/angle-double-left.svg +2 -0
  21. package/assets/images/icons/fa/angle-double-right.svg +2 -0
  22. package/assets/images/icons/fa/angle-double-up.svg +2 -0
  23. package/assets/images/icons/fa/angle-down.svg +1 -0
  24. package/assets/images/icons/fa/angle-left.svg +1 -0
  25. package/assets/images/icons/fa/angle-right.svg +1 -0
  26. package/assets/images/icons/fa/angle-up.svg +1 -0
  27. package/assets/images/icons/fa/apple.svg +2 -0
  28. package/assets/images/icons/fa/archive.svg +2 -0
  29. package/assets/images/icons/fa/area-chart.svg +1 -0
  30. package/assets/images/icons/fa/arrow-circle-down.svg +2 -0
  31. package/assets/images/icons/fa/arrow-circle-left.svg +2 -0
  32. package/assets/images/icons/fa/arrow-circle-o-down.svg +2 -0
  33. package/assets/images/icons/fa/arrow-circle-o-left.svg +2 -0
  34. package/assets/images/icons/fa/arrow-circle-o-right.svg +2 -0
  35. package/assets/images/icons/fa/arrow-circle-o-up.svg +2 -0
  36. package/assets/images/icons/fa/arrow-circle-right.svg +2 -0
  37. package/assets/images/icons/fa/arrow-circle-up.svg +2 -0
  38. package/assets/images/icons/fa/arrow-down.svg +1 -0
  39. package/assets/images/icons/fa/arrow-left.svg +2 -0
  40. package/assets/images/icons/fa/arrow-right.svg +1 -0
  41. package/assets/images/icons/fa/arrow-up.svg +2 -0
  42. package/assets/images/icons/fa/arrows-alt.svg +3 -0
  43. package/assets/images/icons/fa/arrows-h.svg +1 -0
  44. package/assets/images/icons/fa/arrows-v.svg +1 -0
  45. package/assets/images/icons/fa/arrows.svg +2 -0
  46. package/assets/images/icons/fa/asl-interpreting.svg +6 -0
  47. package/assets/images/icons/fa/assistive-listening-systems.svg +5 -0
  48. package/assets/images/icons/fa/asterisk.svg +2 -0
  49. package/assets/images/icons/fa/at.svg +4 -0
  50. package/assets/images/icons/fa/audio-description.svg +5 -0
  51. package/assets/images/icons/fa/automobile.svg +3 -0
  52. package/assets/images/icons/fa/backward.svg +1 -0
  53. package/assets/images/icons/fa/balance-scale.svg +4 -0
  54. package/assets/images/icons/fa/ban.svg +2 -0
  55. package/assets/images/icons/fa/bandcamp.svg +1 -0
  56. package/assets/images/icons/fa/bar-chart-o.svg +1 -0
  57. package/assets/images/icons/fa/barcode.svg +2 -0
  58. package/assets/images/icons/fa/bathtub.svg +6 -0
  59. package/assets/images/icons/fa/battery-0.svg +2 -0
  60. package/assets/images/icons/fa/battery-1.svg +2 -0
  61. package/assets/images/icons/fa/battery-2.svg +2 -0
  62. package/assets/images/icons/fa/battery-3.svg +2 -0
  63. package/assets/images/icons/fa/battery-4.svg +2 -0
  64. package/assets/images/icons/fa/beer.svg +1 -0
  65. package/assets/images/icons/fa/behance-square.svg +3 -0
  66. package/assets/images/icons/fa/behance.svg +3 -0
  67. package/assets/images/icons/fa/bell-o.svg +3 -0
  68. package/assets/images/icons/fa/bell-slash-o.svg +3 -0
  69. package/assets/images/icons/fa/bell-slash.svg +3 -0
  70. package/assets/images/icons/fa/bell.svg +2 -0
  71. package/assets/images/icons/fa/bicycle.svg +4 -0
  72. package/assets/images/icons/fa/binoculars.svg +2 -0
  73. package/assets/images/icons/fa/birthday-cake.svg +5 -0
  74. package/assets/images/icons/fa/bitbucket-square.svg +4 -0
  75. package/assets/images/icons/fa/bitbucket.svg +4 -0
  76. package/assets/images/icons/fa/bitcoin.svg +3 -0
  77. package/assets/images/icons/fa/black-tie.svg +1 -0
  78. package/assets/images/icons/fa/blind.svg +4 -0
  79. package/assets/images/icons/fa/bluetooth-b.svg +1 -0
  80. package/assets/images/icons/fa/bluetooth.svg +2 -0
  81. package/assets/images/icons/fa/bold.svg +4 -0
  82. package/assets/images/icons/fa/bomb.svg +4 -0
  83. package/assets/images/icons/fa/book.svg +4 -0
  84. package/assets/images/icons/fa/bookmark-o.svg +2 -0
  85. package/assets/images/icons/fa/bookmark.svg +1 -0
  86. package/assets/images/icons/fa/braille.svg +7 -0
  87. package/assets/images/icons/fa/briefcase.svg +2 -0
  88. package/assets/images/icons/fa/bug.svg +3 -0
  89. package/assets/images/icons/fa/building-o.svg +10 -0
  90. package/assets/images/icons/fa/building.svg +8 -0
  91. package/assets/images/icons/fa/bullhorn.svg +2 -0
  92. package/assets/images/icons/fa/bullseye.svg +3 -0
  93. package/assets/images/icons/fa/bus.svg +3 -0
  94. package/assets/images/icons/fa/buysellads.svg +1 -0
  95. package/assets/images/icons/fa/cab.svg +3 -0
  96. package/assets/images/icons/fa/calculator.svg +6 -0
  97. package/assets/images/icons/fa/calendar-check-o.svg +3 -0
  98. package/assets/images/icons/fa/calendar-minus-o.svg +3 -0
  99. package/assets/images/icons/fa/calendar-o.svg +2 -0
  100. package/assets/images/icons/fa/calendar-plus-o.svg +3 -0
  101. package/assets/images/icons/fa/calendar-times-o.svg +3 -0
  102. package/assets/images/icons/fa/calendar.svg +4 -0
  103. package/assets/images/icons/fa/camera-retro.svg +3 -0
  104. package/assets/images/icons/fa/camera.svg +2 -0
  105. package/assets/images/icons/fa/caret-down.svg +1 -0
  106. package/assets/images/icons/fa/caret-left.svg +1 -0
  107. package/assets/images/icons/fa/caret-right.svg +1 -0
  108. package/assets/images/icons/fa/caret-up.svg +1 -0
  109. package/assets/images/icons/fa/cart-arrow-down.svg +3 -0
  110. package/assets/images/icons/fa/cart-plus.svg +3 -0
  111. package/assets/images/icons/fa/cc-amex.svg +9 -0
  112. package/assets/images/icons/fa/cc-diners-club.svg +3 -0
  113. package/assets/images/icons/fa/cc-discover.svg +5 -0
  114. package/assets/images/icons/fa/cc-jcb.svg +4 -0
  115. package/assets/images/icons/fa/cc-mastercard.svg +11 -0
  116. package/assets/images/icons/fa/cc-paypal.svg +6 -0
  117. package/assets/images/icons/fa/cc-stripe.svg +5 -0
  118. package/assets/images/icons/fa/cc-visa.svg +3 -0
  119. package/assets/images/icons/fa/cc.svg +4 -0
  120. package/assets/images/icons/fa/certificate.svg +3 -0
  121. package/assets/images/icons/fa/chain.svg +4 -0
  122. package/assets/images/icons/fa/check-circle-o.svg +2 -0
  123. package/assets/images/icons/fa/check-circle.svg +2 -0
  124. package/assets/images/icons/fa/check-square-o.svg +3 -0
  125. package/assets/images/icons/fa/check-square.svg +2 -0
  126. package/assets/images/icons/fa/check.svg +1 -0
  127. package/assets/images/icons/fa/chevron-circle-down.svg +2 -0
  128. package/assets/images/icons/fa/chevron-circle-left.svg +2 -0
  129. package/assets/images/icons/fa/chevron-circle-right.svg +2 -0
  130. package/assets/images/icons/fa/chevron-circle-up.svg +2 -0
  131. package/assets/images/icons/fa/chevron-down.svg +1 -0
  132. package/assets/images/icons/fa/chevron-left.svg +1 -0
  133. package/assets/images/icons/fa/chevron-right.svg +1 -0
  134. package/assets/images/icons/fa/chevron-up.svg +1 -0
  135. package/assets/images/icons/fa/child.svg +2 -0
  136. package/assets/images/icons/fa/chrome.svg +2 -0
  137. package/assets/images/icons/fa/circle-o-notch.svg +2 -0
  138. package/assets/images/icons/fa/circle-o.svg +2 -0
  139. package/assets/images/icons/fa/circle-thin.svg +2 -0
  140. package/assets/images/icons/fa/circle.svg +1 -0
  141. package/assets/images/icons/fa/clock-o.svg +2 -0
  142. package/assets/images/icons/fa/clone.svg +2 -0
  143. package/assets/images/icons/fa/cloud-download.svg +2 -0
  144. package/assets/images/icons/fa/cloud-upload.svg +2 -0
  145. package/assets/images/icons/fa/cloud.svg +2 -0
  146. package/assets/images/icons/fa/cny.svg +2 -0
  147. package/assets/images/icons/fa/code-fork.svg +3 -0
  148. package/assets/images/icons/fa/code.svg +2 -0
  149. package/assets/images/icons/fa/codepen.svg +2 -0
  150. package/assets/images/icons/fa/codiepie.svg +3 -0
  151. package/assets/images/icons/fa/coffee.svg +2 -0
  152. package/assets/images/icons/fa/columns.svg +1 -0
  153. package/assets/images/icons/fa/comment-o.svg +3 -0
  154. package/assets/images/icons/fa/comment.svg +2 -0
  155. package/assets/images/icons/fa/commenting-o.svg +4 -0
  156. package/assets/images/icons/fa/commenting.svg +3 -0
  157. package/assets/images/icons/fa/comments-o.svg +4 -0
  158. package/assets/images/icons/fa/comments.svg +3 -0
  159. package/assets/images/icons/fa/compass.svg +2 -0
  160. package/assets/images/icons/fa/compress.svg +2 -0
  161. package/assets/images/icons/fa/connectdevelop.svg +7 -0
  162. package/assets/images/icons/fa/contao.svg +3 -0
  163. package/assets/images/icons/fa/copy.svg +2 -0
  164. package/assets/images/icons/fa/copyright.svg +3 -0
  165. package/assets/images/icons/fa/creative-commons.svg +5 -0
  166. package/assets/images/icons/fa/credit-card-alt.svg +1 -0
  167. package/assets/images/icons/fa/credit-card.svg +2 -0
  168. package/assets/images/icons/fa/crop.svg +2 -0
  169. package/assets/images/icons/fa/crosshairs.svg +3 -0
  170. package/assets/images/icons/fa/css3.svg +1 -0
  171. package/assets/images/icons/fa/cube.svg +2 -0
  172. package/assets/images/icons/fa/cubes.svg +3 -0
  173. package/assets/images/icons/fa/cut.svg +5 -0
  174. package/assets/images/icons/fa/cutlery.svg +2 -0
  175. package/assets/images/icons/fa/dashboard.svg +4 -0
  176. package/assets/images/icons/fa/dashcube.svg +1 -0
  177. package/assets/images/icons/fa/database.svg +3 -0
  178. package/assets/images/icons/fa/deafness.svg +4 -0
  179. package/assets/images/icons/fa/dedent.svg +3 -0
  180. package/assets/images/icons/fa/delicious.svg +2 -0
  181. package/assets/images/icons/fa/desktop.svg +2 -0
  182. package/assets/images/icons/fa/deviantart.svg +1 -0
  183. package/assets/images/icons/fa/diamond.svg +2 -0
  184. package/assets/images/icons/fa/digg.svg +2 -0
  185. package/assets/images/icons/fa/dollar.svg +4 -0
  186. package/assets/images/icons/fa/dot-circle-o.svg +2 -0
  187. package/assets/images/icons/fa/download.svg +2 -0
  188. package/assets/images/icons/fa/dribbble.svg +4 -0
  189. package/assets/images/icons/fa/drivers-license-o.svg +4 -0
  190. package/assets/images/icons/fa/drivers-license.svg +4 -0
  191. package/assets/images/icons/fa/dropbox.svg +1 -0
  192. package/assets/images/icons/fa/drupal.svg +5 -0
  193. package/assets/images/icons/fa/edge.svg +2 -0
  194. package/assets/images/icons/fa/edit.svg +3 -0
  195. package/assets/images/icons/fa/eercast.svg +5 -0
  196. package/assets/images/icons/fa/eject.svg +1 -0
  197. package/assets/images/icons/fa/ellipsis-h.svg +2 -0
  198. package/assets/images/icons/fa/ellipsis-v.svg +2 -0
  199. package/assets/images/icons/fa/envelope-o.svg +3 -0
  200. package/assets/images/icons/fa/envelope-open-o.svg +4 -0
  201. package/assets/images/icons/fa/envelope-open.svg +3 -0
  202. package/assets/images/icons/fa/envelope-square.svg +3 -0
  203. package/assets/images/icons/fa/envelope.svg +2 -0
  204. package/assets/images/icons/fa/envira.svg +3 -0
  205. package/assets/images/icons/fa/eraser.svg +1 -0
  206. package/assets/images/icons/fa/etsy.svg +3 -0
  207. package/assets/images/icons/fa/euro.svg +3 -0
  208. package/assets/images/icons/fa/exchange.svg +2 -0
  209. package/assets/images/icons/fa/exclamation-circle.svg +2 -0
  210. package/assets/images/icons/fa/exclamation.svg +1 -0
  211. package/assets/images/icons/fa/expand.svg +2 -0
  212. package/assets/images/icons/fa/expeditedssl.svg +5 -0
  213. package/assets/images/icons/fa/external-link-square.svg +2 -0
  214. package/assets/images/icons/fa/external-link.svg +2 -0
  215. package/assets/images/icons/fa/eye-slash.svg +4 -0
  216. package/assets/images/icons/fa/eye.svg +2 -0
  217. package/assets/images/icons/fa/eyedropper.svg +2 -0
  218. package/assets/images/icons/fa/fa.svg +2 -0
  219. package/assets/images/icons/fa/facebook-f.svg +1 -0
  220. package/assets/images/icons/fa/facebook-official.svg +1 -0
  221. package/assets/images/icons/fa/facebook-square.svg +2 -0
  222. package/assets/images/icons/fa/fast-backward.svg +2 -0
  223. package/assets/images/icons/fa/fast-forward.svg +2 -0
  224. package/assets/images/icons/fa/fax.svg +5 -0
  225. package/assets/images/icons/fa/feed.svg +3 -0
  226. package/assets/images/icons/fa/female.svg +2 -0
  227. package/assets/images/icons/fa/fighter-jet.svg +2 -0
  228. package/assets/images/icons/fa/file-code-o.svg +3 -0
  229. package/assets/images/icons/fa/file-excel-o.svg +3 -0
  230. package/assets/images/icons/fa/file-movie-o.svg +2 -0
  231. package/assets/images/icons/fa/file-o.svg +2 -0
  232. package/assets/images/icons/fa/file-pdf-o.svg +4 -0
  233. package/assets/images/icons/fa/file-photo-o.svg +2 -0
  234. package/assets/images/icons/fa/file-powerpoint-o.svg +2 -0
  235. package/assets/images/icons/fa/file-sound-o.svg +3 -0
  236. package/assets/images/icons/fa/file-text-o.svg +3 -0
  237. package/assets/images/icons/fa/file-text.svg +2 -0
  238. package/assets/images/icons/fa/file-word-o.svg +3 -0
  239. package/assets/images/icons/fa/file-zip-o.svg +3 -0
  240. package/assets/images/icons/fa/file.svg +1 -0
  241. package/assets/images/icons/fa/film.svg +5 -0
  242. package/assets/images/icons/fa/filter.svg +1 -0
  243. package/assets/images/icons/fa/fire-extinguisher.svg +3 -0
  244. package/assets/images/icons/fa/fire.svg +2 -0
  245. package/assets/images/icons/fa/firefox.svg +3 -0
  246. package/assets/images/icons/fa/first-order.svg +4 -0
  247. package/assets/images/icons/fa/flag-checkered.svg +4 -0
  248. package/assets/images/icons/fa/flag-o.svg +3 -0
  249. package/assets/images/icons/fa/flag.svg +2 -0
  250. package/assets/images/icons/fa/flash.svg +1 -0
  251. package/assets/images/icons/fa/flask.svg +1 -0
  252. package/assets/images/icons/fa/flickr.svg +2 -0
  253. package/assets/images/icons/fa/folder-o.svg +2 -0
  254. package/assets/images/icons/fa/folder-open-o.svg +3 -0
  255. package/assets/images/icons/fa/folder-open.svg +2 -0
  256. package/assets/images/icons/fa/folder.svg +1 -0
  257. package/assets/images/icons/fa/font.svg +3 -0
  258. package/assets/images/icons/fa/fonticons.svg +3 -0
  259. package/assets/images/icons/fa/fort-awesome.svg +4 -0
  260. package/assets/images/icons/fa/forumbee.svg +2 -0
  261. package/assets/images/icons/fa/forward.svg +1 -0
  262. package/assets/images/icons/fa/foursquare.svg +3 -0
  263. package/assets/images/icons/fa/free-code-camp.svg +7 -0
  264. package/assets/images/icons/fa/frown-o.svg +3 -0
  265. package/assets/images/icons/fa/gamepad.svg +3 -0
  266. package/assets/images/icons/fa/gbp.svg +2 -0
  267. package/assets/images/icons/fa/ge.svg +6 -0
  268. package/assets/images/icons/fa/gear.svg +4 -0
  269. package/assets/images/icons/fa/gears.svg +8 -0
  270. package/assets/images/icons/fa/genderless.svg +2 -0
  271. package/assets/images/icons/fa/get-pocket.svg +2 -0
  272. package/assets/images/icons/fa/gg-circle.svg +2 -0
  273. package/assets/images/icons/fa/gg.svg +1 -0
  274. package/assets/images/icons/fa/gift.svg +3 -0
  275. package/assets/images/icons/fa/git-square.svg +4 -0
  276. package/assets/images/icons/fa/git.svg +4 -0
  277. package/assets/images/icons/fa/github-alt.svg +4 -0
  278. package/assets/images/icons/fa/github-square.svg +5 -0
  279. package/assets/images/icons/fa/github.svg +5 -0
  280. package/assets/images/icons/fa/gitlab.svg +1 -0
  281. package/assets/images/icons/fa/gittip.svg +2 -0
  282. package/assets/images/icons/fa/glass.svg +1 -0
  283. package/assets/images/icons/fa/glide-g.svg +4 -0
  284. package/assets/images/icons/fa/glide.svg +4 -0
  285. package/assets/images/icons/fa/globe.svg +15 -0
  286. package/assets/images/icons/fa/google-plus-circle.svg +2 -0
  287. package/assets/images/icons/fa/google-plus-square.svg +2 -0
  288. package/assets/images/icons/fa/google-plus.svg +2 -0
  289. package/assets/images/icons/fa/google-wallet.svg +2 -0
  290. package/assets/images/icons/fa/google.svg +2 -0
  291. package/assets/images/icons/fa/grav.svg +7 -0
  292. package/assets/images/icons/fa/group.svg +4 -0
  293. package/assets/images/icons/fa/h-square.svg +2 -0
  294. package/assets/images/icons/fa/hand-grab-o.svg +4 -0
  295. package/assets/images/icons/fa/hand-lizard-o.svg +3 -0
  296. package/assets/images/icons/fa/hand-o-down.svg +4 -0
  297. package/assets/images/icons/fa/hand-o-left.svg +4 -0
  298. package/assets/images/icons/fa/hand-o-right.svg +4 -0
  299. package/assets/images/icons/fa/hand-o-up.svg +4 -0
  300. package/assets/images/icons/fa/hand-peace-o.svg +5 -0
  301. package/assets/images/icons/fa/hand-pointer-o.svg +4 -0
  302. package/assets/images/icons/fa/hand-scissors-o.svg +5 -0
  303. package/assets/images/icons/fa/hand-spock-o.svg +4 -0
  304. package/assets/images/icons/fa/hand-stop-o.svg +3 -0
  305. package/assets/images/icons/fa/handshake-o.svg +5 -0
  306. package/assets/images/icons/fa/hashtag.svg +3 -0
  307. package/assets/images/icons/fa/hdd-o.svg +3 -0
  308. package/assets/images/icons/fa/header.svg +5 -0
  309. package/assets/images/icons/fa/headphones.svg +3 -0
  310. package/assets/images/icons/fa/heart-o.svg +3 -0
  311. package/assets/images/icons/fa/heart.svg +2 -0
  312. package/assets/images/icons/fa/heartbeat.svg +3 -0
  313. package/assets/images/icons/fa/history.svg +3 -0
  314. package/assets/images/icons/fa/home.svg +2 -0
  315. package/assets/images/icons/fa/hospital-o.svg +8 -0
  316. package/assets/images/icons/fa/hotel.svg +2 -0
  317. package/assets/images/icons/fa/hourglass-1.svg +2 -0
  318. package/assets/images/icons/fa/hourglass-2.svg +2 -0
  319. package/assets/images/icons/fa/hourglass-3.svg +3 -0
  320. package/assets/images/icons/fa/hourglass-o.svg +3 -0
  321. package/assets/images/icons/fa/hourglass.svg +3 -0
  322. package/assets/images/icons/fa/houzz.svg +1 -0
  323. package/assets/images/icons/fa/html5.svg +1 -0
  324. package/assets/images/icons/fa/i-cursor.svg +1 -0
  325. package/assets/images/icons/fa/id-badge.svg +3 -0
  326. package/assets/images/icons/fa/imdb.svg +4 -0
  327. package/assets/images/icons/fa/inbox.svg +2 -0
  328. package/assets/images/icons/fa/indent.svg +3 -0
  329. package/assets/images/icons/fa/industry.svg +1 -0
  330. package/assets/images/icons/fa/info-circle.svg +2 -0
  331. package/assets/images/icons/fa/info.svg +2 -0
  332. package/assets/images/icons/fa/instagram.svg +4 -0
  333. package/assets/images/icons/fa/institution.svg +2 -0
  334. package/assets/images/icons/fa/internet-explorer.svg +3 -0
  335. package/assets/images/icons/fa/intersex.svg +3 -0
  336. package/assets/images/icons/fa/ioxhost.svg +3 -0
  337. package/assets/images/icons/fa/italic.svg +2 -0
  338. package/assets/images/icons/fa/joomla.svg +5 -0
  339. package/assets/images/icons/fa/jsfiddle.svg +3 -0
  340. package/assets/images/icons/fa/key.svg +3 -0
  341. package/assets/images/icons/fa/keyboard-o.svg +5 -0
  342. package/assets/images/icons/fa/language.svg +6 -0
  343. package/assets/images/icons/fa/laptop.svg +2 -0
  344. package/assets/images/icons/fa/lastfm-square.svg +4 -0
  345. package/assets/images/icons/fa/lastfm.svg +4 -0
  346. package/assets/images/icons/fa/leaf.svg +3 -0
  347. package/assets/images/icons/fa/leanpub.svg +3 -0
  348. package/assets/images/icons/fa/legal.svg +4 -0
  349. package/assets/images/icons/fa/lemon-o.svg +4 -0
  350. package/assets/images/icons/fa/level-down.svg +1 -0
  351. package/assets/images/icons/fa/level-up.svg +1 -0
  352. package/assets/images/icons/fa/life-bouy.svg +3 -0
  353. package/assets/images/icons/fa/lightbulb-o.svg +4 -0
  354. package/assets/images/icons/fa/line-chart.svg +2 -0
  355. package/assets/images/icons/fa/linkedin-square.svg +2 -0
  356. package/assets/images/icons/fa/linkedin.svg +2 -0
  357. package/assets/images/icons/fa/linode.svg +4 -0
  358. package/assets/images/icons/fa/linux.svg +16 -0
  359. package/assets/images/icons/fa/list-alt.svg +5 -0
  360. package/assets/images/icons/fa/list-ol.svg +4 -0
  361. package/assets/images/icons/fa/list-ul.svg +3 -0
  362. package/assets/images/icons/fa/list.svg +5 -0
  363. package/assets/images/icons/fa/location-arrow.svg +1 -0
  364. package/assets/images/icons/fa/lock.svg +1 -0
  365. package/assets/images/icons/fa/long-arrow-down.svg +1 -0
  366. package/assets/images/icons/fa/long-arrow-left.svg +1 -0
  367. package/assets/images/icons/fa/long-arrow-right.svg +1 -0
  368. package/assets/images/icons/fa/long-arrow-up.svg +1 -0
  369. package/assets/images/icons/fa/low-vision.svg +4 -0
  370. package/assets/images/icons/fa/magic.svg +2 -0
  371. package/assets/images/icons/fa/magnet.svg +2 -0
  372. package/assets/images/icons/fa/mail-forward.svg +2 -0
  373. package/assets/images/icons/fa/mail-reply-all.svg +2 -0
  374. package/assets/images/icons/fa/mail-reply.svg +2 -0
  375. package/assets/images/icons/fa/male.svg +2 -0
  376. package/assets/images/icons/fa/map-marker.svg +1 -0
  377. package/assets/images/icons/fa/map-o.svg +2 -0
  378. package/assets/images/icons/fa/map-pin.svg +2 -0
  379. package/assets/images/icons/fa/map-signs.svg +2 -0
  380. package/assets/images/icons/fa/map.svg +2 -0
  381. package/assets/images/icons/fa/mars-double.svg +4 -0
  382. package/assets/images/icons/fa/mars-stroke-h.svg +3 -0
  383. package/assets/images/icons/fa/mars-stroke-v.svg +3 -0
  384. package/assets/images/icons/fa/mars-stroke.svg +3 -0
  385. package/assets/images/icons/fa/mars.svg +2 -0
  386. package/assets/images/icons/fa/maxcdn.svg +1 -0
  387. package/assets/images/icons/fa/meanpath.svg +3 -0
  388. package/assets/images/icons/fa/medium.svg +2 -0
  389. package/assets/images/icons/fa/medkit.svg +2 -0
  390. package/assets/images/icons/fa/meetup.svg +9 -0
  391. package/assets/images/icons/fa/meh-o.svg +3 -0
  392. package/assets/images/icons/fa/mercury.svg +3 -0
  393. package/assets/images/icons/fa/microchip.svg +5 -0
  394. package/assets/images/icons/fa/microphone-slash.svg +3 -0
  395. package/assets/images/icons/fa/microphone.svg +2 -0
  396. package/assets/images/icons/fa/minus-circle.svg +2 -0
  397. package/assets/images/icons/fa/minus-square-o.svg +2 -0
  398. package/assets/images/icons/fa/minus-square.svg +2 -0
  399. package/assets/images/icons/fa/minus.svg +1 -0
  400. package/assets/images/icons/fa/mixcloud.svg +4 -0
  401. package/assets/images/icons/fa/mobile-phone.svg +2 -0
  402. package/assets/images/icons/fa/modx.svg +1 -0
  403. package/assets/images/icons/fa/money.svg +2 -0
  404. package/assets/images/icons/fa/moon-o.svg +2 -0
  405. package/assets/images/icons/fa/mortar-board.svg +2 -0
  406. package/assets/images/icons/fa/motorcycle.svg +4 -0
  407. package/assets/images/icons/fa/mouse-pointer.svg +1 -0
  408. package/assets/images/icons/fa/music.svg +2 -0
  409. package/assets/images/icons/fa/navicon.svg +2 -0
  410. package/assets/images/icons/fa/neuter.svg +2 -0
  411. package/assets/images/icons/fa/newspaper-o.svg +2 -0
  412. package/assets/images/icons/fa/object-group.svg +2 -0
  413. package/assets/images/icons/fa/object-ungroup.svg +2 -0
  414. package/assets/images/icons/fa/odnoklassniki-square.svg +3 -0
  415. package/assets/images/icons/fa/odnoklassniki.svg +3 -0
  416. package/assets/images/icons/fa/opencart.svg +3 -0
  417. package/assets/images/icons/fa/openid.svg +1 -0
  418. package/assets/images/icons/fa/opera.svg +3 -0
  419. package/assets/images/icons/fa/optin-monster.svg +17 -0
  420. package/assets/images/icons/fa/pagelines.svg +4 -0
  421. package/assets/images/icons/fa/paint-brush.svg +2 -0
  422. package/assets/images/icons/fa/paperclip.svg +3 -0
  423. package/assets/images/icons/fa/paragraph.svg +2 -0
  424. package/assets/images/icons/fa/paste.svg +2 -0
  425. package/assets/images/icons/fa/pause-circle-o.svg +2 -0
  426. package/assets/images/icons/fa/pause-circle.svg +2 -0
  427. package/assets/images/icons/fa/pause.svg +1 -0
  428. package/assets/images/icons/fa/paw.svg +4 -0
  429. package/assets/images/icons/fa/paypal.svg +3 -0
  430. package/assets/images/icons/fa/pencil-square.svg +2 -0
  431. package/assets/images/icons/fa/pencil.svg +2 -0
  432. package/assets/images/icons/fa/percent.svg +3 -0
  433. package/assets/images/icons/fa/phone-square.svg +4 -0
  434. package/assets/images/icons/fa/phone.svg +3 -0
  435. package/assets/images/icons/fa/photo.svg +2 -0
  436. package/assets/images/icons/fa/pie-chart.svg +1 -0
  437. package/assets/images/icons/fa/pied-piper-alt.svg +8 -0
  438. package/assets/images/icons/fa/pied-piper-pp.svg +3 -0
  439. package/assets/images/icons/fa/pied-piper.svg +3 -0
  440. package/assets/images/icons/fa/pinterest-p.svg +3 -0
  441. package/assets/images/icons/fa/pinterest-square.svg +3 -0
  442. package/assets/images/icons/fa/pinterest.svg +3 -0
  443. package/assets/images/icons/fa/plane.svg +2 -0
  444. package/assets/images/icons/fa/play-circle-o.svg +2 -0
  445. package/assets/images/icons/fa/play-circle.svg +2 -0
  446. package/assets/images/icons/fa/play.svg +1 -0
  447. package/assets/images/icons/fa/plug.svg +2 -0
  448. package/assets/images/icons/fa/plus-circle.svg +2 -0
  449. package/assets/images/icons/fa/plus-square-o.svg +2 -0
  450. package/assets/images/icons/fa/plus-square.svg +2 -0
  451. package/assets/images/icons/fa/plus.svg +1 -0
  452. package/assets/images/icons/fa/podcast.svg +5 -0
  453. package/assets/images/icons/fa/power-off.svg +2 -0
  454. package/assets/images/icons/fa/print.svg +2 -0
  455. package/assets/images/icons/fa/product-hunt.svg +2 -0
  456. package/assets/images/icons/fa/puzzle-piece.svg +4 -0
  457. package/assets/images/icons/fa/qq.svg +4 -0
  458. package/assets/images/icons/fa/qrcode.svg +2 -0
  459. package/assets/images/icons/fa/question-circle-o.svg +4 -0
  460. package/assets/images/icons/fa/question-circle.svg +3 -0
  461. package/assets/images/icons/fa/question.svg +2 -0
  462. package/assets/images/icons/fa/quora.svg +3 -0
  463. package/assets/images/icons/fa/quote-left.svg +2 -0
  464. package/assets/images/icons/fa/quote-right.svg +2 -0
  465. package/assets/images/icons/fa/ra.svg +4 -0
  466. package/assets/images/icons/fa/random.svg +4 -0
  467. package/assets/images/icons/fa/ravelry.svg +6 -0
  468. package/assets/images/icons/fa/recycle.svg +4 -0
  469. package/assets/images/icons/fa/reddit-alien.svg +4 -0
  470. package/assets/images/icons/fa/reddit-square.svg +4 -0
  471. package/assets/images/icons/fa/reddit.svg +4 -0
  472. package/assets/images/icons/fa/refresh.svg +3 -0
  473. package/assets/images/icons/fa/registered.svg +3 -0
  474. package/assets/images/icons/fa/remove.svg +2 -0
  475. package/assets/images/icons/fa/renren.svg +2 -0
  476. package/assets/images/icons/fa/retweet.svg +3 -0
  477. package/assets/images/icons/fa/road.svg +2 -0
  478. package/assets/images/icons/fa/rocket.svg +2 -0
  479. package/assets/images/icons/fa/rotate-left.svg +2 -0
  480. package/assets/images/icons/fa/rotate-right.svg +2 -0
  481. package/assets/images/icons/fa/rss-square.svg +3 -0
  482. package/assets/images/icons/fa/ruble.svg +2 -0
  483. package/assets/images/icons/fa/rupee.svg +2 -0
  484. package/assets/images/icons/fa/safari.svg +6 -0
  485. package/assets/images/icons/fa/save.svg +2 -0
  486. package/assets/images/icons/fa/scribd.svg +4 -0
  487. package/assets/images/icons/fa/search-minus.svg +3 -0
  488. package/assets/images/icons/fa/search-plus.svg +3 -0
  489. package/assets/images/icons/fa/search.svg +2 -0
  490. package/assets/images/icons/fa/sellsy.svg +3 -0
  491. package/assets/images/icons/fa/send-o.svg +2 -0
  492. package/assets/images/icons/fa/send.svg +1 -0
  493. package/assets/images/icons/fa/server.svg +2 -0
  494. package/assets/images/icons/fa/share-alt-square.svg +2 -0
  495. package/assets/images/icons/fa/share-alt.svg +2 -0
  496. package/assets/images/icons/fa/share-square-o.svg +3 -0
  497. package/assets/images/icons/fa/share-square.svg +2 -0
  498. package/assets/images/icons/fa/shekel.svg +2 -0
  499. package/assets/images/icons/fa/shield.svg +2 -0
  500. package/assets/images/icons/fa/ship.svg +5 -0
  501. package/assets/images/icons/fa/shirtsinbulk.svg +7 -0
  502. package/assets/images/icons/fa/shopping-bag.svg +2 -0
  503. package/assets/images/icons/fa/shopping-basket.svg +4 -0
  504. package/assets/images/icons/fa/shopping-cart.svg +2 -0
  505. package/assets/images/icons/fa/shower.svg +6 -0
  506. package/assets/images/icons/fa/sign-in.svg +2 -0
  507. package/assets/images/icons/fa/sign-out.svg +2 -0
  508. package/assets/images/icons/fa/signal.svg +2 -0
  509. package/assets/images/icons/fa/signing.svg +5 -0
  510. package/assets/images/icons/fa/simplybuilt.svg +2 -0
  511. package/assets/images/icons/fa/sitemap.svg +3 -0
  512. package/assets/images/icons/fa/skyatlas.svg +4 -0
  513. package/assets/images/icons/fa/skype.svg +4 -0
  514. package/assets/images/icons/fa/slack.svg +3 -0
  515. package/assets/images/icons/fa/sliders.svg +2 -0
  516. package/assets/images/icons/fa/slideshare.svg +4 -0
  517. package/assets/images/icons/fa/smile-o.svg +3 -0
  518. package/assets/images/icons/fa/snapchat-ghost.svg +3 -0
  519. package/assets/images/icons/fa/snapchat-square.svg +4 -0
  520. package/assets/images/icons/fa/snapchat.svg +4 -0
  521. package/assets/images/icons/fa/snowflake-o.svg +5 -0
  522. package/assets/images/icons/fa/soccer-ball-o.svg +2 -0
  523. package/assets/images/icons/fa/sort-alpha-asc.svg +3 -0
  524. package/assets/images/icons/fa/sort-alpha-desc.svg +3 -0
  525. package/assets/images/icons/fa/sort-amount-asc.svg +3 -0
  526. package/assets/images/icons/fa/sort-amount-desc.svg +3 -0
  527. package/assets/images/icons/fa/sort-down.svg +1 -0
  528. package/assets/images/icons/fa/sort-numeric-asc.svg +3 -0
  529. package/assets/images/icons/fa/sort-numeric-desc.svg +3 -0
  530. package/assets/images/icons/fa/sort-up.svg +1 -0
  531. package/assets/images/icons/fa/soundcloud.svg +7 -0
  532. package/assets/images/icons/fa/space-shuttle.svg +3 -0
  533. package/assets/images/icons/fa/spinner.svg +4 -0
  534. package/assets/images/icons/fa/spoon.svg +1 -0
  535. package/assets/images/icons/fa/spotify.svg +3 -0
  536. package/assets/images/icons/fa/square-o.svg +2 -0
  537. package/assets/images/icons/fa/square.svg +1 -0
  538. package/assets/images/icons/fa/stack-exchange.svg +2 -0
  539. package/assets/images/icons/fa/stack-overflow.svg +1 -0
  540. package/assets/images/icons/fa/star-half-empty.svg +2 -0
  541. package/assets/images/icons/fa/star-half.svg +1 -0
  542. package/assets/images/icons/fa/star-o.svg +2 -0
  543. package/assets/images/icons/fa/star.svg +2 -0
  544. package/assets/images/icons/fa/steam-square.svg +4 -0
  545. package/assets/images/icons/fa/steam.svg +3 -0
  546. package/assets/images/icons/fa/step-backward.svg +1 -0
  547. package/assets/images/icons/fa/step-forward.svg +1 -0
  548. package/assets/images/icons/fa/stethoscope.svg +3 -0
  549. package/assets/images/icons/fa/sticky-note-o.svg +2 -0
  550. package/assets/images/icons/fa/sticky-note.svg +1 -0
  551. package/assets/images/icons/fa/stop-circle-o.svg +2 -0
  552. package/assets/images/icons/fa/stop-circle.svg +2 -0
  553. package/assets/images/icons/fa/stop.svg +1 -0
  554. package/assets/images/icons/fa/street-view.svg +4 -0
  555. package/assets/images/icons/fa/strikethrough.svg +3 -0
  556. package/assets/images/icons/fa/stumbleupon-circle.svg +3 -0
  557. package/assets/images/icons/fa/stumbleupon.svg +2 -0
  558. package/assets/images/icons/fa/subscript.svg +3 -0
  559. package/assets/images/icons/fa/subway.svg +2 -0
  560. package/assets/images/icons/fa/suitcase.svg +2 -0
  561. package/assets/images/icons/fa/sun-o.svg +3 -0
  562. package/assets/images/icons/fa/superpowers.svg +2 -0
  563. package/assets/images/icons/fa/superscript.svg +3 -0
  564. package/assets/images/icons/fa/table.svg +5 -0
  565. package/assets/images/icons/fa/tablet.svg +2 -0
  566. package/assets/images/icons/fa/tag.svg +2 -0
  567. package/assets/images/icons/fa/tags.svg +2 -0
  568. package/assets/images/icons/fa/tasks.svg +2 -0
  569. package/assets/images/icons/fa/telegram.svg +2 -0
  570. package/assets/images/icons/fa/tencent-weibo.svg +3 -0
  571. package/assets/images/icons/fa/terminal.svg +2 -0
  572. package/assets/images/icons/fa/text-height.svg +4 -0
  573. package/assets/images/icons/fa/text-width.svg +5 -0
  574. package/assets/images/icons/fa/th-large.svg +2 -0
  575. package/assets/images/icons/fa/th-list.svg +3 -0
  576. package/assets/images/icons/fa/th.svg +4 -0
  577. package/assets/images/icons/fa/themeisle.svg +8 -0
  578. package/assets/images/icons/fa/thermometer-0.svg +2 -0
  579. package/assets/images/icons/fa/thermometer-1.svg +3 -0
  580. package/assets/images/icons/fa/thermometer-2.svg +3 -0
  581. package/assets/images/icons/fa/thermometer-3.svg +3 -0
  582. package/assets/images/icons/fa/thermometer-4.svg +3 -0
  583. package/assets/images/icons/fa/thumb-tack.svg +2 -0
  584. package/assets/images/icons/fa/thumbs-down.svg +3 -0
  585. package/assets/images/icons/fa/thumbs-o-down.svg +4 -0
  586. package/assets/images/icons/fa/thumbs-o-up.svg +4 -0
  587. package/assets/images/icons/fa/thumbs-up.svg +3 -0
  588. package/assets/images/icons/fa/ticket.svg +2 -0
  589. package/assets/images/icons/fa/times-circle-o.svg +3 -0
  590. package/assets/images/icons/fa/times-circle.svg +2 -0
  591. package/assets/images/icons/fa/times-rectangle-o.svg +2 -0
  592. package/assets/images/icons/fa/times-rectangle.svg +2 -0
  593. package/assets/images/icons/fa/tint.svg +2 -0
  594. package/assets/images/icons/fa/toggle-down.svg +2 -0
  595. package/assets/images/icons/fa/toggle-left.svg +2 -0
  596. package/assets/images/icons/fa/toggle-off.svg +3 -0
  597. package/assets/images/icons/fa/toggle-on.svg +2 -0
  598. package/assets/images/icons/fa/toggle-right.svg +2 -0
  599. package/assets/images/icons/fa/toggle-up.svg +2 -0
  600. package/assets/images/icons/fa/trademark.svg +3 -0
  601. package/assets/images/icons/fa/train.svg +2 -0
  602. package/assets/images/icons/fa/transgender-alt.svg +4 -0
  603. package/assets/images/icons/fa/trash-o.svg +3 -0
  604. package/assets/images/icons/fa/trash.svg +3 -0
  605. package/assets/images/icons/fa/tree.svg +2 -0
  606. package/assets/images/icons/fa/trello.svg +2 -0
  607. package/assets/images/icons/fa/tripadvisor.svg +6 -0
  608. package/assets/images/icons/fa/trophy.svg +3 -0
  609. package/assets/images/icons/fa/truck.svg +3 -0
  610. package/assets/images/icons/fa/tty.svg +5 -0
  611. package/assets/images/icons/fa/tumblr-square.svg +2 -0
  612. package/assets/images/icons/fa/tumblr.svg +2 -0
  613. package/assets/images/icons/fa/turkish-lira.svg +2 -0
  614. package/assets/images/icons/fa/tv.svg +2 -0
  615. package/assets/images/icons/fa/twitch.svg +1 -0
  616. package/assets/images/icons/fa/twitter-square.svg +3 -0
  617. package/assets/images/icons/fa/twitter.svg +2 -0
  618. package/assets/images/icons/fa/umbrella.svg +3 -0
  619. package/assets/images/icons/fa/underline.svg +4 -0
  620. package/assets/images/icons/fa/universal-access.svg +4 -0
  621. package/assets/images/icons/fa/unlink.svg +4 -0
  622. package/assets/images/icons/fa/unlock-alt.svg +2 -0
  623. package/assets/images/icons/fa/unlock.svg +2 -0
  624. package/assets/images/icons/fa/unsorted.svg +1 -0
  625. package/assets/images/icons/fa/upload.svg +2 -0
  626. package/assets/images/icons/fa/usb.svg +3 -0
  627. package/assets/images/icons/fa/user-circle-o.svg +2 -0
  628. package/assets/images/icons/fa/user-circle.svg +2 -0
  629. package/assets/images/icons/fa/user-md.svg +4 -0
  630. package/assets/images/icons/fa/user-o.svg +3 -0
  631. package/assets/images/icons/fa/user-plus.svg +3 -0
  632. package/assets/images/icons/fa/user-secret.svg +4 -0
  633. package/assets/images/icons/fa/user-times.svg +3 -0
  634. package/assets/images/icons/fa/user.svg +2 -0
  635. package/assets/images/icons/fa/vcard-o.svg +5 -0
  636. package/assets/images/icons/fa/vcard.svg +4 -0
  637. package/assets/images/icons/fa/venus-double.svg +4 -0
  638. package/assets/images/icons/fa/venus-mars.svg +4 -0
  639. package/assets/images/icons/fa/venus.svg +2 -0
  640. package/assets/images/icons/fa/viacoin.svg +1 -0
  641. package/assets/images/icons/fa/viadeo-square.svg +4 -0
  642. package/assets/images/icons/fa/viadeo.svg +3 -0
  643. package/assets/images/icons/fa/video-camera.svg +2 -0
  644. package/assets/images/icons/fa/vimeo-square.svg +2 -0
  645. package/assets/images/icons/fa/vimeo.svg +2 -0
  646. package/assets/images/icons/fa/vine.svg +2 -0
  647. package/assets/images/icons/fa/vk.svg +5 -0
  648. package/assets/images/icons/fa/volume-control-phone.svg +5 -0
  649. package/assets/images/icons/fa/volume-down.svg +2 -0
  650. package/assets/images/icons/fa/volume-off.svg +1 -0
  651. package/assets/images/icons/fa/volume-up.svg +4 -0
  652. package/assets/images/icons/fa/warning.svg +2 -0
  653. package/assets/images/icons/fa/wechat.svg +4 -0
  654. package/assets/images/icons/fa/weibo.svg +5 -0
  655. package/assets/images/icons/fa/whatsapp.svg +3 -0
  656. package/assets/images/icons/fa/wheelchair-alt.svg +3 -0
  657. package/assets/images/icons/fa/wheelchair.svg +2 -0
  658. package/assets/images/icons/fa/wifi.svg +3 -0
  659. package/assets/images/icons/fa/wikipedia-w.svg +3 -0
  660. package/assets/images/icons/fa/window-maximize.svg +1 -0
  661. package/assets/images/icons/fa/window-minimize.svg +1 -0
  662. package/assets/images/icons/fa/window-restore.svg +2 -0
  663. package/assets/images/icons/fa/windows.svg +1 -0
  664. package/assets/images/icons/fa/won.svg +3 -0
  665. package/assets/images/icons/fa/wordpress.svg +5 -0
  666. package/assets/images/icons/fa/wpbeginner.svg +2 -0
  667. package/assets/images/icons/fa/wpexplorer.svg +3 -0
  668. package/assets/images/icons/fa/wpforms.svg +2 -0
  669. package/assets/images/icons/fa/wrench.svg +2 -0
  670. package/assets/images/icons/fa/xing-square.svg +2 -0
  671. package/assets/images/icons/fa/xing.svg +2 -0
  672. package/assets/images/icons/fa/y-combinator-square.svg +1 -0
  673. package/assets/images/icons/fa/yahoo.svg +2 -0
  674. package/assets/images/icons/fa/yc.svg +1 -0
  675. package/assets/images/icons/fa/yelp.svg +4 -0
  676. package/assets/images/icons/fa/yoast.svg +2 -0
  677. package/assets/images/icons/fa/youtube-play.svg +3 -0
  678. package/assets/images/icons/fa/youtube-square.svg +6 -0
  679. package/assets/images/icons/fa/youtube.svg +5 -0
  680. package/assets/site.scss +375 -374
  681. package/assets/{bootswatch.scss → theme-variables.scss} +100 -100
  682. package/assets/theme.scss +146 -0
  683. package/assets/variables.scss +93 -93
  684. package/fesm2022/dflat-core-web-core-data.mjs +6 -10
  685. package/fesm2022/dflat-core-web-core-data.mjs.map +1 -1
  686. package/fesm2022/dflat-core-web-core-model.mjs.map +1 -1
  687. package/fesm2022/dflat-core-web-core-ux-testing.mjs +5 -1
  688. package/fesm2022/dflat-core-web-core-ux-testing.mjs.map +1 -1
  689. package/fesm2022/dflat-core-web-core-ux.mjs +4329 -987
  690. package/fesm2022/dflat-core-web-core-ux.mjs.map +1 -1
  691. package/fesm2022/dflat-core-web-core.mjs +102 -7
  692. package/fesm2022/dflat-core-web-core.mjs.map +1 -1
  693. package/fesm2022/dflat-core-web-system-data.mjs +35 -0
  694. package/fesm2022/dflat-core-web-system-data.mjs.map +1 -1
  695. package/fesm2022/dflat-core-web-system-model.mjs +11 -1
  696. package/fesm2022/dflat-core-web-system-model.mjs.map +1 -1
  697. package/fesm2022/dflat-core-web-system-root.mjs +2 -2
  698. package/fesm2022/dflat-core-web-system-root.mjs.map +1 -1
  699. package/fesm2022/dflat-core-web-system-ux.mjs +3201 -1064
  700. package/fesm2022/dflat-core-web-system-ux.mjs.map +1 -1
  701. package/package.json +1 -8
  702. package/scss/dflat-app.scss +10 -11
  703. package/types/dflat-core-web-core-data.d.ts +11 -3
  704. package/types/dflat-core-web-core-model.d.ts +6 -9
  705. package/types/dflat-core-web-core-ux-testing.d.ts +6 -2
  706. package/types/dflat-core-web-core-ux.d.ts +1525 -98
  707. package/types/dflat-core-web-core.d.ts +58 -0
  708. package/types/dflat-core-web-system-data.d.ts +8 -1
  709. package/types/dflat-core-web-system-model.d.ts +466 -2
  710. package/types/dflat-core-web-system-ux.d.ts +292 -48
@@ -1 +1 @@
1
- {"version":3,"file":"dflat-core-web-core-data.mjs","names":["i1.DataService"],"sources":["../../core-data/src/lib/services/data-service.ts","../../core-data/src/lib/core-data.module.ts","../../core-data/src/lib/services/entity-data-service.ts"],"sourcesContent":["import { EnvironmentBase, Utilities } from '@dflat-core/web/core';\r\nimport { ActionDescriptor, ColumnDescriptor, EntityViewModelWithFields, EntityWithSpecifics, ExtendedProperty, FilterDescriptor, PagedList, SaveResult, SaveResults, TrackRecordProperty } from '@dflat-core/web/core-model';\r\nimport { HeadersService, InitCacheService } from '@dflat-core/web/core-services';\r\nimport { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { inject, Injectable, Type } from '@angular/core';\r\nimport { defer, Observable, of } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n\r\n@Injectable()\r\nexport class DataService {\r\n\r\n baseUrl = this.env.apiUrl;\r\n httpClient: HttpClient;\r\n data: any[];\r\n private initCache = inject(InitCacheService);\r\n constructor(\r\n private env: EnvironmentBase,\r\n httpClient: HttpClient,\r\n private headerService: HeadersService) {\r\n this.httpClient = httpClient\r\n }\r\n\r\n getFormattedParams(params: any): any {\r\n // Point d'entrée public : conserve le comportement historique\r\n // (stringify uniquement quand params racine est un tableau).\r\n if (Array.isArray(params)) {\r\n if (params.length > 0 && typeof (params[0]) === 'number') {\r\n return JSON.stringify(params);\r\n }\r\n const result = params.map(entity => this.formatValueRecursive(entity));\r\n return JSON.stringify(result);\r\n }\r\n\r\n return this.formatValueRecursive(params);\r\n }\r\n\r\n // Transforme récursivement un objet/tableau/valeur, sans jamais stringifier.\r\n // Utilisée pour descendre dans les propriétés imbriquées (ex: un tableau\r\n // d'objets contenu dans une propriété d'un objet racine), qui étaient\r\n // auparavant copiées telles quelles et donc jamais nettoyées de leurs Date.\r\n private formatValueRecursive(val: any): any {\r\n if (val === undefined || val === null) {\r\n return val;\r\n }\r\n\r\n if (val instanceof Date) {\r\n return `${Utilities.Format2Digits(val.getFullYear())}-${Utilities.Format2Digits(val.getMonth() + 1)}-${Utilities.Format2Digits(val.getDate())}T00:00:00.000Z`;\r\n }\r\n\r\n if (Array.isArray(val)) {\r\n // Tableau de nombres : on le laisse tel quel (comme au niveau racine)\r\n if (val.length > 0 && typeof (val[0]) === 'number') {\r\n return val;\r\n }\r\n return val.map(item => this.formatValueRecursive(item));\r\n }\r\n\r\n if (typeof val === 'object') {\r\n const result: any = {};\r\n for (let key in val) {\r\n if (val.hasOwnProperty(key)) {\r\n const propVal = val[key];\r\n if (propVal !== undefined && propVal !== null) {\r\n result[key] = this.formatValueRecursive(propVal);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // primitive (string, number, boolean...) : inchangé\r\n return val;\r\n }\r\n\r\n\r\n getUrlQueryParams(filter: any): HttpParams {\r\n let requestParams = new HttpParams();\r\n let formattedFilter = this.getFormattedParams(filter);\r\n for (let key in formattedFilter) {\r\n if (formattedFilter.hasOwnProperty(key)) {\r\n let vals = formattedFilter[key];\r\n if (Array.isArray(vals) && vals.length > 0)\r\n {\r\n for (let key2 in vals) {\r\n requestParams = requestParams.append(key, vals[key2]);\r\n }\r\n }\r\n else if (typeof vals === 'object') {\r\n requestParams = requestParams.set(key, JSON.stringify(vals));\r\n }\r\n else\r\n {\r\n requestParams = requestParams.set(key, vals);\r\n }\r\n }\r\n }\r\n return requestParams;\r\n }\r\n\r\n /*getUrlQueryArrayParams(filter: any): HttpParams {\r\n let requestParams = new HttpParams();\r\n let formattedFilter = this.getFormattedParams(filter);\r\n for (let key in formattedFilter) {\r\n if (formattedFilter.hasOwnProperty(key)) {\r\n let vals = formattedFilter[key];\r\n for (let key2 in vals) {\r\n requestParams = requestParams.append(key, vals[key2]);\r\n }\r\n }\r\n }\r\n return requestParams;\r\n }*/\r\n\r\n /**\r\n * Appel GET sans paramètre gardé dans le cache d'initialisation (InitCacheService) : données\r\n * chargées avant la recherche, identiques d'une ouverture de l'écran à l'autre. Le cache est\r\n * vidé au redémarrage de l'API (horodatage du jeton d'accès) et au changement d'utilisateur.\r\n */\r\n getCached<T>(entityKey: string, action: string): Observable<T> {\r\n return this.initCache.get<T>(`${entityKey}/${action}`,\r\n () => this.httpClient.get<T>(this.baseUrl + `/${entityKey}/${action}`, {}));\r\n }\r\n\r\n /**\r\n * Valeur d'initialisation d'une entité calculée par le front (ex. définition de ses onglets,\r\n * voir EntitySections), gardée dans le même cache que les appels de getCached et sous la même\r\n * portée (clé de l'entité) : `factory` n'est appelée qu'une fois, jusqu'à ce que le cache soit\r\n * vidé (clearCached, redémarrage de l'API, changement d'utilisateur).\r\n */\r\n getCachedValue<T>(entityKey: string, name: string, factory: () => T): Observable<T> {\r\n return this.initCache.get<T>(`${entityKey}/${name}`, () => defer(() => of(factory())));\r\n }\r\n\r\n /** Vide le cache d'initialisation d'une entité, ou tout le cache. */\r\n clearCached(entityKey?: string): void {\r\n this.initCache.clear(Utilities.IsNil(entityKey) ? null : `${entityKey}/`);\r\n }\r\n\r\n getViewFilterDescriptors(entityKey: string): Observable<FilterDescriptor[]> {\r\n return this.getCached<FilterDescriptor[]>(entityKey, 'GetFilterDescriptors');\r\n }\r\n\r\n getViewColumns(entityKey: string): Observable<ColumnDescriptor[]> {\r\n return this.getCached<ColumnDescriptor[]>(entityKey, 'GetGridColumns');\r\n }\r\n\r\n search<TData>(entityKey: string, filter: any): Observable<PagedList<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/Search`;\r\n let requestParams = this.getUrlQueryParams(filter);\r\n return this.httpClient.get<PagedList<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getDetails<TData>(entityKey: string, id: number): Observable<TData> {\r\n let _url = this.baseUrl + `/${entityKey}/GetDetails?`;\r\n if (id === undefined || id === null)\r\n throw new Error(\"The parameter 'id' must be defined and cannot be null.\");\r\n else\r\n _url += \"id=\" + encodeURI(\"\" + id);\r\n\r\n _url = _url.replace(/[?&]$/, \"\");\r\n\r\n return this.httpClient.get<TData>(_url);\r\n }\r\n\r\n getEmptyFilter<T>(entityKey: string): Observable<T> {\r\n return this.getCached<T>(entityKey, 'GetEmptyFilter');\r\n }\r\n\r\n /**\r\n * fonction \"async\" liant le front(Angular) et le back(C#)\r\n * - Principalement appelée par \"src.app.core.layout.BaseEditorComponent.loadEntityViewModel()\" lorsque l'on cherche à afficher un Objet de type \"EntityViewModel\"\r\n * - C'est elle qui lance l'appel à la fonction \"back\" BaseFilterController.GetEntityViewModel<TData>(id).\r\n * - Puis elle crée un observable avec la réponse qu'elle obtient du \"back\"\r\n *\r\n * @async\r\n * @function\r\n * @name getEntityViewModel<TData>\r\n * @param {string} entityKey\r\n * @param {number} id\r\n * @returns {(Observable)EntityViewModelWithFields<TData>}\r\n * @memberof DataService\r\n * @summary Demande les données d'une entité au back(C#) à travers \"getEntityViewModel\".\r\n * @see {@link src.app.core.layout.BaseEditorComponent.loadEntityViewModel()} for more information\r\n * @throws new Error(\"The parameter 'id' must be defined and cannot be null.\") if (id === undefined ou id === null)\r\n */\r\n getEntityViewModel<TData>(entityKey: string, id: number): Observable<EntityViewModelWithFields<TData>> {\r\n let _url = this. baseUrl + `/${entityKey}/GetEntityViewModel?`;\r\n if (id === undefined || id === null)\r\n throw new Error(\"The parameter 'id' must be defined and cannot be null.\");\r\n else if (id === 0)\r\n // Formulaire vide (id 0) : donnée d'initialisation, gardée en cache.\r\n return this.getCached<EntityViewModelWithFields<TData>>(entityKey, 'GetEntityViewModel?id=0');\r\n else\r\n _url += \"id=\" + encodeURI(\"\" + id);\r\n\r\n _url = _url.replace(/[?&]$/, \"\");\r\n\r\n return this.httpClient.get(_url).pipe(\r\n map((resp: Response) => <EntityViewModelWithFields<TData>>resp));\r\n }\r\n\r\n getExtendedProperties(entityKey: string, entityIds: number[]): Observable<ExtendedProperty[]> {\r\n let _url = this.baseUrl + `/${entityKey}/GetExtendedProperties`;\r\n\r\n let requestParams = this.getUrlQueryParams({ entityIds: entityIds });\r\n return this.httpClient.get<ExtendedProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n getExtendedActions (entityKey: string) : Observable<ActionDescriptor[]> {\r\n return this.getCached<ActionDescriptor[]>(entityKey, 'GetExtendedActions');\r\n }\r\n \r\n getTrackRecordProperties(entityKey: string, entityIds: number[]): Observable<TrackRecordProperty[]> {\r\n let _url = this.baseUrl + `/${entityKey}/GetTrackRecordProperties`;\r\n\r\n let requestParams = this.getUrlQueryParams({ entityIds: entityIds });\r\n return this.httpClient.get<TrackRecordProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n saveEntity<TData>(entityKey: string, entity: TData): Observable<SaveResult> {\r\n let _url = this.baseUrl + `/${entityKey}/SaveEntity`;\r\n return this.httpClient.post<SaveResult>(_url, this.getFormattedParams(entity));\r\n }\r\n\r\n deleteEntity<TData>(entityKey: string, entity: TData): Observable<SaveResult> {\r\n let _url = this.baseUrl + `/${entityKey}/DeleteEntity`;\r\n return this.httpClient.post<SaveResult>(_url, this.getFormattedParams(entity));\r\n }\r\n\r\n deleteEntities<TData>(entityKey: string, entities: TData[]): Observable<SaveResults<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/DeleteEntities`;\r\n return this.httpClient.post<SaveResults<TData>>(_url, this.getFormattedParams(entities));\r\n }\r\n\r\n saveEntities<TData>(entityKey: string, entities: TData[]): Observable<SaveResults<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/saveEntities`;\r\n let toSave = [];\r\n entities.forEach(entity => {\r\n toSave.push(this.getFormattedParams(entity));\r\n });\r\n return this.httpClient.post<SaveResults<TData>>(_url, JSON.stringify(toSave));\r\n }\r\n\r\n\r\n\r\n SaveEntityWithSpecifics<TData>(entityKey: string, DataToSave: EntityWithSpecifics<TData>): Observable<{ success: boolean, rowVersion?: Date }> {\r\n let _url = this.baseUrl + `/${entityKey}/SaveEntityWithSpecifics`;\r\n return this.httpClient.post<{ success: boolean, rowVersion?: Date }>(_url, this.getFormattedParams(DataToSave));\r\n }\r\n\r\n exportAll<TData>(entityKey: string, filter: any) {\r\n let _url = this.baseUrl + `/${entityKey}/ExportAll`;\r\n let requestParams = this.getUrlQueryParams(filter);\r\n\r\n return this.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' })\r\n .pipe(map((r: HttpResponse<Blob>) => this.getFileInfo(r)))\r\n }\r\n\r\n exportResults<TData>(entityKey: string, exportModel: any) {\r\n let _url = this.baseUrl + `/${entityKey}/ExportResults`;\r\n const _body = JSON.stringify(exportModel);\r\n\r\n return this.httpClient.post(_url, _body, { observe: 'response', responseType: 'blob' })\r\n .pipe(map((r: HttpResponse<Blob>) => this.getFileInfo(r)));\r\n }\r\n\r\n public getFileInfo(resp: HttpResponse<Blob>): { fileBlob: Blob, fileName: string } {\r\n var type = resp.headers.get(\"Content-Type\");\r\n let b = new Blob([resp.body], { type: type });\r\n return {\r\n fileBlob: b,\r\n fileName: (resp.headers.get(\"Content-Disposition\") || \"\").split(\";\")[1].trim().split(\"=\")[1].replace(/['\"]/g, '')\r\n };\r\n }\r\n\r\n uploadFileToExtract(file: File, inputId: number, correlationId: string) {\r\n return this.uploadFiles(\"/DataImport/PostImportFile\", [file], { inputId: inputId, correlationId: correlationId });\r\n }\r\n\r\n uploadFilesWithParams(files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + \"/DataImport/PostFiles\";\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n formData.append('data', JSON.stringify((customParams as any).dataModel));\r\n let params = new HttpParams();\r\n\r\n return this.httpClient.post(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'body',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n }\r\n\r\n uploadFiles(url: string, files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + url;\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n if (customParams) {\r\n for (let p in customParams) {\r\n if (customParams.hasOwnProperty(p)) {\r\n formData.append(p, customParams[p]);\r\n }\r\n }\r\n }\r\n\r\n let params = new HttpParams();\r\n\r\n\r\n return this.httpClient.post(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'body',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n }\r\n\r\n uploadFilesWithEvents(url: string, files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + url;\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n if (customParams) {\r\n for (let p in customParams) {\r\n if (customParams.hasOwnProperty(p)) {\r\n formData.append(p, customParams[p]);\r\n }\r\n }\r\n }\r\n\r\n let params = new HttpParams();\r\n return this.httpClient.post<any>(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'events',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\n\r\nimport { DataService } from './services/data-service';\r\n\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n providers: [DataService]\r\n})\r\nexport class CoreDataModule {}\r\n","import { ActionDescriptor, ColumnDescriptor, EntityViewModel, EntityViewModelWithFields, EntityWithSpecifics, ExportModel, ExtendedProperty, FilterDescriptor, FilterViewModel, PagedList, SaveResult, SaveResults, TrackRecordProperty } from '@dflat-core/web/core-model';\r\n\r\nimport { DataService } from './data-service';\r\nimport { HttpResponse } from '@angular/common/http';\r\nimport { Directive } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Directive()\r\nexport abstract class EntityDataService<TData extends EntityViewModel, TFilter extends FilterViewModel> \r\n{\r\n abstract getEntityKey(): string;\r\n\r\n constructor(protected dataService : DataService) {}\r\n deleteEntities (sources:TData[]) : Observable<SaveResults<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/DeleteEntities`;\r\n const requestParams = this.dataService.getFormattedParams(sources);\r\n return this.dataService.httpClient.post<SaveResults<TData>>(_url, requestParams);\r\n }\r\n\r\n deleteEntity (source:TData) : Observable<SaveResult> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/DeleteEntity`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<SaveResult>(_url, requestParams);\r\n }\r\n\r\n exportAll (filter:TFilter) {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ExportAll`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' }).pipe(map((r: HttpResponse<Blob>) => this.dataService.getFileInfo(r)));\r\n }\r\n\r\n exportResults (model:ExportModel<TFilter>) {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ExportResults`;\r\n const requestParams = this.dataService.getFormattedParams(model);\r\n return this.dataService.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' }).pipe(map((r: HttpResponse<Blob>) => this.dataService.getFileInfo(r)));\r\n }\r\n\r\n getAlternateEntityViewModel (id:number) : Observable<EntityViewModelWithFields<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetAlternateEntityViewModel`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<EntityViewModelWithFields<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getCacheManager () : Observable<TData[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetCacheManager`;\r\n return this.dataService.httpClient.get<TData[]>(_url, {});\r\n }\r\n\r\n getColumns () : Observable<ColumnDescriptor[]> {\r\n return this.dataService.getCached<ColumnDescriptor[]>(this.getEntityKey(), 'GetColumns');\r\n }\r\n\r\n getDetails (id:number) : Observable<TData> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetDetails`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<TData>(_url, { params: requestParams });\r\n }\r\n\r\n getEmptyFilter () : Observable<TFilter> {\r\n return this.dataService.getCached<TFilter>(this.getEntityKey(), 'GetEmptyFilter');\r\n }\r\n\r\n getEntityViewModel (id:number) : Observable<EntityViewModelWithFields<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetEntityViewModel`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<EntityViewModelWithFields<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getExtendedActions () : Observable<ActionDescriptor[]> {\r\n return this.dataService.getCached<ActionDescriptor[]>(this.getEntityKey(), 'GetExtendedActions');\r\n }\r\n\r\n getExtendedProperties (entityIds:number[]) : Observable<ExtendedProperty[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetExtendedProperties`;\r\n const requestParams = this.dataService.getUrlQueryParams({ entityIds:entityIds });\r\n return this.dataService.httpClient.get<ExtendedProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n getFilterDescriptors () : Observable<FilterDescriptor[]> {\r\n return this.dataService.getCached<FilterDescriptor[]>(this.getEntityKey(), 'GetFilterDescriptors');\r\n }\r\n\r\n getSortColumn (col:string) : Observable<string> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetSortColumn`;\r\n const requestParams = this.dataService.getUrlQueryParams({ col:col });\r\n return this.dataService.httpClient.get<string>(_url, { params: requestParams });\r\n }\r\n\r\n getTrackRecordProperties (entityIds:number[]) : Observable<TrackRecordProperty[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetTrackRecordProperties`;\r\n const requestParams = this.dataService.getUrlQueryParams({ entityIds:entityIds });\r\n return this.dataService.httpClient.get<TrackRecordProperty[]>(_url, { params: requestParams });\r\n }\r\n \r\n saveEntities (sources:TData[]) : Observable<SaveResults<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntities`;\r\n const requestParams = this.dataService.getFormattedParams(sources);\r\n return this.dataService.httpClient.post<SaveResults<TData>>(_url, requestParams);\r\n }\r\n\r\n saveEntity (source:TData) : Observable<SaveResult> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntity`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<SaveResult>(_url, requestParams);\r\n }\r\n\r\n saveEntityWithSpecifics (source:EntityWithSpecifics<TData>) : Observable<any> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntityWithSpecifics`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<any>(_url, requestParams);\r\n }\r\n\r\n search (filter:TFilter) : Observable<PagedList<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/Search`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.get<PagedList<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n toggleFavorite (filter:TFilter) : Observable<any> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ToggleFavorite`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.post<any>(_url, requestParams);\r\n }\r\n\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"dflat-core-web-core-data.mjs","names":["i1.DataService"],"sources":["../../core-data/src/lib/services/data-service.ts","../../core-data/src/lib/core-data.module.ts","../../core-data/src/lib/services/entity-data-service.ts"],"sourcesContent":["import { EnvironmentBase, Utilities } from '@dflat-core/web/core';\r\nimport { ActionDescriptor, ColumnDescriptor, EntityViewModelWithFields, EntityWithSpecifics, ExtendedProperty, FilterDescriptor, PagedList, SaveResult, SaveResults } from '@dflat-core/web/core-model';\r\nimport { HeadersService, InitCacheService } from '@dflat-core/web/core-services';\r\nimport { HttpClient, HttpParams, HttpResponse } from '@angular/common/http';\r\nimport { inject, Injectable, Type } from '@angular/core';\r\nimport { defer, Observable, of } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n\r\n@Injectable()\r\nexport class DataService {\r\n\r\n baseUrl = this.env.apiUrl;\r\n httpClient: HttpClient;\r\n data: any[];\r\n private initCache = inject(InitCacheService);\r\n constructor(\r\n private env: EnvironmentBase,\r\n httpClient: HttpClient,\r\n private headerService: HeadersService) {\r\n this.httpClient = httpClient\r\n }\r\n\r\n getFormattedParams(params: any): any {\r\n // Point d'entrée public : conserve le comportement historique\r\n // (stringify uniquement quand params racine est un tableau).\r\n if (Array.isArray(params)) {\r\n if (params.length > 0 && typeof (params[0]) === 'number') {\r\n return JSON.stringify(params);\r\n }\r\n const result = params.map(entity => this.formatValueRecursive(entity));\r\n return JSON.stringify(result);\r\n }\r\n\r\n return this.formatValueRecursive(params);\r\n }\r\n\r\n // Transforme récursivement un objet/tableau/valeur, sans jamais stringifier.\r\n // Utilisée pour descendre dans les propriétés imbriquées (ex: un tableau\r\n // d'objets contenu dans une propriété d'un objet racine), qui étaient\r\n // auparavant copiées telles quelles et donc jamais nettoyées de leurs Date.\r\n private formatValueRecursive(val: any): any {\r\n if (val === undefined || val === null) {\r\n return val;\r\n }\r\n\r\n if (val instanceof Date) {\r\n return `${Utilities.Format2Digits(val.getFullYear())}-${Utilities.Format2Digits(val.getMonth() + 1)}-${Utilities.Format2Digits(val.getDate())}T00:00:00.000Z`;\r\n }\r\n\r\n if (Array.isArray(val)) {\r\n // Tableau de nombres : on le laisse tel quel (comme au niveau racine)\r\n if (val.length > 0 && typeof (val[0]) === 'number') {\r\n return val;\r\n }\r\n return val.map(item => this.formatValueRecursive(item));\r\n }\r\n\r\n if (typeof val === 'object') {\r\n const result: any = {};\r\n for (let key in val) {\r\n if (val.hasOwnProperty(key)) {\r\n const propVal = val[key];\r\n if (propVal !== undefined && propVal !== null) {\r\n result[key] = this.formatValueRecursive(propVal);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n // primitive (string, number, boolean...) : inchangé\r\n return val;\r\n }\r\n\r\n\r\n getUrlQueryParams(filter: any): HttpParams {\r\n let requestParams = new HttpParams();\r\n let formattedFilter = this.getFormattedParams(filter);\r\n for (let key in formattedFilter) {\r\n if (formattedFilter.hasOwnProperty(key)) {\r\n let vals = formattedFilter[key];\r\n if (Array.isArray(vals) && vals.length > 0)\r\n {\r\n for (let key2 in vals) {\r\n requestParams = requestParams.append(key, vals[key2]);\r\n }\r\n }\r\n else if (typeof vals === 'object') {\r\n requestParams = requestParams.set(key, JSON.stringify(vals));\r\n }\r\n else\r\n {\r\n requestParams = requestParams.set(key, vals);\r\n }\r\n }\r\n }\r\n return requestParams;\r\n }\r\n\r\n /*getUrlQueryArrayParams(filter: any): HttpParams {\r\n let requestParams = new HttpParams();\r\n let formattedFilter = this.getFormattedParams(filter);\r\n for (let key in formattedFilter) {\r\n if (formattedFilter.hasOwnProperty(key)) {\r\n let vals = formattedFilter[key];\r\n for (let key2 in vals) {\r\n requestParams = requestParams.append(key, vals[key2]);\r\n }\r\n }\r\n }\r\n return requestParams;\r\n }*/\r\n\r\n /**\r\n * Appel GET sans paramètre gardé dans le cache d'initialisation (InitCacheService) : données\r\n * chargées avant la recherche, identiques d'une ouverture de l'écran à l'autre. Le cache est\r\n * vidé au redémarrage de l'API (horodatage du jeton d'accès) et au changement d'utilisateur.\r\n */\r\n getCached<T>(entityKey: string, action: string): Observable<T> {\r\n return this.initCache.get<T>(`${entityKey}/${action}`,\r\n () => this.httpClient.get<T>(this.baseUrl + `/${entityKey}/${action}`, {}));\r\n }\r\n\r\n /**\r\n * Valeur d'initialisation d'une entité calculée par le front (ex. définition de ses onglets,\r\n * voir EntitySections), gardée dans le même cache que les appels de getCached et sous la même\r\n * portée (clé de l'entité) : `factory` n'est appelée qu'une fois, jusqu'à ce que le cache soit\r\n * vidé (clearCached, redémarrage de l'API, changement d'utilisateur).\r\n */\r\n getCachedValue<T>(entityKey: string, name: string, factory: () => T): Observable<T> {\r\n return this.initCache.get<T>(`${entityKey}/${name}`, () => defer(() => of(factory())));\r\n }\r\n\r\n /** Vide le cache d'initialisation d'une entité, ou tout le cache. */\r\n clearCached(entityKey?: string): void {\r\n this.initCache.clear(Utilities.IsNil(entityKey) ? null : `${entityKey}/`);\r\n }\r\n\r\n getViewFilterDescriptors(entityKey: string): Observable<FilterDescriptor[]> {\r\n return this.getCached<FilterDescriptor[]>(entityKey, 'GetFilterDescriptors');\r\n }\r\n\r\n getViewColumns(entityKey: string): Observable<ColumnDescriptor[]> {\r\n return this.getCached<ColumnDescriptor[]>(entityKey, 'GetGridColumns');\r\n }\r\n\r\n /**\r\n * Colonnes de grille des propriétés données, dans leur ordre, décrites par le serveur comme celles du\r\n * profil de présentation (menu « Colonnes » des grilles).\r\n */\r\n /** Images des éléments donnés (vues Carte) : adresse de l'image par défaut de chaque élément qui en a une. */\r\n getEntityImages(entityKey: string, ids: number[]): Observable<{ EntityId?: number, Url?: string }[]> {\r\n return this.httpClient.post<{ EntityId?: number, Url?: string }[]>(this.baseUrl + `/${entityKey}/GetEntityImages`, ids ?? []);\r\n }\r\n\r\n getGridColumnsFor(entityKey: string, columnKeys: string[]): Observable<ColumnDescriptor[]> {\r\n return this.httpClient.post<ColumnDescriptor[]>(this.baseUrl + `/${entityKey}/GetGridColumnsFor`, columnKeys ?? []);\r\n }\r\n\r\n search<TData>(entityKey: string, filter: any): Observable<PagedList<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/Search`;\r\n let requestParams = this.getUrlQueryParams(filter);\r\n return this.httpClient.get<PagedList<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getDetails<TData>(entityKey: string, id: number): Observable<TData> {\r\n let _url = this.baseUrl + `/${entityKey}/GetDetails?`;\r\n if (id === undefined || id === null)\r\n throw new Error(\"The parameter 'id' must be defined and cannot be null.\");\r\n else\r\n _url += \"id=\" + encodeURI(\"\" + id);\r\n\r\n _url = _url.replace(/[?&]$/, \"\");\r\n\r\n return this.httpClient.get<TData>(_url);\r\n }\r\n\r\n getEmptyFilter<T>(entityKey: string): Observable<T> {\r\n return this.getCached<T>(entityKey, 'GetEmptyFilter');\r\n }\r\n\r\n /**\r\n * fonction \"async\" liant le front(Angular) et le back(C#)\r\n * - Principalement appelée par \"src.app.core.layout.BaseEditorComponent.loadEntityViewModel()\" lorsque l'on cherche à afficher un Objet de type \"EntityViewModel\"\r\n * - C'est elle qui lance l'appel à la fonction \"back\" BaseFilterController.GetEntityViewModel<TData>(id).\r\n * - Puis elle crée un observable avec la réponse qu'elle obtient du \"back\"\r\n *\r\n * @async\r\n * @function\r\n * @name getEntityViewModel<TData>\r\n * @param {string} entityKey\r\n * @param {number} id\r\n * @returns {(Observable)EntityViewModelWithFields<TData>}\r\n * @memberof DataService\r\n * @summary Demande les données d'une entité au back(C#) à travers \"getEntityViewModel\".\r\n * @see {@link src.app.core.layout.BaseEditorComponent.loadEntityViewModel()} for more information\r\n * @throws new Error(\"The parameter 'id' must be defined and cannot be null.\") if (id === undefined ou id === null)\r\n */\r\n getEntityViewModel<TData>(entityKey: string, id: number): Observable<EntityViewModelWithFields<TData>> {\r\n let _url = this. baseUrl + `/${entityKey}/GetEntityViewModel?`;\r\n if (id === undefined || id === null)\r\n throw new Error(\"The parameter 'id' must be defined and cannot be null.\");\r\n else if (id === 0)\r\n // Formulaire vide (id 0) : donnée d'initialisation, gardée en cache.\r\n return this.getCached<EntityViewModelWithFields<TData>>(entityKey, 'GetEntityViewModel?id=0');\r\n else\r\n _url += \"id=\" + encodeURI(\"\" + id);\r\n\r\n _url = _url.replace(/[?&]$/, \"\");\r\n\r\n return this.httpClient.get(_url).pipe(\r\n map((resp: Response) => <EntityViewModelWithFields<TData>>resp));\r\n }\r\n\r\n getExtendedProperties(entityKey: string, entityIds: number[]): Observable<ExtendedProperty[]> {\r\n let _url = this.baseUrl + `/${entityKey}/GetExtendedProperties`;\r\n\r\n let requestParams = this.getUrlQueryParams({ entityIds: entityIds });\r\n return this.httpClient.get<ExtendedProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n getExtendedActions (entityKey: string) : Observable<ActionDescriptor[]> {\r\n return this.getCached<ActionDescriptor[]>(entityKey, 'GetExtendedActions');\r\n }\r\n \r\n saveEntity<TData>(entityKey: string, entity: TData): Observable<SaveResult> {\r\n let _url = this.baseUrl + `/${entityKey}/SaveEntity`;\r\n return this.httpClient.post<SaveResult>(_url, this.getFormattedParams(entity));\r\n }\r\n\r\n deleteEntity<TData>(entityKey: string, entity: TData): Observable<SaveResult> {\r\n let _url = this.baseUrl + `/${entityKey}/DeleteEntity`;\r\n return this.httpClient.post<SaveResult>(_url, this.getFormattedParams(entity));\r\n }\r\n\r\n deleteEntities<TData>(entityKey: string, entities: TData[]): Observable<SaveResults<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/DeleteEntities`;\r\n return this.httpClient.post<SaveResults<TData>>(_url, this.getFormattedParams(entities));\r\n }\r\n\r\n saveEntities<TData>(entityKey: string, entities: TData[]): Observable<SaveResults<TData>> {\r\n let _url = this.baseUrl + `/${entityKey}/saveEntities`;\r\n let toSave = [];\r\n entities.forEach(entity => {\r\n toSave.push(this.getFormattedParams(entity));\r\n });\r\n return this.httpClient.post<SaveResults<TData>>(_url, JSON.stringify(toSave));\r\n }\r\n\r\n\r\n\r\n SaveEntityWithSpecifics<TData>(entityKey: string, DataToSave: EntityWithSpecifics<TData>): Observable<{ success: boolean, rowVersion?: Date }> {\r\n let _url = this.baseUrl + `/${entityKey}/SaveEntityWithSpecifics`;\r\n return this.httpClient.post<{ success: boolean, rowVersion?: Date }>(_url, this.getFormattedParams(DataToSave));\r\n }\r\n\r\n exportAll<TData>(entityKey: string, filter: any) {\r\n let _url = this.baseUrl + `/${entityKey}/ExportAll`;\r\n let requestParams = this.getUrlQueryParams(filter);\r\n\r\n return this.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' })\r\n .pipe(map((r: HttpResponse<Blob>) => this.getFileInfo(r)))\r\n }\r\n\r\n exportResults<TData>(entityKey: string, exportModel: any) {\r\n let _url = this.baseUrl + `/${entityKey}/ExportResults`;\r\n const _body = JSON.stringify(exportModel);\r\n\r\n return this.httpClient.post(_url, _body, { observe: 'response', responseType: 'blob' })\r\n .pipe(map((r: HttpResponse<Blob>) => this.getFileInfo(r)));\r\n }\r\n\r\n public getFileInfo(resp: HttpResponse<Blob>): { fileBlob: Blob, fileName: string } {\r\n var type = resp.headers.get(\"Content-Type\");\r\n let b = new Blob([resp.body], { type: type });\r\n return {\r\n fileBlob: b,\r\n fileName: (resp.headers.get(\"Content-Disposition\") || \"\").split(\";\")[1].trim().split(\"=\")[1].replace(/['\"]/g, '')\r\n };\r\n }\r\n\r\n uploadFileToExtract(file: File, inputId: number, correlationId: string) {\r\n return this.uploadFiles(\"/DataImport/PostImportFile\", [file], { inputId: inputId, correlationId: correlationId });\r\n }\r\n\r\n uploadFilesWithParams(files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + \"/DataImport/PostFiles\";\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n formData.append('data', JSON.stringify((customParams as any).dataModel));\r\n let params = new HttpParams();\r\n\r\n return this.httpClient.post(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'body',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n }\r\n\r\n uploadFiles(url: string, files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + url;\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n if (customParams) {\r\n for (let p in customParams) {\r\n if (customParams.hasOwnProperty(p)) {\r\n formData.append(p, customParams[p]);\r\n }\r\n }\r\n }\r\n\r\n let params = new HttpParams();\r\n\r\n\r\n return this.httpClient.post(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'body',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n }\r\n\r\n uploadFilesWithEvents(url: string, files: File[], customParams?: {}, forceMultipleFiles: boolean = false): Observable<any> {\r\n\r\n const _url = this.baseUrl + url;\r\n\r\n let formData = new FormData();\r\n if (files.length == 1 && !forceMultipleFiles) {\r\n formData.append('file', files[0]);\r\n }\r\n else {\r\n for (var i = 0; i < files.length; i++) {\r\n formData.append('files', files[i]);\r\n }\r\n }\r\n\r\n if (customParams) {\r\n for (let p in customParams) {\r\n if (customParams.hasOwnProperty(p)) {\r\n formData.append(p, customParams[p]);\r\n }\r\n }\r\n }\r\n\r\n let params = new HttpParams();\r\n return this.httpClient.post<any>(_url, formData, {\r\n params,\r\n reportProgress: true,\r\n observe: 'events',\r\n headers: this.headerService.authFileUploadHeaders()\r\n });\r\n\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\n\r\nimport { DataService } from './services/data-service';\r\n\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n providers: [DataService]\r\n})\r\nexport class CoreDataModule {}\r\n","import { ActionDescriptor, ColumnDescriptor, EntityViewModel, EntityViewModelWithFields, EntityWithSpecifics, ExportModel, ExtendedProperty, FilterDescriptor, FilterViewModel, PagedList, SaveResult, SaveResults } from '@dflat-core/web/core-model';\r\n\r\nimport { DataService } from './data-service';\r\nimport { HttpResponse } from '@angular/common/http';\r\nimport { Directive } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Directive()\r\nexport abstract class EntityDataService<TData extends EntityViewModel, TFilter extends FilterViewModel> \r\n{\r\n abstract getEntityKey(): string;\r\n\r\n constructor(protected dataService : DataService) {}\r\n deleteEntities (sources:TData[]) : Observable<SaveResults<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/DeleteEntities`;\r\n const requestParams = this.dataService.getFormattedParams(sources);\r\n return this.dataService.httpClient.post<SaveResults<TData>>(_url, requestParams);\r\n }\r\n\r\n deleteEntity (source:TData) : Observable<SaveResult> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/DeleteEntity`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<SaveResult>(_url, requestParams);\r\n }\r\n\r\n exportAll (filter:TFilter) {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ExportAll`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' }).pipe(map((r: HttpResponse<Blob>) => this.dataService.getFileInfo(r)));\r\n }\r\n\r\n exportResults (model:ExportModel<TFilter>) {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ExportResults`;\r\n const requestParams = this.dataService.getFormattedParams(model);\r\n return this.dataService.httpClient.get(_url, { observe: 'response', params: requestParams, withCredentials: true, responseType: 'blob' }).pipe(map((r: HttpResponse<Blob>) => this.dataService.getFileInfo(r)));\r\n }\r\n\r\n getAlternateEntityViewModel (id:number) : Observable<EntityViewModelWithFields<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetAlternateEntityViewModel`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<EntityViewModelWithFields<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getCacheManager () : Observable<TData[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetCacheManager`;\r\n return this.dataService.httpClient.get<TData[]>(_url, {});\r\n }\r\n\r\n getColumns () : Observable<ColumnDescriptor[]> {\r\n return this.dataService.getCached<ColumnDescriptor[]>(this.getEntityKey(), 'GetColumns');\r\n }\r\n\r\n getDetails (id:number) : Observable<TData> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetDetails`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<TData>(_url, { params: requestParams });\r\n }\r\n\r\n getEmptyFilter () : Observable<TFilter> {\r\n return this.dataService.getCached<TFilter>(this.getEntityKey(), 'GetEmptyFilter');\r\n }\r\n\r\n getEntityViewModel (id:number) : Observable<EntityViewModelWithFields<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetEntityViewModel`;\r\n const requestParams = this.dataService.getUrlQueryParams({ id:id });\r\n return this.dataService.httpClient.get<EntityViewModelWithFields<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n getExtendedActions () : Observable<ActionDescriptor[]> {\r\n return this.dataService.getCached<ActionDescriptor[]>(this.getEntityKey(), 'GetExtendedActions');\r\n }\r\n\r\n getExtendedProperties (entityIds:number[]) : Observable<ExtendedProperty[]> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetExtendedProperties`;\r\n const requestParams = this.dataService.getUrlQueryParams({ entityIds:entityIds });\r\n return this.dataService.httpClient.get<ExtendedProperty[]>(_url, { params: requestParams });\r\n }\r\n\r\n getFilterDescriptors () : Observable<FilterDescriptor[]> {\r\n return this.dataService.getCached<FilterDescriptor[]>(this.getEntityKey(), 'GetFilterDescriptors');\r\n }\r\n\r\n getSortColumn (col:string) : Observable<string> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/GetSortColumn`;\r\n const requestParams = this.dataService.getUrlQueryParams({ col:col });\r\n return this.dataService.httpClient.get<string>(_url, { params: requestParams });\r\n }\r\n\r\n saveEntities (sources:TData[]) : Observable<SaveResults<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntities`;\r\n const requestParams = this.dataService.getFormattedParams(sources);\r\n return this.dataService.httpClient.post<SaveResults<TData>>(_url, requestParams);\r\n }\r\n\r\n saveEntity (source:TData) : Observable<SaveResult> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntity`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<SaveResult>(_url, requestParams);\r\n }\r\n\r\n saveEntityWithSpecifics (source:EntityWithSpecifics<TData>) : Observable<any> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/SaveEntityWithSpecifics`;\r\n const requestParams = this.dataService.getFormattedParams(source);\r\n return this.dataService.httpClient.post<any>(_url, requestParams);\r\n }\r\n\r\n search (filter:TFilter) : Observable<PagedList<TData>> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/Search`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.get<PagedList<TData>>(_url, { params: requestParams });\r\n }\r\n\r\n toggleFavorite (filter:TFilter) : Observable<any> {\r\n const _url = this.dataService.baseUrl + `/${this.getEntityKey()}/ToggleFavorite`;\r\n const requestParams = this.dataService.getFormattedParams(filter);\r\n return this.dataService.httpClient.post<any>(_url, requestParams);\r\n }\r\n\r\n}\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dflat-core-web-core-model.mjs","names":[],"sources":["../../core-model/src/lib/core-model.module.ts","../../core-model/src/lib/model/interface.generated.ts","../../core-model/src/lib/interface.ts","../../core-model/src/lib/model/model.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\n\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n declarations: [],\r\n exports: []\r\n})\r\nexport class CoreModelModule {}\r\n","export interface ViewModel {\r\n}\r\n\r\nexport interface ExtendedProperty {\r\n EntityId? : number;\r\n FieldType? : number;\r\n PropertyId? : number;\r\n PropertyName? : string;\r\n Value? : string;\r\n}\r\n\r\nexport enum ValidatorTypes {\r\n None = 0,\r\n MaxLength = 1,\r\n MinLength = 2,\r\n Max = 4,\r\n Min = 8,\r\n Email = 16,\r\n Required = 32,\r\n Unicity = 64,\r\n Nullable = 128,\r\n}\r\n\r\nexport interface PagingViewModel {\r\n EnablePaging? : boolean;\r\n Offset? : number;\r\n SortColumn? : string;\r\n SortDirection? : string;\r\n SpecificSortClause? : string;\r\n Take? : number;\r\n}\r\n\r\nexport interface EntityViewModel extends ViewModel {\r\n ExtendedProperties? : ExtendedProperty[];\r\n Id? : number;\r\n IsEditable? : boolean;\r\n IsSelected? : boolean;\r\n IsStorable? : boolean;\r\n Name? : string;\r\n RowVersion? : Date;\r\n}\r\n\r\nexport interface TextWithStyle {\r\n GreenText? : string;\r\n RedText? : string;\r\n YellowText? : string;\r\n}\r\n\r\nexport interface INode {\r\n Childrens? : INode[];\r\n Code? : string;\r\n Description? : string;\r\n Id? : number;\r\n ParentId? : number;\r\n UniqueName? : string;\r\n}\r\n\r\nexport interface FilterViewModel extends PagingViewModel {\r\n AdditionalFilter? : string;\r\n AggregateClause? : string;\r\n BrandId? : number;\r\n CustomFieldIds? : string;\r\n Id? : number;\r\n IsCsvExport? : boolean;\r\n Keywords? : string;\r\n}\r\n\r\nexport enum FilterType {\r\n String = 0,\r\n Integer = 1,\r\n Date = 2,\r\n ComboBox = 3,\r\n CheckBox = 4,\r\n Email = 5,\r\n WeekNumber = 6,\r\n Text = 7,\r\n Custom = 8,\r\n RadioButton = 9,\r\n TextZoneWithButton = 10,\r\n HorizComboBox = 11,\r\n TextWithButton = 12,\r\n DropFileZone = 13,\r\n DateTime = 14,\r\n Password = 15,\r\n TreeSelector = 16,\r\n Decimal = 17,\r\n}\r\n\r\nexport interface FieldValidators {\r\n MaxLength? : number;\r\n MaxValue? : number;\r\n MinValue? : number;\r\n ValidatorType? : ValidatorTypes;\r\n}\r\n\r\nexport enum ConditionalResults {\r\n Hide = 0,\r\n ReadOnly = 1,\r\n}\r\n\r\nexport enum ColumnSpans {\r\n Single = 0,\r\n Full = 1,\r\n}\r\n\r\nexport interface FieldDescriptor {\r\n BoolConditioningFieldValue? : boolean;\r\n ButtonLabel? : string;\r\n CascadeDependency? : boolean;\r\n CascadeDependencyProperty? : string;\r\n ColumnIndex? : number;\r\n ColumnSpan? : ColumnSpans;\r\n ConditionalResult? : ConditionalResults;\r\n ConditioningField? : string;\r\n ConditioningFieldValue? : number[];\r\n CurrentFilters? : any;\r\n Data? : any;\r\n DataFilter? : FilterViewModel;\r\n Description? : string;\r\n DisplayMember? : string;\r\n ExportPropertyName? : string;\r\n FieldValidators? : FieldValidators;\r\n FilterDistinct? : boolean;\r\n FilterType? : FilterType;\r\n HideSelected? : boolean;\r\n Highlight? : boolean;\r\n InputType? : string;\r\n IsClearable? : boolean;\r\n IsConditional? : boolean;\r\n IsConditioning? : boolean;\r\n IsExtendedProperty? : boolean;\r\n IsHidden? : boolean;\r\n IsStatic? : boolean;\r\n KeepPlace? : boolean;\r\n Label? : string;\r\n ModalEntityKey? : string;\r\n ModalOnly? : boolean;\r\n ModalPropertyName? : string;\r\n ModalPropertyValue? : string;\r\n ModalTitle? : string;\r\n ModalTriggerIdProperty? : string;\r\n ModalTriggerIdPropertyValue? : string;\r\n MultipleSelection? : boolean;\r\n NotDefaultRequired? : boolean;\r\n OriginalData? : any;\r\n PropertyLength? : number;\r\n PropertyName? : string;\r\n ReadOnly? : boolean;\r\n Required? : boolean;\r\n TextWithStyle? : TextWithStyle;\r\n ToolTip? : string;\r\n ValueMember? : string;\r\n}\r\n\r\nexport interface EntityFilterViewModel<T> extends FilterViewModel {\r\n}\r\n\r\nexport enum ApiErrorTypes {\r\n Unknown = 0,\r\n DatabaseError = 1,\r\n SystemError = 2,\r\n UserError = 3,\r\n}\r\n\r\nexport interface TreeItem<T> {\r\n checked? : boolean;\r\n children? : TreeItem<T>[];\r\n childrenCount? : number;\r\n text? : string;\r\n value? : number;\r\n}\r\n\r\nexport interface Section {\r\n FieldViewModels? : FieldDescriptor[];\r\n IsCustomFieldSection? : boolean;\r\n IsFileSection? : boolean;\r\n IsTrackRecordSection? : boolean;\r\n Name? : string;\r\n}\r\n\r\nexport interface Display {\r\n baseUrl? : string;\r\n completingCaracter? : string;\r\n currency? : string;\r\n enumMap? : string[];\r\n format? : string;\r\n handleError? : boolean;\r\n imagePath? : string;\r\n imgBase? : string;\r\n multiplier? : number;\r\n nullCaseText? : string;\r\n sourceProperty? : string;\r\n type? : string;\r\n width? : number;\r\n}\r\n\r\nexport interface BasicNode {\r\n Childrens? : INode[];\r\n Code? : string;\r\n Description? : string;\r\n Id? : number;\r\n ParentId? : number;\r\n UniqueName? : string;\r\n}\r\n\r\nexport interface ApiError {\r\n ApiErrorType? : ApiErrorTypes;\r\n ErrorCode? : number;\r\n Message? : string;\r\n StackTrace? : string;\r\n}\r\n\r\nexport enum ActionDisplay {\r\n Button = 0,\r\n TextAndButton = 1,\r\n}\r\n\r\n\r\nexport interface TabToSave<TResult> {\r\n Data? : TResult[];\r\n TitleOfTab? : string;\r\n}\r\n\r\nexport interface SaveResult {\r\n DisplayMessage? : boolean;\r\n Error? : ApiError;\r\n ErrorMessage? : string;\r\n Id? : number;\r\n RowVersion? : Date;\r\n Success? : boolean;\r\n Warnings? : string[];\r\n}\r\n\r\nexport interface ColumnDescriptor {\r\n Display? : Display;\r\n Expression? : string;\r\n FieldName? : string;\r\n IsComputed? : boolean;\r\n IsFilterEnabled? : boolean;\r\n IsNumericExpression? : boolean;\r\n Name? : string;\r\n Property? : string;\r\n TableAlias? : string;\r\n ToolTipProperty? : string;\r\n}\r\n\r\nexport interface AggregationValue {\r\n Key? : string;\r\n Value? : any;\r\n}\r\n\r\nexport interface ActionDescriptor {\r\n ActionDisplay? : ActionDisplay;\r\n Description? : string;\r\n FormDescriptor? : Section[];\r\n Icon? : string;\r\n IconUrl? : string;\r\n Label? : string;\r\n Name? : string;\r\n RequestType? : string;\r\n}\r\n\r\nexport interface TrackRecordProperty {\r\n CreatedBy? : string;\r\n CreationDate? : Date;\r\n CreationDateString? : string;\r\n Id? : number;\r\n ModificationDate? : Date;\r\n ModificationDateString? : string;\r\n ModifiedBy? : string;\r\n}\r\n\r\nexport interface SaveResults<TResult> extends SaveResult {\r\n SaveErrorEntities? : TResult[];\r\n}\r\n\r\nexport interface RunActionContext {\r\n Action? : ActionDescriptor;\r\n CorrelationId? : string;\r\n EntityIds? : number[];\r\n EntityKey? : string;\r\n File? : any;\r\n FileId? : number;\r\n FormValue? : any;\r\n RequestId? : number;\r\n}\r\n\r\nexport interface PagedList<T> {\r\n Aggregates? : AggregationValue[];\r\n Skip? : number;\r\n Take? : number;\r\n TotalRowCount? : number;\r\n Values? : T[];\r\n}\r\n\r\nexport enum ImageFormats {\r\n Undefined = 0,\r\n JPG = 1,\r\n PNG = 2,\r\n GIF = 3,\r\n TIFF = 4,\r\n BMP = 5,\r\n SVG = 6,\r\n}\r\n\r\nexport interface FilterDescriptor extends FieldDescriptor {\r\n DisplayImage? : boolean;\r\n}\r\n\r\nexport interface ExportModel<T> {\r\n Columns? : ColumnDescriptor[];\r\n Filter? : T;\r\n}\r\n\r\nexport interface EntityWithSpecifics<TResult> {\r\n Entity? : TResult;\r\n Tabs? : TabToSave<TResult>[];\r\n}\r\n\r\nexport interface EntityViewModelWithFields<T> {\r\n FieldSections? : Section[];\r\n HiddenSections? : string[];\r\n SpecificSection? : any;\r\n ViewModel? : T;\r\n}\r\n\r\nexport enum TextSearch {\r\n Contains = 0,\r\n StartsWith = 1,\r\n EndsWith = 2,\r\n}\r\n\r\nexport enum ExportType {\r\n CSV = 0,\r\n EXCEL = 1,\r\n}\r\n\r\nexport enum AggregateFunction {\r\n Count = 0,\r\n Sum = 1,\r\n Min = 2,\r\n Max = 3,\r\n Avg = 4,\r\n}\r\n\r\nexport enum ActionResultStatus {\r\n OK = 0,\r\n KO = 1,\r\n}\r\n\r\n","import { Utilities } from '@dflat-core/web/core';\r\nimport { ComponentRef, TemplateRef, Type } from '@angular/core';\r\n\r\nimport { ActionDescriptor, ColumnDescriptor, EntityViewModel, EntityViewModelWithFields, FieldDescriptor, FieldValidators, FilterDescriptor, FilterViewModel } from './model/interface.generated';\r\n\r\nexport interface IIdentifiable {\r\n Id?: number;\r\n}\r\n\r\nexport class UserUpdatedMessage {\r\n constructor(public userKey: string) { }\r\n}\r\n\r\n/**\r\n * Message du bus : un profil de présentation partagé (par défaut, par rôle ou par fournisseur) a\r\n * été modifié (signal PresentationChanged du hub, envoyé par le serveur après son enregistrement).\r\n * Le cache d'initialisation de l'entité est vidé et les grilles ouvertes rechargent leurs colonnes.\r\n */\r\nexport class PresentationChangedMessage {\r\n /**\r\n * @param entityName Nom de l'entité du profil (ex. Company), ou null : toutes les entités.\r\n * @param stamp Nouvel horodatage du cache client annoncé par le serveur.\r\n */\r\n constructor(public entityName: string | null, public stamp?: number) { }\r\n\r\n /**\r\n * Vrai si le message concerne l'écran de clé entityKey : même nom sans tenir compte de la\r\n * casse ni du suffixe View (un écran porte sur la table ou sur sa vue principale).\r\n */\r\n concerns(entityKey: string): boolean {\r\n if (this.entityName === null || this.entityName === undefined || this.entityName === '') {\r\n return true;\r\n }\r\n const normalize = (name: string) => (name ?? '').toLowerCase().replace(/view$/, '');\r\n return normalize(this.entityName) === normalize(entityKey);\r\n }\r\n}\r\n\r\n/**\r\n * Message du bus : un formulaire enregistré en base a été modifié (signal FormChanged du hub,\r\n * envoyé par le serveur après l'enregistrement d'un formulaire, d'une section ou d'un champ).\r\n * Le cache d'initialisation de l'entité est vidé et les écrans ouverts rechargent leur formulaire.\r\n */\r\nexport class FormChangedMessage {\r\n /**\r\n * @param entityName Nom de l'entité du formulaire (ex. Country), ou null : tous les formulaires.\r\n * @param stamp Nouvel horodatage du cache client annoncé par le serveur.\r\n */\r\n constructor(public entityName: string | null, public stamp?: number) { }\r\n\r\n /**\r\n * Vrai si le message concerne l'écran de clé entityKey : même nom sans tenir compte de la\r\n * casse ni du suffixe View (un écran porte sur la table ou sur sa vue principale).\r\n */\r\n concerns(entityKey: string): boolean {\r\n if (this.entityName === null || this.entityName === undefined || this.entityName === '') {\r\n return true;\r\n }\r\n const normalize = (name: string) => (name ?? '').toLowerCase().replace(/view$/, '');\r\n return normalize(this.entityName) === normalize(entityKey);\r\n }\r\n}\r\n\r\nexport interface IUserCredential extends IIdentifiable {\r\n AccessToken: string; \r\n RefreshToken: string; \r\n Username?: string; \r\n FirstName?: string; \r\n LastName?: string;\r\n Email?: string;\r\n IsAdmin?: boolean;\r\n IsDelivery?: boolean;\r\n IsPartner?: boolean;\r\n PhoneNumber?: string;\r\n IsActive?: boolean;\r\n IsPartnerActive?: boolean;\r\n IsDeliveryActive?: boolean;\r\n\r\n Id?: number;\r\n CompanyId?: number;\r\n Permissions: string[];\r\n ProfileImageUrl: string;\r\n AvatarUrl: string;\r\n\r\n}\r\n/** Fournisseur d'identité externe proposé à l'écran de connexion (Account/GetLoginProviders). */\r\nexport interface IExternalLoginProvider {\r\n /** Google, Microsoft ou Apple. */\r\n Provider: string;\r\n /** Identifiant de l'application chez le fournisseur. */\r\n ClientId: string;\r\n /** Microsoft seulement : locataire du point d'accès (common par défaut). */\r\n TenantId?: string;\r\n}\r\n\r\nexport class User implements IUserCredential {\r\n \r\n public AccessToken: string;\r\n public RefreshToken: string;\r\n public Username?: string;\r\n public FirstName?: string;\r\n public LastName?: string;\r\n public Email?: string;\r\n public PhoneNumber?: string;\r\n public IsAdmin?: boolean;\r\n public IsDelivery?: boolean;\r\n public IsPartner?: boolean;\r\n public Id?: number;\r\n public CompanyId?: number;\r\n public Permissions: string[];\r\n public ProfileImageUrl: string;\r\n public IsActive?: boolean;\r\n public IsPartnerActive?: boolean;\r\n public IsDeliveryActive?: boolean;\r\n public IsConnected: boolean = false;\r\n public AvatarUrl: string;\r\n \r\n public constructor(data: IUserCredential) {\r\n this.Username = data.Username;\r\n this.FirstName = data.FirstName;\r\n this.LastName = data.LastName;\r\n this.Email = data.Email;\r\n this.PhoneNumber = data.PhoneNumber;\r\n this.ProfileImageUrl = data.ProfileImageUrl;\r\n this.IsAdmin = data.IsAdmin;\r\n this.IsPartner = data.IsPartner;\r\n this.IsDelivery = data.IsDelivery;\r\n this.IsAdmin = data.IsAdmin;\r\n this.IsPartner = data.IsPartner;\r\n this.IsDelivery = data.IsDelivery;\r\n this.IsActive = data.IsActive;\r\n this.IsPartnerActive = data.IsPartnerActive;\r\n this.IsDeliveryActive = data.IsDeliveryActive;\r\n this.Id = data.Id;\r\n this.CompanyId = data.CompanyId;\r\n this.AccessToken = data.AccessToken;\r\n this.AvatarUrl = data.AvatarUrl;\r\n }\r\n \r\n\r\n public getName() {\r\n return this.FirstName + ' ' + this.LastName;\r\n }\r\n\r\n \r\n}\r\n\r\n\r\nexport interface INotification {\r\n id:string;\r\n content: string;\r\n class: string;\r\n link: string;\r\n entityType:string;\r\n entityId?:number;\r\n}\r\n \r\nexport class Notification implements INotification {\r\n public id:string;\r\n public content: string;\r\n public class: string;\r\n public link: string;\r\n public entityType:string;\r\n public entityId?:number\r\n public constructor(data: Partial<INotification> = {}) {\r\n this.id = data.id || '';\r\n this.content = data.content || '';\r\n this.class = data.class || '';\r\n this.link = data.link || '';\r\n this.entityType = data.entityType || '';\r\n this.entityId = data.entityId;\r\n }\r\n}\r\n\r\nexport class ChannelData<T> {\r\n Channel: string;\r\n Data: T;\r\n\r\n public constructor(channel: string, data: T) {\r\n this.Channel= channel;\r\n this.Data= data;\r\n }\r\n}\r\n\r\nexport class IMessage {\r\n Channel: string;\r\n Data: any;\r\n}\r\n\r\nexport class Message implements IMessage \r\n{\r\n Channel: string;\r\n Data: any;\r\n\r\n public constructor(channel: string, data: any) {\r\n this.Channel= channel;\r\n this.Data= data;\r\n }\r\n}\r\nexport interface NumberDictionary<T> {\r\n [Key: number]: T;\r\n}\r\nexport interface Dictionary<T> {\r\n [Key: string]: T;\r\n}\r\n\r\n\r\n\r\nexport class NumberDictionnaryWrapper<T> {\r\n\r\n dictionary: NumberDictionary<T> = {};\r\n get(key: number) {\r\n return this.dictionary[key];\r\n }\r\n\r\n containsKey(key: number) {\r\n if (typeof this.dictionary[key] === \"undefined\") {\r\n return false;\r\n }\r\n return true;\r\n }\r\n}\r\n\r\nexport class DictionnaryWrapper<T> {\r\n\r\n dictionary: Dictionary<T> = {};\r\n get(key: string) {\r\n return this.dictionary[key];\r\n }\r\n\r\n containsKey(key: string) {\r\n if (typeof this.dictionary[key] === \"undefined\") {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n getPartKey(key: string) {\r\n\r\n if (typeof this.dictionary[key] === \"undefined\" ) {\r\n let keyFound = Object.keys(this.dictionary).find(obj => key.includes(obj));\r\n if(keyFound) {\r\n key = keyFound\r\n }\r\n }\r\n\r\n return this.dictionary[key];\r\n }\r\n\r\n containsKeyOrPartKey(key: string) {\r\n let routeFound = Object.keys(this.dictionary).find(obj => key.includes(obj));\r\n \r\n if(!Utilities.IsNil(routeFound)){\r\n return true;\r\n }\r\n\r\n if (typeof this.dictionary[key] === \"undefined\" ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n getValues() {\r\n return Object.keys(this.dictionary).map(key => this.dictionary[key]);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n// export interface FilterDescriptor {\r\n// FieldValidators?: FieldValidators;\r\n// Label?: string;\r\n// FilterType?: FilterType;\r\n// PropertyName?: string;\r\n// DisplayMember?: string;\r\n// ValueMember?: string;\r\n// Data?: any;\r\n// Highlight?: boolean;\r\n// ToolTip?: string;\r\n// IsStatic?: boolean;\r\n// Required?: boolean;\r\n// NotDefaultRequired?: boolean;\r\n// ReadOnly?: boolean;\r\n// IsHidden?: boolean;\r\n// KeepPlace?: boolean;\r\n// IsConditioning?: boolean;\r\n// IsConditional?: boolean;\r\n// ConditioningField?: string;\r\n// ConditioningFieldValue?: number;\r\n// BoolConditioningFieldValue?: boolean;\r\n// OriginalData?: any;\r\n// CascadeDependency?: boolean;\r\n// CascadeDependencyProperty?: string;\r\n// FilterDistinct?: boolean;\r\n// MultipleSelection?: boolean;\r\n// HideSelected?: boolean;\r\n// ColumnSpan?: ColumnSpans;\r\n// ColumnIndex?: number;\r\n// InputType?: string;\r\n// CurrentFilters?: {};\r\n\r\n// ModalEntityKey?: string;\r\n// ModalPropertyName?: string;\r\n// ModalPropertyValue?: string;\r\n// ModalTitle?: string;\r\n// }\r\n\r\n\r\n\r\nexport interface SpecificSection {\r\n Name?: string,\r\n IconUrl?:string,\r\n Template?: Type<any> | TemplateRef<any> | ComponentRef<any> | any,\r\n Context?: {},\r\n Data?: any[],\r\n Component?: any,\r\n refreshFunction?: () => void\r\n}\r\nexport interface SectionError {\r\n Name?: string,\r\n FieldValidators?: FieldValidators;\r\n Errors?: string[]\r\n}\r\n\r\nexport interface IFilterDescriptorExtra {\r\n Field?: FilterDescriptor;\r\n DisplayedValue?: string;\r\n}\r\n\r\nexport interface TextZoneButtonEvent {\r\n Field: FieldDescriptor;\r\n Value: string;\r\n }\r\n \r\n export interface FieldEvent {\r\n Field: FieldDescriptor;\r\n Event: Event;\r\n }\r\n \r\n export interface EntityConfig {\r\n actions: ActionDescriptor[];\r\n columns: ColumnDescriptor[];\r\n emptyFilter: FilterViewModel;\r\n filterDescriptors: FilterDescriptor[];\r\n viewModel: EntityViewModelWithFields<EntityViewModel>;\r\n }\r\n\r\n // export interface CachedConfig {\r\n // timestamp: number;\r\n // config : EntityConfig;\r\n // }\r\n\r\n export interface PropertyEditorEvent {\r\n field: FieldDescriptor;\r\n value: any;\r\n type: 'value' | 'pending' | 'file' | 'selector' | 'button'| 'reset';\r\n }","export class HistoryItem {\r\n date: string;\r\n hour: string;\r\n url: string;\r\n icon1: string;\r\n menu1: string;\r\n icon2: string;\r\n menu2: string;\r\n}\r\n\r\nexport enum FilterOperator {\r\n Contains = 0,\r\n StartsWith = 1,\r\n EndsWith = 2,\r\n Equals = 3\r\n}\r\nexport interface FilterClause {\r\n PropertyName : string;\r\n FilterValue : string;\r\n Operator : FilterOperator\r\n}\r\n\r\nexport interface FilterRow {\r\n ClausesByPropertyName : Map<string, FilterClause>;\r\n}\r\n\r\nexport interface FilterQuery {\r\n Rows : FilterRow[];\r\n}\r\n\r\nexport enum CustomFieldTypes {\r\n String = 0,\r\n Integer = 1,\r\n Date = 2,\r\n ComboBox = 3,\r\n Checkbox = 4,\r\n Email = 5,\r\n WeekNumber = 6,\r\n Text = 7,\r\n Custom = 8,\r\n Number = 9,\r\n}"],"mappings":"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"}
1
+ {"version":3,"file":"dflat-core-web-core-model.mjs","names":[],"sources":["../../core-model/src/lib/core-model.module.ts","../../core-model/src/lib/model/interface.generated.ts","../../core-model/src/lib/interface.ts","../../core-model/src/lib/model/model.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\n\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n declarations: [],\r\n exports: []\r\n})\r\nexport class CoreModelModule {}\r\n","export interface ViewModel {\r\n}\r\n\r\nexport interface ExtendedProperty {\r\n EntityId? : number;\r\n FieldType? : number;\r\n PropertyId? : number;\r\n PropertyName? : string;\r\n Value? : string;\r\n}\r\n\r\nexport enum ValidatorTypes {\r\n None = 0,\r\n MaxLength = 1,\r\n MinLength = 2,\r\n Max = 4,\r\n Min = 8,\r\n Email = 16,\r\n Required = 32,\r\n Unicity = 64,\r\n Nullable = 128,\r\n}\r\n\r\nexport interface PagingViewModel {\r\n EnablePaging? : boolean;\r\n Offset? : number;\r\n SortColumn? : string;\r\n SortDirection? : string;\r\n SpecificSortClause? : string;\r\n Take? : number;\r\n}\r\n\r\nexport interface EntityViewModel extends ViewModel {\r\n ExtendedProperties? : ExtendedProperty[];\r\n Id? : number;\r\n IsEditable? : boolean;\r\n IsSelected? : boolean;\r\n IsStorable? : boolean;\r\n Name? : string;\r\n RowVersion? : Date;\r\n}\r\n\r\nexport interface TextWithStyle {\r\n GreenText? : string;\r\n RedText? : string;\r\n YellowText? : string;\r\n}\r\n\r\nexport interface INode {\r\n Childrens? : INode[];\r\n Code? : string;\r\n Description? : string;\r\n Id? : number;\r\n ParentId? : number;\r\n UniqueName? : string;\r\n}\r\n\r\nexport interface FilterViewModel extends PagingViewModel {\r\n AdditionalFilter? : string;\r\n AdditionalQuery? : string;\r\n AggregateClause? : string;\r\n BrandId? : number;\r\n CustomFieldIds? : string;\r\n Id? : number;\r\n IsCsvExport? : boolean;\r\n Keywords? : string;\r\n ViewQuery? : string;\r\n}\r\n\r\nexport enum FilterType {\r\n String = 0,\r\n Integer = 1,\r\n Date = 2,\r\n ComboBox = 3,\r\n CheckBox = 4,\r\n Email = 5,\r\n WeekNumber = 6,\r\n Text = 7,\r\n Custom = 8,\r\n RadioButton = 9,\r\n TextZoneWithButton = 10,\r\n HorizComboBox = 11,\r\n TextWithButton = 12,\r\n DropFileZone = 13,\r\n DateTime = 14,\r\n Password = 15,\r\n TreeSelector = 16,\r\n Decimal = 17,\r\n}\r\n\r\nexport interface FieldValidators {\r\n MaxLength? : number;\r\n MaxValue? : number;\r\n MinValue? : number;\r\n ValidatorType? : ValidatorTypes;\r\n}\r\n\r\nexport enum ConditionalResults {\r\n Hide = 0,\r\n ReadOnly = 1,\r\n}\r\n\r\nexport enum ColumnSpans {\r\n Single = 0,\r\n Full = 1,\r\n}\r\n\r\nexport interface FieldDescriptor {\r\n BoolConditioningFieldValue? : boolean;\r\n ButtonLabel? : string;\r\n CascadeDependency? : boolean;\r\n CascadeDependencyProperty? : string;\r\n ColumnIndex? : number;\r\n ColumnSpan? : ColumnSpans;\r\n ConditionalResult? : ConditionalResults;\r\n ConditioningField? : string;\r\n ConditioningFieldValue? : number[];\r\n CurrentFilters? : any;\r\n Data? : any;\r\n DataFilter? : FilterViewModel;\r\n Description? : string;\r\n DisplayMember? : string;\r\n ExportPropertyName? : string;\r\n FieldValidators? : FieldValidators;\r\n FilterDistinct? : boolean;\r\n FilterType? : FilterType;\r\n HideSelected? : boolean;\r\n Highlight? : boolean;\r\n InputType? : string;\r\n IsClearable? : boolean;\r\n IsConditional? : boolean;\r\n IsConditioning? : boolean;\r\n IsExtendedProperty? : boolean;\r\n IsHidden? : boolean;\r\n IsStatic? : boolean;\r\n KeepPlace? : boolean;\r\n Label? : string;\r\n ModalEntityKey? : string;\r\n ModalOnly? : boolean;\r\n ModalPropertyName? : string;\r\n ModalPropertyValue? : string;\r\n ModalTitle? : string;\r\n ModalTriggerIdProperty? : string;\r\n ModalTriggerIdPropertyValue? : string;\r\n MultipleSelection? : boolean;\r\n NotDefaultRequired? : boolean;\r\n OriginalData? : any;\r\n PropertyLength? : number;\r\n PropertyName? : string;\r\n ReadOnly? : boolean;\r\n Required? : boolean;\r\n TextWithStyle? : TextWithStyle;\r\n ToolTip? : string;\r\n ValueMember? : string;\r\n}\r\n\r\nexport interface EntityFilterViewModel<T> extends FilterViewModel {\r\n}\r\n\r\nexport enum ApiErrorTypes {\r\n Unknown = 0,\r\n DatabaseError = 1,\r\n SystemError = 2,\r\n UserError = 3,\r\n}\r\n\r\nexport interface TreeItem<T> {\r\n checked? : boolean;\r\n children? : TreeItem<T>[];\r\n childrenCount? : number;\r\n text? : string;\r\n value? : number;\r\n}\r\n\r\nexport interface Section {\r\n FieldViewModels? : FieldDescriptor[];\r\n IsCustomFieldSection? : boolean;\r\n IsFileSection? : boolean;\r\n IsTrackRecordSection? : boolean;\r\n Name? : string;\r\n}\r\n\r\nexport interface Display {\r\n baseUrl? : string;\r\n completingCaracter? : string;\r\n currency? : string;\r\n enumMap? : string[];\r\n format? : string;\r\n handleError? : boolean;\r\n imagePath? : string;\r\n imgBase? : string;\r\n multiplier? : number;\r\n nullCaseText? : string;\r\n sourceProperty? : string;\r\n type? : string;\r\n width? : number;\r\n}\r\n\r\nexport interface BasicNode {\r\n Childrens? : INode[];\r\n Code? : string;\r\n Description? : string;\r\n Id? : number;\r\n ParentId? : number;\r\n UniqueName? : string;\r\n}\r\n\r\nexport interface ApiError {\r\n ApiErrorType? : ApiErrorTypes;\r\n ErrorCode? : number;\r\n Message? : string;\r\n StackTrace? : string;\r\n}\r\n\r\nexport enum ActionDisplay {\r\n Button = 0,\r\n TextAndButton = 1,\r\n}\r\n\r\n\r\nexport interface TabToSave<TResult> {\r\n Data? : TResult[];\r\n TitleOfTab? : string;\r\n}\r\n\r\nexport interface SaveResult {\r\n DisplayMessage? : boolean;\r\n Error? : ApiError;\r\n ErrorMessage? : string;\r\n Id? : number;\r\n RowVersion? : Date;\r\n Success? : boolean;\r\n Warnings? : string[];\r\n}\r\n\r\nexport interface ColumnDescriptor {\r\n Display? : Display;\r\n Expression? : string;\r\n FieldName? : string;\r\n IsComputed? : boolean;\r\n IsFilterEnabled? : boolean;\r\n IsNumericExpression? : boolean;\r\n Name? : string;\r\n Property? : string;\r\n TableAlias? : string;\r\n ToolTipProperty? : string;\r\n}\r\n\r\nexport interface AggregationValue {\r\n Key? : string;\r\n Value? : any;\r\n}\r\n\r\nexport interface ActionDescriptor {\r\n ActionDisplay? : ActionDisplay;\r\n Description? : string;\r\n FormDescriptor? : Section[];\r\n Icon? : string;\r\n IconUrl? : string;\r\n Label? : string;\r\n Name? : string;\r\n RequestType? : string;\r\n}\r\n\r\nexport interface SaveResults<TResult> extends SaveResult {\r\n SaveErrorEntities? : TResult[];\r\n}\r\n\r\nexport interface RunActionContext {\r\n Action? : ActionDescriptor;\r\n CorrelationId? : string;\r\n EntityIds? : number[];\r\n EntityKey? : string;\r\n File? : any;\r\n FileId? : number;\r\n FormValue? : any;\r\n RequestId? : number;\r\n}\r\n\r\nexport interface PagedList<T> {\r\n Aggregates? : AggregationValue[];\r\n Skip? : number;\r\n Take? : number;\r\n TotalRowCount? : number;\r\n Values? : T[];\r\n}\r\n\r\nexport enum ImageFormats {\r\n Undefined = 0,\r\n JPG = 1,\r\n PNG = 2,\r\n GIF = 3,\r\n TIFF = 4,\r\n BMP = 5,\r\n SVG = 6,\r\n}\r\n\r\nexport interface FilterDescriptor extends FieldDescriptor {\r\n DisplayImage? : boolean;\r\n}\r\n\r\nexport interface ExportModel<T> {\r\n Columns? : ColumnDescriptor[];\r\n Filter? : T;\r\n}\r\n\r\nexport interface EntityWithSpecifics<TResult> {\r\n Entity? : TResult;\r\n Tabs? : TabToSave<TResult>[];\r\n}\r\n\r\nexport interface EntityViewModelWithFields<T> {\r\n FieldSections? : Section[];\r\n HiddenSections? : string[];\r\n SpecificSection? : any;\r\n ViewModel? : T;\r\n}\r\n\r\nexport interface EntityImage {\r\n EntityId? : number;\r\n Url? : string;\r\n}\r\n\r\nexport enum TextSearch {\r\n Contains = 0,\r\n StartsWith = 1,\r\n EndsWith = 2,\r\n}\r\n\r\nexport enum ExportType {\r\n CSV = 0,\r\n EXCEL = 1,\r\n}\r\n\r\nexport enum AggregateFunction {\r\n Count = 0,\r\n Sum = 1,\r\n Min = 2,\r\n Max = 3,\r\n Avg = 4,\r\n}\r\n\r\nexport enum ActionResultStatus {\r\n OK = 0,\r\n KO = 1,\r\n}\r\n\r\n","import { Utilities } from '@dflat-core/web/core';\r\nimport { ComponentRef, TemplateRef, Type } from '@angular/core';\r\n\r\nimport { ActionDescriptor, ColumnDescriptor, EntityViewModel, EntityViewModelWithFields, FieldDescriptor, FieldValidators, FilterDescriptor, FilterViewModel } from './model/interface.generated';\r\n\r\nexport interface IIdentifiable {\r\n Id?: number;\r\n}\r\n\r\nexport class UserUpdatedMessage {\r\n constructor(public userKey: string) { }\r\n}\r\n\r\n/**\r\n * Message du bus : un profil de présentation partagé (par défaut, par rôle ou par fournisseur) a\r\n * été modifié (signal PresentationChanged du hub, envoyé par le serveur après son enregistrement).\r\n * Le cache d'initialisation de l'entité est vidé et les grilles ouvertes rechargent leurs colonnes.\r\n */\r\nexport class PresentationChangedMessage {\r\n /**\r\n * @param entityName Nom de l'entité du profil (ex. Company), ou null : toutes les entités.\r\n * @param stamp Nouvel horodatage du cache client annoncé par le serveur.\r\n */\r\n constructor(public entityName: string | null, public stamp?: number) { }\r\n\r\n /**\r\n * Vrai si le message concerne l'écran de clé entityKey : même nom sans tenir compte de la\r\n * casse ni du suffixe View (un écran porte sur la table ou sur sa vue principale).\r\n */\r\n concerns(entityKey: string): boolean {\r\n if (this.entityName === null || this.entityName === undefined || this.entityName === '') {\r\n return true;\r\n }\r\n const normalize = (name: string) => (name ?? '').toLowerCase().replace(/view$/, '');\r\n return normalize(this.entityName) === normalize(entityKey);\r\n }\r\n}\r\n\r\n/**\r\n * Message du bus : un formulaire enregistré en base a été modifié (signal FormChanged du hub,\r\n * envoyé par le serveur après l'enregistrement d'un formulaire, d'une section ou d'un champ).\r\n * Le cache d'initialisation de l'entité est vidé et les écrans ouverts rechargent leur formulaire.\r\n */\r\nexport class FormChangedMessage {\r\n /**\r\n * @param entityName Nom de l'entité du formulaire (ex. Country), ou null : tous les formulaires.\r\n * @param stamp Nouvel horodatage du cache client annoncé par le serveur.\r\n */\r\n constructor(public entityName: string | null, public stamp?: number) { }\r\n\r\n /**\r\n * Vrai si le message concerne l'écran de clé entityKey : même nom sans tenir compte de la\r\n * casse ni du suffixe View (un écran porte sur la table ou sur sa vue principale).\r\n */\r\n concerns(entityKey: string): boolean {\r\n if (this.entityName === null || this.entityName === undefined || this.entityName === '') {\r\n return true;\r\n }\r\n const normalize = (name: string) => (name ?? '').toLowerCase().replace(/view$/, '');\r\n return normalize(this.entityName) === normalize(entityKey);\r\n }\r\n}\r\n\r\nexport interface IUserCredential extends IIdentifiable {\r\n AccessToken: string; \r\n RefreshToken: string; \r\n Username?: string; \r\n FirstName?: string; \r\n LastName?: string;\r\n Email?: string;\r\n IsAdmin?: boolean;\r\n IsDelivery?: boolean;\r\n IsPartner?: boolean;\r\n PhoneNumber?: string;\r\n IsActive?: boolean;\r\n IsPartnerActive?: boolean;\r\n IsDeliveryActive?: boolean;\r\n\r\n Id?: number;\r\n CompanyId?: number;\r\n Permissions: string[];\r\n ProfileImageUrl: string;\r\n AvatarUrl: string;\r\n\r\n}\r\n/** Fournisseur d'identité externe proposé à l'écran de connexion (Account/GetLoginProviders). */\r\nexport interface IExternalLoginProvider {\r\n /** Google, Microsoft ou Apple. */\r\n Provider: string;\r\n /** Identifiant de l'application chez le fournisseur. */\r\n ClientId: string;\r\n /** Microsoft seulement : locataire du point d'accès (common par défaut). */\r\n TenantId?: string;\r\n}\r\n\r\nexport class User implements IUserCredential {\r\n \r\n public AccessToken: string;\r\n public RefreshToken: string;\r\n public Username?: string;\r\n public FirstName?: string;\r\n public LastName?: string;\r\n public Email?: string;\r\n public PhoneNumber?: string;\r\n public IsAdmin?: boolean;\r\n public IsDelivery?: boolean;\r\n public IsPartner?: boolean;\r\n public Id?: number;\r\n public CompanyId?: number;\r\n public Permissions: string[];\r\n public ProfileImageUrl: string;\r\n public IsActive?: boolean;\r\n public IsPartnerActive?: boolean;\r\n public IsDeliveryActive?: boolean;\r\n public IsConnected: boolean = false;\r\n public AvatarUrl: string;\r\n \r\n public constructor(data: IUserCredential) {\r\n this.Username = data.Username;\r\n this.FirstName = data.FirstName;\r\n this.LastName = data.LastName;\r\n this.Email = data.Email;\r\n this.PhoneNumber = data.PhoneNumber;\r\n this.ProfileImageUrl = data.ProfileImageUrl;\r\n this.IsAdmin = data.IsAdmin;\r\n this.IsPartner = data.IsPartner;\r\n this.IsDelivery = data.IsDelivery;\r\n this.IsAdmin = data.IsAdmin;\r\n this.IsPartner = data.IsPartner;\r\n this.IsDelivery = data.IsDelivery;\r\n this.IsActive = data.IsActive;\r\n this.IsPartnerActive = data.IsPartnerActive;\r\n this.IsDeliveryActive = data.IsDeliveryActive;\r\n this.Id = data.Id;\r\n this.CompanyId = data.CompanyId;\r\n this.AccessToken = data.AccessToken;\r\n this.AvatarUrl = data.AvatarUrl;\r\n }\r\n \r\n\r\n public getName() {\r\n return this.FirstName + ' ' + this.LastName;\r\n }\r\n\r\n \r\n}\r\n\r\n\r\nexport interface INotification {\r\n id:string;\r\n content: string;\r\n class: string;\r\n link: string;\r\n entityType:string;\r\n entityId?:number;\r\n}\r\n \r\nexport class Notification implements INotification {\r\n public id:string;\r\n public content: string;\r\n public class: string;\r\n public link: string;\r\n public entityType:string;\r\n public entityId?:number\r\n public constructor(data: Partial<INotification> = {}) {\r\n this.id = data.id || '';\r\n this.content = data.content || '';\r\n this.class = data.class || '';\r\n this.link = data.link || '';\r\n this.entityType = data.entityType || '';\r\n this.entityId = data.entityId;\r\n }\r\n}\r\n\r\nexport class ChannelData<T> {\r\n Channel: string;\r\n Data: T;\r\n\r\n public constructor(channel: string, data: T) {\r\n this.Channel= channel;\r\n this.Data= data;\r\n }\r\n}\r\n\r\nexport class IMessage {\r\n Channel: string;\r\n Data: any;\r\n}\r\n\r\nexport class Message implements IMessage \r\n{\r\n Channel: string;\r\n Data: any;\r\n\r\n public constructor(channel: string, data: any) {\r\n this.Channel= channel;\r\n this.Data= data;\r\n }\r\n}\r\nexport interface NumberDictionary<T> {\r\n [Key: number]: T;\r\n}\r\nexport interface Dictionary<T> {\r\n [Key: string]: T;\r\n}\r\n\r\n\r\n\r\nexport class NumberDictionnaryWrapper<T> {\r\n\r\n dictionary: NumberDictionary<T> = {};\r\n get(key: number) {\r\n return this.dictionary[key];\r\n }\r\n\r\n containsKey(key: number) {\r\n if (typeof this.dictionary[key] === \"undefined\") {\r\n return false;\r\n }\r\n return true;\r\n }\r\n}\r\n\r\nexport class DictionnaryWrapper<T> {\r\n\r\n dictionary: Dictionary<T> = {};\r\n get(key: string) {\r\n return this.dictionary[key];\r\n }\r\n\r\n containsKey(key: string) {\r\n if (typeof this.dictionary[key] === \"undefined\") {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n getPartKey(key: string) {\r\n\r\n if (typeof this.dictionary[key] === \"undefined\" ) {\r\n let keyFound = Object.keys(this.dictionary).find(obj => key.includes(obj));\r\n if(keyFound) {\r\n key = keyFound\r\n }\r\n }\r\n\r\n return this.dictionary[key];\r\n }\r\n\r\n containsKeyOrPartKey(key: string) {\r\n let routeFound = Object.keys(this.dictionary).find(obj => key.includes(obj));\r\n \r\n if(!Utilities.IsNil(routeFound)){\r\n return true;\r\n }\r\n\r\n if (typeof this.dictionary[key] === \"undefined\" ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n getValues() {\r\n return Object.keys(this.dictionary).map(key => this.dictionary[key]);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n// export interface FilterDescriptor {\r\n// FieldValidators?: FieldValidators;\r\n// Label?: string;\r\n// FilterType?: FilterType;\r\n// PropertyName?: string;\r\n// DisplayMember?: string;\r\n// ValueMember?: string;\r\n// Data?: any;\r\n// Highlight?: boolean;\r\n// ToolTip?: string;\r\n// IsStatic?: boolean;\r\n// Required?: boolean;\r\n// NotDefaultRequired?: boolean;\r\n// ReadOnly?: boolean;\r\n// IsHidden?: boolean;\r\n// KeepPlace?: boolean;\r\n// IsConditioning?: boolean;\r\n// IsConditional?: boolean;\r\n// ConditioningField?: string;\r\n// ConditioningFieldValue?: number;\r\n// BoolConditioningFieldValue?: boolean;\r\n// OriginalData?: any;\r\n// CascadeDependency?: boolean;\r\n// CascadeDependencyProperty?: string;\r\n// FilterDistinct?: boolean;\r\n// MultipleSelection?: boolean;\r\n// HideSelected?: boolean;\r\n// ColumnSpan?: ColumnSpans;\r\n// ColumnIndex?: number;\r\n// InputType?: string;\r\n// CurrentFilters?: {};\r\n\r\n// ModalEntityKey?: string;\r\n// ModalPropertyName?: string;\r\n// ModalPropertyValue?: string;\r\n// ModalTitle?: string;\r\n// }\r\n\r\n\r\n\r\nexport interface SpecificSection {\r\n Name?: string,\r\n IconUrl?:string,\r\n Template?: Type<any> | TemplateRef<any> | ComponentRef<any> | any,\r\n Context?: {},\r\n Data?: any[],\r\n Component?: any,\r\n refreshFunction?: () => void\r\n}\r\nexport interface SectionError {\r\n Name?: string,\r\n FieldValidators?: FieldValidators;\r\n Errors?: string[]\r\n}\r\n\r\nexport interface IFilterDescriptorExtra {\r\n Field?: FilterDescriptor;\r\n DisplayedValue?: string;\r\n}\r\n\r\nexport interface TextZoneButtonEvent {\r\n Field: FieldDescriptor;\r\n Value: string;\r\n }\r\n \r\n export interface FieldEvent {\r\n Field: FieldDescriptor;\r\n Event: Event;\r\n }\r\n \r\n export interface EntityConfig {\r\n actions: ActionDescriptor[];\r\n columns: ColumnDescriptor[];\r\n emptyFilter: FilterViewModel;\r\n filterDescriptors: FilterDescriptor[];\r\n viewModel: EntityViewModelWithFields<EntityViewModel>;\r\n }\r\n\r\n // export interface CachedConfig {\r\n // timestamp: number;\r\n // config : EntityConfig;\r\n // }\r\n\r\n export interface PropertyEditorEvent {\r\n field: FieldDescriptor;\r\n value: any;\r\n type: 'value' | 'pending' | 'file' | 'selector' | 'button'| 'reset';\r\n }","export class HistoryItem {\r\n date: string;\r\n hour: string;\r\n url: string;\r\n icon1: string;\r\n menu1: string;\r\n icon2: string;\r\n menu2: string;\r\n}\r\n\r\nexport enum FilterOperator {\r\n Contains = 0,\r\n StartsWith = 1,\r\n EndsWith = 2,\r\n Equals = 3\r\n}\r\nexport interface FilterClause {\r\n PropertyName : string;\r\n FilterValue : string;\r\n Operator : FilterOperator\r\n}\r\n\r\nexport interface FilterRow {\r\n ClausesByPropertyName : Map<string, FilterClause>;\r\n}\r\n\r\nexport interface FilterQuery {\r\n Rows : FilterRow[];\r\n}\r\n\r\nexport enum CustomFieldTypes {\r\n String = 0,\r\n Integer = 1,\r\n Date = 2,\r\n ComboBox = 3,\r\n Checkbox = 4,\r\n Email = 5,\r\n WeekNumber = 6,\r\n Text = 7,\r\n Custom = 8,\r\n Number = 9,\r\n}"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { of } from "rxjs";
1
+ import { Subject, of } from "rxjs";
2
2
  import { ApplicationService, EntityFacadeRegistryService, EntitySections } from "@dflat-core/web/core-ux";
3
3
  import { BreadcrumbService, NotificationMqService } from "@dflat-core/web/core-services";
4
4
  import { TestBed } from "@angular/core/testing";
@@ -39,6 +39,9 @@ var DataServiceDouble = class {
39
39
  this.columnCalls++;
40
40
  return of([]);
41
41
  }
42
+ getGridColumnsFor() {
43
+ return of([]);
44
+ }
42
45
  getViewFilterDescriptors() {
43
46
  return of([]);
44
47
  }
@@ -82,6 +85,7 @@ var EntityFacadeRegistrySpy = class extends EntityFacadeRegistryService {
82
85
  };
83
86
  var RouterDouble = class RouterDouble {
84
87
  constructor(url) {
88
+ this.events = new Subject();
85
89
  this.navigations = [];
86
90
  this.url = url;
87
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dflat-core-web-core-ux-testing.mjs","names":[],"sources":["../../core-ux/testing/src/lib/doubles/data-service-double.ts","../../core-ux/testing/src/lib/doubles/entity-facade-registry-spy.ts","../../core-ux/testing/src/lib/doubles/router-double.ts","../../core-ux/testing/src/lib/base-component-test-context.ts","../../core-ux/testing/src/lib/count-calls.ts","../../core-ux/testing/src/lib/get-test-runner.ts","../../core-ux/testing/src/lib/describe-base-component.ts","../../core-ux/testing/src/lib/describe-generated-module.ts"],"sourcesContent":["import { DataService } from '@dflat-core/web/core-data';\r\nimport {\r\n ActionDescriptor,\r\n ColumnDescriptor,\r\n EntityViewModel,\r\n EntityViewModelWithFields,\r\n FilterDescriptor,\r\n FilterViewModel,\r\n PagedList\r\n} from '@dflat-core/web/core-model';\r\nimport { Observable, of } from 'rxjs';\r\n\r\n/**\r\n * Doublure de DataService : aucune requête HTTP. Fournit les données d'initialisation d'une\r\n * façade (colonnes, filtre vide, formulaire, actions) et enregistre les recherches et lectures\r\n * de détail demandées par le composant testé.\r\n */\r\nexport class DataServiceDouble {\r\n /** Recherches demandées (search), dans l'ordre. */\r\n readonly searchCalls: { entityKey: string; filter: FilterViewModel }[] = [];\r\n\r\n /** Lectures de détail demandées (getDetails), dans l'ordre. */\r\n readonly detailsCalls: { entityKey: string; id: number }[] = [];\r\n\r\n /** Nombre de lectures des colonnes de la grille (getViewColumns). */\r\n columnCalls = 0;\r\n\r\n /** Entités dont le cache d'initialisation a été vidé (clearCached), dans l'ordre. */\r\n readonly clearedCaches: string[] = [];\r\n\r\n /** Nombre de lectures du formulaire (getEntityViewModel). */\r\n viewModelCalls = 0;\r\n\r\n /** Résultat renvoyé par search. */\r\n searchResult: PagedList<EntityViewModel> = { Values: [], TotalRowCount: 0 };\r\n\r\n /** Entité renvoyée par getDetails. */\r\n details: EntityViewModel = {};\r\n\r\n /** Enregistre la recherche et renvoie searchResult. */\r\n search<TData>(entityKey: string, filter: FilterViewModel): Observable<PagedList<TData>> {\r\n this.searchCalls.push({ entityKey, filter });\r\n return of(this.searchResult as PagedList<TData>);\r\n }\r\n\r\n /** Enregistre la lecture et renvoie details. */\r\n getDetails<TData>(entityKey: string, id: number): Observable<TData> {\r\n this.detailsCalls.push({ entityKey, id });\r\n return of(this.details as TData);\r\n }\r\n\r\n /** Paramètres d'URL d'un filtre : copie du filtre, sans mise en forme. */\r\n getFormattedParams(params: object): object {\r\n return { ...params };\r\n }\r\n\r\n /** Colonnes de la grille : aucune. */\r\n getViewColumns(): Observable<ColumnDescriptor[]> {\r\n this.columnCalls++;\r\n return of([]);\r\n }\r\n\r\n /** Critères du filtre : aucun. */\r\n getViewFilterDescriptors(): Observable<FilterDescriptor[]> {\r\n return of([]);\r\n }\r\n\r\n /** Filtre vide : première page de 25 lignes. */\r\n getEmptyFilter<TFilter>(): Observable<TFilter> {\r\n return of({ Offset: 0, Take: 25 } as TFilter);\r\n }\r\n\r\n /** Formulaire vide, sans champ. */\r\n getEntityViewModel<TData>(): Observable<EntityViewModelWithFields<TData>> {\r\n this.viewModelCalls++;\r\n return of({} as EntityViewModelWithFields<TData>);\r\n }\r\n\r\n /** Enregistre l'entité dont le cache d'initialisation est vidé. */\r\n clearCached(entityKey?: string): void {\r\n this.clearedCaches.push(entityKey);\r\n }\r\n\r\n /** Actions étendues : aucune. */\r\n getExtendedActions(): Observable<ActionDescriptor[]> {\r\n return of([]);\r\n }\r\n\r\n /** Valeur d'initialisation calculée par le front : calculée à chaque appel, sans cache. */\r\n getCachedValue<T>(entityKey: string, name: string, factory: () => T): Observable<T> {\r\n return of(factory());\r\n }\r\n\r\n /** La doublure, vue comme le DataService qu'elle remplace. */\r\n asDataService(): DataService {\r\n return this as unknown as DataService;\r\n }\r\n}\r\n","import { EntityViewModel } from '@dflat-core/web/core-model';\r\nimport { EntityFacade, EntityFacadeRegistryService } from '@dflat-core/web/core-ux';\r\nimport { Guid } from 'guid-typescript';\r\n\r\n/** Registre de façades du socle (vraies façades), qui enregistre les façades demandées. */\r\nexport class EntityFacadeRegistrySpy extends EntityFacadeRegistryService {\r\n /** Façades demandées (getFacade), dans l'ordre : clé d'entité, identifiant et façade renvoyée. */\r\n readonly requests: { key: string; id: Guid; facade: EntityFacade<EntityViewModel> }[] = [];\r\n\r\n /** Enregistre la demande et renvoie la façade du registre. */\r\n override getFacade<TData extends EntityViewModel>(key: string, id: Guid): EntityFacade<TData> {\r\n const facade = super.getFacade<TData>(key, id);\r\n this.requests.push({ key, id, facade });\r\n return facade;\r\n }\r\n}\r\n","import { NavigationExtras, Router, UrlCreationOptions, UrlTree } from '@angular/router';\r\n\r\n/**\r\n * Doublure de Router : URL courante, construction d'URL (chemin et paramètres) et navigations\r\n * enregistrées. Une navigation réussit toujours et devient l'URL courante.\r\n */\r\nexport class RouterDouble {\r\n /** URL courante. */\r\n url: string;\r\n\r\n /** Navigations demandées (navigate), dans l'ordre. */\r\n readonly navigations: { commands: unknown[]; extras?: NavigationExtras }[] = [];\r\n\r\n constructor(url: string) {\r\n this.url = url;\r\n }\r\n\r\n /** URL formée des segments `commands` et des paramètres `extras.queryParams`. */\r\n createUrlTree(commands: unknown[], extras?: UrlCreationOptions): UrlTree {\r\n const url = RouterDouble.format(commands, extras?.queryParams);\r\n return { toString: () => url } as UrlTree;\r\n }\r\n\r\n /** Enregistre la navigation, qui devient l'URL courante. */\r\n navigate(commands: unknown[], extras?: NavigationExtras): Promise<boolean> {\r\n this.navigations.push({ commands, extras });\r\n this.url = RouterDouble.format(commands, extras?.queryParams);\r\n return Promise.resolve(true);\r\n }\r\n\r\n /** La doublure, vue comme le Router qu'elle remplace. */\r\n asRouter(): Router {\r\n return this as unknown as Router;\r\n }\r\n\r\n /** URL d'un chemin et de ses paramètres. */\r\n private static format(commands: unknown[], queryParams?: object | null): string {\r\n const path = commands.join('/');\r\n const query = Object.entries(queryParams ?? {})\r\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\r\n .join('&');\r\n return query ? `${path}?${query}` : path;\r\n }\r\n}\r\n","import { Title } from '@angular/platform-browser';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { BreadcrumbService, NotificationMqService } from '@dflat-core/web/core-services';\r\nimport { ApplicationService, RootDeps } from '@dflat-core/web/core-ux';\r\nimport { of } from 'rxjs';\r\nimport { DataServiceDouble } from './doubles/data-service-double';\r\nimport { EntityFacadeRegistrySpy } from './doubles/entity-facade-registry-spy';\r\nimport { RouterDouble } from './doubles/router-double';\r\nimport { BreadcrumbData } from './interfaces/breadcrumb-data';\r\n\r\n/**\r\n * Services donnés à un composant dérivé de BaseComponent pendant un test : vraies classes du\r\n * socle quand elles s'instancient sans dépendance (ApplicationService, registre de façades et\r\n * façades, fil d'Ariane, file de messages), doublures pour le service de données, le routeur et\r\n * la route. Les services que BaseComponent n'utilise pas (authentification, fenêtres modales,\r\n * alertes, mise en page...) ne sont pas fournis.\r\n */\r\nexport class BaseComponentTestContext {\r\n /** Doublure du service de données. */\r\n readonly dataService = new DataServiceDouble();\r\n\r\n /** Doublure du routeur. */\r\n readonly router: RouterDouble;\r\n\r\n /** Route active, sans paramètre. */\r\n readonly route: ActivatedRoute;\r\n\r\n /** Fil d'Ariane du socle. */\r\n readonly breadcrumb: BreadcrumbService;\r\n\r\n /** File de messages (notifications d'entité) du socle. */\r\n readonly notifications = new NotificationMqService();\r\n\r\n /** Registre de façades du socle, qui enregistre les façades demandées. */\r\n readonly registry: EntityFacadeRegistrySpy;\r\n\r\n /** ApplicationService du socle, construit sur les services ci-dessus. */\r\n readonly app: ApplicationService;\r\n\r\n /**\r\n * @param url URL courante du routeur.\r\n * @param title Service du titre de la page (TestBed.inject(Title)), utilisé par le fil d'Ariane.\r\n */\r\n constructor(url: string, title: Title) {\r\n this.router = new RouterDouble(url);\r\n this.route = { snapshot: { params: {}, queryParams: {} }, params: of({}), queryParams: of({}) } as unknown as ActivatedRoute;\r\n this.breadcrumb = new BreadcrumbService(title);\r\n\r\n const deps = {\r\n nav: { route: this.route, router: this.router.asRouter(), location: undefined },\r\n ui: { layout: undefined, breadcrumb: this.breadcrumb, toastr: undefined, alert: undefined, modal: undefined },\r\n data: { data: this.dataService.asDataService(), filter: undefined, selector: undefined },\r\n security: { auth: undefined, user: undefined },\r\n selection: undefined,\r\n test: undefined\r\n } as unknown as RootDeps;\r\n\r\n this.registry = new EntityFacadeRegistrySpy(deps);\r\n this.app = new ApplicationService(deps, this.notifications, undefined, undefined, undefined, this.registry);\r\n }\r\n\r\n /** Fil d'Ariane courant (dernière valeur publiée). */\r\n get currentBreadcrumb(): BreadcrumbData {\r\n let current: BreadcrumbData;\r\n this.breadcrumb.getCurrent().subscribe((data: BreadcrumbData) => current = data).unsubscribe();\r\n return current;\r\n }\r\n}\r\n","import { CallCounter } from './interfaces/call-counter';\r\n\r\n/**\r\n * Compte les appels de la méthode `method` de `target`, qui reste exécutée : équivalent, sans\r\n * outil de test, d'un espion transparent.\r\n */\r\nexport function countCalls<T extends object, K extends keyof T>(target: T, method: K): CallCounter {\r\n const original = target[method] as unknown as (...args: unknown[]) => unknown;\r\n const counter: CallCounter = { count: 0 };\r\n target[method] = ((...args: unknown[]) => {\r\n counter.count++;\r\n return original.apply(target, args);\r\n }) as unknown as T[K];\r\n return counter;\r\n}\r\n","import { TestRunner } from './interfaces/test-runner';\r\n\r\n/**\r\n * Fonctions globales de l'outil de test (describe, it, beforeEach, expect), lues sur globalThis\r\n * pour ne dépendre d'aucun outil ni de ses types.\r\n */\r\nexport function getTestRunner(): TestRunner {\r\n const runner = globalThis as unknown as Partial<TestRunner>;\r\n if (typeof runner.describe !== 'function' || typeof runner.it !== 'function'\r\n || typeof runner.beforeEach !== 'function' || typeof runner.expect !== 'function')\r\n throw new Error('Suites de test Dflat : describe, it, beforeEach et expect doivent être des fonctions globales (Vitest : option globals).');\r\n return runner as TestRunner;\r\n}\r\n","import { TestBed } from '@angular/core/testing';\r\nimport { Title } from '@angular/platform-browser';\r\nimport { Utilities } from '@dflat-core/web/core';\r\nimport { EntityViewModel, FilterViewModel, Notification } from '@dflat-core/web/core-model';\r\nimport { BaseComponent, EntitySections } from '@dflat-core/web/core-ux';\r\nimport { BaseComponentTestContext } from './base-component-test-context';\r\nimport { countCalls } from './count-calls';\r\nimport { getTestRunner } from './get-test-runner';\r\nimport { BaseComponentExpectations } from './interfaces/base-component-expectations';\r\nimport { BaseComponentFactory } from './interfaces/base-component-factory';\r\n\r\n/**\r\n * Suite de test standard d'un composant dérivé de BaseComponent : vérifie, sans rendre son\r\n * gabarit, le contrat de BaseComponent (création, clé d'entité, lien, titre, permission, façade,\r\n * ngOnInit, demande des onglets, Search / refresh, notifications, ngOnDestroy). À appeler au premier niveau d'un\r\n * fichier de test :\r\n * `describeBaseComponent('CountryComponent', (app, route) => new TestCountryComponent(app, route), { ... })`.\r\n * La suite n'utilise que les fonctions globales de l'outil de test (describe, it, beforeEach,\r\n * expect) et TestBed.\r\n *\r\n * @param name Nom du composant, repris dans le titre de la suite.\r\n * @param factory Fabrique du composant, appelée dans un contexte d'injection avant chaque test.\r\n * @param expectations Valeurs attendues du composant.\r\n */\r\nexport function describeBaseComponent<TFilter extends FilterViewModel, TData extends EntityViewModel>(\r\n name: string, factory: BaseComponentFactory<TFilter, TData>, expectations: BaseComponentExpectations): void {\r\n const { describe, it, beforeEach, expect } = getTestRunner();\r\n\r\n describe(`${name} (contrat de BaseComponent)`, () => {\r\n let context: BaseComponentTestContext;\r\n let component: BaseComponent<TFilter, TData>;\r\n\r\n /** Publie la notification de modification de l'entité `entityId` sur le canal de l'entité du composant. */\r\n const notify = (entityId: number): void =>\r\n context.notifications.publish(new Notification({ entityType: Utilities.GetChannel(expectations.entityKey), entityId }));\r\n\r\n beforeEach(() => {\r\n TestBed.configureTestingModule({ providers: expectations.providers ?? [] });\r\n context = new BaseComponentTestContext(expectations.path, TestBed.inject(Title));\r\n component = TestBed.runInInjectionContext(() => factory(context.app, context.route));\r\n });\r\n\r\n it('est créé dans un contexte d\\'injection', () => {\r\n expect(component).toBeTruthy();\r\n expect(component.destroy$.closed).toBe(false);\r\n });\r\n\r\n it('expose la clé d\\'entité, le lien, le titre et la permission attendus', () => {\r\n expect(component.getEntityKey()).toBe(expectations.entityKey);\r\n expect(component.getPath()).toBe(expectations.path);\r\n expect(component.getTitle()).toBe(expectations.title);\r\n expect(component.PermissionKey).toBe(expectations.permissionKey);\r\n expect(component.layoutKey).toBe(expectations.entityKey);\r\n });\r\n\r\n it('demande sa façade au registre avec la clé de l\\'entité', () => {\r\n expect(context.registry.requests.length).toBe(1);\r\n expect(context.registry.requests[0].key).toBe(expectations.entityKey);\r\n expect(context.registry.requests[0].facade).toBe(component.facade);\r\n expect(component.facade.actions.handler.path).toBe(expectations.path);\r\n });\r\n\r\n it('ngOnInit publie le fil d\\'Ariane du composant principal', () => {\r\n component.ngOnInit();\r\n\r\n expect(component.displayComponent).toBe(true);\r\n expect(component.actionTitle).toBe(expectations.title);\r\n expect(context.currentBreadcrumb).toEqual({\r\n description: expectations.title,\r\n display: true,\r\n header: expectations.title,\r\n levels: [{ icon: component.getIcon(), link: [expectations.path], title: expectations.title }]\r\n });\r\n });\r\n\r\n it('ngOnInit ne publie pas de fil d\\'Ariane pour un composant d\\'onglet', () => {\r\n component.IsTheMainComponent = false;\r\n component.ngOnInit();\r\n\r\n expect(context.currentBreadcrumb.display).toBe(false);\r\n });\r\n\r\n it('ngOnInit branche le chargement sur dataService.search avec la clé de l\\'entité', () => {\r\n context.dataService.searchResult = { Values: [{ Id: 7, Name: 'avant' }], TotalRowCount: 1 };\r\n component.ngOnInit();\r\n\r\n const filter: FilterViewModel = { Offset: 0, Take: 25 };\r\n let total: number | undefined;\r\n component.facade.data.loadData(filter).subscribe(result => total = result.TotalRowCount);\r\n\r\n expect(context.dataService.searchCalls).toEqual([{ entityKey: expectations.entityKey, filter }]);\r\n expect(total).toBe(1);\r\n expect(component.facade.data.getOriginal(7).Name).toBe('avant');\r\n });\r\n\r\n it('ngOnInit s\\'abonne une seule fois aux notifications de l\\'entité', () => {\r\n component.ngOnInit();\r\n const first = component.notif;\r\n component.ngOnInit();\r\n\r\n expect(first.closed).toBe(true);\r\n expect(component.notif.closed).toBe(false);\r\n });\r\n\r\n if (expectations.sections) {\r\n it('ngOnInit enregistre les onglets attendus', async () => {\r\n component.ngOnInit();\r\n // Les onglets générés sont enregistrés dans une microtâche, après ceux du composant spécifique.\r\n await Promise.resolve();\r\n await Promise.resolve();\r\n\r\n let sections: (string | undefined)[] = [];\r\n component.facade.sections.sections$.subscribe(list => sections = list.map(s => s.Name)).unsubscribe();\r\n expect(sections).toEqual(expectations.sections);\r\n });\r\n }\r\n\r\n if (expectations.requestsSections !== undefined) {\r\n const title = expectations.requestsSections\r\n ? 'ngOnInit demande les onglets de l\\'entité au registre du socle (EntitySections)'\r\n : 'ngOnInit ne demande pas d\\'onglet au registre du socle (EntitySections)';\r\n\r\n it(title, async () => {\r\n const original = EntitySections.registerSections;\r\n const requests: { entityKey: string; facade: unknown }[] = [];\r\n EntitySections.registerSections = ((entityKey: string, facade: unknown) => {\r\n requests.push({ entityKey, facade });\r\n }) as typeof EntitySections.registerSections;\r\n try {\r\n component.ngOnInit();\r\n // Les onglets sont demandés dans une microtâche, après ceux du composant spécifique.\r\n await Promise.resolve();\r\n await Promise.resolve();\r\n }\r\n finally {\r\n EntitySections.registerSections = original;\r\n }\r\n\r\n expect(requests.length).toBe(expectations.requestsSections ? 1 : 0);\r\n if (expectations.requestsSections) {\r\n expect(requests[0].entityKey).toBe(expectations.entityKey);\r\n expect(requests[0].facade).toBe(component.facade);\r\n }\r\n });\r\n }\r\n\r\n it('Search copie le filtre, remet la page à zéro et navigue vers l\\'URL du filtre', () => {\r\n component.ngOnInit();\r\n const loads = countCalls(component.facade.filter, 'triggerSearch');\r\n\r\n component.Search({ Keywords: 'abc', Offset: 50 });\r\n\r\n expect(component.Filter.Keywords).toBe('abc');\r\n expect(component.Filter.Offset).toBe(0);\r\n expect(context.router.navigations.length).toBe(1);\r\n expect(context.router.navigations[0].commands).toEqual([expectations.path]);\r\n expect(context.router.navigations[0].extras?.queryParams).toEqual({ Keywords: 'abc', Offset: 0 });\r\n expect(loads.count).toBe(0);\r\n });\r\n\r\n it('Search charge les données quand l\\'URL porte déjà le filtre', () => {\r\n component.ngOnInit();\r\n const loads = countCalls(component.facade.filter, 'triggerSearch');\r\n\r\n component.Search({ Keywords: 'abc' });\r\n component.Search({ Keywords: 'abc' });\r\n\r\n expect(context.router.navigations.length).toBe(1);\r\n expect(loads.count).toBe(1);\r\n });\r\n\r\n it('Search garde la page demandée sans remise à zéro', () => {\r\n component.ngOnInit();\r\n\r\n component.Search({ Offset: 50 }, false);\r\n\r\n expect(component.Filter.Offset).toBe(50);\r\n });\r\n\r\n it('Search et refresh chargent les données sans naviguer pour un composant d\\'onglet', () => {\r\n component.IsTheMainComponent = false;\r\n component.ngOnInit();\r\n const loads = countCalls(component.facade.filter, 'triggerSearch');\r\n\r\n component.Search({ Keywords: 'abc', Offset: 50 });\r\n expect(loads.count).toBe(1);\r\n expect(component.Filter.Keywords).toBe('abc');\r\n\r\n component.Filter.Offset = 50;\r\n component.refresh();\r\n expect(loads.count).toBe(2);\r\n expect(component.Filter.Offset).toBe(0);\r\n expect(context.router.navigations.length).toBe(0);\r\n });\r\n\r\n it('met à jour la ligne d\\'une entité chargée à sa notification', () => {\r\n context.dataService.searchResult = { Values: [{ Id: 7, Name: 'avant' }], TotalRowCount: 1 };\r\n component.ngOnInit();\r\n component.facade.data.loadData({ Offset: 0, Take: 25 }).subscribe();\r\n context.dataService.details = { Id: 7, Name: 'après' };\r\n\r\n notify(7);\r\n\r\n expect(context.dataService.detailsCalls).toEqual([{ entityKey: expectations.entityKey, id: 7 }]);\r\n expect(component.facade.data.getOriginal(7).Name).toBe('après');\r\n });\r\n\r\n it('ignore la notification d\\'une entité non chargée, ou recharge si loadDataOnNotification', () => {\r\n component.ngOnInit();\r\n const loads = countCalls(component.facade.filter, 'triggerSearch');\r\n\r\n notify(8);\r\n expect(context.dataService.detailsCalls.length).toBe(0);\r\n expect(loads.count).toBe(0);\r\n\r\n component.loadDataOnNotification = true;\r\n notify(8);\r\n expect(context.dataService.detailsCalls.length).toBe(0);\r\n expect(loads.count).toBe(1);\r\n });\r\n\r\n it('ngOnDestroy termine destroy$, se désabonne des notifications et efface le fil d\\'Ariane', () => {\r\n component.ngOnInit();\r\n let emitted = 0;\r\n let completed = false;\r\n component.destroy$.subscribe({ next: () => emitted++, complete: () => completed = true });\r\n\r\n component.ngOnDestroy();\r\n\r\n expect(emitted).toBe(1);\r\n expect(completed).toBe(true);\r\n expect(component.notif.closed).toBe(true);\r\n expect(context.currentBreadcrumb.display).toBe(false);\r\n\r\n notify(7);\r\n expect(context.dataService.detailsCalls.length).toBe(0);\r\n });\r\n });\r\n}\r\n","import { getTestRunner } from './get-test-runner';\r\nimport { GeneratedModuleExpectations } from './interfaces/generated-module-expectations';\r\n\r\n/** Valeurs des propriétés statiques de type chaîne d'une classe de constantes (clés d'entité, permissions). */\r\nfunction getConstants(constants: object): string[] {\r\n return Object.values(constants).filter((value): value is string => typeof value === 'string');\r\n}\r\n\r\n/** Valeurs présentes plusieurs fois dans `values`. */\r\nfunction getDuplicates(values: string[]): string[] {\r\n return values.filter((value, index) => values.indexOf(value) !== index);\r\n}\r\n\r\n/**\r\n * Suite de test standard d'un module généré (dflat -g ts) : cohérence de ses composants, routes,\r\n * sélecteurs, clés d'entité, onglets, éléments de menu et permissions. Chaque test compare à une liste\r\n * vide la liste des éléments en défaut, que l'outil de test affiche en cas d'échec.\r\n *\r\n * @param name Nom du module (ex. System), repris dans le titre de la suite.\r\n * @param module Éléments générés du module.\r\n */\r\nexport function describeGeneratedModule(name: string, module: GeneratedModuleExpectations): void {\r\n const { describe, it, expect } = getTestRunner();\r\n\r\n describe(`Module ${name} (éléments générés)`, () => {\r\n const paths = module.routes.map(route => route.path ?? '');\r\n\r\n it('donne une route à chaque composant généré', () => {\r\n const missing = module.components\r\n .filter(component => !module.routes.some(route => route.component === component))\r\n .map(component => component.name);\r\n expect(missing).toEqual([]);\r\n });\r\n\r\n it('n\\'a que des routes de composants générés, de chemins distincts', () => {\r\n const unknown = module.routes\r\n .filter(route => !module.components.some(component => component === route.component))\r\n .map(route => route.path);\r\n expect(unknown).toEqual([]);\r\n expect(getDuplicates(paths)).toEqual([]);\r\n });\r\n\r\n it('a des clés d\\'entité uniques, dont celles des routes', () => {\r\n const keys = getConstants(module.entityKeys);\r\n expect(getDuplicates(keys)).toEqual([]);\r\n expect(paths.filter(path => !keys.includes(path))).toEqual([]);\r\n });\r\n\r\n it('donne à chaque sélecteur d\\'entité le composant de la route de sa clé', () => {\r\n const mismatched = module.selectors\r\n .filter(selector => !module.routes.some(route => route.path === selector.key && route.component === selector.component))\r\n .map(selector => selector.key);\r\n expect(mismatched).toEqual([]);\r\n });\r\n\r\n if (module.sectionProvider) {\r\n const provider = module.sectionProvider;\r\n\r\n if (module.sections) {\r\n const expected = module.sections;\r\n\r\n it('déclare les onglets attendus de chaque entité, dans l\\'ordre', () => {\r\n const declared: { [entityKey: string]: string[] } = {};\r\n provider.getEntityKeys().forEach(key => declared[key] = provider.getSections(key).map(section => section.title));\r\n expect(declared).toEqual(expected);\r\n });\r\n }\r\n\r\n it('ne déclare d\\'onglets que pour des entités du module, vers des composants générés du module', () => {\r\n const keys = getConstants(module.entityKeys);\r\n expect(provider.getEntityKeys().filter(key => !keys.includes(key))).toEqual([]);\r\n\r\n const unknown = provider.getEntityKeys()\r\n .flatMap(key => provider.getSections(key).map(section => ({ key, section })))\r\n .filter(({ section }) => !module.components.some(component => component === section.component))\r\n .map(({ key, section }) => `${key} : ${section.title}`);\r\n expect(unknown).toEqual([]);\r\n });\r\n\r\n it('ne déclare aucun onglet pour une entité sans onglet', () => {\r\n expect(provider.getSections('')).toEqual([]);\r\n });\r\n }\r\n\r\n it('fait pointer chaque élément de menu généré vers une route existante', () => {\r\n const links = paths.map(path => module.getLink(path));\r\n const orphans = module.menuItems.filter(item => !links.includes(item.link ?? '')).map(item => item.link);\r\n expect(orphans).toEqual([]);\r\n });\r\n\r\n if (module.permissions) {\r\n const permissions = getConstants(module.permissions);\r\n\r\n it('donne à chaque élément de menu généré une permission du module', () => {\r\n const ungranted = module.menuItems.filter(item => !permissions.includes(item.permissionKey ?? '')).map(item => item.link);\r\n expect(ungranted).toEqual([]);\r\n });\r\n }\r\n });\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"dflat-core-web-core-ux-testing.mjs","names":[],"sources":["../../core-ux/testing/src/lib/doubles/data-service-double.ts","../../core-ux/testing/src/lib/doubles/entity-facade-registry-spy.ts","../../core-ux/testing/src/lib/doubles/router-double.ts","../../core-ux/testing/src/lib/base-component-test-context.ts","../../core-ux/testing/src/lib/count-calls.ts","../../core-ux/testing/src/lib/get-test-runner.ts","../../core-ux/testing/src/lib/describe-base-component.ts","../../core-ux/testing/src/lib/describe-generated-module.ts"],"sourcesContent":["import { DataService } from '@dflat-core/web/core-data';\r\nimport {\r\n ActionDescriptor,\r\n ColumnDescriptor,\r\n EntityViewModel,\r\n EntityViewModelWithFields,\r\n FilterDescriptor,\r\n FilterViewModel,\r\n PagedList\r\n} from '@dflat-core/web/core-model';\r\nimport { Observable, of } from 'rxjs';\r\n\r\n/**\r\n * Doublure de DataService : aucune requête HTTP. Fournit les données d'initialisation d'une\r\n * façade (colonnes, filtre vide, formulaire, actions) et enregistre les recherches et lectures\r\n * de détail demandées par le composant testé.\r\n */\r\nexport class DataServiceDouble {\r\n /** Recherches demandées (search), dans l'ordre. */\r\n readonly searchCalls: { entityKey: string; filter: FilterViewModel }[] = [];\r\n\r\n /** Lectures de détail demandées (getDetails), dans l'ordre. */\r\n readonly detailsCalls: { entityKey: string; id: number }[] = [];\r\n\r\n /** Nombre de lectures des colonnes de la grille (getViewColumns). */\r\n columnCalls = 0;\r\n\r\n /** Entités dont le cache d'initialisation a été vidé (clearCached), dans l'ordre. */\r\n readonly clearedCaches: string[] = [];\r\n\r\n /** Nombre de lectures du formulaire (getEntityViewModel). */\r\n viewModelCalls = 0;\r\n\r\n /** Résultat renvoyé par search. */\r\n searchResult: PagedList<EntityViewModel> = { Values: [], TotalRowCount: 0 };\r\n\r\n /** Entité renvoyée par getDetails. */\r\n details: EntityViewModel = {};\r\n\r\n /** Enregistre la recherche et renvoie searchResult. */\r\n search<TData>(entityKey: string, filter: FilterViewModel): Observable<PagedList<TData>> {\r\n this.searchCalls.push({ entityKey, filter });\r\n return of(this.searchResult as PagedList<TData>);\r\n }\r\n\r\n /** Enregistre la lecture et renvoie details. */\r\n getDetails<TData>(entityKey: string, id: number): Observable<TData> {\r\n this.detailsCalls.push({ entityKey, id });\r\n return of(this.details as TData);\r\n }\r\n\r\n /** Paramètres d'URL d'un filtre : copie du filtre, sans mise en forme. */\r\n getFormattedParams(params: object): object {\r\n return { ...params };\r\n }\r\n\r\n /** Colonnes de la grille : aucune. */\r\n getViewColumns(): Observable<ColumnDescriptor[]> {\r\n this.columnCalls++;\r\n return of([]);\r\n }\r\n\r\n /** Colonnes de grille des propriétés données : aucune. */\r\n getGridColumnsFor(): Observable<ColumnDescriptor[]> {\r\n return of([]);\r\n }\r\n\r\n /** Critères du filtre : aucun. */\r\n getViewFilterDescriptors(): Observable<FilterDescriptor[]> {\r\n return of([]);\r\n }\r\n\r\n /** Filtre vide : première page de 25 lignes. */\r\n getEmptyFilter<TFilter>(): Observable<TFilter> {\r\n return of({ Offset: 0, Take: 25 } as TFilter);\r\n }\r\n\r\n /** Formulaire vide, sans champ. */\r\n getEntityViewModel<TData>(): Observable<EntityViewModelWithFields<TData>> {\r\n this.viewModelCalls++;\r\n return of({} as EntityViewModelWithFields<TData>);\r\n }\r\n\r\n /** Enregistre l'entité dont le cache d'initialisation est vidé. */\r\n clearCached(entityKey?: string): void {\r\n this.clearedCaches.push(entityKey);\r\n }\r\n\r\n /** Actions étendues : aucune. */\r\n getExtendedActions(): Observable<ActionDescriptor[]> {\r\n return of([]);\r\n }\r\n\r\n /** Valeur d'initialisation calculée par le front : calculée à chaque appel, sans cache. */\r\n getCachedValue<T>(entityKey: string, name: string, factory: () => T): Observable<T> {\r\n return of(factory());\r\n }\r\n\r\n /** La doublure, vue comme le DataService qu'elle remplace. */\r\n asDataService(): DataService {\r\n return this as unknown as DataService;\r\n }\r\n}\r\n","import { EntityViewModel } from '@dflat-core/web/core-model';\r\nimport { EntityFacade, EntityFacadeRegistryService } from '@dflat-core/web/core-ux';\r\nimport { Guid } from 'guid-typescript';\r\n\r\n/** Registre de façades du socle (vraies façades), qui enregistre les façades demandées. */\r\nexport class EntityFacadeRegistrySpy extends EntityFacadeRegistryService {\r\n /** Façades demandées (getFacade), dans l'ordre : clé d'entité, identifiant et façade renvoyée. */\r\n readonly requests: { key: string; id: Guid; facade: EntityFacade<EntityViewModel> }[] = [];\r\n\r\n /** Enregistre la demande et renvoie la façade du registre. */\r\n override getFacade<TData extends EntityViewModel>(key: string, id: Guid): EntityFacade<TData> {\r\n const facade = super.getFacade<TData>(key, id);\r\n this.requests.push({ key, id, facade });\r\n return facade;\r\n }\r\n}\r\n","import { Event, NavigationExtras, Router, UrlCreationOptions, UrlTree } from '@angular/router';\r\nimport { Subject } from 'rxjs';\r\n\r\n/**\r\n * Doublure de Router : URL courante, construction d'URL (chemin et paramètres) et navigations\r\n * enregistrées. Une navigation réussit toujours et devient l'URL courante.\r\n */\r\nexport class RouterDouble {\r\n /** URL courante. */\r\n url: string;\r\n\r\n /** Événements du routeur, émis par le test (NavigationStart...). */\r\n readonly events = new Subject<Event>();\r\n\r\n /** Navigations demandées (navigate), dans l'ordre. */\r\n readonly navigations: { commands: unknown[]; extras?: NavigationExtras }[] = [];\r\n\r\n constructor(url: string) {\r\n this.url = url;\r\n }\r\n\r\n /** URL formée des segments `commands` et des paramètres `extras.queryParams`. */\r\n createUrlTree(commands: unknown[], extras?: UrlCreationOptions): UrlTree {\r\n const url = RouterDouble.format(commands, extras?.queryParams);\r\n return { toString: () => url } as UrlTree;\r\n }\r\n\r\n /** Enregistre la navigation, qui devient l'URL courante. */\r\n navigate(commands: unknown[], extras?: NavigationExtras): Promise<boolean> {\r\n this.navigations.push({ commands, extras });\r\n this.url = RouterDouble.format(commands, extras?.queryParams);\r\n return Promise.resolve(true);\r\n }\r\n\r\n /** La doublure, vue comme le Router qu'elle remplace. */\r\n asRouter(): Router {\r\n return this as unknown as Router;\r\n }\r\n\r\n /** URL d'un chemin et de ses paramètres. */\r\n private static format(commands: unknown[], queryParams?: object | null): string {\r\n const path = commands.join('/');\r\n const query = Object.entries(queryParams ?? {})\r\n .map(([key, value]) => `${key}=${encodeURIComponent(String(value))}`)\r\n .join('&');\r\n return query ? `${path}?${query}` : path;\r\n }\r\n}\r\n","import { Title } from '@angular/platform-browser';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { BreadcrumbService, NotificationMqService } from '@dflat-core/web/core-services';\r\nimport { ApplicationService, RootDeps } from '@dflat-core/web/core-ux';\r\nimport { of } from 'rxjs';\r\nimport { DataServiceDouble } from './doubles/data-service-double';\r\nimport { EntityFacadeRegistrySpy } from './doubles/entity-facade-registry-spy';\r\nimport { RouterDouble } from './doubles/router-double';\r\nimport { BreadcrumbData } from './interfaces/breadcrumb-data';\r\n\r\n/**\r\n * Services donnés à un composant dérivé de BaseComponent pendant un test : vraies classes du\r\n * socle quand elles s'instancient sans dépendance (ApplicationService, registre de façades et\r\n * façades, fil d'Ariane, file de messages), doublures pour le service de données, le routeur et\r\n * la route. Les services que BaseComponent n'utilise pas (authentification, fenêtres modales,\r\n * alertes, mise en page...) ne sont pas fournis.\r\n */\r\nexport class BaseComponentTestContext {\r\n /** Doublure du service de données. */\r\n readonly dataService = new DataServiceDouble();\r\n\r\n /** Doublure du routeur. */\r\n readonly router: RouterDouble;\r\n\r\n /** Route active, sans paramètre. */\r\n readonly route: ActivatedRoute;\r\n\r\n /** Fil d'Ariane du socle. */\r\n readonly breadcrumb: BreadcrumbService;\r\n\r\n /** File de messages (notifications d'entité) du socle. */\r\n readonly notifications = new NotificationMqService();\r\n\r\n /** Registre de façades du socle, qui enregistre les façades demandées. */\r\n readonly registry: EntityFacadeRegistrySpy;\r\n\r\n /** ApplicationService du socle, construit sur les services ci-dessus. */\r\n readonly app: ApplicationService;\r\n\r\n /**\r\n * @param url URL courante du routeur.\r\n * @param title Service du titre de la page (TestBed.inject(Title)), utilisé par le fil d'Ariane.\r\n */\r\n constructor(url: string, title: Title) {\r\n this.router = new RouterDouble(url);\r\n this.route = { snapshot: { params: {}, queryParams: {} }, params: of({}), queryParams: of({}) } as unknown as ActivatedRoute;\r\n this.breadcrumb = new BreadcrumbService(title);\r\n\r\n const deps = {\r\n nav: { route: this.route, router: this.router.asRouter(), location: undefined },\r\n ui: { layout: undefined, breadcrumb: this.breadcrumb, toastr: undefined, alert: undefined, modal: undefined },\r\n data: { data: this.dataService.asDataService(), filter: undefined, selector: undefined },\r\n security: { auth: undefined, user: undefined },\r\n selection: undefined,\r\n test: undefined\r\n } as unknown as RootDeps;\r\n\r\n this.registry = new EntityFacadeRegistrySpy(deps);\r\n this.app = new ApplicationService(deps, this.notifications, undefined, undefined, undefined, this.registry);\r\n }\r\n\r\n /** Fil d'Ariane courant (dernière valeur publiée). */\r\n get currentBreadcrumb(): BreadcrumbData {\r\n let current: BreadcrumbData;\r\n this.breadcrumb.getCurrent().subscribe((data: BreadcrumbData) => current = data).unsubscribe();\r\n return current;\r\n }\r\n}\r\n","import { CallCounter } from './interfaces/call-counter';\r\n\r\n/**\r\n * Compte les appels de la méthode `method` de `target`, qui reste exécutée : équivalent, sans\r\n * outil de test, d'un espion transparent.\r\n */\r\nexport function countCalls<T extends object, K extends keyof T>(target: T, method: K): CallCounter {\r\n const original = target[method] as unknown as (...args: unknown[]) => unknown;\r\n const counter: CallCounter = { count: 0 };\r\n target[method] = ((...args: unknown[]) => {\r\n counter.count++;\r\n return original.apply(target, args);\r\n }) as unknown as T[K];\r\n return counter;\r\n}\r\n","import { TestRunner } from './interfaces/test-runner';\r\n\r\n/**\r\n * Fonctions globales de l'outil de test (describe, it, beforeEach, expect), lues sur globalThis\r\n * pour ne dépendre d'aucun outil ni de ses types.\r\n */\r\nexport function getTestRunner(): TestRunner {\r\n const runner = globalThis as unknown as Partial<TestRunner>;\r\n if (typeof runner.describe !== 'function' || typeof runner.it !== 'function'\r\n || typeof runner.beforeEach !== 'function' || typeof runner.expect !== 'function')\r\n throw new Error('Suites de test Dflat : describe, it, beforeEach et expect doivent être des fonctions globales (Vitest : option globals).');\r\n return runner as TestRunner;\r\n}\r\n","import { TestBed } from '@angular/core/testing';\r\nimport { Title } from '@angular/platform-browser';\r\nimport { Utilities } from '@dflat-core/web/core';\r\nimport { EntityViewModel, FilterViewModel, Notification } from '@dflat-core/web/core-model';\r\nimport { BaseComponent, EntitySections } from '@dflat-core/web/core-ux';\r\nimport { BaseComponentTestContext } from './base-component-test-context';\r\nimport { countCalls } from './count-calls';\r\nimport { getTestRunner } from './get-test-runner';\r\nimport { BaseComponentExpectations } from './interfaces/base-component-expectations';\r\nimport { BaseComponentFactory } from './interfaces/base-component-factory';\r\n\r\n/**\r\n * Suite de test standard d'un composant dérivé de BaseComponent : vérifie, sans rendre son\r\n * gabarit, le contrat de BaseComponent (création, clé d'entité, lien, titre, permission, façade,\r\n * ngOnInit, demande des onglets, Search / refresh, notifications, ngOnDestroy). À appeler au premier niveau d'un\r\n * fichier de test :\r\n * `describeBaseComponent('CountryComponent', (app, route) => new TestCountryComponent(app, route), { ... })`.\r\n * La suite n'utilise que les fonctions globales de l'outil de test (describe, it, beforeEach,\r\n * expect) et TestBed.\r\n *\r\n * @param name Nom du composant, repris dans le titre de la suite.\r\n * @param factory Fabrique du composant, appelée dans un contexte d'injection avant chaque test.\r\n * @param expectations Valeurs attendues du composant.\r\n */\r\nexport function describeBaseComponent<TFilter extends FilterViewModel, TData extends EntityViewModel>(\r\n name: string, factory: BaseComponentFactory<TFilter, TData>, expectations: BaseComponentExpectations): void {\r\n const { describe, it, beforeEach, expect } = getTestRunner();\r\n\r\n describe(`${name} (contrat de BaseComponent)`, () => {\r\n let context: BaseComponentTestContext;\r\n let component: BaseComponent<TFilter, TData>;\r\n\r\n /** Publie la notification de modification de l'entité `entityId` sur le canal de l'entité du composant. */\r\n const notify = (entityId: number): void =>\r\n context.notifications.publish(new Notification({ entityType: Utilities.GetChannel(expectations.entityKey), entityId }));\r\n\r\n beforeEach(() => {\r\n TestBed.configureTestingModule({ providers: expectations.providers ?? [] });\r\n context = new BaseComponentTestContext(expectations.path, TestBed.inject(Title));\r\n component = TestBed.runInInjectionContext(() => factory(context.app, context.route));\r\n });\r\n\r\n it('est créé dans un contexte d\\'injection', () => {\r\n expect(component).toBeTruthy();\r\n expect(component.destroy$.closed).toBe(false);\r\n });\r\n\r\n it('expose la clé d\\'entité, le lien, le titre et la permission attendus', () => {\r\n expect(component.getEntityKey()).toBe(expectations.entityKey);\r\n expect(component.getPath()).toBe(expectations.path);\r\n expect(component.getTitle()).toBe(expectations.title);\r\n expect(component.PermissionKey).toBe(expectations.permissionKey);\r\n expect(component.layoutKey).toBe(expectations.entityKey);\r\n });\r\n\r\n it('demande sa façade au registre avec la clé de l\\'entité', () => {\r\n expect(context.registry.requests.length).toBe(1);\r\n expect(context.registry.requests[0].key).toBe(expectations.entityKey);\r\n expect(context.registry.requests[0].facade).toBe(component.facade);\r\n expect(component.facade.actions.handler.path).toBe(expectations.path);\r\n });\r\n\r\n it('ngOnInit publie le fil d\\'Ariane du composant principal', () => {\r\n component.ngOnInit();\r\n\r\n expect(component.displayComponent).toBe(true);\r\n expect(component.actionTitle).toBe(expectations.title);\r\n expect(context.currentBreadcrumb).toEqual({\r\n description: expectations.title,\r\n display: true,\r\n header: expectations.title,\r\n levels: [{ icon: component.getIcon(), link: [expectations.path], title: expectations.title }]\r\n });\r\n });\r\n\r\n it('ngOnInit ne publie pas de fil d\\'Ariane pour un composant d\\'onglet', () => {\r\n component.IsTheMainComponent = false;\r\n component.ngOnInit();\r\n\r\n expect(context.currentBreadcrumb.display).toBe(false);\r\n });\r\n\r\n it('ngOnInit branche le chargement sur dataService.search avec la clé de l\\'entité', () => {\r\n context.dataService.searchResult = { Values: [{ Id: 7, Name: 'avant' }], TotalRowCount: 1 };\r\n component.ngOnInit();\r\n\r\n const filter: FilterViewModel = { Offset: 0, Take: 25 };\r\n let total: number | undefined;\r\n component.facade.data.loadData(filter).subscribe(result => total = result.TotalRowCount);\r\n\r\n expect(context.dataService.searchCalls).toEqual([{ entityKey: expectations.entityKey, filter }]);\r\n expect(total).toBe(1);\r\n expect(component.facade.data.getOriginal(7).Name).toBe('avant');\r\n });\r\n\r\n it('ngOnInit s\\'abonne une seule fois aux notifications de l\\'entité', () => {\r\n component.ngOnInit();\r\n const first = component.notif;\r\n component.ngOnInit();\r\n\r\n expect(first.closed).toBe(true);\r\n expect(component.notif.closed).toBe(false);\r\n });\r\n\r\n if (expectations.sections) {\r\n it('ngOnInit enregistre les onglets attendus', async () => {\r\n component.ngOnInit();\r\n // Les onglets générés sont enregistrés dans une microtâche, après ceux du composant spécifique.\r\n await Promise.resolve();\r\n await Promise.resolve();\r\n\r\n let sections: (string | undefined)[] = [];\r\n component.facade.sections.sections$.subscribe(list => sections = list.map(s => s.Name)).unsubscribe();\r\n expect(sections).toEqual(expectations.sections);\r\n });\r\n }\r\n\r\n if (expectations.requestsSections !== undefined) {\r\n const title = expectations.requestsSections\r\n ? 'ngOnInit demande les onglets de l\\'entité au registre du socle (EntitySections)'\r\n : 'ngOnInit ne demande pas d\\'onglet au registre du socle (EntitySections)';\r\n\r\n it(title, async () => {\r\n const original = EntitySections.registerSections;\r\n const requests: { entityKey: string; facade: unknown }[] = [];\r\n EntitySections.registerSections = ((entityKey: string, facade: unknown) => {\r\n requests.push({ entityKey, facade });\r\n }) as typeof EntitySections.registerSections;\r\n try {\r\n component.ngOnInit();\r\n // Les onglets sont demandés dans une microtâche, après ceux du composant spécifique.\r\n await Promise.resolve();\r\n await Promise.resolve();\r\n }\r\n finally {\r\n EntitySections.registerSections = original;\r\n }\r\n\r\n expect(requests.length).toBe(expectations.requestsSections ? 1 : 0);\r\n if (expectations.requestsSections) {\r\n expect(requests[0].entityKey).toBe(expectations.entityKey);\r\n expect(requests[0].facade).toBe(component.facade);\r\n }\r\n });\r\n }\r\n\r\n it('Search copie le filtre, remet la page à zéro et navigue vers l\\'URL du filtre', () => {\r\n component.ngOnInit();\r\n const loads = countCalls(component.facade.filter, 'triggerSearch');\r\n\r\n component.Search({ Keywords: 'abc', Offset: 50 });\r\n\r\n expect(component.Filter.Keywords).toBe('abc');\r\n expect(component.Filter.Offset).toBe(0);\r\n expect(context.router.navigations.length).toBe(1);\r\n expect(context.router.navigations[0].commands).toEqual([expectations.path]);\r\n expect(context.router.navigations[0].extras?.queryParams).toEqual({ Keywords: 'abc', Offset: 0 });\r\n expect(loads.count).toBe(0);\r\n });\r\n\r\n it('Search charge les données quand l\\'URL porte déjà le filtre', () => {\r\n component.ngOnInit();\r\n const loads = countCalls(component.facade.filter, 'triggerSearch');\r\n\r\n component.Search({ Keywords: 'abc' });\r\n component.Search({ Keywords: 'abc' });\r\n\r\n expect(context.router.navigations.length).toBe(1);\r\n expect(loads.count).toBe(1);\r\n });\r\n\r\n it('Search garde la page demandée sans remise à zéro', () => {\r\n component.ngOnInit();\r\n\r\n component.Search({ Offset: 50 }, false);\r\n\r\n expect(component.Filter.Offset).toBe(50);\r\n });\r\n\r\n it('Search et refresh chargent les données sans naviguer pour un composant d\\'onglet', () => {\r\n component.IsTheMainComponent = false;\r\n component.ngOnInit();\r\n const loads = countCalls(component.facade.filter, 'triggerSearch');\r\n\r\n component.Search({ Keywords: 'abc', Offset: 50 });\r\n expect(loads.count).toBe(1);\r\n expect(component.Filter.Keywords).toBe('abc');\r\n\r\n component.Filter.Offset = 50;\r\n component.refresh();\r\n expect(loads.count).toBe(2);\r\n expect(component.Filter.Offset).toBe(0);\r\n expect(context.router.navigations.length).toBe(0);\r\n });\r\n\r\n it('met à jour la ligne d\\'une entité chargée à sa notification', () => {\r\n context.dataService.searchResult = { Values: [{ Id: 7, Name: 'avant' }], TotalRowCount: 1 };\r\n component.ngOnInit();\r\n component.facade.data.loadData({ Offset: 0, Take: 25 }).subscribe();\r\n context.dataService.details = { Id: 7, Name: 'après' };\r\n\r\n notify(7);\r\n\r\n expect(context.dataService.detailsCalls).toEqual([{ entityKey: expectations.entityKey, id: 7 }]);\r\n expect(component.facade.data.getOriginal(7).Name).toBe('après');\r\n });\r\n\r\n it('ignore la notification d\\'une entité non chargée, ou recharge si loadDataOnNotification', () => {\r\n component.ngOnInit();\r\n const loads = countCalls(component.facade.filter, 'triggerSearch');\r\n\r\n notify(8);\r\n expect(context.dataService.detailsCalls.length).toBe(0);\r\n expect(loads.count).toBe(0);\r\n\r\n component.loadDataOnNotification = true;\r\n notify(8);\r\n expect(context.dataService.detailsCalls.length).toBe(0);\r\n expect(loads.count).toBe(1);\r\n });\r\n\r\n it('ngOnDestroy termine destroy$, se désabonne des notifications et efface le fil d\\'Ariane', () => {\r\n component.ngOnInit();\r\n let emitted = 0;\r\n let completed = false;\r\n component.destroy$.subscribe({ next: () => emitted++, complete: () => completed = true });\r\n\r\n component.ngOnDestroy();\r\n\r\n expect(emitted).toBe(1);\r\n expect(completed).toBe(true);\r\n expect(component.notif.closed).toBe(true);\r\n expect(context.currentBreadcrumb.display).toBe(false);\r\n\r\n notify(7);\r\n expect(context.dataService.detailsCalls.length).toBe(0);\r\n });\r\n });\r\n}\r\n","import { getTestRunner } from './get-test-runner';\r\nimport { GeneratedModuleExpectations } from './interfaces/generated-module-expectations';\r\n\r\n/** Valeurs des propriétés statiques de type chaîne d'une classe de constantes (clés d'entité, permissions). */\r\nfunction getConstants(constants: object): string[] {\r\n return Object.values(constants).filter((value): value is string => typeof value === 'string');\r\n}\r\n\r\n/** Valeurs présentes plusieurs fois dans `values`. */\r\nfunction getDuplicates(values: string[]): string[] {\r\n return values.filter((value, index) => values.indexOf(value) !== index);\r\n}\r\n\r\n/**\r\n * Suite de test standard d'un module généré (dflat -g ts) : cohérence de ses composants, routes,\r\n * sélecteurs, clés d'entité, onglets, éléments de menu et permissions. Chaque test compare à une liste\r\n * vide la liste des éléments en défaut, que l'outil de test affiche en cas d'échec.\r\n *\r\n * @param name Nom du module (ex. System), repris dans le titre de la suite.\r\n * @param module Éléments générés du module.\r\n */\r\nexport function describeGeneratedModule(name: string, module: GeneratedModuleExpectations): void {\r\n const { describe, it, expect } = getTestRunner();\r\n\r\n describe(`Module ${name} (éléments générés)`, () => {\r\n const paths = module.routes.map(route => route.path ?? '');\r\n\r\n it('donne une route à chaque composant généré', () => {\r\n const missing = module.components\r\n .filter(component => !module.routes.some(route => route.component === component))\r\n .map(component => component.name);\r\n expect(missing).toEqual([]);\r\n });\r\n\r\n it('n\\'a que des routes de composants générés, de chemins distincts', () => {\r\n const unknown = module.routes\r\n .filter(route => !module.components.some(component => component === route.component))\r\n .map(route => route.path);\r\n expect(unknown).toEqual([]);\r\n expect(getDuplicates(paths)).toEqual([]);\r\n });\r\n\r\n it('a des clés d\\'entité uniques, dont celles des routes', () => {\r\n const keys = getConstants(module.entityKeys);\r\n expect(getDuplicates(keys)).toEqual([]);\r\n expect(paths.filter(path => !keys.includes(path))).toEqual([]);\r\n });\r\n\r\n it('donne à chaque sélecteur d\\'entité le composant de la route de sa clé', () => {\r\n const mismatched = module.selectors\r\n .filter(selector => !module.routes.some(route => route.path === selector.key && route.component === selector.component))\r\n .map(selector => selector.key);\r\n expect(mismatched).toEqual([]);\r\n });\r\n\r\n if (module.sectionProvider) {\r\n const provider = module.sectionProvider;\r\n\r\n if (module.sections) {\r\n const expected = module.sections;\r\n\r\n it('déclare les onglets attendus de chaque entité, dans l\\'ordre', () => {\r\n const declared: { [entityKey: string]: string[] } = {};\r\n provider.getEntityKeys().forEach(key => declared[key] = provider.getSections(key).map(section => section.title));\r\n expect(declared).toEqual(expected);\r\n });\r\n }\r\n\r\n it('ne déclare d\\'onglets que pour des entités du module, vers des composants générés du module', () => {\r\n const keys = getConstants(module.entityKeys);\r\n expect(provider.getEntityKeys().filter(key => !keys.includes(key))).toEqual([]);\r\n\r\n const unknown = provider.getEntityKeys()\r\n .flatMap(key => provider.getSections(key).map(section => ({ key, section })))\r\n .filter(({ section }) => !module.components.some(component => component === section.component))\r\n .map(({ key, section }) => `${key} : ${section.title}`);\r\n expect(unknown).toEqual([]);\r\n });\r\n\r\n it('ne déclare aucun onglet pour une entité sans onglet', () => {\r\n expect(provider.getSections('')).toEqual([]);\r\n });\r\n }\r\n\r\n it('fait pointer chaque élément de menu généré vers une route existante', () => {\r\n const links = paths.map(path => module.getLink(path));\r\n const orphans = module.menuItems.filter(item => !links.includes(item.link ?? '')).map(item => item.link);\r\n expect(orphans).toEqual([]);\r\n });\r\n\r\n if (module.permissions) {\r\n const permissions = getConstants(module.permissions);\r\n\r\n it('donne à chaque élément de menu généré une permission du module', () => {\r\n const ungranted = module.menuItems.filter(item => !permissions.includes(item.permissionKey ?? '')).map(item => item.link);\r\n expect(ungranted).toEqual([]);\r\n });\r\n }\r\n });\r\n}\r\n"],"mappings":"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"}