@bravobit/bb-foundation 0.21.1 → 0.21.2

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 (462) hide show
  1. package/README.md +47 -47
  2. package/auth/index.d.ts +5 -5
  3. package/auth/lib/auth.interceptor.d.ts +21 -21
  4. package/auth/lib/auth.module.d.ts +15 -15
  5. package/auth/lib/auth.service.d.ts +59 -59
  6. package/auth/lib/auth.session.d.ts +34 -34
  7. package/auth/lib/directives/authenticated.directive.d.ts +14 -14
  8. package/auth/lib/directives/permission.directive.d.ts +24 -24
  9. package/auth/lib/directives/role.directive.d.ts +16 -16
  10. package/auth/lib/guards/anonymous.guard.d.ts +11 -11
  11. package/auth/lib/guards/authenticated.guard.d.ts +11 -11
  12. package/auth/lib/helpers/jwt.helper.d.ts +8 -8
  13. package/auth/lib/helpers/mapper.helper.d.ts +23 -23
  14. package/auth/lib/interfaces/config.interface.d.ts +12 -12
  15. package/auth/lib/interfaces/mapper.interface.d.ts +19 -19
  16. package/auth/lib/interfaces/provider.interface.d.ts +16 -16
  17. package/auth/lib/interfaces/token.interface.d.ts +11 -11
  18. package/auth/lib/permissions.service.d.ts +14 -14
  19. package/auth/lib/providers/email.provider.d.ts +15 -15
  20. package/auth/lib/providers/verify.provider.d.ts +13 -13
  21. package/auth/lib/tokens/use-authorization.token.d.ts +2 -2
  22. package/auth/public_api.d.ts +18 -18
  23. package/collections/index.d.ts +5 -5
  24. package/collections/lib/collection.d.ts +42 -43
  25. package/collections/lib/collections.module.d.ts +10 -10
  26. package/collections/lib/components/collections-pager/collections-pager.component.d.ts +34 -34
  27. package/collections/lib/components/collections-viewer/collections-viewer.component.d.ts +12 -12
  28. package/collections/lib/components/collections.directive.d.ts +17 -17
  29. package/collections/lib/interfaces/collection.interface.d.ts +27 -26
  30. package/collections/lib/providers/api-collection.provider.d.ts +18 -19
  31. package/collections/lib/providers/collection.provider.d.ts +6 -6
  32. package/collections/lib/providers/local-collection.provider.d.ts +8 -8
  33. package/collections/public_api.d.ts +9 -9
  34. package/controls/index.d.ts +5 -5
  35. package/controls/lib/checkbox/checkbox/checkbox.component.d.ts +47 -47
  36. package/controls/lib/checkbox/checkbox-group/checkbox-group.component.d.ts +22 -22
  37. package/controls/lib/checkbox/checkbox.module.d.ts +9 -9
  38. package/controls/lib/controls.module.d.ts +7 -7
  39. package/controls/public_api.d.ts +4 -4
  40. package/dashboard/index.d.ts +5 -5
  41. package/dashboard/lib/dashboard/dashboard.component.d.ts +19 -19
  42. package/dashboard/lib/dashboard-header/dashboard-header.component.d.ts +11 -11
  43. package/dashboard/lib/dashboard-menu/dashboard-menu.component.d.ts +9 -9
  44. package/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.d.ts +11 -11
  45. package/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.d.ts +21 -21
  46. package/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.d.ts +27 -27
  47. package/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.d.ts +16 -16
  48. package/dashboard/lib/dashboard.module.d.ts +16 -16
  49. package/dashboard/public_api.d.ts +8 -8
  50. package/dialog/index.d.ts +5 -5
  51. package/dialog/lib/dialog-actions/dialog-actions.component.d.ts +5 -5
  52. package/dialog/lib/dialog-confirm/dialog-confirm.component.d.ts +16 -16
  53. package/dialog/lib/dialog-container/dialog-container.component.d.ts +24 -24
  54. package/dialog/lib/dialog-header/dialog-header.component.d.ts +9 -9
  55. package/dialog/lib/dialog-link/dialog-link.component.d.ts +5 -5
  56. package/dialog/lib/dialog-modal/dialog-modal.component.d.ts +12 -12
  57. package/dialog/lib/dialog-overlay/dialog-overlay.component.d.ts +22 -22
  58. package/dialog/lib/dialog.injector.d.ts +8 -8
  59. package/dialog/lib/dialog.insertion.d.ts +8 -8
  60. package/dialog/lib/dialog.interfaces.d.ts +3 -3
  61. package/dialog/lib/dialog.module.d.ts +19 -19
  62. package/dialog/lib/dialog.ref.d.ts +8 -8
  63. package/dialog/lib/dialog.service.d.ts +19 -19
  64. package/dialog/public_api.d.ts +9 -9
  65. package/elements/index.d.ts +5 -5
  66. package/elements/lib/avatar/avatar.component.d.ts +25 -25
  67. package/elements/lib/button/button.component.d.ts +23 -23
  68. package/elements/lib/checkbox/checkbox.component.d.ts +27 -27
  69. package/elements/lib/date-picker/date-picker.component.d.ts +69 -69
  70. package/elements/lib/directives/addon.directive.d.ts +9 -9
  71. package/elements/lib/directives/autosize.directive.d.ts +18 -18
  72. package/elements/lib/directives/focus-trap.directive.d.ts +17 -17
  73. package/elements/lib/directives/focus.directive.d.ts +14 -14
  74. package/elements/lib/directives/form-submit.directive.d.ts +17 -17
  75. package/elements/lib/directives/input.directive.d.ts +38 -38
  76. package/elements/lib/directives/template.directive.d.ts +10 -10
  77. package/elements/lib/dropdown/dropdown.component.d.ts +21 -21
  78. package/elements/lib/elements.interfaces.d.ts +25 -25
  79. package/elements/lib/elements.module.d.ts +116 -116
  80. package/elements/lib/file-picker/file-picker.component.d.ts +49 -49
  81. package/elements/lib/form-control/form-control.component.d.ts +21 -21
  82. package/elements/lib/form-error/form-error.component.d.ts +29 -29
  83. package/elements/lib/form-group/form-group.component.d.ts +10 -10
  84. package/elements/lib/icon/icon.component.d.ts +22 -22
  85. package/elements/lib/image-picker/image-picker.component.d.ts +38 -38
  86. package/elements/lib/pipes/file-image.pipe.d.ts +13 -13
  87. package/elements/lib/pipes/file-size.pipe.d.ts +8 -8
  88. package/elements/lib/pipes/relative-time.pipe.d.ts +19 -19
  89. package/elements/lib/spinner/spinner.component.d.ts +12 -12
  90. package/elements/lib/tag/tag.component.d.ts +7 -7
  91. package/elements/public_api.d.ts +25 -25
  92. package/esm2020/auth/bravobit-bb-foundation-auth.mjs +4 -4
  93. package/esm2020/auth/lib/auth.interceptor.mjs +93 -93
  94. package/esm2020/auth/lib/auth.module.mjs +54 -54
  95. package/esm2020/auth/lib/auth.service.mjs +281 -281
  96. package/esm2020/auth/lib/auth.session.mjs +131 -131
  97. package/esm2020/auth/lib/directives/authenticated.directive.mjs +31 -31
  98. package/esm2020/auth/lib/directives/permission.directive.mjs +80 -80
  99. package/esm2020/auth/lib/directives/role.directive.mjs +37 -37
  100. package/esm2020/auth/lib/guards/anonymous.guard.mjs +34 -34
  101. package/esm2020/auth/lib/guards/authenticated.guard.mjs +35 -35
  102. package/esm2020/auth/lib/helpers/jwt.helper.mjs +69 -69
  103. package/esm2020/auth/lib/helpers/mapper.helper.mjs +35 -35
  104. package/esm2020/auth/lib/interfaces/config.interface.mjs +3 -3
  105. package/esm2020/auth/lib/interfaces/mapper.interface.mjs +2 -2
  106. package/esm2020/auth/lib/interfaces/provider.interface.mjs +2 -2
  107. package/esm2020/auth/lib/interfaces/token.interface.mjs +2 -2
  108. package/esm2020/auth/lib/permissions.service.mjs +56 -56
  109. package/esm2020/auth/lib/providers/email.provider.mjs +25 -25
  110. package/esm2020/auth/lib/providers/verify.provider.mjs +19 -19
  111. package/esm2020/auth/lib/tokens/use-authorization.token.mjs +3 -3
  112. package/esm2020/auth/public_api.mjs +19 -19
  113. package/esm2020/bravobit-bb-foundation.mjs +4 -4
  114. package/esm2020/collections/bravobit-bb-foundation-collections.mjs +4 -4
  115. package/esm2020/collections/lib/collection.mjs +100 -102
  116. package/esm2020/collections/lib/collections.module.mjs +54 -54
  117. package/esm2020/collections/lib/components/collections-pager/collections-pager.component.mjs +123 -123
  118. package/esm2020/collections/lib/components/collections-viewer/collections-viewer.component.mjs +31 -31
  119. package/esm2020/collections/lib/components/collections.directive.mjs +43 -43
  120. package/esm2020/collections/lib/interfaces/collection.interface.mjs +2 -2
  121. package/esm2020/collections/lib/providers/api-collection.provider.mjs +91 -71
  122. package/esm2020/collections/lib/providers/collection.provider.mjs +13 -13
  123. package/esm2020/collections/lib/providers/local-collection.provider.mjs +16 -16
  124. package/esm2020/collections/public_api.mjs +10 -10
  125. package/esm2020/controls/bravobit-bb-foundation-controls.mjs +4 -4
  126. package/esm2020/controls/lib/checkbox/checkbox/checkbox.component.mjs +153 -153
  127. package/esm2020/controls/lib/checkbox/checkbox-group/checkbox-group.component.mjs +61 -61
  128. package/esm2020/controls/lib/checkbox/checkbox.module.mjs +19 -19
  129. package/esm2020/controls/lib/controls.module.mjs +16 -16
  130. package/esm2020/controls/public_api.mjs +5 -5
  131. package/esm2020/dashboard/bravobit-bb-foundation-dashboard.mjs +4 -4
  132. package/esm2020/dashboard/lib/dashboard/dashboard.component.mjs +56 -56
  133. package/esm2020/dashboard/lib/dashboard-header/dashboard-header.component.mjs +30 -30
  134. package/esm2020/dashboard/lib/dashboard-menu/dashboard-menu.component.mjs +31 -31
  135. package/esm2020/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.mjs +29 -29
  136. package/esm2020/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.mjs +75 -75
  137. package/esm2020/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.mjs +99 -99
  138. package/esm2020/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.mjs +62 -62
  139. package/esm2020/dashboard/lib/dashboard.module.mjs +47 -47
  140. package/esm2020/dashboard/public_api.mjs +9 -9
  141. package/esm2020/dialog/bravobit-bb-foundation-dialog.mjs +4 -4
  142. package/esm2020/dialog/lib/dialog-actions/dialog-actions.component.mjs +12 -12
  143. package/esm2020/dialog/lib/dialog-confirm/dialog-confirm.component.mjs +37 -37
  144. package/esm2020/dialog/lib/dialog-container/dialog-container.component.mjs +153 -153
  145. package/esm2020/dialog/lib/dialog-header/dialog-header.component.mjs +25 -25
  146. package/esm2020/dialog/lib/dialog-link/dialog-link.component.mjs +11 -11
  147. package/esm2020/dialog/lib/dialog-modal/dialog-modal.component.mjs +46 -46
  148. package/esm2020/dialog/lib/dialog-overlay/dialog-overlay.component.mjs +134 -134
  149. package/esm2020/dialog/lib/dialog.injector.mjs +18 -18
  150. package/esm2020/dialog/lib/dialog.insertion.mjs +16 -16
  151. package/esm2020/dialog/lib/dialog.interfaces.mjs +3 -3
  152. package/esm2020/dialog/lib/dialog.module.mjs +68 -68
  153. package/esm2020/dialog/lib/dialog.ref.mjs +22 -22
  154. package/esm2020/dialog/lib/dialog.service.mjs +77 -77
  155. package/esm2020/dialog/public_api.mjs +10 -10
  156. package/esm2020/elements/bravobit-bb-foundation-elements.mjs +4 -4
  157. package/esm2020/elements/lib/avatar/avatar.component.mjs +145 -145
  158. package/esm2020/elements/lib/button/button.component.mjs +61 -61
  159. package/esm2020/elements/lib/checkbox/checkbox.component.mjs +73 -73
  160. package/esm2020/elements/lib/date-picker/date-picker.component.mjs +304 -304
  161. package/esm2020/elements/lib/directives/addon.directive.mjs +29 -29
  162. package/esm2020/elements/lib/directives/autosize.directive.mjs +72 -72
  163. package/esm2020/elements/lib/directives/focus-trap.directive.mjs +77 -77
  164. package/esm2020/elements/lib/directives/focus.directive.mjs +39 -39
  165. package/esm2020/elements/lib/directives/form-submit.directive.mjs +50 -50
  166. package/esm2020/elements/lib/directives/input.directive.mjs +136 -136
  167. package/esm2020/elements/lib/directives/template.directive.mjs +28 -28
  168. package/esm2020/elements/lib/dropdown/dropdown.component.mjs +100 -100
  169. package/esm2020/elements/lib/elements.interfaces.mjs +4 -4
  170. package/esm2020/elements/lib/elements.module.mjs +177 -177
  171. package/esm2020/elements/lib/file-picker/file-picker.component.mjs +236 -236
  172. package/esm2020/elements/lib/form-control/form-control.component.mjs +49 -49
  173. package/esm2020/elements/lib/form-error/form-error.component.mjs +108 -108
  174. package/esm2020/elements/lib/form-group/form-group.component.mjs +18 -18
  175. package/esm2020/elements/lib/icon/icon.component.mjs +102 -102
  176. package/esm2020/elements/lib/image-picker/image-picker.component.mjs +106 -106
  177. package/esm2020/elements/lib/pipes/file-image.pipe.mjs +42 -42
  178. package/esm2020/elements/lib/pipes/file-size.pipe.mjs +28 -28
  179. package/esm2020/elements/lib/pipes/relative-time.pipe.mjs +94 -94
  180. package/esm2020/elements/lib/spinner/spinner.component.mjs +25 -25
  181. package/esm2020/elements/lib/tag/tag.component.mjs +18 -18
  182. package/esm2020/elements/public_api.mjs +26 -26
  183. package/esm2020/http/bravobit-bb-foundation-http.mjs +4 -4
  184. package/esm2020/http/lib/classes/http.config.mjs +29 -29
  185. package/esm2020/http/lib/classes/http.error.mjs +20 -20
  186. package/esm2020/http/lib/http.interfaces.mjs +2 -2
  187. package/esm2020/http/lib/http.module.mjs +43 -43
  188. package/esm2020/http/lib/interceptors/base-url.interceptor.mjs +50 -50
  189. package/esm2020/http/lib/interceptors/error.interceptor.mjs +32 -32
  190. package/esm2020/http/public_api.mjs +7 -7
  191. package/esm2020/lib/core/miscellaneous/regex.mjs +5 -5
  192. package/esm2020/lib/core/miscellaneous/validator.mjs +85 -85
  193. package/esm2020/lib/core/mixins/can-disable.mjs +16 -16
  194. package/esm2020/lib/core/mixins/can-hide-errors.mjs +16 -16
  195. package/esm2020/lib/core/mixins/can-load.mjs +16 -16
  196. package/esm2020/lib/core/mixins/constructor.mjs +2 -2
  197. package/esm2020/lib/core/mixins/has-error.mjs +16 -16
  198. package/esm2020/lib/core/mixins/is-focused.mjs +16 -16
  199. package/esm2020/lib/core/mixins/is-grouped.mjs +16 -16
  200. package/esm2020/lib/core/mixins/is-readonly.mjs +16 -16
  201. package/esm2020/lib/core/mixins/is-required.mjs +16 -16
  202. package/esm2020/lib/core/services/clipboard.service.mjs +70 -70
  203. package/esm2020/lib/core/services/exif.service.mjs +163 -163
  204. package/esm2020/lib/core/services/file-loader.service.mjs +87 -87
  205. package/esm2020/lib/core/services/image-converter.service.mjs +123 -123
  206. package/esm2020/lib/core/services/languages.service.mjs +74 -74
  207. package/esm2020/lib/core/services/network.service.mjs +55 -55
  208. package/esm2020/lib/core/services/patch.service.mjs +63 -63
  209. package/esm2020/lib/core/services/platform.service.mjs +42 -42
  210. package/esm2020/lib/core/tokens/accept-language.token.mjs +3 -3
  211. package/esm2020/lib/core/tokens/base-url.token.mjs +3 -3
  212. package/esm2020/lib/core/tokens/cookie.token.mjs +3 -3
  213. package/esm2020/lib/core/tokens/location.token.mjs +6 -6
  214. package/esm2020/lib/core/tokens/navigator.token.mjs +6 -6
  215. package/esm2020/lib/core/tokens/window.token.mjs +12 -12
  216. package/esm2020/localize/bravobit-bb-foundation-localize.mjs +4 -4
  217. package/esm2020/localize/lib/functions/date.function.mjs +18 -18
  218. package/esm2020/localize/lib/functions/lowercase.function.mjs +13 -13
  219. package/esm2020/localize/lib/functions/uppercase.function.mjs +13 -13
  220. package/esm2020/localize/lib/handlers/missing.handler.mjs +15 -15
  221. package/esm2020/localize/lib/interfaces/config.interfaces.mjs +7 -7
  222. package/esm2020/localize/lib/interfaces/functions.interfaces.mjs +8 -8
  223. package/esm2020/localize/lib/interfaces/handlers.interfaces.mjs +2 -2
  224. package/esm2020/localize/lib/interfaces/options.interfaces.mjs +6 -6
  225. package/esm2020/localize/lib/localizations/dutch.localization.mjs +45 -45
  226. package/esm2020/localize/lib/localizations/english.localization.mjs +45 -45
  227. package/esm2020/localize/lib/localize.dictionary.mjs +26 -26
  228. package/esm2020/localize/lib/localize.module.mjs +71 -71
  229. package/esm2020/localize/lib/localize.pipe.mjs +49 -49
  230. package/esm2020/localize/lib/localize.service.mjs +207 -207
  231. package/esm2020/localize/lib/views/localize-string/localize-string.component.mjs +88 -88
  232. package/esm2020/localize/lib/views/localize-template-or-string.directive.mjs +28 -28
  233. package/esm2020/localize/lib/views/localize-template.directive.mjs +21 -21
  234. package/esm2020/localize/public_api.mjs +17 -17
  235. package/esm2020/masking/bravobit-bb-foundation-masking.mjs +4 -4
  236. package/esm2020/masking/lib/input-mask.directive.mjs +110 -110
  237. package/esm2020/masking/lib/input-mask.interface.mjs +2 -2
  238. package/esm2020/masking/lib/masking.module.mjs +16 -16
  239. package/esm2020/masking/lib/masking.service.mjs +94 -94
  240. package/esm2020/masking/public_api.mjs +5 -5
  241. package/esm2020/notifications/bravobit-bb-foundation-notifications.mjs +4 -4
  242. package/esm2020/notifications/lib/notifications-item/notifications-item.component.mjs +100 -100
  243. package/esm2020/notifications/lib/notifications-list/notifications-list.component.mjs +47 -47
  244. package/esm2020/notifications/lib/notifications.animations.mjs +28 -28
  245. package/esm2020/notifications/lib/notifications.injector.mjs +18 -18
  246. package/esm2020/notifications/lib/notifications.interfaces.mjs +20 -20
  247. package/esm2020/notifications/lib/notifications.module.mjs +30 -30
  248. package/esm2020/notifications/lib/notifications.service.mjs +145 -145
  249. package/esm2020/notifications/public_api.mjs +4 -4
  250. package/esm2020/public_api.mjs +29 -29
  251. package/esm2020/recaptcha/bravobit-bb-foundation-recaptcha.mjs +4 -4
  252. package/esm2020/recaptcha/lib/recaptcha/recaptcha.component.mjs +185 -185
  253. package/esm2020/recaptcha/lib/recaptcha-loader.service.mjs +90 -90
  254. package/esm2020/recaptcha/lib/recaptcha.interface.mjs +3 -3
  255. package/esm2020/recaptcha/lib/recaptcha.module.mjs +27 -27
  256. package/esm2020/recaptcha/public_api.mjs +5 -5
  257. package/esm2020/rxjs/bravobit-bb-foundation-rxjs.mjs +4 -4
  258. package/esm2020/rxjs/lib/observables/get-control-value.observable.mjs +6 -0
  259. package/esm2020/rxjs/lib/operators/combine-latest-map.operator.mjs +10 -10
  260. package/esm2020/rxjs/lib/operators/filter-nil.operator.mjs +5 -5
  261. package/esm2020/rxjs/public_api.mjs +4 -3
  262. package/esm2020/storage/bravobit-bb-foundation-storage.mjs +4 -4
  263. package/esm2020/storage/lib/interfaces/attributes.interface.mjs +2 -2
  264. package/esm2020/storage/lib/interfaces/memory.interface.mjs +2 -2
  265. package/esm2020/storage/lib/interfaces/strategy.interface.mjs +2 -2
  266. package/esm2020/storage/lib/storage.service.mjs +109 -109
  267. package/esm2020/storage/lib/strategies/cookie-storage.strategy.mjs +142 -142
  268. package/esm2020/storage/lib/strategies/memory-storage.strategy.mjs +56 -56
  269. package/esm2020/storage/lib/strategies/polyfill-storage.strategy.mjs +102 -102
  270. package/esm2020/storage/public_api.mjs +8 -8
  271. package/esm2020/table/bravobit-bb-foundation-table.mjs +4 -4
  272. package/esm2020/table/lib/components/table/table.component.mjs +191 -191
  273. package/esm2020/table/lib/components/table-cell/table-cell.component.mjs +11 -11
  274. package/esm2020/table/lib/components/table-header-cell/table-header-cell.component.mjs +131 -131
  275. package/esm2020/table/lib/components/table-pager/table-pager.component.mjs +136 -136
  276. package/esm2020/table/lib/data/datasource.data.mjs +32 -32
  277. package/esm2020/table/lib/data/generic.data.mjs +72 -72
  278. package/esm2020/table/lib/interfaces/datasource.interface.mjs +2 -2
  279. package/esm2020/table/lib/interfaces/table.interfaces.mjs +2 -2
  280. package/esm2020/table/lib/table.module.mjs +42 -42
  281. package/esm2020/table/public_api.mjs +10 -10
  282. package/esm2020/theming/bravobit-bb-foundation-theming.mjs +4 -4
  283. package/esm2020/theming/lib/themes/checkbox-group.theme.mjs +2 -2
  284. package/esm2020/theming/lib/themes/checkbox.theme.mjs +2 -2
  285. package/esm2020/theming/lib/themes/theme.mjs +34 -0
  286. package/esm2020/theming/lib/theming.interface.mjs +3 -3
  287. package/esm2020/theming/lib/theming.module.mjs +38 -38
  288. package/esm2020/theming/lib/theming.service.mjs +77 -100
  289. package/esm2020/theming/public_api.mjs +7 -4
  290. package/fesm2015/bravobit-bb-foundation-auth.mjs +930 -930
  291. package/fesm2015/bravobit-bb-foundation-auth.mjs.map +1 -1
  292. package/fesm2015/bravobit-bb-foundation-collections.mjs +443 -424
  293. package/fesm2015/bravobit-bb-foundation-collections.mjs.map +1 -1
  294. package/fesm2015/bravobit-bb-foundation-controls.mjs +229 -229
  295. package/fesm2015/bravobit-bb-foundation-controls.mjs.map +1 -1
  296. package/fesm2015/bravobit-bb-foundation-dashboard.mjs +382 -382
  297. package/fesm2015/bravobit-bb-foundation-dashboard.mjs.map +1 -1
  298. package/fesm2015/bravobit-bb-foundation-dialog.mjs +540 -540
  299. package/fesm2015/bravobit-bb-foundation-dialog.mjs.map +1 -1
  300. package/fesm2015/bravobit-bb-foundation-elements.mjs +1970 -1970
  301. package/fesm2015/bravobit-bb-foundation-elements.mjs.map +1 -1
  302. package/fesm2015/bravobit-bb-foundation-http.mjs +156 -156
  303. package/fesm2015/bravobit-bb-foundation-http.mjs.map +1 -1
  304. package/fesm2015/bravobit-bb-foundation-localize.mjs +608 -608
  305. package/fesm2015/bravobit-bb-foundation-localize.mjs.map +1 -1
  306. package/fesm2015/bravobit-bb-foundation-masking.mjs +214 -214
  307. package/fesm2015/bravobit-bb-foundation-masking.mjs.map +1 -1
  308. package/fesm2015/bravobit-bb-foundation-notifications.mjs +348 -348
  309. package/fesm2015/bravobit-bb-foundation-notifications.mjs.map +1 -1
  310. package/fesm2015/bravobit-bb-foundation-recaptcha.mjs +290 -290
  311. package/fesm2015/bravobit-bb-foundation-recaptcha.mjs.map +1 -1
  312. package/fesm2015/bravobit-bb-foundation-rxjs.mjs +14 -10
  313. package/fesm2015/bravobit-bb-foundation-rxjs.mjs.map +1 -1
  314. package/fesm2015/bravobit-bb-foundation-storage.mjs +401 -401
  315. package/fesm2015/bravobit-bb-foundation-storage.mjs.map +1 -1
  316. package/fesm2015/bravobit-bb-foundation-table.mjs +571 -571
  317. package/fesm2015/bravobit-bb-foundation-table.mjs.map +1 -1
  318. package/fesm2015/bravobit-bb-foundation-theming.mjs +151 -140
  319. package/fesm2015/bravobit-bb-foundation-theming.mjs.map +1 -1
  320. package/fesm2015/bravobit-bb-foundation.mjs +859 -859
  321. package/fesm2015/bravobit-bb-foundation.mjs.map +1 -1
  322. package/fesm2020/bravobit-bb-foundation-auth.mjs +882 -882
  323. package/fesm2020/bravobit-bb-foundation-auth.mjs.map +1 -1
  324. package/fesm2020/bravobit-bb-foundation-collections.mjs +432 -414
  325. package/fesm2020/bravobit-bb-foundation-collections.mjs.map +1 -1
  326. package/fesm2020/bravobit-bb-foundation-controls.mjs +227 -227
  327. package/fesm2020/bravobit-bb-foundation-controls.mjs.map +1 -1
  328. package/fesm2020/bravobit-bb-foundation-dashboard.mjs +370 -370
  329. package/fesm2020/bravobit-bb-foundation-dashboard.mjs.map +1 -1
  330. package/fesm2020/bravobit-bb-foundation-dialog.mjs +539 -539
  331. package/fesm2020/bravobit-bb-foundation-dialog.mjs.map +1 -1
  332. package/fesm2020/bravobit-bb-foundation-elements.mjs +1927 -1927
  333. package/fesm2020/bravobit-bb-foundation-elements.mjs.map +1 -1
  334. package/fesm2020/bravobit-bb-foundation-http.mjs +148 -148
  335. package/fesm2020/bravobit-bb-foundation-http.mjs.map +1 -1
  336. package/fesm2020/bravobit-bb-foundation-localize.mjs +587 -587
  337. package/fesm2020/bravobit-bb-foundation-localize.mjs.map +1 -1
  338. package/fesm2020/bravobit-bb-foundation-masking.mjs +203 -203
  339. package/fesm2020/bravobit-bb-foundation-masking.mjs.map +1 -1
  340. package/fesm2020/bravobit-bb-foundation-notifications.mjs +346 -346
  341. package/fesm2020/bravobit-bb-foundation-notifications.mjs.map +1 -1
  342. package/fesm2020/bravobit-bb-foundation-recaptcha.mjs +280 -280
  343. package/fesm2020/bravobit-bb-foundation-recaptcha.mjs.map +1 -1
  344. package/fesm2020/bravobit-bb-foundation-rxjs.mjs +17 -13
  345. package/fesm2020/bravobit-bb-foundation-rxjs.mjs.map +1 -1
  346. package/fesm2020/bravobit-bb-foundation-storage.mjs +396 -396
  347. package/fesm2020/bravobit-bb-foundation-storage.mjs.map +1 -1
  348. package/fesm2020/bravobit-bb-foundation-table.mjs +560 -560
  349. package/fesm2020/bravobit-bb-foundation-table.mjs.map +1 -1
  350. package/fesm2020/bravobit-bb-foundation-theming.mjs +141 -130
  351. package/fesm2020/bravobit-bb-foundation-theming.mjs.map +1 -1
  352. package/fesm2020/bravobit-bb-foundation.mjs +831 -831
  353. package/fesm2020/bravobit-bb-foundation.mjs.map +1 -1
  354. package/http/index.d.ts +5 -5
  355. package/http/lib/classes/http.config.d.ts +9 -9
  356. package/http/lib/classes/http.error.d.ts +7 -7
  357. package/http/lib/http.interfaces.d.ts +12 -12
  358. package/http/lib/http.module.d.ts +15 -15
  359. package/http/lib/interceptors/base-url.interceptor.d.ts +15 -15
  360. package/http/lib/interceptors/error.interceptor.d.ts +11 -11
  361. package/http/public_api.d.ts +6 -6
  362. package/index.d.ts +5 -5
  363. package/lib/core/miscellaneous/regex.d.ts +4 -4
  364. package/lib/core/miscellaneous/validator.d.ts +13 -13
  365. package/lib/core/mixins/can-disable.d.ts +6 -6
  366. package/lib/core/mixins/can-hide-errors.d.ts +6 -6
  367. package/lib/core/mixins/can-load.d.ts +6 -6
  368. package/lib/core/mixins/constructor.d.ts +1 -1
  369. package/lib/core/mixins/has-error.d.ts +6 -6
  370. package/lib/core/mixins/is-focused.d.ts +6 -6
  371. package/lib/core/mixins/is-grouped.d.ts +6 -6
  372. package/lib/core/mixins/is-readonly.d.ts +6 -6
  373. package/lib/core/mixins/is-required.d.ts +6 -6
  374. package/lib/core/services/clipboard.service.d.ts +18 -18
  375. package/lib/core/services/exif.service.d.ts +15 -15
  376. package/lib/core/services/file-loader.service.d.ts +13 -13
  377. package/lib/core/services/image-converter.service.d.ts +21 -21
  378. package/lib/core/services/languages.service.d.ts +16 -16
  379. package/lib/core/services/network.service.d.ts +14 -14
  380. package/lib/core/services/patch.service.d.ts +16 -16
  381. package/lib/core/services/platform.service.d.ts +18 -18
  382. package/lib/core/tokens/accept-language.token.d.ts +2 -2
  383. package/lib/core/tokens/base-url.token.d.ts +2 -2
  384. package/lib/core/tokens/cookie.token.d.ts +2 -2
  385. package/lib/core/tokens/location.token.d.ts +2 -2
  386. package/lib/core/tokens/navigator.token.d.ts +2 -2
  387. package/lib/core/tokens/window.token.d.ts +2 -2
  388. package/localize/index.d.ts +5 -5
  389. package/localize/lib/functions/date.function.d.ts +5 -5
  390. package/localize/lib/functions/lowercase.function.d.ts +5 -5
  391. package/localize/lib/functions/uppercase.function.d.ts +5 -5
  392. package/localize/lib/handlers/missing.handler.d.ts +6 -6
  393. package/localize/lib/interfaces/config.interfaces.d.ts +18 -18
  394. package/localize/lib/interfaces/functions.interfaces.d.ts +9 -9
  395. package/localize/lib/interfaces/handlers.interfaces.d.ts +6 -6
  396. package/localize/lib/interfaces/options.interfaces.d.ts +10 -10
  397. package/localize/lib/localizations/dutch.localization.d.ts +44 -44
  398. package/localize/lib/localizations/english.localization.d.ts +44 -44
  399. package/localize/lib/localize.dictionary.d.ts +7 -7
  400. package/localize/lib/localize.module.d.ts +17 -17
  401. package/localize/lib/localize.pipe.d.ts +12 -12
  402. package/localize/lib/localize.service.d.ts +40 -40
  403. package/localize/lib/views/localize-string/localize-string.component.d.ts +23 -23
  404. package/localize/lib/views/localize-template-or-string.directive.d.ts +10 -10
  405. package/localize/lib/views/localize-template.directive.d.ts +9 -9
  406. package/localize/public_api.d.ts +16 -16
  407. package/masking/index.d.ts +5 -5
  408. package/masking/lib/input-mask.directive.d.ts +36 -36
  409. package/masking/lib/input-mask.interface.d.ts +20 -20
  410. package/masking/lib/masking.module.d.ts +7 -7
  411. package/masking/lib/masking.service.d.ts +12 -12
  412. package/masking/public_api.d.ts +4 -4
  413. package/notifications/index.d.ts +5 -5
  414. package/notifications/lib/notifications-item/notifications-item.component.d.ts +34 -34
  415. package/notifications/lib/notifications-list/notifications-list.component.d.ts +16 -16
  416. package/notifications/lib/notifications.animations.d.ts +1 -1
  417. package/notifications/lib/notifications.injector.d.ts +8 -8
  418. package/notifications/lib/notifications.interfaces.d.ts +49 -49
  419. package/notifications/lib/notifications.module.d.ts +13 -13
  420. package/notifications/lib/notifications.service.d.ts +34 -34
  421. package/notifications/public_api.d.ts +3 -3
  422. package/package.json +1 -1
  423. package/public_api.d.ts +25 -25
  424. package/recaptcha/index.d.ts +5 -5
  425. package/recaptcha/lib/recaptcha/recaptcha.component.d.ts +47 -47
  426. package/recaptcha/lib/recaptcha-loader.service.d.ts +22 -22
  427. package/recaptcha/lib/recaptcha.interface.d.ts +14 -14
  428. package/recaptcha/lib/recaptcha.module.d.ts +10 -10
  429. package/recaptcha/public_api.d.ts +4 -4
  430. package/rxjs/index.d.ts +5 -5
  431. package/rxjs/lib/observables/get-control-value.observable.d.ts +3 -0
  432. package/rxjs/lib/operators/combine-latest-map.operator.d.ts +8 -8
  433. package/rxjs/lib/operators/filter-nil.operator.d.ts +1 -1
  434. package/rxjs/public_api.d.ts +3 -2
  435. package/storage/index.d.ts +5 -5
  436. package/storage/lib/interfaces/attributes.interface.d.ts +13 -13
  437. package/storage/lib/interfaces/memory.interface.d.ts +7 -7
  438. package/storage/lib/interfaces/strategy.interface.d.ts +17 -17
  439. package/storage/lib/storage.service.d.ts +26 -26
  440. package/storage/lib/strategies/cookie-storage.strategy.d.ts +20 -20
  441. package/storage/lib/strategies/memory-storage.strategy.d.ts +11 -11
  442. package/storage/lib/strategies/polyfill-storage.strategy.d.ts +15 -15
  443. package/storage/public_api.d.ts +7 -7
  444. package/table/index.d.ts +5 -5
  445. package/table/lib/components/table/table.component.d.ts +56 -56
  446. package/table/lib/components/table-cell/table-cell.component.d.ts +5 -5
  447. package/table/lib/components/table-header-cell/table-header-cell.component.d.ts +29 -29
  448. package/table/lib/components/table-pager/table-pager.component.d.ts +41 -41
  449. package/table/lib/data/datasource.data.d.ts +14 -14
  450. package/table/lib/data/generic.data.d.ts +23 -23
  451. package/table/lib/interfaces/datasource.interface.d.ts +17 -17
  452. package/table/lib/interfaces/table.interfaces.d.ts +1 -1
  453. package/table/lib/table.module.d.ts +14 -14
  454. package/table/public_api.d.ts +9 -9
  455. package/theming/index.d.ts +5 -5
  456. package/theming/lib/themes/checkbox-group.theme.d.ts +5 -5
  457. package/theming/lib/themes/checkbox.theme.d.ts +19 -19
  458. package/theming/lib/themes/theme.d.ts +12 -0
  459. package/theming/lib/theming.interface.d.ts +15 -14
  460. package/theming/lib/theming.module.d.ts +13 -13
  461. package/theming/lib/theming.service.d.ts +22 -24
  462. package/theming/public_api.d.ts +6 -3
@@ -12,591 +12,591 @@ import { mixinDisabled } from '@bravobit/bb-foundation';
12
12
  import * as i5 from '@bravobit/bb-foundation/localize';
13
13
  import { LocalizeModule } from '@bravobit/bb-foundation/localize';
14
14
 
15
- class DataSourceRequest {
16
- constructor() {
17
- // Data.
18
- this._request$ = new BehaviorSubject(null);
19
- this._loading$ = new BehaviorSubject(true);
20
- }
21
- get loading() {
22
- return this._loading$.asObservable();
23
- }
24
- get when() {
25
- return this._request$.pipe(filter(data => !!data));
26
- }
27
- startLoading() {
28
- this._loading$.next(true);
29
- }
30
- stopLoading() {
31
- this._loading$.next(false);
32
- }
33
- update(params = {}) {
34
- const currentValue = this._request$.getValue();
35
- // Set the page number to 1 if the query or page size was changed.
36
- if (currentValue && params && ((currentValue === null || currentValue === void 0 ? void 0 : currentValue.query) !== (params === null || params === void 0 ? void 0 : params.query) || (currentValue === null || currentValue === void 0 ? void 0 : currentValue.pageSize) !== (params === null || params === void 0 ? void 0 : params.pageSize))) {
37
- params.pageNumber = 1;
38
- }
39
- this._request$.next(Object.assign(Object.assign({}, currentValue), params));
40
- }
41
- }
42
- class DataSource {
15
+ class DataSourceRequest {
16
+ constructor() {
17
+ // Data.
18
+ this._request$ = new BehaviorSubject(null);
19
+ this._loading$ = new BehaviorSubject(true);
20
+ }
21
+ get loading() {
22
+ return this._loading$.asObservable();
23
+ }
24
+ get when() {
25
+ return this._request$.pipe(filter(data => !!data));
26
+ }
27
+ startLoading() {
28
+ this._loading$.next(true);
29
+ }
30
+ stopLoading() {
31
+ this._loading$.next(false);
32
+ }
33
+ update(params = {}) {
34
+ const currentValue = this._request$.getValue();
35
+ // Set the page number to 1 if the query or page size was changed.
36
+ if (currentValue && params && ((currentValue === null || currentValue === void 0 ? void 0 : currentValue.query) !== (params === null || params === void 0 ? void 0 : params.query) || (currentValue === null || currentValue === void 0 ? void 0 : currentValue.pageSize) !== (params === null || params === void 0 ? void 0 : params.pageSize))) {
37
+ params.pageNumber = 1;
38
+ }
39
+ this._request$.next(Object.assign(Object.assign({}, currentValue), params));
40
+ }
41
+ }
42
+ class DataSource {
43
43
  }
44
44
 
45
- class GenericDataSource extends DataSource {
46
- constructor(httpClient, endpoint) {
47
- super();
48
- // Data.
49
- this._items$ = new BehaviorSubject([]);
50
- this._fn = data => data;
51
- this.formatResponse = (data) => {
52
- return {
53
- pageSize: data === null || data === void 0 ? void 0 : data['page_size'],
54
- pageNumber: data === null || data === void 0 ? void 0 : data['page_number'],
55
- totalPages: data === null || data === void 0 ? void 0 : data['total_pages'],
56
- totalEntries: data === null || data === void 0 ? void 0 : data['total_entries'],
57
- data: data === null || data === void 0 ? void 0 : data['data']
58
- };
59
- };
60
- this.formatParams = (data) => {
61
- var _a, _b, _c, _d, _e, _f, _g;
62
- const params = {};
63
- params['page'] = `${(_a = data === null || data === void 0 ? void 0 : data.pageNumber) !== null && _a !== void 0 ? _a : 1}`;
64
- params['page_size'] = `${(_b = data === null || data === void 0 ? void 0 : data.pageSize) !== null && _b !== void 0 ? _b : 25}`;
65
- const sort = ((_c = data === null || data === void 0 ? void 0 : data.sort) !== null && _c !== void 0 ? _c : [])
66
- .map(({ name }) => name)
67
- .filter(name => !!name)
68
- .join(',');
69
- const sortDirection = ((_d = data === null || data === void 0 ? void 0 : data.sort) !== null && _d !== void 0 ? _d : [])
70
- .map(({ direction }) => direction)
71
- .filter(direction => !!direction)
72
- .join(',');
73
- if ((sort === null || sort === void 0 ? void 0 : sort.length) > 0 && (sortDirection === null || sortDirection === void 0 ? void 0 : sortDirection.length) > 0) {
74
- params['sort'] = sort;
75
- params['sort_direction'] = sortDirection;
76
- }
77
- if ((data === null || data === void 0 ? void 0 : data.query) && ((_e = data === null || data === void 0 ? void 0 : data.query) === null || _e === void 0 ? void 0 : _e.length) > 0 && (data === null || data === void 0 ? void 0 : data.queryFields) && ((_f = data === null || data === void 0 ? void 0 : data.queryFields) === null || _f === void 0 ? void 0 : _f.length) > 0) {
78
- params['query'] = data === null || data === void 0 ? void 0 : data.query;
79
- params['query_fields'] = (_g = data === null || data === void 0 ? void 0 : data.queryFields) === null || _g === void 0 ? void 0 : _g.join(',');
80
- }
81
- return params;
82
- };
83
- this._httpClient = httpClient;
84
- this._endpoint$ = typeof endpoint === 'string'
85
- ? of(endpoint)
86
- : endpoint;
87
- }
88
- append(item) {
89
- const currentValue = this._items$.getValue();
90
- const newValue = [...currentValue, item];
91
- this._items$.next(newValue);
92
- return this;
93
- }
94
- data(fn) {
95
- this._fn = fn;
96
- return this;
97
- }
98
- handle(request) {
99
- const extraParams$ = this._items$.pipe(switchMap(items => (items === null || items === void 0 ? void 0 : items.length) <= 0 ? of([]) : combineLatest(items)), map(items => items.reduce((previous, current) => (Object.assign(Object.assign({}, previous), (current !== null && current !== void 0 ? current : {}))), {})));
100
- return combineLatest([request.when, this._endpoint$, extraParams$]).pipe(switchMap(([params, endpoint, extraParams]) => {
101
- // Start the loading.
102
- request.startLoading();
103
- const formattedParams = this.formatParams(params);
104
- const combinedParams = Object.assign(Object.assign({}, formattedParams), extraParams);
105
- return this._httpClient.get(endpoint, {
106
- params: combinedParams
107
- }).pipe(map(data => this.formatResponse(data)), map(result => {
108
- var _a;
109
- return (Object.assign(Object.assign({}, result), { data: this._fn((_a = result === null || result === void 0 ? void 0 : result.data) !== null && _a !== void 0 ? _a : []) }));
110
- }));
111
- }), share());
112
- }
45
+ class GenericDataSource extends DataSource {
46
+ constructor(httpClient, endpoint) {
47
+ super();
48
+ // Data.
49
+ this._items$ = new BehaviorSubject([]);
50
+ this._fn = data => data;
51
+ this.formatResponse = (data) => {
52
+ return {
53
+ pageSize: data === null || data === void 0 ? void 0 : data['page_size'],
54
+ pageNumber: data === null || data === void 0 ? void 0 : data['page_number'],
55
+ totalPages: data === null || data === void 0 ? void 0 : data['total_pages'],
56
+ totalEntries: data === null || data === void 0 ? void 0 : data['total_entries'],
57
+ data: data === null || data === void 0 ? void 0 : data['data']
58
+ };
59
+ };
60
+ this.formatParams = (data) => {
61
+ var _a, _b, _c, _d, _e, _f, _g;
62
+ const params = {};
63
+ params['page'] = `${(_a = data === null || data === void 0 ? void 0 : data.pageNumber) !== null && _a !== void 0 ? _a : 1}`;
64
+ params['page_size'] = `${(_b = data === null || data === void 0 ? void 0 : data.pageSize) !== null && _b !== void 0 ? _b : 25}`;
65
+ const sort = ((_c = data === null || data === void 0 ? void 0 : data.sort) !== null && _c !== void 0 ? _c : [])
66
+ .map(({ name }) => name)
67
+ .filter(name => !!name)
68
+ .join(',');
69
+ const sortDirection = ((_d = data === null || data === void 0 ? void 0 : data.sort) !== null && _d !== void 0 ? _d : [])
70
+ .map(({ direction }) => direction)
71
+ .filter(direction => !!direction)
72
+ .join(',');
73
+ if ((sort === null || sort === void 0 ? void 0 : sort.length) > 0 && (sortDirection === null || sortDirection === void 0 ? void 0 : sortDirection.length) > 0) {
74
+ params['sort'] = sort;
75
+ params['sort_direction'] = sortDirection;
76
+ }
77
+ if ((data === null || data === void 0 ? void 0 : data.query) && ((_e = data === null || data === void 0 ? void 0 : data.query) === null || _e === void 0 ? void 0 : _e.length) > 0 && (data === null || data === void 0 ? void 0 : data.queryFields) && ((_f = data === null || data === void 0 ? void 0 : data.queryFields) === null || _f === void 0 ? void 0 : _f.length) > 0) {
78
+ params['query'] = data === null || data === void 0 ? void 0 : data.query;
79
+ params['query_fields'] = (_g = data === null || data === void 0 ? void 0 : data.queryFields) === null || _g === void 0 ? void 0 : _g.join(',');
80
+ }
81
+ return params;
82
+ };
83
+ this._httpClient = httpClient;
84
+ this._endpoint$ = typeof endpoint === 'string'
85
+ ? of(endpoint)
86
+ : endpoint;
87
+ }
88
+ append(item) {
89
+ const currentValue = this._items$.getValue();
90
+ const newValue = [...currentValue, item];
91
+ this._items$.next(newValue);
92
+ return this;
93
+ }
94
+ data(fn) {
95
+ this._fn = fn;
96
+ return this;
97
+ }
98
+ handle(request) {
99
+ const extraParams$ = this._items$.pipe(switchMap(items => (items === null || items === void 0 ? void 0 : items.length) <= 0 ? of([]) : combineLatest(items)), map(items => items.reduce((previous, current) => (Object.assign(Object.assign({}, previous), (current !== null && current !== void 0 ? current : {}))), {})));
100
+ return combineLatest([request.when, this._endpoint$, extraParams$]).pipe(switchMap(([params, endpoint, extraParams]) => {
101
+ // Start the loading.
102
+ request.startLoading();
103
+ const formattedParams = this.formatParams(params);
104
+ const combinedParams = Object.assign(Object.assign({}, formattedParams), extraParams);
105
+ return this._httpClient.get(endpoint, {
106
+ params: combinedParams
107
+ }).pipe(map(data => this.formatResponse(data)), map(result => {
108
+ var _a;
109
+ return (Object.assign(Object.assign({}, result), { data: this._fn((_a = result === null || result === void 0 ? void 0 : result.data) !== null && _a !== void 0 ? _a : []) }));
110
+ }));
111
+ }), share());
112
+ }
113
113
  }
114
114
 
115
- class BbTablePagerBase {
116
- }
117
- const BbTablePagerMixinBase = mixinDisabled(BbTablePagerBase);
118
- class BbTablePager extends BbTablePagerMixinBase {
119
- constructor() {
120
- super(...arguments);
121
- // Inputs.
122
- this.amountOfButtons = 5;
123
- this.showArrowButtons = true;
124
- // Methods.
125
- this.onChange = () => ({});
126
- this.onTouched = () => ({});
127
- this.trackByIndex = (_, item) => item.page;
128
- // Data.
129
- this._totalPages$ = new BehaviorSubject(1);
130
- this._pageNumber$ = new BehaviorSubject(1);
131
- }
132
- ngOnInit() {
133
- // Validate the previous button is disabled.
134
- this.isPreviousDisabled$ = this._pageNumber$.pipe(map(pageNumber => pageNumber === 1));
135
- // Validate the next button is disabled.
136
- this.isNextDisabled$ = combineLatest([this._pageNumber$, this._totalPages$]).pipe(map(([pageNumber, totalPages]) => pageNumber === totalPages));
137
- // Create the list with page numbers.
138
- this.list$ = combineLatest([this._pageNumber$, this._totalPages$]).pipe(map(([pageNumber, totalPages]) => this.filterActivePages(pageNumber, totalPages)), share());
139
- }
140
- get pageNumber() {
141
- return this._pageNumber$.getValue();
142
- }
143
- set pageNumber(newValue) {
144
- this.update(newValue);
145
- }
146
- get totalPages() {
147
- return this._totalPages$.getValue();
148
- }
149
- set totalPages(newValue) {
150
- const newTotalPages = Math.max(1, newValue);
151
- this._totalPages$.next(newTotalPages);
152
- }
153
- registerOnChange(fn) {
154
- this.onChange = fn;
155
- }
156
- registerOnTouched(fn) {
157
- this.onTouched = fn;
158
- }
159
- setDisabledState(isDisabled) {
160
- this.disabled = isDisabled;
161
- }
162
- writeValue(newValue) {
163
- this.update(newValue, false);
164
- }
165
- goToPrevious() {
166
- const newValue = this._pageNumber$.getValue() - 1;
167
- return this.update(newValue);
168
- }
169
- goToNext() {
170
- const newValue = this._pageNumber$.getValue() + 1;
171
- return this.update(newValue);
172
- }
173
- goToIndex(index) {
174
- return this.update(index);
175
- }
176
- update(pageNumber, notify = true) {
177
- // You can only update when not disabled.
178
- if (this.disabled) {
179
- return;
180
- }
181
- // Calculate the new value.
182
- const newValue = Math.min(this.totalPages, Math.max(1, pageNumber));
183
- // Don't do anything if the page number is the same.
184
- if (this._pageNumber$.getValue() === newValue) {
185
- return;
186
- }
187
- // Push the new value.
188
- this._pageNumber$.next(newValue);
189
- if (notify) {
190
- return this.onChange(pageNumber);
191
- }
192
- }
193
- calculatePages(pageNumber) {
194
- const min = 1;
195
- const max = this.totalPages;
196
- const amount = Math.max(1, this.amountOfButtons);
197
- const data = Array(amount)
198
- .fill(0)
199
- .map((_, index) => pageNumber + (index - 1));
200
- // Validate if the minimum value less than
201
- // the first value.
202
- if (data[0] < min) {
203
- return data.map(item => item + 1);
204
- }
205
- // Calculate the difference with the max
206
- // if this value is higher than 0 we should minus it.
207
- const lastValueInArray = data[data.length - 1];
208
- const differenceWithMax = lastValueInArray - max;
209
- if (differenceWithMax > 0) {
210
- return data.map(item => item - differenceWithMax);
211
- }
212
- // Just return the default data.
213
- return data;
214
- }
215
- filterActivePages(pageNumber, totalPages) {
216
- return this.calculatePages(pageNumber)
217
- .filter(page => page > 0 && page <= totalPages)
218
- .map(page => ({ page, active: pageNumber === page }));
219
- }
220
- }
221
- BbTablePager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTablePager, deps: null, target: i0.ɵɵFactoryTarget.Component });
222
- BbTablePager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: BbTablePager, selector: "bb-table-pager", inputs: { disabled: "disabled", amountOfButtons: "amountOfButtons", showArrowButtons: "showArrowButtons", pageNumber: "pageNumber", totalPages: "totalPages" }, host: { properties: { "class.disabled": "disabled" }, classAttribute: "bb-table-pager" }, providers: [
223
- { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BbTablePager), multi: true }
224
- ], usesInheritance: true, ngImport: i0, template: "<ul class=\"bb-pager-list\">\r\n <!-- The previous page arrow button. -->\r\n <li *ngIf=\"showArrowButtons\"\r\n class=\"bb-pager-list-item\"\r\n title=\"Previous page\">\r\n <button [disabled]=\"isPreviousDisabled$ | async\"\r\n (click)=\"goToPrevious()\"\r\n class=\"bb-pager-list-button\"\r\n type=\"button\">\r\n <bb-icon src=\"material:keyboard_arrow_left\"></bb-icon>\r\n </button>\r\n </li>\r\n\r\n <!-- The list of number buttons to navigate through the list. -->\r\n <ng-container *ngIf=\"list$ | async as list\">\r\n <li *ngFor=\"let item of list; trackBy: trackByIndex\"\r\n [title]=\"'Page ' + item?.page\"\r\n class=\"bb-pager-list-item\">\r\n <button (click)=\"goToIndex(item?.page)\"\r\n [class.active]=\"item?.active\"\r\n class=\"bb-pager-list-button\"\r\n type=\"button\">\r\n {{ item?.page }}\r\n </button>\r\n </li>\r\n </ng-container>\r\n\r\n <!-- The next page arrow button. -->\r\n <li *ngIf=\"showArrowButtons\"\r\n class=\"bb-pager-list-item\"\r\n title=\"Next page\">\r\n <button [disabled]=\"isNextDisabled$ | async\"\r\n (click)=\"goToNext()\"\r\n class=\"bb-pager-list-button\"\r\n type=\"button\">\r\n <bb-icon src=\"material:keyboard_arrow_right\"></bb-icon>\r\n </button>\r\n </li>\r\n</ul>\r\n", styles: [".bb-table-pager{flex:1;display:flex;align-items:center;justify-content:flex-end}.bb-table-pager.disabled{opacity:.5;-webkit-user-select:none;user-select:none;pointer-events:none}.bb-pager-list{display:flex}.bb-pager-list-item{margin-left:8px}.bb-pager-list-button{padding:0;color:#3d464d;line-height:1;min-width:32px;font-size:16px;-webkit-appearance:none;appearance:none;font-weight:500;min-height:32px;-webkit-user-select:none;user-select:none;border-radius:4px;align-items:center;display:inline-flex;justify-content:center;border:1px solid #b6bbc1;transition-duration:.2s;background-color:transparent;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:color,border-color,opacity,background-color;box-shadow:inset 0 3px #b7bcc233,0 6px 6px -6px #0000001a}.bb-pager-list-button:hover,.bb-pager-list-button:focus{background-color:#0000000a}.bb-pager-list-button.active,.bb-pager-list-button.active:hover{color:#2196f3;cursor:default;border-color:#2196f3;background-color:transparent}.bb-pager-list-button:disabled{opacity:.35;cursor:default;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.BbIcon, selector: "bb-icon", inputs: ["alt", "size", "src", "ariaHidden"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
225
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTablePager, decorators: [{
226
- type: Component,
227
- args: [{ selector: 'bb-table-pager', changeDetection: ChangeDetectionStrategy.OnPush, host: {
228
- 'class': 'bb-table-pager',
229
- '[class.disabled]': 'disabled'
230
- }, inputs: ['disabled'], encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, providers: [
231
- { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BbTablePager), multi: true }
232
- ], template: "<ul class=\"bb-pager-list\">\r\n <!-- The previous page arrow button. -->\r\n <li *ngIf=\"showArrowButtons\"\r\n class=\"bb-pager-list-item\"\r\n title=\"Previous page\">\r\n <button [disabled]=\"isPreviousDisabled$ | async\"\r\n (click)=\"goToPrevious()\"\r\n class=\"bb-pager-list-button\"\r\n type=\"button\">\r\n <bb-icon src=\"material:keyboard_arrow_left\"></bb-icon>\r\n </button>\r\n </li>\r\n\r\n <!-- The list of number buttons to navigate through the list. -->\r\n <ng-container *ngIf=\"list$ | async as list\">\r\n <li *ngFor=\"let item of list; trackBy: trackByIndex\"\r\n [title]=\"'Page ' + item?.page\"\r\n class=\"bb-pager-list-item\">\r\n <button (click)=\"goToIndex(item?.page)\"\r\n [class.active]=\"item?.active\"\r\n class=\"bb-pager-list-button\"\r\n type=\"button\">\r\n {{ item?.page }}\r\n </button>\r\n </li>\r\n </ng-container>\r\n\r\n <!-- The next page arrow button. -->\r\n <li *ngIf=\"showArrowButtons\"\r\n class=\"bb-pager-list-item\"\r\n title=\"Next page\">\r\n <button [disabled]=\"isNextDisabled$ | async\"\r\n (click)=\"goToNext()\"\r\n class=\"bb-pager-list-button\"\r\n type=\"button\">\r\n <bb-icon src=\"material:keyboard_arrow_right\"></bb-icon>\r\n </button>\r\n </li>\r\n</ul>\r\n", styles: [".bb-table-pager{flex:1;display:flex;align-items:center;justify-content:flex-end}.bb-table-pager.disabled{opacity:.5;-webkit-user-select:none;user-select:none;pointer-events:none}.bb-pager-list{display:flex}.bb-pager-list-item{margin-left:8px}.bb-pager-list-button{padding:0;color:#3d464d;line-height:1;min-width:32px;font-size:16px;-webkit-appearance:none;appearance:none;font-weight:500;min-height:32px;-webkit-user-select:none;user-select:none;border-radius:4px;align-items:center;display:inline-flex;justify-content:center;border:1px solid #b6bbc1;transition-duration:.2s;background-color:transparent;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:color,border-color,opacity,background-color;box-shadow:inset 0 3px #b7bcc233,0 6px 6px -6px #0000001a}.bb-pager-list-button:hover,.bb-pager-list-button:focus{background-color:#0000000a}.bb-pager-list-button.active,.bb-pager-list-button.active:hover{color:#2196f3;cursor:default;border-color:#2196f3;background-color:transparent}.bb-pager-list-button:disabled{opacity:.35;cursor:default;pointer-events:none}\n"] }]
233
- }], propDecorators: { amountOfButtons: [{
234
- type: Input
235
- }], showArrowButtons: [{
236
- type: Input
237
- }], pageNumber: [{
238
- type: Input
239
- }], totalPages: [{
240
- type: Input
115
+ class BbTablePagerBase {
116
+ }
117
+ const BbTablePagerMixinBase = mixinDisabled(BbTablePagerBase);
118
+ class BbTablePager extends BbTablePagerMixinBase {
119
+ constructor() {
120
+ super(...arguments);
121
+ // Inputs.
122
+ this.amountOfButtons = 5;
123
+ this.showArrowButtons = true;
124
+ // Methods.
125
+ this.onChange = () => ({});
126
+ this.onTouched = () => ({});
127
+ this.trackByIndex = (_, item) => item.page;
128
+ // Data.
129
+ this._totalPages$ = new BehaviorSubject(1);
130
+ this._pageNumber$ = new BehaviorSubject(1);
131
+ }
132
+ ngOnInit() {
133
+ // Validate the previous button is disabled.
134
+ this.isPreviousDisabled$ = this._pageNumber$.pipe(map(pageNumber => pageNumber === 1));
135
+ // Validate the next button is disabled.
136
+ this.isNextDisabled$ = combineLatest([this._pageNumber$, this._totalPages$]).pipe(map(([pageNumber, totalPages]) => pageNumber === totalPages));
137
+ // Create the list with page numbers.
138
+ this.list$ = combineLatest([this._pageNumber$, this._totalPages$]).pipe(map(([pageNumber, totalPages]) => this.filterActivePages(pageNumber, totalPages)), share());
139
+ }
140
+ get pageNumber() {
141
+ return this._pageNumber$.getValue();
142
+ }
143
+ set pageNumber(newValue) {
144
+ this.update(newValue);
145
+ }
146
+ get totalPages() {
147
+ return this._totalPages$.getValue();
148
+ }
149
+ set totalPages(newValue) {
150
+ const newTotalPages = Math.max(1, newValue);
151
+ this._totalPages$.next(newTotalPages);
152
+ }
153
+ registerOnChange(fn) {
154
+ this.onChange = fn;
155
+ }
156
+ registerOnTouched(fn) {
157
+ this.onTouched = fn;
158
+ }
159
+ setDisabledState(isDisabled) {
160
+ this.disabled = isDisabled;
161
+ }
162
+ writeValue(newValue) {
163
+ this.update(newValue, false);
164
+ }
165
+ goToPrevious() {
166
+ const newValue = this._pageNumber$.getValue() - 1;
167
+ return this.update(newValue);
168
+ }
169
+ goToNext() {
170
+ const newValue = this._pageNumber$.getValue() + 1;
171
+ return this.update(newValue);
172
+ }
173
+ goToIndex(index) {
174
+ return this.update(index);
175
+ }
176
+ update(pageNumber, notify = true) {
177
+ // You can only update when not disabled.
178
+ if (this.disabled) {
179
+ return;
180
+ }
181
+ // Calculate the new value.
182
+ const newValue = Math.min(this.totalPages, Math.max(1, pageNumber));
183
+ // Don't do anything if the page number is the same.
184
+ if (this._pageNumber$.getValue() === newValue) {
185
+ return;
186
+ }
187
+ // Push the new value.
188
+ this._pageNumber$.next(newValue);
189
+ if (notify) {
190
+ return this.onChange(pageNumber);
191
+ }
192
+ }
193
+ calculatePages(pageNumber) {
194
+ const min = 1;
195
+ const max = this.totalPages;
196
+ const amount = Math.max(1, this.amountOfButtons);
197
+ const data = Array(amount)
198
+ .fill(0)
199
+ .map((_, index) => pageNumber + (index - 1));
200
+ // Validate if the minimum value less than
201
+ // the first value.
202
+ if (data[0] < min) {
203
+ return data.map(item => item + 1);
204
+ }
205
+ // Calculate the difference with the max
206
+ // if this value is higher than 0 we should minus it.
207
+ const lastValueInArray = data[data.length - 1];
208
+ const differenceWithMax = lastValueInArray - max;
209
+ if (differenceWithMax > 0) {
210
+ return data.map(item => item - differenceWithMax);
211
+ }
212
+ // Just return the default data.
213
+ return data;
214
+ }
215
+ filterActivePages(pageNumber, totalPages) {
216
+ return this.calculatePages(pageNumber)
217
+ .filter(page => page > 0 && page <= totalPages)
218
+ .map(page => ({ page, active: pageNumber === page }));
219
+ }
220
+ }
221
+ BbTablePager.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTablePager, deps: null, target: i0.ɵɵFactoryTarget.Component });
222
+ BbTablePager.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: BbTablePager, selector: "bb-table-pager", inputs: { disabled: "disabled", amountOfButtons: "amountOfButtons", showArrowButtons: "showArrowButtons", pageNumber: "pageNumber", totalPages: "totalPages" }, host: { properties: { "class.disabled": "disabled" }, classAttribute: "bb-table-pager" }, providers: [
223
+ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BbTablePager), multi: true }
224
+ ], usesInheritance: true, ngImport: i0, template: "<ul class=\"bb-pager-list\">\n <!-- The previous page arrow button. -->\n <li *ngIf=\"showArrowButtons\"\n class=\"bb-pager-list-item\"\n title=\"Previous page\">\n <button [disabled]=\"isPreviousDisabled$ | async\"\n (click)=\"goToPrevious()\"\n class=\"bb-pager-list-button\"\n type=\"button\">\n <bb-icon src=\"material:keyboard_arrow_left\"></bb-icon>\n </button>\n </li>\n\n <!-- The list of number buttons to navigate through the list. -->\n <ng-container *ngIf=\"list$ | async as list\">\n <li *ngFor=\"let item of list; trackBy: trackByIndex\"\n [title]=\"'Page ' + item?.page\"\n class=\"bb-pager-list-item\">\n <button (click)=\"goToIndex(item?.page)\"\n [class.active]=\"item?.active\"\n class=\"bb-pager-list-button\"\n type=\"button\">\n {{ item?.page }}\n </button>\n </li>\n </ng-container>\n\n <!-- The next page arrow button. -->\n <li *ngIf=\"showArrowButtons\"\n class=\"bb-pager-list-item\"\n title=\"Next page\">\n <button [disabled]=\"isNextDisabled$ | async\"\n (click)=\"goToNext()\"\n class=\"bb-pager-list-button\"\n type=\"button\">\n <bb-icon src=\"material:keyboard_arrow_right\"></bb-icon>\n </button>\n </li>\n</ul>\n", styles: [".bb-table-pager{flex:1;display:flex;align-items:center;justify-content:flex-end}.bb-table-pager.disabled{opacity:.5;-webkit-user-select:none;user-select:none;pointer-events:none}.bb-pager-list{display:flex}.bb-pager-list-item{margin-left:8px}.bb-pager-list-button{padding:0;color:#3d464d;line-height:1;min-width:32px;font-size:16px;-webkit-appearance:none;appearance:none;font-weight:500;min-height:32px;-webkit-user-select:none;user-select:none;border-radius:4px;align-items:center;display:inline-flex;justify-content:center;border:1px solid #b6bbc1;transition-duration:.2s;background-color:transparent;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:color,border-color,opacity,background-color;box-shadow:inset 0 3px #b7bcc233,0 6px 6px -6px #0000001a}.bb-pager-list-button:hover,.bb-pager-list-button:focus{background-color:#0000000a}.bb-pager-list-button.active,.bb-pager-list-button.active:hover{color:#2196f3;cursor:default;border-color:#2196f3;background-color:transparent}.bb-pager-list-button:disabled{opacity:.35;cursor:default;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.BbIcon, selector: "bb-icon", inputs: ["alt", "size", "src", "ariaHidden"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
225
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTablePager, decorators: [{
226
+ type: Component,
227
+ args: [{ selector: 'bb-table-pager', changeDetection: ChangeDetectionStrategy.OnPush, host: {
228
+ 'class': 'bb-table-pager',
229
+ '[class.disabled]': 'disabled'
230
+ }, inputs: ['disabled'], encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, providers: [
231
+ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => BbTablePager), multi: true }
232
+ ], template: "<ul class=\"bb-pager-list\">\n <!-- The previous page arrow button. -->\n <li *ngIf=\"showArrowButtons\"\n class=\"bb-pager-list-item\"\n title=\"Previous page\">\n <button [disabled]=\"isPreviousDisabled$ | async\"\n (click)=\"goToPrevious()\"\n class=\"bb-pager-list-button\"\n type=\"button\">\n <bb-icon src=\"material:keyboard_arrow_left\"></bb-icon>\n </button>\n </li>\n\n <!-- The list of number buttons to navigate through the list. -->\n <ng-container *ngIf=\"list$ | async as list\">\n <li *ngFor=\"let item of list; trackBy: trackByIndex\"\n [title]=\"'Page ' + item?.page\"\n class=\"bb-pager-list-item\">\n <button (click)=\"goToIndex(item?.page)\"\n [class.active]=\"item?.active\"\n class=\"bb-pager-list-button\"\n type=\"button\">\n {{ item?.page }}\n </button>\n </li>\n </ng-container>\n\n <!-- The next page arrow button. -->\n <li *ngIf=\"showArrowButtons\"\n class=\"bb-pager-list-item\"\n title=\"Next page\">\n <button [disabled]=\"isNextDisabled$ | async\"\n (click)=\"goToNext()\"\n class=\"bb-pager-list-button\"\n type=\"button\">\n <bb-icon src=\"material:keyboard_arrow_right\"></bb-icon>\n </button>\n </li>\n</ul>\n", styles: [".bb-table-pager{flex:1;display:flex;align-items:center;justify-content:flex-end}.bb-table-pager.disabled{opacity:.5;-webkit-user-select:none;user-select:none;pointer-events:none}.bb-pager-list{display:flex}.bb-pager-list-item{margin-left:8px}.bb-pager-list-button{padding:0;color:#3d464d;line-height:1;min-width:32px;font-size:16px;-webkit-appearance:none;appearance:none;font-weight:500;min-height:32px;-webkit-user-select:none;user-select:none;border-radius:4px;align-items:center;display:inline-flex;justify-content:center;border:1px solid #b6bbc1;transition-duration:.2s;background-color:transparent;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:color,border-color,opacity,background-color;box-shadow:inset 0 3px #b7bcc233,0 6px 6px -6px #0000001a}.bb-pager-list-button:hover,.bb-pager-list-button:focus{background-color:#0000000a}.bb-pager-list-button.active,.bb-pager-list-button.active:hover{color:#2196f3;cursor:default;border-color:#2196f3;background-color:transparent}.bb-pager-list-button:disabled{opacity:.35;cursor:default;pointer-events:none}\n"] }]
233
+ }], propDecorators: { amountOfButtons: [{
234
+ type: Input
235
+ }], showArrowButtons: [{
236
+ type: Input
237
+ }], pageNumber: [{
238
+ type: Input
239
+ }], totalPages: [{
240
+ type: Input
241
241
  }] } });
242
242
 
243
- class BbTableColumnDef {
244
- }
245
- BbTableColumnDef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTableColumnDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
246
- BbTableColumnDef.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.3", type: BbTableColumnDef, selector: "[bbTableColumnDef]", ngImport: i0 });
247
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTableColumnDef, decorators: [{
248
- type: Directive,
249
- args: [{
250
- selector: '[bbTableColumnDef]'
251
- }]
252
- }] });
253
- class BbTableRowDef {
254
- }
255
- BbTableRowDef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTableRowDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
256
- BbTableRowDef.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.3", type: BbTableRowDef, selector: "[bbTableRowDef]", ngImport: i0 });
257
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTableRowDef, decorators: [{
258
- type: Directive,
259
- args: [{
260
- selector: '[bbTableRowDef]'
261
- }]
262
- }] });
263
- class BbTable {
264
- constructor() {
265
- // Inputs.
266
- this.identifier = null;
267
- this.queryFields = [];
268
- this.sortingStrategy = 'single';
269
- this.header = true;
270
- this.footer = true;
271
- // Sizes.
272
- this._sizes = [25, 50, 75, 100];
273
- // Optimizations.
274
- this.trackByFn = (index, item) => this.identifier ? item[this.identifier] : index;
275
- this.trackByValue = (_, item) => item;
276
- this.queryControl = new FormControl('');
277
- // State.
278
- this._headerCount = 0;
279
- }
280
- get sizes() {
281
- return this._sizes;
282
- }
283
- set sizes(newValue) {
284
- this.updateSizes(newValue);
285
- }
286
- ngOnInit() {
287
- this.composeForm();
288
- this.watchDataChanges();
289
- }
290
- ngOnDestroy() {
291
- var _a;
292
- (_a = this._subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
293
- }
294
- get headerCount() {
295
- return this._headerCount;
296
- }
297
- get sortControl() {
298
- var _a;
299
- return (_a = this.form) === null || _a === void 0 ? void 0 : _a.get('sort');
300
- }
301
- get pageNumberControl() {
302
- var _a;
303
- return (_a = this.form) === null || _a === void 0 ? void 0 : _a.get('pageNumber');
304
- }
305
- get pageSizeControl() {
306
- var _a;
307
- return (_a = this.form) === null || _a === void 0 ? void 0 : _a.get('pageSize');
308
- }
309
- refresh() {
310
- return this.request.update();
311
- }
312
- setHeaderCount(amount) {
313
- this._headerCount += amount;
314
- }
315
- updateSizes(newValue) {
316
- // Validate the sizes has at least one value.
317
- if (newValue.length <= 0) {
318
- throw new Error('Cannot set an empty array as the sizes.');
319
- }
320
- // Set the new size.
321
- this._sizes = newValue;
322
- // Validate that the form exists already.
323
- if (!this.form) {
324
- return;
325
- }
326
- // Check if the current selected value is
327
- // in the new sizes array.
328
- const pageSizeControl = this.form.get('pageSize');
329
- if (this._sizes.includes(pageSizeControl.value)) {
330
- return;
331
- }
332
- // Set the first value in the array as
333
- // the new value.
334
- const firstValue = this._sizes[0];
335
- pageSizeControl.setValue(firstValue);
336
- }
337
- composeForm() {
338
- // Setup the form.
339
- this.form = new FormGroup({
340
- pageSize: new FormControl(this._sizes[0]),
341
- pageNumber: new FormControl(1),
342
- sort: new FormGroup({})
343
- });
344
- }
345
- watchDataChanges() {
346
- // Create a new request.
347
- this.request = new DataSourceRequest();
348
- this.isLoading$ = this.request.loading;
349
- if (!this.dataSource) {
350
- this.data$ = of({ state: 'error_datasource' }).pipe(tap(() => this.request.stopLoading()));
351
- return;
352
- }
353
- // Pass the request to the data source.
354
- this.data$ = this.dataSource.handle(this.request).pipe(tap(() => this.request.stopLoading()), map(result => {
355
- const count = (result && result.data && result.data.length) || 0;
356
- if (count <= 0) {
357
- return { state: 'empty', result };
358
- }
359
- return { state: 'success', result };
360
- }), catchError(error => {
361
- var _a, _b;
362
- this.request.stopLoading();
363
- const statusCode = (_a = error === null || error === void 0 ? void 0 : error.status) !== null && _a !== void 0 ? _a : null;
364
- const states = {
365
- 0: 'error_down',
366
- 401: 'error_unauthorized',
367
- 403: 'error_forbidden',
368
- 404: 'error_not_found',
369
- 500: 'error_server'
370
- };
371
- return of({ state: (_b = states === null || states === void 0 ? void 0 : states[statusCode]) !== null && _b !== void 0 ? _b : 'error_unknown', statusCode: statusCode });
372
- }));
373
- // Subscribe to the data changes.
374
- this.subscribeToChanges();
375
- }
376
- subscribeToChanges() {
377
- const form$ = this.getFormChanges();
378
- const query$ = this.getQueryChanges();
379
- this._subscription = combineLatest([form$, query$]).subscribe(([form, query]) => {
380
- const { pageNumber, pageSize } = form;
381
- const sort = Object.keys(form.sort)
382
- .map(name => ({ name, direction: form.sort[name] }))
383
- .filter(item => ['asc', 'desc'].includes(item.direction));
384
- this.request.startLoading();
385
- return this.request.update({
386
- sort,
387
- query,
388
- pageSize,
389
- pageNumber,
390
- queryFields: this.queryFields
391
- });
392
- });
393
- }
394
- getQueryChanges() {
395
- return this.queryControl.valueChanges.pipe(debounceTime(400), distinctUntilChanged(), startWith(this.queryControl.value));
396
- }
397
- getFormChanges() {
398
- return this.form.valueChanges.pipe(startWith(this.form.value));
399
- }
400
- }
401
- BbTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
402
- BbTable.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: BbTable, selector: "bb-table", inputs: { identifier: "identifier", dataSource: "dataSource", queryFields: "queryFields", sortingStrategy: "sortingStrategy", header: "header", footer: "footer", sizes: "sizes" }, host: { classAttribute: "bb-table" }, queries: [{ propertyName: "tableRowTemplate", first: true, predicate: BbTableRowDef, descendants: true, read: TemplateRef }, { propertyName: "tableColumnTemplates", predicate: BbTableColumnDef, read: TemplateRef }], ngImport: i0, template: "<!--\r\n This is the header of the table. It can be a user\r\n defined custom header or just the default header.\r\n-->\r\n\r\n<header *ngIf=\"(header === true ? headerTemplate : header) as template\"\r\n class=\"bb-table-top-actions\">\r\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\r\n</header>\r\n\r\n<!--\r\n This is the table that contains the\r\n rows and columns.\r\n-->\r\n\r\n<div class=\"bb-table-wrapper\">\r\n <div *ngIf=\"isLoading$ | async\"\r\n class=\"bb-table-progress\">\r\n <div class=\"bb-table-indeterminate\"></div>\r\n </div>\r\n <table class=\"bb-table-container\">\r\n <thead>\r\n <tr>\r\n <ng-content select=\"bb-table-header-cell\"></ng-content>\r\n </tr>\r\n </thead>\r\n <tbody *ngIf=\"data$ | async as data; else isLoadingTemplate\"\r\n [ngSwitch]=\"data?.state\">\r\n <ng-container *ngSwitchCase=\"'success'\">\r\n <ng-container *ngIf=\"!!tableRowTemplate; else tableCellsTemplates\">\r\n <ng-container\r\n *ngTemplateOutlet=\"tableRowTemplate; context: {data: data?.result?.data || []}\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #tableCellsTemplates>\r\n <tr *ngFor=\"let item of data?.result?.data; trackBy: trackByFn\">\r\n <ng-container *ngFor=\"let template of tableColumnTemplates\">\r\n <ng-container *ngTemplateOutlet=\"template; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'empty'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'error_datasource'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'error_not_found'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'error_server'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'error_down'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n<footer *ngIf=\"(footer === true ? footerTemplate : footer) as template\"\r\n class=\"bb-table-bottom-actions\">\r\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\r\n</footer>\r\n\r\n<ng-template #isLoadingTemplate>\r\n <tr>\r\n <td [attr.colspan]=\"headerCount\"\r\n class=\"bb-table-template\">\r\n <div class=\"bb-table-template-content\">\r\n {{ 'tables.loading' | bbLocalize }}\r\n </div>\r\n </td>\r\n </tr>\r\n</ng-template>\r\n\r\n<!--\r\n This is the template that will be used when the user has not\r\n supplied a custom header template.\r\n-->\r\n\r\n<ng-template #headerTemplate>\r\n <ng-content></ng-content>\r\n <bb-form-control>\r\n <input [formControl]=\"queryControl\"\r\n [placeholder]=\"'tables.search' | bbLocalize\"\r\n bbInput\r\n autocomplete=\"off\">\r\n <bb-icon *ngIf=\"queryControl?.value?.length <= 0; else closeButtonTemplate\"\r\n bbSuffix\r\n src=\"material:search\">\r\n </bb-icon>\r\n </bb-form-control>\r\n</ng-template>\r\n\r\n<!--\r\n This is the template that will be used when the user has not\r\n supplied a custom footer template.\r\n-->\r\n\r\n<ng-template #footerTemplate>\r\n <bb-form-control *ngIf=\"sizes?.length > 1\">\r\n <select [formControl]=\"pageSizeControl\"\r\n bbInput\r\n title=\"Sizes\">\r\n <option *ngFor=\"let item of sizes; trackBy: trackByValue\"\r\n [ngValue]=\"item\">\r\n {{ item }} / {{ 'tables.page' | bbLocalize }}\r\n </option>\r\n </select>\r\n </bb-form-control>\r\n\r\n <bb-table-pager [totalPages]=\"(data$ | async)?.result?.totalPages\"\r\n [formControl]=\"pageNumberControl\">\r\n </bb-table-pager>\r\n</ng-template>\r\n\r\n<!--\r\n This the template that will be used when the user\r\n has filled in some data in the query control.\r\n-->\r\n\r\n<ng-template #closeButtonTemplate>\r\n <button bbSuffix\r\n (click)=\"queryControl?.patchValue('')\"\r\n type=\"button\"\r\n class=\"bb-table-progress-close-query\">\r\n <bb-icon src=\"material:close\"></bb-icon>\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template #errorTemplate let-state=\"state\" let-status=\"statusCode\">\r\n <tr>\r\n <td [attr.colspan]=\"headerCount\"\r\n class=\"bb-table-template\">\r\n <div class=\"bb-table-template-content\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"64\" height=\"41\">\r\n <g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(0 1)\">\r\n <ellipse cx=\"32\" cy=\"33\" fill=\"#F5F5F5\" rx=\"32\" ry=\"7\"></ellipse>\r\n <g fill-rule=\"nonzero\" stroke=\"#D9D9D9\">\r\n <path\r\n d=\"M55 12.7605604L44.8543047 1.25739633C44.3674414.47382661 43.6558789 0 42.9067617 0H21.0932383c-.7491172 0-1.4606797.47395025-1.947543 1.25739633L9 12.7605604V22h46v-9.2394396z\"></path>\r\n <path fill=\"#FAFAFA\"\r\n d=\"M41.6132813 15.9315c0-1.6056489.9936718-2.931266 2.2264179-2.9315H55v18.1371277C55 33.2589574 53.6793867 35 52.0504297 35H11.94957031C10.32052344 35 9 33.2588404 9 31.1371277V13h11.1603008c1.2327461 0 2.226418 1.3228085 2.226418 2.9284574v.0211809c0 1.6056489 1.0049921 2.9015426 2.2377382 2.9015426h14.751086c1.2327461 0 2.2377383-1.3078298 2.2377383-2.9134788V15.9315z\"></path>\r\n </g>\r\n </g>\r\n </svg>\r\n <span *ngIf=\"state as stateLabel\">{{ ('tables.' + stateLabel) | bbLocalize }}</span>\r\n <span *ngIf=\"status as statusCode\"\r\n class=\"bb-table-template-content-code\">(HTTP {{ statusCode }})</span>\r\n </div>\r\n </td>\r\n </tr>\r\n</ng-template>\r\n", styles: [".bb-table{width:100%;display:block;box-shadow:0 6px 6px -6px #0000001a}.bb-table.plain{box-shadow:none}.bb-table.plain>.bb-table-wrapper{border-top-left-radius:0;border-top-right-radius:0}.bb-table-wrapper{overflow-x:auto;position:relative;background-color:#fff;border-top-left-radius:4px;border-top-right-radius:4px}.bb-table-container{width:100%}.bb-table-container td{border-bottom:1px solid #d8d8d8}.bb-table-top-actions{display:flex;flex-wrap:wrap;flex-direction:column;padding:20px 20px 10px;background-color:#fff;justify-content:flex-end;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:1px solid #d8d8d8}.bb-table-top-actions>*{margin-left:0;margin-bottom:10px}.bb-table-top-actions+.bb-table-wrapper{border-radius:0}.bb-table-bottom-actions{height:60px;display:flex;padding:0 20px;overflow-x:auto;align-items:center;background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.bb-table-template{border:none;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-template-content{padding:20px;display:flex;color:#3d464d;font-size:14px;line-height:1.2;font-weight:400;min-height:140px;text-align:center;align-items:center;flex-direction:column;justify-content:center}.bb-table-template-content>svg{margin-bottom:12px}.bb-table-template-content-code{opacity:.5;margin-top:5px;display:inline-block}.bb-table-progress{top:0;left:0;right:0;opacity:0;width:100%;height:4px;display:block;overflow:hidden;position:absolute;background-color:#2f408b4d;animation:fadeIn .25s cubic-bezier(0,0,.2,1) .1s forwards}.bb-table-progress .bb-table-indeterminate{background-color:#2f408b}.bb-table-progress .bb-table-indeterminate:before{top:0;left:0;bottom:0;content:\"\";position:absolute;will-change:left,right;background-color:inherit;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.bb-table-progress .bb-table-indeterminate:after{top:0;left:0;bottom:0;content:\"\";position:absolute;animation-delay:1.15s;will-change:left,right;background-color:inherit;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite}.bb-table-progress-close-query{padding:0;border:none;border-radius:4px;background-color:transparent;transition:background-color .25s cubic-bezier(0,0,.2,1)}.bb-table-progress-close-query:hover{background-color:#00000014}.bb-table-progress-close-query:focus{background-color:#0000001f}.bb-table-progress-close-query:active{background-color:#00000029}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@media only screen and (min-width: 768px){.bb-table-top-actions{flex-direction:row}.bb-table-top-actions>*:not(:first-child){margin-left:10px;margin-bottom:10px}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.BbInput, selector: "input[bbInput], textarea[bbInput]", inputs: ["readonly"] }, { kind: "directive", type: i3.BbSelect, selector: "select[bbInput]", inputs: ["disabled", "required"] }, { kind: "directive", type: i3.BbSuffix, selector: "[bbSuffix]" }, { kind: "component", type: i3.BbIcon, selector: "bb-icon", inputs: ["alt", "size", "src", "ariaHidden"] }, { kind: "component", type: i3.BbFormControl, selector: "bb-form-control", inputs: ["grouped", "hideErrors", "label", "hint"] }, { kind: "component", type: BbTablePager, selector: "bb-table-pager", inputs: ["disabled", "amountOfButtons", "showArrowButtons", "pageNumber", "totalPages"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.BbLocalize, name: "bbLocalize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
403
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTable, decorators: [{
404
- type: Component,
405
- args: [{ selector: 'bb-table', host: { 'class': 'bb-table' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, template: "<!--\r\n This is the header of the table. It can be a user\r\n defined custom header or just the default header.\r\n-->\r\n\r\n<header *ngIf=\"(header === true ? headerTemplate : header) as template\"\r\n class=\"bb-table-top-actions\">\r\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\r\n</header>\r\n\r\n<!--\r\n This is the table that contains the\r\n rows and columns.\r\n-->\r\n\r\n<div class=\"bb-table-wrapper\">\r\n <div *ngIf=\"isLoading$ | async\"\r\n class=\"bb-table-progress\">\r\n <div class=\"bb-table-indeterminate\"></div>\r\n </div>\r\n <table class=\"bb-table-container\">\r\n <thead>\r\n <tr>\r\n <ng-content select=\"bb-table-header-cell\"></ng-content>\r\n </tr>\r\n </thead>\r\n <tbody *ngIf=\"data$ | async as data; else isLoadingTemplate\"\r\n [ngSwitch]=\"data?.state\">\r\n <ng-container *ngSwitchCase=\"'success'\">\r\n <ng-container *ngIf=\"!!tableRowTemplate; else tableCellsTemplates\">\r\n <ng-container\r\n *ngTemplateOutlet=\"tableRowTemplate; context: {data: data?.result?.data || []}\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-template #tableCellsTemplates>\r\n <tr *ngFor=\"let item of data?.result?.data; trackBy: trackByFn\">\r\n <ng-container *ngFor=\"let template of tableColumnTemplates\">\r\n <ng-container *ngTemplateOutlet=\"template; context: {item: item}\"></ng-container>\r\n </ng-container>\r\n </tr>\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'empty'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'error_datasource'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'error_not_found'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'error_server'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchCase=\"'error_down'\">\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngSwitchDefault>\r\n <ng-container\r\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n<footer *ngIf=\"(footer === true ? footerTemplate : footer) as template\"\r\n class=\"bb-table-bottom-actions\">\r\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\r\n</footer>\r\n\r\n<ng-template #isLoadingTemplate>\r\n <tr>\r\n <td [attr.colspan]=\"headerCount\"\r\n class=\"bb-table-template\">\r\n <div class=\"bb-table-template-content\">\r\n {{ 'tables.loading' | bbLocalize }}\r\n </div>\r\n </td>\r\n </tr>\r\n</ng-template>\r\n\r\n<!--\r\n This is the template that will be used when the user has not\r\n supplied a custom header template.\r\n-->\r\n\r\n<ng-template #headerTemplate>\r\n <ng-content></ng-content>\r\n <bb-form-control>\r\n <input [formControl]=\"queryControl\"\r\n [placeholder]=\"'tables.search' | bbLocalize\"\r\n bbInput\r\n autocomplete=\"off\">\r\n <bb-icon *ngIf=\"queryControl?.value?.length <= 0; else closeButtonTemplate\"\r\n bbSuffix\r\n src=\"material:search\">\r\n </bb-icon>\r\n </bb-form-control>\r\n</ng-template>\r\n\r\n<!--\r\n This is the template that will be used when the user has not\r\n supplied a custom footer template.\r\n-->\r\n\r\n<ng-template #footerTemplate>\r\n <bb-form-control *ngIf=\"sizes?.length > 1\">\r\n <select [formControl]=\"pageSizeControl\"\r\n bbInput\r\n title=\"Sizes\">\r\n <option *ngFor=\"let item of sizes; trackBy: trackByValue\"\r\n [ngValue]=\"item\">\r\n {{ item }} / {{ 'tables.page' | bbLocalize }}\r\n </option>\r\n </select>\r\n </bb-form-control>\r\n\r\n <bb-table-pager [totalPages]=\"(data$ | async)?.result?.totalPages\"\r\n [formControl]=\"pageNumberControl\">\r\n </bb-table-pager>\r\n</ng-template>\r\n\r\n<!--\r\n This the template that will be used when the user\r\n has filled in some data in the query control.\r\n-->\r\n\r\n<ng-template #closeButtonTemplate>\r\n <button bbSuffix\r\n (click)=\"queryControl?.patchValue('')\"\r\n type=\"button\"\r\n class=\"bb-table-progress-close-query\">\r\n <bb-icon src=\"material:close\"></bb-icon>\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template #errorTemplate let-state=\"state\" let-status=\"statusCode\">\r\n <tr>\r\n <td [attr.colspan]=\"headerCount\"\r\n class=\"bb-table-template\">\r\n <div class=\"bb-table-template-content\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"64\" height=\"41\">\r\n <g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(0 1)\">\r\n <ellipse cx=\"32\" cy=\"33\" fill=\"#F5F5F5\" rx=\"32\" ry=\"7\"></ellipse>\r\n <g fill-rule=\"nonzero\" stroke=\"#D9D9D9\">\r\n <path\r\n d=\"M55 12.7605604L44.8543047 1.25739633C44.3674414.47382661 43.6558789 0 42.9067617 0H21.0932383c-.7491172 0-1.4606797.47395025-1.947543 1.25739633L9 12.7605604V22h46v-9.2394396z\"></path>\r\n <path fill=\"#FAFAFA\"\r\n d=\"M41.6132813 15.9315c0-1.6056489.9936718-2.931266 2.2264179-2.9315H55v18.1371277C55 33.2589574 53.6793867 35 52.0504297 35H11.94957031C10.32052344 35 9 33.2588404 9 31.1371277V13h11.1603008c1.2327461 0 2.226418 1.3228085 2.226418 2.9284574v.0211809c0 1.6056489 1.0049921 2.9015426 2.2377382 2.9015426h14.751086c1.2327461 0 2.2377383-1.3078298 2.2377383-2.9134788V15.9315z\"></path>\r\n </g>\r\n </g>\r\n </svg>\r\n <span *ngIf=\"state as stateLabel\">{{ ('tables.' + stateLabel) | bbLocalize }}</span>\r\n <span *ngIf=\"status as statusCode\"\r\n class=\"bb-table-template-content-code\">(HTTP {{ statusCode }})</span>\r\n </div>\r\n </td>\r\n </tr>\r\n</ng-template>\r\n", styles: [".bb-table{width:100%;display:block;box-shadow:0 6px 6px -6px #0000001a}.bb-table.plain{box-shadow:none}.bb-table.plain>.bb-table-wrapper{border-top-left-radius:0;border-top-right-radius:0}.bb-table-wrapper{overflow-x:auto;position:relative;background-color:#fff;border-top-left-radius:4px;border-top-right-radius:4px}.bb-table-container{width:100%}.bb-table-container td{border-bottom:1px solid #d8d8d8}.bb-table-top-actions{display:flex;flex-wrap:wrap;flex-direction:column;padding:20px 20px 10px;background-color:#fff;justify-content:flex-end;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:1px solid #d8d8d8}.bb-table-top-actions>*{margin-left:0;margin-bottom:10px}.bb-table-top-actions+.bb-table-wrapper{border-radius:0}.bb-table-bottom-actions{height:60px;display:flex;padding:0 20px;overflow-x:auto;align-items:center;background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.bb-table-template{border:none;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-template-content{padding:20px;display:flex;color:#3d464d;font-size:14px;line-height:1.2;font-weight:400;min-height:140px;text-align:center;align-items:center;flex-direction:column;justify-content:center}.bb-table-template-content>svg{margin-bottom:12px}.bb-table-template-content-code{opacity:.5;margin-top:5px;display:inline-block}.bb-table-progress{top:0;left:0;right:0;opacity:0;width:100%;height:4px;display:block;overflow:hidden;position:absolute;background-color:#2f408b4d;animation:fadeIn .25s cubic-bezier(0,0,.2,1) .1s forwards}.bb-table-progress .bb-table-indeterminate{background-color:#2f408b}.bb-table-progress .bb-table-indeterminate:before{top:0;left:0;bottom:0;content:\"\";position:absolute;will-change:left,right;background-color:inherit;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.bb-table-progress .bb-table-indeterminate:after{top:0;left:0;bottom:0;content:\"\";position:absolute;animation-delay:1.15s;will-change:left,right;background-color:inherit;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite}.bb-table-progress-close-query{padding:0;border:none;border-radius:4px;background-color:transparent;transition:background-color .25s cubic-bezier(0,0,.2,1)}.bb-table-progress-close-query:hover{background-color:#00000014}.bb-table-progress-close-query:focus{background-color:#0000001f}.bb-table-progress-close-query:active{background-color:#00000029}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@media only screen and (min-width: 768px){.bb-table-top-actions{flex-direction:row}.bb-table-top-actions>*:not(:first-child){margin-left:10px;margin-bottom:10px}}\n"] }]
406
- }], propDecorators: { tableColumnTemplates: [{
407
- type: ContentChildren,
408
- args: [BbTableColumnDef, { read: TemplateRef }]
409
- }], tableRowTemplate: [{
410
- type: ContentChild,
411
- args: [BbTableRowDef, { read: TemplateRef, static: false }]
412
- }], identifier: [{
413
- type: Input
414
- }], dataSource: [{
415
- type: Input
416
- }], queryFields: [{
417
- type: Input
418
- }], sortingStrategy: [{
419
- type: Input
420
- }], header: [{
421
- type: Input
422
- }], footer: [{
423
- type: Input
424
- }], sizes: [{
425
- type: Input
243
+ class BbTableColumnDef {
244
+ }
245
+ BbTableColumnDef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTableColumnDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
246
+ BbTableColumnDef.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.4", type: BbTableColumnDef, selector: "[bbTableColumnDef]", ngImport: i0 });
247
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTableColumnDef, decorators: [{
248
+ type: Directive,
249
+ args: [{
250
+ selector: '[bbTableColumnDef]'
251
+ }]
252
+ }] });
253
+ class BbTableRowDef {
254
+ }
255
+ BbTableRowDef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTableRowDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
256
+ BbTableRowDef.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.0.4", type: BbTableRowDef, selector: "[bbTableRowDef]", ngImport: i0 });
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTableRowDef, decorators: [{
258
+ type: Directive,
259
+ args: [{
260
+ selector: '[bbTableRowDef]'
261
+ }]
262
+ }] });
263
+ class BbTable {
264
+ constructor() {
265
+ // Inputs.
266
+ this.identifier = null;
267
+ this.queryFields = [];
268
+ this.sortingStrategy = 'single';
269
+ this.header = true;
270
+ this.footer = true;
271
+ // Sizes.
272
+ this._sizes = [25, 50, 75, 100];
273
+ // Optimizations.
274
+ this.trackByFn = (index, item) => this.identifier ? item[this.identifier] : index;
275
+ this.trackByValue = (_, item) => item;
276
+ this.queryControl = new FormControl('');
277
+ // State.
278
+ this._headerCount = 0;
279
+ }
280
+ get sizes() {
281
+ return this._sizes;
282
+ }
283
+ set sizes(newValue) {
284
+ this.updateSizes(newValue);
285
+ }
286
+ ngOnInit() {
287
+ this.composeForm();
288
+ this.watchDataChanges();
289
+ }
290
+ ngOnDestroy() {
291
+ var _a;
292
+ (_a = this._subscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
293
+ }
294
+ get headerCount() {
295
+ return this._headerCount;
296
+ }
297
+ get sortControl() {
298
+ var _a;
299
+ return (_a = this.form) === null || _a === void 0 ? void 0 : _a.get('sort');
300
+ }
301
+ get pageNumberControl() {
302
+ var _a;
303
+ return (_a = this.form) === null || _a === void 0 ? void 0 : _a.get('pageNumber');
304
+ }
305
+ get pageSizeControl() {
306
+ var _a;
307
+ return (_a = this.form) === null || _a === void 0 ? void 0 : _a.get('pageSize');
308
+ }
309
+ refresh() {
310
+ return this.request.update();
311
+ }
312
+ setHeaderCount(amount) {
313
+ this._headerCount += amount;
314
+ }
315
+ updateSizes(newValue) {
316
+ // Validate the sizes has at least one value.
317
+ if (newValue.length <= 0) {
318
+ throw new Error('Cannot set an empty array as the sizes.');
319
+ }
320
+ // Set the new size.
321
+ this._sizes = newValue;
322
+ // Validate that the form exists already.
323
+ if (!this.form) {
324
+ return;
325
+ }
326
+ // Check if the current selected value is
327
+ // in the new sizes array.
328
+ const pageSizeControl = this.form.get('pageSize');
329
+ if (this._sizes.includes(pageSizeControl.value)) {
330
+ return;
331
+ }
332
+ // Set the first value in the array as
333
+ // the new value.
334
+ const firstValue = this._sizes[0];
335
+ pageSizeControl.setValue(firstValue);
336
+ }
337
+ composeForm() {
338
+ // Setup the form.
339
+ this.form = new FormGroup({
340
+ pageSize: new FormControl(this._sizes[0]),
341
+ pageNumber: new FormControl(1),
342
+ sort: new FormGroup({})
343
+ });
344
+ }
345
+ watchDataChanges() {
346
+ // Create a new request.
347
+ this.request = new DataSourceRequest();
348
+ this.isLoading$ = this.request.loading;
349
+ if (!this.dataSource) {
350
+ this.data$ = of({ state: 'error_datasource' }).pipe(tap(() => this.request.stopLoading()));
351
+ return;
352
+ }
353
+ // Pass the request to the data source.
354
+ this.data$ = this.dataSource.handle(this.request).pipe(tap(() => this.request.stopLoading()), map(result => {
355
+ const count = (result && result.data && result.data.length) || 0;
356
+ if (count <= 0) {
357
+ return { state: 'empty', result };
358
+ }
359
+ return { state: 'success', result };
360
+ }), catchError(error => {
361
+ var _a, _b;
362
+ this.request.stopLoading();
363
+ const statusCode = (_a = error === null || error === void 0 ? void 0 : error.status) !== null && _a !== void 0 ? _a : null;
364
+ const states = {
365
+ 0: 'error_down',
366
+ 401: 'error_unauthorized',
367
+ 403: 'error_forbidden',
368
+ 404: 'error_not_found',
369
+ 500: 'error_server'
370
+ };
371
+ return of({ state: (_b = states === null || states === void 0 ? void 0 : states[statusCode]) !== null && _b !== void 0 ? _b : 'error_unknown', statusCode: statusCode });
372
+ }));
373
+ // Subscribe to the data changes.
374
+ this.subscribeToChanges();
375
+ }
376
+ subscribeToChanges() {
377
+ const form$ = this.getFormChanges();
378
+ const query$ = this.getQueryChanges();
379
+ this._subscription = combineLatest([form$, query$]).subscribe(([form, query]) => {
380
+ const { pageNumber, pageSize } = form;
381
+ const sort = Object.keys(form.sort)
382
+ .map(name => ({ name, direction: form.sort[name] }))
383
+ .filter(item => ['asc', 'desc'].includes(item.direction));
384
+ this.request.startLoading();
385
+ return this.request.update({
386
+ sort,
387
+ query,
388
+ pageSize,
389
+ pageNumber,
390
+ queryFields: this.queryFields
391
+ });
392
+ });
393
+ }
394
+ getQueryChanges() {
395
+ return this.queryControl.valueChanges.pipe(debounceTime(400), distinctUntilChanged(), startWith(this.queryControl.value));
396
+ }
397
+ getFormChanges() {
398
+ return this.form.valueChanges.pipe(startWith(this.form.value));
399
+ }
400
+ }
401
+ BbTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
402
+ BbTable.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: BbTable, selector: "bb-table", inputs: { identifier: "identifier", dataSource: "dataSource", queryFields: "queryFields", sortingStrategy: "sortingStrategy", header: "header", footer: "footer", sizes: "sizes" }, host: { classAttribute: "bb-table" }, queries: [{ propertyName: "tableRowTemplate", first: true, predicate: BbTableRowDef, descendants: true, read: TemplateRef }, { propertyName: "tableColumnTemplates", predicate: BbTableColumnDef, read: TemplateRef }], ngImport: i0, template: "<!--\n This is the header of the table. It can be a user\n defined custom header or just the default header.\n-->\n\n<header *ngIf=\"(header === true ? headerTemplate : header) as template\"\n class=\"bb-table-top-actions\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n</header>\n\n<!--\n This is the table that contains the\n rows and columns.\n-->\n\n<div class=\"bb-table-wrapper\">\n <div *ngIf=\"isLoading$ | async\"\n class=\"bb-table-progress\">\n <div class=\"bb-table-indeterminate\"></div>\n </div>\n <table class=\"bb-table-container\">\n <thead>\n <tr>\n <ng-content select=\"bb-table-header-cell\"></ng-content>\n </tr>\n </thead>\n <tbody *ngIf=\"data$ | async as data; else isLoadingTemplate\"\n [ngSwitch]=\"data?.state\">\n <ng-container *ngSwitchCase=\"'success'\">\n <ng-container *ngIf=\"!!tableRowTemplate; else tableCellsTemplates\">\n <ng-container\n *ngTemplateOutlet=\"tableRowTemplate; context: {data: data?.result?.data || []}\"></ng-container>\n </ng-container>\n\n <ng-template #tableCellsTemplates>\n <tr *ngFor=\"let item of data?.result?.data; trackBy: trackByFn\">\n <ng-container *ngFor=\"let template of tableColumnTemplates\">\n <ng-container *ngTemplateOutlet=\"template; context: {item: item}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'empty'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_datasource'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_not_found'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_server'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_down'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n </tbody>\n </table>\n</div>\n\n<footer *ngIf=\"(footer === true ? footerTemplate : footer) as template\"\n class=\"bb-table-bottom-actions\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n</footer>\n\n<ng-template #isLoadingTemplate>\n <tr>\n <td [attr.colspan]=\"headerCount\"\n class=\"bb-table-template\">\n <div class=\"bb-table-template-content\">\n {{ 'tables.loading' | bbLocalize }}\n </div>\n </td>\n </tr>\n</ng-template>\n\n<!--\n This is the template that will be used when the user has not\n supplied a custom header template.\n-->\n\n<ng-template #headerTemplate>\n <ng-content></ng-content>\n <bb-form-control>\n <input [formControl]=\"queryControl\"\n [placeholder]=\"'tables.search' | bbLocalize\"\n bbInput\n autocomplete=\"off\">\n <bb-icon *ngIf=\"queryControl?.value?.length <= 0; else closeButtonTemplate\"\n bbSuffix\n src=\"material:search\">\n </bb-icon>\n </bb-form-control>\n</ng-template>\n\n<!--\n This is the template that will be used when the user has not\n supplied a custom footer template.\n-->\n\n<ng-template #footerTemplate>\n <bb-form-control *ngIf=\"sizes?.length > 1\">\n <select [formControl]=\"pageSizeControl\"\n bbInput\n title=\"Sizes\">\n <option *ngFor=\"let item of sizes; trackBy: trackByValue\"\n [ngValue]=\"item\">\n {{ item }} / {{ 'tables.page' | bbLocalize }}\n </option>\n </select>\n </bb-form-control>\n\n <bb-table-pager [totalPages]=\"(data$ | async)?.result?.totalPages\"\n [formControl]=\"pageNumberControl\">\n </bb-table-pager>\n</ng-template>\n\n<!--\n This the template that will be used when the user\n has filled in some data in the query control.\n-->\n\n<ng-template #closeButtonTemplate>\n <button bbSuffix\n (click)=\"queryControl?.patchValue('')\"\n type=\"button\"\n class=\"bb-table-progress-close-query\">\n <bb-icon src=\"material:close\"></bb-icon>\n </button>\n</ng-template>\n\n<ng-template #errorTemplate let-state=\"state\" let-status=\"statusCode\">\n <tr>\n <td [attr.colspan]=\"headerCount\"\n class=\"bb-table-template\">\n <div class=\"bb-table-template-content\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"64\" height=\"41\">\n <g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(0 1)\">\n <ellipse cx=\"32\" cy=\"33\" fill=\"#F5F5F5\" rx=\"32\" ry=\"7\"></ellipse>\n <g fill-rule=\"nonzero\" stroke=\"#D9D9D9\">\n <path\n d=\"M55 12.7605604L44.8543047 1.25739633C44.3674414.47382661 43.6558789 0 42.9067617 0H21.0932383c-.7491172 0-1.4606797.47395025-1.947543 1.25739633L9 12.7605604V22h46v-9.2394396z\"></path>\n <path fill=\"#FAFAFA\"\n d=\"M41.6132813 15.9315c0-1.6056489.9936718-2.931266 2.2264179-2.9315H55v18.1371277C55 33.2589574 53.6793867 35 52.0504297 35H11.94957031C10.32052344 35 9 33.2588404 9 31.1371277V13h11.1603008c1.2327461 0 2.226418 1.3228085 2.226418 2.9284574v.0211809c0 1.6056489 1.0049921 2.9015426 2.2377382 2.9015426h14.751086c1.2327461 0 2.2377383-1.3078298 2.2377383-2.9134788V15.9315z\"></path>\n </g>\n </g>\n </svg>\n <span *ngIf=\"state as stateLabel\">{{ ('tables.' + stateLabel) | bbLocalize }}</span>\n <span *ngIf=\"status as statusCode\"\n class=\"bb-table-template-content-code\">(HTTP {{ statusCode }})</span>\n </div>\n </td>\n </tr>\n</ng-template>\n", styles: [".bb-table{width:100%;display:block;box-shadow:0 6px 6px -6px #0000001a}.bb-table.plain{box-shadow:none}.bb-table.plain>.bb-table-wrapper{border-top-left-radius:0;border-top-right-radius:0}.bb-table-wrapper{overflow-x:auto;position:relative;background-color:#fff;border-top-left-radius:4px;border-top-right-radius:4px}.bb-table-container{width:100%}.bb-table-container td{border-bottom:1px solid #d8d8d8}.bb-table-top-actions{display:flex;flex-wrap:wrap;flex-direction:column;padding:20px 20px 10px;background-color:#fff;justify-content:flex-end;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:1px solid #d8d8d8}.bb-table-top-actions>*{margin-left:0;margin-bottom:10px}.bb-table-top-actions+.bb-table-wrapper{border-radius:0}.bb-table-bottom-actions{height:60px;display:flex;padding:0 20px;overflow-x:auto;align-items:center;background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.bb-table-template{border:none;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-template-content{padding:20px;display:flex;color:#3d464d;font-size:14px;line-height:1.2;font-weight:400;min-height:140px;text-align:center;align-items:center;flex-direction:column;justify-content:center}.bb-table-template-content>svg{margin-bottom:12px}.bb-table-template-content-code{opacity:.5;margin-top:5px;display:inline-block}.bb-table-progress{top:0;left:0;right:0;opacity:0;width:100%;height:4px;display:block;overflow:hidden;position:absolute;background-color:#2f408b4d;animation:fadeIn .25s cubic-bezier(0,0,.2,1) .1s forwards}.bb-table-progress .bb-table-indeterminate{background-color:#2f408b}.bb-table-progress .bb-table-indeterminate:before{top:0;left:0;bottom:0;content:\"\";position:absolute;will-change:left,right;background-color:inherit;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.bb-table-progress .bb-table-indeterminate:after{top:0;left:0;bottom:0;content:\"\";position:absolute;animation-delay:1.15s;will-change:left,right;background-color:inherit;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite}.bb-table-progress-close-query{padding:0;border:none;border-radius:4px;background-color:transparent;transition:background-color .25s cubic-bezier(0,0,.2,1)}.bb-table-progress-close-query:hover{background-color:#00000014}.bb-table-progress-close-query:focus{background-color:#0000001f}.bb-table-progress-close-query:active{background-color:#00000029}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@media only screen and (min-width: 768px){.bb-table-top-actions{flex-direction:row}.bb-table-top-actions>*:not(:first-child){margin-left:10px;margin-bottom:10px}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.BbInput, selector: "input[bbInput], textarea[bbInput]", inputs: ["readonly"] }, { kind: "directive", type: i3.BbSelect, selector: "select[bbInput]", inputs: ["disabled", "required"] }, { kind: "directive", type: i3.BbSuffix, selector: "[bbSuffix]" }, { kind: "component", type: i3.BbIcon, selector: "bb-icon", inputs: ["alt", "size", "src", "ariaHidden"] }, { kind: "component", type: i3.BbFormControl, selector: "bb-form-control", inputs: ["grouped", "hideErrors", "label", "hint"] }, { kind: "component", type: BbTablePager, selector: "bb-table-pager", inputs: ["disabled", "amountOfButtons", "showArrowButtons", "pageNumber", "totalPages"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.BbLocalize, name: "bbLocalize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
403
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTable, decorators: [{
404
+ type: Component,
405
+ args: [{ selector: 'bb-table', host: { 'class': 'bb-table' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, template: "<!--\n This is the header of the table. It can be a user\n defined custom header or just the default header.\n-->\n\n<header *ngIf=\"(header === true ? headerTemplate : header) as template\"\n class=\"bb-table-top-actions\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n</header>\n\n<!--\n This is the table that contains the\n rows and columns.\n-->\n\n<div class=\"bb-table-wrapper\">\n <div *ngIf=\"isLoading$ | async\"\n class=\"bb-table-progress\">\n <div class=\"bb-table-indeterminate\"></div>\n </div>\n <table class=\"bb-table-container\">\n <thead>\n <tr>\n <ng-content select=\"bb-table-header-cell\"></ng-content>\n </tr>\n </thead>\n <tbody *ngIf=\"data$ | async as data; else isLoadingTemplate\"\n [ngSwitch]=\"data?.state\">\n <ng-container *ngSwitchCase=\"'success'\">\n <ng-container *ngIf=\"!!tableRowTemplate; else tableCellsTemplates\">\n <ng-container\n *ngTemplateOutlet=\"tableRowTemplate; context: {data: data?.result?.data || []}\"></ng-container>\n </ng-container>\n\n <ng-template #tableCellsTemplates>\n <tr *ngFor=\"let item of data?.result?.data; trackBy: trackByFn\">\n <ng-container *ngFor=\"let template of tableColumnTemplates\">\n <ng-container *ngTemplateOutlet=\"template; context: {item: item}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'empty'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_datasource'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_not_found'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_server'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_down'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n </tbody>\n </table>\n</div>\n\n<footer *ngIf=\"(footer === true ? footerTemplate : footer) as template\"\n class=\"bb-table-bottom-actions\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n</footer>\n\n<ng-template #isLoadingTemplate>\n <tr>\n <td [attr.colspan]=\"headerCount\"\n class=\"bb-table-template\">\n <div class=\"bb-table-template-content\">\n {{ 'tables.loading' | bbLocalize }}\n </div>\n </td>\n </tr>\n</ng-template>\n\n<!--\n This is the template that will be used when the user has not\n supplied a custom header template.\n-->\n\n<ng-template #headerTemplate>\n <ng-content></ng-content>\n <bb-form-control>\n <input [formControl]=\"queryControl\"\n [placeholder]=\"'tables.search' | bbLocalize\"\n bbInput\n autocomplete=\"off\">\n <bb-icon *ngIf=\"queryControl?.value?.length <= 0; else closeButtonTemplate\"\n bbSuffix\n src=\"material:search\">\n </bb-icon>\n </bb-form-control>\n</ng-template>\n\n<!--\n This is the template that will be used when the user has not\n supplied a custom footer template.\n-->\n\n<ng-template #footerTemplate>\n <bb-form-control *ngIf=\"sizes?.length > 1\">\n <select [formControl]=\"pageSizeControl\"\n bbInput\n title=\"Sizes\">\n <option *ngFor=\"let item of sizes; trackBy: trackByValue\"\n [ngValue]=\"item\">\n {{ item }} / {{ 'tables.page' | bbLocalize }}\n </option>\n </select>\n </bb-form-control>\n\n <bb-table-pager [totalPages]=\"(data$ | async)?.result?.totalPages\"\n [formControl]=\"pageNumberControl\">\n </bb-table-pager>\n</ng-template>\n\n<!--\n This the template that will be used when the user\n has filled in some data in the query control.\n-->\n\n<ng-template #closeButtonTemplate>\n <button bbSuffix\n (click)=\"queryControl?.patchValue('')\"\n type=\"button\"\n class=\"bb-table-progress-close-query\">\n <bb-icon src=\"material:close\"></bb-icon>\n </button>\n</ng-template>\n\n<ng-template #errorTemplate let-state=\"state\" let-status=\"statusCode\">\n <tr>\n <td [attr.colspan]=\"headerCount\"\n class=\"bb-table-template\">\n <div class=\"bb-table-template-content\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"64\" height=\"41\">\n <g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(0 1)\">\n <ellipse cx=\"32\" cy=\"33\" fill=\"#F5F5F5\" rx=\"32\" ry=\"7\"></ellipse>\n <g fill-rule=\"nonzero\" stroke=\"#D9D9D9\">\n <path\n d=\"M55 12.7605604L44.8543047 1.25739633C44.3674414.47382661 43.6558789 0 42.9067617 0H21.0932383c-.7491172 0-1.4606797.47395025-1.947543 1.25739633L9 12.7605604V22h46v-9.2394396z\"></path>\n <path fill=\"#FAFAFA\"\n d=\"M41.6132813 15.9315c0-1.6056489.9936718-2.931266 2.2264179-2.9315H55v18.1371277C55 33.2589574 53.6793867 35 52.0504297 35H11.94957031C10.32052344 35 9 33.2588404 9 31.1371277V13h11.1603008c1.2327461 0 2.226418 1.3228085 2.226418 2.9284574v.0211809c0 1.6056489 1.0049921 2.9015426 2.2377382 2.9015426h14.751086c1.2327461 0 2.2377383-1.3078298 2.2377383-2.9134788V15.9315z\"></path>\n </g>\n </g>\n </svg>\n <span *ngIf=\"state as stateLabel\">{{ ('tables.' + stateLabel) | bbLocalize }}</span>\n <span *ngIf=\"status as statusCode\"\n class=\"bb-table-template-content-code\">(HTTP {{ statusCode }})</span>\n </div>\n </td>\n </tr>\n</ng-template>\n", styles: [".bb-table{width:100%;display:block;box-shadow:0 6px 6px -6px #0000001a}.bb-table.plain{box-shadow:none}.bb-table.plain>.bb-table-wrapper{border-top-left-radius:0;border-top-right-radius:0}.bb-table-wrapper{overflow-x:auto;position:relative;background-color:#fff;border-top-left-radius:4px;border-top-right-radius:4px}.bb-table-container{width:100%}.bb-table-container td{border-bottom:1px solid #d8d8d8}.bb-table-top-actions{display:flex;flex-wrap:wrap;flex-direction:column;padding:20px 20px 10px;background-color:#fff;justify-content:flex-end;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:1px solid #d8d8d8}.bb-table-top-actions>*{margin-left:0;margin-bottom:10px}.bb-table-top-actions+.bb-table-wrapper{border-radius:0}.bb-table-bottom-actions{height:60px;display:flex;padding:0 20px;overflow-x:auto;align-items:center;background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.bb-table-template{border:none;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-template-content{padding:20px;display:flex;color:#3d464d;font-size:14px;line-height:1.2;font-weight:400;min-height:140px;text-align:center;align-items:center;flex-direction:column;justify-content:center}.bb-table-template-content>svg{margin-bottom:12px}.bb-table-template-content-code{opacity:.5;margin-top:5px;display:inline-block}.bb-table-progress{top:0;left:0;right:0;opacity:0;width:100%;height:4px;display:block;overflow:hidden;position:absolute;background-color:#2f408b4d;animation:fadeIn .25s cubic-bezier(0,0,.2,1) .1s forwards}.bb-table-progress .bb-table-indeterminate{background-color:#2f408b}.bb-table-progress .bb-table-indeterminate:before{top:0;left:0;bottom:0;content:\"\";position:absolute;will-change:left,right;background-color:inherit;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.bb-table-progress .bb-table-indeterminate:after{top:0;left:0;bottom:0;content:\"\";position:absolute;animation-delay:1.15s;will-change:left,right;background-color:inherit;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite}.bb-table-progress-close-query{padding:0;border:none;border-radius:4px;background-color:transparent;transition:background-color .25s cubic-bezier(0,0,.2,1)}.bb-table-progress-close-query:hover{background-color:#00000014}.bb-table-progress-close-query:focus{background-color:#0000001f}.bb-table-progress-close-query:active{background-color:#00000029}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@media only screen and (min-width: 768px){.bb-table-top-actions{flex-direction:row}.bb-table-top-actions>*:not(:first-child){margin-left:10px;margin-bottom:10px}}\n"] }]
406
+ }], propDecorators: { tableColumnTemplates: [{
407
+ type: ContentChildren,
408
+ args: [BbTableColumnDef, { read: TemplateRef }]
409
+ }], tableRowTemplate: [{
410
+ type: ContentChild,
411
+ args: [BbTableRowDef, { read: TemplateRef, static: false }]
412
+ }], identifier: [{
413
+ type: Input
414
+ }], dataSource: [{
415
+ type: Input
416
+ }], queryFields: [{
417
+ type: Input
418
+ }], sortingStrategy: [{
419
+ type: Input
420
+ }], header: [{
421
+ type: Input
422
+ }], footer: [{
423
+ type: Input
424
+ }], sizes: [{
425
+ type: Input
426
426
  }] } });
427
427
 
428
- class BbTableCell {
429
- }
430
- BbTableCell.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTableCell, deps: [], target: i0.ɵɵFactoryTarget.Component });
431
- BbTableCell.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: BbTableCell, selector: "bb-table-cell", host: { classAttribute: "bb-table-cell" }, ngImport: i0, template: "<div>\r\n <ng-content></ng-content>\r\n</div>", styles: [".bb-table-cell{color:#848f99;font-size:14px;text-align:left;line-height:1.2;font-weight:400;padding:12px 20px;display:table-cell;word-wrap:break-word;vertical-align:middle;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-cell:not(:last-child){border-right:1px solid #d8d8d8}.bb-table-cell.fit{width:1%;white-space:nowrap}.bb-table-cell.left{text-align:left}.bb-table-cell.center{text-align:center}.bb-table-cell.right{text-align:right}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
432
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTableCell, decorators: [{
433
- type: Component,
434
- args: [{ selector: 'bb-table-cell', changeDetection: ChangeDetectionStrategy.OnPush, host: { 'class': 'bb-table-cell' }, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, template: "<div>\r\n <ng-content></ng-content>\r\n</div>", styles: [".bb-table-cell{color:#848f99;font-size:14px;text-align:left;line-height:1.2;font-weight:400;padding:12px 20px;display:table-cell;word-wrap:break-word;vertical-align:middle;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-cell:not(:last-child){border-right:1px solid #d8d8d8}.bb-table-cell.fit{width:1%;white-space:nowrap}.bb-table-cell.left{text-align:left}.bb-table-cell.center{text-align:center}.bb-table-cell.right{text-align:right}\n"] }]
428
+ class BbTableCell {
429
+ }
430
+ BbTableCell.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTableCell, deps: [], target: i0.ɵɵFactoryTarget.Component });
431
+ BbTableCell.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: BbTableCell, selector: "bb-table-cell", host: { classAttribute: "bb-table-cell" }, ngImport: i0, template: "<div>\n <ng-content></ng-content>\n</div>", styles: [".bb-table-cell{color:#848f99;font-size:14px;text-align:left;line-height:1.2;font-weight:400;padding:12px 20px;display:table-cell;word-wrap:break-word;vertical-align:middle;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-cell:not(:last-child){border-right:1px solid #d8d8d8}.bb-table-cell.fit{width:1%;white-space:nowrap}.bb-table-cell.left{text-align:left}.bb-table-cell.center{text-align:center}.bb-table-cell.right{text-align:right}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
432
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTableCell, decorators: [{
433
+ type: Component,
434
+ args: [{ selector: 'bb-table-cell', changeDetection: ChangeDetectionStrategy.OnPush, host: { 'class': 'bb-table-cell' }, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, template: "<div>\n <ng-content></ng-content>\n</div>", styles: [".bb-table-cell{color:#848f99;font-size:14px;text-align:left;line-height:1.2;font-weight:400;padding:12px 20px;display:table-cell;word-wrap:break-word;vertical-align:middle;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-cell:not(:last-child){border-right:1px solid #d8d8d8}.bb-table-cell.fit{width:1%;white-space:nowrap}.bb-table-cell.left{text-align:left}.bb-table-cell.center{text-align:center}.bb-table-cell.right{text-align:right}\n"] }]
435
435
  }] });
436
436
 
437
- class BbTableHeaderCellBase {
438
- }
439
- const BbTableHeaderCellMixinBase = mixinDisabled(BbTableHeaderCellBase);
440
- class BbTableHeaderCell extends BbTableHeaderCellMixinBase {
441
- constructor(_table, _name) {
442
- super();
443
- this._table = _table;
444
- this._name = _name;
445
- // Constants.
446
- this._sortDirections = ['none', 'asc', 'desc'];
447
- this._control = new FormControl(this._sortDirections[0]);
448
- this.logWarning = (message) => {
449
- console && console.warn && console.warn(message);
450
- };
451
- }
452
- // Sort.
453
- set sort(value) {
454
- // Check if the new value is a valid value.
455
- if (!this._sortDirections.includes(value)) {
456
- return;
457
- }
458
- // Set the value.
459
- this._control.setValue(value);
460
- }
461
- get sort() {
462
- return this._control.value;
463
- }
464
- ngOnInit() {
465
- var _a, _b, _c, _d;
466
- // Validate that the name and table are set.
467
- (_b = (_a = this._table) === null || _a === void 0 ? void 0 : _a.setHeaderCount) === null || _b === void 0 ? void 0 : _b.call(_a, 1);
468
- if (!this._table || !this._name) {
469
- return;
470
- }
471
- // Check if the control already exists in the table.
472
- if ((_c = this._table.sortControl) === null || _c === void 0 ? void 0 : _c.contains(this._name)) {
473
- this.disabled = true;
474
- return this.logWarning(`BbTableHeaderCell: The name "${this._name}" is not unique in the table; Control was not registered.`);
475
- }
476
- // Register the header cell with the table.
477
- (_d = this._table.sortControl) === null || _d === void 0 ? void 0 : _d.addControl(this._name, this._control);
478
- // Get all the value changes.
479
- this.valueChanges$ = this._control.valueChanges.pipe(startWith(this._control.value));
480
- }
481
- ngOnDestroy() {
482
- var _a, _b, _c, _d, _e, _f;
483
- (_b = (_a = this._table) === null || _a === void 0 ? void 0 : _a.setHeaderCount) === null || _b === void 0 ? void 0 : _b.call(_a, -1);
484
- // Validate that the name and table are set.
485
- if (!this._table || !this._name) {
486
- return;
487
- }
488
- // Un-register the header cell with the table.
489
- if ((_d = (_c = this._table) === null || _c === void 0 ? void 0 : _c.sortControl) === null || _d === void 0 ? void 0 : _d.contains(this._name)) {
490
- (_f = (_e = this._table) === null || _e === void 0 ? void 0 : _e.sortControl) === null || _f === void 0 ? void 0 : _f.removeControl(this._name);
491
- }
492
- }
493
- get isDisabled() {
494
- return this.disabled || !this._name;
495
- }
496
- onClick() {
497
- // Check if the header cell is disabled.
498
- if (this.isDisabled) {
499
- return;
500
- }
501
- // Find the index of the current sort and
502
- // create the new index.
503
- const index = this._sortDirections.findIndex(item => item === this._control.value);
504
- const newIndex = (index + 1) % this._sortDirections.length;
505
- const newSort = this._sortDirections[newIndex];
506
- // Set the new sort.
507
- return this.updateTableAndHeaderCell(newSort);
508
- }
509
- updateTableAndHeaderCell(value) {
510
- // Check if the new value is a valid value.
511
- if (!this._sortDirections.includes(value)) {
512
- return;
513
- }
514
- // Validate the table exists.
515
- if (!this._table) {
516
- return this._control.setValue(value);
517
- }
518
- // Handle the single sorting strategy.
519
- if (this._table.sortingStrategy === 'single') {
520
- return this.handleSingleSortingStrategy(value);
521
- }
522
- // Default case when no other strategy
523
- // is used.
524
- return this._control.setValue(value);
525
- }
526
- handleSingleSortingStrategy(value) {
527
- var _a, _b;
528
- // Get the sort control.
529
- const control = this._table.sortControl;
530
- // Set each value to false since we only want to
531
- // sort on one property at a time with this strategy.
532
- const newValue = Object.keys(control.controls).reduce((previous, current) => {
533
- previous[current] = current === this._name ? value : 'none';
534
- return previous;
535
- }, {});
536
- // Patch the entire sort value.
537
- (_b = (_a = this._table) === null || _a === void 0 ? void 0 : _a.sortControl) === null || _b === void 0 ? void 0 : _b.patchValue(newValue);
538
- }
539
- }
540
- BbTableHeaderCell.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTableHeaderCell, deps: [{ token: BbTable, host: true, optional: true }, { token: 'name', attribute: true, optional: true }], target: i0.ɵɵFactoryTarget.Component });
541
- BbTableHeaderCell.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: BbTableHeaderCell, selector: "bb-table-header-cell", inputs: { disabled: "disabled", sort: "sort" }, host: { listeners: { "click": "onClick()" }, properties: { "class.disabled": "isDisabled" }, classAttribute: "bb-table-header-cell" }, usesInheritance: true, ngImport: i0, template: "<!-- The content. -->\r\n<ng-content></ng-content>\r\n\r\n<!-- The indicator for the sort direction. -->\r\n<ng-container *ngIf=\"valueChanges$ | async as value\">\r\n <button *ngIf=\"!isDisabled\"\r\n [class.asc]=\"value === 'asc'\"\r\n [class.desc]=\"value === 'desc'\"\r\n class=\"bb-table-header-cell-toggle\"\r\n type=\"button\"></button>\r\n</ng-container>\r\n", styles: [".bb-table-header-cell{height:50px;color:#212529;cursor:pointer;font-size:16px;font-weight:500;-webkit-user-select:none;user-select:none;padding:10px 20px;position:relative;display:table-cell;vertical-align:middle;border-bottom:1px solid #d8d8d8}.bb-table-header-cell:active>.bb-table-header-cell-toggle{background-color:#00000014}.bb-table-header-cell:not(.disabled){padding-right:52px}.bb-table-header-cell.fit{width:1%;white-space:nowrap}.bb-table-header-cell.left{text-align:left}.bb-table-header-cell.center{text-align:center}.bb-table-header-cell.right{text-align:right}.bb-table-header-cell.disabled{cursor:default;pointer-events:none}.bb-table-header-cell-toggle{top:50%;right:14px;width:22px;border:none;height:22px;margin-left:auto;position:absolute;border-radius:4px;transform:translateY(-50%);background-position:center;background-repeat:no-repeat;background-color:transparent;transition:background-color .2s cubic-bezier(0,0,.2,1);background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}.bb-table-header-cell-toggle.desc{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"black\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}.bb-table-header-cell-toggle.asc{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"black\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
542
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: BbTableHeaderCell, decorators: [{
543
- type: Component,
544
- args: [{ selector: 'bb-table-header-cell', changeDetection: ChangeDetectionStrategy.OnPush, host: {
545
- 'class': 'bb-table-header-cell',
546
- '[class.disabled]': 'isDisabled'
547
- }, inputs: ['disabled'], encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, template: "<!-- The content. -->\r\n<ng-content></ng-content>\r\n\r\n<!-- The indicator for the sort direction. -->\r\n<ng-container *ngIf=\"valueChanges$ | async as value\">\r\n <button *ngIf=\"!isDisabled\"\r\n [class.asc]=\"value === 'asc'\"\r\n [class.desc]=\"value === 'desc'\"\r\n class=\"bb-table-header-cell-toggle\"\r\n type=\"button\"></button>\r\n</ng-container>\r\n", styles: [".bb-table-header-cell{height:50px;color:#212529;cursor:pointer;font-size:16px;font-weight:500;-webkit-user-select:none;user-select:none;padding:10px 20px;position:relative;display:table-cell;vertical-align:middle;border-bottom:1px solid #d8d8d8}.bb-table-header-cell:active>.bb-table-header-cell-toggle{background-color:#00000014}.bb-table-header-cell:not(.disabled){padding-right:52px}.bb-table-header-cell.fit{width:1%;white-space:nowrap}.bb-table-header-cell.left{text-align:left}.bb-table-header-cell.center{text-align:center}.bb-table-header-cell.right{text-align:right}.bb-table-header-cell.disabled{cursor:default;pointer-events:none}.bb-table-header-cell-toggle{top:50%;right:14px;width:22px;border:none;height:22px;margin-left:auto;position:absolute;border-radius:4px;transform:translateY(-50%);background-position:center;background-repeat:no-repeat;background-color:transparent;transition:background-color .2s cubic-bezier(0,0,.2,1);background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}.bb-table-header-cell-toggle.desc{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"black\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}.bb-table-header-cell-toggle.asc{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"black\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}\n"] }]
548
- }], ctorParameters: function () {
549
- return [{ type: BbTable, decorators: [{
550
- type: Optional
551
- }, {
552
- type: Host
553
- }] }, { type: undefined, decorators: [{
554
- type: Optional
555
- }, {
556
- type: Attribute,
557
- args: ['name']
558
- }] }];
559
- }, propDecorators: { sort: [{
560
- type: Input
561
- }], onClick: [{
562
- type: HostListener,
563
- args: ['click']
437
+ class BbTableHeaderCellBase {
438
+ }
439
+ const BbTableHeaderCellMixinBase = mixinDisabled(BbTableHeaderCellBase);
440
+ class BbTableHeaderCell extends BbTableHeaderCellMixinBase {
441
+ constructor(_table, _name) {
442
+ super();
443
+ this._table = _table;
444
+ this._name = _name;
445
+ // Constants.
446
+ this._sortDirections = ['none', 'asc', 'desc'];
447
+ this._control = new FormControl(this._sortDirections[0]);
448
+ this.logWarning = (message) => {
449
+ console && console.warn && console.warn(message);
450
+ };
451
+ }
452
+ // Sort.
453
+ set sort(value) {
454
+ // Check if the new value is a valid value.
455
+ if (!this._sortDirections.includes(value)) {
456
+ return;
457
+ }
458
+ // Set the value.
459
+ this._control.setValue(value);
460
+ }
461
+ get sort() {
462
+ return this._control.value;
463
+ }
464
+ ngOnInit() {
465
+ var _a, _b, _c, _d;
466
+ // Validate that the name and table are set.
467
+ (_b = (_a = this._table) === null || _a === void 0 ? void 0 : _a.setHeaderCount) === null || _b === void 0 ? void 0 : _b.call(_a, 1);
468
+ if (!this._table || !this._name) {
469
+ return;
470
+ }
471
+ // Check if the control already exists in the table.
472
+ if ((_c = this._table.sortControl) === null || _c === void 0 ? void 0 : _c.contains(this._name)) {
473
+ this.disabled = true;
474
+ return this.logWarning(`BbTableHeaderCell: The name "${this._name}" is not unique in the table; Control was not registered.`);
475
+ }
476
+ // Register the header cell with the table.
477
+ (_d = this._table.sortControl) === null || _d === void 0 ? void 0 : _d.addControl(this._name, this._control);
478
+ // Get all the value changes.
479
+ this.valueChanges$ = this._control.valueChanges.pipe(startWith(this._control.value));
480
+ }
481
+ ngOnDestroy() {
482
+ var _a, _b, _c, _d, _e, _f;
483
+ (_b = (_a = this._table) === null || _a === void 0 ? void 0 : _a.setHeaderCount) === null || _b === void 0 ? void 0 : _b.call(_a, -1);
484
+ // Validate that the name and table are set.
485
+ if (!this._table || !this._name) {
486
+ return;
487
+ }
488
+ // Un-register the header cell with the table.
489
+ if ((_d = (_c = this._table) === null || _c === void 0 ? void 0 : _c.sortControl) === null || _d === void 0 ? void 0 : _d.contains(this._name)) {
490
+ (_f = (_e = this._table) === null || _e === void 0 ? void 0 : _e.sortControl) === null || _f === void 0 ? void 0 : _f.removeControl(this._name);
491
+ }
492
+ }
493
+ get isDisabled() {
494
+ return this.disabled || !this._name;
495
+ }
496
+ onClick() {
497
+ // Check if the header cell is disabled.
498
+ if (this.isDisabled) {
499
+ return;
500
+ }
501
+ // Find the index of the current sort and
502
+ // create the new index.
503
+ const index = this._sortDirections.findIndex(item => item === this._control.value);
504
+ const newIndex = (index + 1) % this._sortDirections.length;
505
+ const newSort = this._sortDirections[newIndex];
506
+ // Set the new sort.
507
+ return this.updateTableAndHeaderCell(newSort);
508
+ }
509
+ updateTableAndHeaderCell(value) {
510
+ // Check if the new value is a valid value.
511
+ if (!this._sortDirections.includes(value)) {
512
+ return;
513
+ }
514
+ // Validate the table exists.
515
+ if (!this._table) {
516
+ return this._control.setValue(value);
517
+ }
518
+ // Handle the single sorting strategy.
519
+ if (this._table.sortingStrategy === 'single') {
520
+ return this.handleSingleSortingStrategy(value);
521
+ }
522
+ // Default case when no other strategy
523
+ // is used.
524
+ return this._control.setValue(value);
525
+ }
526
+ handleSingleSortingStrategy(value) {
527
+ var _a, _b;
528
+ // Get the sort control.
529
+ const control = this._table.sortControl;
530
+ // Set each value to false since we only want to
531
+ // sort on one property at a time with this strategy.
532
+ const newValue = Object.keys(control.controls).reduce((previous, current) => {
533
+ previous[current] = current === this._name ? value : 'none';
534
+ return previous;
535
+ }, {});
536
+ // Patch the entire sort value.
537
+ (_b = (_a = this._table) === null || _a === void 0 ? void 0 : _a.sortControl) === null || _b === void 0 ? void 0 : _b.patchValue(newValue);
538
+ }
539
+ }
540
+ BbTableHeaderCell.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTableHeaderCell, deps: [{ token: BbTable, host: true, optional: true }, { token: 'name', attribute: true, optional: true }], target: i0.ɵɵFactoryTarget.Component });
541
+ BbTableHeaderCell.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.4", type: BbTableHeaderCell, selector: "bb-table-header-cell", inputs: { disabled: "disabled", sort: "sort" }, host: { listeners: { "click": "onClick()" }, properties: { "class.disabled": "isDisabled" }, classAttribute: "bb-table-header-cell" }, usesInheritance: true, ngImport: i0, template: "<!-- The content. -->\n<ng-content></ng-content>\n\n<!-- The indicator for the sort direction. -->\n<ng-container *ngIf=\"valueChanges$ | async as value\">\n <button *ngIf=\"!isDisabled\"\n [class.asc]=\"value === 'asc'\"\n [class.desc]=\"value === 'desc'\"\n class=\"bb-table-header-cell-toggle\"\n type=\"button\"></button>\n</ng-container>\n", styles: [".bb-table-header-cell{height:50px;color:#212529;cursor:pointer;font-size:16px;font-weight:500;-webkit-user-select:none;user-select:none;padding:10px 20px;position:relative;display:table-cell;vertical-align:middle;border-bottom:1px solid #d8d8d8}.bb-table-header-cell:active>.bb-table-header-cell-toggle{background-color:#00000014}.bb-table-header-cell:not(.disabled){padding-right:52px}.bb-table-header-cell.fit{width:1%;white-space:nowrap}.bb-table-header-cell.left{text-align:left}.bb-table-header-cell.center{text-align:center}.bb-table-header-cell.right{text-align:right}.bb-table-header-cell.disabled{cursor:default;pointer-events:none}.bb-table-header-cell-toggle{top:50%;right:14px;width:22px;border:none;height:22px;margin-left:auto;position:absolute;border-radius:4px;transform:translateY(-50%);background-position:center;background-repeat:no-repeat;background-color:transparent;transition:background-color .2s cubic-bezier(0,0,.2,1);background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}.bb-table-header-cell-toggle.desc{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"black\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}.bb-table-header-cell-toggle.asc{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"black\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
542
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: BbTableHeaderCell, decorators: [{
543
+ type: Component,
544
+ args: [{ selector: 'bb-table-header-cell', changeDetection: ChangeDetectionStrategy.OnPush, host: {
545
+ 'class': 'bb-table-header-cell',
546
+ '[class.disabled]': 'isDisabled'
547
+ }, inputs: ['disabled'], encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, template: "<!-- The content. -->\n<ng-content></ng-content>\n\n<!-- The indicator for the sort direction. -->\n<ng-container *ngIf=\"valueChanges$ | async as value\">\n <button *ngIf=\"!isDisabled\"\n [class.asc]=\"value === 'asc'\"\n [class.desc]=\"value === 'desc'\"\n class=\"bb-table-header-cell-toggle\"\n type=\"button\"></button>\n</ng-container>\n", styles: [".bb-table-header-cell{height:50px;color:#212529;cursor:pointer;font-size:16px;font-weight:500;-webkit-user-select:none;user-select:none;padding:10px 20px;position:relative;display:table-cell;vertical-align:middle;border-bottom:1px solid #d8d8d8}.bb-table-header-cell:active>.bb-table-header-cell-toggle{background-color:#00000014}.bb-table-header-cell:not(.disabled){padding-right:52px}.bb-table-header-cell.fit{width:1%;white-space:nowrap}.bb-table-header-cell.left{text-align:left}.bb-table-header-cell.center{text-align:center}.bb-table-header-cell.right{text-align:right}.bb-table-header-cell.disabled{cursor:default;pointer-events:none}.bb-table-header-cell-toggle{top:50%;right:14px;width:22px;border:none;height:22px;margin-left:auto;position:absolute;border-radius:4px;transform:translateY(-50%);background-position:center;background-repeat:no-repeat;background-color:transparent;transition:background-color .2s cubic-bezier(0,0,.2,1);background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}.bb-table-header-cell-toggle.desc{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"black\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}.bb-table-header-cell-toggle.asc{background-image:url('data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 9 15\" width=\"9\" height=\"15\"%3E%3Cpath fill=\"black\" d=\"M4.5 0L0 7h9z\"%3E%3C/path%3E%3Cpath fill=\"%23dcdcdc\" d=\"M4.5 15L9 8H0z\"%3E%3C/path%3E%3C/svg%3E')}\n"] }]
548
+ }], ctorParameters: function () {
549
+ return [{ type: BbTable, decorators: [{
550
+ type: Optional
551
+ }, {
552
+ type: Host
553
+ }] }, { type: undefined, decorators: [{
554
+ type: Optional
555
+ }, {
556
+ type: Attribute,
557
+ args: ['name']
558
+ }] }];
559
+ }, propDecorators: { sort: [{
560
+ type: Input
561
+ }], onClick: [{
562
+ type: HostListener,
563
+ args: ['click']
564
564
  }] } });
565
565
 
566
- const DECLARATIONS_EXPORTS = [
567
- BbTable,
568
- BbTableColumnDef,
569
- BbTableRowDef,
570
- BbTableHeaderCell,
571
- BbTableCell,
572
- BbTablePager
573
- ];
574
- class TableModule {
575
- }
576
- TableModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
577
- TableModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.3", ngImport: i0, type: TableModule, declarations: [BbTable,
578
- BbTableColumnDef,
579
- BbTableRowDef,
580
- BbTableHeaderCell,
581
- BbTableCell,
582
- BbTablePager], imports: [CommonModule, ReactiveFormsModule, ElementsModule, LocalizeModule], exports: [BbTable,
583
- BbTableColumnDef,
584
- BbTableRowDef,
585
- BbTableHeaderCell,
586
- BbTableCell,
587
- BbTablePager] });
588
- TableModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TableModule, imports: [CommonModule, ReactiveFormsModule, ElementsModule, LocalizeModule] });
589
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TableModule, decorators: [{
590
- type: NgModule,
591
- args: [{
592
- imports: [CommonModule, ReactiveFormsModule, ElementsModule, LocalizeModule],
593
- declarations: [...DECLARATIONS_EXPORTS],
594
- exports: [...DECLARATIONS_EXPORTS]
595
- }]
566
+ const DECLARATIONS_EXPORTS = [
567
+ BbTable,
568
+ BbTableColumnDef,
569
+ BbTableRowDef,
570
+ BbTableHeaderCell,
571
+ BbTableCell,
572
+ BbTablePager
573
+ ];
574
+ class TableModule {
575
+ }
576
+ TableModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: TableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
577
+ TableModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.4", ngImport: i0, type: TableModule, declarations: [BbTable,
578
+ BbTableColumnDef,
579
+ BbTableRowDef,
580
+ BbTableHeaderCell,
581
+ BbTableCell,
582
+ BbTablePager], imports: [CommonModule, ReactiveFormsModule, ElementsModule, LocalizeModule], exports: [BbTable,
583
+ BbTableColumnDef,
584
+ BbTableRowDef,
585
+ BbTableHeaderCell,
586
+ BbTableCell,
587
+ BbTablePager] });
588
+ TableModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: TableModule, imports: [CommonModule, ReactiveFormsModule, ElementsModule, LocalizeModule] });
589
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.4", ngImport: i0, type: TableModule, decorators: [{
590
+ type: NgModule,
591
+ args: [{
592
+ imports: [CommonModule, ReactiveFormsModule, ElementsModule, LocalizeModule],
593
+ declarations: [...DECLARATIONS_EXPORTS],
594
+ exports: [...DECLARATIONS_EXPORTS]
595
+ }]
596
596
  }] });
597
597
 
598
- /**
599
- * Generated bundle index. Do not edit.
598
+ /**
599
+ * Generated bundle index. Do not edit.
600
600
  */
601
601
 
602
602
  export { BbTable, BbTableCell, BbTableColumnDef, BbTableHeaderCell, BbTablePager, BbTableRowDef, DataSource, DataSourceRequest, GenericDataSource, TableModule };