ngx-techlify-core 11.4.8 → 11.4.9

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 (341) hide show
  1. package/README.md +24 -24
  2. package/bundles/ngx-techlify-core.umd.js +8085 -8047
  3. package/bundles/ngx-techlify-core.umd.js.map +1 -1
  4. package/bundles/ngx-techlify-core.umd.min.js +1 -1
  5. package/bundles/ngx-techlify-core.umd.min.js.map +1 -1
  6. package/esm2015/lib/action-popup/action-popup.component.js +32 -32
  7. package/esm2015/lib/action-popup/action-popup.model.js +3 -3
  8. package/esm2015/lib/action-popup/action-popup.module.js +26 -26
  9. package/esm2015/lib/action-popup/index.js +3 -3
  10. package/esm2015/lib/audit-log/audit-log-for-model/audit-log-for-model-routing.module.js +12 -12
  11. package/esm2015/lib/audit-log/audit-log-for-model/audit-log-for-model.component.js +49 -49
  12. package/esm2015/lib/audit-log/audit-log-for-model/audit-log-for-model.module.js +25 -25
  13. package/esm2015/lib/audit-log/audit-log-list/audit-log-list-routing.module.js +12 -12
  14. package/esm2015/lib/audit-log/audit-log-list/audit-log-list.component.js +132 -132
  15. package/esm2015/lib/audit-log/audit-log-list/audit-log-list.module.js +29 -29
  16. package/esm2015/lib/audit-log/audit-log-list-filter/audit-log-list-filter-routing.module.js +12 -12
  17. package/esm2015/lib/audit-log/audit-log-list-filter/audit-log-list-filter.component.js +67 -67
  18. package/esm2015/lib/audit-log/audit-log-list-filter/audit-log-list-filter.module.js +25 -25
  19. package/esm2015/lib/audit-log/audit-log-routing.module.js +19 -19
  20. package/esm2015/lib/audit-log/audit-log-view/audit-log-view-routing.module.js +12 -12
  21. package/esm2015/lib/audit-log/audit-log-view/audit-log-view.component.js +60 -60
  22. package/esm2015/lib/audit-log/audit-log-view/audit-log-view.module.js +21 -21
  23. package/esm2015/lib/audit-log/audit-log-view-model/audit-log-view-model-routing.module.js +12 -12
  24. package/esm2015/lib/audit-log/audit-log-view-model/audit-log-view-model.component.js +57 -57
  25. package/esm2015/lib/audit-log/audit-log-view-model/audit-log-view-model.module.js +21 -21
  26. package/esm2015/lib/audit-log/audit-log.module.js +20 -20
  27. package/esm2015/lib/audit-log/audit-logs-view-model/audit-logs-view-model-routing.module.js +12 -12
  28. package/esm2015/lib/audit-log/audit-logs-view-model/audit-logs-view-model.component.js +35 -35
  29. package/esm2015/lib/audit-log/audit-logs-view-model/audit-logs-view-model.module.js +21 -21
  30. package/esm2015/lib/base-model/index.js +4 -4
  31. package/esm2015/lib/base-model/techlify-form-component.class.js +51 -51
  32. package/esm2015/lib/base-model/techlify-listing-component.class.js +41 -41
  33. package/esm2015/lib/base-model/techlify-service.class.js +64 -64
  34. package/esm2015/lib/core/alert.service.js +39 -39
  35. package/esm2015/lib/core/api-prefix.interceptor.js +28 -28
  36. package/esm2015/lib/core/authentication.guard.js +39 -39
  37. package/esm2015/lib/core/authentication.service.js +59 -59
  38. package/esm2015/lib/core/cache.interceptor.js +60 -60
  39. package/esm2015/lib/core/config.service.js +47 -47
  40. package/esm2015/lib/core/core.module.js +42 -42
  41. package/esm2015/lib/core/credentials.service.js +84 -84
  42. package/esm2015/lib/core/dataManager.service.js +120 -120
  43. package/esm2015/lib/core/error-handler.interceptor.js +53 -53
  44. package/esm2015/lib/core/error-handler.service.js +59 -59
  45. package/esm2015/lib/core/form-validator.service.js +23 -23
  46. package/esm2015/lib/core/header.interceptor.js +22 -22
  47. package/esm2015/lib/core/http-cache.service.js +110 -110
  48. package/esm2015/lib/core/http.service.js +82 -82
  49. package/esm2015/lib/core/index.js +21 -21
  50. package/esm2015/lib/core/logger.service.js +100 -100
  51. package/esm2015/lib/core/route-reusable-strategy.js +35 -35
  52. package/esm2015/lib/core/snack/snack.component.js +33 -33
  53. package/esm2015/lib/core/snack/snack.module.js +25 -25
  54. package/esm2015/lib/core/storage.service.js +36 -36
  55. package/esm2015/lib/core/techlify-config.model.js +28 -28
  56. package/esm2015/lib/core/token.interceptor.js +30 -30
  57. package/esm2015/lib/data-table/data-table.component.js +190 -190
  58. package/esm2015/lib/data-table/data-table.model.js +11 -11
  59. package/esm2015/lib/data-table/data-table.module.js +25 -25
  60. package/esm2015/lib/data-table/index.js +3 -3
  61. package/esm2015/lib/date-validator.js +10 -10
  62. package/esm2015/lib/document-viewer/document-viewer.component.js +58 -58
  63. package/esm2015/lib/document-viewer/document-viewer.module.js +25 -25
  64. package/esm2015/lib/document-viewer/index.js +3 -3
  65. package/esm2015/lib/document-viewer/viewer-config.model.js +3 -3
  66. package/esm2015/lib/email-subscription/email-subscription-for-user/email-subscription-for-user-routing.module.js +26 -26
  67. package/esm2015/lib/email-subscription/email-subscription-for-user/email-subscription-for-user.component.js +72 -72
  68. package/esm2015/lib/email-subscription/email-subscription-for-user/email-subscription-for-user.module.js +23 -23
  69. package/esm2015/lib/email-subscription/email-subscription-for-user/index.js +2 -2
  70. package/esm2015/lib/email-subscription/email-subscription-routing.module.js +12 -12
  71. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form-routing.module.js +12 -12
  72. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form.component.js +102 -102
  73. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form.module.js +28 -28
  74. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-form/index.js +2 -2
  75. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list-routing.module.js +28 -28
  76. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list.component.js +153 -153
  77. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list.module.js +27 -27
  78. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-list/index.js +1 -1
  79. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type-routing.module.js +12 -12
  80. package/esm2015/lib/email-subscription/email-subscription-type/email-subscription-type.module.js +15 -15
  81. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form-routing.module.js +12 -12
  82. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form.component.js +99 -99
  83. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form.module.js +27 -27
  84. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-form/index.js +2 -2
  85. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list-routing.module.js +28 -28
  86. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list.component.js +155 -155
  87. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list.module.js +29 -29
  88. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-list/index.js +2 -2
  89. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter-routing.module.js +12 -12
  90. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter.component.js +50 -50
  91. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter.module.js +25 -25
  92. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/index.js +2 -2
  93. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user-routing.module.js +12 -12
  94. package/esm2015/lib/email-subscription/email-subscription-user/email-subscription-user.module.js +15 -15
  95. package/esm2015/lib/email-subscription/email-subscription.module.js +15 -15
  96. package/esm2015/lib/entity-files/entity-file-form/entity-file-form.component.js +147 -138
  97. package/esm2015/lib/entity-files/entity-file.service.js +42 -42
  98. package/esm2015/lib/entity-files/entity-files-view-all.component.js +234 -208
  99. package/esm2015/lib/entity-files/entity-files-view-all.module.js +40 -34
  100. package/esm2015/lib/entity-files/index.js +3 -3
  101. package/esm2015/lib/export-excel/export-excel-button/export-excel-button.component.js +32 -32
  102. package/esm2015/lib/export-excel/export-excel.module.js +17 -17
  103. package/esm2015/lib/file-dropper/file-dropper.component.js +122 -122
  104. package/esm2015/lib/file-dropper/file-dropper.model.js +3 -3
  105. package/esm2015/lib/file-dropper/file-dropper.module.js +21 -21
  106. package/esm2015/lib/file-dropper/index.js +3 -3
  107. package/esm2015/lib/import-csv/data-import/data-import.component.js +18 -18
  108. package/esm2015/lib/import-csv/failed-items-list/failed-items-list.component.js +33 -33
  109. package/esm2015/lib/import-csv/field-mapping/field-mapping.component.js +148 -148
  110. package/esm2015/lib/import-csv/import-csv-config.js +2 -2
  111. package/esm2015/lib/import-csv/import-csv.component.js +196 -196
  112. package/esm2015/lib/import-csv/import-csv.module.js +46 -46
  113. package/esm2015/lib/import-csv/import-history-list/import-history-list.component.js +71 -71
  114. package/esm2015/lib/import-csv/import-success/import-success.component.js +19 -19
  115. package/esm2015/lib/loader/index.js +2 -2
  116. package/esm2015/lib/loader/loader.component.js +22 -22
  117. package/esm2015/lib/loader/loader.module.js +21 -21
  118. package/esm2015/lib/login-history-for-user/login-history-for-user-routing.module.js +20 -20
  119. package/esm2015/lib/login-history-for-user/login-history-for-user.component.js +88 -88
  120. package/esm2015/lib/login-history-for-user/login-history-for-user.module.js +27 -27
  121. package/esm2015/lib/material.module.js +60 -60
  122. package/esm2015/lib/note/comment-form/comment-form.component.js +73 -73
  123. package/esm2015/lib/note/index.js +4 -4
  124. package/esm2015/lib/note/note-form/note-form.component.js +81 -81
  125. package/esm2015/lib/note/note-list/note-list.component.js +151 -151
  126. package/esm2015/lib/note/note.module.js +36 -36
  127. package/esm2015/lib/note/note.service.js +31 -31
  128. package/esm2015/lib/read-more/read-more.component.js +43 -43
  129. package/esm2015/lib/read-more/read-more.module.js +21 -21
  130. package/esm2015/lib/searchable-selector/index.js +3 -3
  131. package/esm2015/lib/searchable-selector/mat-select-infinite-scroll.directive.js +81 -81
  132. package/esm2015/lib/searchable-selector/searchable-selector.component.js +307 -307
  133. package/esm2015/lib/searchable-selector/searchable-selector.module.js +28 -28
  134. package/esm2015/lib/techlify-feature/on-off-switch/on-off-switch.component.js +27 -27
  135. package/esm2015/lib/techlify-feature/techlify-feature-enabled.directive.js +78 -78
  136. package/esm2015/lib/techlify-feature/techlify-feature-listing.component.js +177 -177
  137. package/esm2015/lib/techlify-feature/techlify-feature.module.js +30 -30
  138. package/esm2015/lib/techlify-feature/techlify-feature.routing.js +12 -12
  139. package/esm2015/lib/techlify-feature/techlify-feature.service.js +28 -28
  140. package/esm2015/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-config.model.js +15 -15
  141. package/esm2015/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component.js +269 -269
  142. package/esm2015/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.module.js +25 -25
  143. package/esm2015/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.component.js +168 -168
  144. package/esm2015/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.module.js +29 -29
  145. package/esm2015/lib/techlify-update/techlify-update-form/techlify-update-form.component.js +114 -114
  146. package/esm2015/lib/techlify-update/techlify-update-form/techlify-update-form.module.js +28 -28
  147. package/esm2015/lib/techlify-update/techlify-update-history/techlify-update-history-routing.module.js +22 -22
  148. package/esm2015/lib/techlify-update/techlify-update-history/techlify-update-history.component.js +143 -143
  149. package/esm2015/lib/techlify-update/techlify-update-history/techlify-update-history.module.js +28 -28
  150. package/esm2015/lib/techlify-update/techlify-update-routing.module.js +22 -22
  151. package/esm2015/lib/techlify-update/techlify-update.module.js +30 -30
  152. package/esm2015/lib/techlify-update/techlify-update.service.js +43 -43
  153. package/esm2015/lib/techlify-update/techlify-updates-list/techlify-updates-list.component.js +161 -161
  154. package/esm2015/lib/techlify-update/update-notifier/update-notifier-snack/update-notifier-snack.component.js +82 -82
  155. package/esm2015/lib/techlify-update/update-notifier/update-notifier.component.js +62 -62
  156. package/esm2015/lib/techlify-update/update-notifier/update-notifier.module.js +29 -29
  157. package/esm2015/lib/techlify-update/update-view/update-view.component.js +36 -36
  158. package/esm2015/lib/techlify-update/update-view/update-view.module.js +24 -24
  159. package/esm2015/lib/timeline-filter/calculate-timeline.js +102 -102
  160. package/esm2015/lib/timeline-filter/index.js +4 -4
  161. package/esm2015/lib/timeline-filter/timeline-filter-routing.module.js +12 -12
  162. package/esm2015/lib/timeline-filter/timeline-filter.component.js +213 -213
  163. package/esm2015/lib/timeline-filter/timeline-filter.module.js +23 -23
  164. package/esm2015/lib/timeline-filter/timeline.model.js +18 -18
  165. package/esm2015/lib/utility/date-utils.service.js +48 -48
  166. package/esm2015/lib/utility/index.js +4 -4
  167. package/esm2015/lib/utility/num-items-selector.component.js +29 -29
  168. package/esm2015/lib/utility/number-selector.component.js +38 -38
  169. package/esm2015/lib/utility/utility.module.js +20 -20
  170. package/esm2015/ngx-techlify-core.js +60 -60
  171. package/esm2015/public-api.js +96 -96
  172. package/fesm2015/ngx-techlify-core.js +6941 -6903
  173. package/fesm2015/ngx-techlify-core.js.map +1 -1
  174. package/lib/action-popup/action-popup.component.d.ts +14 -14
  175. package/lib/action-popup/action-popup.model.d.ts +5 -5
  176. package/lib/action-popup/action-popup.module.d.ts +2 -2
  177. package/lib/action-popup/index.d.ts +2 -2
  178. package/lib/audit-log/audit-log-for-model/audit-log-for-model-routing.module.d.ts +2 -2
  179. package/lib/audit-log/audit-log-for-model/audit-log-for-model.component.d.ts +12 -12
  180. package/lib/audit-log/audit-log-for-model/audit-log-for-model.module.d.ts +2 -2
  181. package/lib/audit-log/audit-log-list/audit-log-list-routing.module.d.ts +2 -2
  182. package/lib/audit-log/audit-log-list/audit-log-list.component.d.ts +32 -32
  183. package/lib/audit-log/audit-log-list/audit-log-list.module.d.ts +2 -2
  184. package/lib/audit-log/audit-log-list-filter/audit-log-list-filter-routing.module.d.ts +2 -2
  185. package/lib/audit-log/audit-log-list-filter/audit-log-list-filter.component.d.ts +19 -19
  186. package/lib/audit-log/audit-log-list-filter/audit-log-list-filter.module.d.ts +2 -2
  187. package/lib/audit-log/audit-log-routing.module.d.ts +2 -2
  188. package/lib/audit-log/audit-log-view/audit-log-view-routing.module.d.ts +2 -2
  189. package/lib/audit-log/audit-log-view/audit-log-view.component.d.ts +17 -17
  190. package/lib/audit-log/audit-log-view/audit-log-view.module.d.ts +2 -2
  191. package/lib/audit-log/audit-log-view-model/audit-log-view-model-routing.module.d.ts +2 -2
  192. package/lib/audit-log/audit-log-view-model/audit-log-view-model.component.d.ts +15 -15
  193. package/lib/audit-log/audit-log-view-model/audit-log-view-model.module.d.ts +2 -2
  194. package/lib/audit-log/audit-log.module.d.ts +2 -2
  195. package/lib/audit-log/audit-logs-view-model/audit-logs-view-model-routing.module.d.ts +2 -2
  196. package/lib/audit-log/audit-logs-view-model/audit-logs-view-model.component.d.ts +11 -11
  197. package/lib/audit-log/audit-logs-view-model/audit-logs-view-model.module.d.ts +2 -2
  198. package/lib/base-model/index.d.ts +3 -3
  199. package/lib/base-model/techlify-form-component.class.d.ts +43 -43
  200. package/lib/base-model/techlify-listing-component.class.d.ts +47 -47
  201. package/lib/base-model/techlify-service.class.d.ts +52 -52
  202. package/lib/core/alert.service.d.ts +12 -12
  203. package/lib/core/api-prefix.interceptor.d.ts +11 -11
  204. package/lib/core/authentication.guard.d.ts +10 -10
  205. package/lib/core/authentication.service.d.ts +23 -23
  206. package/lib/core/cache.interceptor.d.ts +21 -21
  207. package/lib/core/config.service.d.ts +19 -19
  208. package/lib/core/core.module.d.ts +3 -3
  209. package/lib/core/credentials.service.d.ts +36 -36
  210. package/lib/core/dataManager.service.d.ts +70 -70
  211. package/lib/core/error-handler.interceptor.d.ts +14 -14
  212. package/lib/core/error-handler.service.d.ts +14 -14
  213. package/lib/core/form-validator.service.d.ts +8 -8
  214. package/lib/core/header.interceptor.d.ts +8 -8
  215. package/lib/core/http-cache.service.d.ts +54 -54
  216. package/lib/core/http.service.d.ts +56 -56
  217. package/lib/core/index.d.ts +20 -20
  218. package/lib/core/logger.service.d.ts +85 -85
  219. package/lib/core/route-reusable-strategy.d.ts +13 -13
  220. package/lib/core/snack/snack.component.d.ts +8 -8
  221. package/lib/core/snack/snack.module.d.ts +2 -2
  222. package/lib/core/storage.service.d.ts +15 -15
  223. package/lib/core/techlify-config.model.d.ts +18 -18
  224. package/lib/core/token.interceptor.d.ts +11 -11
  225. package/lib/data-table/data-table.component.d.ts +60 -60
  226. package/lib/data-table/data-table.model.d.ts +46 -46
  227. package/lib/data-table/data-table.module.d.ts +2 -2
  228. package/lib/data-table/index.d.ts +2 -2
  229. package/lib/date-validator.d.ts +1 -1
  230. package/lib/document-viewer/document-viewer.component.d.ts +16 -16
  231. package/lib/document-viewer/document-viewer.module.d.ts +2 -2
  232. package/lib/document-viewer/index.d.ts +2 -2
  233. package/lib/document-viewer/viewer-config.model.d.ts +5 -5
  234. package/lib/email-subscription/email-subscription-for-user/email-subscription-for-user-routing.module.d.ts +7 -7
  235. package/lib/email-subscription/email-subscription-for-user/email-subscription-for-user.component.d.ts +17 -17
  236. package/lib/email-subscription/email-subscription-for-user/email-subscription-for-user.module.d.ts +2 -2
  237. package/lib/email-subscription/email-subscription-for-user/index.d.ts +1 -1
  238. package/lib/email-subscription/email-subscription-routing.module.d.ts +2 -2
  239. package/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form-routing.module.d.ts +2 -2
  240. package/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form.component.d.ts +32 -32
  241. package/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form.module.d.ts +2 -2
  242. package/lib/email-subscription/email-subscription-type/email-subscription-type-form/index.d.ts +1 -1
  243. package/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list-routing.module.d.ts +9 -9
  244. package/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list.component.d.ts +30 -30
  245. package/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list.module.d.ts +2 -2
  246. package/lib/email-subscription/email-subscription-type/email-subscription-type-list/index.d.ts +1 -1
  247. package/lib/email-subscription/email-subscription-type/email-subscription-type-routing.module.d.ts +2 -2
  248. package/lib/email-subscription/email-subscription-type/email-subscription-type.module.d.ts +2 -2
  249. package/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form-routing.module.d.ts +2 -2
  250. package/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form.component.d.ts +32 -32
  251. package/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form.module.d.ts +2 -2
  252. package/lib/email-subscription/email-subscription-user/email-subscription-user-form/index.d.ts +1 -1
  253. package/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list-routing.module.d.ts +9 -9
  254. package/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list.component.d.ts +32 -32
  255. package/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list.module.d.ts +2 -2
  256. package/lib/email-subscription/email-subscription-user/email-subscription-user-list/index.d.ts +1 -1
  257. package/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter-routing.module.d.ts +2 -2
  258. package/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter.component.d.ts +13 -13
  259. package/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter.module.d.ts +2 -2
  260. package/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/index.d.ts +1 -1
  261. package/lib/email-subscription/email-subscription-user/email-subscription-user-routing.module.d.ts +2 -2
  262. package/lib/email-subscription/email-subscription-user/email-subscription-user.module.d.ts +2 -2
  263. package/lib/email-subscription/email-subscription.module.d.ts +2 -2
  264. package/lib/entity-files/entity-file-form/entity-file-form.component.d.ts +38 -34
  265. package/lib/entity-files/entity-file.service.d.ts +10 -10
  266. package/lib/entity-files/entity-files-view-all.component.d.ts +51 -45
  267. package/lib/entity-files/entity-files-view-all.module.d.ts +2 -2
  268. package/lib/entity-files/index.d.ts +2 -2
  269. package/lib/export-excel/export-excel-button/export-excel-button.component.d.ts +8 -8
  270. package/lib/export-excel/export-excel.module.d.ts +2 -2
  271. package/lib/file-dropper/file-dropper.component.d.ts +33 -33
  272. package/lib/file-dropper/file-dropper.model.d.ts +10 -10
  273. package/lib/file-dropper/file-dropper.module.d.ts +2 -2
  274. package/lib/file-dropper/index.d.ts +2 -2
  275. package/lib/import-csv/data-import/data-import.component.d.ts +6 -6
  276. package/lib/import-csv/failed-items-list/failed-items-list.component.d.ts +12 -12
  277. package/lib/import-csv/field-mapping/field-mapping.component.d.ts +34 -34
  278. package/lib/import-csv/import-csv-config.d.ts +17 -17
  279. package/lib/import-csv/import-csv.component.d.ts +33 -33
  280. package/lib/import-csv/import-csv.module.d.ts +2 -2
  281. package/lib/import-csv/import-history-list/import-history-list.component.d.ts +21 -21
  282. package/lib/import-csv/import-success/import-success.component.d.ts +8 -8
  283. package/lib/loader/index.d.ts +1 -1
  284. package/lib/loader/loader.component.d.ts +8 -8
  285. package/lib/loader/loader.module.d.ts +2 -2
  286. package/lib/login-history-for-user/login-history-for-user-routing.module.d.ts +2 -2
  287. package/lib/login-history-for-user/login-history-for-user.component.d.ts +23 -23
  288. package/lib/login-history-for-user/login-history-for-user.module.d.ts +2 -2
  289. package/lib/material.module.d.ts +2 -2
  290. package/lib/note/comment-form/comment-form.component.d.ts +22 -22
  291. package/lib/note/index.d.ts +3 -3
  292. package/lib/note/note-form/note-form.component.d.ts +27 -27
  293. package/lib/note/note-list/note-list.component.d.ts +28 -28
  294. package/lib/note/note.module.d.ts +2 -2
  295. package/lib/note/note.service.d.ts +9 -9
  296. package/lib/read-more/read-more.component.d.ts +12 -12
  297. package/lib/read-more/read-more.module.d.ts +2 -2
  298. package/lib/searchable-selector/index.d.ts +2 -2
  299. package/lib/searchable-selector/mat-select-infinite-scroll.directive.d.ts +23 -23
  300. package/lib/searchable-selector/searchable-selector.component.d.ts +81 -81
  301. package/lib/searchable-selector/searchable-selector.module.d.ts +2 -2
  302. package/lib/techlify-feature/on-off-switch/on-off-switch.component.d.ts +9 -9
  303. package/lib/techlify-feature/techlify-feature-enabled.directive.d.ts +17 -17
  304. package/lib/techlify-feature/techlify-feature-listing.component.d.ts +37 -37
  305. package/lib/techlify-feature/techlify-feature.module.d.ts +2 -2
  306. package/lib/techlify-feature/techlify-feature.routing.d.ts +2 -2
  307. package/lib/techlify-feature/techlify-feature.service.d.ts +8 -8
  308. package/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-config.model.d.ts +12 -12
  309. package/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component.d.ts +76 -76
  310. package/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.module.d.ts +2 -2
  311. package/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.component.d.ts +58 -58
  312. package/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.module.d.ts +2 -2
  313. package/lib/techlify-update/techlify-update-form/techlify-update-form.component.d.ts +30 -30
  314. package/lib/techlify-update/techlify-update-form/techlify-update-form.module.d.ts +2 -2
  315. package/lib/techlify-update/techlify-update-history/techlify-update-history-routing.module.d.ts +2 -2
  316. package/lib/techlify-update/techlify-update-history/techlify-update-history.component.d.ts +31 -31
  317. package/lib/techlify-update/techlify-update-history/techlify-update-history.module.d.ts +2 -2
  318. package/lib/techlify-update/techlify-update-routing.module.d.ts +2 -2
  319. package/lib/techlify-update/techlify-update.module.d.ts +2 -2
  320. package/lib/techlify-update/techlify-update.service.d.ts +13 -13
  321. package/lib/techlify-update/techlify-updates-list/techlify-updates-list.component.d.ts +31 -31
  322. package/lib/techlify-update/update-notifier/update-notifier-snack/update-notifier-snack.component.d.ts +25 -25
  323. package/lib/techlify-update/update-notifier/update-notifier.component.d.ts +16 -16
  324. package/lib/techlify-update/update-notifier/update-notifier.module.d.ts +2 -2
  325. package/lib/techlify-update/update-view/update-view.component.d.ts +14 -14
  326. package/lib/techlify-update/update-view/update-view.module.d.ts +2 -2
  327. package/lib/timeline-filter/calculate-timeline.d.ts +6 -6
  328. package/lib/timeline-filter/index.d.ts +3 -3
  329. package/lib/timeline-filter/timeline-filter-routing.module.d.ts +2 -2
  330. package/lib/timeline-filter/timeline-filter.component.d.ts +61 -61
  331. package/lib/timeline-filter/timeline-filter.module.d.ts +2 -2
  332. package/lib/timeline-filter/timeline.model.d.ts +17 -17
  333. package/lib/utility/date-utils.service.d.ts +21 -21
  334. package/lib/utility/index.d.ts +3 -3
  335. package/lib/utility/num-items-selector.component.d.ts +16 -16
  336. package/lib/utility/number-selector.component.d.ts +20 -20
  337. package/lib/utility/utility.module.d.ts +2 -2
  338. package/ngx-techlify-core.d.ts +59 -59
  339. package/ngx-techlify-core.metadata.json +1 -1
  340. package/package.json +2 -2
  341. package/public-api.d.ts +92 -92
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../projects/ngx-techlify-core/src/lib/action-popup/action-popup.model.ts","../../../projects/ngx-techlify-core/src/lib/action-popup/action-popup.component.ts","../../../projects/ngx-techlify-core/src/lib/base-model/techlify-form-component.class.ts","../../../projects/ngx-techlify-core/src/lib/base-model/techlify-listing-component.class.ts","../../../projects/ngx-techlify-core/src/lib/base-model/techlify-service.class.ts","../../../node_modules/tslib/tslib.es6.js","../../../projects/ngx-techlify-core/src/lib/data-table/data-table.component.ts","../../../projects/ngx-techlify-core/src/lib/data-table/data-table.model.ts","../../../projects/ngx-techlify-core/src/lib/document-viewer/document-viewer.component.ts","../../../projects/ngx-techlify-core/src/lib/core/logger.service.ts","../../../projects/ngx-techlify-core/src/lib/document-viewer/viewer-config.model.ts","../../../projects/ngx-techlify-core/src/lib/core/techlify-config.model.ts","../../../projects/ngx-techlify-core/src/lib/core/config.service.ts","../../../projects/ngx-techlify-core/src/lib/core/snack/snack.component.ts","../../../projects/ngx-techlify-core/src/lib/core/alert.service.ts","../../../projects/ngx-techlify-core/src/lib/core/error-handler.service.ts","../../../projects/ngx-techlify-core/src/lib/core/error-handler.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/http-cache.service.ts","../../../projects/ngx-techlify-core/src/lib/core/cache.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/api-prefix.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/credentials.service.ts","../../../projects/ngx-techlify-core/src/lib/core/token.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/header.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/http.service.ts","../../../projects/ngx-techlify-core/src/lib/entity-files/entity-file.service.ts","../../../projects/ngx-techlify-core/src/lib/core/form-validator.service.ts","../../../projects/ngx-techlify-core/src/lib/entity-files/entity-file-form/entity-file-form.component.ts","../../../projects/ngx-techlify-core/src/lib/entity-files/entity-files-view-all.component.ts","../../../projects/ngx-techlify-core/src/lib/file-dropper/file-dropper.component.ts","../../../projects/ngx-techlify-core/src/lib/file-dropper/file-dropper.model.ts","../../../projects/ngx-techlify-core/src/lib/note/note.service.ts","../../../projects/ngx-techlify-core/src/lib/note/note-form/note-form.component.ts","../../../projects/ngx-techlify-core/src/lib/note/note-list/note-list.component.ts","../../../projects/ngx-techlify-core/src/lib/note/comment-form/comment-form.component.ts","../../../projects/ngx-techlify-core/src/lib/searchable-selector/searchable-selector.component.ts","../../../projects/ngx-techlify-core/src/lib/searchable-selector/mat-select-infinite-scroll.directive.ts","../../../projects/ngx-techlify-core/src/lib/utility/num-items-selector.component.ts","../../../projects/ngx-techlify-core/src/lib/utility/date-utils.service.ts","../../../projects/ngx-techlify-core/src/lib/utility/number-selector.component.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/timeline.model.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/calculate-timeline.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/timeline-filter.component.ts","../../../projects/ngx-techlify-core/src/lib/loader/loader.component.ts","../../../projects/ngx-techlify-core/src/lib/core/snack/snack.module.ts","../../../projects/ngx-techlify-core/src/lib/core/authentication.guard.ts","../../../projects/ngx-techlify-core/src/lib/core/authentication.service.ts","../../../projects/ngx-techlify-core/src/lib/core/route-reusable-strategy.ts","../../../projects/ngx-techlify-core/src/lib/core/storage.service.ts","../../../projects/ngx-techlify-core/src/lib/core/dataManager.service.ts","../../../projects/ngx-techlify-core/src/lib/material.module.ts","../../../projects/ngx-techlify-core/src/lib/core/core.module.ts","../../../projects/ngx-techlify-core/src/lib/action-popup/action-popup.module.ts","../../../projects/ngx-techlify-core/src/lib/data-table/data-table.module.ts","../../../projects/ngx-techlify-core/src/lib/document-viewer/document-viewer.module.ts","../../../projects/ngx-techlify-core/src/lib/file-dropper/file-dropper.module.ts","../../../projects/ngx-techlify-core/src/lib/entity-files/entity-files-view-all.module.ts","../../../projects/ngx-techlify-core/src/lib/read-more/read-more.component.ts","../../../projects/ngx-techlify-core/src/lib/read-more/read-more.module.ts","../../../projects/ngx-techlify-core/src/lib/note/note.module.ts","../../../projects/ngx-techlify-core/src/lib/searchable-selector/searchable-selector.module.ts","../../../projects/ngx-techlify-core/src/lib/utility/utility.module.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/timeline-filter-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/timeline-filter.module.ts","../../../projects/ngx-techlify-core/src/lib/loader/loader.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-for-user/email-subscription-for-user.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-for-user/email-subscription-for-user-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-for-user/email-subscription-for-user.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update.service.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-form/techlify-update-form.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-form/techlify-update-form.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-updates-list/techlify-updates-list.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-view/update-view.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-history/techlify-update-history.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-history/techlify-update-history-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-history/techlify-update-history.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-view/update-view.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-notifier/update-notifier-snack/update-notifier-snack.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-notifier/update-notifier.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-notifier/update-notifier.module.ts","../../../projects/ngx-techlify-core/src/lib/export-excel/export-excel-button/export-excel-button.component.ts","../../../projects/ngx-techlify-core/src/lib/export-excel/export-excel.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view-model/audit-log-view-model.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-logs-view-model/audit-logs-view-model.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-for-model/audit-log-for-model.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-for-model/audit-log-for-model-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view-model/audit-log-view-model-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view-model/audit-log-view-model.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-logs-view-model/audit-logs-view-model-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list/audit-log-list-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list/audit-log-list.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list-filter/audit-log-list-filter-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/date-validator.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list-filter/audit-log-list-filter.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list-filter/audit-log-list-filter.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list/audit-log-list.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-logs-view-model/audit-logs-view-model.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-for-model/audit-log-for-model.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view/audit-log-view.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view/audit-log-view-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view/audit-log-view.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log.module.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/import-success/import-success.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/import-history-list/import-history-list.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/field-mapping/field-mapping.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/failed-items-list/failed-items-list.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/import-csv.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/data-import/data-import.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/import-csv.module.ts","../../../projects/ngx-techlify-core/src/lib/login-history-for-user/login-history-for-user.component.ts","../../../projects/ngx-techlify-core/src/lib/login-history-for-user/login-history-for-user-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/login-history-for-user/login-history-for-user.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-config.model.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature.service.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature-listing.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature.routing.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/on-off-switch/on-off-switch.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature-enabled.directive.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature.module.ts"],"names":["ActionPopupComponent","dialogRef","data","this","prototype","ngOnInit","closeDialog","close","confirm","Component","args","selector","template","MatDialogRef","ActionPopup","decorators","type","Inject","MAT_DIALOG_DATA","TechlifyFormComponentInterface","formValidatorService","resetFieldValue","event","field","_b","_a","form","get","setValue","getFieldValue","value","isFieldValid","getErrorMessage","errorMessages","TechlifyListingControllerInterface","models","page","perPage","lastPage","isWorking","reload","loadData","onScroll","TechlifyServiceBaseClass","http","baseUrl","index","filters","params","Object","assign","toPromise","store","model","post","show","modelId","update","put","id","delete","extendStatics","d","b","setPrototypeOf","__proto__","Array","p","hasOwnProperty","call","__extends","TypeError","String","__","constructor","create","__decorate","target","key","desc","c","arguments","length","r","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","pop","push","__values","o","s","m","__read","ar","error","__spread","concat","DataTableComponent","DataTableComponent_1","dataSource","MatTableDataSource","action","EventEmitter","selctionChange","rowClick","tableScroll","sortChanged","elementId","nextId","ngAfterViewInit","_this","selection","changed","pipe","subscribe","change","selected","emit","sort","sortChange","untilDestroyed","isAllSelected","masterToggle","clearSelection","forEach","row","select","clear","ngOnChanges","changes","initializeConfig","isFirstChange","currentValue","config","editClicked","element","stopPropagation","viewClicked","deactivateClicked","downloadClicked","printClicked","rowClicked","actionMenuClick","menuValue","trigger","closeMenu","actionMenuTriggerClick","checkEdit","ele","editDisableFunction","checkView","viewDisableFunction","checkPrint","printDisableFunction","checkActions","actionsMenuFunction","checkActionButton","actionsMenuButtonFunction","getValue","keyString","keyList","replace","split","ngOnDestroy","Input","Output","ViewChild","MatSort","static","UntilDestroy","DocumentViewerComponent","remove","initData","removeFile","file","ext","getFileExtension","viewerType","nameArray","LogLevel","Logger","source","enableProductionMode","level","Warning","debug","objects","_i","log","console","Debug","info","Info","warn","Error","func","outputs","output","TechlifyConfig","projectKey","environment","authClientSecret","authGrantType","apiUrl","isLogoutWhileApiGetsFailed","loadFromMap","storage","rawConfigs","ConfigService","getConfigsRaw","getProjectKey","getApiUrl","getAuthClientSecret","getStorage","localStorage","getAuthGrantType","getCredentialsKey","BASE_CREDENTIALS","Injectable","providedIn","MAT_SNACK_BAR_DATA","AlertService","snackBar","addAlert","message","alertType","duration","openFromComponent","SuccessSnackComponent","ErrorSnackComponent","MatSnackBar","ErrorHandlerService","alerter","handleError","errorResponse","msg","errors","property","_c","_d","errMessage","status","sessionStorage","location","ErrorHandlerInterceptor","configService","errorHandler","intercept","request","handle","catchError","ErrorEvent","throwError","HttpCacheService","cachedData","cachePersistenceKey","loadCacheData","setCacheData","url","lastUpdated","Date","saveCacheData","getCacheData","cacheEntry","getHttpCacheEntry","clearCache","cleanCache","expirationDate","keys","setPersistence","persistence","JSON","stringify","parse","CacheInterceptor","httpCacheService","forceUpdate","configure","options","instance","method","Observable","subscriber","urlWithParams","HttpResponse","complete","ApiPrefixInterceptor","test","clone","CredentialsService","_credentials","credentials","getItem","setCredentials","remember","setItem","getAccessToken","expiration","token","expires_in","access_token","now","parseInt","getExpiration","getRefreshToken","refresh_token","refresh","TokenInterceptor","setHeaders","Authorization","HeaderInterceptor","Content-Type","headers","HttpInterceptorHandler","interceptor","HTTP_DYNAMIC_INTERCEPTORS","InjectionToken","HttpService","httpHandler","injector","interceptors","_super","cache","cacheInterceptor","addInterceptor","skipErrorHandler","removeInterceptor","skipApiPrefix","skipToken","skipHeader","handler","reduceRight","HttpClient","interceptorType","filter","HttpHandler","Injector","Optional","EntityFileService","getEntityFiles","createEntityFile","updateEntityFile","deleteEntityFile","uploadEntityFile","formData","FormData","append","name","entity_id","entity_type","FormValidatorService","formGroup","firstAttempt","valid","touched","untouched","errorField","required","EntityFileFormComponent","fb","entityFileService","alertService","fileList","createForm","entityFileGroup","group","title","details","Validators","file_size","entity","updateMode","patchValue","hideTitleAndDetails","fileConfig","fileId","containerId","styles","height","multiple","acceptFile","maxSize","acceptFileText","viewerConfig","viewerStyle","width","submit","assignmentFileFirstAttempt","item","fileChanged","FormBuilder","EntityFilesViewAllComponent","dialog","viewOnly","allowMultipleFiles","entityFiles","displayedColumns","search","FormControl","imageStyle","hideRemove","x","entityType","entityId","valueChanges","debounceTime","distinctUntilChanged","fetchEntityFilesDetails","last_page","addEntityFile","open","autoFocus","restoreFocus","afterClosed","files","editEntityFile","sizeOf","bytes","Math","floor","pow","toFixed","charAt","Location","MatDialog","FileDropperComponent","fileArray","border","isSingleMode","Boolean","dragEnter","style","background","dragColor","preventDefault","dragOver","dragLeave","dropEvent","droppedFiles","dataTransfer","from","addFiles","onFileChange","document","getElementById","fileSizeAllowed","sortFiles","a","nameA","toUpperCase","nameB","size","clickEvent","click","NoteService","getNotes","filterModel","addNote","note","editNote","deleteNote","NoteFormComponent","noteService","noteFormGroup","compose","model_type","related_model_id","noteFormFirstAttempt","labelText","cancel","NoteListComponent","readonly","commentsView","notes","sort_by","relatedModelId","modelType","current_page","resetScroll","commentAction","editComment","addComment","comment","findIndex","CommentFormComponent","credentialService","view","_commentData","commentFormGroup","isAuthenticated","user","reset","deleteComment","hideEdit","SearchableSelectorComponent","SearchableSelectorComponent_1","formBuilder","_focusMonitor","_elementRef","ngControl","valueField","titleField","selectedValueChange","enableSearch","add","edit","items","apiDataProperty","inDataSearch","selectionChange","itemsChange","isLoading","onChange","onTouched","stateChanges","Subject","focused","controlType","describedBy","cachedItems","_required","_disabled","selectorForm","select_value","monitor","origin","valueAccessor","empty","setValidators","coerceBooleanProperty","disable","enable","openedChange","dataItems","selectedValue","sortBy","fetchItemList","of","startWith","switchMap","finalize","setDescribedByIds","ids","join","onContainerClick","writeValue","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","disabled","getPropertyValue","_handleInput","map","find","invalid","dirty","reloadData","searchField","filterItems","toLowerCase","addItem","itemComponent","addConfig","editItem","editConfig","stopMonitoring","providers","provide","MatFormFieldControl","useExisting","FocusMonitor","ElementRef","NgControl","Self","MatSelectInfiniteScrollDirective","matSelect","ngZone","threshold","infiniteScroll","thrPx","thrPc","singleOptionHeight","SELECT_ITEM_HEIGHT_EM","destroyed$","evaluateThreshold","takeUntil","opened","panel","nativeElement","getSelectItemHeightPx","registerScrollListener","lastIndexOf","parseFloat","fromEvent","tap","handleScrollEvent","runOutsideAngular","countOfRenderedOptions","infiniteScrollDistance","clientHeight","scrollTop","run","getComputedStyle","fontSize","Directive","MatSelect","NgZone","NumItemsSelector","numItemsChange","numItemsChanged","numItems","DateUtils","getYYYYMMDDString","inputDate","getFullYear","getMonth","getDate","getYYYY","getMM","getDateTime","toLocaleTimeString","NumberSelector","numChanged","start_value","end_value","Timeline","CUSTOM","TODAY","YESTERDAY","THIS_WEEK","LAST_WEEK","THIS_MONTH","LAST_MONTH","THIS_QUARTER","LAST_QUARTER","THIS_YEAR","LAST_YEAR","ALL","TOMMOROW","NEXT_WEEK","NEXT_MONTH","moment","moment_","calculateTimeline","date","date_from","date_to","show_custom_field","startOf","toISOString","endOf","subtract","TimelineFilterComponent","TimelineFilterComponent_1","datePipe","timelineValue","timelines","viewValue","dateFrom","dateTo","appearance","showClearbutton","touchUi","showCustomDateFields","changeTimeline","getDateRangeString","str","selectedRange","toUTCString","transform","_e","_g","_f","setFieldValue","timeline","range","picker","dateRangeChange","dateRangeStart","dateRangeEnd","onCustomDateChange","DatePipe","LoaderComponent","NgModule","declarations","imports","CommonModule","MatSnackBarModule","MatIconModule","exports","AuthenticationGuard","router","credentialsService","canActivate","route","state","isUserAuthenticated","canLoad","navigate","queryParams","redirect","replaceUrl","Router","AuthenticationService","login","context","concatMap","tokenInfo","userInfo","logout","RouteReusableStrategy","shouldDetach","detachedTree","shouldAttach","retrieve","shouldReuseRoute","future","curr","routeConfig","component","RouteReuseStrategy","StorageService","storageSub","watch","asObservable","removeItem","DataManager","GET","urlq","POST","object","blank","POSTRAW","PUT","PATCH","patch","DELETE","MatButtonModule","MatCheckboxModule","MatCommonModule","MatDialogModule","MatFormFieldModule","MatInputModule","MatLineModule","MatMenuModule","MatNativeDateModule","MatOptionModule","MatProgressSpinnerModule","MatPseudoCheckboxModule","MatRippleModule","MatSelectModule","MatSortModule","MatTableModule","MatCardModule","MatDividerModule","MatChipsModule","MatDatepickerModule","MatListModule","MatTooltipModule","MatButtonToggleModule","parentModule","HttpClientModule","RouterModule","SnackModule","useClass","CoreModule","SkipSelf","FlexLayoutModule","MaterialModule","entryComponents","InfiniteScrollModule","NgxDocViewerModule","FormsModule","ReactiveFormsModule","FileDropperModule","DocumentViewerModule","ActionPopupModule","ReadMoreComponent","maxLength","hideToggle","isCollapsed","determineView","toggleView","text","currentText","substring","ReadMoreModule","forChild","TimelineFilterRoutingModule","EmailSubscriptionRoutingModule","EmailSubscriptionUserRoutingModule","user_id","email_type_id","EmailSubscriptionUserFormComponent","esUserFormGroup","esUser","selectedType","email_type","selectedUser","markAllAsTouched","esUserFormFirstAttempt","isSubmitLoading","SearchableSelectorModule","EmailSubscriptionUserFormRoutingModule","LoaderModule","EmailSubscriptionUserListComponent","esUserList","pageEvent","displayColumns","availableDisplayColumns","order","initializeData","changeSort","col","some","columnsChange","selectedColumns","filterChange","addEmailSubscriptionUser","editEmailSubscriptionUser","deleteEmailSubscriptionUser","direction","active","esulr","permissions","only","redirectTo","routes","path","EmailSubscriptionUserListFilterComponent","valueChange","esUserFilterForm","EmailSubscriptionUserListFilterRoutingModule","EmailSubscriptionUserListRoutingModule","EmailSubscriptionUserFormModule","EmailSubscriptionUserListFilterModule","EmailSubscriptionTypeRoutingModule","code","frequency_id","EmailSubscriptionTypeFormComponent","emailSubscriptionTypeFormGroup","description","emailSubscriptionType","selectedFrequency","frequency","emailSubscriptionTypeFormFirstAttempt","EmailSubscriptionTypeFormRoutingModule","EmailSubscriptionTypeListComponent","emailSubscriptionTypeList","isLoadRelations","relations","addEmailSubscriptionType","editEmailSubscriptionType","deleteEmailSubscriptionType","estlr","EmailSubscriptionTypeFormModule","EmailSubscriptionTypeListRoutingModule","EmailSubscriptionForUserComponent","subscriptions","fetchSubscriptions","sub","current_user_subscription","unsubscribe","esfur","EmailSubscriptionForUserRoutingModule","TechlifyUpdateService","getTechlifyUpdates","createTechlifyUpdate","techlifyUpdate","updateTechlifyUpdate","deleteTechlifyUpdate","techlifyUpdateId","getTechlifyUpdate","getNewUpdateForCurrentUser","createUpdateViewRecord","techlifyUpdateView","updateCurrentUserUpdates","released_on","version","learn_more_link","pattern","TechlifyUpdateFormComponent","techlifyUpdateService","onSave","isUpdateMode","toolbar","techlifyUpdateForm","techlifyUpdateDetails","editor","Editor","NgxEditorModule","TechlifyUpdatesListComponent","techlifyUpdates","filterFormGroup","listenChanges","modifyTechlifyUpdate","sortColumn","toString","assignFilter","column","pathMatch","TechlifyUpdateRoutingModule","TechlifyUpdateFormModule","UpdateViewComponent","rootNavUrl","openUpdateHistory","TechlifyUpdateHistoryComponent","openUpdateView","isFromHistory","TechlifyUpdateHistoryRoutingModule","UpdateNotifierSnackComponent","snackBarRef","maxDescriptionLength","descriptionText","determineDescription","dismiss","update_id","MatSnackBarRef","UpdateNotifierComponent","setTimeout","getNewUpdate","showUpdate","horizontalPosition","verticalPosition","panelClass","UpdateViewModule","ExportExcelButtonComponent","exportExcel","fileName","getTime","ws","XLSX.utils","json_to_sheet","wb","book_new","book_append_sheet","XLSX.writeFile","AuditLogViewModelComponent","showDeltaChanges","changeList","model_id","logInfo","getTransformedChanges","displayAttribute","slice","attribute","newValue","oldValue","pre_object","AuditLogsViewModelComponent","events","NavigationEnd","AuditLogForModelComponent","logView","getLogView","getLogsView","maxWidth","AuditLogViewModelRoutingModule","AuditLogListComponent","dataManager","sanitizer","auditLogList","showFilter","showExportButtons","Type","object_type","Action","Data","Pre-Object","Created At","created_at","toDateString","Created By","email","logClicked","objectType","objectId","object_id","userId","value_1","DomSanitizer","DateValidator","control","val","invalidDate","AuditLogListFilterComponent","auditLogFilterForm","AuditLogListFilterRoutingModule","AuditLogListRoutingModule","ExportExcelModule","AuditLogListFilterModule","AuditLogsViewModelRoutingModule","AuditLogListModule","AuditLogViewModelModule","AuditLogsViewModelModule","AuditLogForModelRoutingModule","AuditLogViewComponent","paramMap","fetchLogDetail","back","logId","patchDelta","delta","jsondiffpatch.diff","innerHTML","jsondiffpatch.formatters","html","format","ActivatedRoute","AuditLogViewRoutingModule","AuditLogRoutingModule","AuditLogViewModule","ImportSuccessComponent","ImportHistoryListComponent","histories","importHistory","isEnabled","unavailable","FieldMappingComponent","changeDetectorRef","firstDataArray","properties","onReUpload","createImportMappingForm","reFectorAttributes","importMappingForm","fields","array","createField","propertyType","k","dataValue","mainIndex","includes","fieldsArray","detectChanges","updatePropertyType","controls","uniqueValidator","propertyData","setErrors","removeField","removeAt","reUpload","ChangeDetectorRef","FailedItemsListComponent","isValidDate","isNaN","ImportCsvComponent","filesList","isUploaded","isImportTypeSelected","fileData","failedItems","selectedFields","importSteps","progressTitle","progressDescription","currentStep","filesConfig","selectedFile","jsonData","reader","FileReader","onload","XLSX.read","cellDates","SheetNames","reduce","initial","sheet","Sheets","sheet_to_json","header","defval","readAsBinaryString","mappingProcessed","tempFileData","save","failed_items","DataImportComponent","LoginHistoryForUserComponent","loginHistoryList","historyFilterForm","onTimelineChange","LoginHistoryForUserRoutingModule","TimelineFilterModule","selectable","removable","separatorKeysCodes","ENTER","COMMA","placeholder","createApiUrl","isCreateable","isCacheTags","isSingle","TechlifyTaggerTagFormFieldComponent","TechlifyTaggerTagFormFieldComponent_1","httpService","_formField","tagInputCtrl","TechlifyTaggerTagFormConfigModel","_allTags","categories","_value","filterValue","filterString","allTags","tagIds","_placeholder","init","_filter","trim","tags","tag","category_title","defaultCreateCategory","input","option","tagInput","availableTags","MatFormField","MAT_FORM_FIELD","MatAutocompleteModule","TechlifyTaggerTagSelectorComponent","TechlifyTaggerTagSelectorComponent_1","tagSelectorCtrl","showAllTags","useSelectButtonStyle","res","TechlifyFeatureService","getFeatures","disableFeature","enableFeature","TechlifyFeatureListingComponent","featureService","features","num_items","listenForChanges","setStorage","error_1","toggeleFeature","feature","error_2","localFeatures","features_1","features_1_1","client_feature","is_enabled","is_enabled_default","TechlifyFeatureRoutes","OnOffSwitchComponent","slideToggle","toggle","TechlifyFeatureEnabledDirective","el","checkForFeatureEnabled","enabledFeature","display","MatSlideToggleModule"],"mappings":"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","sourcesContent":["export class ActionPopup {\r\n name: string;\r\n title: string;\r\n message: string;\r\n}","import { Component, OnInit, Inject } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { ActionPopup } from './action-popup.model';\r\n\r\n@Component({\r\n selector: 'app-action-popup',\r\n templateUrl: './action-popup.component.html',\r\n styleUrls: ['./action-popup.component.scss']\r\n})\r\nexport class ActionPopupComponent implements OnInit {\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<ActionPopupComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: ActionPopup,\r\n ) { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n /**Method to close dialog box */\r\n closeDialog() {\r\n this.dialogRef.close();\r\n }\r\n\r\n /**Method to close dialog box with the data given from parent component\r\n */\r\n confirm() {\r\n this.dialogRef.close(this.data);\r\n }\r\n\r\n}\r\n","import { FormGroup } from '@angular/forms';\r\nimport { FormValidatorService } from '../core/form-validator.service';\r\n\r\n/**\r\n * Interface used to ensure we have a consistent structure across our form components\r\n *\r\n * It also provides some abstraction of repeated code to reduce our codebase size\r\n *\r\n * @todo This should be moved to ngx-techlify-core\r\n *\r\n * Advantages of this abstract class\r\n * - Less code, less maintenance, less bugs\r\n * - more consistent code\r\n * - comments on more code\r\n * - save time, save energy\r\n */\r\nexport abstract class TechlifyFormComponentInterface {\r\n\r\n form: FormGroup;\r\n errorMessages: any;\r\n\r\n constructor(protected formValidatorService: FormValidatorService) {\r\n\r\n }\r\n\r\n /**\r\n * Resets the value of a field in the HTML form\r\n *\r\n * @param event\r\n * @param field\r\n */\r\n resetFieldValue(event: any, field: string) {\r\n this.form?.get(field)?.setValue('');\r\n }\r\n\r\n /**\r\n * Retrieves the value of a field from the HTML form\r\n *\r\n * @param field\r\n * @returns\r\n */\r\n getFieldValue(field: string) {\r\n return this.form?.get(field)?.value;\r\n }\r\n\r\n /**\r\n * Method to evaluate form fields\r\n * */\r\n isFieldValid(field: string) {\r\n return this.formValidatorService.isFieldValid(field, this.form, true);\r\n }\r\n\r\n /**\r\n * Method to find error in form fields\r\n * */\r\n getErrorMessage(field: string) {\r\n return this.formValidatorService.getErrorMessage(field, this.form, this.errorMessages);\r\n }\r\n\r\n}\r\n","/**\r\n * Interface used to ensure we have a consistent structure across our listing pages\r\n *\r\n * @todo This should be moved to ngx-techlify-core\r\n *\r\n * Advantages of this abstract class\r\n * - Less code, less maintenance, less bugs\r\n * - more consistent code\r\n * - comments on more code\r\n * - save time, save energy\r\n */\r\nexport abstract class TechlifyListingControllerInterface {\r\n\r\n models: any[] = [];\r\n page: number = 1;\r\n perPage: number = 25;\r\n lastPage: number = 500;\r\n isWorking: boolean = false;\r\n\r\n /**\r\n * Function that listens for any changes in the form group to apply the filters\r\n */\r\n abstract listenForChanges(): void;\r\n\r\n /**\r\n * Function that loads the main models of the application\r\n */\r\n abstract loadData(): void;\r\n\r\n /**\r\n * Reload all data from page 1\r\n */\r\n reload() {\r\n this.models = [];\r\n this.page = 1;\r\n if (!this.isWorking) {\r\n this.loadData();\r\n }\r\n }\r\n\r\n /**\r\n * Can be called when the user is scrolling,\r\n * to trigger loading a new page of data\r\n */\r\n onScroll() {\r\n if (!this.isWorking && this.page < this.lastPage) {\r\n this.page += 1;\r\n this.loadData();\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Function used to pop up the edit form for the model\r\n *\r\n * @param model\r\n */\r\n abstract editForm(model: any): void;\r\n\r\n /**\r\n * Function used to pop up the delete form for the model\r\n *\r\n * @param model\r\n */\r\n abstract deleteForm(model: any): void;\r\n\r\n}\r\n","import { HttpService } from '../core/http.service';\r\n\r\n/**\r\n * Interface used to ensure we have a consistent structure across our listing pages\r\n *\r\n * @todo This should be moved to ngx-techlify-core\r\n *\r\n * Advantages of this abstract class\r\n * - Less code, less maintenance, less bugs\r\n * - more consistent code\r\n * - comments on more code\r\n * - save time, save energy\r\n */\r\nexport class TechlifyServiceBaseClass {\r\n\r\n protected baseUrl = \"you-forgot-to-set-a-base-url\";\r\n\r\n constructor(protected http: HttpService, baseUrl: string) {\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n /**\r\n * Loads a set of the model this service is for\r\n *\r\n * @param filters Restrictors to filter the set of models\r\n * @returns\r\n */\r\n index(filters: any) {\r\n return this.http.get(`api/${this.baseUrl}`, { params: { ...filters } }).toPromise();\r\n }\r\n\r\n /**\r\n * Add a new record to the database\r\n *\r\n * @param model The data of the model to add\r\n * @returns\r\n */\r\n store(model: any) {\r\n return this.http.post(`api/${this.baseUrl}`, model).toPromise();\r\n }\r\n\r\n /**\r\n * Load a single model record, often with all relations and related data\r\n *\r\n * @param modelId ID of the model to load\r\n * @returns\r\n */\r\n show(modelId: any) {\r\n return this.http.get(`api/${this.baseUrl}/${modelId}`).toPromise();\r\n }\r\n\r\n /**\r\n * Update fields of a single existing model\r\n *\r\n * @param model Model to update\r\n * @returns\r\n */\r\n update(model: any) {\r\n return this.http.put(`api/${this.baseUrl}/${model.id}`, model).toPromise();\r\n }\r\n\r\n /**\r\n * Delete a single model\r\n *\r\n * @param model Model to delete\r\n * @returns\r\n */\r\n delete(model: any) {\r\n return this.http.delete(`api/${this.baseUrl}/${model.id}`).toPromise();\r\n }\r\n\r\n\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import {\r\n Component,\r\n OnInit,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnChanges,\r\n SimpleChanges,\r\n AfterViewInit,\r\n ViewChild\r\n} from \"@angular/core\";\r\n\r\nimport { SelectionModel } from \"@angular/cdk/collections\";\r\nimport { MatMenuTrigger } from '@angular/material/menu';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { MatSort } from '@angular/material/sort';\r\nimport { DataTable } from './data-table.model';\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: \"app-data-table\",\r\n templateUrl: \"./data-table.component.html\",\r\n styleUrls: [\"./data-table.component.scss\"]\r\n})\r\nexport class DataTableComponent implements OnInit, OnChanges, AfterViewInit {\r\n\r\n trigger: MatMenuTrigger;\r\n\r\n @Input() data: any;\r\n\r\n @Input() config: DataTable;\r\n\r\n dataSource: MatTableDataSource<any> = new MatTableDataSource([]);\r\n\r\n @Input() selection: SelectionModel<any>;\r\n\r\n @Output() action = new EventEmitter();\r\n @Output() selctionChange = new EventEmitter();\r\n @Output() rowClick = new EventEmitter();\r\n @Output() tableScroll = new EventEmitter();\r\n @Output() sortChanged = new EventEmitter();\r\n\r\n page: number;\r\n lastPage: number;\r\n perPage: number;\r\n\r\n\r\n @ViewChild(MatSort, { static: true }) sort: MatSort;\r\n\r\n static nextId = 0;\r\n @Input() elementId: string = `data-table-${DataTableComponent.nextId++}`;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() { }\r\n\r\n /**Life cycle hook method */\r\n ngAfterViewInit() {\r\n // Assign the data to the data source for the table to render\r\n this.dataSource = new MatTableDataSource(this.data);\r\n\r\n // Emit change in selection\r\n if (this.selection) {\r\n this.selection.changed.pipe().subscribe((change: any) => {\r\n if (this.selection.selected) {\r\n this.selctionChange.emit(this.selection.selected);\r\n }\r\n });\r\n }\r\n\r\n if (this.sort) {\r\n this.sort.sortChange.pipe(untilDestroyed(this))\r\n .subscribe((value: any) => {\r\n this.sortChanged.emit(value);\r\n })\r\n }\r\n }\r\n\r\n /** Whether the number of selected elements matches the total number of rows. */\r\n isAllSelected() {\r\n const numSelected = this.selection.selected.length;\r\n const numRows = this.dataSource.data.length;\r\n return numSelected === numRows;\r\n }\r\n\r\n /** Selects all rows if they are not all selected; otherwise clear selection. */\r\n masterToggle() {\r\n this.isAllSelected()\r\n ? this.clearSelection()\r\n : this.dataSource.data.forEach(row => this.selection.select(row));\r\n }\r\n\r\n /**clear selection*/\r\n clearSelection() {\r\n this.selection.clear();\r\n this.selctionChange.emit(this.selection.selected);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n this.initializeConfig(changes);\r\n if (changes.data && !changes.data.isFirstChange() && this.dataSource) {\r\n // If not first change\r\n this.dataSource.data = changes.data.currentValue;\r\n }\r\n }\r\n\r\n initializeConfig(changes: SimpleChanges) {\r\n if (changes.config && !changes.config.isFirstChange()) {\r\n this.config = changes.config.currentValue;\r\n }\r\n this.page = this.config.page || 1;\r\n this.lastPage = this.config.lastPage || this.page;\r\n this.perPage = this.config.perPage || 20;\r\n }\r\n\r\n onScroll() {\r\n if (this.page < this.lastPage) {\r\n this.page += 1;\r\n this.tableScroll.emit({ page: this.page, lastPage: this.lastPage, perPage: this.perPage });\r\n }\r\n }\r\n\r\n /**Method invokes when edit action icon is clickes */\r\n editClicked(event: any, element: any) {\r\n this.action.emit({ action: \"edit\", value: element });\r\n event.stopPropagation();\r\n }\r\n\r\n /**Method invokes when view action icon is clickes */\r\n viewClicked(event: any, element: any) {\r\n this.action.emit({ action: \"view\", value: element });\r\n event.stopPropagation();\r\n }\r\n\r\n /**Method invokes when edit action icon is clickes */\r\n deactivateClicked(event: any, element: any) {\r\n this.action.emit({ action: \"deactivate\", value: element });\r\n event.stopPropagation();\r\n }\r\n\r\n /**Method invokes when download action icon is clickes */\r\n downloadClicked(event: any, element: any) {\r\n this.action.emit({ action: \"download\", value: element });\r\n event.stopPropagation();\r\n }\r\n\r\n /**Method invokes when print action icon is clickes */\r\n printClicked(event: any, element: any) {\r\n\r\n this.action.emit({ action: 'print', value: element });\r\n event.stopPropagation();\r\n\r\n }\r\n\r\n /**Method invokes when a row is clicked */\r\n rowClicked(event: any, element: any) {\r\n this.rowClick.emit(element);\r\n event.stopPropagation();\r\n }\r\n\r\n /**Method invokes when menu action icon is hovered */\r\n actionMenuClick(event: any, element: any, menuValue: string) {\r\n this.action.emit({ action: menuValue, value: element });\r\n this.trigger.closeMenu();\r\n event.stopPropagation();\r\n }\r\n\r\n /**Method invokes when menu action icon is hovered and selects for particular action*/\r\n actionMenuTriggerClick(event: any, trigger: MatMenuTrigger) {\r\n this.trigger = trigger;\r\n event.stopPropagation();\r\n }\r\n\r\n checkEdit(ele: any) {\r\n if (this.config.editDisableFunction) {\r\n return this.config.editDisableFunction(ele);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n checkView(ele: any) {\r\n if (this.config.viewDisableFunction) {\r\n return this.config.viewDisableFunction(ele);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n checkPrint(ele: any) {\r\n if (this.config.printDisableFunction) {\r\n return this.config.printDisableFunction(ele);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n checkActions(ele: any) {\r\n if (this.config.actionsMenuFunction) {\r\n return this.config.actionsMenuFunction(ele);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n checkActionButton(ele: any, value: any) {\r\n if (this.config.actionsMenuButtonFunction) {\r\n return this.config.actionsMenuButtonFunction(ele, value);\r\n }\r\n return true;\r\n }\r\n\r\n getValue(ele: any, keyString: string) {\r\n keyString = keyString.replace(/\\[(\\w+)\\]/g, \".$1\"); // convert indexes to properties\r\n keyString = keyString.replace(/^\\./, \"\"); // strip a leading dot\r\n const keyList = keyString.split(\".\");\r\n for (let i = 0, n = keyList.length; i < n; ++i) {\r\n const key = keyList[i];\r\n if (ele && key in ele) {\r\n ele = ele[key];\r\n } else {\r\n return;\r\n }\r\n }\r\n return ele;\r\n }\r\n\r\n ngOnDestroy() {\r\n //Until Destroy uses it.\r\n }\r\n}\r\n","export class DataTable {\r\n displayedColumns: string[];\r\n columnsConfig: ColumnConfig[];\r\n actionsConfig?: ActionConfig;\r\n enableRowClick?: boolean;\r\n disableElevation?: boolean;\r\n downloadLink?: string;\r\n actionsMenuFunction?: any;\r\n actionsMenuButtonFunction?: any;\r\n editDisableFunction?: any;\r\n viewDisableFunction?: any;\r\n printDisableFunction?: any;\r\n customActionLabel?: string;\r\n stickyHeader?: boolean;\r\n page?: number;\r\n lastPage?: number;\r\n perPage?: number;\r\n pageSizeOptions?: number[];\r\n style?: any;\r\n}\r\n\r\nclass ColumnConfig {\r\n title: string;\r\n value: string;\r\n sort?: boolean;\r\n dateField?: boolean;\r\n currencyField?: boolean;\r\n format?: string;\r\n}\r\n\r\nclass ActionConfig {\r\n edit?: boolean;\r\n view?: boolean;\r\n download?: boolean;\r\n print?: boolean;\r\n deactivate?: boolean;\r\n actionsMenu?: ActionsMenu[];\r\n}\r\n\r\nclass ActionsMenu {\r\n name: string;\r\n value: string;\r\n}\r\n\r\nexport class PageEvent {\r\n page: number;\r\n lastPage?: number;\r\n perPage: number;\r\n}\r\n","import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core';\r\nimport { ViewerConfig } from './viewer-config.model';\r\n\r\n@Component({\r\n selector: 'app-document-viewer',\r\n templateUrl: './document-viewer.component.html',\r\n styleUrls: ['./document-viewer.component.css']\r\n})\r\nexport class DocumentViewerComponent implements OnInit {\r\n\r\n\r\n @Input() config!: ViewerConfig;\r\n\r\n @Input() file!: any;\r\n\r\n @Input() fileUrl!: any;\r\n\r\n @Input() disableEdit: boolean;\r\n\r\n @Output() remove = new EventEmitter();\r\n viewerType: any;\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n this.initData();\r\n }\r\n\r\n removeFile() {\r\n this.remove.emit();\r\n }\r\n\r\n initData() {\r\n if (this.file) {\r\n var ext = this.getFileExtension(this.file);\r\n if (ext === 'ppt' || ext === 'pptx' || ext === 'doc' || ext === 'docx' || ext === 'xls' || ext === 'xlsx') {\r\n this.viewerType = \"office\";\r\n }\r\n else if (ext === 'jpg' || ext === 'jpeg' || ext === 'png' || ext === 'gif') {\r\n this.viewerType = \"image\";\r\n }\r\n else if (ext === 'pdf') {\r\n this.viewerType = \"pdf\";\r\n }\r\n else {\r\n this.viewerType = null;\r\n }\r\n }\r\n }\r\n\r\n get fileName() {\r\n if (this.file) {\r\n let nameArray = this.file.split('/');\r\n if (nameArray.length === 2) {\r\n return nameArray[1];\r\n }\r\n return nameArray[0];\r\n }\r\n return '';\r\n }\r\n\r\n getFileExtension(file: any) {\r\n return file.split('.').pop();\r\n }\r\n\r\n}\r\n","/**\r\n * Simple logger system with the possibility of registering custom outputs.\r\n *\r\n * 4 different log levels are provided, with corresponding methods:\r\n * - debug : for debug information\r\n * - info : for informative status of the application (success, ...)\r\n * - warning : for non-critical errors that do not prevent normal application behavior\r\n * - error : for critical errors that prevent normal application behavior\r\n *\r\n * Example usage:\r\n * ```\r\n * import { Logger } from 'app/core/logger.service';\r\n *\r\n * const log = new Logger('myFile');\r\n * ...\r\n * log.debug('something happened');\r\n * ```\r\n *\r\n * To disable debug and info logs in production, add this snippet to your root component:\r\n * ```\r\n * export class AppComponent implements OnInit {\r\n * ngOnInit() {\r\n * if (environment.production) {\r\n * Logger.enableProductionMode();\r\n * }\r\n * ...\r\n * }\r\n * }\r\n *\r\n * If you want to process logs through other outputs than console, you can add LogOutput functions to Logger.outputs.\r\n */\r\n\r\n/**\r\n * The possible log levels.\r\n * LogLevel.Off is never emitted and only used with Logger.level property to disable logs.\r\n */\r\nexport enum LogLevel {\r\n Off = 0,\r\n Error,\r\n Warning,\r\n Info,\r\n Debug\r\n}\r\n\r\n/**\r\n * Log output handler function.\r\n */\r\nexport type LogOutput = (source: string | undefined, level: LogLevel, ...objects: any[]) => void;\r\n\r\nexport class Logger {\r\n\r\n /**\r\n * Current logging level.\r\n * Set it to LogLevel.Off to disable logs completely.\r\n */\r\n static level = LogLevel.Debug;\r\n\r\n /**\r\n * Additional log outputs.\r\n */\r\n static outputs: LogOutput[] = [];\r\n\r\n /**\r\n * Enables production mode.\r\n * Sets logging level to LogLevel.Warning.\r\n */\r\n static enableProductionMode() {\r\n Logger.level = LogLevel.Warning;\r\n }\r\n\r\n constructor(private source?: string) { }\r\n\r\n /**\r\n * Logs messages or objects with the debug level.\r\n * Works the same as console.log().\r\n */\r\n debug(...objects: any[]) {\r\n this.log(console.log, LogLevel.Debug, objects);\r\n }\r\n\r\n /**\r\n * Logs messages or objects with the info level.\r\n * Works the same as console.log().\r\n */\r\n info(...objects: any[]) {\r\n this.log(console.info, LogLevel.Info, objects);\r\n }\r\n\r\n /**\r\n * Logs messages or objects with the warning level.\r\n * Works the same as console.log().\r\n */\r\n warn(...objects: any[]) {\r\n this.log(console.warn, LogLevel.Warning, objects);\r\n }\r\n\r\n /**\r\n * Logs messages or objects with the error level.\r\n * Works the same as console.log().\r\n */\r\n error(...objects: any[]) {\r\n this.log(console.error, LogLevel.Error, objects);\r\n }\r\n\r\n private log(func: (...args: any[]) => void, level: LogLevel, objects: any[]) {\r\n if (level <= Logger.level) {\r\n const log = this.source ? ['[' + this.source + ']'].concat(objects) : objects;\r\n func.apply(console, log);\r\n Logger.outputs.forEach(output => output.apply(output, [this.source, level, ...objects]));\r\n }\r\n }\r\n\r\n}\r\n","export class ViewerConfig {\r\n imageStyle?: any;\r\n viewerStyle?: any;\r\n hideRemove?: boolean;\r\n}\r\n","/**\r\n * Class that stores the configuration data\r\n *\r\n * @author Joshua Kissoon\r\n * @since 20180724\r\n */\r\nexport class TechlifyConfig {\r\n projectKey: string = '';\r\n environment: string = '';\r\n authClientSecret: string = '';\r\n authGrantType: string = '';\r\n apiUrl: string = '';\r\n rawConfigs: any;\r\n storage: Storage;\r\n isLogoutWhileApiGetsFailed: boolean = false;\r\n\r\n constructor(data: any) {\r\n this.loadFromMap(data);\r\n }\r\n\r\n loadFromMap(data: any) {\r\n this.projectKey = data.projectKey;\r\n this.environment = data.environment;\r\n this.authClientSecret = data.authClientSecret;\r\n this.authGrantType = data.authGrantType;\r\n this.apiUrl = data.apiUrl;\r\n this.storage = data?.storage;\r\n this.rawConfigs = data;\r\n this.isLogoutWhileApiGetsFailed = data?.isLogoutWhileApiGetsFailed;\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\nimport { TechlifyConfig } from \"./techlify-config.model\";\r\n\r\n/**\r\n * Service that provides settings for all other services\r\n *\r\n * @author Joshua Kissoon\r\n * @since 20170709\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConfigService {\r\n\r\n public static BASE_CREDENTIALS = \"credentials\";\r\n\r\n private config: TechlifyConfig;\r\n\r\n constructor(config: TechlifyConfig) {\r\n this.config = config;\r\n }\r\n\r\n getConfigsRaw() {\r\n return this.config.rawConfigs;\r\n }\r\n\r\n getProjectKey() {\r\n return this.config.projectKey;\r\n }\r\n\r\n getApiUrl() {\r\n return this.config.apiUrl;\r\n }\r\n\r\n getAuthClientSecret() {\r\n return this.config.authClientSecret;\r\n }\r\n\r\n getStorage() {\r\n return this.config.storage ? this.config.storage : localStorage;\r\n }\r\n\r\n getAuthGrantType() {\r\n return this.config.authGrantType;\r\n }\r\n\r\n getCredentialsKey() {\r\n return this.config.projectKey + \"_\" + ConfigService.BASE_CREDENTIALS;\r\n }\r\n\r\n}\r\n","import { Component, Inject } from '@angular/core';\r\nimport { MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';\r\n\r\n@Component({\r\n selector: 'snack-bar-component-example-snack',\r\n templateUrl: 'success-snack.html',\r\n styleUrls: ['./snack.scss'],\r\n})\r\nexport class SuccessSnackComponent {\r\n constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) { }\r\n}\r\n@Component({\r\n selector: 'snack-bar-component-example-snack',\r\n templateUrl: 'error-snack.html',\r\n styleUrls: ['./snack.scss'],\r\n})\r\nexport class ErrorSnackComponent {\r\n constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) { }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { ErrorSnackComponent, SuccessSnackComponent } from './snack/snack.component';\r\n\r\n/**\r\n * Service used to manage alerts in the entire system frontend\r\n * \r\n * @author Gokula Prasanna\r\n * @since 20210131\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AlertService {\r\n\r\n constructor(public snackBar: MatSnackBar) { }\r\n\r\n addAlert(message: string, alertType: string, duration = 3) {\r\n if (alertType == \"success\") {\r\n this.snackBar.openFromComponent(SuccessSnackComponent, {\r\n duration: 1000 * duration,\r\n data: message\r\n });\r\n }\r\n else {\r\n this.snackBar.openFromComponent(ErrorSnackComponent, {\r\n duration: 1000 * duration,\r\n data: message\r\n });\r\n }\r\n }\r\n}\r\n","import { TechlifyConfig } from './techlify-config.model';\r\nimport { Injectable } from \"@angular/core\";\r\nimport { AlertService } from \"./alert.service\";\r\n\r\n\r\n/**\r\n * Service used to handle errors from the request\r\n *\r\n * @author Joshua Kissoon\r\n * @since 20171202\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorHandlerService {\r\n\r\n constructor(private alerter: AlertService,\r\n private config: TechlifyConfig,\r\n ) {\r\n }\r\n\r\n handleError(errorResponse: any, msg: string = '') {\r\n // 1 - Create empty array to store errors\r\n const errors = [];\r\n\r\n // 2 - check if the error object is present in the response\r\n if (errorResponse?.error) {\r\n\r\n // 3 - Check for Laravel form validation error messages object\r\n if (errorResponse?.error?.errors) {\r\n\r\n // 4 - For each error property (which is a form field)\r\n for (const property in errorResponse.error.errors) {\r\n\r\n if (errorResponse.error.errors?.hasOwnProperty(property)) {\r\n\r\n // 5 - Extract it's array of errors\r\n const propertyErrors: Array<string> = errorResponse?.error?.errors[property];\r\n\r\n // 6 - Push all errors in the array to the errors array\r\n propertyErrors.forEach(error => errors.push(error));\r\n }\r\n\r\n }\r\n }\r\n\r\n if (errors.length === 0) {\r\n // 7 - Push the main error message to the array of errors if there is no validation error\r\n errors.push(errorResponse.error.message ? errorResponse.error.message : errorResponse.error?.error);\r\n }\r\n }\r\n var errMessage = errors.length ? errors[0] : msg;\r\n this.alerter.addAlert(\"Error: \" + errMessage, \"warning\");\r\n\r\n if (errorResponse.status == 403 && this.config.isLogoutWhileApiGetsFailed) {\r\n sessionStorage.clear();\r\n localStorage.clear();\r\n location.reload();\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError } from 'rxjs/operators';\r\nimport { Logger } from './logger.service';\r\nimport { ConfigService } from './config.service';\r\nimport { ErrorHandlerService } from './error-handler.service';\r\n\r\nconst log = new Logger('ErrorHandlerInterceptor');\r\n\r\n/**\r\n * Adds a default error handler to all requests.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorHandlerInterceptor implements HttpInterceptor {\r\n\r\n constructor(private configService: ConfigService, private errorHandler: ErrorHandlerService) { }\r\n\r\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n return next.handle(request).pipe(catchError(error => this.handleError(error)));\r\n }\r\n\r\n // Customize the default error handler here if needed\r\n private handleError(error: HttpErrorResponse): Observable<HttpEvent<any>> {\r\n let errorMessage = '';\r\n if (error.error instanceof ErrorEvent) {\r\n // client-side error\r\n errorMessage = `Client Error: ${this.configService?.getProjectKey()}: ${error.error.message}`;\r\n } else {\r\n // server-side error\r\n errorMessage = `Server Error: ${this.configService?.getProjectKey()}`;\r\n try {\r\n this.errorHandler.handleError(error, 'Unexpected Server Error, try later or contact service team');\r\n } catch (e) {\r\n console.log(\"Unable to handle server error\", e);\r\n }\r\n }\r\n return throwError(error);\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpResponse } from '@angular/common/http';\r\nimport { ConfigService } from './config.service';\r\nimport { Logger } from './logger.service';\r\n\r\nconst log = new Logger('HttpCacheService');\r\n\r\n\r\nexport interface HttpCacheEntry {\r\n lastUpdated: Date;\r\n data: HttpResponse<any>;\r\n}\r\n\r\n/**\r\n * Provides a cache facility for HTTP requests with configurable persistence policy.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HttpCacheService {\r\n\r\n private cachedData: { [key: string]: HttpCacheEntry; } = {};\r\n private storage: Storage | any | null;\r\n private cachePersistenceKey: String | any;\r\n\r\n constructor(private configService: ConfigService) {\r\n this.storage = this.configService.getStorage();\r\n this.cachePersistenceKey = this.configService.getProjectKey() + '_HTTP_CACHE';\r\n this.loadCacheData();\r\n }\r\n\r\n /**\r\n * Sets the cache data for the specified request.\r\n * @param {!string} url The request URL.\r\n * @param {ResponseOptions} data The received data.\r\n * @param {Date=} lastUpdated The cache last update, current date is used if not specified.\r\n */\r\n setCacheData(url: string, data: HttpResponse<any>, lastUpdated?: Date) {\r\n this.cachedData[url] = {\r\n lastUpdated: lastUpdated || new Date(),\r\n data: data\r\n };\r\n log.debug(`Cache set for key: \"${url}\"`);\r\n this.saveCacheData();\r\n }\r\n\r\n /**\r\n * Gets the cached data for the specified request.\r\n * @param {!string} url The request URL.\r\n * @return {?ResponseOptions} The cached data or null if no cached data exists for this request.\r\n */\r\n getCacheData(url: string): HttpResponse<any> | null {\r\n const cacheEntry = this.cachedData[url];\r\n\r\n if (cacheEntry) {\r\n log.debug(`Cache hit for key: \"${url}\"`);\r\n return cacheEntry.data;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the cached entry for the specified request.\r\n * @param {!string} url The request URL.\r\n * @return {?HttpCacheEntry} The cache entry or null if no cache entry exists for this request.\r\n */\r\n getHttpCacheEntry(url: string): HttpCacheEntry | null {\r\n return this.cachedData[url] || null;\r\n }\r\n\r\n /**\r\n * Clears the cached entry (if exists) for the specified request.\r\n * @param {!string} url The request URL.\r\n */\r\n clearCache(url: string): void {\r\n delete this.cachedData[url];\r\n log.debug(`Cache cleared for key: \"${url}\"`);\r\n this.saveCacheData();\r\n }\r\n\r\n /**\r\n * Cleans cache entries older than the specified date.\r\n * @param {date=} expirationDate The cache expiration date. If no date is specified, all cache is cleared.\r\n */\r\n cleanCache(expirationDate?: Date) {\r\n if (expirationDate) {\r\n Object(this.cachedData).keys.forEach((key: string) => {\r\n if (expirationDate >= this.cachedData[key]?.lastUpdated) {\r\n delete this.cachedData[key];\r\n }\r\n });\r\n } else {\r\n this.cachedData = {};\r\n }\r\n this.saveCacheData();\r\n }\r\n\r\n /**\r\n * Sets the cache persistence policy.\r\n * Note that changing the cache persistence will also clear the cache from its previous storage.\r\n * @param {'local'|'session'=} persistence How the cache should be persisted, it can be either local or session\r\n * storage, or if no value is provided it will be only in-memory (default).\r\n */\r\n setPersistence(persistence?: 'local' | 'session') {\r\n this.cleanCache();\r\n this.storage = persistence === 'local' ? localStorage : persistence === 'session' ? sessionStorage : null;\r\n this.loadCacheData();\r\n }\r\n\r\n private saveCacheData() {\r\n if (this.storage) {\r\n this.storage[this.cachePersistenceKey] = JSON.stringify(this.cachedData);\r\n }\r\n }\r\n\r\n private loadCacheData() {\r\n const data = this.storage ? this.storage[this.cachePersistenceKey] : null;\r\n this.cachedData = data ? JSON.parse(data) : {};\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { HttpCacheService } from './http-cache.service';\r\nimport { Observable, Subscriber } from 'rxjs';\r\n\r\n/**\r\n * Caches HTTP requests.\r\n * Use ExtendedHttpClient fluent API to configure caching for each request.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CacheInterceptor implements HttpInterceptor {\r\n\r\n private forceUpdate = false;\r\n\r\n constructor(private httpCacheService: HttpCacheService) { }\r\n\r\n /**\r\n * Configures interceptor options\r\n * @param {{update: boolean}} options If update option is enabled, forces request to be made and updates cache entry.\r\n * @return {CacheInterceptor} The configured instance.\r\n */\r\n configure(options?: { update?: boolean } | null): CacheInterceptor {\r\n const instance = new CacheInterceptor(this.httpCacheService);\r\n if (options && options.update) {\r\n instance.forceUpdate = true;\r\n }\r\n return instance;\r\n }\r\n\r\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n if (request.method !== 'GET') {\r\n return next.handle(request);\r\n }\r\n\r\n return new Observable((subscriber: Subscriber<HttpEvent<any>>) => {\r\n const cachedData = this.forceUpdate ? null : this.httpCacheService.getCacheData(request.urlWithParams);\r\n if (cachedData !== null) {\r\n // Create new response to avoid side-effects\r\n subscriber.next(new HttpResponse(cachedData as Object));\r\n subscriber.complete();\r\n } else {\r\n next.handle(request)\r\n .subscribe(\r\n event => {\r\n if (event instanceof HttpResponse) {\r\n this.httpCacheService.setCacheData(request.urlWithParams, event);\r\n }\r\n subscriber.next(event);\r\n },\r\n error => subscriber.error(error),\r\n () => subscriber.complete()\r\n );\r\n }\r\n });\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { ConfigService } from './config.service';\r\n\r\n/**\r\n * Prefixes all requests not starting with `http[s]` with `environment.serverUrl`.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ApiPrefixInterceptor implements HttpInterceptor {\r\n\r\n constructor(private configService: ConfigService) { }\r\n\r\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n if (!/^(http|https):/i.test(request.url)) {\r\n request = request.clone({ url: this.configService.getApiUrl() + request.url });\r\n }\r\n return next.handle(request);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { ConfigService } from './config.service';\r\n\r\nexport interface Credentials {\r\n // Customize received credentials here\r\n user: any;\r\n token: any;\r\n}\r\n\r\n/**\r\n * Provides storage for authentication credentials.\r\n * The Credentials interface should be replaced with proper implementation.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CredentialsService {\r\n\r\n private _credentials: Credentials | null = null;\r\n\r\n constructor(private configService: ConfigService) {\r\n }\r\n\r\n /**\r\n * Checks is the user is authenticated.\r\n * @return True if the user is authenticated.\r\n */\r\n get isAuthenticated(): boolean {\r\n return !!this.credentials;\r\n }\r\n\r\n /**\r\n * Gets the user credentials.\r\n * @return The user credentials or null if the user is not authenticated.\r\n */\r\n get credentials(): Credentials | null {\r\n if (!this._credentials) {\r\n this._credentials = JSON.parse(sessionStorage.getItem(this.configService.getCredentialsKey()) || localStorage.getItem(this.configService.getCredentialsKey()));\r\n }\r\n return this._credentials;\r\n }\r\n\r\n /**\r\n * Sets the user credentials.\r\n * The credentials may be persisted across sessions by setting the `remember` parameter to true.\r\n * Otherwise, the credentials are only persisted for the current session.\r\n * @param credentials The user credentials.\r\n * @param remember True to remember credentials across sessions.\r\n */\r\n setCredentials(credentials?: Credentials, remember?: boolean) {\r\n this._credentials = credentials || null;\r\n\r\n if (credentials) {\r\n (remember ? localStorage : sessionStorage).setItem(this.configService.getCredentialsKey(), JSON.stringify(credentials));\r\n } else {\r\n sessionStorage.clear();\r\n localStorage.clear();\r\n this._credentials = null;\r\n }\r\n }\r\n\r\n getAccessToken(): string | null {\r\n const expiration = this.credentials?.token?.expires_in || '';\r\n const token = this.credentials?.token?.access_token || '';\r\n\r\n if (!token || !expiration) {\r\n return null;\r\n }\r\n\r\n if (Date.now() > parseInt(expiration)) {\r\n this.setCredentials();\r\n return null;\r\n }\r\n\r\n return token;\r\n }\r\n\r\n getExpiration(): string {\r\n return this.credentials?.token?.expires_in || '';\r\n }\r\n\r\n getRefreshToken(): string {\r\n return this.credentials?.token?.refresh_token || '';\r\n }\r\n\r\n refresh(): CredentialsService {\r\n this._credentials = null;\r\n return this;\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\nimport { CredentialsService } from './credentials.service';\r\n\r\n\r\n/**\r\n * Prefixes all requests not starting with `http[s]` with `environment.serverUrl`.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TokenInterceptor implements HttpInterceptor {\r\n\r\n constructor(private credentials: CredentialsService) { }\r\n\r\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n request = request.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${this.credentials.getAccessToken() || ''}`\r\n }\r\n });\r\n return next.handle(request);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\r\nimport { Observable } from 'rxjs';\r\n\r\n\r\n/**\r\n * Prefixes all requests not starting with `http[s]` with `environment.serverUrl`.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HeaderInterceptor implements HttpInterceptor {\r\n\r\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\r\n request = request.clone({\r\n setHeaders: {\r\n 'Content-Type': request.headers.get('Content-Type') || 'application/json',\r\n }\r\n });\r\n return next.handle(request);\r\n }\r\n}\r\n","import { Inject, Injectable, InjectionToken, Injector, Optional } from '@angular/core';\r\nimport { HttpClient, HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\r\n\r\nimport { Observable } from 'rxjs';\r\nimport { ErrorHandlerInterceptor } from './error-handler.interceptor';\r\nimport { CacheInterceptor } from './cache.interceptor';\r\nimport { ApiPrefixInterceptor } from './api-prefix.interceptor';\r\nimport { TokenInterceptor } from './token.interceptor';\r\nimport { HeaderInterceptor } from './header.interceptor';\r\n\r\n\r\n// Augment HttpClient with the added configuration methods from HttpService, to allow in-place replacement of\r\n// HttpClient with HttpService using dependency injection\r\nexport interface HttpCustomClient {\r\n\r\n /**\r\n * Enables caching for this request.\r\n * @param {boolean} forceUpdate Forces request to be made and updates cache entry.\r\n * @return {HttpCustomClient} The new instance.\r\n */\r\n cache(forceUpdate?: boolean): HttpCustomClient;\r\n\r\n /**\r\n * Skips default error handler for this request.\r\n * @return {HttpCustomClient} The new instance.\r\n */\r\n skipErrorHandler(): HttpCustomClient;\r\n\r\n /**\r\n * Skips default API Prefix for this request.\r\n * @return {HttpCustomClient} The new instance.\r\n */\r\n skipApiPrefix(): HttpCustomClient;\r\n\r\n\r\n /**\r\n * Skips default Token Interceptor for this request.\r\n * @return {HttpCustomClient} The new instance.\r\n */\r\n skipToken(): HttpCustomClient;\r\n\r\n /**\r\n* Skips default Header Interceptor for this request.\r\n* @return {HttpCustomClient} The new instance.\r\n*/\r\n skipHeader(): HttpCustomClient;\r\n\r\n}\r\n\r\n\r\n// From @angular/common/http/src/interceptor: allows to chain interceptors\r\nclass HttpInterceptorHandler implements HttpHandler {\r\n\r\n constructor(private next: HttpHandler, private interceptor: HttpInterceptor) { }\r\n\r\n handle(request: HttpRequest<any>): Observable<HttpEvent<any>> {\r\n return this.interceptor.intercept(request, this.next);\r\n }\r\n\r\n}\r\n\r\n/**\r\n * Allows to override default dynamic interceptors that can be disabled with the HttpService extension.\r\n * Except for very specific needs, you should better configure these interceptors directly in the constructor below\r\n * for better readability.\r\n *\r\n * For static interceptors that should always be enabled (like ApiPrefixInterceptor), use the standard\r\n * HTTP_INTERCEPTORS token.\r\n */\r\nexport const HTTP_DYNAMIC_INTERCEPTORS = new InjectionToken<HttpInterceptor>('HTTP_DYNAMIC_INTERCEPTORS');\r\n\r\n/**\r\n * Extends HttpClient with per request configuration using dynamic interceptors.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class HttpService extends HttpClient implements HttpCustomClient {\r\n\r\n constructor(private httpHandler: HttpHandler,\r\n private injector: Injector,\r\n @Optional() @Inject(HTTP_DYNAMIC_INTERCEPTORS) private interceptors: HttpInterceptor[] = []) {\r\n super(httpHandler);\r\n\r\n if (!this.interceptors) {\r\n // Configure default interceptors that can be disabled here\r\n this.interceptors = [this.injector.get(ApiPrefixInterceptor), this.injector.get(HeaderInterceptor), this.injector.get(TokenInterceptor), this.injector.get(ErrorHandlerInterceptor)];\r\n }\r\n }\r\n\r\n cache(forceUpdate?: boolean): HttpService {\r\n const cacheInterceptor = this.injector.get(CacheInterceptor).configure({ update: forceUpdate });\r\n return this.addInterceptor(cacheInterceptor);\r\n }\r\n\r\n skipErrorHandler(): HttpService {\r\n return this.removeInterceptor(ErrorHandlerInterceptor);\r\n }\r\n\r\n skipApiPrefix(): HttpService {\r\n return this.removeInterceptor(ApiPrefixInterceptor);\r\n }\r\n\r\n skipToken(): HttpService {\r\n return this.removeInterceptor(TokenInterceptor);\r\n }\r\n\r\n skipHeader(): HttpService {\r\n return this.removeInterceptor(HeaderInterceptor);\r\n }\r\n\r\n // Override the original method to wire interceptors when triggering the request.\r\n request(method?: any, url?: any, options?: any): any {\r\n const handler = this.interceptors.reduceRight(\r\n (next, interceptor) => new HttpInterceptorHandler(next, interceptor),\r\n this.httpHandler\r\n );\r\n return new HttpClient(handler).request(method, url, options);\r\n }\r\n\r\n private removeInterceptor(interceptorType: Function): HttpService {\r\n return new HttpService(\r\n this.httpHandler,\r\n this.injector,\r\n this.interceptors.filter(i => !(i instanceof interceptorType))\r\n );\r\n }\r\n\r\n private addInterceptor(interceptor: HttpInterceptor): HttpService {\r\n return new HttpService(\r\n this.httpHandler,\r\n this.injector,\r\n this.interceptors.concat([interceptor])\r\n );\r\n }\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpService } from '../core/http.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class EntityFileService {\r\n\r\n constructor(private http: HttpService) { }\r\n\r\n getEntityFiles(filters: any) {\r\n return this.http.get(`api/entity-files`, { params: filters }).toPromise();\r\n }\r\n\r\n createEntityFile(model: any) {\r\n return this.http.post(\"api/entity-files\", model).toPromise();\r\n }\r\n\r\n updateEntityFile(model: any) {\r\n return this.http.put(`api/entity-files/${model.id}`, model).toPromise();\r\n }\r\n\r\n deleteEntityFile(model: any) {\r\n return this.http.delete(`api/entity-files/${model.id}`).toPromise();\r\n }\r\n\r\n uploadEntityFile(file: File, params?: any) {\r\n const formData: FormData = new FormData();\r\n formData.append(\"fileData\", file, file.name);\r\n if (params?.entity_id) {\r\n formData.append('entity_id', params.entity_id);\r\n formData.append('entity_type', params.entity_type);\r\n }\r\n return this.http\r\n .skipHeader()\r\n .post(\r\n \"api/entity-files-upload\",\r\n formData,\r\n ).toPromise();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FormValidatorService {\r\n\r\n constructor() { }\r\n\r\n /**Method to evaluate form fields*/\r\n isFieldValid(field: string, formGroup: FormGroup | any, firstAttempt?: boolean) {\r\n return (!formGroup.get(field).valid && formGroup.get(field).touched) ||\r\n (!formGroup.get(field).valid && formGroup.get(field).untouched && firstAttempt);\r\n }\r\n\r\n /**Method to find error in form fields*/\r\n getErrorMessage(field: string, formGroup: FormGroup | any, errorMessages: any, errorField?: string) {\r\n const error = Object.keys(formGroup.get(field).errors);\r\n return (error.length > 0) ? (errorMessages[errorField || field][error[0]] ? errorMessages[errorField || field][error[0]] : '') : '';\r\n }\r\n\r\n}\r\n","import { Component, OnInit, Inject } from \"@angular/core\";\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from \"@angular/material/dialog\";\r\nimport { FormGroup, FormBuilder, Validators } from \"@angular/forms\";\r\nimport { EntityFileService } from '../entity-file.service';\r\nimport { FileDropperConfig } from '../../file-dropper/file-dropper.model';\r\nimport { ViewerConfig } from '../../document-viewer/viewer-config.model';\r\nimport { FormValidatorService } from '../../core/form-validator.service';\r\nimport { AlertService } from \"../../core/alert.service\";\r\n\r\nconst errorMessages: any = {\r\n url: {\r\n required: \"File is required\"\r\n },\r\n};\r\n\r\n@Component({\r\n selector: 'entity-file-form',\r\n templateUrl: './entity-file-form.component.html',\r\n styleUrls: ['./entity-file-form.component.css']\r\n})\r\nexport class EntityFileFormComponent implements OnInit {\r\n\r\n entityFileGroup: FormGroup;\r\n assignmentFileFirstAttempt: boolean;\r\n updateMode: boolean;\r\n fileConfig: FileDropperConfig;\r\n fileList: any[] = [];\r\n viewerConfig: ViewerConfig;\r\n hideTitleAndDetails: boolean;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<EntityFileFormComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n private formValidatorService: FormValidatorService,\r\n private fb: FormBuilder,\r\n private entityFileService: EntityFileService,\r\n private alertService: AlertService\r\n ) {\r\n this.createForm();\r\n }\r\n\r\n /** Method to create a form **/\r\n private createForm() {\r\n //TODO: Finialize and add more validations.\r\n this.entityFileGroup = this.fb.group({\r\n id: [''],\r\n title: [''],\r\n details: [''],\r\n entity_type: [''],\r\n entity_id: [],\r\n file: ['', Validators.required],\r\n url: ['', Validators.required],\r\n file_size: ['', Validators.required],\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.data.entity) {\r\n this.entityFileGroup.get('entity_type').setValue(this.data.entity.entity_type);\r\n this.entityFileGroup.get('entity_id').setValue(this.data.entity.entity_id);\r\n }\r\n if (this.data.file) {\r\n this.updateMode = true;\r\n this.entityFileGroup.patchValue(this.data.file);\r\n }\r\n\r\n if (this.data?.hideTitleAndDetails) {\r\n this.hideTitleAndDetails = this.data?.hideTitleAndDetails;\r\n }\r\n\r\n //File dropper config\r\n this.fileConfig = {\r\n fileId: \"subjectFile\",\r\n containerId: \"subjectFileContainer\",\r\n styles: {\r\n height: \"200px\"\r\n },\r\n multiple: false,\r\n acceptFile: \"*\",\r\n maxSize: 10,\r\n acceptFileText: \"All Files\"\r\n };\r\n\r\n this.viewerConfig = {\r\n viewerStyle: {\r\n height: '200px',\r\n width: '100%'\r\n }\r\n }\r\n }\r\n\r\n\r\n //Method to trigger submit\r\n async submit() {\r\n this.assignmentFileFirstAttempt = true;\r\n if (!this.entityFileGroup.valid) {\r\n return;\r\n }\r\n const model = this.entityFileGroup.value;\r\n\r\n if (this.hideTitleAndDetails) {\r\n model.title = model.file;\r\n }\r\n\r\n const result: any = this.updateMode\r\n ? await this.entityFileService.updateEntityFile(model)\r\n : await this.entityFileService.createEntityFile(model);\r\n this.dialogRef.close(result.item);\r\n this.alertService.addAlert(\r\n \"File submitted successfully\",\r\n \"success\"\r\n );\r\n\r\n }\r\n\r\n async fileChanged(event: any) {\r\n this.fileList = event;\r\n\r\n if (this.fileList.length > 0) {\r\n\r\n const result: any = await this.entityFileService.uploadEntityFile(\r\n this.fileList[0],\r\n );\r\n this.entityFileGroup.patchValue(result.item);;\r\n this.fileList = [];\r\n }\r\n }\r\n\r\n\r\n async removeFile() {\r\n if (this.entityFileGroup.value.file) {\r\n try {\r\n this.entityFileGroup.patchValue({\r\n file: \"\",\r\n url: \"\"\r\n });\r\n } catch (error) {\r\n this.alertService.addAlert(\"Unable to remove file, try later\", \"warn\");\r\n }\r\n }\r\n }\r\n\r\n /**Method to evaluate form fields*/\r\n isFieldValid(field: string) {\r\n return this.formValidatorService.isFieldValid(\r\n field,\r\n this.entityFileGroup,\r\n this.assignmentFileFirstAttempt\r\n );\r\n }\r\n\r\n /**Method to find error in form fields*/\r\n getErrorMessage(field: string) {\r\n return this.formValidatorService.getErrorMessage(\r\n field,\r\n this.entityFileGroup,\r\n errorMessages\r\n );\r\n }\r\n\r\n}\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport { Location } from '@angular/common';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { EntityFileFormComponent } from './entity-file-form/entity-file-form.component';\r\nimport { EntityFileService } from './entity-file.service';\r\nimport { ActionPopup } from '../action-popup/action-popup.model';\r\nimport { FormControl } from '@angular/forms';\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { AlertService } from '../core/alert.service';\r\nimport { ActionPopupComponent } from '../action-popup/action-popup.component';\r\nimport { ViewerConfig } from '../document-viewer/viewer-config.model';\r\nimport { FileDropperConfig } from '../file-dropper';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-entity-files-view-all',\r\n templateUrl: './entity-files-view-all.component.html',\r\n styleUrls: ['./entity-files-view-all.component.css']\r\n})\r\nexport class EntityFilesViewAllComponent implements OnInit {\r\n @Input() entityId: number;\r\n @Input() entityType: string;\r\n @Input() viewOnly: boolean = false;\r\n @Input() removeSearch: boolean;\r\n @Input() hideTitleAndDetails: boolean;\r\n @Input() displayMode: boolean;\r\n @Input() allowMultipleFiles: boolean = false;\r\n viewerConfig: ViewerConfig;\r\n @Input() title: string = \"File\";\r\n filters: any = {};\r\n entityFiles: any[] = [];\r\n displayedColumns = [\r\n 'index',\r\n 'title',\r\n 'details',\r\n 'file_size',\r\n 'uploaded_on',\r\n ];\r\n isWorking: boolean = false;\r\n search: FormControl = new FormControl('');\r\n page: number = 1;\r\n perPage: number = 25;\r\n lastPage: number = 0;\r\n fileConfig: FileDropperConfig;\r\n fileList: any[] = [];\r\n\r\n constructor(\r\n private entityFileService: EntityFileService,\r\n public location: Location,\r\n private alertService: AlertService,\r\n private dialog: MatDialog,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n //File dropper config\r\n this.fileConfig = {\r\n fileId: \"entityDashboardDropper\",\r\n containerId: \"entityDashboardDropperContainer\",\r\n styles: {\r\n height: \"500px\"\r\n },\r\n multiple: this.allowMultipleFiles,\r\n acceptFile: \"*\",\r\n maxSize: 10,\r\n acceptFileText: \"All Files\"\r\n };\r\n\r\n this.viewerConfig = {\r\n imageStyle: {\r\n height: '200px',\r\n width: '200px'\r\n },\r\n viewerStyle: {\r\n height: ' 160px',\r\n width: '200px'\r\n },\r\n hideRemove: true\r\n };\r\n\r\n if (this.hideTitleAndDetails) {\r\n this.displayedColumns = this.displayedColumns.filter(x => (x !== 'details') && (x !== 'title'));\r\n }\r\n\r\n this.filters = {\r\n entity_type: this.entityType,\r\n entity_id: this.entityId,\r\n title: \"\"\r\n };\r\n this.search.valueChanges.pipe(debounceTime(500), distinctUntilChanged(), untilDestroyed(this)).subscribe(value => {\r\n this.filters.title = value;\r\n this.reload();\r\n })\r\n this.fetchEntityFilesDetails();\r\n if (!this.viewOnly) {\r\n this.displayedColumns.push('actions');\r\n }\r\n }\r\n\r\n async fetchEntityFilesDetails() {\r\n this.filters.page = this.page;\r\n this.filters.perPage = this.perPage;\r\n this.isWorking = true;\r\n const result: any = await this.entityFileService.getEntityFiles(this.filters);\r\n this.lastPage = result.last_page || this.page;\r\n this.entityFiles = this.entityFiles.concat(result.data);\r\n this.isWorking = false;\r\n }\r\n\r\n addEntityFile() {\r\n const dialogRef = this.dialog.open(EntityFileFormComponent, {\r\n width: \"700px\",\r\n data: {\r\n entity: this.filters,\r\n hideTitleAndDetails: this.hideTitleAndDetails\r\n },\r\n autoFocus: false,\r\n restoreFocus: false\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(async result => {\r\n if (result) {\r\n const files = [...this.entityFiles];\r\n files.push(result);\r\n this.entityFiles = files;\r\n }\r\n });\r\n }\r\n\r\n editEntityFile(file: any) {\r\n const dialogRef = this.dialog.open(EntityFileFormComponent, {\r\n width: \"700px\",\r\n autoFocus: false,\r\n data: {\r\n file: file,\r\n hideTitleAndDetails: this.hideTitleAndDetails\r\n } // Any data passed here will be injected into the model\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n this.reload();\r\n }\r\n });\r\n }\r\n\r\n deleteEntityFile(file: any) {\r\n const dialogRef = this.dialog.open(ActionPopupComponent, {\r\n width: \"400px\",\r\n data: <ActionPopup>{\r\n title: \"Delete File\",\r\n message: `Are you sure to proceed delete the file ${file.title}?`\r\n },\r\n autoFocus: false\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(async result => {\r\n if (result) {\r\n //Action confirmed\r\n const result = await this.entityFileService.deleteEntityFile(\r\n file\r\n );\r\n this.alertService.addAlert(\r\n \"File successfully deleted\",\r\n \"success\"\r\n );\r\n this.reload();\r\n\r\n }\r\n });\r\n }\r\n\r\n onScroll() {\r\n if (this.page < this.lastPage && !this.isWorking) {\r\n this.page += 1;\r\n this.fetchEntityFilesDetails();\r\n }\r\n }\r\n\r\n reload() {\r\n this.entityFiles = [];\r\n this.page = 1;\r\n if (!this.isWorking) {\r\n this.fetchEntityFilesDetails();\r\n }\r\n }\r\n\r\n ngOnDestroy() { }\r\n\r\n resetFieldValue() {\r\n this.search.setValue(\"\");\r\n }\r\n\r\n sizeOf(bytes) {\r\n if (!bytes) { return \"0.00 B\"; }\r\n var e = Math.floor(Math.log(bytes) / Math.log(1024));\r\n return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';\r\n }\r\n\r\n async fileChanged(event: any) {\r\n this.fileList = event;\r\n if (this.fileList.length > 0) {\r\n await this.fileList.forEach(async file => {\r\n const result: any = await this.entityFileService.uploadEntityFile(\r\n file,\r\n {\r\n entity_type: this.entityType,\r\n entity_id: this.entityId,\r\n }\r\n );\r\n this.reload();\r\n });\r\n this.fileList = [];\r\n this.alertService.addAlert('Successfull uploaded', 'success');\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, Input, Output, EventEmitter } from \"@angular/core\";\r\nimport { AlertService } from \"../core/alert.service\";\r\nimport { FileDropperConfig } from './file-dropper.model';\r\n\r\n\r\n@Component({\r\n selector: \"app-file-dropper\",\r\n templateUrl: \"./file-dropper.component.html\",\r\n styleUrls: [\"./file-dropper.component.scss\"]\r\n})\r\nexport class FileDropperComponent implements OnInit {\r\n @Input() fileArray: any[] = [];\r\n\r\n @Input() config: FileDropperConfig;\r\n\r\n @Output() fileChanged: any = new EventEmitter();\r\n\r\n border = \"1px dashed #989898\";\r\n\r\n @Input() styles: any;\r\n\r\n isSingleMode: boolean;\r\n\r\n constructor(private alertService: AlertService) { }\r\n\r\n /**Life cycle hook method */\r\n ngOnInit() {\r\n this.isSingleMode = !Boolean(this.config.multiple);\r\n }\r\n\r\n /**Method for dragging event */\r\n dragEnter(event: any) {\r\n event.target.style.background = this.config.dragColor || \"#c0c0c0\";\r\n\r\n event.target.style.border = \"1px dashed black\";\r\n\r\n event.preventDefault();\r\n }\r\n\r\n /**Method for drag over event */\r\n dragOver(event: any) {\r\n event.preventDefault();\r\n }\r\n\r\n /**Method for drag leave event */\r\n dragLeave(event: any) {\r\n event.target.style.background = \"\";\r\n event.target.style.border = this.border;\r\n\r\n event.preventDefault();\r\n }\r\n\r\n /**Method for drop event */\r\n dropEvent(event: any) {\r\n event.target.style.background = \"\";\r\n event.target.style.border = this.border;\r\n const droppedFiles: FileList = event.dataTransfer.files;\r\n if (droppedFiles.length > 0) {\r\n const fileArray = Array.from(droppedFiles);\r\n this.addFiles(fileArray);\r\n }\r\n event.preventDefault();\r\n }\r\n\r\n /**Method to list files selected */\r\n onFileChange(event: any) {\r\n if (event.target.files && event.target.files.length) {\r\n const fileArray = Array.from(event.target.files);\r\n this.addFiles(fileArray);\r\n const fileInput = document.getElementById(\r\n this.config.fileId\r\n ) as HTMLInputElement;\r\n fileInput.value = \"\";\r\n }\r\n }\r\n\r\n /**Method to add files in the array */\r\n addFiles(fileArray: any) {\r\n if (!this.isSingleMode) {\r\n fileArray.forEach((file: any) => {\r\n this.fileArray = this.fileArray.filter(\r\n (item: any) => item.name !== file.name\r\n );\r\n if (this.fileSizeAllowed(file)) {\r\n this.fileArray.push(file);\r\n }\r\n });\r\n\r\n this.fileArray.sort(this.sortFiles);\r\n this.fileChanged.emit(this.fileArray);\r\n } else {\r\n // Single Mode\r\n if (this.fileArray.length === 0) {\r\n if (this.fileSizeAllowed(fileArray[0])) {\r\n this.fileArray.push(fileArray[0]);\r\n this.fileArray.sort(this.sortFiles);\r\n this.fileChanged.emit(this.fileArray);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**Method to sort the files in asc */\r\n sortFiles(a: any, b: any) {\r\n const nameA = a.name.toUpperCase();\r\n const nameB = b.name.toUpperCase();\r\n if (nameA < nameB) {\r\n return -1;\r\n }\r\n if (nameA > nameB) {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /**Method tp validate the file size */\r\n fileSizeAllowed(file: any): boolean {\r\n if (!Boolean(this.config.maxSize)) {\r\n return true;\r\n } else if (file.size / (1024 * 1024) < this.config.maxSize) {\r\n return true;\r\n } else {\r\n this.alertService.addAlert(\r\n `The size of the file exceeds the limit ${this.config.maxSize} MB, kindly upload a file with size ${this.config.maxSize} MB or below`,\r\n \"warn\"\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n /**Method invokes when the drop box is clicked to upload the file */\r\n clickEvent(event: any) {\r\n if (!(this.isSingleMode && this.fileArray.length > 0)) {\r\n document.getElementById(this.config.fileId).click();\r\n }\r\n event.preventDefault();\r\n }\r\n}\r\n","export class FileDropperConfig {\r\n containerId: string;\r\n fileId: string;\r\n styles?: any;\r\n multiple?: boolean;\r\n dragColor?: boolean;\r\n acceptFile: string; // use '*' to accept all file types.\r\n maxSize?: number; // size in MB\r\n acceptFileText?: string;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpService } from '../core/http.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NoteService {\r\n\r\n constructor(private http: HttpService) { }\r\n\r\n getNotes(filterModel: any) {\r\n return this.http.get('api/notes', { params: filterModel }).toPromise();\r\n }\r\n\r\n addNote(note: any) {\r\n return this.http.post('api/notes', note).toPromise();\r\n }\r\n\r\n editNote(note: any) {\r\n return this.http.put(`api/notes/${note.id}`, note).toPromise();\r\n }\r\n\r\n deleteNote(note: any) {\r\n return this.http.delete(`api/notes/${note.id}`).toPromise();\r\n }\r\n}\r\n","import { Component, OnInit, Inject } from \"@angular/core\";\r\nimport { FormGroup, FormBuilder, Validators } from \"@angular/forms\";\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from \"@angular/material/dialog\";\r\nimport { NoteService } from \"../note.service\";\r\nimport { FormValidatorService } from '../../core/form-validator.service';\r\nimport { AlertService } from \"../../core/alert.service\";\r\n\r\nconst errorMessages: any = {\r\n note: {\r\n required: \"Note is required\"\r\n }\r\n};\r\n\r\n@Component({\r\n selector: 'app-note-form',\r\n templateUrl: './note-form.component.html',\r\n styleUrls: ['./note-form.component.css']\r\n})\r\nexport class NoteFormComponent implements OnInit {\r\n\r\n updateMode: boolean;\r\n noteFormGroup: FormGroup;\r\n noteFormFirstAttempt: boolean;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<NoteFormComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n private fb: FormBuilder,\r\n private formValidatorService: FormValidatorService,\r\n private alertService: AlertService,\r\n private noteService: NoteService\r\n ) {\r\n this.createForm();\r\n }\r\n\r\n /** Method to create a form **/\r\n private createForm() {\r\n //TODO: Finialize and add more validations.\r\n this.noteFormGroup = this.fb.group({\r\n id: [\"\"],\r\n note: [\"\", Validators.compose([Validators.required])],\r\n model_type: [\"\"],\r\n related_model_id: [\"\"],\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n if (this.data.update) {\r\n this.updateMode = true;\r\n }\r\n this.noteFormGroup.patchValue(this.data.note);\r\n }\r\n\r\n //Method to trigger login\r\n async submit() {\r\n this.noteFormFirstAttempt = true;\r\n if (this.noteFormGroup.valid) {\r\n const model = this.noteFormGroup.value;\r\n const result = this.updateMode\r\n ? await this.noteService.editNote(model)\r\n : await this.noteService.addNote(model);\r\n\r\n this.alertService.addAlert(\r\n `${this.data?.labelText} saved successfully`,\r\n \"success\"\r\n );\r\n this.dialogRef.close(result);\r\n }\r\n }\r\n\r\n cancel() {\r\n this.dialogRef.close();\r\n }\r\n\r\n /**Method to evaluate form fields*/\r\n isFieldValid(field: string) {\r\n return this.formValidatorService.isFieldValid(\r\n field,\r\n this.noteFormGroup,\r\n this.noteFormFirstAttempt\r\n );\r\n }\r\n\r\n /**Method to find error in form fields*/\r\n getErrorMessage(field: string) {\r\n return this.formValidatorService.getErrorMessage(\r\n field,\r\n this.noteFormGroup,\r\n errorMessages\r\n );\r\n }\r\n\r\n}\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport { NoteService } from '../note.service';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NoteFormComponent } from '../note-form/note-form.component';\r\nimport { ActionPopupComponent } from '../../action-popup/action-popup.component';\r\nimport { ActionPopup } from '../../action-popup/action-popup.model';\r\n\r\n@Component({\r\n selector: 'app-note-list',\r\n templateUrl: './note-list.component.html',\r\n styleUrls: ['./note-list.component.css']\r\n})\r\nexport class NoteListComponent implements OnInit {\r\n\r\n @Input() relatedModelId !: any;\r\n @Input() modelType !: any;\r\n @Input() readonly: boolean = false;\r\n @Input() labelText: string = 'Note';\r\n @Input() commentsView: boolean = false;\r\n\r\n notes: any[] = [];\r\n filters: any;\r\n displayedColumns = [\r\n 'index',\r\n 'note',\r\n 'actions'\r\n ];\r\n\r\n page = 1;\r\n lastPage = 1;\r\n\r\n constructor(private noteService: NoteService,\r\n private dialog: MatDialog\r\n ) {\r\n this.filters = {};\r\n this.filters.sort_by = \"created_at|DESC\";\r\n }\r\n\r\n ngOnInit() {\r\n if (this.readonly) {\r\n this.displayedColumns = this.displayedColumns.filter(x => x !== 'actions');\r\n }\r\n this.filters.related_model_id = this.relatedModelId;\r\n this.filters.model_type = this.modelType;\r\n this.loadData();\r\n }\r\n\r\n async loadData() {\r\n\r\n const result: any = await this.noteService.getNotes({ ...this.filters, page: this.page });\r\n this.notes = this.notes.concat(result.data);\r\n this.page = result.current_page;\r\n this.lastPage = result.last_page;\r\n }\r\n\r\n addNote() {\r\n const dialogRef = this.dialog.open(NoteFormComponent, {\r\n width: \"400px\",\r\n data: {\r\n note: { related_model_id: this.relatedModelId, model_type: this.modelType },\r\n labelText: this.labelText,\r\n },\r\n autoFocus: false\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n this.resetScroll();\r\n this.loadData();\r\n }\r\n });\r\n }\r\n\r\n editNote(note: any) {\r\n const dialogRef = this.dialog.open(NoteFormComponent, {\r\n width: \"400px\",\r\n data: {\r\n note: note,\r\n update: true,\r\n labelText: this.labelText\r\n },\r\n autoFocus: false\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n this.resetScroll();\r\n this.loadData();\r\n }\r\n });\r\n }\r\n\r\n async deleteNote(note: any) {\r\n const dialogRef = this.dialog.open(ActionPopupComponent, {\r\n width: \"400px\",\r\n data: <ActionPopup>{\r\n title: `Delete ${this.labelText}`,\r\n message: `Are you sure to delete?`\r\n },\r\n autoFocus: false\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(async result => {\r\n if (result) {\r\n //Action confirmed\r\n\r\n const result = await this.noteService.deleteNote(note);\r\n this.notes = this.notes.filter((item: any) => item.id !== note.id);\r\n\r\n }\r\n });\r\n }\r\n\r\n resetScroll() {\r\n this.page = 1;\r\n this.lastPage = 1;\r\n this.notes = [];\r\n }\r\n\r\n onScroll() {\r\n if (this.page < this.lastPage) {\r\n this.page += 1;\r\n this.loadData();\r\n }\r\n }\r\n\r\n commentAction(event: any) {\r\n if (event.type === \"save\") {\r\n if (event.value.id) {\r\n this.editComment(event.value);\r\n return;\r\n }\r\n this.addComment(event.value);\r\n return;\r\n }\r\n this.deleteNote(event.value);\r\n }\r\n\r\n async editComment(comment: any) {\r\n const result: any = await this.noteService.editNote(comment);\r\n let index = this.notes.findIndex(\r\n (x: any) => x.id === comment.id\r\n );\r\n if (index !== -1) {\r\n this.notes[index] = result.item;\r\n }\r\n }\r\n\r\n async addComment(comment: any) {\r\n comment.related_model_id = this.relatedModelId;\r\n comment.model_type = this.modelType;\r\n const result: any = await this.noteService.addNote(comment);\r\n this.notes.push(result.item);\r\n }\r\n\r\n}\r\n","import {\r\n Component,\r\n OnInit,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n OnDestroy\r\n} from \"@angular/core\";\r\nimport { FormGroup, FormBuilder } from \"@angular/forms\";\r\nimport { CredentialsService } from \"../../core/credentials.service\";\r\n\r\n@Component({\r\n selector: \"app-comment-form\",\r\n templateUrl: \"./comment-form.component.html\",\r\n styleUrls: [\"./comment-form.component.scss\"]\r\n})\r\nexport class CommentFormComponent implements OnInit, OnDestroy {\r\n commentFormGroup: FormGroup;\r\n view: boolean;\r\n _commentData: any;\r\n\r\n @Input() set commentData(data: any) {\r\n this.view = !!data;\r\n this._commentData = data;\r\n this.commentFormGroup.patchValue(data);\r\n }\r\n\r\n @Output() action = new EventEmitter();\r\n\r\n constructor(private fb: FormBuilder,\r\n private credentialService: CredentialsService\r\n ) {\r\n this.createForm();\r\n }\r\n\r\n ngOnInit() { }\r\n\r\n get isLoggedIn() {\r\n return this.credentialService.isAuthenticated;\r\n }\r\n\r\n get currentUser() {\r\n return this.credentialService.credentials.user;\r\n }\r\n\r\n private createForm() {\r\n //TODO: Finialize and add more validations.\r\n this.commentFormGroup = this.fb.group({\r\n id: [\"\"],\r\n note: [\"\"],\r\n model_type: [\"\"],\r\n related_model_id: [\"\"],\r\n });\r\n }\r\n\r\n submit() {\r\n if (this.commentFormGroup.get(\"note\").value) {\r\n if (this._commentData) {\r\n this.view = !this.view;\r\n }\r\n this.action.emit({ type: \"save\", value: this.commentFormGroup.value });\r\n this.commentFormGroup.reset();\r\n } else if (this.commentFormGroup.get(\"id\").value) {\r\n this.deleteComment();\r\n }\r\n }\r\n\r\n hideEdit() {\r\n if (this.commentFormGroup.get(\"id\").value) {\r\n this.view = !this.view;\r\n }\r\n }\r\n\r\n editComment() {\r\n this.view = !this.view;\r\n this.commentFormGroup.patchValue(this._commentData);\r\n }\r\n\r\n deleteComment() {\r\n this.action.emit({ type: \"delete\", value: this.commentFormGroup.value });\r\n }\r\n\r\n ngOnDestroy() { }\r\n}\r\n","import { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { Component, ElementRef, Input, OnDestroy, OnInit, Optional, Self, Output, EventEmitter, TemplateRef } from '@angular/core';\r\nimport { FormBuilder, FormGroup, ControlValueAccessor, NgControl, Validators } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { Subject, of, from } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, startWith, switchMap, finalize } from 'rxjs/operators';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ComponentType } from '@angular/cdk/portal';\r\nimport { HttpService } from '../core/http.service';\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-searchable-selector',\r\n templateUrl: './searchable-selector.component.html',\r\n styleUrls: ['./searchable-selector.component.scss'],\r\n providers: [\r\n {\r\n provide: MatFormFieldControl,\r\n useExisting: SearchableSelectorComponent\r\n }\r\n ]\r\n})\r\nexport class SearchableSelectorComponent implements ControlValueAccessor, OnInit, OnDestroy {\r\n\r\n @Input() valueField: string = 'id';\r\n @Input() titleField: string = 'title';\r\n @Input() apiUrl!: string;\r\n @Input() multiple: boolean = false;\r\n @Input() selectedValue: any;\r\n @Output() selectedValueChange = new EventEmitter();\r\n @Input() enableSearch: boolean = true;\r\n @Input() add: boolean = false;\r\n @Input() addConfig: any;\r\n @Input() edit: boolean = false;\r\n @Input() editConfig: any;\r\n @Input() sort: boolean = true;\r\n @Input() sortBy: string;\r\n @Input() searchField: string;\r\n @Input() itemComponent: ComponentType<unknown> | TemplateRef<unknown>;\r\n @Input() items: any[] = [];\r\n @Input() apiDataProperty: string = 'data';\r\n @Input() cache: boolean = false;\r\n @Input() perPage: number = 25;\r\n @Input() inDataSearch: boolean = false;\r\n @Output() selectionChange = new EventEmitter();\r\n @Output() itemsChange = new EventEmitter();\r\n\r\n\r\n isLoading: boolean = false;\r\n onChange: any = () => { };\r\n onTouched: any = () => { };\r\n static nextId = 0;\r\n selectorForm: FormGroup;\r\n stateChanges = new Subject<void>();\r\n focused = false;\r\n controlType = 'searchable-selctor';\r\n id = `searchable-selctor-${SearchableSelectorComponent.nextId++}`;\r\n describedBy = '';\r\n filters: any;\r\n cachedItems: any[] = [];\r\n\r\n\r\n get empty() {\r\n const { value: { select_value } } = this.selectorForm;\r\n return !select_value;\r\n }\r\n\r\n get shouldLabelFloat() { return this.focused || !this.empty; }\r\n\r\n\r\n @Input()\r\n get required(): boolean { return this._required; }\r\n set required(value: boolean) {\r\n this.selectorForm.get('select_value').setValidators(Validators.required);\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n private _required = false;\r\n\r\n @Input()\r\n get disabled(): boolean { return this._disabled; }\r\n set disabled(value: boolean) {\r\n this._disabled = coerceBooleanProperty(value);\r\n this._disabled ? this.selectorForm.disable() : this.selectorForm.enable();\r\n this.stateChanges.next();\r\n }\r\n private _disabled = false;\r\n\r\n @Input()\r\n get value(): any {\r\n if (this.selectorForm.valid) {\r\n return this.selectorForm.value.select_value;\r\n }\r\n return '';\r\n }\r\n set value(data: any) {\r\n this.selectorForm.patchValue({ select_value: data || '' });\r\n this.stateChanges.next();\r\n }\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n private _focusMonitor: FocusMonitor,\r\n private http: HttpService,\r\n private _elementRef: ElementRef<HTMLElement>,\r\n private dialog: MatDialog,\r\n @Optional() @Self() public ngControl: NgControl) {\r\n\r\n this.selectorForm = formBuilder.group({\r\n select_value: [null],\r\n search: ''\r\n });\r\n\r\n _focusMonitor.monitor(_elementRef, true).subscribe(origin => {\r\n if (this.focused && !origin) {\r\n this.onTouched();\r\n }\r\n this.focused = !!origin;\r\n this.stateChanges.next();\r\n });\r\n\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n openedChange(event: any) {\r\n if (this.dataItems.length === 0 && this.selectorForm.get('search').value) {\r\n this.selectorForm.get('search').setValue('');\r\n }\r\n }\r\n\r\n get dataItems(): any[] {\r\n let items: any[] = [];\r\n if (this.multiple && this.selectedValue && (this.selectedValue.length > 0))\r\n items = [...this.selectedValue, ...this.items];\r\n else if ((!this.multiple) && this.selectedValue)\r\n items = [this.selectedValue, ...this.items];\r\n else\r\n items = this.items;\r\n items = items.filter((v, i, a) => a.findIndex(v => v[this.valueField] === a[i][this.valueField]) === i);\r\n //Emit the items to any child component\r\n this.itemsChange.emit(items);\r\n return items;\r\n }\r\n\r\n ngOnInit() {\r\n this.selectorForm.get('search').valueChanges\r\n .pipe(\r\n debounceTime(500),\r\n distinctUntilChanged(),\r\n untilDestroyed(this)\r\n ).subscribe(value => {\r\n if (this.enableSearch)\r\n this.search(value);\r\n });\r\n\r\n this.filters = {\r\n perPage: this.perPage,\r\n search: '',\r\n page: 1,\r\n lastPage: 1\r\n }\r\n if (this.sort) {\r\n this.filters.sort_by = this.sortBy || `${this.titleField}|asc`;\r\n }\r\n\r\n //Fetch Items only if it is not present, can be used in places where we load many entries.\r\n if (this.items.length === 0) {\r\n this.fetchItemList();\r\n }\r\n }\r\n\r\n fetchItemList() {\r\n this.isLoading = true;\r\n let request = this.http.get(this.apiUrl, { params: this.filters })\r\n if (this.cache) {\r\n request = this.http.cache().get(this.apiUrl, { params: this.filters })\r\n }\r\n of().pipe(\r\n startWith(true),\r\n switchMap((_) => from(request)),\r\n finalize(() => this.isLoading = false),\r\n untilDestroyed(this)\r\n ).subscribe((result: any) => {\r\n this.items = this.items.concat(result[this.apiDataProperty]);\r\n if (this.cache) {\r\n this.cachedItems = this.items;\r\n }\r\n this.filters.page = result?.current_page || 1;\r\n this.filters.lastPage = result?.last_page || 1;\r\n });\r\n }\r\n\r\n\r\n setDescribedByIds(ids: string[]) {\r\n this.describedBy = ids.join(' ');\r\n }\r\n\r\n onContainerClick(event: MouseEvent) {\r\n event.stopPropagation();\r\n }\r\n\r\n writeValue(data: any): void {\r\n this.value = data;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n getPropertyValue(ele: any, keyString: string) {\r\n keyString = keyString.replace(/\\[(\\w+)\\]/g, \".$1\"); // convert indexes to properties\r\n keyString = keyString.replace(/^\\./, \"\"); // strip a leading dot\r\n const keyList = keyString.split(\".\");\r\n for (let i = 0, n = keyList.length; i < n; ++i) {\r\n const key = keyList[i];\r\n if (ele && key in ele) {\r\n ele = ele[key];\r\n } else {\r\n return;\r\n }\r\n }\r\n return ele;\r\n }\r\n\r\n _handleInput(): void {\r\n this.onChange(this.value);\r\n if (this.multiple)\r\n this.selectedValue = (this.value as []).map(x => this.dataItems.find(y => y[this.valueField] === x));\r\n else\r\n this.selectedValue = this.dataItems.find(x => x[this.valueField] === this.value);\r\n this.selectedValueChange.emit(this.selectedValue);\r\n this.selectionChange.emit(this.value);\r\n }\r\n\r\n get errorState(): boolean {\r\n return (this.ngControl && this.ngControl.invalid && (this.ngControl.touched || this.ngControl.dirty));\r\n }\r\n\r\n static ngAcceptInputType_disabled: boolean | string | null | undefined;\r\n static ngAcceptInputType_required: boolean | string | null | undefined;\r\n\r\n onScroll() {\r\n if (this.filters.lastPage > this.filters.page) {\r\n this.filters.page += 1;\r\n this.fetchItemList();\r\n }\r\n }\r\n\r\n reloadData() {\r\n this.items = [];\r\n this.filters.page = 1;\r\n this.filters.lastPage = 1;\r\n this.fetchItemList();\r\n }\r\n\r\n search(event: any) {\r\n if (this.searchField) {\r\n this.filters[this.searchField] = event;\r\n } else {\r\n this.filters.search = event;\r\n }\r\n // we need search field to search in data\r\n if (this.inDataSearch && this.searchField) {\r\n this.filterItems(event);\r\n } else {\r\n this.reloadData();\r\n }\r\n }\r\n\r\n filterItems(event: string) {\r\n if (event) {\r\n this.items = this.cachedItems.filter((value: any) => {\r\n return (value[this.searchField] as string).toLowerCase().search(event.toLowerCase()) != -1\r\n })\r\n } else {\r\n this.items = this.cachedItems;\r\n }\r\n }\r\n\r\n addItem(event: any) {\r\n const dialogRef = this.dialog.open(this.itemComponent, {\r\n width: '400px',\r\n autoFocus: false,\r\n data: {},\r\n ...this.addConfig\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result: any) => {\r\n if (result) {\r\n this.items.push(result.item);\r\n this.selectorForm.get('select_value').setValue(result.item[this.valueField]);\r\n this._handleInput();\r\n }\r\n });\r\n event.stopPropagation();\r\n }\r\n\r\n editItem(event: any) {\r\n const dialogRef = this.dialog.open(this.itemComponent, {\r\n width: '400px',\r\n autoFocus: false,\r\n data: {\r\n item: this.selectedValue\r\n },\r\n ...this.editConfig\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result: any) => {\r\n if (result) {\r\n this.items = this.items.filter(x => x[this.valueField] !== this.selectedValue[this.valueField]);\r\n this.items.push(result.item);\r\n this.selectedValue = null;\r\n this.selectorForm.get('select_value').setValue(result.item[this.valueField]);\r\n this._handleInput();\r\n }\r\n });\r\n event.stopPropagation();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.stateChanges.complete();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n }\r\n\r\n}\r\n","import { AfterViewInit, Directive, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output } from '@angular/core';\r\nimport { MatSelect, SELECT_ITEM_HEIGHT_EM } from '@angular/material/select';\r\nimport { debounceTime, takeUntil, tap } from 'rxjs/operators';\r\nimport { fromEvent, Subject } from 'rxjs';\r\n\r\n@Directive({\r\n selector: '[msInfiniteScroll]'\r\n})\r\nexport class MatSelectInfiniteScrollDirective implements OnInit, OnDestroy, AfterViewInit {\r\n\r\n @Input() threshold = '15%';\r\n @Input() debounceTime = 150;\r\n @Input() complete: boolean;\r\n @Output() infiniteScroll = new EventEmitter<void>();\r\n\r\n private panel: Element;\r\n private thrPx = 0;\r\n private thrPc = 0;\r\n private singleOptionHeight = SELECT_ITEM_HEIGHT_EM;\r\n\r\n private destroyed$ = new Subject<boolean>();\r\n\r\n constructor(private matSelect: MatSelect, private ngZone: NgZone) {\r\n }\r\n\r\n ngOnInit() {\r\n this.evaluateThreshold();\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.matSelect.openedChange.pipe(\r\n takeUntil(this.destroyed$)\r\n ).subscribe((opened) => {\r\n if (opened) {\r\n this.panel = this.matSelect.panel.nativeElement;\r\n this.singleOptionHeight = this.getSelectItemHeightPx();\r\n this.registerScrollListener();\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroyed$.next(true);\r\n this.destroyed$.complete();\r\n }\r\n\r\n evaluateThreshold() {\r\n if (this.threshold.lastIndexOf('%') > -1) {\r\n this.thrPx = 0;\r\n this.thrPc = (parseFloat(this.threshold) / 100);\r\n\r\n } else {\r\n this.thrPx = parseFloat(this.threshold);\r\n this.thrPc = 0;\r\n }\r\n }\r\n\r\n registerScrollListener() {\r\n fromEvent(this.panel, 'scroll').pipe(\r\n takeUntil(this.destroyed$),\r\n debounceTime(this.debounceTime),\r\n tap((event) => {\r\n this.handleScrollEvent(event);\r\n })\r\n ).subscribe();\r\n }\r\n\r\n handleScrollEvent(event) {\r\n this.ngZone.runOutsideAngular(() => {\r\n if (this.complete) {\r\n return;\r\n }\r\n const countOfRenderedOptions = this.matSelect.options.length;\r\n const infiniteScrollDistance = this.singleOptionHeight * countOfRenderedOptions;\r\n const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;\r\n\r\n const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;\r\n\r\n if ((scrolledDistance + threshold) >= infiniteScrollDistance) {\r\n this.ngZone.run(() => this.infiniteScroll.emit());\r\n }\r\n });\r\n }\r\n\r\n getSelectItemHeightPx(): number {\r\n return parseFloat(getComputedStyle(this.panel).fontSize) * SELECT_ITEM_HEIGHT_EM;\r\n }\r\n\r\n}","import { Component, Input, Output, EventEmitter } from \"@angular/core\";\r\n\r\n/**\r\n * Component to generate a num items selector\r\n * \r\n * @author Floyd Kissoon\r\n * @since 20170817\r\n */\r\n@Component({\r\n selector: \"num-items-selector\",\r\n templateUrl: \"./num-items-selector.html\"\r\n})\r\nexport class NumItemsSelector {\r\n @Input() numItems: number;\r\n @Output() numItemsChange: EventEmitter<number>;\r\n\r\n constructor() {\r\n this.numItemsChange = new EventEmitter<number>();\r\n }\r\n\r\n /**\r\n * Called when an item has been selected\r\n */\r\n numItemsChanged() {\r\n this.numItemsChange.emit(this.numItems);\r\n }\r\n\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Service that provides utility functions for dates\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20170726\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DateUtils {\r\n\r\n /**\r\n * Takes in a date object and outputs the string value\r\n */\r\n getYYYYMMDDString(inputDate: Date): string {\r\n var year = inputDate.getFullYear();\r\n var month = (inputDate.getMonth() + 1) < 10 ? (\"0\" + (inputDate.getMonth() + 1)) : (inputDate.getMonth() + 1);\r\n var date = inputDate.getDate() < 10 ? (\"0\" + inputDate.getDate()) : inputDate.getDate();\r\n\r\n return year + \"-\" + month + \"-\" + date;\r\n }\r\n\r\n /**\r\n * Takes in a date object and outputs the year\r\n */\r\n getYYYY(inputDate: Date): number {\r\n var year = inputDate.getFullYear();\r\n return year;\r\n }\r\n\r\n /**\r\n * Takes in a date object and outputs the Month\r\n */\r\n getMM(inputDate: Date): number {\r\n var month = inputDate.getMonth() + 1;\r\n return month;\r\n }\r\n // var n = this.rfidCardUseManualEntry.manual_date.toLocaleTimeString();\r\n\r\n getDateTime(inputDate: Date): string {\r\n var year = inputDate.getFullYear();\r\n var month = (inputDate.getMonth() + 1) < 10 ? (\"0\" + (inputDate.getMonth() + 1)) : (inputDate.getMonth() + 1);\r\n var date = inputDate.getDate() < 10 ? (\"0\" + inputDate.getDate()) : inputDate.getDate();\r\n var time = inputDate.toLocaleTimeString();\r\n\r\n return year + \"-\" + month + \"-\" + date + \" \" + time;\r\n }\r\n\r\n}","import { Component, Input, Output, EventEmitter, OnInit } from \"@angular/core\";\r\n\r\n/**\r\n * Component to generate a number selector\r\n * \r\n * @author Floyd Kissoon\r\n * @since 20180628\r\n */\r\n@Component({\r\n selector: \"number-selector\",\r\n templateUrl: \"./number-selector.html\"\r\n})\r\nexport class NumberSelector implements OnInit {\r\n @Input() start_value: number;\r\n @Input() end_value: number\r\n @Output() selectedValueChange: EventEmitter<number>;\r\n @Input() selectedValue: number;\r\n\r\n items = new Array();\r\n\r\n constructor() {\r\n this.selectedValueChange = new EventEmitter<number>();\r\n }\r\n\r\n /**\r\n * Called when an item has been selected\r\n */\r\n numChanged() {\r\n this.selectedValueChange.emit(this.selectedValue);\r\n }\r\n\r\n\r\n ngOnInit() {\r\n for (var i = this.start_value; i < this.end_value + 1; i++) {\r\n this.items.push(i);\r\n }\r\n }\r\n}\r\n","export class Timeline {\r\n public static CUSTOM: number = 1;\r\n public static TODAY: number = 2;\r\n public static YESTERDAY: number = 3;\r\n public static THIS_WEEK: number = 4;\r\n public static LAST_WEEK: number = 5;\r\n public static THIS_MONTH: number = 6;\r\n public static LAST_MONTH: number = 7;\r\n public static THIS_QUARTER: number = 8;\r\n public static LAST_QUARTER: number = 9;\r\n public static THIS_YEAR: number = 10;\r\n public static LAST_YEAR: number = 11;\r\n public static ALL: number = 12;\r\n public static TOMMOROW: number = 13;\r\n public static NEXT_WEEK: number = 14;\r\n public static NEXT_MONTH: number = 15;\r\n}\r\n","import * as moment_ from 'moment';\r\nconst moment = moment_;\r\nimport { Timeline } from \"./timeline.model\";\r\n\r\n\r\nexport interface TimelineValue {\r\n date_from: Date,\r\n date_to: Date,\r\n show_custom_field: boolean\r\n}\r\nexport function calculateTimeline(value: any) {\r\n const date = new Date();\r\n const data: any = {\r\n 'date_from': date,\r\n 'date_to': date,\r\n 'show_custom_field': false\r\n };\r\n switch (value) {\r\n case Timeline.CUSTOM: { //Custom\r\n data.show_custom_field = true;\r\n break;\r\n }\r\n case Timeline.TODAY: { // Today\r\n let now = moment();\r\n data.date_from = now.startOf('day').toISOString();\r\n data.date_to = now.endOf('day').toISOString();\r\n break;\r\n }\r\n case Timeline.YESTERDAY: { // Yesterday\r\n let now = moment().subtract(1, 'day');\r\n data.date_from = now.startOf('day').toISOString();\r\n data.date_to = now.endOf('day').toISOString();\r\n break;\r\n }\r\n case Timeline.THIS_WEEK: { // This Week\r\n let now = moment();\r\n data.date_from = now.startOf('isoWeek').toISOString();\r\n data.date_to = now.endOf('isoWeek').toISOString();\r\n break;\r\n }\r\n case Timeline.LAST_WEEK: { // Last Week\r\n let now = moment().subtract(1, 'week');\r\n data.date_from = now.startOf('isoWeek').toISOString();\r\n data.date_to = now.endOf('isoWeek').toISOString();\r\n break;\r\n }\r\n case Timeline.THIS_MONTH: { //This Month\r\n let now = moment();\r\n data.date_from = now.startOf('month').toISOString();\r\n data.date_to = now.endOf('month').toISOString();\r\n break;\r\n }\r\n case Timeline.LAST_MONTH: { // Last Month\r\n let now = moment().subtract(1, 'month');\r\n data.date_from = now.startOf('month').toISOString();\r\n data.date_to = now.endOf('month').toISOString();\r\n break;\r\n }\r\n case Timeline.THIS_QUARTER: { // This Quarter\r\n let now = moment();\r\n data.date_from = now.startOf('quarter').toISOString();\r\n data.date_to = now.endOf('quarter').toISOString();\r\n break;\r\n }\r\n case Timeline.LAST_QUARTER: { // Last Quarter\r\n let now = moment().subtract(1, 'quarter');\r\n data.date_from = now.startOf('quarter').toISOString();\r\n data.date_to = now.endOf('quarter').toISOString();\r\n break;\r\n }\r\n case Timeline.THIS_YEAR: { // This Year\r\n let now = moment();\r\n data.date_from = now.startOf('year').toISOString();\r\n data.date_to = now.endOf('year').toISOString();\r\n break;\r\n }\r\n case Timeline.LAST_YEAR: { // Last Year\r\n let now = moment().subtract(1, 'year');\r\n data.date_from = now.startOf('year').toISOString();\r\n data.date_to = now.endOf('year').toISOString();\r\n break;\r\n }\r\n case Timeline.TOMMOROW: {\r\n let now = moment().add(1, 'day');\r\n data.date_from = now.startOf('day').toISOString();\r\n data.date_to = now.endOf('day').toISOString();\r\n break;\r\n }\r\n case Timeline.NEXT_WEEK: {\r\n let now = moment().add(1, 'week');\r\n data.date_from = now.startOf('isoWeek').toISOString();\r\n data.date_to = now.endOf('isoWeek').toISOString();\r\n break;\r\n }\r\n case Timeline.NEXT_MONTH: {\r\n let now = moment().add(1, 'month');\r\n data.date_from = now.startOf('month').toISOString();\r\n data.date_to = now.endOf('month').toISOString();\r\n break;\r\n }\r\n default: { // All\r\n data.date_from = '';\r\n data.date_to = '';\r\n break;\r\n }\r\n\r\n }\r\n return data;\r\n}\r\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { DatePipe } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnInit, Optional, Output, Self, ViewChild } from '@angular/core';\r\nimport { ControlValueAccessor, FormBuilder, FormControl, FormGroup, NgControl, Validators } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\r\nimport { TimelineValue, calculateTimeline } from './calculate-timeline';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { Timeline } from './timeline.model';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-timeline-filter',\r\n templateUrl: './timeline-filter.component.html',\r\n styleUrls: ['./timeline-filter.component.scss'],\r\n providers: [\r\n {\r\n provide: MatFormFieldControl,\r\n useExisting: TimelineFilterComponent\r\n }\r\n ]\r\n})\r\nexport class TimelineFilterComponent implements OnInit, ControlValueAccessor {\r\n\r\n @ViewChild('picker') picker;\r\n @Input() timelineValue: FormControl = new FormControl('');\r\n @Input() timelines: any[] = [\r\n { value: Timeline.CUSTOM, viewValue: 'Custom' },\r\n { value: Timeline.TODAY, viewValue: 'Today' },\r\n { value: Timeline.YESTERDAY, viewValue: 'Yesterday' },\r\n { value: Timeline.TOMMOROW, viewValue: 'Tomorrow' },\r\n { value: Timeline.THIS_WEEK, viewValue: 'This Week' },\r\n { value: Timeline.LAST_WEEK, viewValue: 'Last Week' },\r\n { value: Timeline.NEXT_WEEK, viewValue: 'Next Week' },\r\n { value: Timeline.THIS_MONTH, viewValue: 'This Month' },\r\n { value: Timeline.LAST_MONTH, viewValue: 'Last Month' },\r\n { value: Timeline.NEXT_MONTH, viewValue: 'Next Month' },\r\n { value: Timeline.THIS_QUARTER, viewValue: 'This Quarter' },\r\n { value: Timeline.LAST_QUARTER, viewValue: 'Last Quarter' },\r\n { value: Timeline.THIS_YEAR, viewValue: 'This Year' },\r\n { value: Timeline.LAST_YEAR, viewValue: 'Last Year' },\r\n { value: Timeline.ALL, viewValue: 'All dates' },\r\n ];\r\n @Input() dateFrom: string = 'date_from';\r\n @Input() dateTo: string = 'date_to';\r\n @Input() appearance: any = \"legacy\"\r\n @Input() showClearbutton: boolean = false;\r\n /**\r\n * @deprecated The form input is deprated\r\n */\r\n @Input() form: FormGroup = null;\r\n @Input() labelText: string = 'Select Timeline';\r\n @Input() selectedValue: any;\r\n @Input() touchUi: boolean = true;\r\n @Output() selectedValueChange = new EventEmitter();\r\n @Output() selectionChange = new EventEmitter();\r\n\r\n selectorForm: FormGroup;\r\n onChange: any = () => { };\r\n onTouched: any = () => { };\r\n static nextId = 0;\r\n stateChanges = new Subject<void>();\r\n controlType = 'timeline-filter';\r\n id = `timeline-filter-${TimelineFilterComponent.nextId++}`;\r\n describedBy = '';\r\n\r\n selectedRange: TimelineValue;\r\n @Input() set defaultValue(value: any) {\r\n this.timelineValue.setValue(value);\r\n this.changeTimeline(value);\r\n }\r\n\r\n showCustomDateFields: boolean = false;\r\n\r\n constructor(\r\n formBuilder: FormBuilder,\r\n @Optional() @Self() public ngControl: NgControl,\r\n private datePipe: DatePipe\r\n ) {\r\n this.selectorForm = formBuilder.group({\r\n select_value: [null],\r\n });\r\n\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n @Input()\r\n get required(): boolean { return this._required; }\r\n set required(value: boolean) {\r\n this.selectorForm.get('select_value').setValidators(Validators.required);\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n private _required = false;\r\n\r\n @Input()\r\n get disabled(): boolean { return this._disabled; }\r\n set disabled(value: boolean) {\r\n this._disabled = coerceBooleanProperty(value);\r\n this._disabled ? this.selectorForm.disable() : this.selectorForm.enable();\r\n this.stateChanges.next();\r\n }\r\n private _disabled = false;\r\n\r\n @Input()\r\n get value(): any {\r\n if (this.selectorForm.valid) {\r\n return this.selectorForm.value.select_value;\r\n }\r\n return '';\r\n }\r\n set value(data: any) {\r\n this.selectorForm.patchValue({ select_value: data || '' });\r\n this._handleInput();\r\n this.stateChanges.next();\r\n }\r\n\r\n getDateRangeString() {\r\n let str = \"\";\r\n if (this.selectedRange?.show_custom_field) {\r\n if (this.selectedRange?.date_from.toUTCString() != 'Invalid Date') {\r\n str += ' - ' + this.datePipe.transform(this.selectedRange?.date_from?.toUTCString())\r\n }\r\n if (this.selectedRange?.date_to.toUTCString() != 'Invalid Date') {\r\n str += ' - ' + this.datePipe.transform(this.selectedRange?.date_to?.toUTCString())\r\n }\r\n }\r\n return str;\r\n }\r\n\r\n resetFieldValue(field: string) {\r\n this.form.get(field).setValue('');\r\n }\r\n\r\n\r\n getFieldValue(field: string) {\r\n return this.form.get(field).value;\r\n }\r\n\r\n setFieldValue(field: string, value: any) {\r\n this.form.get(field).setValue(value);\r\n }\r\n\r\n changeTimeline(value: any) {\r\n const timeline = calculateTimeline(value);\r\n if (timeline) {\r\n this.setFieldValue(this.dateFrom, timeline.date_from)\r\n this.setFieldValue(this.dateTo, timeline.date_to)\r\n this.showCustomDateFields = timeline.show_custom_field;\r\n }\r\n }\r\n\r\n _handleInput(): void {\r\n if (this.value == 1) {\r\n this.picker.open();\r\n return;\r\n }\r\n const range: TimelineValue = calculateTimeline(this.value);\r\n this.selectedRange = range;\r\n this.onChange(this.value);\r\n this.selectedValueChange.emit(this.selectedValue);\r\n this.selectionChange.emit(range);\r\n }\r\n\r\n dateRangeChange(dateRangeStart: HTMLInputElement, dateRangeEnd: HTMLInputElement) {\r\n const range: TimelineValue = {\r\n date_from : new Date(dateRangeStart.value),\r\n date_to: new Date(dateRangeEnd.value),\r\n show_custom_field: true\r\n }\r\n this.selectedRange = range;\r\n this.onChange(this.value);\r\n this.selectedValueChange.emit(this.selectedValue);\r\n this.selectionChange.emit(range);\r\n }\r\n\r\n onCustomDateChange(event: any) {\r\n }\r\n\r\n setDescribedByIds(ids: string[]) {\r\n this.describedBy = ids.join(' ');\r\n }\r\n\r\n onContainerClick(event: MouseEvent) {\r\n event.stopPropagation();\r\n }\r\n\r\n writeValue(data: any): void {\r\n this.value = data;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n ngOnInit(): void {\r\n console.log(this.form);\r\n\r\n this.timelineValue.valueChanges.\r\n pipe(\r\n debounceTime(100),\r\n distinctUntilChanged(),\r\n untilDestroyed(this)\r\n ).subscribe(value => this.changeTimeline(value));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.stateChanges.complete();\r\n }\r\n\r\n}\r\n","import { Component, OnInit, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-loader',\r\n templateUrl: './loader.component.html',\r\n styleUrls: ['./loader.component.scss']\r\n})\r\nexport class LoaderComponent implements OnInit {\r\n\r\n @Input() isLoading = false;\r\n @Input() size = 0.6;\r\n @Input() message: string | undefined;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() { }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { SuccessSnackComponent, ErrorSnackComponent } from './snack.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@NgModule({\r\n declarations: [\r\n SuccessSnackComponent,\r\n ErrorSnackComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatSnackBarModule,\r\n MatIconModule\r\n ],\r\n exports: [\r\n SuccessSnackComponent,\r\n ErrorSnackComponent,\r\n ]\r\n})\r\nexport class SnackModule { }\r\n","import { Injectable } from '@angular/core';\r\nimport { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\r\nimport { CredentialsService } from './credentials.service';\r\nimport { Logger } from './logger.service';\r\n\r\nconst log = new Logger('AuthenticationGuard');\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthenticationGuard implements CanActivate {\r\n\r\n constructor(private router: Router,\r\n private credentialsService: CredentialsService) { }\r\n\r\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n return this.isUserAuthenticated(route, state);\r\n }\r\n\r\n canLoad(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n return this.isUserAuthenticated(route, state);\r\n }\r\n\r\n isUserAuthenticated(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\r\n if (this.credentialsService.isAuthenticated) {\r\n return true;\r\n }\r\n\r\n log.debug('Not authenticated, redirecting and adding redirect url...');\r\n this.router.navigate(['/login'], { queryParams: { redirect: state.url }, replaceUrl: true });\r\n return false;\r\n }\r\n\r\n}\r\n","\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\nimport { concatMap, map } from 'rxjs/operators';\r\nimport { Credentials, CredentialsService } from './credentials.service';\r\nimport { HttpService } from './http.service';\r\n\r\n/**\r\n * Provides a base for authentication workflow.\r\n * The login/logout methods should be replaced with proper implementation.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuthenticationService {\r\n\r\n constructor(private credentialsService: CredentialsService, private http: HttpService) { }\r\n\r\n /**\r\n * Authenticates the user.\r\n * @param context The login parameters.\r\n * @return The user credentials.\r\n */\r\n login(context: any): Observable<Credentials> {\r\n const data = <Credentials>{};\r\n return this.http\r\n .skipToken()\r\n .post('oauth/token', context)\r\n .pipe(\r\n concatMap(async (tokenInfo: any) => {\r\n tokenInfo.expires_in = Date.now() + (tokenInfo.expires_in * 1000);\r\n data.token = tokenInfo;\r\n data.user = {};\r\n this.credentialsService.setCredentials(data, context.remember);\r\n const userInfo: any = await this.http.get('api/user/current').toPromise();\r\n data.user = userInfo?.user;\r\n this.credentialsService.setCredentials(data, context.remember);\r\n return data;\r\n })\r\n )\r\n }\r\n\r\n /**\r\n * Logs out the user and clear credentials.\r\n * @return True if the user was logged out successfully.\r\n */\r\n logout(): Observable<boolean> {\r\n\r\n this.credentialsService.setCredentials();\r\n return of(true);\r\n }\r\n\r\n}\r\n","import { ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy } from '@angular/router';\r\nimport { Injectable } from '@angular/core';\r\n\r\n/**\r\n * A route strategy allowing for explicit route reuse.\r\n * Used as a workaround for https://github.com/angular/angular/issues/18374\r\n * To reuse a given route, add `data: { reuse: true }` to the route definition.\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RouteReusableStrategy extends RouteReuseStrategy {\r\n\r\n public shouldDetach(route: ActivatedRouteSnapshot): boolean {\r\n return false;\r\n }\r\n\r\n public store(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle | null): void { }\r\n\r\n public shouldAttach(route: ActivatedRouteSnapshot): boolean {\r\n return false;\r\n }\r\n\r\n public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null {\r\n return null;\r\n }\r\n\r\n public shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {\r\n // Reuse the route if the RouteConfig is the same, or if both routes use the\r\n // same component, because the latter can have different RouteConfigs.\r\n return future.routeConfig === curr.routeConfig ||\r\n Boolean(future.routeConfig?.component &&\r\n future.routeConfig?.component === curr.routeConfig?.component);\r\n }\r\n\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Service used to manage Local Storage\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20190623\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StorageService {\r\n private storageSub = new Subject<any>();\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n watch(): Observable<any> {\r\n return this.storageSub.asObservable();\r\n }\r\n\r\n setItem(key: string, data: any) {\r\n localStorage.setItem(key, data);\r\n this.storageSub.next({ key: key, value: data });\r\n }\r\n\r\n getItem(key: string) {\r\n return localStorage.getItem(key);\r\n }\r\n\r\n removeItem(key: string) {\r\n const data = this.getItem(key);\r\n localStorage.removeItem(key);\r\n this.storageSub.next({ key: key, value: data });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpService } from './http.service';\r\n\r\n/**\r\n * Service that provides a wrapper for retrieving data from the server\r\n * @deprecated use HttpService Instead\r\n * @author Joshua Kissoon\r\n * @since 20170709\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DataManager {\r\n\r\n constructor(private http: HttpService) { }\r\n\r\n /**\r\n * Callback wrapper for the HTTP GET Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n * @updated 20170711 to add parameters\r\n */\r\n GET(urlq: string, params = {}): any {\r\n return this.http\r\n .get(urlq, { params: params })\r\n .toPromise();\r\n }\r\n\r\n /**\r\n * Callback wrapper for the HTTP POST Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * @param object The object containing the POST data to be sent\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n */\r\n POST(urlq: string, object: any): any {\r\n if (null == object) {\r\n object = { \"blank\": \"blank\" };\r\n }\r\n\r\n return this.http\r\n .post(urlq, object)\r\n .toPromise();\r\n }\r\n\r\n /**\r\n * Callback wrapper for the HTTP POST Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * @param object The object containing the POST data to be sent\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n */\r\n POSTRAW(urlq: string, object: any): any {\r\n if (null == object) {\r\n object = { \"blank\": \"blank\" };\r\n }\r\n\r\n return this.http\r\n .skipHeader()\r\n .post(urlq, object)\r\n .toPromise();\r\n }\r\n\r\n\r\n /**\r\n * Callback wrapper for the HTTP PUT Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * @param object The object containing the PUT data to be sent\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n */\r\n PUT(urlq: string, object: any): any {\r\n if (null == object) {\r\n object = { \"blank\": \"blank\" };\r\n }\r\n\r\n return this.http\r\n .put(urlq, object)\r\n .toPromise();\r\n }\r\n\r\n /**\r\n * Callback wrapper for the HTTP PATCH Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * @param object The object containing the PUT data to be sent\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20161107\r\n */\r\n PATCH(urlq: string, object: any): any {\r\n if (null == object) {\r\n object = { \"blank\": \"blank\" };\r\n }\r\n\r\n return this.http\r\n .patch(urlq, object)\r\n .toPromise();\r\n }\r\n\r\n /**\r\n * Callback wrapper for the HTTP DELETE Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n */\r\n DELETE(urlq: string): any {\r\n return this.http\r\n .delete(urlq)\r\n .toPromise();\r\n }\r\n\r\n}","import { MatTooltipModule } from '@angular/material/tooltip';\r\n/*\r\n * This module imports and re-exports all Angular Material modules for convenience,\r\n * so only 1 module import is needed in your feature modules.\r\n * See https://material.angular.io/guide/getting-started#step-3-import-the-component-modules.\r\n *\r\n * To optimize your production builds, you should only import the components used in your app.\r\n */\r\n\r\nimport { NgModule } from \"@angular/core\";\r\nimport {\r\n MatCommonModule,\r\n MatLineModule,\r\n MatNativeDateModule,\r\n MatOptionModule,\r\n MatPseudoCheckboxModule,\r\n MatRippleModule\r\n} from \"@angular/material/core\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatCheckboxModule } from \"@angular/material/checkbox\";\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { MatMenuModule } from \"@angular/material/menu\";\r\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\r\nimport { MatSelectModule } from \"@angular/material/select\";\r\nimport { MatSortModule } from \"@angular/material/sort\";\r\nimport { MatTableModule } from \"@angular/material/table\";\r\nimport { MatCardModule } from \"@angular/material/card\";\r\nimport { MatDividerModule } from \"@angular/material/divider\";\r\nimport { MatChipsModule } from \"@angular/material/chips\";\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatListModule } from '@angular/material/list'\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\n\r\n\r\n@NgModule({\r\n exports: [\r\n MatButtonModule,\r\n MatCheckboxModule,\r\n MatCommonModule,\r\n MatDialogModule,\r\n MatFormFieldModule,\r\n MatIconModule,\r\n MatInputModule,\r\n MatLineModule,\r\n MatMenuModule,\r\n MatNativeDateModule,\r\n MatOptionModule,\r\n MatProgressSpinnerModule,\r\n MatPseudoCheckboxModule,\r\n MatRippleModule,\r\n MatSelectModule,\r\n MatSortModule,\r\n MatTableModule,\r\n MatCardModule,\r\n MatDividerModule,\r\n MatChipsModule,\r\n MatDatepickerModule,\r\n MatListModule,\r\n MatTooltipModule,\r\n MatButtonToggleModule\r\n ]\r\n})\r\nexport class MaterialModule { }\r\n","import { NgModule, Optional, SkipSelf } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HTTP_INTERCEPTORS, HttpClientModule, HttpClient } from '@angular/common/http';\r\nimport { RouteReuseStrategy, RouterModule } from '@angular/router';\r\n\r\nimport { RouteReusableStrategy } from './route-reusable-strategy';\r\nimport { ApiPrefixInterceptor } from './api-prefix.interceptor';\r\nimport { ErrorHandlerInterceptor } from './error-handler.interceptor';\r\nimport { HttpService } from './http.service';\r\nimport { TokenInterceptor } from './token.interceptor';\r\nimport { CacheInterceptor } from './cache.interceptor';\r\nimport { SnackModule } from './snack/snack.module';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n HttpClientModule,\r\n RouterModule,\r\n SnackModule\r\n ],\r\n providers: [\r\n {\r\n provide: HttpClient,\r\n useClass: HttpService\r\n },\r\n {\r\n provide: RouteReuseStrategy,\r\n useClass: RouteReusableStrategy\r\n }\r\n ],\r\n exports: [\r\n SnackModule\r\n ]\r\n})\r\nexport class CoreModule {\r\n\r\n constructor(@Optional() @SkipSelf() parentModule: CoreModule) {\r\n // Import guard\r\n if (parentModule) {\r\n throw new Error(`${parentModule} has already been loaded. Import Core module in the root module only.`);\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ActionPopupComponent } from './action-popup.component';\r\nimport { MaterialModule } from '../material.module';\r\n\r\n@NgModule({\r\n imports: [\r\n FlexLayoutModule,\r\n CommonModule,\r\n MaterialModule\r\n ],\r\n declarations: [\r\n ActionPopupComponent\r\n ],\r\n exports: [\r\n ActionPopupComponent\r\n ],\r\n entryComponents: [\r\n ActionPopupComponent\r\n ]\r\n})\r\nexport class ActionPopupModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { DataTableComponent } from './data-table.component';\r\nimport { InfiniteScrollModule } from \"ngx-infinite-scroll\";\r\nimport { MaterialModule } from '../material.module';\r\n\r\n\r\n@NgModule({\r\n imports: [\r\n FlexLayoutModule,\r\n CommonModule,\r\n InfiniteScrollModule,\r\n MaterialModule\r\n ],\r\n declarations: [\r\n DataTableComponent\r\n ],\r\n exports: [\r\n DataTableComponent\r\n ]\r\n})\r\nexport class DataTableModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { DocumentViewerComponent } from './document-viewer.component';\r\nimport { NgxDocViewerModule } from 'ngx-doc-viewer';\r\nimport { MaterialModule } from '../material.module';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n NgxDocViewerModule,\r\n MaterialModule\r\n ],\r\n declarations: [\r\n DocumentViewerComponent\r\n ],\r\n exports: [\r\n DocumentViewerComponent\r\n ]\r\n})\r\nexport class DocumentViewerModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FileDropperComponent } from './file-dropper.component';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from '../material.module';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FlexLayoutModule,\r\n MaterialModule\r\n ],\r\n declarations: [\r\n FileDropperComponent\r\n ],\r\n exports: [FileDropperComponent]\r\n})\r\nexport class FileDropperModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { EntityFileFormComponent } from './entity-file-form/entity-file-form.component';\r\nimport { EntityFilesViewAllComponent } from './entity-files-view-all.component';\r\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { FileDropperModule } from '../file-dropper/file-dropper.module';\r\nimport { DocumentViewerModule } from '../document-viewer/document-viewer.module';\r\nimport { ActionPopupModule } from '../action-popup/action-popup.module';\r\nimport { MaterialModule } from '../material.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [EntityFileFormComponent, EntityFilesViewAllComponent],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n FlexLayoutModule,\r\n FileDropperModule,\r\n DocumentViewerModule,\r\n InfiniteScrollModule,\r\n ActionPopupModule,\r\n MaterialModule\r\n ],\r\n exports: [\r\n EntityFilesViewAllComponent\r\n ],\r\n entryComponents: [EntityFileFormComponent]\r\n})\r\nexport class EntityFilesViewAllModule { }\r\n","import { Component, OnInit, Input } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: \"app-read-more\",\r\n templateUrl: \"./read-more.component.html\",\r\n styleUrls: [\"./read-more.component.scss\"]\r\n})\r\nexport class ReadMoreComponent implements OnInit {\r\n @Input() text: string;\r\n @Input() maxLength: number = 100;\r\n currentText: string;\r\n hideToggle: boolean = true;\r\n\r\n isCollapsed: boolean = true;\r\n\r\n constructor() {}\r\n\r\n ngOnInit() {\r\n this.determineView();\r\n }\r\n\r\n toggleView() {\r\n this.isCollapsed = !this.isCollapsed;\r\n this.determineView();\r\n }\r\n\r\n determineView() {\r\n if (!this.text || this.text.length <= this.maxLength) {\r\n this.currentText = this.text;\r\n this.isCollapsed = false;\r\n this.hideToggle = true;\r\n return;\r\n }\r\n this.hideToggle = false;\r\n if (this.isCollapsed == true) {\r\n this.currentText = this.text.substring(0, this.maxLength) + \"...\";\r\n } else if (this.isCollapsed == false) {\r\n this.currentText = this.text;\r\n }\r\n }\r\n}\r\n","import { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from '../material.module';\r\nimport { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ReadMoreComponent } from './read-more.component';\r\n\r\n@NgModule({\r\n declarations: [ReadMoreComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FlexLayoutModule\r\n ],\r\n exports: [\r\n ReadMoreComponent\r\n ]\r\n})\r\nexport class ReadMoreModule { }","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NoteListComponent } from './note-list/note-list.component';\r\nimport { NoteFormComponent } from './note-form/note-form.component';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ActionPopupModule } from '../action-popup/action-popup.module';\r\nimport { MaterialModule } from '../material.module';\r\nimport { CommentFormComponent } from './comment-form/comment-form.component';\r\nimport { ReadMoreModule } from '../read-more/read-more.module';\r\n\r\n@NgModule({\r\n declarations: [\r\n NoteListComponent,\r\n NoteFormComponent,\r\n CommentFormComponent,\r\n ],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n InfiniteScrollModule,\r\n FlexLayoutModule,\r\n ActionPopupModule,\r\n MaterialModule,\r\n ReadMoreModule\r\n ],\r\n exports: [\r\n NoteListComponent\r\n ],\r\n entryComponents: [NoteFormComponent]\r\n})\r\nexport class NoteModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { SearchableSelectorComponent } from './searchable-selector.component';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSelectInfiniteScrollDirective } from './mat-select-infinite-scroll.directive';\r\nimport { MaterialModule } from '../material.module';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n FlexLayoutModule,\r\n MaterialModule\r\n ],\r\n declarations: [\r\n SearchableSelectorComponent,\r\n MatSelectInfiniteScrollDirective\r\n ],\r\n exports: [\r\n SearchableSelectorComponent,\r\n MatSelectInfiniteScrollDirective\r\n ]\r\n})\r\nexport class SearchableSelectorModule { }\r\n","import { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n/* Selectors */\r\nimport { NumItemsSelector } from './num-items-selector.component';\r\nimport { NumberSelector } from './number-selector.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ],\r\n declarations: [\r\n NumItemsSelector, NumberSelector,\r\n ],\r\n exports: [NumItemsSelector, NumberSelector]\r\n})\r\nexport class UtilityModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class TimelineFilterRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { TimelineFilterRoutingModule } from './timeline-filter-routing.module';\r\nimport { TimelineFilterComponent } from './timeline-filter.component';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MaterialModule } from '../material.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [TimelineFilterComponent],\r\n imports: [\r\n CommonModule,\r\n TimelineFilterRoutingModule,\r\n FlexLayoutModule,\r\n MaterialModule,\r\n ReactiveFormsModule\r\n ],\r\n exports: [TimelineFilterComponent]\r\n})\r\nexport class TimelineFilterModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LoaderComponent } from './loader.component';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\n\r\n@NgModule({\r\n declarations: [\r\n LoaderComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MatProgressSpinnerModule\r\n ],\r\n exports: [\r\n LoaderComponent\r\n ]\r\n})\r\nexport class LoaderModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class EmailSubscriptionRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { EmailSubscriptionRoutingModule } from './email-subscription-routing.module';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n EmailSubscriptionRoutingModule\r\n ]\r\n})\r\nexport class EmailSubscriptionModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class EmailSubscriptionUserRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { EmailSubscriptionUserRoutingModule } from './email-subscription-user-routing.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n EmailSubscriptionUserRoutingModule\r\n ]\r\n})\r\nexport class EmailSubscriptionUserModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class EmailSubscriptionUserFormRoutingModule { }\r\n","\r\nimport { Component, Inject, OnInit, TemplateRef } from '@angular/core';\r\nimport { FormGroup, FormBuilder, Validators } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { finalize } from 'rxjs/operators';\r\nimport { AlertService } from '../../../core/alert.service';\r\nimport { FormValidatorService } from '../../../core/form-validator.service';\r\nimport { HttpService } from '../../../core/http.service';\r\nimport { Logger } from '../../../core/logger.service';\r\n\r\nconst log = new Logger('EmailSubscriptionUser Form');\r\n\r\nconst errorMessages: any = {\r\n user_id: {\r\n required: \"User is required\"\r\n },\r\n email_type_id: {\r\n required: \"Email Type is required\"\r\n },\r\n};\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-email-subscription-user-form',\r\n templateUrl: './email-subscription-user-form.component.html',\r\n styleUrls: ['./email-subscription-user-form.component.scss']\r\n})\r\nexport class EmailSubscriptionUserFormComponent implements OnInit {\r\n\r\n updateMode: boolean;\r\n esUserFormGroup: FormGroup;\r\n esUserFormFirstAttempt: boolean;\r\n esUser: any;\r\n isSubmitLoading: boolean;\r\n selectedUser: any;\r\n selectedType: any;\r\n\r\n constructor(private fb: FormBuilder,\r\n private formValidatorService: FormValidatorService,\r\n private alertService: AlertService,\r\n public dialogRef: MatDialogRef<EmailSubscriptionUserFormComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n private http: HttpService\r\n ) {\r\n this.createForm();\r\n }\r\n\r\n /** Method to create a form **/\r\n private createForm() {\r\n\r\n //TODO: Finialize and add more validations.\r\n this.esUserFormGroup = this.fb.group({\r\n id: [''],\r\n user_id: ['', Validators.required],\r\n email_type_id: ['', Validators.required],\r\n });\r\n }\r\n\r\n\r\n ngOnInit() {\r\n if (this.data?.esUser?.id) {\r\n this.esUser = this.data.esUser;\r\n this.updateMode = true;\r\n this.selectedType = this.esUser?.email_type;\r\n this.selectedUser = this.esUser?.user;\r\n this.esUserFormGroup.patchValue(this.esUser);\r\n }\r\n\r\n }\r\n\r\n //Method to trigger login\r\n submit() {\r\n this.esUserFormGroup.markAllAsTouched();\r\n this.esUserFormFirstAttempt = true;\r\n if (this.esUserFormGroup.valid) {\r\n this.isSubmitLoading = true;\r\n const model = this.esUserFormGroup.value;\r\n (\r\n this.updateMode ?\r\n this.http.put(`api/email-subscription-users/${model?.id}`, model) :\r\n this.http.post(`api/email-subscription-users`, model)\r\n )\r\n .pipe(\r\n finalize(() => this.isSubmitLoading = false),\r\n untilDestroyed(this)\r\n ).subscribe(result => {\r\n this.alertService.addAlert(\"Subscription saved successfully\", \"success\");\r\n this.dialogRef.close(result);\r\n });\r\n }\r\n }\r\n\r\n\r\n cancel() {\r\n this.dialogRef.close();\r\n }\r\n\r\n /**Method to evaluate form fields*/\r\n isFieldValid(field: string) {\r\n return this.formValidatorService.isFieldValid(field, this.esUserFormGroup, this.esUserFormFirstAttempt);\r\n }\r\n\r\n /**Method to find error in form fields*/\r\n getErrorMessage(field: string) {\r\n return this.formValidatorService.getErrorMessage(field, this.esUserFormGroup, errorMessages);\r\n }\r\n\r\n ngOnDestroy() {\r\n // Needed for automatic unsubscribe with untilDestroyed\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { EmailSubscriptionUserFormRoutingModule } from './email-subscription-user-form-routing.module';\r\nimport { EmailSubscriptionUserFormComponent } from './email-subscription-user-form.component';\r\nimport { SearchableSelectorModule } from '../../../searchable-selector/searchable-selector.module';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from '../../../material.module';\r\nimport { LoaderModule } from '../../../loader/loader.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [EmailSubscriptionUserFormComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n SearchableSelectorModule,\r\n EmailSubscriptionUserFormRoutingModule,\r\n LoaderModule\r\n ],\r\n entryComponents: [EmailSubscriptionUserFormComponent]\r\n})\r\nexport class EmailSubscriptionUserFormModule { }\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\n\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { FormControl } from '@angular/forms';\r\nimport { MatSort } from '@angular/material/sort';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { EmailSubscriptionUserFormComponent } from '../email-subscription-user-form/email-subscription-user-form.component';\r\nimport { Router } from '@angular/router';\r\nimport { Logger } from '../../../core/logger.service';\r\nimport { PageEvent } from '../../../data-table/data-table.model';\r\nimport { HttpService } from '../../../core/http.service';\r\nimport { ActionPopupComponent } from '../../../action-popup/action-popup.component';\r\nimport { ActionPopup } from '../../../action-popup/action-popup.model';\r\n\r\nconst log = new Logger('EmailSubscriptionUser list');\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-email-subscription-user-list',\r\n templateUrl: './email-subscription-user-list.component.html',\r\n styleUrls: ['./email-subscription-user-list.component.scss']\r\n})\r\nexport class EmailSubscriptionUserListComponent implements OnInit {\r\n\r\n esUserList: any[] = [];\r\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n filters: any = {\r\n sort_by: 'created_at|desc',\r\n };\r\n\r\n\r\n @ViewChild(MatSort, { static: true }) sort: MatSort;\r\n\r\n displayColumns: FormControl = new FormControl(['index', 'user.name', 'email_type.title', 'creator.name', 'created_at', 'actions']);\r\n displayedColumns: any[] = [];\r\n availableDisplayColumns: any[] = [\r\n { order: 1, value: 'index', name: 'Index' },\r\n { order: 2, value: 'user.name', name: 'User' },\r\n { order: 3, value: 'email_type.title', name: 'Email Type' },\r\n { order: 4, value: 'creator.name', name: 'Creator' },\r\n { order: 5, value: 'actions', name: 'Actions' }\r\n ];\r\n\r\n constructor(\r\n private dialog: MatDialog,\r\n private http: HttpService,\r\n private router: Router,\r\n ) { }\r\n\r\n ngOnInit() {\r\n this.displayedColumns = this.displayColumns.value;\r\n this.initializeData();\r\n\r\n if (this.sort) {\r\n this.sort.sortChange.pipe(untilDestroyed(this))\r\n .subscribe((value: any) => {\r\n this.changeSort(value);\r\n })\r\n }\r\n }\r\n\r\n get selectedColumns(): string[] {\r\n return this.availableDisplayColumns\r\n .filter(col => (this.displayColumns.value as any).some((x: any) => x === col.value))\r\n .sort((a, b) => (a.order > b.order) ? 1 : ((b.order > a.order) ? -1 : 0))\r\n .map(col => col.value);\r\n }\r\n\r\n columnsChange() {\r\n this.displayedColumns = this.selectedColumns;\r\n }\r\n\r\n\r\n initializeData() {\r\n this.http.get(`api/email-subscription-users`, { params: { ...this.filters, ...this.pageEvent } })\r\n .pipe(untilDestroyed(this))\r\n .subscribe((result: any) => {\r\n this.esUserList = this.esUserList.concat(result.data);\r\n this.pageEvent.page = result.current_page;\r\n this.pageEvent.lastPage = result.last_page;\r\n });\r\n }\r\n\r\n filterChange(event: any) {\r\n this.filters = {\r\n ...this.filters,\r\n ...event\r\n };\r\n this.reload();\r\n }\r\n\r\n addEmailSubscriptionUser() {\r\n const dialogRef = this.dialog.open(EmailSubscriptionUserFormComponent, {\r\n width: '800px',\r\n autoFocus: false,\r\n data: {} // Any data passed here will be injected into the model\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result: any) => {\r\n if (result) {\r\n log.debug(result);\r\n this.reload();\r\n }\r\n });\r\n }\r\n\r\n\r\n editEmailSubscriptionUser(event: any, esUser: any) {\r\n event.stopPropagation();\r\n const dialogRef = this.dialog.open(EmailSubscriptionUserFormComponent, {\r\n width: '800px',\r\n autoFocus: false,\r\n data: {\r\n esUser: esUser\r\n } // Any data passed here will be injected into the model\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result: any) => {\r\n if (result) {\r\n log.debug(result);\r\n this.reload();\r\n }\r\n });\r\n }\r\n\r\n deleteEmailSubscriptionUser(event: any, esUser: any) {\r\n event.stopPropagation();\r\n const dialogRef = this.dialog.open(ActionPopupComponent, {\r\n width: '400px',\r\n data: <ActionPopup>{\r\n title: 'Delete Subscription',\r\n message: `Are you sure to proceed delete the esUser ${esUser.name}?`\r\n },\r\n autoFocus: false\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n //Action confirmed\r\n this.http.delete(`api/email-subscription-users/${esUser?.id}`)\r\n .pipe(untilDestroyed(this))\r\n .subscribe((result: any) => {\r\n this.esUserList = this.esUserList.filter(x => x.id !== esUser.id);\r\n });\r\n }\r\n });\r\n }\r\n\r\n onScroll() {\r\n if (this.pageEvent.lastPage > this.pageEvent.page) {\r\n this.pageEvent.page += 1;\r\n this.initializeData();\r\n }\r\n }\r\n\r\n changeSort(event: any) {\r\n if (event.direction) {\r\n this.filters.sort_by = `${event.active}|${event.direction}`;\r\n this.reload();\r\n }\r\n }\r\n\r\n reload() {\r\n this.esUserList = [];\r\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n this.initializeData();\r\n }\r\n\r\n\r\n ngOnDestroy() {\r\n //Until destroyed uses it\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { AuthenticationGuard } from '../../../core/authentication.guard';\r\nimport { EmailSubscriptionUserListComponent } from './email-subscription-user-list.component';\r\n\r\nexport const esulr = {\r\n title: 'Email Subscription Users',\r\n permissions: {\r\n only: ['app_admin'],\r\n redirectTo: '/'\r\n }\r\n};\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n component: EmailSubscriptionUserListComponent,\r\n canActivate: [AuthenticationGuard],\r\n data: esulr\r\n },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class EmailSubscriptionUserListRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class EmailSubscriptionUserListFilterRoutingModule { }\r\n","import { Component, OnInit, Output, EventEmitter, Input } from '@angular/core';\r\nimport { FormGroup, FormBuilder } from '@angular/forms';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-email-subscription-user-list-filter',\r\n templateUrl: './email-subscription-user-list-filter.component.html',\r\n styleUrls: ['./email-subscription-user-list-filter.component.scss']\r\n})\r\nexport class EmailSubscriptionUserListFilterComponent implements OnInit {\r\n\r\n esUserFilterForm: FormGroup;\r\n\r\n @Output() valueChange = new EventEmitter();\r\n\r\n constructor(private fb: FormBuilder) {\r\n this.createForm();\r\n }\r\n\r\n private createForm() {\r\n\r\n //TODO: Finialize and add more validations.\r\n this.esUserFilterForm = this.fb.group({\r\n user_id: [''],\r\n email_type_id: [''],\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n this.esUserFilterForm.valueChanges.pipe(\r\n debounceTime(500),\r\n distinctUntilChanged(),\r\n untilDestroyed(this)\r\n ).subscribe(value => {\r\n this.valueChange.emit(value);\r\n })\r\n }\r\n\r\n\r\n resetFieldValue(field: string) {\r\n this.esUserFilterForm.get(field).setValue('');\r\n }\r\n\r\n getFieldValue(field: string) {\r\n return this.esUserFilterForm.get(field).value;\r\n }\r\n\r\n\r\n ngOnDestroy() {\r\n\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { EmailSubscriptionUserListFilterRoutingModule } from './email-subscription-user-list-filter-routing.module';\r\nimport { EmailSubscriptionUserListFilterComponent } from './email-subscription-user-list-filter.component';\r\nimport { MaterialModule } from '../../../material.module';\r\nimport { SearchableSelectorModule } from '../../../searchable-selector/searchable-selector.module';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\n\r\n\r\n@NgModule({\r\n declarations: [EmailSubscriptionUserListFilterComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n SearchableSelectorModule,\r\n EmailSubscriptionUserListFilterRoutingModule\r\n ],\r\n exports: [EmailSubscriptionUserListFilterComponent]\r\n})\r\nexport class EmailSubscriptionUserListFilterModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { EmailSubscriptionUserListRoutingModule } from './email-subscription-user-list-routing.module';\r\nimport { EmailSubscriptionUserListComponent } from './email-subscription-user-list.component';\r\nimport { EmailSubscriptionUserListFilterModule } from '../email-subscription-user-list-filter/email-subscription-user-list-filter.module';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { EmailSubscriptionUserFormModule } from '../email-subscription-user-form/email-subscription-user-form.module';\r\nimport { MaterialModule } from '../../../material.module';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\n\r\n\r\n@NgModule({\r\n declarations: [EmailSubscriptionUserListComponent],\r\n imports: [\r\n CommonModule,\r\n InfiniteScrollModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n EmailSubscriptionUserListRoutingModule,\r\n EmailSubscriptionUserFormModule,\r\n EmailSubscriptionUserListFilterModule\r\n ],\r\n exports: [EmailSubscriptionUserListComponent]\r\n})\r\nexport class EmailSubscriptionUserListModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\n\r\nexport class EmailSubscriptionTypeRoutingModule { }","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { EmailSubscriptionTypeRoutingModule } from './email-subscription-type-routing.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [\r\n CommonModule,\r\n EmailSubscriptionTypeRoutingModule\r\n ]\r\n})\r\nexport class EmailSubscriptionTypeModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class EmailSubscriptionTypeFormRoutingModule { }\r\n","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { FormGroup, FormBuilder, Validators } from '@angular/forms';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { finalize } from 'rxjs/operators';\r\nimport { AlertService } from '../../../core/alert.service';\r\nimport { FormValidatorService } from '../../../core/form-validator.service';\r\nimport { HttpService } from '../../../core/http.service';\r\n\r\nconst errorMessages: any = {\r\n title: {\r\n required: \"Title is required\"\r\n },\r\n code: {\r\n required: \"Code is required\"\r\n },\r\n frequency_id: {\r\n required: \"Frequency is required\"\r\n },\r\n};\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-email-subscription-type-form',\r\n templateUrl: './email-subscription-type-form.component.html',\r\n styleUrls: ['./email-subscription-type-form.component.scss']\r\n})\r\nexport class EmailSubscriptionTypeFormComponent implements OnInit {\r\n\r\n updateMode: boolean;\r\n emailSubscriptionTypeFormGroup: FormGroup;\r\n emailSubscriptionTypeFormFirstAttempt: boolean;\r\n emailSubscriptionType: any;\r\n selectedFrequency: any;\r\n isLoading: boolean;\r\n isSubmitLoading: boolean;\r\n\r\n constructor(private fb: FormBuilder,\r\n private formValidatorService: FormValidatorService,\r\n private alertService: AlertService,\r\n public dialogRef: MatDialogRef<EmailSubscriptionTypeFormComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n private http: HttpService\r\n ) {\r\n this.createForm();\r\n }\r\n\r\n /** Method to create a form **/\r\n private createForm() {\r\n\r\n //TODO: Finialize and add more validations.\r\n this.emailSubscriptionTypeFormGroup = this.fb.group({\r\n id: [''],\r\n title: ['', Validators.compose([Validators.required])],\r\n code: ['', Validators.compose([Validators.required])],\r\n frequency_id: ['', Validators.required],\r\n description: [''],\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n if (this.data.emailSubscriptionType?.id) {\r\n this.isLoading = true;\r\n this.emailSubscriptionType = this.data?.emailSubscriptionType;\r\n this.updateMode = true;\r\n this.selectedFrequency = this.emailSubscriptionType?.frequency || {};\r\n this.emailSubscriptionTypeFormGroup.patchValue(this.emailSubscriptionType);\r\n }\r\n }\r\n\r\n //Method to trigger login\r\n submit() {\r\n this.emailSubscriptionTypeFormGroup.markAllAsTouched();\r\n this.emailSubscriptionTypeFormFirstAttempt = true;\r\n if (this.emailSubscriptionTypeFormGroup.valid) {\r\n this.isSubmitLoading = true;\r\n const model = this.emailSubscriptionTypeFormGroup.value;\r\n (\r\n this.updateMode ?\r\n this.http.put(`api/email-subscription-types/${model?.id}`, model) :\r\n this.http.post(`api/email-subscription-types`, model)\r\n )\r\n .pipe(\r\n finalize(() => this.isSubmitLoading = false),\r\n untilDestroyed(this)\r\n ).subscribe(result => {\r\n this.alertService.addAlert(\"Email Type saved successfully\", \"success\");\r\n this.dialogRef.close(result);\r\n });\r\n }\r\n }\r\n\r\n\r\n cancel() {\r\n this.dialogRef.close();\r\n }\r\n\r\n\r\n /**Method to evaluate form fields*/\r\n isFieldValid(field: string) {\r\n return this.formValidatorService.isFieldValid(field, this.emailSubscriptionTypeFormGroup, this.emailSubscriptionTypeFormFirstAttempt);\r\n }\r\n\r\n /**Method to find error in form fields*/\r\n getErrorMessage(field: string) {\r\n return this.formValidatorService.getErrorMessage(field, this.emailSubscriptionTypeFormGroup, errorMessages);\r\n }\r\n\r\n ngOnDestroy() {\r\n // Needed for automatic unsubscribe with untilDestroyed\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { EmailSubscriptionTypeFormRoutingModule } from './email-subscription-type-form-routing.module';\r\nimport { EmailSubscriptionTypeFormComponent } from './email-subscription-type-form.component';\r\nimport { SearchableSelectorModule } from '../../../searchable-selector/searchable-selector.module';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from '../../../material.module';\r\nimport { LoaderModule } from '../../../loader/loader.module';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [EmailSubscriptionTypeFormComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n SearchableSelectorModule,\r\n EmailSubscriptionTypeFormRoutingModule,\r\n LoaderModule\r\n ],\r\n exports: [EmailSubscriptionTypeFormComponent],\r\n entryComponents: [EmailSubscriptionTypeFormComponent]\r\n})\r\nexport class EmailSubscriptionTypeFormModule { }\r\n","import { Component, OnInit, ViewChild } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { FormControl } from '@angular/forms';\r\nimport { distinctUntilChanged, debounceTime } from 'rxjs/operators';\r\nimport { MatSort } from '@angular/material/sort';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { EmailSubscriptionTypeFormComponent } from '../email-subscription-type-form/email-subscription-type-form.component';\r\nimport { PageEvent } from '../../../data-table/data-table.model';\r\nimport { HttpService } from '../../../core/http.service';\r\nimport { ActionPopupComponent } from '../../../action-popup/action-popup.component';\r\nimport { ActionPopup } from '../../../action-popup/action-popup.model';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-email-subscription-type-list',\r\n templateUrl: './email-subscription-type-list.component.html',\r\n styleUrls: ['./email-subscription-type-list.component.scss']\r\n})\r\nexport class EmailSubscriptionTypeListComponent implements OnInit {\r\n\r\n emailSubscriptionTypeList: any[] = [];\r\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n filters: any = {\r\n sort_by: 'created_at|desc',\r\n isLoadRelations: true,\r\n relations: ['frequency']\r\n };\r\n search: FormControl = new FormControl('');\r\n\r\n\r\n @ViewChild(MatSort, { static: true }) sort: MatSort;\r\n\r\n displayColumns: FormControl = new FormControl(['index', 'title', 'frequency.title', 'description', 'actions']);\r\n displayedColumns: any[] = [];\r\n availableDisplayColumns: any[] = [\r\n { order: 1, value: 'index', name: 'Index' },\r\n { order: 2, value: 'title', name: 'Title' },\r\n { order: 3, value: 'code', name: 'Code' },\r\n { order: 4, value: 'frequency.title', name: 'Frequency' },\r\n { order: 5, value: 'description', name: 'Description' },\r\n { order: 6, value: 'actions', name: 'Actions' }\r\n ];\r\n\r\n constructor(\r\n private dialog: MatDialog,\r\n private http: HttpService,\r\n ) { }\r\n\r\n ngOnInit() {\r\n this.displayedColumns = this.displayColumns.value;\r\n this.initializeData();\r\n this.search.valueChanges.pipe(\r\n debounceTime(500),\r\n distinctUntilChanged(),\r\n untilDestroyed(this)\r\n ).subscribe(value => {\r\n this.filters.search = value;\r\n this.reload();\r\n });\r\n\r\n if (this.sort) {\r\n this.sort.sortChange.pipe(untilDestroyed(this))\r\n .subscribe((value: any) => {\r\n this.changeSort(value);\r\n })\r\n }\r\n }\r\n\r\n get selectedColumns(): string[] {\r\n return this.availableDisplayColumns\r\n .filter(col => (this.displayColumns.value as any).some((x: any) => x === col.value))\r\n .sort((a, b) => (a.order > b.order) ? 1 : ((b.order > a.order) ? -1 : 0))\r\n .map(col => col.value);\r\n }\r\n\r\n columnsChange() {\r\n this.displayedColumns = this.selectedColumns;\r\n }\r\n\r\n\r\n initializeData() {\r\n this.http.get(`api/email-subscription-types`, { params: { ...this.filters, ...this.pageEvent } })\r\n .pipe(untilDestroyed(this))\r\n .subscribe((result: any) => {\r\n this.emailSubscriptionTypeList = this.emailSubscriptionTypeList.concat(result.data);\r\n this.pageEvent.page = result.current_page;\r\n this.pageEvent.lastPage = result.last_page;\r\n });\r\n }\r\n\r\n addEmailSubscriptionType() {\r\n const dialogRef = this.dialog.open(EmailSubscriptionTypeFormComponent, {\r\n width: '400px',\r\n autoFocus: false,\r\n data: {} // Any data passed here will be injected into the model\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result: any) => {\r\n if (result) {\r\n this.reload();\r\n }\r\n });\r\n }\r\n\r\n\r\n editEmailSubscriptionType(event: any, emailSubscriptionType: any) {\r\n event.stopPropagation();\r\n const dialogRef = this.dialog.open(EmailSubscriptionTypeFormComponent, {\r\n width: '400px',\r\n autoFocus: false,\r\n data: {\r\n emailSubscriptionType: emailSubscriptionType\r\n } // Any data passed here will be injected into the model\r\n });\r\n\r\n dialogRef.afterClosed().subscribe((result: any) => {\r\n if (result) {\r\n this.reload();\r\n }\r\n });\r\n }\r\n\r\n deleteEmailSubscriptionType(event: any, emailSubscriptionType: any) {\r\n event.stopPropagation();\r\n const dialogRef = this.dialog.open(ActionPopupComponent, {\r\n width: '400px',\r\n data: <ActionPopup>{\r\n title: 'Delete Email Type',\r\n message: `Are you sure to proceed delete the Email Type ${emailSubscriptionType.title}?`\r\n },\r\n autoFocus: false\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n //Action confirmed\r\n this.http.delete(`api/email-subscription-types/${emailSubscriptionType?.id}`)\r\n .pipe(untilDestroyed(this))\r\n .subscribe((result: any) => {\r\n this.emailSubscriptionTypeList = this.emailSubscriptionTypeList.filter(x => x.id !== emailSubscriptionType.id);\r\n });\r\n }\r\n });\r\n }\r\n\r\n onScroll() {\r\n if (this.pageEvent.lastPage > this.pageEvent.page) {\r\n this.pageEvent.page += 1;\r\n this.initializeData();\r\n }\r\n }\r\n\r\n changeSort(event: any) {\r\n if (event.direction) {\r\n this.filters.sort_by = `${event.active}|${event.direction}`;\r\n this.reload();\r\n }\r\n }\r\n\r\n reload() {\r\n this.emailSubscriptionTypeList = [];\r\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n this.initializeData();\r\n }\r\n\r\n ngOnDestroy() {\r\n //Until destroyed uses it\r\n }\r\n\r\n}","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { AuthenticationGuard } from '../../../core/authentication.guard';\r\n\r\nimport { EmailSubscriptionTypeListComponent } from './email-subscription-type-list.component';\r\n\r\nexport const estlr = {\r\n title: 'Email Subscription Type',\r\n permissions: {\r\n only: ['client_admin'],\r\n redirectTo: '/'\r\n }\r\n};\r\n\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n component: EmailSubscriptionTypeListComponent,\r\n canActivate: [AuthenticationGuard],\r\n data: estlr\r\n },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class EmailSubscriptionTypeListRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { EmailSubscriptionTypeListRoutingModule } from './email-subscription-type-list-routing.module';\r\nimport { EmailSubscriptionTypeListComponent } from './email-subscription-type-list.component';\r\nimport { EmailSubscriptionTypeFormModule } from '../email-subscription-type-form/email-subscription-type-form.module';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from '../../../material.module';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\n\r\n\r\n@NgModule({\r\n declarations: [EmailSubscriptionTypeListComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n InfiniteScrollModule,\r\n EmailSubscriptionTypeFormModule,\r\n EmailSubscriptionTypeListRoutingModule\r\n ],\r\n exports: [EmailSubscriptionTypeListComponent]\r\n})\r\nexport class EmailSubscriptionTypeListModule { }\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { HttpService } from '../../core/http.service';\r\nimport { PageEvent } from '../../data-table/data-table.model';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-email-subscription-for-user',\r\n templateUrl: './email-subscription-for-user.component.html',\r\n styleUrls: ['./email-subscription-for-user.component.scss']\r\n})\r\nexport class EmailSubscriptionForUserComponent implements OnInit {\r\n\r\n subscriptions: any[] = [];\r\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n filters: any = {\r\n sort_by: 'created_at|desc',\r\n isLoadRelations: true,\r\n relations: 'frequency,currentUserSubscription'\r\n };\r\n\r\n constructor(\r\n private http: HttpService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.fetchSubscriptions();\r\n }\r\n\r\n fetchSubscriptions() {\r\n this.http.get(`api/email-subscription-types`, { params: { ...this.filters, ...this.pageEvent } })\r\n .pipe(untilDestroyed(this))\r\n .subscribe((result: any) => {\r\n this.subscriptions = this.subscriptions.concat(result.data);\r\n this.pageEvent.page = result.current_page;\r\n this.pageEvent.lastPage = result.last_page;\r\n });\r\n }\r\n\r\n onScroll() {\r\n if (this.pageEvent.lastPage > this.pageEvent.page) {\r\n this.pageEvent.page += 1;\r\n this.fetchSubscriptions();\r\n }\r\n }\r\n\r\n subscribe(sub: any) {\r\n this.http.post(`api/email-subscription-for-user`, { email_type_id: sub?.id })\r\n .pipe(untilDestroyed(this))\r\n .subscribe((result: any) => {\r\n sub.current_user_subscription = result?.item;\r\n });\r\n }\r\n\r\n unsubscribe(sub: any) {\r\n this.http.delete(`api/email-subscription-users/${sub?.current_user_subscription?.id}`)\r\n .pipe(untilDestroyed(this))\r\n .subscribe((_: any) => {\r\n sub.current_user_subscription = null;\r\n });\r\n }\r\n\r\n\r\n reload() {\r\n this.subscriptions = [];\r\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n this.fetchSubscriptions();\r\n }\r\n\r\n ngOnDestroy() {\r\n //Until destroyed uses it\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { AuthenticationGuard } from '../../core/authentication.guard';\r\nimport { EmailSubscriptionForUserComponent } from './email-subscription-for-user.component';\r\n\r\nexport const esfur = {\r\n permissions: {\r\n only: ['client_admin']\r\n }\r\n};\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n component: EmailSubscriptionForUserComponent,\r\n canActivate: [AuthenticationGuard],\r\n data: esfur\r\n },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class EmailSubscriptionForUserRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { EmailSubscriptionForUserRoutingModule } from './email-subscription-for-user-routing.module';\r\nimport { EmailSubscriptionForUserComponent } from './email-subscription-for-user.component';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from '../../material.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [EmailSubscriptionForUserComponent],\r\n imports: [\r\n CommonModule,\r\n InfiniteScrollModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n EmailSubscriptionForUserRoutingModule\r\n ],\r\n exports: [EmailSubscriptionForUserComponent]\r\n})\r\nexport class EmailSubscriptionForUserModule { }\r\n","import { HttpService } from '../core/http.service';\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TechlifyUpdateService {\r\n\r\n constructor(private http: HttpService) { }\r\n\r\n getTechlifyUpdates(filters: any) {\r\n return this.http.get(`api/techlify-updates`, { params: filters }).toPromise();\r\n }\r\n\r\n createTechlifyUpdate(techlifyUpdate: any) {\r\n return this.http.post(`api/techlify-updates`, techlifyUpdate).toPromise();\r\n }\r\n\r\n updateTechlifyUpdate(techlifyUpdate: any) {\r\n return this.http.put(`api/techlify-updates/${techlifyUpdate.id}`, techlifyUpdate).toPromise();\r\n }\r\n\r\n deleteTechlifyUpdate(techlifyUpdateId: any) {\r\n return this.http.delete(`api/techlify-updates/${techlifyUpdateId}`).toPromise();\r\n }\r\n\r\n getTechlifyUpdate(techlifyUpdateId: any) {\r\n return this.http.get(`api/techlify-updates/${techlifyUpdateId}`).toPromise();\r\n }\r\n\r\n getNewUpdateForCurrentUser() {\r\n return this.http.get(`api/current-user-techlify-updates`).toPromise();\r\n }\r\n\r\n createUpdateViewRecord(techlifyUpdateView: any) {\r\n return this.http.post(`api/techlify-update-views`, techlifyUpdateView).toPromise();\r\n }\r\n\r\n updateCurrentUserUpdates() {\r\n return this.http.get(`api/techlify-updates/update-view`).toPromise();\r\n }\r\n}\r\n","import { AlertService } from \"../../core/alert.service\";\r\nimport { TechlifyUpdateService } from './../techlify-update.service';\r\nimport { FormControl, Validators } from '@angular/forms';\r\nimport { Component, EventEmitter, Inject, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { FormValidatorService } from '../../core/form-validator.service';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { Editor, Toolbar } from 'ngx-editor';\r\n\r\nconst errorMessages: any = {\r\n title: {\r\n required: \"Title is required\",\r\n },\r\n released_on: {\r\n required: \"Released On is required\",\r\n },\r\n version: {\r\n required: \"Version is required\",\r\n },\r\n description: {\r\n required: \"Description is required\",\r\n },\r\n learn_more_link: {\r\n pattern: \"Please enter valid link\",\r\n }\r\n}\r\n\r\n@Component({\r\n selector: 'app-techlify-update-form',\r\n templateUrl: './techlify-update-form.component.html',\r\n styleUrls: ['./techlify-update-form.component.scss']\r\n})\r\nexport class TechlifyUpdateFormComponent implements OnInit {\r\n\r\n @Output() onSave = new EventEmitter<any>();\r\n techlifyUpdateForm: FormGroup;\r\n isUpdateMode: boolean = false;\r\n editor: Editor;\r\n toolbar: Toolbar = [\r\n ['bold', 'italic'],\r\n ['bullet_list'],\r\n ];\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<TechlifyUpdateFormComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n private fb: FormBuilder,\r\n private formValidatorService: FormValidatorService,\r\n private alertService: AlertService,\r\n private techlifyUpdateService: TechlifyUpdateService\r\n ) {\r\n this.createForm();\r\n }\r\n\r\n private createForm() {\r\n this.techlifyUpdateForm = this.fb.group({\r\n id: new FormControl(''),\r\n title: new FormControl('', Validators.required),\r\n description: new FormControl('', Validators.required),\r\n version: new FormControl('', Validators.required),\r\n released_on: new FormControl('', Validators.required),\r\n learn_more_link: new FormControl('', Validators.compose([Validators.pattern('(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})[/\\\\w .-]*/?')])),\r\n });\r\n if (this.data.techlifyUpdateDetails) {\r\n this.isUpdateMode = true;\r\n this.techlifyUpdateForm.patchValue(this.data.techlifyUpdateDetails);\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.editor = new Editor();\r\n }\r\n\r\n async submit() {\r\n if (this.techlifyUpdateForm.valid) {\r\n let result;\r\n const model = this.techlifyUpdateForm.value;\r\n\r\n try {\r\n result = this.isUpdateMode ? await this.techlifyUpdateService.updateTechlifyUpdate(model)\r\n : await this.techlifyUpdateService.createTechlifyUpdate(model);\r\n this.alertService.addAlert(\r\n \"Techlify app update saved successfully\",\r\n \"success\"\r\n );\r\n } catch (error) {\r\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\r\n } finally {\r\n if (result) {\r\n this.dialogRef.close(result);\r\n }\r\n }\r\n }\r\n }\r\n\r\n resetFieldValue(field: string) {\r\n this.techlifyUpdateForm.get(field).setValue('');\r\n }\r\n\r\n getFieldValue(field: string) {\r\n return this.techlifyUpdateForm.get(field).value;\r\n }\r\n\r\n /** Method to evaluate form fields*/\r\n isFieldValid(field: string) {\r\n return this.formValidatorService.isFieldValid(field, this.techlifyUpdateForm, true);\r\n }\r\n /** Method to find error in form fields*/\r\n getErrorMessage(field: string) {\r\n return this.formValidatorService.getErrorMessage(field, this.techlifyUpdateForm, errorMessages);\r\n }\r\n\r\n}\r\n","import { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MaterialModule } from './../../material.module';\r\nimport { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TechlifyUpdateFormComponent } from './techlify-update-form.component';\r\nimport { NgxEditorModule } from 'ngx-editor';\r\n\r\n@NgModule({\r\n declarations: [TechlifyUpdateFormComponent],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n NgxEditorModule,\r\n ],\r\n exports: [\r\n TechlifyUpdateFormComponent\r\n ],\r\n entryComponents: [\r\n TechlifyUpdateFormComponent\r\n ]\r\n})\r\nexport class TechlifyUpdateFormModule { }\r\n","import { UntilDestroy } from '@ngneat/until-destroy';\r\nimport { untilDestroyed } from '@ngneat/until-destroy';\r\nimport { ActionPopup } from './../../action-popup/action-popup.model';\r\nimport { ActionPopupComponent } from './../../action-popup/action-popup.component';\r\nimport { TechlifyUpdateFormComponent } from './../techlify-update-form/techlify-update-form.component';\r\nimport { TechlifyUpdateService } from './../techlify-update.service';\r\nimport { FormControl, FormBuilder } from '@angular/forms';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { AlertService } from '../../core/alert.service';\r\nimport { Component, OnInit } from '@angular/core';\r\nimport { debounceTime } from 'rxjs/operators';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-techlify-updates-list',\r\n templateUrl: './techlify-updates-list.component.html',\r\n styleUrls: ['./techlify-updates-list.component.scss']\r\n})\r\nexport class TechlifyUpdatesListComponent implements OnInit {\r\n techlifyUpdates: any[] = [];\r\n displayedColumns: string[] = [\r\n 'index',\r\n 'title',\r\n 'version',\r\n 'released_on',\r\n 'learn_more_link',\r\n 'description',\r\n 'creator',\r\n 'actions'\r\n ];\r\n page: number = 1;\r\n lastPage: number;\r\n perPage: number = 25;\r\n isWorking: boolean = false;\r\n filterFormGroup: FormGroup;\r\n\r\n constructor(\r\n private dialog: MatDialog,\r\n private alertService: AlertService,\r\n private techlifyUpdateService: TechlifyUpdateService,\r\n private fb: FormBuilder,\r\n ) {\r\n this.filterFormGroup = this.fb.group({\r\n search: new FormControl(''),\r\n version: new FormControl(''),\r\n sort_by: new FormControl('released_on|DESC'),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.loadData();\r\n this.listenChanges();\r\n }\r\n\r\n listenChanges() {\r\n this.filterFormGroup.valueChanges.pipe(debounceTime(500), untilDestroyed(this))\r\n .subscribe(changes => {\r\n this.reload();\r\n });\r\n }\r\n\r\n ngOnDestroy() { }\r\n\r\n async loadData() {\r\n try {\r\n this.isWorking = true;\r\n var filters: any = this.filterFormGroup.value;\r\n filters.perPage = this.perPage;\r\n filters.page = this.page;\r\n let result: any = await this.techlifyUpdateService.getTechlifyUpdates(\r\n filters\r\n );\r\n this.lastPage = result.last_page || this.page;\r\n this.techlifyUpdates = this.techlifyUpdates.concat(result.data);\r\n } catch (error) {\r\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\r\n }\r\n finally {\r\n this.isWorking = false;\r\n }\r\n }\r\n\r\n reload() {\r\n this.techlifyUpdates = [];\r\n this.page = 1;\r\n if (!this.isWorking) {\r\n this.loadData();\r\n }\r\n }\r\n\r\n onScroll() {\r\n if (!this.isWorking && this.page < this.lastPage) {\r\n this.page += 1;\r\n this.loadData();\r\n }\r\n }\r\n\r\n modifyTechlifyUpdate(model?: any) {\r\n const dialogRef = this.dialog.open(TechlifyUpdateFormComponent, {\r\n width: \"600px\",\r\n data: {\r\n techlifyUpdateDetails: model,\r\n }\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n this.reload();\r\n }\r\n });\r\n }\r\n\r\n async deleteTechlifyUpdate(model: any) {\r\n const dialogRef = this.dialog.open(ActionPopupComponent, {\r\n width: \"400px\",\r\n data: <ActionPopup>{\r\n title: \"Delete Update\",\r\n message: `Are you sure to delete this update?`\r\n },\r\n autoFocus: false\r\n });\r\n\r\n dialogRef.afterClosed().subscribe(async result => {\r\n if (result) {\r\n //Action confirmed\r\n try {\r\n await this.techlifyUpdateService.deleteTechlifyUpdate(model.id);\r\n this.alertService.addAlert(\r\n \"Successfully deleted the update\",\r\n \"success\"\r\n );\r\n this.reload();\r\n } catch (error) {\r\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\r\n }\r\n }\r\n });\r\n }\r\n\r\n resetFieldValue(field: string) {\r\n this.filterFormGroup.get(field).setValue(\"\");\r\n }\r\n\r\n sortColumn(event) {\r\n var direction = event.direction.toString().toUpperCase();\r\n this.assignFilter(event.active, direction);\r\n }\r\n\r\n assignFilter(column, direction) {\r\n switch (column) {\r\n case 'title': {\r\n return this.filterFormGroup.get('sort_by').setValue(\"title|\" + direction);\r\n }\r\n case 'released_on': {\r\n return this.filterFormGroup.get('sort_by').setValue(\"released_on|\" + direction);\r\n }\r\n case 'version': {\r\n return this.filterFormGroup.get('sort_by').setValue(\"version|\" + direction);\r\n }\r\n default: {\r\n return this.filterFormGroup.get('sort_by').setValue(\"created_at|DESC\");\r\n }\r\n };\r\n }\r\n\r\n}\r\n","import { TechlifyUpdatesListComponent } from './techlify-updates-list/techlify-updates-list.component';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\n\r\nconst routes: Routes = [\r\n { path: '', redirectTo: 'all', pathMatch: 'full' },\r\n { path: 'all', component: TechlifyUpdatesListComponent },\r\n\r\n //fallback\r\n {\r\n path: '**',\r\n redirectTo: 'all',\r\n pathMatch: 'full'\r\n }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class TechlifyUpdateRoutingModule { }\r\n","import { ReadMoreModule } from '../read-more/read-more.module';\r\nimport { TechlifyUpdateFormModule } from './techlify-update-form/techlify-update-form.module';\r\nimport { TechlifyUpdateRoutingModule } from './techlify-update-routing.module';\r\nimport { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TechlifyUpdatesListComponent } from './techlify-updates-list/techlify-updates-list.component';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MaterialModule } from '../material.module';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ActionPopupModule } from '../action-popup/action-popup.module';\r\n\r\n@NgModule({\r\n declarations: [TechlifyUpdatesListComponent],\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n InfiniteScrollModule,\r\n FlexLayoutModule,\r\n MaterialModule,\r\n ActionPopupModule,\r\n TechlifyUpdateRoutingModule,\r\n TechlifyUpdateFormModule,\r\n ReadMoreModule,\r\n ]\r\n})\r\nexport class TechlifyUpdateModule { }\r\n","import { Inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { Component, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-update-view',\r\n templateUrl: './update-view.component.html',\r\n styleUrls: ['./update-view.component.scss']\r\n})\r\nexport class UpdateViewComponent implements OnInit {\r\n techlifyUpdate: any;\r\n rootNavUrl: any;\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<UpdateViewComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n private router: Router\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.techlifyUpdate = this.data.techlifyUpdate;\r\n this.rootNavUrl = this.data.rootNavUrl;\r\n }\r\n\r\n close() {\r\n this.dialogRef.close();\r\n }\r\n\r\n openUpdateHistory(): void {\r\n this.close();\r\n this.router.navigate([this.rootNavUrl + \"/update-history\"]);\r\n }\r\n\r\n}\r\n","import { UntilDestroy } from '@ngneat/until-destroy';\r\nimport { untilDestroyed } from '@ngneat/until-destroy';\r\nimport { AlertService } from './../../core/alert.service';\r\nimport { UpdateViewComponent } from './../update-view/update-view.component';\r\nimport { TechlifyUpdateService } from './../techlify-update.service';\r\nimport { FormControl, FormBuilder } from '@angular/forms';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Component, OnInit } from '@angular/core';\r\nimport { debounceTime } from 'rxjs/operators';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-techlify-update-history',\r\n templateUrl: './techlify-update-history.component.html',\r\n styleUrls: ['./techlify-update-history.component.scss']\r\n})\r\nexport class TechlifyUpdateHistoryComponent implements OnInit {\r\n techlifyUpdates: any[] = [];\r\n displayedColumns: string[] = [\r\n 'index',\r\n 'title',\r\n 'version',\r\n 'released_on',\r\n 'learn_more_link',\r\n 'description',\r\n 'creator',\r\n 'actions'\r\n ];\r\n page: number = 1;\r\n lastPage: number;\r\n perPage: number = 25;\r\n isWorking: boolean = false;\r\n filterFormGroup: FormGroup;\r\n\r\n constructor(\r\n private dialog: MatDialog,\r\n private techlifyUpdateService: TechlifyUpdateService,\r\n private fb: FormBuilder,\r\n private alertService: AlertService\r\n ) {\r\n this.filterFormGroup = this.fb.group({\r\n search: new FormControl(''),\r\n version: new FormControl(''),\r\n sort_by: new FormControl('released_on|DESC'),\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.loadData();\r\n this.listenChanges();\r\n this.updateCurrentUserUpdates();\r\n }\r\n\r\n listenChanges() {\r\n this.filterFormGroup.valueChanges.pipe(debounceTime(500), untilDestroyed(this))\r\n .subscribe(changes => {\r\n this.reload();\r\n });\r\n }\r\n\r\n ngOnDestroy() { }\r\n\r\n async loadData() {\r\n try {\r\n this.isWorking = true;\r\n var filters: any = this.filterFormGroup.value;\r\n filters.perPage = this.perPage;\r\n filters.page = this.page;\r\n let result: any = await this.techlifyUpdateService.getTechlifyUpdates(\r\n filters\r\n );\r\n this.lastPage = result.last_page || this.page;\r\n this.techlifyUpdates = this.techlifyUpdates.concat(result.data);\r\n } catch (error) {\r\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\r\n }\r\n finally {\r\n this.isWorking = false;\r\n }\r\n }\r\n\r\n reload() {\r\n this.techlifyUpdates = [];\r\n this.page = 1;\r\n if (!this.isWorking) {\r\n this.loadData();\r\n }\r\n }\r\n\r\n onScroll() {\r\n if (!this.isWorking && this.page < this.lastPage) {\r\n this.page += 1;\r\n this.loadData();\r\n }\r\n }\r\n\r\n resetFieldValue(field: string) {\r\n this.filterFormGroup.get(field).setValue(\"\");\r\n }\r\n\r\n sortColumn(event) {\r\n var direction = event.direction.toString().toUpperCase();\r\n this.assignFilter(event.active, direction);\r\n }\r\n\r\n assignFilter(column, direction) {\r\n switch (column) {\r\n case 'title': {\r\n return this.filterFormGroup.get('sort_by').setValue(\"title|\" + direction);\r\n }\r\n case 'released_on': {\r\n return this.filterFormGroup.get('sort_by').setValue(\"released_on|\" + direction);\r\n }\r\n case 'version': {\r\n return this.filterFormGroup.get('sort_by').setValue(\"version|\" + direction);\r\n }\r\n default: {\r\n return this.filterFormGroup.get('sort_by').setValue(\"created_at|DESC\");\r\n }\r\n };\r\n }\r\n\r\n openUpdateView(techlifyUpdate: any): void {\r\n const dialogRef = this.dialog.open(UpdateViewComponent, {\r\n width: \"800px\",\r\n autoFocus: false,\r\n data: {\r\n techlifyUpdate: techlifyUpdate,\r\n isFromHistory: true,\r\n } // Any data passed here will be injected into the model\r\n });\r\n }\r\n\r\n async updateCurrentUserUpdates() {\r\n try {\r\n await this.techlifyUpdateService.updateCurrentUserUpdates();\r\n } catch (error) {\r\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\r\n }\r\n }\r\n}\r\n","import { TechlifyUpdateHistoryComponent } from './techlify-update-history.component';\r\nimport { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\n\r\nconst routes: Routes = [\r\n { path: '', redirectTo: 'update-history', pathMatch: 'full' },\r\n { path: 'update-history', component: TechlifyUpdateHistoryComponent },\r\n\r\n //fallback\r\n {\r\n path: '**',\r\n redirectTo: 'all',\r\n pathMatch: 'full'\r\n }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class TechlifyUpdateHistoryRoutingModule { }\r\n","import { ReactiveFormsModule } from '@angular/forms';\r\nimport { TechlifyUpdateHistoryRoutingModule } from './techlify-update-history-routing.module';\r\nimport { ReadMoreModule } from '../../read-more/read-more.module';\r\nimport { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TechlifyUpdateHistoryComponent } from './techlify-update-history.component';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { MaterialModule } from '../../material.module';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ActionPopupModule } from '../../action-popup/action-popup.module';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n ReactiveFormsModule,\r\n InfiniteScrollModule,\r\n FlexLayoutModule,\r\n MaterialModule,\r\n ActionPopupModule,\r\n ReadMoreModule,\r\n TechlifyUpdateHistoryRoutingModule\r\n ],\r\n declarations: [TechlifyUpdateHistoryComponent]\r\n})\r\nexport class TechlifyUpdateHistoryModule { }\r\n","import { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from './../../material.module';\r\nimport { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { UpdateViewComponent } from './update-view.component';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [UpdateViewComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FlexLayoutModule\r\n ],\r\n exports: [\r\n UpdateViewComponent\r\n ],\r\n entryComponents: [\r\n UpdateViewComponent\r\n ]\r\n})\r\nexport class UpdateViewModule { }\r\n","import { AlertService } from './../../../core/alert.service';\r\nimport { TechlifyUpdateService } from './../../techlify-update.service';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Component, EmbeddedViewRef, Inject, OnInit } from '@angular/core';\r\nimport { MatSnackBarRef, MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';\r\nimport { UpdateViewComponent } from '../../update-view/update-view.component';\r\nimport { Router } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'app-update-notifier-snack',\r\n templateUrl: './update-notifier-snack.component.html',\r\n styleUrls: ['./update-notifier-snack.component.scss']\r\n})\r\nexport class UpdateNotifierSnackComponent implements OnInit {\r\n maxDescriptionLength: any = 70;\r\n descriptionText: any = '';\r\n techlifyUpdate: any;\r\n rootNavUrl: any;\r\n\r\n constructor(\r\n @Inject(MAT_SNACK_BAR_DATA) public data: any,\r\n private snackBarRef: MatSnackBarRef<EmbeddedViewRef<any>>,\r\n private dialog: MatDialog,\r\n private router: Router,\r\n private techlifyUpdateService: TechlifyUpdateService,\r\n private alertService: AlertService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.techlifyUpdate = this.data.techlifyUpdate;\r\n this.rootNavUrl = this.data.rootNavUrl;\r\n this.determineDescription(this.techlifyUpdate?.description)\r\n }\r\n\r\n close(): void {\r\n this.createUpdateViewRecord();\r\n this.snackBarRef.dismiss();\r\n }\r\n\r\n determineDescription(description: any) {\r\n if (!description || description.length <= this.maxDescriptionLength) {\r\n this.descriptionText = description;\r\n return;\r\n }\r\n this.descriptionText = description.substring(0, this.maxDescriptionLength) + \"...\";\r\n }\r\n\r\n openUpdateView(): void {\r\n this.close();\r\n const dialogRef = this.dialog.open(UpdateViewComponent, {\r\n width: \"800px\",\r\n autoFocus: false,\r\n data: {\r\n techlifyUpdate: this.techlifyUpdate,\r\n rootNavUrl: this.data.rootNavUrl\r\n } // Any data passed here will be injected into the model\r\n });\r\n }\r\n\r\n openUpdateHistory(): void {\r\n this.close();\r\n this.router.navigate([this.rootNavUrl + \"/update-history\"]);\r\n }\r\n\r\n async createUpdateViewRecord() {\r\n try {\r\n var techlifyUpdateView = {\r\n update_id: this.techlifyUpdate?.id\r\n };\r\n let result: any = await this.techlifyUpdateService.createUpdateViewRecord(techlifyUpdateView);\r\n }\r\n catch (error) {\r\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\r\n }\r\n }\r\n}\r\n","import { UpdateNotifierSnackComponent } from './update-notifier-snack/update-notifier-snack.component';\r\nimport { TechlifyUpdateService } from './../techlify-update.service';\r\nimport { Component, Input, OnInit } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { AlertService } from '../../core/alert.service';\r\n\r\n@Component({\r\n selector: 'app-update-notifier',\r\n templateUrl: './update-notifier.component.html',\r\n styleUrls: ['./update-notifier.component.scss']\r\n})\r\nexport class UpdateNotifierComponent implements OnInit {\r\n techlifyUpdate: any;\r\n @Input() rootNavUrl: string = '/techlify-updates';\r\n\r\n constructor(\r\n private snackBar: MatSnackBar,\r\n private techlifyUpdateService: TechlifyUpdateService,\r\n private alertService: AlertService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n setTimeout(x => {\r\n this.getNewUpdate();\r\n }, 5000);\r\n }\r\n\r\n async getNewUpdate() {\r\n try {\r\n let result: any = await this.techlifyUpdateService.getNewUpdateForCurrentUser();\r\n this.techlifyUpdate = result.item;\r\n if (this.techlifyUpdate) {\r\n this.showUpdate();\r\n }\r\n }\r\n catch (error) {\r\n console.log(\"Current user updates failed\");\r\n }\r\n }\r\n\r\n showUpdate() {\r\n this.snackBar.openFromComponent(UpdateNotifierSnackComponent, {\r\n data: {\r\n techlifyUpdate: this.techlifyUpdate,\r\n rootNavUrl: this.rootNavUrl\r\n },\r\n horizontalPosition: 'right',\r\n verticalPosition: 'top',\r\n panelClass: ['white-bg']\r\n });\r\n }\r\n\r\n}\r\n","import { ActionPopupModule } from './../../action-popup/action-popup.module';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from './../../material.module';\r\nimport { UpdateViewModule } from './../update-view/update-view.module';\r\nimport { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { UpdateNotifierComponent } from './update-notifier.component';\r\nimport { UpdateNotifierSnackComponent } from './update-notifier-snack/update-notifier-snack.component';\r\n\r\n\r\n@NgModule({\r\n declarations: [UpdateNotifierComponent, UpdateNotifierSnackComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n UpdateViewModule,\r\n FlexLayoutModule,\r\n ActionPopupModule\r\n ],\r\n exports: [\r\n UpdateNotifierComponent,\r\n ],\r\n entryComponents: [\r\n UpdateNotifierSnackComponent\r\n ]\r\n})\r\nexport class UpdateNotifierModule { }\r\n","import { Component, OnInit, Input } from '@angular/core';\r\nimport * as XLSX from 'xlsx';\r\n\r\n@Component({\r\n selector: 'app-export-excel-button',\r\n templateUrl: './export-excel-button.component.html',\r\n styleUrls: ['./export-excel-button.component.scss']\r\n})\r\nexport class ExportExcelButtonComponent implements OnInit {\r\n\r\n @Input() name: string = 'Export_Data';\r\n @Input() data: any[] = [];\r\n\r\n constructor() { }\r\n\r\n ngOnInit(): void {\r\n }\r\n\r\n exportExcel() {\r\n const fileName = `${this.name}_${new Date().getTime()}.xlsx`;\r\n const ws = XLSX.utils.json_to_sheet(this.data);\r\n /* generate workbook and add the worksheet */\r\n const wb: XLSX.WorkBook = XLSX.utils.book_new();\r\n XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');\r\n\r\n /* save to file */\r\n XLSX.writeFile(wb, fileName);\r\n }\r\n\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ExportExcelButtonComponent } from './export-excel-button/export-excel-button.component';\r\nimport { MaterialModule } from '../material.module';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [ExportExcelButtonComponent],\r\n imports: [\r\n CommonModule,\r\n MaterialModule\r\n ],\r\n exports: [ExportExcelButtonComponent]\r\n})\r\nexport class ExportExcelModule { }\r\n","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { HttpService } from '../../core/http.service';\r\n\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-audit-log-view',\r\n templateUrl: './audit-log-view-model.component.html',\r\n styleUrls: ['./audit-log-view-model.component.scss']\r\n})\r\nexport class AuditLogViewModelComponent implements OnInit {\r\n\r\n logInfo: any;\r\n showDeltaChanges: boolean = false;\r\n changeList: any[] = [];\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<AuditLogViewModelComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n private http: HttpService\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n if (this.data) {\r\n this.http.get(`api/recent-log-for-model`, {\r\n params: {\r\n model_type: this.data?.modelType,\r\n model_id: this.data?.modelId\r\n }\r\n }).pipe(\r\n untilDestroyed(this)\r\n ).subscribe((result: any) => {\r\n this.logInfo = result?.item;\r\n this.getTransformedChanges();\r\n });\r\n }\r\n }\r\n\r\n getTransformedChanges() {\r\n const changes = ((this.logInfo?.action === 'deleted') ? Object.keys(this.logInfo?.object) : Object.keys(this.logInfo?.data?.changes)) || [];\r\n changes.forEach((key: any) => {\r\n const displayAttribute = (key as string).split('_').map(x => x.charAt(0).toUpperCase() + x.slice(1)).join(' ');\r\n this.changeList.push({ displayAttribute: displayAttribute, attribute: key, newValue: (this.logInfo?.action === 'deleted') ? '' : (this.logInfo?.object[key] ?? ''), oldValue: this.logInfo?.pre_object[key] ?? '' });\r\n });\r\n }\r\n\r\n close() {\r\n this.dialogRef.close();\r\n }\r\n\r\n}\r\n","import { Component, Inject, OnInit } from '@angular/core';\r\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { filter } from 'rxjs/operators';\r\nimport { AuditLogViewModelComponent } from '../audit-log-view-model/audit-log-view-model.component';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-audit-logs-view-model',\r\n templateUrl: './audit-logs-view-model.component.html',\r\n styleUrls: ['./audit-logs-view-model.component.scss']\r\n})\r\nexport class AuditLogsViewModelComponent implements OnInit {\r\n\r\n constructor(\r\n public dialogRef: MatDialogRef<AuditLogViewModelComponent>,\r\n @Inject(MAT_DIALOG_DATA) public data: any,\r\n private router: Router\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.router.events\r\n .pipe(filter(event => event instanceof NavigationEnd), untilDestroyed(this))\r\n .subscribe(_ => this.dialogRef.close());\r\n }\r\n\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { AuditLogViewModelComponent } from '../audit-log-view-model/audit-log-view-model.component';\r\nimport { AuditLogsViewModelComponent } from '../audit-logs-view-model/audit-logs-view-model.component';\r\n\r\n\r\n@Component({\r\n selector: 'app-audit-log-for-model',\r\n templateUrl: './audit-log-for-model.component.html',\r\n styleUrls: ['./audit-log-for-model.component.scss']\r\n})\r\nexport class AuditLogForModelComponent implements OnInit {\r\n\r\n @Input() modelType: string;\r\n @Input() modelId: any;\r\n @Input() logView: 'recent' | 'all' = 'recent';\r\n\r\n constructor(\r\n private dialog: MatDialog,\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n\r\n getLogView() {\r\n const dialogRef = this.dialog.open(AuditLogViewModelComponent, {\r\n width: '800px',\r\n autoFocus: false,\r\n data: {\r\n modelType: this.modelType,\r\n modelId: this.modelId\r\n } // Any data passed here will be injected into the model\r\n });\r\n }\r\n\r\n getLogsView() {\r\n const dialogRef = this.dialog.open(AuditLogsViewModelComponent, {\r\n width: '95%',\r\n maxWidth: 'unset',\r\n autoFocus: false,\r\n data: {\r\n modelType: this.modelType,\r\n modelId: this.modelId\r\n } // Any data passed here will be injected into the model\r\n });\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class AuditLogForModelRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class AuditLogViewModelRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { AuditLogViewModelRoutingModule } from './audit-log-view-model-routing.module';\r\nimport { AuditLogViewModelComponent } from './audit-log-view-model.component';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from '../../material.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [AuditLogViewModelComponent],\r\n imports: [\r\n CommonModule,\r\n AuditLogViewModelRoutingModule,\r\n FlexLayoutModule,\r\n MaterialModule\r\n ],\r\n exports: [AuditLogViewModelComponent]\r\n})\r\nexport class AuditLogViewModelModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class AuditLogsViewModelRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class AuditLogListRoutingModule { }\r\n","import { Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core';\r\n\r\n\r\nimport { Router } from '@angular/router';\r\nimport { MatSort } from '@angular/material/sort';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { PageEvent } from '../../data-table/data-table.model';\r\nimport { DataManager } from '../../core/dataManager.service';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-audit-log-list',\r\n templateUrl: './audit-log-list.component.html',\r\n styleUrls: ['./audit-log-list.component.scss'],\r\n})\r\nexport class AuditLogListComponent implements OnInit, OnDestroy {\r\n\r\n auditLogList: any[] = [];\r\n @Input() objectId: any;\r\n @Input() objectType: any;\r\n @Input() showFilter: boolean = true;\r\n @Input() showExportButtons: boolean = true;\r\n @Input() userId: any;\r\n\r\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n filters: any = { sort_by: 'created_at|desc' };\r\n displayedColumns: any[] = ['index', 'id', 'object_type', 'object_id', 'action', 'changes', 'created_at', 'user.email'];\r\n\r\n @ViewChild(MatSort, { static: true }) sort: MatSort;\r\n\r\n constructor(\r\n private dataManager: DataManager,\r\n private router: Router,\r\n public sanitizer: DomSanitizer\r\n ) { }\r\n\r\n ngOnInit() {\r\n\r\n this.initializeData();\r\n\r\n if (this.sort) {\r\n this.sort.sortChange.pipe(untilDestroyed(this))\r\n .subscribe((value: any) => {\r\n this.changeSort(value);\r\n })\r\n }\r\n\r\n }\r\n\r\n get excelData(): any[] {\r\n if (this.auditLogList.length > 0) {\r\n return this.auditLogList.map(item => {\r\n return {\r\n 'Type': item?.object_type,\r\n 'Action': item?.action,\r\n 'Data': JSON.stringify(item?.data || {}),\r\n 'Object': JSON.stringify(item?.object || {}),\r\n 'Pre-Object': JSON.stringify(item?.pre_object || {}),\r\n 'Created At': new Date(item?.created_at).toDateString(),\r\n 'Created By': item?.user?.email\r\n };\r\n });\r\n }\r\n return [];\r\n }\r\n\r\n changeSort(event: any) {\r\n if (event.direction) {\r\n this.filters.sort_by = `${event.active}|${event.direction}`;\r\n this.reload();\r\n }\r\n }\r\n\r\n logClicked(log: any) {\r\n this.router.navigate(['/system/audit-logs/log-view', log.id]);\r\n }\r\n\r\n\r\n async initializeData() {\r\n if (this.objectType) {\r\n this.filters = { ...this.filters, object_type: this.objectType }\r\n }\r\n if (this.objectId) {\r\n this.filters = { ...this.filters, object_id: this.objectId }\r\n }\r\n if (this.userId) {\r\n this.filters = { ...this.filters, user_id: this.userId }\r\n }\r\n const result = await this.dataManager.GET(`api/audit-logs`, { ...this.filters, ...this.pageEvent });\r\n this.auditLogList = this.auditLogList.concat(result.data);\r\n this.pageEvent.page = result.current_page;\r\n this.pageEvent.lastPage = result.last_page;\r\n }\r\n\r\n filterChange(event: any) {\r\n if (this.showFilter) {\r\n this.filters = {\r\n ...this.filters,\r\n ...event,\r\n object_type: this.objectType || event?.object_type || '',\r\n object_id: this.objectId || '',\r\n };\r\n this.reload();\r\n }\r\n }\r\n\r\n onScroll() {\r\n if (this.pageEvent.lastPage > this.pageEvent.page) {\r\n this.pageEvent.page += 1;\r\n this.initializeData();\r\n }\r\n }\r\n\r\n reload() {\r\n this.auditLogList = [];\r\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n this.initializeData();\r\n }\r\n\r\n getTransformedChanges(log: any) {\r\n if (log?.data?.changes) {\r\n const changes = Object.keys(log?.data?.changes) || [];\r\n let value = '<div>';\r\n changes.forEach((key: any) => {\r\n const displayAttribute = (key as string).split('_').map(x => x.charAt(0).toUpperCase() + x.slice(1)).join(' ');\r\n value = `${value} <div><b>${displayAttribute}:</b> <span id=\"old-value\">${log?.pre_object[key] ?? ''}</span><span id=\"new-value\">${log?.object[key] ?? ''}</span></div>`;\r\n });\r\n value = `${value} </div>`;\r\n return value;\r\n }\r\n return '';\r\n }\r\n\r\n ngOnDestroy() {\r\n // Needed for automatic unsubscribe with untilDestroyed\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class AuditLogListFilterRoutingModule { }\r\n","import { FormControl } from \"@angular/forms\";\r\n\r\nexport function DateValidator(): any {\r\n return (control: FormControl): { [key: string]: any } => {\r\n\r\n const val: any = new Date(control.value);\r\n if (!!control.value && val == 'Invalid Date') {\r\n return { invalidDate: true };\r\n }\r\n return null;\r\n };\r\n}","import { Component, OnInit, Output, EventEmitter, Input } from '@angular/core';\r\nimport { FormGroup, FormBuilder } from '@angular/forms';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { FormValidatorService } from '../../core/form-validator.service';\r\nimport { DateValidator } from '../../date-validator';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-audit-log-list-filter',\r\n templateUrl: './audit-log-list-filter.component.html',\r\n styleUrls: ['./audit-log-list-filter.component.scss']\r\n})\r\nexport class AuditLogListFilterComponent implements OnInit {\r\n\r\n auditLogFilterForm: FormGroup;\r\n\r\n @Input() objectId: any;\r\n @Input() objectType: any;\r\n\r\n @Output() valueChange = new EventEmitter();\r\n\r\n constructor(private fb: FormBuilder, private formValidatorService: FormValidatorService) {\r\n this.createForm();\r\n }\r\n\r\n get showObjectFilter() {\r\n return !(this.objectId || this.objectType);\r\n }\r\n\r\n private createForm() {\r\n\r\n //TODO: Finialize and add more validations.\r\n this.auditLogFilterForm = this.fb.group({\r\n object_type: [''],\r\n action: [''],\r\n data: [''],\r\n date_to: ['', DateValidator()],\r\n date_from: ['', DateValidator()]\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n\r\n this.auditLogFilterForm.valueChanges.pipe(\r\n debounceTime(500),\r\n distinctUntilChanged(),\r\n untilDestroyed(this)\r\n ).subscribe((value: any) => {\r\n value.date_from = value.date_from ? (value.date_from as Date).toISOString() : '';\r\n value.date_to = value.date_to ? (value.date_to as Date).toISOString() : '';\r\n this.valueChange.emit(value);\r\n })\r\n }\r\n\r\n\r\n resetFieldValue(field: string) {\r\n this.auditLogFilterForm.get(field).setValue('');\r\n }\r\n\r\n getFieldValue(field: string) {\r\n return this.auditLogFilterForm.get(field).value;\r\n }\r\n\r\n isFieldValid(field: string) {\r\n return this.formValidatorService.isFieldValid(field, this.auditLogFilterForm, true);\r\n }\r\n\r\n\r\n ngOnDestroy() {\r\n\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { AuditLogListFilterRoutingModule } from './audit-log-list-filter-routing.module';\r\nimport { AuditLogListFilterComponent } from './audit-log-list-filter.component';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MaterialModule } from '../../material.module';\r\nimport { SearchableSelectorModule } from '../../searchable-selector/searchable-selector.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [AuditLogListFilterComponent],\r\n imports: [\r\n CommonModule,\r\n AuditLogListFilterRoutingModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n MaterialModule,\r\n SearchableSelectorModule,\r\n ],\r\n exports: [AuditLogListFilterComponent]\r\n})\r\nexport class AuditLogListFilterModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { AuditLogListRoutingModule } from './audit-log-list-routing.module';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { AuditLogListComponent } from './audit-log-list.component';\r\nimport { AuditLogListFilterModule } from '../audit-log-list-filter/audit-log-list-filter.module';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { ExportExcelModule } from '../../export-excel/export-excel.module';\r\nimport { MaterialModule } from '../../material.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [AuditLogListComponent],\r\n imports: [\r\n CommonModule,\r\n AuditLogListRoutingModule,\r\n ExportExcelModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n MaterialModule,\r\n InfiniteScrollModule,\r\n AuditLogListFilterModule\r\n ],\r\n exports: [AuditLogListComponent]\r\n})\r\nexport class AuditLogListModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { AuditLogsViewModelRoutingModule } from './audit-logs-view-model-routing.module';\r\nimport { AuditLogsViewModelComponent } from './audit-logs-view-model.component';\r\nimport { AuditLogListModule } from '../audit-log-list/audit-log-list.module';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\n\r\n\r\n@NgModule({\r\n declarations: [AuditLogsViewModelComponent],\r\n imports: [\r\n CommonModule,\r\n AuditLogsViewModelRoutingModule,\r\n FlexLayoutModule,\r\n AuditLogListModule\r\n ],\r\n exports: [AuditLogsViewModelComponent]\r\n})\r\nexport class AuditLogsViewModelModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { AuditLogForModelRoutingModule } from './audit-log-for-model-routing.module';\r\nimport { AuditLogForModelComponent } from './audit-log-for-model.component';\r\nimport { AuditLogViewModelModule } from '../audit-log-view-model/audit-log-view-model.module';\r\nimport { AuditLogsViewModelModule } from '../audit-logs-view-model/audit-logs-view-model.module';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from '../../material.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [AuditLogForModelComponent],\r\n imports: [\r\n AuditLogViewModelModule,\r\n AuditLogsViewModelModule,\r\n CommonModule,\r\n AuditLogForModelRoutingModule,\r\n FlexLayoutModule,\r\n MaterialModule,\r\n ],\r\n exports: [AuditLogForModelComponent]\r\n})\r\nexport class AuditLogForModelModule { }\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { Location } from '@angular/common';\r\nimport * as jsondiffpatch from \"jsondiffpatch\"\r\nimport { DataManager } from '../../core/dataManager.service';\r\n\r\n@Component({\r\n selector: 'app-audit-log-view',\r\n templateUrl: './audit-log-view.component.html',\r\n styleUrls: ['./audit-log-view.component.scss']\r\n})\r\nexport class AuditLogViewComponent implements OnInit {\r\n\r\n logInfo: any;\r\n showDeltaChanges: boolean = false;\r\n changeList: any[] = [];\r\n\r\n constructor(\r\n private dataManager: DataManager,\r\n private route: ActivatedRoute,\r\n private location: Location\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.route.paramMap.subscribe(params => {\r\n if (params.get('id')) {\r\n this.fetchLogDetail(params.get('id'));\r\n } else {\r\n this.location.back();\r\n }\r\n });\r\n }\r\n\r\n getTransformedChanges() {\r\n const changes = ((this.logInfo?.action === 'deleted') ? Object.keys(this.logInfo?.object) : Object.keys(this.logInfo?.data?.changes)) || [];\r\n changes.forEach((key: any) => {\r\n const displayAttribute = (key as string).split('_').map(x => x.charAt(0).toUpperCase() + x.slice(1)).join(' ');\r\n this.changeList.push({ displayAttribute: displayAttribute, attribute: key, newValue: (this.logInfo?.action === 'deleted') ? '' : (this.logInfo?.object[key] ?? ''), oldValue: this.logInfo?.pre_object[key] ?? '' });\r\n });\r\n }\r\n\r\n async fetchLogDetail(logId: any) {\r\n const result = await this.dataManager.GET(`api/audit-logs/${logId}`);\r\n this.logInfo = result.item;\r\n this.getTransformedChanges();\r\n this.patchDelta();\r\n }\r\n\r\n patchDelta() {\r\n const delta = jsondiffpatch.diff(this.logInfo?.pre_object, this.logInfo?.object);\r\n document.getElementById('jsondiff').innerHTML = jsondiffpatch.formatters.html.format(delta, this.logInfo?.pre_object);\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\n\r\nconst routes: Routes = [];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class AuditLogViewRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { AuditLogViewRoutingModule } from './audit-log-view-routing.module';\r\nimport { AuditLogViewComponent } from './audit-log-view.component';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { MaterialModule } from '../../material.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [AuditLogViewComponent],\r\n imports: [\r\n CommonModule,\r\n AuditLogViewRoutingModule,\r\n FlexLayoutModule,\r\n MaterialModule\r\n ],\r\n exports: [AuditLogViewComponent]\r\n})\r\nexport class AuditLogViewModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { AuthenticationGuard } from '../core/authentication.guard';\r\nimport { AuditLogListComponent } from './audit-log-list/audit-log-list.component';\r\nimport { AuditLogViewComponent } from './audit-log-view/audit-log-view.component';\r\n\r\n\r\nconst routes: Routes = [\r\n { path: 'log-list', component: AuditLogListComponent, canActivate: [AuthenticationGuard] },\r\n { path: 'log-view/:id', component: AuditLogViewComponent, canActivate: [AuthenticationGuard] },\r\n { path: '**', redirectTo: 'log-list', pathMatch: 'full' }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class AuditLogRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { AuditLogRoutingModule } from './audit-log-routing.module';\r\nimport { AuditLogListModule } from './audit-log-list/audit-log-list.module';\r\nimport { AuditLogViewModule } from './audit-log-view/audit-log-view.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n ],\r\n imports: [\r\n CommonModule,\r\n AuditLogRoutingModule,\r\n AuditLogListModule,\r\n AuditLogViewModule\r\n ],\r\n exports: []\r\n})\r\nexport class AuditLogModule { }\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { ImportCsvConfig } from '../import-csv-config';\r\n\r\n@Component({\r\n selector: 'app-import-success',\r\n templateUrl: './import-success.component.html',\r\n styleUrls: ['./import-success.component.scss']\r\n})\r\nexport class ImportSuccessComponent implements OnInit {\r\n @Input() data: any;\r\n @Input() config: ImportCsvConfig;\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","import { ErrorHandlerService } from './../../core/error-handler.service';\r\nimport { PageEvent } from './../../data-table/data-table.model';\r\nimport { Component, Input, OnInit } from '@angular/core';\r\nimport { ImportCsvConfig } from '../import-csv-config';\r\nimport { HttpService } from '../../core/http.service';\r\n\r\n@Component({\r\n selector: 'app-import-history-list',\r\n templateUrl: './import-history-list.component.html',\r\n styleUrls: ['./import-history-list.component.scss']\r\n})\r\nexport class ImportHistoryListComponent implements OnInit {\r\n\r\n @Input() config: ImportCsvConfig;\r\n histories: any[] = [];\r\n displayedColumns: string[] = [\r\n 'index',\r\n 'imported_by',\r\n 'date',\r\n 'no_of_records'\r\n ];\r\n isWorking: boolean = false;\r\n filter: any;\r\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n\r\n constructor(\r\n private errorHandler: ErrorHandlerService,\r\n private http: HttpService,\r\n ) {\r\n }\r\n\r\n ngOnInit() {\r\n if (this.config.importHistory.isEnabled) {\r\n this.filter = {\r\n model_type: this.config.importHistory.type,\r\n };\r\n }\r\n this.loadData();\r\n }\r\n\r\n loadData() {\r\n try {\r\n this.isWorking = true;\r\n this.http.get(this.config.importHistory.apiUrl, { params: { ...this.filter, ...this.pageEvent } }).subscribe((result: any) => {\r\n this.histories = this.histories.concat(result.data);\r\n this.pageEvent.page = result.current_page;\r\n this.pageEvent.lastPage = result.last_page;\r\n });\r\n } catch (error) {\r\n this.errorHandler.handleError(error);\r\n }\r\n finally {\r\n this.isWorking = false;\r\n }\r\n }\r\n\r\n onScroll() {\r\n if (this.pageEvent.lastPage > this.pageEvent.page) {\r\n this.pageEvent.page += 1;\r\n this.loadData();\r\n }\r\n }\r\n\r\n reload() {\r\n this.histories = [];\r\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n this.loadData();\r\n }\r\n\r\n ngOnDestroy() {\r\n //Until destroyed uses it\r\n }\r\n\r\n}\r\n","import { FormValidatorService } from '../../core/form-validator.service';\r\nimport { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\r\nimport { Location } from '@angular/common';\r\nimport { ImportCsvConfig } from '../import-csv-config';\r\n\r\nconst errorMessages: any = {\r\n property: {\r\n required: \"Property is required\",\r\n unavailable: \"Duplicate entry\"\r\n },\r\n};\r\n\r\n@Component({\r\n selector: 'app-field-mapping',\r\n templateUrl: './field-mapping.component.html',\r\n styleUrls: ['./field-mapping.component.scss']\r\n})\r\nexport class FieldMappingComponent implements OnInit {\r\n\r\n importMappingForm: FormGroup;\r\n @Input() data: any[];\r\n @Input() config: ImportCsvConfig;\r\n firstDataArray: any[] = [];\r\n properties: any[] = [];\r\n @Output() onSave = new EventEmitter();\r\n @Output() onReUpload= new EventEmitter();\r\n\r\n constructor(\r\n private fb: FormBuilder,\r\n private formValidatorService: FormValidatorService,\r\n private changeDetectorRef: ChangeDetectorRef,\r\n public location: Location\r\n ) {\r\n this.createImportMappingForm();\r\n }\r\n\r\n ngOnInit() {\r\n this.properties = this.config.properties;;\r\n this.reFectorAttributes(this.data[0]);\r\n }\r\n\r\n createImportMappingForm() {\r\n this.importMappingForm = this.fb.group({\r\n fields: this.fb.array([]),\r\n });\r\n }\r\n\r\n get fieldsArray(): FormArray {\r\n return this.importMappingForm.get('fields') as FormArray;\r\n }\r\n\r\n createField(field: any): FormGroup {\r\n var fieldForm: FormGroup = this.fb.group({\r\n id: new FormControl(field.id),\r\n label: new FormControl(field.label),\r\n value: new FormControl(field.value),\r\n property: new FormControl(field.property,\r\n Validators.compose(\r\n [\r\n Validators.required\r\n ]\r\n )\r\n ),\r\n propertyType: new FormControl(field.propertyType)\r\n });\r\n return fieldForm;\r\n }\r\n\r\n reFectorAttributes(data) {\r\n for (var k in data) {\r\n if (data.hasOwnProperty(k)) {\r\n var dataValue = {\r\n id: '',\r\n label: k,\r\n value: data[k],\r\n property: '',\r\n propertyType: ''\r\n };\r\n this.firstDataArray.push(dataValue);\r\n }\r\n }\r\n this.firstDataArray.forEach((element: any, mainIndex: any) => {\r\n element.id = mainIndex;\r\n this.properties.find((property: any, index: any) => {\r\n if (property.label.toLowerCase().includes(element.label.toLowerCase())) {\r\n element.property = property.value;\r\n element.propertyType = property.type;\r\n return element;\r\n }\r\n });\r\n });\r\n }\r\n\r\n next() {\r\n this.importMappingForm.markAllAsTouched();\r\n if (!this.importMappingForm.valid) {\r\n return;\r\n }\r\n this.onSave.emit(this.importMappingForm.value);\r\n }\r\n\r\n /** Method to evaluate form fields*/\r\n isFieldValid(field: string, form: any) {\r\n return this.formValidatorService.isFieldValid(field, form);\r\n }\r\n\r\n /** Method to find error in form fields*/\r\n getErrorMessage(field: string, form: any) {\r\n return this.formValidatorService.getErrorMessage(field, form, errorMessages);\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n //Called after ngAfterContentInit when the component's view has been initialized. Applies to components only.\r\n //Add 'implements AfterViewInit' to the class.\r\n setTimeout(x => {\r\n this.firstDataArray.forEach((element: any) => {\r\n this.fieldsArray.push(this.createField(element));\r\n });\r\n this.changeDetectorRef.detectChanges();\r\n }, 500);\r\n }\r\n\r\n updatePropertyType(event: any, index: any): void {\r\n var field = this.properties.find((field: any) => field.value == event.value);\r\n if (field) {\r\n this.fieldsArray.controls[index].get('propertyType').setValue(field.type);\r\n this.uniqueValidator();\r\n }\r\n }\r\n\r\n uniqueValidator() {\r\n this.fieldsArray.value.forEach((field: any, index: any) => {\r\n var control = this.fieldsArray.controls[index].get('property');\r\n const isNameUnique = this.fieldsArray.value.find(propertyData =>\r\n propertyData.property === control.value\r\n && propertyData.id != this.fieldsArray.controls[index].get('id').value\r\n )\r\n ? false\r\n : true;\r\n if (!isNameUnique) {\r\n control.setErrors({ unavailable: true });\r\n }\r\n else {\r\n control.setErrors(null);\r\n }\r\n });\r\n }\r\n\r\n removeField(index: number) {\r\n if (index == -1) {\r\n return;\r\n }\r\n this.fieldsArray.removeAt(index);\r\n }\r\n\r\n reUpload() {\r\n this.onReUpload.emit(true);\r\n }\r\n\r\n}\r\n","import { Location } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-failed-items-list',\r\n templateUrl: './failed-items-list.component.html',\r\n styleUrls: ['./failed-items-list.component.scss']\r\n})\r\nexport class FailedItemsListComponent implements OnInit {\r\n @Input() failedItems: any[];\r\n @Input() selectedFields: any[];\r\n @Output() onReUpload = new EventEmitter();\r\n\r\n constructor(\r\n public location: Location\r\n ) { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n isValidDate(d: any): boolean {\r\n var date = new Date(d);\r\n return date instanceof Date && !isNaN(date.getTime());\r\n }\r\n\r\n reUpload() {\r\n this.onReUpload.emit(true);\r\n }\r\n\r\n}\r\n","import { ViewerConfig } from '../document-viewer/viewer-config.model';\r\nimport { FileDropperConfig } from '../file-dropper/file-dropper.model';\r\nimport { HttpService } from '../core/http.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { Component, Input, OnInit } from '@angular/core';\r\nimport { AlertService } from '../core/alert.service';\r\nimport { ErrorHandlerService } from '../core/error-handler.service';\r\nimport * as XLSX from 'xlsx';\r\nimport { ImportCsvConfig } from './import-csv-config';\r\n@UntilDestroy()\r\n\r\n@Component({\r\n selector: 'app-import-csv',\r\n templateUrl: './import-csv.component.html',\r\n styleUrls: ['./import-csv.component.scss']\r\n})\r\nexport class ImportCsvComponent implements OnInit {\r\n result: any;\r\n @Input() config: ImportCsvConfig;\r\n filesConfig: FileDropperConfig;\r\n filesList: any[] = [];\r\n data: any[] = [];\r\n isUploaded: boolean = false;\r\n isImportTypeSelected: boolean = false;\r\n viewerConfig: ViewerConfig;\r\n fileData: any[] = [];\r\n failedItems: any[] = [];\r\n selectedFields: any[] = [];\r\n importSteps: any = [\r\n {\r\n id: 1,\r\n step: 1,\r\n title: 'Upload',\r\n progressTitle: '',\r\n progressDescription: ''\r\n },\r\n {\r\n id: 2,\r\n step: 2,\r\n title: 'Field Mappings',\r\n progressTitle: '',\r\n progressDescription: ''\r\n },\r\n {\r\n id: 3,\r\n step: 3,\r\n title: 'Data Validation',\r\n progressTitle: 'Data Being Validated',\r\n progressDescription: 'The data is currently being validated and checked for errors, please do not navigate away from this page. '\r\n },\r\n {\r\n id: 4,\r\n step: 3,\r\n title: 'Data Validation & Errors',\r\n progressTitle: '',\r\n progressDescription: ''\r\n },\r\n {\r\n id: 5,\r\n step: 4,\r\n title: 'Data Importing',\r\n progressTitle: 'Data Being Imported',\r\n progressDescription: 'The data is currently being imported and saved, please do not navigate away from this page. After the import is completed, you will be redirected to a page with the imported records.'\r\n },\r\n {\r\n id: 6,\r\n step: 5,\r\n title: 'Success Page & Data Preview',\r\n progressTitle: '',\r\n progressDescription: ''\r\n },\r\n ];\r\n currentStep: any = 1;\r\n\r\n constructor(\r\n private alertService: AlertService,\r\n private errorHandler: ErrorHandlerService,\r\n private http: HttpService,\r\n ) {\r\n this.filesConfig = {\r\n fileId: \"file\",\r\n containerId: \"fileContainer\",\r\n styles: {\r\n height: \"200px\"\r\n },\r\n acceptFile: '.csv',\r\n multiple: false,\r\n maxSize: 10,\r\n acceptFileText: \".csv\"\r\n };\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n get step() {\r\n return this.importSteps.find(step => step.id == this.currentStep);\r\n }\r\n\r\n async fileChanged(event: any) {\r\n this.currentStep = 2;\r\n this.filesList = event;\r\n\r\n let selectedFile = null;\r\n let jsonData = null;\r\n const reader = new FileReader();\r\n const file = this.filesList[0];\r\n reader.onload = (event) => {\r\n const data = reader.result;\r\n selectedFile = XLSX.read(data, {\r\n type: 'binary',\r\n cellDates: true,\r\n });\r\n jsonData = selectedFile.SheetNames.reduce((initial, name) => {\r\n const sheet = selectedFile.Sheets[name];\r\n initial = XLSX.utils.sheet_to_json(sheet, {\r\n header: 0,\r\n defval: \"\",\r\n });\r\n return initial;\r\n }, {});\r\n this.fileData = jsonData;\r\n }\r\n reader.readAsBinaryString(file);\r\n return;\r\n }\r\n\r\n mappingProcessed(event: any) {\r\n this.currentStep = 3;\r\n setTimeout(x => {\r\n this.selectedFields = event.fields;\r\n const tempFileData = JSON.parse(JSON.stringify(this.fileData));\r\n tempFileData.forEach(data => {\r\n for (var key in data) {\r\n var field = event.fields.find((field: any) => field.label == key);\r\n if (field) {\r\n if ((field.propertyType == 'date' || field.propertyType == 'dateTime') && this.isValidDate(new Date(data[field.label]))) {\r\n data[field.property] = (new Date(data[field.label]) as Date).toISOString();\r\n }\r\n else {\r\n data[field.property] = data[field.label];\r\n }\r\n delete data[key];\r\n }\r\n else {\r\n delete data[key];\r\n }\r\n }\r\n });\r\n this.save(tempFileData);\r\n }, 2000);\r\n }\r\n\r\n async save(tempFileData: any) {\r\n try {\r\n this.http.post(this.config.apiUrl, { data: tempFileData })\r\n .pipe(\r\n untilDestroyed(this)\r\n ).subscribe((result: any) => {\r\n\r\n this.failedItems = result.failed_items;\r\n if (this.failedItems.length) {\r\n this.alertService.addAlert(result.msg, 'warn');\r\n }\r\n if (!(this.failedItems.length > 0)) {\r\n this.currentStep = 5;\r\n setTimeout(x => {\r\n this.currentStep = 6;\r\n this.result = result;\r\n }, 2000);\r\n }\r\n else {\r\n this.currentStep = 4;\r\n }\r\n });\r\n } catch (error) {\r\n if ((error.status === 422 || error.status === 400) && error.msg) {\r\n this.alertService.addAlert(error.msg, \"warning\");\r\n }\r\n this.errorHandler.handleError(error);\r\n this.reUpload();\r\n }\r\n }\r\n\r\n isValidDate(d: any) {\r\n return d instanceof Date && !isNaN(d.getTime());\r\n }\r\n\r\n reUpload() {\r\n this.data = [];\r\n this.fileData = [];\r\n this.filesList = [];\r\n this.failedItems = [];\r\n this.selectedFields = [];\r\n this.currentStep = 1;\r\n }\r\n\r\n}\r\n","import { Component, Input, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-data-import',\r\n templateUrl: './data-import.component.html',\r\n styleUrls: ['./data-import.component.scss']\r\n})\r\nexport class DataImportComponent implements OnInit {\r\n @Input() step: any;\r\n\r\n constructor() { }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n}\r\n","import { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { DocumentViewerModule } from './../document-viewer/document-viewer.module';\r\nimport { FileDropperModule } from './../file-dropper/file-dropper.module';\r\nimport { MaterialModule } from './../material.module';\r\nimport { ImportSuccessComponent } from './import-success/import-success.component';\r\nimport { ImportHistoryListComponent } from './import-history-list/import-history-list.component';\r\nimport { FieldMappingComponent } from './field-mapping/field-mapping.component';\r\nimport { FailedItemsListComponent } from './failed-items-list/failed-items-list.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ImportCsvComponent } from './import-csv.component';\r\nimport { RouterModule } from '@angular/router';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { DataImportComponent } from './data-import/data-import.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n FlexLayoutModule,\r\n RouterModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n FileDropperModule,\r\n DocumentViewerModule,\r\n InfiniteScrollModule\r\n ],\r\n declarations: [\r\n ImportCsvComponent,\r\n FieldMappingComponent,\r\n FailedItemsListComponent,\r\n ImportHistoryListComponent,\r\n ImportSuccessComponent,\r\n DataImportComponent\r\n ],\r\n providers: [],\r\n exports: [\r\n ImportCsvComponent\r\n ],\r\n})\r\nexport class ImportCsvModule { }\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\nimport { PageEvent } from '../data-table/data-table.model';\r\nimport { HttpService } from '../core/http.service';\r\nimport { TimelineValue } from '../timeline-filter';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-login-history-for-user',\r\n templateUrl: './login-history-for-user.component.html',\r\n styleUrls: ['./login-history-for-user.component.scss']\r\n})\r\nexport class LoginHistoryForUserComponent implements OnInit {\r\n\r\n loginHistoryList: any[] = [];\r\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n filters: any = {\r\n sort_by: 'created_at|desc',\r\n };\r\n historyFilterForm: FormGroup;\r\n displayedColumns: any[] = ['index', 'created_at'];\r\n @Input() userId: any;\r\n\r\n constructor(\r\n private http: HttpService,\r\n private fb: FormBuilder,\r\n ) {\r\n this.historyFilterForm = this.fb.group({\r\n 'duration': [''],\r\n 'date_from': [''],\r\n 'date_to': ['']\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.filters.user_id = this.userId;\r\n this.historyFilterForm.valueChanges\r\n .pipe(debounceTime(500), distinctUntilChanged(), untilDestroyed(this))\r\n .subscribe((value: any) => {\r\n value.date_from = value.date_from ? (value.date_from as Date).toISOString() : '';\r\n value.date_to = value.date_to ? (value.date_to as Date).toISOString() : '';\r\n this.filterChange(value);\r\n });\r\n this.initializeData();\r\n }\r\n\r\n onTimelineChange(range: TimelineValue) {\r\n let date_from = range?.date_from ? new Date(range.date_from) : '';\r\n let date_to = range?.date_to ? new Date(range.date_to) : '';\r\n this.historyFilterForm.patchValue({\r\n date_from,\r\n date_to\r\n });\r\n }\r\n\r\n initializeData() {\r\n this.http.get(`api/user-login-history`, { params: { ...this.filters, ...this.pageEvent } })\r\n .pipe(untilDestroyed(this))\r\n .subscribe((result: any) => {\r\n this.loginHistoryList = this.loginHistoryList.concat(result.data);\r\n this.pageEvent.page = result.current_page;\r\n this.pageEvent.lastPage = result.last_page;\r\n });\r\n }\r\n\r\n filterChange(event: any) {\r\n this.filters = {\r\n ...this.filters,\r\n ...event\r\n };\r\n this.reload();\r\n }\r\n\r\n onScroll() {\r\n if (this.pageEvent.lastPage > this.pageEvent.page) {\r\n this.pageEvent.page += 1;\r\n this.initializeData();\r\n }\r\n }\r\n\r\n\r\n reload() {\r\n this.loginHistoryList = [];\r\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\r\n this.initializeData();\r\n }\r\n\r\n ngOnDestroy() {\r\n //Until destroyed uses it\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { AuthenticationGuard } from '../core/authentication.guard';\r\nimport { LoginHistoryForUserComponent } from './login-history-for-user.component';\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n component: LoginHistoryForUserComponent,\r\n canActivate: [AuthenticationGuard]\r\n },\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class LoginHistoryForUserRoutingModule { }\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\nimport { LoginHistoryForUserRoutingModule } from './login-history-for-user-routing.module';\r\nimport { LoginHistoryForUserComponent } from './login-history-for-user.component';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MaterialModule } from '../material.module';\r\nimport { TimelineFilterModule } from '../timeline-filter/timeline-filter.module';\r\n\r\n\r\n@NgModule({\r\n declarations: [LoginHistoryForUserComponent],\r\n imports: [\r\n CommonModule,\r\n LoginHistoryForUserRoutingModule,\r\n InfiniteScrollModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n ReactiveFormsModule,\r\n TimelineFilterModule\r\n ],\r\n exports: [LoginHistoryForUserComponent]\r\n})\r\nexport class LoginHistoryForUserModule { }\r\n","import { COMMA, ENTER } from '@angular/cdk/keycodes';\r\n\r\nexport class TechlifyTaggerTagFormConfigModel {\r\n selectable: boolean;\r\n removable: boolean;\r\n separatorKeysCodes: number[];\r\n placeholder: string;\r\n apiUrl: string;\r\n isCreateable: boolean;\r\n createApiUrl: string;\r\n isCacheTags: boolean;\r\n isSingle: boolean;\r\n\r\n constructor() {\r\n this.selectable = true;\r\n this.removable = true;\r\n this.separatorKeysCodes = [ENTER, COMMA];\r\n this.placeholder = 'New Tag..';\r\n this.apiUrl = 'api/techlify-tagger-tags';\r\n this.createApiUrl = 'api/techlify-tagger-tags';\r\n this.isCreateable = true;\r\n this.isCacheTags = false;\r\n this.isSingle = false;\r\n }\r\n}","import { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { Component, ElementRef, ViewChild, OnInit, Input, OnDestroy, Inject, Optional, Self, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, NgControl } from '@angular/forms';\r\nimport { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\r\nimport { MatChipInputEvent } from '@angular/material/chips';\r\nimport { MatFormField, MatFormFieldControl, MAT_FORM_FIELD } from '@angular/material/form-field';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\nimport { HttpService } from '../core/http.service';\r\nimport { TechlifyTaggerTagFormConfigModel } from './techlify-tagger-tag-form-config.model';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-techlify-tagger-tag-form-field',\r\n templateUrl: './techlify-tagger-tag-form-field.component.html',\r\n styleUrls: ['./techlify-tagger-tag-form-field.component.scss'],\r\n providers: [{ provide: MatFormFieldControl, useExisting: TechlifyTaggerTagFormFieldComponent }],\r\n})\r\nexport class TechlifyTaggerTagFormFieldComponent implements OnInit, ControlValueAccessor, MatFormFieldControl<any>, OnDestroy, OnChanges {\r\n\r\n static nextId = 0;\r\n stateChanges = new Subject<void>();\r\n focused = false;\r\n controlType = 'techlify-tagger-form-field';\r\n id = `techlify-tagger-form-field-${TechlifyTaggerTagFormFieldComponent.nextId++}`;\r\n\r\n onChange = (_: any) => { };\r\n onTouched = () => { };\r\n\r\n tagInputCtrl = new FormControl();\r\n filterString: any;\r\n @ViewChild('tagInput') tagInput: ElementRef<HTMLInputElement>;\r\n\r\n /**Pass the configuration for Techlify Tagger */\r\n @Input() config: TechlifyTaggerTagFormConfigModel = new TechlifyTaggerTagFormConfigModel();\r\n /**Pass the Model Type for Techlify Tagger, Required */\r\n @Input() modelType!: string;\r\n /**Pass the Model ID for Techlify Tagger */\r\n @Input() modelId: string;\r\n\r\n /**Pass the default list of tags */\r\n private _allTags: any[] = [];\r\n @Input()\r\n get allTags() {\r\n return this._allTags;\r\n }\r\n set allTags(value) {\r\n this._allTags = value;\r\n }\r\n\r\n /**Pass the Categories to filter for a model */\r\n @Input() categories: string[] = [];\r\n /**Pass default category to be used for assigning the tags, when we filter by more than one category */\r\n @Input() defaultCreateCategory: string;\r\n\r\n get tags() {\r\n return this.allTags.filter(x => this.value.some(y => y == x.id));\r\n }\r\n\r\n //Default Getter and Setters for a Form Field Implementation\r\n get empty() {\r\n return this.value.length == 0;\r\n }\r\n\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty || this.tagInputCtrl.value;\r\n }\r\n\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n private _required = false;\r\n\r\n @Input()\r\n get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n set disabled(value: boolean) {\r\n this._disabled = coerceBooleanProperty(value);\r\n this._disabled ? this.tagInputCtrl.disable() : this.tagInputCtrl.enable();\r\n this.stateChanges.next();\r\n }\r\n private _disabled = false;\r\n\r\n\r\n private _value: any[] = [];\r\n @Input()\r\n get value(): any[] {\r\n return this._value;\r\n }\r\n set value(tagIds: any[]) {\r\n this._value = tagIds || [];\r\n this.stateChanges.next();\r\n }\r\n\r\n get errorState(): boolean {\r\n return this.tagInputCtrl.dirty && this.required && (this.value.length == 0);\r\n }\r\n\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n private _placeholder: string;\r\n\r\n\r\n ngOnInit(): void {\r\n\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n\r\n //API to load all tags for the model type\r\n if (this.allTags.length == 0) {\r\n this.httpService\r\n .cache(!this.config.isCacheTags)\r\n .get(this.config.apiUrl, {\r\n params: {\r\n categories: this.categories.join(','),\r\n perPage: '1000'\r\n }\r\n }).pipe(\r\n debounceTime(500),\r\n untilDestroyed(this)\r\n ).subscribe((result: any) => {\r\n this.allTags = result.data;\r\n });\r\n }\r\n\r\n //API to load only the selected tags for the model\r\n if (this.modelId && this.value.length == 0) {\r\n //Model Id is passed and no tags are present, so we query db for the avilable tags for the model ID.\r\n this.httpService\r\n .cache(!this.config.isCacheTags)\r\n .get(this.config.apiUrl, {\r\n params: {\r\n categories: this.categories.join(','),\r\n model_type: this.modelType,\r\n model_id: this.modelId,\r\n perPage: '1000'\r\n }\r\n }).pipe(\r\n debounceTime(500),\r\n untilDestroyed(this)\r\n ).subscribe((result: any) => {\r\n this.value = (result?.data || []).map((x: any) => x.id);\r\n this._handleInput();\r\n });\r\n }\r\n }\r\n\r\n init() {\r\n if (this.modelId && this.allTags.length == 0) {\r\n //Model Id is passed and no tags are passed, so we query db for the avilable tags for the model ID.\r\n this.httpService\r\n .cache(!this.config.isCacheTags)\r\n .get(this.config.apiUrl, {\r\n params: {\r\n categories: this.categories.join(','),\r\n model_type: this.modelType,\r\n model_id: this.modelId\r\n }\r\n }).pipe(\r\n untilDestroyed(this)\r\n ).subscribe((result: any) => {\r\n this.allTags = result.data;\r\n });\r\n }\r\n }\r\n\r\n get filteredTags(): any[] {\r\n return this._filter();\r\n }\r\n\r\n constructor(\r\n private _focusMonitor: FocusMonitor,\r\n private _elementRef: ElementRef<HTMLElement>,\r\n private httpService: HttpService,\r\n @Optional() @Inject(MAT_FORM_FIELD) public _formField: MatFormField,\r\n @Optional() @Self() public ngControl: NgControl) {\r\n\r\n this.tagInputCtrl.valueChanges\r\n .subscribe(filterValue => {\r\n this.filterString = filterValue;\r\n });\r\n\r\n //Set Focus Monitor\r\n _focusMonitor.monitor(_elementRef, true).subscribe(origin => {\r\n if (this.focused && !origin) {\r\n this.onTouched();\r\n }\r\n this.focused = !!origin;\r\n this.stateChanges.next();\r\n });\r\n\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n setDescribedByIds(ids: string[]) {\r\n // Just a empty implementation for Mat Form Field Interface\r\n }\r\n\r\n onContainerClick() {\r\n // Just a empty implementation for Mat Form Field Interface\r\n }\r\n\r\n\r\n async add(event: MatChipInputEvent) {\r\n const value = (event.value || '').trim();\r\n // Add our tag\r\n // Validate for single mode\r\n if (!this.config.isSingle || (this.value.length === 0)) {\r\n if (value && this.config.isCreateable) {\r\n const tags = this.allTags;\r\n let tag = tags.find((item: any) => item.title.toLowerCase() == value.toLowerCase());\r\n if (!tag) {\r\n //No tag present in the list\r\n try {\r\n const result: any = await this.httpService.post(this.config.createApiUrl, {\r\n title: value,\r\n description: value,\r\n category_title: (this.categories.length > 0) ? (this.defaultCreateCategory ? this.defaultCreateCategory : this.categories[0]) : ''\r\n }).toPromise();\r\n tag = result.item;\r\n } catch (error) {\r\n return;\r\n }\r\n this.allTags.push(tag);\r\n } else {\r\n //Optionally clean the existing value, to avoid duplicate\r\n this.remove(tag);\r\n }\r\n this.value.push(tag.id);\r\n this._handleInput();\r\n }\r\n }\r\n\r\n // Clear the input value\r\n event.input.value = '';\r\n\r\n this.tagInputCtrl.setValue(null);\r\n }\r\n\r\n remove(tag: any): void {\r\n this.value = this.value.filter(x => x !== tag.id);\r\n this._handleInput();\r\n }\r\n\r\n selected(event: MatAutocompleteSelectedEvent): void {\r\n // Validate for single mode\r\n if (!this.config.isSingle || (this.value.length === 0)) {\r\n //Clean the existing value, to avoid duplicate\r\n this.remove({ id: event.option.value });\r\n this.value.push(event.option.value);\r\n this._handleInput();\r\n }\r\n this.tagInput.nativeElement.value = '';\r\n this.tagInputCtrl.setValue(null);\r\n }\r\n\r\n private _filter(): any[] {\r\n const filterValue = this.filterString ? this.filterString.toString().toLowerCase() : null;\r\n const availableTags = this.allTags.filter((tag: any) => !this.value.some((item: any) => item == tag.id));\r\n return filterValue ? availableTags.filter((tag: any) => tag.title.toLowerCase().includes(filterValue)) : availableTags;\r\n }\r\n\r\n writeValue(tagIds: any[]): void {\r\n this.value = tagIds || [];\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n _handleInput(): void {\r\n this.onChange(this.value);\r\n }\r\n\r\n static ngAcceptInputType_disabled: BooleanInput;\r\n static ngAcceptInputType_required: BooleanInput;\r\n\r\n ngOnDestroy() {\r\n this.stateChanges.complete();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TechlifyTaggerTagFormFieldComponent } from './techlify-tagger-tag-form-field.component';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MaterialModule } from '../material.module';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n TechlifyTaggerTagFormFieldComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n MatAutocompleteModule,\r\n ReactiveFormsModule\r\n ],\r\n exports: [TechlifyTaggerTagFormFieldComponent]\r\n})\r\nexport class TechlifyTaggerTagFormFieldModule { }\r\n","import { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { Component, ElementRef, OnInit, Input, OnDestroy, Inject, Optional, Self } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, NgControl } from '@angular/forms';\r\nimport { MatFormField, MatFormFieldControl, MAT_FORM_FIELD } from '@angular/material/form-field';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\nimport { HttpService } from '../core/http.service';\r\n\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-techlify-tagger-tag-selector',\r\n templateUrl: './techlify-tagger-tag-selector.component.html',\r\n styleUrls: ['./techlify-tagger-tag-selector.component.scss'],\r\n providers: [{ provide: MatFormFieldControl, useExisting: TechlifyTaggerTagSelectorComponent }],\r\n})\r\nexport class TechlifyTaggerTagSelectorComponent implements OnInit, ControlValueAccessor, MatFormFieldControl<any>, OnDestroy {\r\n\r\n /**Pass the Categories to filter for a model */\r\n @Input() categories: string[] = [];\r\n @Input() multiple: boolean = false;\r\n @Input() enableSearch: boolean = true;\r\n tagSelectorCtrl = new FormControl();\r\n @Input() showAllTags: boolean = false;\r\n @Input() useSelectButtonStyle: boolean = false;\r\n\r\n tags: any[] = [];\r\n\r\n static nextId = 0;\r\n stateChanges = new Subject<void>();\r\n focused = false;\r\n controlType = 'techlify-tagger-selector';\r\n id = `techlify-tagger-selector-${TechlifyTaggerTagSelectorComponent.nextId++}`;\r\n\r\n onChange = (_: any) => { };\r\n onTouched = () => { };\r\n\r\n get apiUrl() {\r\n if (this.showAllTags) {\r\n return 'api/techlify-tagger-tags'\r\n }\r\n else if (this.categories?.length > 0) {\r\n return 'api/techlify-tagger-tags?categories=' + this.categories.join(',');\r\n }\r\n else {\r\n return '';\r\n }\r\n }\r\n\r\n //Default Getter and Setters for a Form Field Implementation\r\n get empty() {\r\n return this.value.length == 0;\r\n }\r\n\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n private _required = false;\r\n\r\n @Input()\r\n get disabled(): boolean {\r\n return this._disabled;\r\n }\r\n set disabled(value: boolean) {\r\n this._disabled = coerceBooleanProperty(value);\r\n this._disabled ? this.tagSelectorCtrl.disable() : this.tagSelectorCtrl.enable();\r\n this.stateChanges.next();\r\n }\r\n private _disabled = false;\r\n\r\n\r\n private _value: any;\r\n @Input()\r\n get value(): any {\r\n return this._value;\r\n }\r\n set value(val: any) {\r\n this._value = val;\r\n this.tagSelectorCtrl.setValue(val);\r\n this.stateChanges.next();\r\n }\r\n\r\n get errorState(): boolean {\r\n return this.tagSelectorCtrl.dirty && this.required && (this.value.length == 0);\r\n }\r\n\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n private _placeholder: string;\r\n\r\n\r\n ngOnInit(): void {\r\n if (this.useSelectButtonStyle) {\r\n this.httpService.get(this.apiUrl)\r\n .pipe(untilDestroyed(this))\r\n .subscribe((res: any) => {\r\n this.tags = res.data;\r\n })\r\n }\r\n }\r\n\r\n selectionChange(value: any) {\r\n this.value = value;\r\n this._handleInput();\r\n }\r\n\r\n constructor(\r\n private _focusMonitor: FocusMonitor,\r\n private _elementRef: ElementRef<HTMLElement>,\r\n private httpService: HttpService,\r\n @Optional() @Inject(MAT_FORM_FIELD) public _formField: MatFormField,\r\n @Optional() @Self() public ngControl: NgControl) {\r\n\r\n //Set Focus Monitor\r\n _focusMonitor.monitor(_elementRef, true).subscribe(origin => {\r\n if (this.focused && !origin) {\r\n this.onTouched();\r\n }\r\n this.focused = !!origin;\r\n this.stateChanges.next();\r\n });\r\n\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n setDescribedByIds(ids: string[]) {\r\n // Just a empty implementation for Mat Form Field Interface\r\n }\r\n\r\n onContainerClick() {\r\n // Just a empty implementation for Mat Form Field Interface\r\n }\r\n\r\n writeValue(val: any): void {\r\n this.value = val;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n _handleInput(): void {\r\n this.onChange(this.value);\r\n }\r\n\r\n static ngAcceptInputType_disabled: BooleanInput;\r\n static ngAcceptInputType_required: BooleanInput;\r\n\r\n ngOnDestroy() {\r\n this.stateChanges.complete();\r\n this._focusMonitor.stopMonitoring(this._elementRef);\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TechlifyTaggerTagSelectorComponent } from './techlify-tagger-tag-selector.component';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { ReactiveFormsModule } from '@angular/forms';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MaterialModule } from '../material.module';\r\nimport { SearchableSelectorModule } from '../searchable-selector/searchable-selector.module';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n TechlifyTaggerTagSelectorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n MatAutocompleteModule,\r\n ReactiveFormsModule,\r\n SearchableSelectorModule,\r\n MatButtonToggleModule\r\n ],\r\n exports: [TechlifyTaggerTagSelectorComponent]\r\n})\r\nexport class TechlifyTaggerTagSelectorModule { }\r\n","import { DataManager } from './../core/dataManager.service';\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TechlifyFeatureService {\r\n\r\n constructor(private dataManager: DataManager) { }\r\n\r\n getFeatures() {\r\n return this.dataManager.GET(`api/features`);\r\n }\r\n\r\n disableFeature(id: any) {\r\n return this.dataManager.GET(`api/feature/${id}/disable`);\r\n }\r\n\r\n enableFeature(id: any) {\r\n return this.dataManager.GET(`api/feature/${id}/enable`);\r\n }\r\n\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { MatTableDataSource } from '@angular/material/table';\r\nimport { TechlifyFeatureService } from './techlify-feature.service';\r\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\r\nimport { debounceTime } from 'rxjs/operators';\r\nimport { ActionPopup, ActionPopupComponent } from '../action-popup';\r\nimport { DataManager } from '../core/dataManager.service';\r\nimport { ErrorHandlerService } from '../core/error-handler.service';\r\nimport { AlertService } from '../core/alert.service';\r\nimport { StorageService } from '../core/storage.service';\r\n@UntilDestroy()\r\n@Component({\r\n selector: 'app-techlify-listing-feature',\r\n templateUrl: './techlify-feature-listing.component.html',\r\n styleUrls: ['./techlify-feature-listing.component.scss']\r\n})\r\nexport class TechlifyFeatureListingComponent implements OnInit {\r\n\r\n features: any[] = []\r\n displayedColumns: string[] = [\r\n 'index',\r\n 'feature',\r\n 'description',\r\n 'actions',\r\n ]\r\n\r\n dataSource = new MatTableDataSource()\r\n\r\n page: number = 1;\r\n lastPage: number;\r\n perPage: number = 25;\r\n\r\n isWorking: boolean = false\r\n filterFormGroup: FormGroup;\r\n featureToggleForm: FormGroup;\r\n\r\n constructor(\r\n private dataManager: DataManager,\r\n private errorHandler: ErrorHandlerService,\r\n private fb: FormBuilder,\r\n private alertService: AlertService,\r\n private dialog: MatDialog,\r\n private storage: StorageService,\r\n private featureService: TechlifyFeatureService\r\n ) {\r\n this.filterFormGroup = this.fb.group({\r\n num_items: [\"\"]\r\n })\r\n }\r\n\r\n ngOnInit() {\r\n this.loadData()\r\n this.listenForChanges()\r\n }\r\n\r\n listenForChanges() {\r\n this.filterFormGroup.valueChanges\r\n .pipe(debounceTime(500), untilDestroyed(this))\r\n .subscribe((changes) => {\r\n this.reload()\r\n })\r\n }\r\n\r\n async loadData() {\r\n let result;\r\n try {\r\n this.isWorking = true\r\n var filter = this.filterFormGroup.value\r\n filter.page = this.page;\r\n filter.perPage = this.perPage;\r\n result = await this.dataManager.GET(`api/features`, filter);\r\n this.features = this.features.concat(result.data);\r\n this.dataSource = new MatTableDataSource(this.features);\r\n\r\n if (!this.storage.getItem('features')) {\r\n this.setStorage(this.features);\r\n }\r\n\r\n this.isWorking = false\r\n } catch (error) {\r\n this.errorHandler.handleError(error);\r\n } finally {\r\n this.isWorking = false;\r\n }\r\n }\r\n\r\n async toggeleFeature(element, feature) {\r\n let status = element ? 'Off' : \"On\";\r\n let data;\r\n const dialogRef = this.dialog.open(ActionPopupComponent, {\r\n width: \"400px\",\r\n data: <ActionPopup>{\r\n title: `Turn this feature ${status}?`,\r\n message: `Would you like to turn ${feature.title} feature ${status}`\r\n }\r\n })\r\n\r\n dialogRef.afterClosed().subscribe(async result => {\r\n if (result) {\r\n try {\r\n data = element\r\n ? await this.featureService.disableFeature(feature.id)\r\n : await this.featureService.enableFeature(feature.id);\r\n } catch (error) {\r\n this.errorHandler.handleError(error);\r\n } finally {\r\n this.alertService.addAlert(`You have just turned ${status} the feature ${feature.title}`, 'success');\r\n this.reload();\r\n this.storage.removeItem('features');\r\n this.setStorage(this.features);\r\n this.isWorking = false;\r\n }\r\n } else {\r\n this.reload();\r\n }\r\n })\r\n }\r\n\r\n setStorage(features) {\r\n let localFeatures = [];\r\n for (let feature of features) {\r\n if (!feature.client_feature) {\r\n if (feature.is_enabled_default) {\r\n localFeatures.push(feature.code);\r\n }\r\n } else {\r\n if (feature.client_feature.is_enabled) {\r\n localFeatures.push(feature.code);\r\n }\r\n }\r\n\r\n }\r\n this.storage.setItem(\"features\", localFeatures);\r\n }\r\n\r\n reload() {\r\n this.features = [];\r\n this.page = 1;\r\n if (!this.isWorking) {\r\n this.loadData();\r\n }\r\n }\r\n\r\n onScroll() {\r\n if (!this.isWorking && this.page < this.lastPage) {\r\n this.page += 1;\r\n this.loadData();\r\n }\r\n }\r\n\r\n sortColumn(event) {\r\n var direction = event.direction.toString().toUpperCase()\r\n this.assignFilter(event.active, direction)\r\n this.reload()\r\n }\r\n\r\n assignFilter(column, direction) {\r\n switch (column) {\r\n case 'name': {\r\n return this.filterFormGroup\r\n .get('sort_by')\r\n .setValue('first_name|' + direction)\r\n }\r\n case 'added_on': {\r\n return this.filterFormGroup\r\n .get('sort_by')\r\n .setValue('created_at|' + direction)\r\n }\r\n }\r\n }\r\n\r\n}\r\n","import { AuthenticationGuard } from './../core/authentication.guard';\r\nimport { Routes, RouterModule } from '@angular/router';\r\nimport { TechlifyFeatureListingComponent } from './techlify-feature-listing.component';\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n component: TechlifyFeatureListingComponent,\r\n canActivate: [AuthenticationGuard]\r\n },\r\n];\r\n\r\nexport const TechlifyFeatureRoutes = RouterModule.forChild(routes);\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormGroup } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'app-on-off-switch',\r\n templateUrl: './on-off-switch.component.html',\r\n styleUrls: ['./on-off-switch.component.scss']\r\n})\r\n\r\nexport class OnOffSwitchComponent implements OnInit {\r\n\r\n @Input() value: boolean;\r\n slideToggle: FormGroup;\r\n\r\n constructor(private fb: FormBuilder) {\r\n this.slideToggle = this.fb.group({\r\n toggle: [\"\"]\r\n })\r\n }\r\n\r\n ngOnInit() {\r\n this.slideToggle.get('toggle').setValue(this.value);\r\n }\r\n\r\n}\r\n","import { Directive, ElementRef, Input } from '@angular/core';\r\nimport { ErrorHandlerService } from '../core/error-handler.service';\r\nimport { StorageService } from '../core/storage.service';\r\nimport { TechlifyFeatureService } from './techlify-feature.service';\r\n\r\n@Directive({\r\n selector: '[techlifyFeatureEnabled]'\r\n})\r\nexport class TechlifyFeatureEnabledDirective {\r\n\r\n features: any;\r\n localFeatures: any[] = [];\r\n @Input('techlifyFeatureEnabled') enabledFeature: any;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private featureService: TechlifyFeatureService,\r\n private errorHandler: ErrorHandlerService,\r\n private storage: StorageService) {\r\n\r\n }\r\n\r\n ngOnInit(): void {\r\n if (!this.storage.getItem('features')) {\r\n this.getFeatures();\r\n } else {\r\n this.checkForFeatureEnabled();\r\n }\r\n }\r\n\r\n async getFeatures() {\r\n try {\r\n let features = await this.featureService.getFeatures();\r\n\r\n for (let feature of features.data) {\r\n if (!feature.client_feature) {\r\n if (feature.is_enabled_default) {\r\n this.localFeatures.push(feature.code);\r\n }\r\n } else {\r\n if (feature.client_feature.is_enabled) {\r\n this.localFeatures.push(feature.code);\r\n }\r\n }\r\n\r\n }\r\n this.storage.setItem(\"features\", this.localFeatures);\r\n } catch (error) {\r\n this.errorHandler.handleError(error);\r\n } finally {\r\n this.checkForFeatureEnabled()\r\n }\r\n }\r\n\r\n checkForFeatureEnabled() {\r\n try {\r\n let features = this.storage.getItem('features');\r\n let features_split = features.split(',');\r\n\r\n if (features_split.includes(this.enabledFeature)) {\r\n this.el.nativeElement.style.display = \"show\";\r\n } else {\r\n this.el.nativeElement.remove();\r\n }\r\n\r\n } catch (error) {\r\n this.errorHandler.handleError(error);\r\n }\r\n }\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TechlifyFeatureListingComponent } from './techlify-feature-listing.component';\r\n\r\nimport { TechlifyFeatureRoutes } from './techlify-feature.routing';\r\nimport { OnOffSwitchComponent } from './on-off-switch/on-off-switch.component';\r\nimport { FlexLayoutModule } from '@angular/flex-layout';\r\nimport { TechlifyFeatureEnabledDirective } from './techlify-feature-enabled.directive';\r\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { MaterialModule } from '../material.module';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n MaterialModule,\r\n FlexLayoutModule,\r\n TechlifyFeatureRoutes,\r\n MatSlideToggleModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n InfiniteScrollModule\r\n ],\r\n declarations: [TechlifyFeatureListingComponent, OnOffSwitchComponent, TechlifyFeatureEnabledDirective],\r\n exports: [TechlifyFeatureListingComponent, TechlifyFeatureEnabledDirective]\r\n})\r\nexport class TechlifyFeatureModule { }\r\n"]}
1
+ {"version":3,"sources":["../../../projects/ngx-techlify-core/src/lib/action-popup/action-popup.model.ts","../../../projects/ngx-techlify-core/src/lib/action-popup/action-popup.component.ts","../../../projects/ngx-techlify-core/src/lib/base-model/techlify-form-component.class.ts","../../../projects/ngx-techlify-core/src/lib/base-model/techlify-listing-component.class.ts","../../../projects/ngx-techlify-core/src/lib/base-model/techlify-service.class.ts","../../../node_modules/tslib/tslib.es6.js","../../../projects/ngx-techlify-core/src/lib/data-table/data-table.component.ts","../../../projects/ngx-techlify-core/src/lib/data-table/data-table.model.ts","../../../projects/ngx-techlify-core/src/lib/document-viewer/document-viewer.component.ts","../../../projects/ngx-techlify-core/src/lib/core/logger.service.ts","../../../projects/ngx-techlify-core/src/lib/document-viewer/viewer-config.model.ts","../../../projects/ngx-techlify-core/src/lib/core/techlify-config.model.ts","../../../projects/ngx-techlify-core/src/lib/core/config.service.ts","../../../projects/ngx-techlify-core/src/lib/core/snack/snack.component.ts","../../../projects/ngx-techlify-core/src/lib/core/alert.service.ts","../../../projects/ngx-techlify-core/src/lib/core/error-handler.service.ts","../../../projects/ngx-techlify-core/src/lib/core/error-handler.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/http-cache.service.ts","../../../projects/ngx-techlify-core/src/lib/core/cache.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/api-prefix.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/credentials.service.ts","../../../projects/ngx-techlify-core/src/lib/core/token.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/header.interceptor.ts","../../../projects/ngx-techlify-core/src/lib/core/http.service.ts","../../../projects/ngx-techlify-core/src/lib/entity-files/entity-file.service.ts","../../../projects/ngx-techlify-core/src/lib/core/form-validator.service.ts","../../../projects/ngx-techlify-core/src/lib/entity-files/entity-file-form/entity-file-form.component.ts","../../../projects/ngx-techlify-core/src/lib/entity-files/entity-files-view-all.component.ts","../../../projects/ngx-techlify-core/src/lib/file-dropper/file-dropper.component.ts","../../../projects/ngx-techlify-core/src/lib/file-dropper/file-dropper.model.ts","../../../projects/ngx-techlify-core/src/lib/note/note.service.ts","../../../projects/ngx-techlify-core/src/lib/note/note-form/note-form.component.ts","../../../projects/ngx-techlify-core/src/lib/note/note-list/note-list.component.ts","../../../projects/ngx-techlify-core/src/lib/note/comment-form/comment-form.component.ts","../../../projects/ngx-techlify-core/src/lib/searchable-selector/searchable-selector.component.ts","../../../projects/ngx-techlify-core/src/lib/searchable-selector/mat-select-infinite-scroll.directive.ts","../../../projects/ngx-techlify-core/src/lib/utility/num-items-selector.component.ts","../../../projects/ngx-techlify-core/src/lib/utility/date-utils.service.ts","../../../projects/ngx-techlify-core/src/lib/utility/number-selector.component.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/timeline.model.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/calculate-timeline.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/timeline-filter.component.ts","../../../projects/ngx-techlify-core/src/lib/loader/loader.component.ts","../../../projects/ngx-techlify-core/src/lib/core/snack/snack.module.ts","../../../projects/ngx-techlify-core/src/lib/core/authentication.guard.ts","../../../projects/ngx-techlify-core/src/lib/core/authentication.service.ts","../../../projects/ngx-techlify-core/src/lib/core/route-reusable-strategy.ts","../../../projects/ngx-techlify-core/src/lib/core/storage.service.ts","../../../projects/ngx-techlify-core/src/lib/core/dataManager.service.ts","../../../projects/ngx-techlify-core/src/lib/material.module.ts","../../../projects/ngx-techlify-core/src/lib/core/core.module.ts","../../../projects/ngx-techlify-core/src/lib/action-popup/action-popup.module.ts","../../../projects/ngx-techlify-core/src/lib/data-table/data-table.module.ts","../../../projects/ngx-techlify-core/src/lib/document-viewer/document-viewer.module.ts","../../../projects/ngx-techlify-core/src/lib/file-dropper/file-dropper.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-config.model.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.module.ts","../../../projects/ngx-techlify-core/src/lib/searchable-selector/searchable-selector.module.ts","../../../projects/ngx-techlify-core/src/lib/read-more/read-more.component.ts","../../../projects/ngx-techlify-core/src/lib/read-more/read-more.module.ts","../../../projects/ngx-techlify-core/src/lib/entity-files/entity-files-view-all.module.ts","../../../projects/ngx-techlify-core/src/lib/note/note.module.ts","../../../projects/ngx-techlify-core/src/lib/utility/utility.module.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/timeline-filter-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/timeline-filter/timeline-filter.module.ts","../../../projects/ngx-techlify-core/src/lib/loader/loader.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-form/email-subscription-user-form.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list-filter/email-subscription-user-list-filter.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-user/email-subscription-user-list/email-subscription-user-list.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-form/email-subscription-type-form.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-type/email-subscription-type-list/email-subscription-type-list.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-for-user/email-subscription-for-user.component.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-for-user/email-subscription-for-user-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/email-subscription/email-subscription-for-user/email-subscription-for-user.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update.service.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-form/techlify-update-form.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-form/techlify-update-form.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-updates-list/techlify-updates-list.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-view/update-view.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-history/techlify-update-history.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-history/techlify-update-history-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/techlify-update-history/techlify-update-history.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-view/update-view.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-notifier/update-notifier-snack/update-notifier-snack.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-notifier/update-notifier.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-update/update-notifier/update-notifier.module.ts","../../../projects/ngx-techlify-core/src/lib/export-excel/export-excel-button/export-excel-button.component.ts","../../../projects/ngx-techlify-core/src/lib/export-excel/export-excel.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view-model/audit-log-view-model.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-logs-view-model/audit-logs-view-model.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-for-model/audit-log-for-model.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-for-model/audit-log-for-model-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view-model/audit-log-view-model-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view-model/audit-log-view-model.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-logs-view-model/audit-logs-view-model-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list/audit-log-list-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list/audit-log-list.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list-filter/audit-log-list-filter-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/date-validator.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list-filter/audit-log-list-filter.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list-filter/audit-log-list-filter.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-list/audit-log-list.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-logs-view-model/audit-logs-view-model.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-for-model/audit-log-for-model.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view/audit-log-view.component.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view/audit-log-view-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-view/audit-log-view.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/audit-log/audit-log.module.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/import-success/import-success.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/import-history-list/import-history-list.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/field-mapping/field-mapping.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/failed-items-list/failed-items-list.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/import-csv.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/data-import/data-import.component.ts","../../../projects/ngx-techlify-core/src/lib/import-csv/import-csv.module.ts","../../../projects/ngx-techlify-core/src/lib/login-history-for-user/login-history-for-user.component.ts","../../../projects/ngx-techlify-core/src/lib/login-history-for-user/login-history-for-user-routing.module.ts","../../../projects/ngx-techlify-core/src/lib/login-history-for-user/login-history-for-user.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-tagger-tag-selector/techlify-tagger-tag-selector.module.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature.service.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature-listing.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature.routing.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/on-off-switch/on-off-switch.component.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature-enabled.directive.ts","../../../projects/ngx-techlify-core/src/lib/techlify-feature/techlify-feature.module.ts"],"names":["ActionPopupComponent","dialogRef","data","this","prototype","ngOnInit","closeDialog","close","confirm","Component","args","selector","template","MatDialogRef","ActionPopup","decorators","type","Inject","MAT_DIALOG_DATA","TechlifyFormComponentInterface","formValidatorService","resetFieldValue","event","field","_b","_a","form","get","setValue","getFieldValue","value","isFieldValid","getErrorMessage","errorMessages","TechlifyListingControllerInterface","models","page","perPage","lastPage","isWorking","reload","loadData","onScroll","TechlifyServiceBaseClass","http","baseUrl","index","filters","params","Object","assign","toPromise","store","model","post","show","modelId","update","put","id","delete","extendStatics","d","b","setPrototypeOf","__proto__","Array","p","hasOwnProperty","call","__extends","TypeError","String","__","constructor","create","__decorate","target","key","desc","c","arguments","length","r","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","n","v","op","pop","push","__values","o","s","m","__read","ar","error","__spread","concat","DataTableComponent","DataTableComponent_1","dataSource","MatTableDataSource","action","EventEmitter","selctionChange","rowClick","tableScroll","sortChanged","elementId","nextId","ngAfterViewInit","_this","selection","changed","pipe","subscribe","change","selected","emit","sort","sortChange","untilDestroyed","isAllSelected","masterToggle","clearSelection","forEach","row","select","clear","ngOnChanges","changes","initializeConfig","isFirstChange","currentValue","config","editClicked","element","stopPropagation","viewClicked","deactivateClicked","downloadClicked","printClicked","rowClicked","actionMenuClick","menuValue","trigger","closeMenu","actionMenuTriggerClick","checkEdit","ele","editDisableFunction","checkView","viewDisableFunction","checkPrint","printDisableFunction","checkActions","actionsMenuFunction","checkActionButton","actionsMenuButtonFunction","getValue","keyString","keyList","replace","split","ngOnDestroy","Input","Output","ViewChild","MatSort","static","UntilDestroy","DocumentViewerComponent","remove","initData","removeFile","file","ext","getFileExtension","viewerType","nameArray","LogLevel","Logger","source","enableProductionMode","level","Warning","debug","objects","_i","log","console","Debug","info","Info","warn","Error","func","outputs","output","TechlifyConfig","projectKey","environment","authClientSecret","authGrantType","apiUrl","isLogoutWhileApiGetsFailed","loadFromMap","storage","rawConfigs","ConfigService","getConfigsRaw","getProjectKey","getApiUrl","getAuthClientSecret","getStorage","localStorage","getAuthGrantType","getCredentialsKey","BASE_CREDENTIALS","Injectable","providedIn","MAT_SNACK_BAR_DATA","AlertService","snackBar","addAlert","message","alertType","duration","openFromComponent","SuccessSnackComponent","ErrorSnackComponent","MatSnackBar","ErrorHandlerService","alerter","handleError","errorResponse","msg","errors","property","_c","_d","errMessage","status","sessionStorage","location","ErrorHandlerInterceptor","configService","errorHandler","intercept","request","handle","catchError","ErrorEvent","throwError","HttpCacheService","cachedData","cachePersistenceKey","loadCacheData","setCacheData","url","lastUpdated","Date","saveCacheData","getCacheData","cacheEntry","getHttpCacheEntry","clearCache","cleanCache","expirationDate","keys","setPersistence","persistence","JSON","stringify","parse","CacheInterceptor","httpCacheService","forceUpdate","configure","options","instance","method","Observable","subscriber","urlWithParams","HttpResponse","complete","ApiPrefixInterceptor","test","clone","CredentialsService","_credentials","credentials","getItem","setCredentials","remember","setItem","getAccessToken","expiration","token","expires_in","access_token","now","parseInt","getExpiration","getRefreshToken","refresh_token","refresh","TokenInterceptor","setHeaders","Authorization","HeaderInterceptor","Content-Type","headers","HttpInterceptorHandler","interceptor","HTTP_DYNAMIC_INTERCEPTORS","InjectionToken","HttpService","httpHandler","injector","interceptors","_super","cache","cacheInterceptor","addInterceptor","skipErrorHandler","removeInterceptor","skipApiPrefix","skipToken","skipHeader","handler","reduceRight","HttpClient","interceptorType","filter","HttpHandler","Injector","Optional","EntityFileService","getEntityFiles","createEntityFile","updateEntityFile","deleteEntityFile","uploadEntityFile","formData","FormData","append","name","entity_id","entity_type","FormValidatorService","formGroup","firstAttempt","valid","touched","untouched","errorField","required","EntityFileFormComponent","fb","entityFileService","alertService","fileList","useTechlifyTags","createForm","entityFileGroup","group","title","details","Validators","file_size","tag_ids","entity","updateMode","patchValue","hideTitleAndDetails","fileConfig","fileId","containerId","styles","height","multiple","acceptFile","maxSize","acceptFileText","viewerConfig","viewerStyle","width","submit","assignmentFileFirstAttempt","toString","_e","_f","item","fileChanged","FormBuilder","EntityFilesViewAllComponent","dialog","viewOnly","allowMultipleFiles","entityFiles","displayedColumns","filterFormGroup","imageStyle","hideRemove","x","listenRoutes","entityType","entityId","fetchEntityFilesDetails","valueChanges","debounceTime","last_page","addEntityFile","open","autoFocus","restoreFocus","afterClosed","files","editEntityFile","sizeOf","bytes","Math","floor","pow","toFixed","charAt","Location","MatDialog","FileDropperComponent","fileArray","border","isSingleMode","Boolean","dragEnter","style","background","dragColor","preventDefault","dragOver","dragLeave","dropEvent","droppedFiles","dataTransfer","from","addFiles","onFileChange","document","getElementById","fileSizeAllowed","sortFiles","a","nameA","toUpperCase","nameB","size","clickEvent","click","NoteService","getNotes","filterModel","addNote","note","editNote","deleteNote","NoteFormComponent","noteService","noteFormGroup","compose","model_type","related_model_id","noteFormFirstAttempt","labelText","cancel","NoteListComponent","readonly","commentsView","notes","sort_by","relatedModelId","modelType","current_page","resetScroll","commentAction","editComment","addComment","comment","findIndex","CommentFormComponent","credentialService","view","_commentData","commentFormGroup","isAuthenticated","user","reset","deleteComment","hideEdit","SearchableSelectorComponent","SearchableSelectorComponent_1","formBuilder","_focusMonitor","_elementRef","ngControl","valueField","titleField","selectedValueChange","enableSearch","add","edit","items","apiDataProperty","inDataSearch","selectionChange","itemsChange","isLoading","onChange","onTouched","stateChanges","Subject","focused","controlType","describedBy","cachedItems","_required","_disabled","selectorForm","select_value","search","monitor","origin","valueAccessor","empty","setValidators","coerceBooleanProperty","disable","enable","openedChange","dataItems","selectedValue","distinctUntilChanged","sortBy","fetchItemList","of","startWith","switchMap","finalize","setDescribedByIds","ids","join","onContainerClick","writeValue","registerOnChange","fn","registerOnTouched","setDisabledState","isDisabled","disabled","getPropertyValue","_handleInput","map","find","invalid","dirty","reloadData","searchField","filterItems","toLowerCase","addItem","itemComponent","addConfig","editItem","editConfig","stopMonitoring","providers","provide","MatFormFieldControl","useExisting","FocusMonitor","ElementRef","NgControl","Self","MatSelectInfiniteScrollDirective","matSelect","ngZone","threshold","infiniteScroll","thrPx","thrPc","singleOptionHeight","SELECT_ITEM_HEIGHT_EM","destroyed$","evaluateThreshold","takeUntil","opened","panel","nativeElement","getSelectItemHeightPx","registerScrollListener","lastIndexOf","parseFloat","fromEvent","tap","handleScrollEvent","runOutsideAngular","countOfRenderedOptions","infiniteScrollDistance","clientHeight","scrollTop","run","getComputedStyle","fontSize","Directive","MatSelect","NgZone","NumItemsSelector","numItemsChange","numItemsChanged","numItems","DateUtils","getYYYYMMDDString","inputDate","getFullYear","getMonth","getDate","getYYYY","getMM","getDateTime","toLocaleTimeString","NumberSelector","numChanged","start_value","end_value","Timeline","CUSTOM","TODAY","YESTERDAY","THIS_WEEK","LAST_WEEK","THIS_MONTH","LAST_MONTH","THIS_QUARTER","LAST_QUARTER","THIS_YEAR","LAST_YEAR","ALL","TOMMOROW","NEXT_WEEK","NEXT_MONTH","moment","moment_","calculateTimeline","date","date_from","date_to","show_custom_field","startOf","toISOString","endOf","subtract","TimelineFilterComponent","TimelineFilterComponent_1","datePipe","timelineValue","FormControl","timelines","viewValue","dateFrom","dateTo","appearance","showClearbutton","touchUi","showCustomDateFields","changeTimeline","getDateRangeString","str","selectedRange","toUTCString","transform","_g","setFieldValue","timeline","range","picker","dateRangeChange","dateRangeStart","dateRangeEnd","onCustomDateChange","DatePipe","LoaderComponent","NgModule","declarations","imports","CommonModule","MatSnackBarModule","MatIconModule","exports","AuthenticationGuard","router","credentialsService","canActivate","route","state","isUserAuthenticated","canLoad","navigate","queryParams","redirect","replaceUrl","Router","AuthenticationService","login","context","concatMap","tokenInfo","userInfo","logout","RouteReusableStrategy","shouldDetach","detachedTree","shouldAttach","retrieve","shouldReuseRoute","future","curr","routeConfig","component","RouteReuseStrategy","StorageService","storageSub","watch","asObservable","removeItem","DataManager","GET","urlq","POST","object","blank","POSTRAW","PUT","PATCH","patch","DELETE","MatButtonModule","MatCheckboxModule","MatCommonModule","MatDialogModule","MatFormFieldModule","MatInputModule","MatLineModule","MatMenuModule","MatNativeDateModule","MatOptionModule","MatProgressSpinnerModule","MatPseudoCheckboxModule","MatRippleModule","MatSelectModule","MatSortModule","MatTableModule","MatCardModule","MatDividerModule","MatChipsModule","MatDatepickerModule","MatListModule","MatTooltipModule","MatButtonToggleModule","parentModule","HttpClientModule","RouterModule","SnackModule","useClass","CoreModule","SkipSelf","FlexLayoutModule","MaterialModule","entryComponents","InfiniteScrollModule","NgxDocViewerModule","selectable","removable","separatorKeysCodes","ENTER","COMMA","placeholder","createApiUrl","isCreateable","isCacheTags","isSingle","TechlifyTaggerTagFormFieldComponent","TechlifyTaggerTagFormFieldComponent_1","httpService","_formField","tagInputCtrl","TechlifyTaggerTagFormConfigModel","_allTags","categories","_value","filterValue","filterString","allTags","some","tagIds","_placeholder","model_id","init","_filter","trim","tags","tag","description","category_title","defaultCreateCategory","input","option","tagInput","availableTags","includes","MatFormField","MAT_FORM_FIELD","MatAutocompleteModule","ReactiveFormsModule","ReadMoreComponent","maxLength","hideToggle","isCollapsed","determineView","toggleView","text","currentText","substring","FormsModule","FileDropperModule","DocumentViewerModule","ActionPopupModule","TechlifyTaggerTagFormFieldModule","SearchableSelectorModule","ReadMoreModule","forChild","TimelineFilterRoutingModule","EmailSubscriptionRoutingModule","EmailSubscriptionUserRoutingModule","user_id","email_type_id","EmailSubscriptionUserFormComponent","esUserFormGroup","esUser","selectedType","email_type","selectedUser","markAllAsTouched","esUserFormFirstAttempt","isSubmitLoading","EmailSubscriptionUserFormRoutingModule","LoaderModule","EmailSubscriptionUserListComponent","esUserList","pageEvent","displayColumns","availableDisplayColumns","order","initializeData","changeSort","col","columnsChange","selectedColumns","filterChange","addEmailSubscriptionUser","editEmailSubscriptionUser","deleteEmailSubscriptionUser","direction","active","esulr","permissions","only","redirectTo","routes","path","EmailSubscriptionUserListFilterComponent","valueChange","esUserFilterForm","EmailSubscriptionUserListFilterRoutingModule","EmailSubscriptionUserListRoutingModule","EmailSubscriptionUserFormModule","EmailSubscriptionUserListFilterModule","EmailSubscriptionTypeRoutingModule","code","frequency_id","EmailSubscriptionTypeFormComponent","emailSubscriptionTypeFormGroup","emailSubscriptionType","selectedFrequency","frequency","emailSubscriptionTypeFormFirstAttempt","EmailSubscriptionTypeFormRoutingModule","EmailSubscriptionTypeListComponent","emailSubscriptionTypeList","isLoadRelations","relations","addEmailSubscriptionType","editEmailSubscriptionType","deleteEmailSubscriptionType","estlr","EmailSubscriptionTypeFormModule","EmailSubscriptionTypeListRoutingModule","EmailSubscriptionForUserComponent","subscriptions","fetchSubscriptions","sub","current_user_subscription","unsubscribe","esfur","EmailSubscriptionForUserRoutingModule","TechlifyUpdateService","getTechlifyUpdates","createTechlifyUpdate","techlifyUpdate","updateTechlifyUpdate","deleteTechlifyUpdate","techlifyUpdateId","getTechlifyUpdate","getNewUpdateForCurrentUser","createUpdateViewRecord","techlifyUpdateView","updateCurrentUserUpdates","released_on","version","learn_more_link","pattern","TechlifyUpdateFormComponent","techlifyUpdateService","onSave","isUpdateMode","toolbar","techlifyUpdateForm","techlifyUpdateDetails","editor","Editor","NgxEditorModule","TechlifyUpdatesListComponent","techlifyUpdates","listenChanges","modifyTechlifyUpdate","sortColumn","assignFilter","column","pathMatch","TechlifyUpdateRoutingModule","TechlifyUpdateFormModule","UpdateViewComponent","rootNavUrl","openUpdateHistory","TechlifyUpdateHistoryComponent","openUpdateView","isFromHistory","TechlifyUpdateHistoryRoutingModule","UpdateNotifierSnackComponent","snackBarRef","maxDescriptionLength","descriptionText","determineDescription","dismiss","update_id","MatSnackBarRef","UpdateNotifierComponent","setTimeout","getNewUpdate","showUpdate","horizontalPosition","verticalPosition","panelClass","UpdateViewModule","ExportExcelButtonComponent","exportExcel","fileName","getTime","ws","XLSX.utils","json_to_sheet","wb","book_new","book_append_sheet","XLSX.writeFile","AuditLogViewModelComponent","showDeltaChanges","changeList","logInfo","getTransformedChanges","displayAttribute","slice","attribute","newValue","oldValue","pre_object","AuditLogsViewModelComponent","events","NavigationEnd","AuditLogForModelComponent","logView","getLogView","getLogsView","maxWidth","AuditLogViewModelRoutingModule","AuditLogListComponent","dataManager","sanitizer","auditLogList","showFilter","showExportButtons","Type","object_type","Action","Data","Pre-Object","Created At","created_at","toDateString","Created By","email","logClicked","objectType","objectId","object_id","userId","value_1","DomSanitizer","DateValidator","control","val","invalidDate","AuditLogListFilterComponent","auditLogFilterForm","AuditLogListFilterRoutingModule","AuditLogListRoutingModule","ExportExcelModule","AuditLogListFilterModule","AuditLogsViewModelRoutingModule","AuditLogListModule","AuditLogViewModelModule","AuditLogsViewModelModule","AuditLogForModelRoutingModule","AuditLogViewComponent","paramMap","fetchLogDetail","back","logId","patchDelta","delta","jsondiffpatch.diff","innerHTML","jsondiffpatch.formatters","html","format","ActivatedRoute","AuditLogViewRoutingModule","AuditLogRoutingModule","AuditLogViewModule","ImportSuccessComponent","ImportHistoryListComponent","histories","importHistory","isEnabled","unavailable","FieldMappingComponent","changeDetectorRef","firstDataArray","properties","onReUpload","createImportMappingForm","reFectorAttributes","importMappingForm","fields","array","createField","propertyType","k","dataValue","mainIndex","fieldsArray","detectChanges","updatePropertyType","controls","uniqueValidator","propertyData","setErrors","removeField","removeAt","reUpload","ChangeDetectorRef","FailedItemsListComponent","isValidDate","isNaN","ImportCsvComponent","filesList","isUploaded","isImportTypeSelected","fileData","failedItems","selectedFields","importSteps","progressTitle","progressDescription","currentStep","filesConfig","selectedFile","jsonData","reader","FileReader","onload","XLSX.read","cellDates","SheetNames","reduce","initial","sheet","Sheets","sheet_to_json","header","defval","readAsBinaryString","mappingProcessed","tempFileData","save","failed_items","DataImportComponent","LoginHistoryForUserComponent","loginHistoryList","historyFilterForm","onTimelineChange","LoginHistoryForUserRoutingModule","TimelineFilterModule","TechlifyTaggerTagSelectorComponent","TechlifyTaggerTagSelectorComponent_1","tagSelectorCtrl","showAllTags","useSelectButtonStyle","res","TechlifyFeatureService","getFeatures","disableFeature","enableFeature","TechlifyFeatureListingComponent","featureService","features","num_items","listenForChanges","setStorage","error_1","toggeleFeature","feature","error_2","localFeatures","features_1","features_1_1","client_feature","is_enabled","is_enabled_default","TechlifyFeatureRoutes","OnOffSwitchComponent","slideToggle","toggle","TechlifyFeatureEnabledDirective","el","checkForFeatureEnabled","enabledFeature","display","MatSlideToggleModule"],"mappings":"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","sourcesContent":["export class ActionPopup {\n name: string;\n title: string;\n message: string;\n}","import { Component, OnInit, Inject } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { ActionPopup } from './action-popup.model';\n\n@Component({\n selector: 'app-action-popup',\n templateUrl: './action-popup.component.html',\n styleUrls: ['./action-popup.component.scss']\n})\nexport class ActionPopupComponent implements OnInit {\n\n constructor(\n public dialogRef: MatDialogRef<ActionPopupComponent>,\n @Inject(MAT_DIALOG_DATA) public data: ActionPopup,\n ) { }\n\n ngOnInit() {\n }\n\n /**Method to close dialog box */\n closeDialog() {\n this.dialogRef.close();\n }\n\n /**Method to close dialog box with the data given from parent component\n */\n confirm() {\n this.dialogRef.close(this.data);\n }\n\n}\n","import { FormGroup } from '@angular/forms';\nimport { FormValidatorService } from '../core/form-validator.service';\n\n/**\n * Interface used to ensure we have a consistent structure across our form components\n *\n * It also provides some abstraction of repeated code to reduce our codebase size\n *\n * @todo This should be moved to ngx-techlify-core\n *\n * Advantages of this abstract class\n * - Less code, less maintenance, less bugs\n * - more consistent code\n * - comments on more code\n * - save time, save energy\n */\nexport abstract class TechlifyFormComponentInterface {\n\n form: FormGroup;\n errorMessages: any;\n\n constructor(protected formValidatorService: FormValidatorService) {\n\n }\n\n /**\n * Resets the value of a field in the HTML form\n *\n * @param event\n * @param field\n */\n resetFieldValue(event: any, field: string) {\n this.form?.get(field)?.setValue('');\n }\n\n /**\n * Retrieves the value of a field from the HTML form\n *\n * @param field\n * @returns\n */\n getFieldValue(field: string) {\n return this.form?.get(field)?.value;\n }\n\n /**\n * Method to evaluate form fields\n * */\n isFieldValid(field: string) {\n return this.formValidatorService.isFieldValid(field, this.form, true);\n }\n\n /**\n * Method to find error in form fields\n * */\n getErrorMessage(field: string) {\n return this.formValidatorService.getErrorMessage(field, this.form, this.errorMessages);\n }\n\n}\n","/**\n * Interface used to ensure we have a consistent structure across our listing pages\n *\n * @todo This should be moved to ngx-techlify-core\n *\n * Advantages of this abstract class\n * - Less code, less maintenance, less bugs\n * - more consistent code\n * - comments on more code\n * - save time, save energy\n */\nexport abstract class TechlifyListingControllerInterface {\n\n models: any[] = [];\n page: number = 1;\n perPage: number = 25;\n lastPage: number = 500;\n isWorking: boolean = false;\n\n /**\n * Function that listens for any changes in the form group to apply the filters\n */\n abstract listenForChanges(): void;\n\n /**\n * Function that loads the main models of the application\n */\n abstract loadData(): void;\n\n /**\n * Reload all data from page 1\n */\n reload() {\n this.models = [];\n this.page = 1;\n if (!this.isWorking) {\n this.loadData();\n }\n }\n\n /**\n * Can be called when the user is scrolling,\n * to trigger loading a new page of data\n */\n onScroll() {\n if (!this.isWorking && this.page < this.lastPage) {\n this.page += 1;\n this.loadData();\n }\n }\n\n\n /**\n * Function used to pop up the edit form for the model\n *\n * @param model\n */\n abstract editForm(model: any): void;\n\n /**\n * Function used to pop up the delete form for the model\n *\n * @param model\n */\n abstract deleteForm(model: any): void;\n\n}\n","import { HttpService } from '../core/http.service';\n\n/**\n * Interface used to ensure we have a consistent structure across our listing pages\n *\n * @todo This should be moved to ngx-techlify-core\n *\n * Advantages of this abstract class\n * - Less code, less maintenance, less bugs\n * - more consistent code\n * - comments on more code\n * - save time, save energy\n */\nexport class TechlifyServiceBaseClass {\n\n protected baseUrl = \"you-forgot-to-set-a-base-url\";\n\n constructor(protected http: HttpService, baseUrl: string) {\n this.baseUrl = baseUrl;\n }\n\n /**\n * Loads a set of the model this service is for\n *\n * @param filters Restrictors to filter the set of models\n * @returns\n */\n index(filters: any) {\n return this.http.get(`api/${this.baseUrl}`, { params: { ...filters } }).toPromise();\n }\n\n /**\n * Add a new record to the database\n *\n * @param model The data of the model to add\n * @returns\n */\n store(model: any) {\n return this.http.post(`api/${this.baseUrl}`, model).toPromise();\n }\n\n /**\n * Load a single model record, often with all relations and related data\n *\n * @param modelId ID of the model to load\n * @returns\n */\n show(modelId: any) {\n return this.http.get(`api/${this.baseUrl}/${modelId}`).toPromise();\n }\n\n /**\n * Update fields of a single existing model\n *\n * @param model Model to update\n * @returns\n */\n update(model: any) {\n return this.http.put(`api/${this.baseUrl}/${model.id}`, model).toPromise();\n }\n\n /**\n * Delete a single model\n *\n * @param model Model to delete\n * @returns\n */\n delete(model: any) {\n return this.http.delete(`api/${this.baseUrl}/${model.id}`).toPromise();\n }\n\n\n}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n to[j] = from[i];\r\n return to;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import {\n Component,\n OnInit,\n Input,\n Output,\n EventEmitter,\n OnChanges,\n SimpleChanges,\n AfterViewInit,\n ViewChild\n} from \"@angular/core\";\n\nimport { SelectionModel } from \"@angular/cdk/collections\";\nimport { MatMenuTrigger } from '@angular/material/menu';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { MatSort } from '@angular/material/sort';\nimport { DataTable } from './data-table.model';\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\n\n@UntilDestroy()\n@Component({\n selector: \"app-data-table\",\n templateUrl: \"./data-table.component.html\",\n styleUrls: [\"./data-table.component.scss\"]\n})\nexport class DataTableComponent implements OnInit, OnChanges, AfterViewInit {\n\n trigger: MatMenuTrigger;\n\n @Input() data: any;\n\n @Input() config: DataTable;\n\n dataSource: MatTableDataSource<any> = new MatTableDataSource([]);\n\n @Input() selection: SelectionModel<any>;\n\n @Output() action = new EventEmitter();\n @Output() selctionChange = new EventEmitter();\n @Output() rowClick = new EventEmitter();\n @Output() tableScroll = new EventEmitter();\n @Output() sortChanged = new EventEmitter();\n\n page: number;\n lastPage: number;\n perPage: number;\n\n\n @ViewChild(MatSort, { static: true }) sort: MatSort;\n\n static nextId = 0;\n @Input() elementId: string = `data-table-${DataTableComponent.nextId++}`;\n\n constructor() { }\n\n ngOnInit() { }\n\n /**Life cycle hook method */\n ngAfterViewInit() {\n // Assign the data to the data source for the table to render\n this.dataSource = new MatTableDataSource(this.data);\n\n // Emit change in selection\n if (this.selection) {\n this.selection.changed.pipe().subscribe((change: any) => {\n if (this.selection.selected) {\n this.selctionChange.emit(this.selection.selected);\n }\n });\n }\n\n if (this.sort) {\n this.sort.sortChange.pipe(untilDestroyed(this))\n .subscribe((value: any) => {\n this.sortChanged.emit(value);\n })\n }\n }\n\n /** Whether the number of selected elements matches the total number of rows. */\n isAllSelected() {\n const numSelected = this.selection.selected.length;\n const numRows = this.dataSource.data.length;\n return numSelected === numRows;\n }\n\n /** Selects all rows if they are not all selected; otherwise clear selection. */\n masterToggle() {\n this.isAllSelected()\n ? this.clearSelection()\n : this.dataSource.data.forEach(row => this.selection.select(row));\n }\n\n /**clear selection*/\n clearSelection() {\n this.selection.clear();\n this.selctionChange.emit(this.selection.selected);\n }\n\n ngOnChanges(changes: SimpleChanges) {\n this.initializeConfig(changes);\n if (changes.data && !changes.data.isFirstChange() && this.dataSource) {\n // If not first change\n this.dataSource.data = changes.data.currentValue;\n }\n }\n\n initializeConfig(changes: SimpleChanges) {\n if (changes.config && !changes.config.isFirstChange()) {\n this.config = changes.config.currentValue;\n }\n this.page = this.config.page || 1;\n this.lastPage = this.config.lastPage || this.page;\n this.perPage = this.config.perPage || 20;\n }\n\n onScroll() {\n if (this.page < this.lastPage) {\n this.page += 1;\n this.tableScroll.emit({ page: this.page, lastPage: this.lastPage, perPage: this.perPage });\n }\n }\n\n /**Method invokes when edit action icon is clickes */\n editClicked(event: any, element: any) {\n this.action.emit({ action: \"edit\", value: element });\n event.stopPropagation();\n }\n\n /**Method invokes when view action icon is clickes */\n viewClicked(event: any, element: any) {\n this.action.emit({ action: \"view\", value: element });\n event.stopPropagation();\n }\n\n /**Method invokes when edit action icon is clickes */\n deactivateClicked(event: any, element: any) {\n this.action.emit({ action: \"deactivate\", value: element });\n event.stopPropagation();\n }\n\n /**Method invokes when download action icon is clickes */\n downloadClicked(event: any, element: any) {\n this.action.emit({ action: \"download\", value: element });\n event.stopPropagation();\n }\n\n /**Method invokes when print action icon is clickes */\n printClicked(event: any, element: any) {\n\n this.action.emit({ action: 'print', value: element });\n event.stopPropagation();\n\n }\n\n /**Method invokes when a row is clicked */\n rowClicked(event: any, element: any) {\n this.rowClick.emit(element);\n event.stopPropagation();\n }\n\n /**Method invokes when menu action icon is hovered */\n actionMenuClick(event: any, element: any, menuValue: string) {\n this.action.emit({ action: menuValue, value: element });\n this.trigger.closeMenu();\n event.stopPropagation();\n }\n\n /**Method invokes when menu action icon is hovered and selects for particular action*/\n actionMenuTriggerClick(event: any, trigger: MatMenuTrigger) {\n this.trigger = trigger;\n event.stopPropagation();\n }\n\n checkEdit(ele: any) {\n if (this.config.editDisableFunction) {\n return this.config.editDisableFunction(ele);\n }\n\n return true;\n }\n\n checkView(ele: any) {\n if (this.config.viewDisableFunction) {\n return this.config.viewDisableFunction(ele);\n }\n\n return true;\n }\n\n checkPrint(ele: any) {\n if (this.config.printDisableFunction) {\n return this.config.printDisableFunction(ele);\n }\n\n return true;\n }\n\n checkActions(ele: any) {\n if (this.config.actionsMenuFunction) {\n return this.config.actionsMenuFunction(ele);\n }\n\n return true;\n }\n\n checkActionButton(ele: any, value: any) {\n if (this.config.actionsMenuButtonFunction) {\n return this.config.actionsMenuButtonFunction(ele, value);\n }\n return true;\n }\n\n getValue(ele: any, keyString: string) {\n keyString = keyString.replace(/\\[(\\w+)\\]/g, \".$1\"); // convert indexes to properties\n keyString = keyString.replace(/^\\./, \"\"); // strip a leading dot\n const keyList = keyString.split(\".\");\n for (let i = 0, n = keyList.length; i < n; ++i) {\n const key = keyList[i];\n if (ele && key in ele) {\n ele = ele[key];\n } else {\n return;\n }\n }\n return ele;\n }\n\n ngOnDestroy() {\n //Until Destroy uses it.\n }\n}\n","export class DataTable {\n displayedColumns: string[];\n columnsConfig: ColumnConfig[];\n actionsConfig?: ActionConfig;\n enableRowClick?: boolean;\n disableElevation?: boolean;\n downloadLink?: string;\n actionsMenuFunction?: any;\n actionsMenuButtonFunction?: any;\n editDisableFunction?: any;\n viewDisableFunction?: any;\n printDisableFunction?: any;\n customActionLabel?: string;\n stickyHeader?: boolean;\n page?: number;\n lastPage?: number;\n perPage?: number;\n pageSizeOptions?: number[];\n style?: any;\n}\n\nclass ColumnConfig {\n title: string;\n value: string;\n sort?: boolean;\n dateField?: boolean;\n currencyField?: boolean;\n format?: string;\n}\n\nclass ActionConfig {\n edit?: boolean;\n view?: boolean;\n download?: boolean;\n print?: boolean;\n deactivate?: boolean;\n actionsMenu?: ActionsMenu[];\n}\n\nclass ActionsMenu {\n name: string;\n value: string;\n}\n\nexport class PageEvent {\n page: number;\n lastPage?: number;\n perPage: number;\n}\n","import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core';\nimport { ViewerConfig } from './viewer-config.model';\n\n@Component({\n selector: 'app-document-viewer',\n templateUrl: './document-viewer.component.html',\n styleUrls: ['./document-viewer.component.css']\n})\nexport class DocumentViewerComponent implements OnInit {\n\n\n @Input() config!: ViewerConfig;\n\n @Input() file!: any;\n\n @Input() fileUrl!: any;\n\n @Input() disableEdit: boolean;\n\n @Output() remove = new EventEmitter();\n viewerType: any;\n\n constructor() { }\n\n ngOnInit(): void {\n this.initData();\n }\n\n removeFile() {\n this.remove.emit();\n }\n\n initData() {\n if (this.file) {\n var ext = this.getFileExtension(this.file);\n if (ext === 'ppt' || ext === 'pptx' || ext === 'doc' || ext === 'docx' || ext === 'xls' || ext === 'xlsx') {\n this.viewerType = \"office\";\n }\n else if (ext === 'jpg' || ext === 'jpeg' || ext === 'png' || ext === 'gif') {\n this.viewerType = \"image\";\n }\n else if (ext === 'pdf') {\n this.viewerType = \"pdf\";\n }\n else {\n this.viewerType = null;\n }\n }\n }\n\n get fileName() {\n if (this.file) {\n let nameArray = this.file.split('/');\n if (nameArray.length === 2) {\n return nameArray[1];\n }\n return nameArray[0];\n }\n return '';\n }\n\n getFileExtension(file: any) {\n return file.split('.').pop();\n }\n\n}\n","/**\n * Simple logger system with the possibility of registering custom outputs.\n *\n * 4 different log levels are provided, with corresponding methods:\n * - debug : for debug information\n * - info : for informative status of the application (success, ...)\n * - warning : for non-critical errors that do not prevent normal application behavior\n * - error : for critical errors that prevent normal application behavior\n *\n * Example usage:\n * ```\n * import { Logger } from 'app/core/logger.service';\n *\n * const log = new Logger('myFile');\n * ...\n * log.debug('something happened');\n * ```\n *\n * To disable debug and info logs in production, add this snippet to your root component:\n * ```\n * export class AppComponent implements OnInit {\n * ngOnInit() {\n * if (environment.production) {\n * Logger.enableProductionMode();\n * }\n * ...\n * }\n * }\n *\n * If you want to process logs through other outputs than console, you can add LogOutput functions to Logger.outputs.\n */\n\n/**\n * The possible log levels.\n * LogLevel.Off is never emitted and only used with Logger.level property to disable logs.\n */\nexport enum LogLevel {\n Off = 0,\n Error,\n Warning,\n Info,\n Debug\n}\n\n/**\n * Log output handler function.\n */\nexport type LogOutput = (source: string | undefined, level: LogLevel, ...objects: any[]) => void;\n\nexport class Logger {\n\n /**\n * Current logging level.\n * Set it to LogLevel.Off to disable logs completely.\n */\n static level = LogLevel.Debug;\n\n /**\n * Additional log outputs.\n */\n static outputs: LogOutput[] = [];\n\n /**\n * Enables production mode.\n * Sets logging level to LogLevel.Warning.\n */\n static enableProductionMode() {\n Logger.level = LogLevel.Warning;\n }\n\n constructor(private source?: string) { }\n\n /**\n * Logs messages or objects with the debug level.\n * Works the same as console.log().\n */\n debug(...objects: any[]) {\n this.log(console.log, LogLevel.Debug, objects);\n }\n\n /**\n * Logs messages or objects with the info level.\n * Works the same as console.log().\n */\n info(...objects: any[]) {\n this.log(console.info, LogLevel.Info, objects);\n }\n\n /**\n * Logs messages or objects with the warning level.\n * Works the same as console.log().\n */\n warn(...objects: any[]) {\n this.log(console.warn, LogLevel.Warning, objects);\n }\n\n /**\n * Logs messages or objects with the error level.\n * Works the same as console.log().\n */\n error(...objects: any[]) {\n this.log(console.error, LogLevel.Error, objects);\n }\n\n private log(func: (...args: any[]) => void, level: LogLevel, objects: any[]) {\n if (level <= Logger.level) {\n const log = this.source ? ['[' + this.source + ']'].concat(objects) : objects;\n func.apply(console, log);\n Logger.outputs.forEach(output => output.apply(output, [this.source, level, ...objects]));\n }\n }\n\n}\n","export class ViewerConfig {\n imageStyle?: any;\n viewerStyle?: any;\n hideRemove?: boolean;\n}\n","/**\n * Class that stores the configuration data\n *\n * @author Joshua Kissoon\n * @since 20180724\n */\nexport class TechlifyConfig {\n projectKey: string = '';\n environment: string = '';\n authClientSecret: string = '';\n authGrantType: string = '';\n apiUrl: string = '';\n rawConfigs: any;\n storage: Storage;\n isLogoutWhileApiGetsFailed: boolean = false;\n\n constructor(data: any) {\n this.loadFromMap(data);\n }\n\n loadFromMap(data: any) {\n this.projectKey = data.projectKey;\n this.environment = data.environment;\n this.authClientSecret = data.authClientSecret;\n this.authGrantType = data.authGrantType;\n this.apiUrl = data.apiUrl;\n this.storage = data?.storage;\n this.rawConfigs = data;\n this.isLogoutWhileApiGetsFailed = data?.isLogoutWhileApiGetsFailed;\n }\n\n}\n","import { Injectable } from '@angular/core';\n\nimport { TechlifyConfig } from \"./techlify-config.model\";\n\n/**\n * Service that provides settings for all other services\n *\n * @author Joshua Kissoon\n * @since 20170709\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ConfigService {\n\n public static BASE_CREDENTIALS = \"credentials\";\n\n private config: TechlifyConfig;\n\n constructor(config: TechlifyConfig) {\n this.config = config;\n }\n\n getConfigsRaw() {\n return this.config.rawConfigs;\n }\n\n getProjectKey() {\n return this.config.projectKey;\n }\n\n getApiUrl() {\n return this.config.apiUrl;\n }\n\n getAuthClientSecret() {\n return this.config.authClientSecret;\n }\n\n getStorage() {\n return this.config.storage ? this.config.storage : localStorage;\n }\n\n getAuthGrantType() {\n return this.config.authGrantType;\n }\n\n getCredentialsKey() {\n return this.config.projectKey + \"_\" + ConfigService.BASE_CREDENTIALS;\n }\n\n}\n","import { Component, Inject } from '@angular/core';\nimport { MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';\n\n@Component({\n selector: 'snack-bar-component-example-snack',\n templateUrl: 'success-snack.html',\n styleUrls: ['./snack.scss'],\n})\nexport class SuccessSnackComponent {\n constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) { }\n}\n@Component({\n selector: 'snack-bar-component-example-snack',\n templateUrl: 'error-snack.html',\n styleUrls: ['./snack.scss'],\n})\nexport class ErrorSnackComponent {\n constructor(@Inject(MAT_SNACK_BAR_DATA) public data: any) { }\n}\n","import { Injectable } from '@angular/core';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { ErrorSnackComponent, SuccessSnackComponent } from './snack/snack.component';\r\n\r\n/**\r\n * Service used to manage alerts in the entire system frontend\r\n * \r\n * @author Gokula Prasanna\r\n * @since 20210131\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AlertService {\r\n\r\n constructor(public snackBar: MatSnackBar) { }\r\n\r\n addAlert(message: string, alertType: string, duration = 3) {\r\n if (alertType == \"success\") {\r\n this.snackBar.openFromComponent(SuccessSnackComponent, {\r\n duration: 1000 * duration,\r\n data: message\r\n });\r\n }\r\n else {\r\n this.snackBar.openFromComponent(ErrorSnackComponent, {\r\n duration: 1000 * duration,\r\n data: message\r\n });\r\n }\r\n }\r\n}\r\n","import { TechlifyConfig } from './techlify-config.model';\r\nimport { Injectable } from \"@angular/core\";\r\nimport { AlertService } from \"./alert.service\";\r\n\r\n\r\n/**\r\n * Service used to handle errors from the request\r\n *\r\n * @author Joshua Kissoon\r\n * @since 20171202\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ErrorHandlerService {\r\n\r\n constructor(private alerter: AlertService,\r\n private config: TechlifyConfig,\r\n ) {\r\n }\r\n\r\n handleError(errorResponse: any, msg: string = '') {\r\n // 1 - Create empty array to store errors\r\n const errors = [];\r\n\r\n // 2 - check if the error object is present in the response\r\n if (errorResponse?.error) {\r\n\r\n // 3 - Check for Laravel form validation error messages object\r\n if (errorResponse?.error?.errors) {\r\n\r\n // 4 - For each error property (which is a form field)\r\n for (const property in errorResponse.error.errors) {\r\n\r\n if (errorResponse.error.errors?.hasOwnProperty(property)) {\r\n\r\n // 5 - Extract it's array of errors\r\n const propertyErrors: Array<string> = errorResponse?.error?.errors[property];\r\n\r\n // 6 - Push all errors in the array to the errors array\r\n propertyErrors.forEach(error => errors.push(error));\r\n }\r\n\r\n }\r\n }\r\n\r\n if (errors.length === 0) {\r\n // 7 - Push the main error message to the array of errors if there is no validation error\r\n errors.push(errorResponse.error.message ? errorResponse.error.message : errorResponse.error?.error);\r\n }\r\n }\r\n var errMessage = errors.length ? errors[0] : msg;\r\n this.alerter.addAlert(\"Error: \" + errMessage, \"warning\");\r\n\r\n if (errorResponse.status == 403 && this.config.isLogoutWhileApiGetsFailed) {\r\n sessionStorage.clear();\r\n localStorage.clear();\r\n location.reload();\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse } from '@angular/common/http';\nimport { Observable, throwError } from 'rxjs';\nimport { catchError } from 'rxjs/operators';\nimport { Logger } from './logger.service';\nimport { ConfigService } from './config.service';\nimport { ErrorHandlerService } from './error-handler.service';\n\nconst log = new Logger('ErrorHandlerInterceptor');\n\n/**\n * Adds a default error handler to all requests.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ErrorHandlerInterceptor implements HttpInterceptor {\n\n constructor(private configService: ConfigService, private errorHandler: ErrorHandlerService) { }\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n return next.handle(request).pipe(catchError(error => this.handleError(error)));\n }\n\n // Customize the default error handler here if needed\n private handleError(error: HttpErrorResponse): Observable<HttpEvent<any>> {\n let errorMessage = '';\n if (error.error instanceof ErrorEvent) {\n // client-side error\n errorMessage = `Client Error: ${this.configService?.getProjectKey()}: ${error.error.message}`;\n } else {\n // server-side error\n errorMessage = `Server Error: ${this.configService?.getProjectKey()}`;\n try {\n this.errorHandler.handleError(error, 'Unexpected Server Error, try later or contact service team');\n } catch (e) {\n console.log(\"Unable to handle server error\", e);\n }\n }\n return throwError(error);\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\nimport { ConfigService } from './config.service';\nimport { Logger } from './logger.service';\n\nconst log = new Logger('HttpCacheService');\n\n\nexport interface HttpCacheEntry {\n lastUpdated: Date;\n data: HttpResponse<any>;\n}\n\n/**\n * Provides a cache facility for HTTP requests with configurable persistence policy.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class HttpCacheService {\n\n private cachedData: { [key: string]: HttpCacheEntry; } = {};\n private storage: Storage | any | null;\n private cachePersistenceKey: String | any;\n\n constructor(private configService: ConfigService) {\n this.storage = this.configService.getStorage();\n this.cachePersistenceKey = this.configService.getProjectKey() + '_HTTP_CACHE';\n this.loadCacheData();\n }\n\n /**\n * Sets the cache data for the specified request.\n * @param {!string} url The request URL.\n * @param {ResponseOptions} data The received data.\n * @param {Date=} lastUpdated The cache last update, current date is used if not specified.\n */\n setCacheData(url: string, data: HttpResponse<any>, lastUpdated?: Date) {\n this.cachedData[url] = {\n lastUpdated: lastUpdated || new Date(),\n data: data\n };\n log.debug(`Cache set for key: \"${url}\"`);\n this.saveCacheData();\n }\n\n /**\n * Gets the cached data for the specified request.\n * @param {!string} url The request URL.\n * @return {?ResponseOptions} The cached data or null if no cached data exists for this request.\n */\n getCacheData(url: string): HttpResponse<any> | null {\n const cacheEntry = this.cachedData[url];\n\n if (cacheEntry) {\n log.debug(`Cache hit for key: \"${url}\"`);\n return cacheEntry.data;\n }\n\n return null;\n }\n\n /**\n * Gets the cached entry for the specified request.\n * @param {!string} url The request URL.\n * @return {?HttpCacheEntry} The cache entry or null if no cache entry exists for this request.\n */\n getHttpCacheEntry(url: string): HttpCacheEntry | null {\n return this.cachedData[url] || null;\n }\n\n /**\n * Clears the cached entry (if exists) for the specified request.\n * @param {!string} url The request URL.\n */\n clearCache(url: string): void {\n delete this.cachedData[url];\n log.debug(`Cache cleared for key: \"${url}\"`);\n this.saveCacheData();\n }\n\n /**\n * Cleans cache entries older than the specified date.\n * @param {date=} expirationDate The cache expiration date. If no date is specified, all cache is cleared.\n */\n cleanCache(expirationDate?: Date) {\n if (expirationDate) {\n Object(this.cachedData).keys.forEach((key: string) => {\n if (expirationDate >= this.cachedData[key]?.lastUpdated) {\n delete this.cachedData[key];\n }\n });\n } else {\n this.cachedData = {};\n }\n this.saveCacheData();\n }\n\n /**\n * Sets the cache persistence policy.\n * Note that changing the cache persistence will also clear the cache from its previous storage.\n * @param {'local'|'session'=} persistence How the cache should be persisted, it can be either local or session\n * storage, or if no value is provided it will be only in-memory (default).\n */\n setPersistence(persistence?: 'local' | 'session') {\n this.cleanCache();\n this.storage = persistence === 'local' ? localStorage : persistence === 'session' ? sessionStorage : null;\n this.loadCacheData();\n }\n\n private saveCacheData() {\n if (this.storage) {\n this.storage[this.cachePersistenceKey] = JSON.stringify(this.cachedData);\n }\n }\n\n private loadCacheData() {\n const data = this.storage ? this.storage[this.cachePersistenceKey] : null;\n this.cachedData = data ? JSON.parse(data) : {};\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { HttpCacheService } from './http-cache.service';\nimport { Observable, Subscriber } from 'rxjs';\n\n/**\n * Caches HTTP requests.\n * Use ExtendedHttpClient fluent API to configure caching for each request.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CacheInterceptor implements HttpInterceptor {\n\n private forceUpdate = false;\n\n constructor(private httpCacheService: HttpCacheService) { }\n\n /**\n * Configures interceptor options\n * @param {{update: boolean}} options If update option is enabled, forces request to be made and updates cache entry.\n * @return {CacheInterceptor} The configured instance.\n */\n configure(options?: { update?: boolean } | null): CacheInterceptor {\n const instance = new CacheInterceptor(this.httpCacheService);\n if (options && options.update) {\n instance.forceUpdate = true;\n }\n return instance;\n }\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (request.method !== 'GET') {\n return next.handle(request);\n }\n\n return new Observable((subscriber: Subscriber<HttpEvent<any>>) => {\n const cachedData = this.forceUpdate ? null : this.httpCacheService.getCacheData(request.urlWithParams);\n if (cachedData !== null) {\n // Create new response to avoid side-effects\n subscriber.next(new HttpResponse(cachedData as Object));\n subscriber.complete();\n } else {\n next.handle(request)\n .subscribe(\n event => {\n if (event instanceof HttpResponse) {\n this.httpCacheService.setCacheData(request.urlWithParams, event);\n }\n subscriber.next(event);\n },\n error => subscriber.error(error),\n () => subscriber.complete()\n );\n }\n });\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ConfigService } from './config.service';\n\n/**\n * Prefixes all requests not starting with `http[s]` with `environment.serverUrl`.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ApiPrefixInterceptor implements HttpInterceptor {\n\n constructor(private configService: ConfigService) { }\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n if (!/^(http|https):/i.test(request.url)) {\n request = request.clone({ url: this.configService.getApiUrl() + request.url });\n }\n return next.handle(request);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ConfigService } from './config.service';\n\nexport interface Credentials {\n // Customize received credentials here\n user: any;\n token: any;\n}\n\n/**\n * Provides storage for authentication credentials.\n * The Credentials interface should be replaced with proper implementation.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class CredentialsService {\n\n private _credentials: Credentials | null = null;\n\n constructor(private configService: ConfigService) {\n }\n\n /**\n * Checks is the user is authenticated.\n * @return True if the user is authenticated.\n */\n get isAuthenticated(): boolean {\n return !!this.credentials;\n }\n\n /**\n * Gets the user credentials.\n * @return The user credentials or null if the user is not authenticated.\n */\n get credentials(): Credentials | null {\n if (!this._credentials) {\n this._credentials = JSON.parse(sessionStorage.getItem(this.configService.getCredentialsKey()) || localStorage.getItem(this.configService.getCredentialsKey()));\n }\n return this._credentials;\n }\n\n /**\n * Sets the user credentials.\n * The credentials may be persisted across sessions by setting the `remember` parameter to true.\n * Otherwise, the credentials are only persisted for the current session.\n * @param credentials The user credentials.\n * @param remember True to remember credentials across sessions.\n */\n setCredentials(credentials?: Credentials, remember?: boolean) {\n this._credentials = credentials || null;\n\n if (credentials) {\n (remember ? localStorage : sessionStorage).setItem(this.configService.getCredentialsKey(), JSON.stringify(credentials));\n } else {\n sessionStorage.clear();\n localStorage.clear();\n this._credentials = null;\n }\n }\n\n getAccessToken(): string | null {\n const expiration = this.credentials?.token?.expires_in || '';\n const token = this.credentials?.token?.access_token || '';\n\n if (!token || !expiration) {\n return null;\n }\n\n if (Date.now() > parseInt(expiration)) {\n this.setCredentials();\n return null;\n }\n\n return token;\n }\n\n getExpiration(): string {\n return this.credentials?.token?.expires_in || '';\n }\n\n getRefreshToken(): string {\n return this.credentials?.token?.refresh_token || '';\n }\n\n refresh(): CredentialsService {\n this._credentials = null;\n return this;\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { CredentialsService } from './credentials.service';\n\n\n/**\n * Prefixes all requests not starting with `http[s]` with `environment.serverUrl`.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class TokenInterceptor implements HttpInterceptor {\n\n constructor(private credentials: CredentialsService) { }\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n request = request.clone({\n setHeaders: {\n Authorization: `Bearer ${this.credentials.getAccessToken() || ''}`\n }\n });\n return next.handle(request);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n\n/**\n * Prefixes all requests not starting with `http[s]` with `environment.serverUrl`.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class HeaderInterceptor implements HttpInterceptor {\n\n intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {\n request = request.clone({\n setHeaders: {\n 'Content-Type': request.headers.get('Content-Type') || 'application/json',\n }\n });\n return next.handle(request);\n }\n}\n","import { Inject, Injectable, InjectionToken, Injector, Optional } from '@angular/core';\nimport { HttpClient, HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';\n\nimport { Observable } from 'rxjs';\nimport { ErrorHandlerInterceptor } from './error-handler.interceptor';\nimport { CacheInterceptor } from './cache.interceptor';\nimport { ApiPrefixInterceptor } from './api-prefix.interceptor';\nimport { TokenInterceptor } from './token.interceptor';\nimport { HeaderInterceptor } from './header.interceptor';\n\n\n// Augment HttpClient with the added configuration methods from HttpService, to allow in-place replacement of\n// HttpClient with HttpService using dependency injection\nexport interface HttpCustomClient {\n\n /**\n * Enables caching for this request.\n * @param {boolean} forceUpdate Forces request to be made and updates cache entry.\n * @return {HttpCustomClient} The new instance.\n */\n cache(forceUpdate?: boolean): HttpCustomClient;\n\n /**\n * Skips default error handler for this request.\n * @return {HttpCustomClient} The new instance.\n */\n skipErrorHandler(): HttpCustomClient;\n\n /**\n * Skips default API Prefix for this request.\n * @return {HttpCustomClient} The new instance.\n */\n skipApiPrefix(): HttpCustomClient;\n\n\n /**\n * Skips default Token Interceptor for this request.\n * @return {HttpCustomClient} The new instance.\n */\n skipToken(): HttpCustomClient;\n\n /**\n* Skips default Header Interceptor for this request.\n* @return {HttpCustomClient} The new instance.\n*/\n skipHeader(): HttpCustomClient;\n\n}\n\n\n// From @angular/common/http/src/interceptor: allows to chain interceptors\nclass HttpInterceptorHandler implements HttpHandler {\n\n constructor(private next: HttpHandler, private interceptor: HttpInterceptor) { }\n\n handle(request: HttpRequest<any>): Observable<HttpEvent<any>> {\n return this.interceptor.intercept(request, this.next);\n }\n\n}\n\n/**\n * Allows to override default dynamic interceptors that can be disabled with the HttpService extension.\n * Except for very specific needs, you should better configure these interceptors directly in the constructor below\n * for better readability.\n *\n * For static interceptors that should always be enabled (like ApiPrefixInterceptor), use the standard\n * HTTP_INTERCEPTORS token.\n */\nexport const HTTP_DYNAMIC_INTERCEPTORS = new InjectionToken<HttpInterceptor>('HTTP_DYNAMIC_INTERCEPTORS');\n\n/**\n * Extends HttpClient with per request configuration using dynamic interceptors.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class HttpService extends HttpClient implements HttpCustomClient {\n\n constructor(private httpHandler: HttpHandler,\n private injector: Injector,\n @Optional() @Inject(HTTP_DYNAMIC_INTERCEPTORS) private interceptors: HttpInterceptor[] = []) {\n super(httpHandler);\n\n if (!this.interceptors) {\n // Configure default interceptors that can be disabled here\n this.interceptors = [this.injector.get(ApiPrefixInterceptor), this.injector.get(HeaderInterceptor), this.injector.get(TokenInterceptor), this.injector.get(ErrorHandlerInterceptor)];\n }\n }\n\n cache(forceUpdate?: boolean): HttpService {\n const cacheInterceptor = this.injector.get(CacheInterceptor).configure({ update: forceUpdate });\n return this.addInterceptor(cacheInterceptor);\n }\n\n skipErrorHandler(): HttpService {\n return this.removeInterceptor(ErrorHandlerInterceptor);\n }\n\n skipApiPrefix(): HttpService {\n return this.removeInterceptor(ApiPrefixInterceptor);\n }\n\n skipToken(): HttpService {\n return this.removeInterceptor(TokenInterceptor);\n }\n\n skipHeader(): HttpService {\n return this.removeInterceptor(HeaderInterceptor);\n }\n\n // Override the original method to wire interceptors when triggering the request.\n request(method?: any, url?: any, options?: any): any {\n const handler = this.interceptors.reduceRight(\n (next, interceptor) => new HttpInterceptorHandler(next, interceptor),\n this.httpHandler\n );\n return new HttpClient(handler).request(method, url, options);\n }\n\n private removeInterceptor(interceptorType: Function): HttpService {\n return new HttpService(\n this.httpHandler,\n this.injector,\n this.interceptors.filter(i => !(i instanceof interceptorType))\n );\n }\n\n private addInterceptor(interceptor: HttpInterceptor): HttpService {\n return new HttpService(\n this.httpHandler,\n this.injector,\n this.interceptors.concat([interceptor])\n );\n }\n\n}\n","import { Injectable } from '@angular/core';\nimport { HttpService } from '../core/http.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class EntityFileService {\n\n constructor(private http: HttpService) { }\n\n getEntityFiles(filters: any) {\n return this.http.get(`api/entity-files`, { params: filters }).toPromise();\n }\n\n createEntityFile(model: any) {\n return this.http.post(\"api/entity-files\", model).toPromise();\n }\n\n updateEntityFile(model: any) {\n return this.http.put(`api/entity-files/${model.id}`, model).toPromise();\n }\n\n deleteEntityFile(model: any) {\n return this.http.delete(`api/entity-files/${model.id}`).toPromise();\n }\n\n uploadEntityFile(file: File, params?: any) {\n const formData: FormData = new FormData();\n formData.append(\"fileData\", file, file.name);\n if (params?.entity_id) {\n formData.append('entity_id', params.entity_id);\n formData.append('entity_type', params.entity_type);\n }\n return this.http\n .skipHeader()\n .post(\n \"api/entity-files-upload\",\n formData,\n ).toPromise();\n }\n}\n","import { Injectable } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FormValidatorService {\n\n constructor() { }\n\n /**Method to evaluate form fields*/\n isFieldValid(field: string, formGroup: FormGroup | any, firstAttempt?: boolean) {\n return (!formGroup.get(field).valid && formGroup.get(field).touched) ||\n (!formGroup.get(field).valid && formGroup.get(field).untouched && firstAttempt);\n }\n\n /**Method to find error in form fields*/\n getErrorMessage(field: string, formGroup: FormGroup | any, errorMessages: any, errorField?: string) {\n const error = Object.keys(formGroup.get(field).errors);\n return (error.length > 0) ? (errorMessages[errorField || field][error[0]] ? errorMessages[errorField || field][error[0]] : '') : '';\n }\n\n}\n","import { Component, OnInit, Inject } from \"@angular/core\";\nimport { MatDialogRef, MAT_DIALOG_DATA } from \"@angular/material/dialog\";\nimport { FormGroup, FormBuilder, Validators } from \"@angular/forms\";\nimport { EntityFileService } from '../entity-file.service';\nimport { FileDropperConfig } from '../../file-dropper/file-dropper.model';\nimport { ViewerConfig } from '../../document-viewer/viewer-config.model';\nimport { FormValidatorService } from '../../core/form-validator.service';\nimport { AlertService } from \"../../core/alert.service\";\n\nconst errorMessages: any = {\n url: {\n required: \"File is required\"\n },\n};\n\n@Component({\n selector: 'entity-file-form',\n templateUrl: './entity-file-form.component.html',\n styleUrls: ['./entity-file-form.component.css']\n})\nexport class EntityFileFormComponent implements OnInit {\n\n entityFileGroup: FormGroup;\n assignmentFileFirstAttempt: boolean;\n updateMode: boolean;\n fileConfig: FileDropperConfig;\n fileList: any[] = [];\n viewerConfig: ViewerConfig;\n hideTitleAndDetails: boolean;\n\n /**\n * Should we allow tagging entity-files?\n */\n useTechlifyTags: boolean = false;\n\n constructor(\n public dialogRef: MatDialogRef<EntityFileFormComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private formValidatorService: FormValidatorService,\n private fb: FormBuilder,\n private entityFileService: EntityFileService,\n private alertService: AlertService\n ) {\n this.createForm();\n }\n\n /** Method to create a form **/\n private createForm() {\n //TODO: Finialize and add more validations.\n this.entityFileGroup = this.fb.group({\n id: [''],\n title: [''],\n details: [''],\n entity_type: [''],\n entity_id: [],\n file: ['', Validators.required],\n url: ['', Validators.required],\n file_size: ['', Validators.required],\n tag_ids: [[]]\n });\n }\n\n ngOnInit(): void {\n if (this.data.entity) {\n this.entityFileGroup.get('entity_type').setValue(this.data.entity.entity_type);\n this.entityFileGroup.get('entity_id').setValue(this.data.entity.entity_id);\n }\n if (this.data.file) {\n this.updateMode = true;\n this.entityFileGroup.patchValue(this.data.file);\n }\n\n if (this.data?.hideTitleAndDetails) {\n this.hideTitleAndDetails = this.data?.hideTitleAndDetails;\n }\n\n if (this.data?.useTechlifyTags) {\n this.useTechlifyTags = this.data?.useTechlifyTags;\n }\n\n //File dropper config\n this.fileConfig = {\n fileId: \"subjectFile\",\n containerId: \"subjectFileContainer\",\n styles: {\n height: \"200px\"\n },\n multiple: false,\n acceptFile: \"*\",\n maxSize: 10,\n acceptFileText: \"All Files\"\n };\n\n this.viewerConfig = {\n viewerStyle: {\n height: '200px',\n width: '100%'\n }\n }\n }\n\n\n //Method to trigger submit\n async submit() {\n this.assignmentFileFirstAttempt = true;\n if (!this.entityFileGroup.valid) {\n return;\n }\n const model = this.entityFileGroup.value;\n\n if (this.hideTitleAndDetails) {\n model.title = model.file;\n }\n model.tag_ids = model.tag_ids.toString();\n\n const result: any = this.updateMode\n ? await this.entityFileService.updateEntityFile(model)\n : await this.entityFileService.createEntityFile(model);\n this.dialogRef.close(result.item);\n this.alertService.addAlert(\n \"File submitted successfully\",\n \"success\"\n );\n\n }\n\n async fileChanged(event: any) {\n this.fileList = event;\n\n if (this.fileList.length > 0) {\n\n const result: any = await this.entityFileService.uploadEntityFile(\n this.fileList[0],\n );\n this.entityFileGroup.patchValue(result.item);;\n this.fileList = [];\n }\n }\n\n\n async removeFile() {\n if (this.entityFileGroup.value.file) {\n try {\n this.entityFileGroup.patchValue({\n file: \"\",\n url: \"\"\n });\n } catch (error) {\n this.alertService.addAlert(\"Unable to remove file, try later\", \"warn\");\n }\n }\n }\n\n /**Method to evaluate form fields*/\n isFieldValid(field: string) {\n return this.formValidatorService.isFieldValid(\n field,\n this.entityFileGroup,\n this.assignmentFileFirstAttempt\n );\n }\n\n /**Method to find error in form fields*/\n getErrorMessage(field: string) {\n return this.formValidatorService.getErrorMessage(\n field,\n this.entityFileGroup,\n errorMessages\n );\n }\n\n}\n","import { Component, OnInit, Input } from '@angular/core';\nimport { Location } from '@angular/common';\nimport { MatDialog } from '@angular/material/dialog';\nimport { EntityFileFormComponent } from './entity-file-form/entity-file-form.component';\nimport { EntityFileService } from './entity-file.service';\nimport { ActionPopup } from '../action-popup/action-popup.model';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\nimport { debounceTime } from 'rxjs/operators';\nimport { AlertService } from '../core/alert.service';\nimport { ActionPopupComponent } from '../action-popup/action-popup.component';\nimport { ViewerConfig } from '../document-viewer/viewer-config.model';\nimport { FileDropperConfig } from '../file-dropper';\n\n\n@UntilDestroy()\n@Component({\n selector: 'app-entity-files-view-all',\n templateUrl: './entity-files-view-all.component.html',\n styleUrls: ['./entity-files-view-all.component.css']\n})\nexport class EntityFilesViewAllComponent implements OnInit {\n @Input() entityId: number;\n @Input() entityType: string;\n @Input() viewOnly: boolean = false;\n @Input() removeSearch: boolean;\n @Input() hideTitleAndDetails: boolean;\n @Input() displayMode: boolean;\n @Input() allowMultipleFiles: boolean = false;\n\n /**\n * Should we allow tagging entity-files?\n */\n @Input() useTechlifyTags: boolean = false;\n\n viewerConfig: ViewerConfig;\n @Input() title: string = \"File\";\n filters: any = {};\n entityFiles: any[] = [];\n displayedColumns = [\n 'index',\n 'title',\n 'details',\n 'file_size',\n 'uploaded_on',\n ];\n isWorking: boolean = false;\n page: number = 1;\n perPage: number = 25;\n lastPage: number = 0;\n fileConfig: FileDropperConfig;\n fileList: any[] = [];\n filterFormGroup: FormGroup;\n\n constructor(\n private entityFileService: EntityFileService,\n public location: Location,\n private alertService: AlertService,\n private dialog: MatDialog,\n private fb: FormBuilder,\n ) {\n this.filterFormGroup = this.fb.group({\n title: [\"\"],\n tag_ids: [\"\"]\n });\n }\n\n ngOnInit(): void {\n //File dropper config\n this.fileConfig = {\n fileId: \"entityDashboardDropper\",\n containerId: \"entityDashboardDropperContainer\",\n styles: {\n height: \"500px\"\n },\n multiple: this.allowMultipleFiles,\n acceptFile: \"*\",\n maxSize: 10,\n acceptFileText: \"All Files\"\n };\n\n this.viewerConfig = {\n imageStyle: {\n height: '200px',\n width: '200px'\n },\n viewerStyle: {\n height: ' 160px',\n width: '200px'\n },\n hideRemove: true\n };\n\n if (this.hideTitleAndDetails) {\n this.displayedColumns = this.displayedColumns.filter(x => (x !== 'details') && (x !== 'title'));\n }\n this.listenRoutes();\n this.filters = {\n entity_type: this.entityType,\n entity_id: this.entityId,\n title: \"\"\n };\n this.fetchEntityFilesDetails();\n if (this.useTechlifyTags) {\n this.displayedColumns.push('tag');\n }\n if (!this.viewOnly) {\n this.displayedColumns.push('actions');\n }\n }\n\n listenRoutes() {\n this.filterFormGroup.valueChanges.pipe(debounceTime(500), untilDestroyed(this))\n .subscribe(changes => {\n this.reload();\n });\n }\n\n async fetchEntityFilesDetails() {\n this.filters.page = this.page;\n this.filters.perPage = this.perPage;\n let formGroup = this.filterFormGroup.value;\n formGroup.tag_ids = formGroup.tag_ids.toString();\n this.filters = {\n ...this.filters,\n ...formGroup\n }\n this.isWorking = true;\n const result: any = await this.entityFileService.getEntityFiles(this.filters);\n this.lastPage = result.last_page || this.page;\n this.entityFiles = this.entityFiles.concat(result.data);\n this.isWorking = false;\n }\n\n addEntityFile() {\n this.isWorking = true;\n const dialogRef = this.dialog.open(EntityFileFormComponent, {\n width: \"700px\",\n data: {\n entity: this.filters,\n hideTitleAndDetails: this.hideTitleAndDetails,\n useTechlifyTags: this.useTechlifyTags,\n },\n autoFocus: false,\n restoreFocus: false\n });\n\n dialogRef.afterClosed().subscribe(async result => {\n this.isWorking = false;\n if (result) {\n const files = [...this.entityFiles];\n files.push(result);\n this.entityFiles = files;\n }\n });\n }\n\n editEntityFile(file: any) {\n this.isWorking = true;\n const dialogRef = this.dialog.open(EntityFileFormComponent, {\n width: \"700px\",\n autoFocus: false,\n data: {\n file: file,\n hideTitleAndDetails: this.hideTitleAndDetails,\n useTechlifyTags: this.useTechlifyTags,\n } // Any data passed here will be injected into the model\n });\n\n dialogRef.afterClosed().subscribe(result => {\n this.isWorking = false;\n if (result) {\n this.reload();\n }\n });\n }\n\n deleteEntityFile(file: any) {\n const dialogRef = this.dialog.open(ActionPopupComponent, {\n width: \"400px\",\n data: <ActionPopup>{\n title: \"Delete File\",\n message: `Are you sure to proceed delete the file ${file.title}?`\n },\n autoFocus: false\n });\n\n dialogRef.afterClosed().subscribe(async result => {\n if (result) {\n //Action confirmed\n const result = await this.entityFileService.deleteEntityFile(\n file\n );\n this.alertService.addAlert(\n \"File successfully deleted\",\n \"success\"\n );\n this.reload();\n\n }\n });\n }\n\n onScroll() {\n if (this.page < this.lastPage && !this.isWorking) {\n this.page += 1;\n this.fetchEntityFilesDetails();\n }\n }\n\n reload() {\n this.entityFiles = [];\n this.page = 1;\n if (!this.isWorking) {\n this.fetchEntityFilesDetails();\n }\n }\n\n ngOnDestroy() { }\n\n resetFieldValue(event: any, field: any) {\n event.stopPropagation();\n this.filterFormGroup.get(field).setValue(\"\");\n }\n\n sizeOf(bytes) {\n if (!bytes) { return \"0.00 B\"; }\n var e = Math.floor(Math.log(bytes) / Math.log(1024));\n return (bytes / Math.pow(1024, e)).toFixed(2) + ' ' + ' KMGTP'.charAt(e) + 'B';\n }\n\n async fileChanged(event: any) {\n this.fileList = event;\n if (this.fileList.length > 0) {\n await this.fileList.forEach(async file => {\n const result: any = await this.entityFileService.uploadEntityFile(\n file,\n {\n entity_type: this.entityType,\n entity_id: this.entityId,\n }\n );\n this.reload();\n });\n this.fileList = [];\n this.alertService.addAlert('Successfull uploaded', 'success');\n }\n }\n}\n","import { Component, OnInit, Input, Output, EventEmitter } from \"@angular/core\";\nimport { AlertService } from \"../core/alert.service\";\nimport { FileDropperConfig } from './file-dropper.model';\n\n\n@Component({\n selector: \"app-file-dropper\",\n templateUrl: \"./file-dropper.component.html\",\n styleUrls: [\"./file-dropper.component.scss\"]\n})\nexport class FileDropperComponent implements OnInit {\n @Input() fileArray: any[] = [];\n\n @Input() config: FileDropperConfig;\n\n @Output() fileChanged: any = new EventEmitter();\n\n border = \"1px dashed #989898\";\n\n @Input() styles: any;\n\n isSingleMode: boolean;\n\n constructor(private alertService: AlertService) { }\n\n /**Life cycle hook method */\n ngOnInit() {\n this.isSingleMode = !Boolean(this.config.multiple);\n }\n\n /**Method for dragging event */\n dragEnter(event: any) {\n event.target.style.background = this.config.dragColor || \"#c0c0c0\";\n\n event.target.style.border = \"1px dashed black\";\n\n event.preventDefault();\n }\n\n /**Method for drag over event */\n dragOver(event: any) {\n event.preventDefault();\n }\n\n /**Method for drag leave event */\n dragLeave(event: any) {\n event.target.style.background = \"\";\n event.target.style.border = this.border;\n\n event.preventDefault();\n }\n\n /**Method for drop event */\n dropEvent(event: any) {\n event.target.style.background = \"\";\n event.target.style.border = this.border;\n const droppedFiles: FileList = event.dataTransfer.files;\n if (droppedFiles.length > 0) {\n const fileArray = Array.from(droppedFiles);\n this.addFiles(fileArray);\n }\n event.preventDefault();\n }\n\n /**Method to list files selected */\n onFileChange(event: any) {\n if (event.target.files && event.target.files.length) {\n const fileArray = Array.from(event.target.files);\n this.addFiles(fileArray);\n const fileInput = document.getElementById(\n this.config.fileId\n ) as HTMLInputElement;\n fileInput.value = \"\";\n }\n }\n\n /**Method to add files in the array */\n addFiles(fileArray: any) {\n if (!this.isSingleMode) {\n fileArray.forEach((file: any) => {\n this.fileArray = this.fileArray.filter(\n (item: any) => item.name !== file.name\n );\n if (this.fileSizeAllowed(file)) {\n this.fileArray.push(file);\n }\n });\n\n this.fileArray.sort(this.sortFiles);\n this.fileChanged.emit(this.fileArray);\n } else {\n // Single Mode\n if (this.fileArray.length === 0) {\n if (this.fileSizeAllowed(fileArray[0])) {\n this.fileArray.push(fileArray[0]);\n this.fileArray.sort(this.sortFiles);\n this.fileChanged.emit(this.fileArray);\n }\n }\n }\n }\n\n /**Method to sort the files in asc */\n sortFiles(a: any, b: any) {\n const nameA = a.name.toUpperCase();\n const nameB = b.name.toUpperCase();\n if (nameA < nameB) {\n return -1;\n }\n if (nameA > nameB) {\n return 1;\n }\n\n return 0;\n }\n\n /**Method tp validate the file size */\n fileSizeAllowed(file: any): boolean {\n if (!Boolean(this.config.maxSize)) {\n return true;\n } else if (file.size / (1024 * 1024) < this.config.maxSize) {\n return true;\n } else {\n this.alertService.addAlert(\n `The size of the file exceeds the limit ${this.config.maxSize} MB, kindly upload a file with size ${this.config.maxSize} MB or below`,\n \"warn\"\n );\n return false;\n }\n }\n\n /**Method invokes when the drop box is clicked to upload the file */\n clickEvent(event: any) {\n if (!(this.isSingleMode && this.fileArray.length > 0)) {\n document.getElementById(this.config.fileId).click();\n }\n event.preventDefault();\n }\n}\n","export class FileDropperConfig {\n containerId: string;\n fileId: string;\n styles?: any;\n multiple?: boolean;\n dragColor?: boolean;\n acceptFile: string; // use '*' to accept all file types.\n maxSize?: number; // size in MB\n acceptFileText?: string;\n}\n","import { Injectable } from '@angular/core';\nimport { HttpService } from '../core/http.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NoteService {\n\n constructor(private http: HttpService) { }\n\n getNotes(filterModel: any) {\n return this.http.get('api/notes', { params: filterModel }).toPromise();\n }\n\n addNote(note: any) {\n return this.http.post('api/notes', note).toPromise();\n }\n\n editNote(note: any) {\n return this.http.put(`api/notes/${note.id}`, note).toPromise();\n }\n\n deleteNote(note: any) {\n return this.http.delete(`api/notes/${note.id}`).toPromise();\n }\n}\n","import { Component, OnInit, Inject } from \"@angular/core\";\nimport { FormGroup, FormBuilder, Validators } from \"@angular/forms\";\nimport { MatDialogRef, MAT_DIALOG_DATA } from \"@angular/material/dialog\";\nimport { NoteService } from \"../note.service\";\nimport { FormValidatorService } from '../../core/form-validator.service';\nimport { AlertService } from \"../../core/alert.service\";\n\nconst errorMessages: any = {\n note: {\n required: \"Note is required\"\n }\n};\n\n@Component({\n selector: 'app-note-form',\n templateUrl: './note-form.component.html',\n styleUrls: ['./note-form.component.css']\n})\nexport class NoteFormComponent implements OnInit {\n\n updateMode: boolean;\n noteFormGroup: FormGroup;\n noteFormFirstAttempt: boolean;\n\n constructor(\n public dialogRef: MatDialogRef<NoteFormComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private fb: FormBuilder,\n private formValidatorService: FormValidatorService,\n private alertService: AlertService,\n private noteService: NoteService\n ) {\n this.createForm();\n }\n\n /** Method to create a form **/\n private createForm() {\n //TODO: Finialize and add more validations.\n this.noteFormGroup = this.fb.group({\n id: [\"\"],\n note: [\"\", Validators.compose([Validators.required])],\n model_type: [\"\"],\n related_model_id: [\"\"],\n });\n }\n\n ngOnInit() {\n if (this.data.update) {\n this.updateMode = true;\n }\n this.noteFormGroup.patchValue(this.data.note);\n }\n\n //Method to trigger login\n async submit() {\n this.noteFormFirstAttempt = true;\n if (this.noteFormGroup.valid) {\n const model = this.noteFormGroup.value;\n const result = this.updateMode\n ? await this.noteService.editNote(model)\n : await this.noteService.addNote(model);\n\n this.alertService.addAlert(\n `${this.data?.labelText} saved successfully`,\n \"success\"\n );\n this.dialogRef.close(result);\n }\n }\n\n cancel() {\n this.dialogRef.close();\n }\n\n /**Method to evaluate form fields*/\n isFieldValid(field: string) {\n return this.formValidatorService.isFieldValid(\n field,\n this.noteFormGroup,\n this.noteFormFirstAttempt\n );\n }\n\n /**Method to find error in form fields*/\n getErrorMessage(field: string) {\n return this.formValidatorService.getErrorMessage(\n field,\n this.noteFormGroup,\n errorMessages\n );\n }\n\n}\n","import { Component, OnInit, Input } from '@angular/core';\nimport { NoteService } from '../note.service';\nimport { MatDialog } from '@angular/material/dialog';\nimport { NoteFormComponent } from '../note-form/note-form.component';\nimport { ActionPopupComponent } from '../../action-popup/action-popup.component';\nimport { ActionPopup } from '../../action-popup/action-popup.model';\n\n@Component({\n selector: 'app-note-list',\n templateUrl: './note-list.component.html',\n styleUrls: ['./note-list.component.css']\n})\nexport class NoteListComponent implements OnInit {\n\n @Input() relatedModelId !: any;\n @Input() modelType !: any;\n @Input() readonly: boolean = false;\n @Input() labelText: string = 'Note';\n @Input() commentsView: boolean = false;\n\n notes: any[] = [];\n filters: any;\n displayedColumns = [\n 'index',\n 'note',\n 'actions'\n ];\n\n page = 1;\n lastPage = 1;\n\n constructor(private noteService: NoteService,\n private dialog: MatDialog\n ) {\n this.filters = {};\n this.filters.sort_by = \"created_at|DESC\";\n }\n\n ngOnInit() {\n if (this.readonly) {\n this.displayedColumns = this.displayedColumns.filter(x => x !== 'actions');\n }\n this.filters.related_model_id = this.relatedModelId;\n this.filters.model_type = this.modelType;\n this.loadData();\n }\n\n async loadData() {\n\n const result: any = await this.noteService.getNotes({ ...this.filters, page: this.page });\n this.notes = this.notes.concat(result.data);\n this.page = result.current_page;\n this.lastPage = result.last_page;\n }\n\n addNote() {\n const dialogRef = this.dialog.open(NoteFormComponent, {\n width: \"400px\",\n data: {\n note: { related_model_id: this.relatedModelId, model_type: this.modelType },\n labelText: this.labelText,\n },\n autoFocus: false\n });\n\n dialogRef.afterClosed().subscribe(result => {\n if (result) {\n this.resetScroll();\n this.loadData();\n }\n });\n }\n\n editNote(note: any) {\n const dialogRef = this.dialog.open(NoteFormComponent, {\n width: \"400px\",\n data: {\n note: note,\n update: true,\n labelText: this.labelText\n },\n autoFocus: false\n });\n\n dialogRef.afterClosed().subscribe(result => {\n if (result) {\n this.resetScroll();\n this.loadData();\n }\n });\n }\n\n async deleteNote(note: any) {\n const dialogRef = this.dialog.open(ActionPopupComponent, {\n width: \"400px\",\n data: <ActionPopup>{\n title: `Delete ${this.labelText}`,\n message: `Are you sure to delete?`\n },\n autoFocus: false\n });\n\n dialogRef.afterClosed().subscribe(async result => {\n if (result) {\n //Action confirmed\n\n const result = await this.noteService.deleteNote(note);\n this.notes = this.notes.filter((item: any) => item.id !== note.id);\n\n }\n });\n }\n\n resetScroll() {\n this.page = 1;\n this.lastPage = 1;\n this.notes = [];\n }\n\n onScroll() {\n if (this.page < this.lastPage) {\n this.page += 1;\n this.loadData();\n }\n }\n\n commentAction(event: any) {\n if (event.type === \"save\") {\n if (event.value.id) {\n this.editComment(event.value);\n return;\n }\n this.addComment(event.value);\n return;\n }\n this.deleteNote(event.value);\n }\n\n async editComment(comment: any) {\n const result: any = await this.noteService.editNote(comment);\n let index = this.notes.findIndex(\n (x: any) => x.id === comment.id\n );\n if (index !== -1) {\n this.notes[index] = result.item;\n }\n }\n\n async addComment(comment: any) {\n comment.related_model_id = this.relatedModelId;\n comment.model_type = this.modelType;\n const result: any = await this.noteService.addNote(comment);\n this.notes.push(result.item);\n }\n\n}\n","import {\n Component,\n OnInit,\n Input,\n Output,\n EventEmitter,\n OnDestroy\n} from \"@angular/core\";\nimport { FormGroup, FormBuilder } from \"@angular/forms\";\nimport { CredentialsService } from \"../../core/credentials.service\";\n\n@Component({\n selector: \"app-comment-form\",\n templateUrl: \"./comment-form.component.html\",\n styleUrls: [\"./comment-form.component.scss\"]\n})\nexport class CommentFormComponent implements OnInit, OnDestroy {\n commentFormGroup: FormGroup;\n view: boolean;\n _commentData: any;\n\n @Input() set commentData(data: any) {\n this.view = !!data;\n this._commentData = data;\n this.commentFormGroup.patchValue(data);\n }\n\n @Output() action = new EventEmitter();\n\n constructor(private fb: FormBuilder,\n private credentialService: CredentialsService\n ) {\n this.createForm();\n }\n\n ngOnInit() { }\n\n get isLoggedIn() {\n return this.credentialService.isAuthenticated;\n }\n\n get currentUser() {\n return this.credentialService.credentials.user;\n }\n\n private createForm() {\n //TODO: Finialize and add more validations.\n this.commentFormGroup = this.fb.group({\n id: [\"\"],\n note: [\"\"],\n model_type: [\"\"],\n related_model_id: [\"\"],\n });\n }\n\n submit() {\n if (this.commentFormGroup.get(\"note\").value) {\n if (this._commentData) {\n this.view = !this.view;\n }\n this.action.emit({ type: \"save\", value: this.commentFormGroup.value });\n this.commentFormGroup.reset();\n } else if (this.commentFormGroup.get(\"id\").value) {\n this.deleteComment();\n }\n }\n\n hideEdit() {\n if (this.commentFormGroup.get(\"id\").value) {\n this.view = !this.view;\n }\n }\n\n editComment() {\n this.view = !this.view;\n this.commentFormGroup.patchValue(this._commentData);\n }\n\n deleteComment() {\n this.action.emit({ type: \"delete\", value: this.commentFormGroup.value });\n }\n\n ngOnDestroy() { }\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, ElementRef, Input, OnDestroy, OnInit, Optional, Self, Output, EventEmitter, TemplateRef } from '@angular/core';\nimport { FormBuilder, FormGroup, ControlValueAccessor, NgControl, Validators } from '@angular/forms';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { Subject, of, from } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, startWith, switchMap, finalize } from 'rxjs/operators';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ComponentType } from '@angular/cdk/portal';\nimport { HttpService } from '../core/http.service';\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\n\n@UntilDestroy()\n@Component({\n selector: 'app-searchable-selector',\n templateUrl: './searchable-selector.component.html',\n styleUrls: ['./searchable-selector.component.scss'],\n providers: [\n {\n provide: MatFormFieldControl,\n useExisting: SearchableSelectorComponent\n }\n ]\n})\nexport class SearchableSelectorComponent implements ControlValueAccessor, OnInit, OnDestroy {\n\n @Input() valueField: string = 'id';\n @Input() titleField: string = 'title';\n @Input() apiUrl!: string;\n @Input() multiple: boolean = false;\n @Input() selectedValue: any;\n @Output() selectedValueChange = new EventEmitter();\n @Input() enableSearch: boolean = true;\n @Input() add: boolean = false;\n @Input() addConfig: any;\n @Input() edit: boolean = false;\n @Input() editConfig: any;\n @Input() sort: boolean = true;\n @Input() sortBy: string;\n @Input() searchField: string;\n @Input() itemComponent: ComponentType<unknown> | TemplateRef<unknown>;\n @Input() items: any[] = [];\n @Input() apiDataProperty: string = 'data';\n @Input() cache: boolean = false;\n @Input() perPage: number = 25;\n @Input() inDataSearch: boolean = false;\n @Output() selectionChange = new EventEmitter();\n @Output() itemsChange = new EventEmitter();\n\n\n isLoading: boolean = false;\n onChange: any = () => { };\n onTouched: any = () => { };\n static nextId = 0;\n selectorForm: FormGroup;\n stateChanges = new Subject<void>();\n focused = false;\n controlType = 'searchable-selctor';\n id = `searchable-selctor-${SearchableSelectorComponent.nextId++}`;\n describedBy = '';\n filters: any;\n cachedItems: any[] = [];\n\n\n get empty() {\n const { value: { select_value } } = this.selectorForm;\n return !select_value;\n }\n\n get shouldLabelFloat() { return this.focused || !this.empty; }\n\n\n @Input()\n get required(): boolean { return this._required; }\n set required(value: boolean) {\n this.selectorForm.get('select_value').setValidators(Validators.required);\n this._required = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n private _required = false;\n\n @Input()\n get disabled(): boolean { return this._disabled; }\n set disabled(value: boolean) {\n this._disabled = coerceBooleanProperty(value);\n this._disabled ? this.selectorForm.disable() : this.selectorForm.enable();\n this.stateChanges.next();\n }\n private _disabled = false;\n\n @Input()\n get value(): any {\n if (this.selectorForm.valid) {\n return this.selectorForm.value.select_value;\n }\n return '';\n }\n set value(data: any) {\n this.selectorForm.patchValue({ select_value: data || '' });\n this.stateChanges.next();\n }\n\n constructor(\n formBuilder: FormBuilder,\n private _focusMonitor: FocusMonitor,\n private http: HttpService,\n private _elementRef: ElementRef<HTMLElement>,\n private dialog: MatDialog,\n @Optional() @Self() public ngControl: NgControl) {\n\n this.selectorForm = formBuilder.group({\n select_value: [null],\n search: ''\n });\n\n _focusMonitor.monitor(_elementRef, true).subscribe(origin => {\n if (this.focused && !origin) {\n this.onTouched();\n }\n this.focused = !!origin;\n this.stateChanges.next();\n });\n\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n openedChange(event: any) {\n if (this.dataItems.length === 0 && this.selectorForm.get('search').value) {\n this.selectorForm.get('search').setValue('');\n }\n }\n\n get dataItems(): any[] {\n let items: any[] = [];\n if (this.multiple && this.selectedValue && (this.selectedValue.length > 0))\n items = [...this.selectedValue, ...this.items];\n else if ((!this.multiple) && this.selectedValue)\n items = [this.selectedValue, ...this.items];\n else\n items = this.items;\n items = items.filter((v, i, a) => a.findIndex(v => v[this.valueField] === a[i][this.valueField]) === i);\n //Emit the items to any child component\n this.itemsChange.emit(items);\n return items;\n }\n\n ngOnInit() {\n this.selectorForm.get('search').valueChanges\n .pipe(\n debounceTime(500),\n distinctUntilChanged(),\n untilDestroyed(this)\n ).subscribe(value => {\n if (this.enableSearch)\n this.search(value);\n });\n\n this.filters = {\n perPage: this.perPage,\n search: '',\n page: 1,\n lastPage: 1\n }\n if (this.sort) {\n this.filters.sort_by = this.sortBy || `${this.titleField}|asc`;\n }\n\n //Fetch Items only if it is not present, can be used in places where we load many entries.\n if (this.items.length === 0) {\n this.fetchItemList();\n }\n }\n\n fetchItemList() {\n this.isLoading = true;\n let request = this.http.get(this.apiUrl, { params: this.filters })\n if (this.cache) {\n request = this.http.cache().get(this.apiUrl, { params: this.filters })\n }\n of().pipe(\n startWith(true),\n switchMap((_) => from(request)),\n finalize(() => this.isLoading = false),\n untilDestroyed(this)\n ).subscribe((result: any) => {\n this.items = this.items.concat(result[this.apiDataProperty]);\n if (this.cache) {\n this.cachedItems = this.items;\n }\n this.filters.page = result?.current_page || 1;\n this.filters.lastPage = result?.last_page || 1;\n });\n }\n\n\n setDescribedByIds(ids: string[]) {\n this.describedBy = ids.join(' ');\n }\n\n onContainerClick(event: MouseEvent) {\n event.stopPropagation();\n }\n\n writeValue(data: any): void {\n this.value = data;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n getPropertyValue(ele: any, keyString: string) {\n keyString = keyString.replace(/\\[(\\w+)\\]/g, \".$1\"); // convert indexes to properties\n keyString = keyString.replace(/^\\./, \"\"); // strip a leading dot\n const keyList = keyString.split(\".\");\n for (let i = 0, n = keyList.length; i < n; ++i) {\n const key = keyList[i];\n if (ele && key in ele) {\n ele = ele[key];\n } else {\n return;\n }\n }\n return ele;\n }\n\n _handleInput(): void {\n this.onChange(this.value);\n if (this.multiple)\n this.selectedValue = (this.value as []).map(x => this.dataItems.find(y => y[this.valueField] === x));\n else\n this.selectedValue = this.dataItems.find(x => x[this.valueField] === this.value);\n this.selectedValueChange.emit(this.selectedValue);\n this.selectionChange.emit(this.value);\n }\n\n get errorState(): boolean {\n return (this.ngControl && this.ngControl.invalid && (this.ngControl.touched || this.ngControl.dirty));\n }\n\n static ngAcceptInputType_disabled: boolean | string | null | undefined;\n static ngAcceptInputType_required: boolean | string | null | undefined;\n\n onScroll() {\n if (this.filters.lastPage > this.filters.page) {\n this.filters.page += 1;\n this.fetchItemList();\n }\n }\n\n reloadData() {\n this.items = [];\n this.filters.page = 1;\n this.filters.lastPage = 1;\n this.fetchItemList();\n }\n\n search(event: any) {\n if (this.searchField) {\n this.filters[this.searchField] = event;\n } else {\n this.filters.search = event;\n }\n // we need search field to search in data\n if (this.inDataSearch && this.searchField) {\n this.filterItems(event);\n } else {\n this.reloadData();\n }\n }\n\n filterItems(event: string) {\n if (event) {\n this.items = this.cachedItems.filter((value: any) => {\n return (value[this.searchField] as string).toLowerCase().search(event.toLowerCase()) != -1\n })\n } else {\n this.items = this.cachedItems;\n }\n }\n\n addItem(event: any) {\n const dialogRef = this.dialog.open(this.itemComponent, {\n width: '400px',\n autoFocus: false,\n data: {},\n ...this.addConfig\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n if (result) {\n this.items.push(result.item);\n this.selectorForm.get('select_value').setValue(result.item[this.valueField]);\n this._handleInput();\n }\n });\n event.stopPropagation();\n }\n\n editItem(event: any) {\n const dialogRef = this.dialog.open(this.itemComponent, {\n width: '400px',\n autoFocus: false,\n data: {\n item: this.selectedValue\n },\n ...this.editConfig\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n if (result) {\n this.items = this.items.filter(x => x[this.valueField] !== this.selectedValue[this.valueField]);\n this.items.push(result.item);\n this.selectedValue = null;\n this.selectorForm.get('select_value').setValue(result.item[this.valueField]);\n this._handleInput();\n }\n });\n event.stopPropagation();\n }\n\n ngOnDestroy() {\n this.stateChanges.complete();\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n}\n","import { AfterViewInit, Directive, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output } from '@angular/core';\nimport { MatSelect, SELECT_ITEM_HEIGHT_EM } from '@angular/material/select';\nimport { debounceTime, takeUntil, tap } from 'rxjs/operators';\nimport { fromEvent, Subject } from 'rxjs';\n\n@Directive({\n selector: '[msInfiniteScroll]'\n})\nexport class MatSelectInfiniteScrollDirective implements OnInit, OnDestroy, AfterViewInit {\n\n @Input() threshold = '15%';\n @Input() debounceTime = 150;\n @Input() complete: boolean;\n @Output() infiniteScroll = new EventEmitter<void>();\n\n private panel: Element;\n private thrPx = 0;\n private thrPc = 0;\n private singleOptionHeight = SELECT_ITEM_HEIGHT_EM;\n\n private destroyed$ = new Subject<boolean>();\n\n constructor(private matSelect: MatSelect, private ngZone: NgZone) {\n }\n\n ngOnInit() {\n this.evaluateThreshold();\n }\n\n ngAfterViewInit() {\n this.matSelect.openedChange.pipe(\n takeUntil(this.destroyed$)\n ).subscribe((opened) => {\n if (opened) {\n this.panel = this.matSelect.panel.nativeElement;\n this.singleOptionHeight = this.getSelectItemHeightPx();\n this.registerScrollListener();\n }\n });\n }\n\n ngOnDestroy() {\n this.destroyed$.next(true);\n this.destroyed$.complete();\n }\n\n evaluateThreshold() {\n if (this.threshold.lastIndexOf('%') > -1) {\n this.thrPx = 0;\n this.thrPc = (parseFloat(this.threshold) / 100);\n\n } else {\n this.thrPx = parseFloat(this.threshold);\n this.thrPc = 0;\n }\n }\n\n registerScrollListener() {\n fromEvent(this.panel, 'scroll').pipe(\n takeUntil(this.destroyed$),\n debounceTime(this.debounceTime),\n tap((event) => {\n this.handleScrollEvent(event);\n })\n ).subscribe();\n }\n\n handleScrollEvent(event) {\n this.ngZone.runOutsideAngular(() => {\n if (this.complete) {\n return;\n }\n const countOfRenderedOptions = this.matSelect.options.length;\n const infiniteScrollDistance = this.singleOptionHeight * countOfRenderedOptions;\n const threshold = this.thrPc !== 0 ? (infiniteScrollDistance * this.thrPc) : this.thrPx;\n\n const scrolledDistance = this.panel.clientHeight + event.target.scrollTop;\n\n if ((scrolledDistance + threshold) >= infiniteScrollDistance) {\n this.ngZone.run(() => this.infiniteScroll.emit());\n }\n });\n }\n\n getSelectItemHeightPx(): number {\n return parseFloat(getComputedStyle(this.panel).fontSize) * SELECT_ITEM_HEIGHT_EM;\n }\n\n}","import { Component, Input, Output, EventEmitter } from \"@angular/core\";\r\n\r\n/**\r\n * Component to generate a num items selector\r\n * \r\n * @author Floyd Kissoon\r\n * @since 20170817\r\n */\r\n@Component({\r\n selector: \"num-items-selector\",\r\n templateUrl: \"./num-items-selector.html\"\r\n})\r\nexport class NumItemsSelector {\r\n @Input() numItems: number;\r\n @Output() numItemsChange: EventEmitter<number>;\r\n\r\n constructor() {\r\n this.numItemsChange = new EventEmitter<number>();\r\n }\r\n\r\n /**\r\n * Called when an item has been selected\r\n */\r\n numItemsChanged() {\r\n this.numItemsChange.emit(this.numItems);\r\n }\r\n\r\n\r\n}\r\n","import { Injectable } from '@angular/core';\n\n/**\n * Service that provides utility functions for dates\n * \n * @author Joshua Kissoon\n * @since 20170726\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class DateUtils {\n\n /**\n * Takes in a date object and outputs the string value\n */\n getYYYYMMDDString(inputDate: Date): string {\n var year = inputDate.getFullYear();\n var month = (inputDate.getMonth() + 1) < 10 ? (\"0\" + (inputDate.getMonth() + 1)) : (inputDate.getMonth() + 1);\n var date = inputDate.getDate() < 10 ? (\"0\" + inputDate.getDate()) : inputDate.getDate();\n\n return year + \"-\" + month + \"-\" + date;\n }\n\n /**\n * Takes in a date object and outputs the year\n */\n getYYYY(inputDate: Date): number {\n var year = inputDate.getFullYear();\n return year;\n }\n\n /**\n * Takes in a date object and outputs the Month\n */\n getMM(inputDate: Date): number {\n var month = inputDate.getMonth() + 1;\n return month;\n }\n // var n = this.rfidCardUseManualEntry.manual_date.toLocaleTimeString();\n\n getDateTime(inputDate: Date): string {\n var year = inputDate.getFullYear();\n var month = (inputDate.getMonth() + 1) < 10 ? (\"0\" + (inputDate.getMonth() + 1)) : (inputDate.getMonth() + 1);\n var date = inputDate.getDate() < 10 ? (\"0\" + inputDate.getDate()) : inputDate.getDate();\n var time = inputDate.toLocaleTimeString();\n\n return year + \"-\" + month + \"-\" + date + \" \" + time;\n }\n\n}","import { Component, Input, Output, EventEmitter, OnInit } from \"@angular/core\";\n\n/**\n * Component to generate a number selector\n * \n * @author Floyd Kissoon\n * @since 20180628\n */\n@Component({\n selector: \"number-selector\",\n templateUrl: \"./number-selector.html\"\n})\nexport class NumberSelector implements OnInit {\n @Input() start_value: number;\n @Input() end_value: number\n @Output() selectedValueChange: EventEmitter<number>;\n @Input() selectedValue: number;\n\n items = new Array();\n\n constructor() {\n this.selectedValueChange = new EventEmitter<number>();\n }\n\n /**\n * Called when an item has been selected\n */\n numChanged() {\n this.selectedValueChange.emit(this.selectedValue);\n }\n\n\n ngOnInit() {\n for (var i = this.start_value; i < this.end_value + 1; i++) {\n this.items.push(i);\n }\n }\n}\n","export class Timeline {\n public static CUSTOM: number = 1;\n public static TODAY: number = 2;\n public static YESTERDAY: number = 3;\n public static THIS_WEEK: number = 4;\n public static LAST_WEEK: number = 5;\n public static THIS_MONTH: number = 6;\n public static LAST_MONTH: number = 7;\n public static THIS_QUARTER: number = 8;\n public static LAST_QUARTER: number = 9;\n public static THIS_YEAR: number = 10;\n public static LAST_YEAR: number = 11;\n public static ALL: number = 12;\n public static TOMMOROW: number = 13;\n public static NEXT_WEEK: number = 14;\n public static NEXT_MONTH: number = 15;\n}\n","import * as moment_ from 'moment';\nconst moment = moment_;\nimport { Timeline } from \"./timeline.model\";\n\n\nexport interface TimelineValue {\n date_from: Date,\n date_to: Date,\n show_custom_field: boolean\n}\nexport function calculateTimeline(value: any) {\n const date = new Date();\n const data: any = {\n 'date_from': date,\n 'date_to': date,\n 'show_custom_field': false\n };\n switch (value) {\n case Timeline.CUSTOM: { //Custom\n data.show_custom_field = true;\n break;\n }\n case Timeline.TODAY: { // Today\n let now = moment();\n data.date_from = now.startOf('day').toISOString();\n data.date_to = now.endOf('day').toISOString();\n break;\n }\n case Timeline.YESTERDAY: { // Yesterday\n let now = moment().subtract(1, 'day');\n data.date_from = now.startOf('day').toISOString();\n data.date_to = now.endOf('day').toISOString();\n break;\n }\n case Timeline.THIS_WEEK: { // This Week\n let now = moment();\n data.date_from = now.startOf('isoWeek').toISOString();\n data.date_to = now.endOf('isoWeek').toISOString();\n break;\n }\n case Timeline.LAST_WEEK: { // Last Week\n let now = moment().subtract(1, 'week');\n data.date_from = now.startOf('isoWeek').toISOString();\n data.date_to = now.endOf('isoWeek').toISOString();\n break;\n }\n case Timeline.THIS_MONTH: { //This Month\n let now = moment();\n data.date_from = now.startOf('month').toISOString();\n data.date_to = now.endOf('month').toISOString();\n break;\n }\n case Timeline.LAST_MONTH: { // Last Month\n let now = moment().subtract(1, 'month');\n data.date_from = now.startOf('month').toISOString();\n data.date_to = now.endOf('month').toISOString();\n break;\n }\n case Timeline.THIS_QUARTER: { // This Quarter\n let now = moment();\n data.date_from = now.startOf('quarter').toISOString();\n data.date_to = now.endOf('quarter').toISOString();\n break;\n }\n case Timeline.LAST_QUARTER: { // Last Quarter\n let now = moment().subtract(1, 'quarter');\n data.date_from = now.startOf('quarter').toISOString();\n data.date_to = now.endOf('quarter').toISOString();\n break;\n }\n case Timeline.THIS_YEAR: { // This Year\n let now = moment();\n data.date_from = now.startOf('year').toISOString();\n data.date_to = now.endOf('year').toISOString();\n break;\n }\n case Timeline.LAST_YEAR: { // Last Year\n let now = moment().subtract(1, 'year');\n data.date_from = now.startOf('year').toISOString();\n data.date_to = now.endOf('year').toISOString();\n break;\n }\n case Timeline.TOMMOROW: {\n let now = moment().add(1, 'day');\n data.date_from = now.startOf('day').toISOString();\n data.date_to = now.endOf('day').toISOString();\n break;\n }\n case Timeline.NEXT_WEEK: {\n let now = moment().add(1, 'week');\n data.date_from = now.startOf('isoWeek').toISOString();\n data.date_to = now.endOf('isoWeek').toISOString();\n break;\n }\n case Timeline.NEXT_MONTH: {\n let now = moment().add(1, 'month');\n data.date_from = now.startOf('month').toISOString();\n data.date_to = now.endOf('month').toISOString();\n break;\n }\n default: { // All\n data.date_from = '';\n data.date_to = '';\n break;\n }\n\n }\n return data;\n}\n","import { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { DatePipe } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Optional, Output, Self, ViewChild } from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, FormControl, FormGroup, NgControl, Validators } from '@angular/forms';\nimport { MatFormFieldControl } from '@angular/material/form-field';\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\nimport { TimelineValue, calculateTimeline } from './calculate-timeline';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { Timeline } from './timeline.model';\n\n@UntilDestroy()\n@Component({\n selector: 'app-timeline-filter',\n templateUrl: './timeline-filter.component.html',\n styleUrls: ['./timeline-filter.component.scss'],\n providers: [\n {\n provide: MatFormFieldControl,\n useExisting: TimelineFilterComponent\n }\n ]\n})\nexport class TimelineFilterComponent implements OnInit, ControlValueAccessor {\n\n @ViewChild('picker') picker;\n @Input() timelineValue: FormControl = new FormControl('');\n @Input() timelines: any[] = [\n { value: Timeline.CUSTOM, viewValue: 'Custom' },\n { value: Timeline.TODAY, viewValue: 'Today' },\n { value: Timeline.YESTERDAY, viewValue: 'Yesterday' },\n { value: Timeline.TOMMOROW, viewValue: 'Tomorrow' },\n { value: Timeline.THIS_WEEK, viewValue: 'This Week' },\n { value: Timeline.LAST_WEEK, viewValue: 'Last Week' },\n { value: Timeline.NEXT_WEEK, viewValue: 'Next Week' },\n { value: Timeline.THIS_MONTH, viewValue: 'This Month' },\n { value: Timeline.LAST_MONTH, viewValue: 'Last Month' },\n { value: Timeline.NEXT_MONTH, viewValue: 'Next Month' },\n { value: Timeline.THIS_QUARTER, viewValue: 'This Quarter' },\n { value: Timeline.LAST_QUARTER, viewValue: 'Last Quarter' },\n { value: Timeline.THIS_YEAR, viewValue: 'This Year' },\n { value: Timeline.LAST_YEAR, viewValue: 'Last Year' },\n { value: Timeline.ALL, viewValue: 'All dates' },\n ];\n @Input() dateFrom: string = 'date_from';\n @Input() dateTo: string = 'date_to';\n @Input() appearance: any = \"legacy\"\n @Input() showClearbutton: boolean = false;\n /**\n * @deprecated The form input is deprated\n */\n @Input() form: FormGroup = null;\n @Input() labelText: string = 'Select Timeline';\n @Input() selectedValue: any;\n @Input() touchUi: boolean = true;\n @Output() selectedValueChange = new EventEmitter();\n @Output() selectionChange = new EventEmitter();\n\n selectorForm: FormGroup;\n onChange: any = () => { };\n onTouched: any = () => { };\n static nextId = 0;\n stateChanges = new Subject<void>();\n controlType = 'timeline-filter';\n id = `timeline-filter-${TimelineFilterComponent.nextId++}`;\n describedBy = '';\n\n selectedRange: TimelineValue;\n @Input() set defaultValue(value: any) {\n this.timelineValue.setValue(value);\n this.changeTimeline(value);\n }\n\n showCustomDateFields: boolean = false;\n\n constructor(\n formBuilder: FormBuilder,\n @Optional() @Self() public ngControl: NgControl,\n private datePipe: DatePipe\n ) {\n this.selectorForm = formBuilder.group({\n select_value: [null],\n });\n\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n @Input()\n get required(): boolean { return this._required; }\n set required(value: boolean) {\n this.selectorForm.get('select_value').setValidators(Validators.required);\n this._required = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n private _required = false;\n\n @Input()\n get disabled(): boolean { return this._disabled; }\n set disabled(value: boolean) {\n this._disabled = coerceBooleanProperty(value);\n this._disabled ? this.selectorForm.disable() : this.selectorForm.enable();\n this.stateChanges.next();\n }\n private _disabled = false;\n\n @Input()\n get value(): any {\n if (this.selectorForm.valid) {\n return this.selectorForm.value.select_value;\n }\n return '';\n }\n set value(data: any) {\n this.selectorForm.patchValue({ select_value: data || '' });\n this._handleInput();\n this.stateChanges.next();\n }\n\n getDateRangeString() {\n let str = \"\";\n if (this.selectedRange?.show_custom_field) {\n if (this.selectedRange?.date_from.toUTCString() != 'Invalid Date') {\n str += ' - ' + this.datePipe.transform(this.selectedRange?.date_from?.toUTCString())\n }\n if (this.selectedRange?.date_to.toUTCString() != 'Invalid Date') {\n str += ' - ' + this.datePipe.transform(this.selectedRange?.date_to?.toUTCString())\n }\n }\n return str;\n }\n\n resetFieldValue(field: string) {\n this.form.get(field).setValue('');\n }\n\n\n getFieldValue(field: string) {\n return this.form.get(field).value;\n }\n\n setFieldValue(field: string, value: any) {\n this.form.get(field).setValue(value);\n }\n\n changeTimeline(value: any) {\n const timeline = calculateTimeline(value);\n if (timeline) {\n this.setFieldValue(this.dateFrom, timeline.date_from)\n this.setFieldValue(this.dateTo, timeline.date_to)\n this.showCustomDateFields = timeline.show_custom_field;\n }\n }\n\n _handleInput(): void {\n if (this.value == 1) {\n this.picker.open();\n return;\n }\n const range: TimelineValue = calculateTimeline(this.value);\n this.selectedRange = range;\n this.onChange(this.value);\n this.selectedValueChange.emit(this.selectedValue);\n this.selectionChange.emit(range);\n }\n\n dateRangeChange(dateRangeStart: HTMLInputElement, dateRangeEnd: HTMLInputElement) {\n const range: TimelineValue = {\n date_from : new Date(dateRangeStart.value),\n date_to: new Date(dateRangeEnd.value),\n show_custom_field: true\n }\n this.selectedRange = range;\n this.onChange(this.value);\n this.selectedValueChange.emit(this.selectedValue);\n this.selectionChange.emit(range);\n }\n\n onCustomDateChange(event: any) {\n }\n\n setDescribedByIds(ids: string[]) {\n this.describedBy = ids.join(' ');\n }\n\n onContainerClick(event: MouseEvent) {\n event.stopPropagation();\n }\n\n writeValue(data: any): void {\n this.value = data;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n ngOnInit(): void {\n console.log(this.form);\n\n this.timelineValue.valueChanges.\n pipe(\n debounceTime(100),\n distinctUntilChanged(),\n untilDestroyed(this)\n ).subscribe(value => this.changeTimeline(value));\n }\n\n ngOnDestroy() {\n this.stateChanges.complete();\n }\n\n}\n","import { Component, OnInit, Input } from '@angular/core';\n\n@Component({\n selector: 'app-loader',\n templateUrl: './loader.component.html',\n styleUrls: ['./loader.component.scss']\n})\nexport class LoaderComponent implements OnInit {\n\n @Input() isLoading = false;\n @Input() size = 0.6;\n @Input() message: string | undefined;\n\n constructor() { }\n\n ngOnInit() { }\n\n}\n","import { NgModule } from '@angular/core';\nimport { SuccessSnackComponent, ErrorSnackComponent } from './snack.component';\nimport { CommonModule } from '@angular/common';\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatIconModule } from '@angular/material/icon';\n\n@NgModule({\n declarations: [\n SuccessSnackComponent,\n ErrorSnackComponent\n ],\n imports: [\n CommonModule,\n MatSnackBarModule,\n MatIconModule\n ],\n exports: [\n SuccessSnackComponent,\n ErrorSnackComponent,\n ]\n})\nexport class SnackModule { }\n","import { Injectable } from '@angular/core';\nimport { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';\nimport { CredentialsService } from './credentials.service';\nimport { Logger } from './logger.service';\n\nconst log = new Logger('AuthenticationGuard');\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthenticationGuard implements CanActivate {\n\n constructor(private router: Router,\n private credentialsService: CredentialsService) { }\n\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n return this.isUserAuthenticated(route, state);\n }\n\n canLoad(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n return this.isUserAuthenticated(route, state);\n }\n\n isUserAuthenticated(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {\n if (this.credentialsService.isAuthenticated) {\n return true;\n }\n\n log.debug('Not authenticated, redirecting and adding redirect url...');\n this.router.navigate(['/login'], { queryParams: { redirect: state.url }, replaceUrl: true });\n return false;\n }\n\n}\n","\nimport { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { concatMap, map } from 'rxjs/operators';\nimport { Credentials, CredentialsService } from './credentials.service';\nimport { HttpService } from './http.service';\n\n/**\n * Provides a base for authentication workflow.\n * The login/logout methods should be replaced with proper implementation.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AuthenticationService {\n\n constructor(private credentialsService: CredentialsService, private http: HttpService) { }\n\n /**\n * Authenticates the user.\n * @param context The login parameters.\n * @return The user credentials.\n */\n login(context: any): Observable<Credentials> {\n const data = <Credentials>{};\n return this.http\n .skipToken()\n .post('oauth/token', context)\n .pipe(\n concatMap(async (tokenInfo: any) => {\n tokenInfo.expires_in = Date.now() + (tokenInfo.expires_in * 1000);\n data.token = tokenInfo;\n data.user = {};\n this.credentialsService.setCredentials(data, context.remember);\n const userInfo: any = await this.http.get('api/user/current').toPromise();\n data.user = userInfo?.user;\n this.credentialsService.setCredentials(data, context.remember);\n return data;\n })\n )\n }\n\n /**\n * Logs out the user and clear credentials.\n * @return True if the user was logged out successfully.\n */\n logout(): Observable<boolean> {\n\n this.credentialsService.setCredentials();\n return of(true);\n }\n\n}\n","import { ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy } from '@angular/router';\nimport { Injectable } from '@angular/core';\n\n/**\n * A route strategy allowing for explicit route reuse.\n * Used as a workaround for https://github.com/angular/angular/issues/18374\n * To reuse a given route, add `data: { reuse: true }` to the route definition.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RouteReusableStrategy extends RouteReuseStrategy {\n\n public shouldDetach(route: ActivatedRouteSnapshot): boolean {\n return false;\n }\n\n public store(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle | null): void { }\n\n public shouldAttach(route: ActivatedRouteSnapshot): boolean {\n return false;\n }\n\n public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null {\n return null;\n }\n\n public shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {\n // Reuse the route if the RouteConfig is the same, or if both routes use the\n // same component, because the latter can have different RouteConfigs.\n return future.routeConfig === curr.routeConfig ||\n Boolean(future.routeConfig?.component &&\n future.routeConfig?.component === curr.routeConfig?.component);\n }\n\n}\n","import { Injectable } from \"@angular/core\";\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\n/**\r\n * Service used to manage Local Storage\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20190623\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class StorageService {\r\n private storageSub = new Subject<any>();\r\n\r\n constructor() {\r\n\r\n }\r\n\r\n watch(): Observable<any> {\r\n return this.storageSub.asObservable();\r\n }\r\n\r\n setItem(key: string, data: any) {\r\n localStorage.setItem(key, data);\r\n this.storageSub.next({ key: key, value: data });\r\n }\r\n\r\n getItem(key: string) {\r\n return localStorage.getItem(key);\r\n }\r\n\r\n removeItem(key: string) {\r\n const data = this.getItem(key);\r\n localStorage.removeItem(key);\r\n this.storageSub.next({ key: key, value: data });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { HttpService } from './http.service';\r\n\r\n/**\r\n * Service that provides a wrapper for retrieving data from the server\r\n * @deprecated use HttpService Instead\r\n * @author Joshua Kissoon\r\n * @since 20170709\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DataManager {\r\n\r\n constructor(private http: HttpService) { }\r\n\r\n /**\r\n * Callback wrapper for the HTTP GET Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n * @updated 20170711 to add parameters\r\n */\r\n GET(urlq: string, params = {}): any {\r\n return this.http\r\n .get(urlq, { params: params })\r\n .toPromise();\r\n }\r\n\r\n /**\r\n * Callback wrapper for the HTTP POST Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * @param object The object containing the POST data to be sent\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n */\r\n POST(urlq: string, object: any): any {\r\n if (null == object) {\r\n object = { \"blank\": \"blank\" };\r\n }\r\n\r\n return this.http\r\n .post(urlq, object)\r\n .toPromise();\r\n }\r\n\r\n /**\r\n * Callback wrapper for the HTTP POST Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * @param object The object containing the POST data to be sent\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n */\r\n POSTRAW(urlq: string, object: any): any {\r\n if (null == object) {\r\n object = { \"blank\": \"blank\" };\r\n }\r\n\r\n return this.http\r\n .skipHeader()\r\n .post(urlq, object)\r\n .toPromise();\r\n }\r\n\r\n\r\n /**\r\n * Callback wrapper for the HTTP PUT Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * @param object The object containing the PUT data to be sent\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n */\r\n PUT(urlq: string, object: any): any {\r\n if (null == object) {\r\n object = { \"blank\": \"blank\" };\r\n }\r\n\r\n return this.http\r\n .put(urlq, object)\r\n .toPromise();\r\n }\r\n\r\n /**\r\n * Callback wrapper for the HTTP PATCH Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * @param object The object containing the PUT data to be sent\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20161107\r\n */\r\n PATCH(urlq: string, object: any): any {\r\n if (null == object) {\r\n object = { \"blank\": \"blank\" };\r\n }\r\n\r\n return this.http\r\n .patch(urlq, object)\r\n .toPromise();\r\n }\r\n\r\n /**\r\n * Callback wrapper for the HTTP DELETE Call\r\n * \r\n * @param urlq The query part of the URL to be sent to the server\r\n * \r\n * @author Joshua Kissoon\r\n * @since 20160826\r\n */\r\n DELETE(urlq: string): any {\r\n return this.http\r\n .delete(urlq)\r\n .toPromise();\r\n }\r\n\r\n}","import { MatTooltipModule } from '@angular/material/tooltip';\n/*\n * This module imports and re-exports all Angular Material modules for convenience,\n * so only 1 module import is needed in your feature modules.\n * See https://material.angular.io/guide/getting-started#step-3-import-the-component-modules.\n *\n * To optimize your production builds, you should only import the components used in your app.\n */\n\nimport { NgModule } from \"@angular/core\";\nimport {\n MatCommonModule,\n MatLineModule,\n MatNativeDateModule,\n MatOptionModule,\n MatPseudoCheckboxModule,\n MatRippleModule\n} from \"@angular/material/core\";\nimport { MatButtonModule } from \"@angular/material/button\";\nimport { MatCheckboxModule } from \"@angular/material/checkbox\";\nimport { MatDialogModule } from \"@angular/material/dialog\";\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { MatInputModule } from \"@angular/material/input\";\nimport { MatMenuModule } from \"@angular/material/menu\";\nimport { MatProgressSpinnerModule } from \"@angular/material/progress-spinner\";\nimport { MatSelectModule } from \"@angular/material/select\";\nimport { MatSortModule } from \"@angular/material/sort\";\nimport { MatTableModule } from \"@angular/material/table\";\nimport { MatCardModule } from \"@angular/material/card\";\nimport { MatDividerModule } from \"@angular/material/divider\";\nimport { MatChipsModule } from \"@angular/material/chips\";\nimport { MatDatepickerModule } from '@angular/material/datepicker';\nimport { MatListModule } from '@angular/material/list'\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\n\n\n@NgModule({\n exports: [\n MatButtonModule,\n MatCheckboxModule,\n MatCommonModule,\n MatDialogModule,\n MatFormFieldModule,\n MatIconModule,\n MatInputModule,\n MatLineModule,\n MatMenuModule,\n MatNativeDateModule,\n MatOptionModule,\n MatProgressSpinnerModule,\n MatPseudoCheckboxModule,\n MatRippleModule,\n MatSelectModule,\n MatSortModule,\n MatTableModule,\n MatCardModule,\n MatDividerModule,\n MatChipsModule,\n MatDatepickerModule,\n MatListModule,\n MatTooltipModule,\n MatButtonToggleModule\n ]\n})\nexport class MaterialModule { }\n","import { NgModule, Optional, SkipSelf } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HTTP_INTERCEPTORS, HttpClientModule, HttpClient } from '@angular/common/http';\nimport { RouteReuseStrategy, RouterModule } from '@angular/router';\n\nimport { RouteReusableStrategy } from './route-reusable-strategy';\nimport { ApiPrefixInterceptor } from './api-prefix.interceptor';\nimport { ErrorHandlerInterceptor } from './error-handler.interceptor';\nimport { HttpService } from './http.service';\nimport { TokenInterceptor } from './token.interceptor';\nimport { CacheInterceptor } from './cache.interceptor';\nimport { SnackModule } from './snack/snack.module';\n\n@NgModule({\n imports: [\n CommonModule,\n HttpClientModule,\n RouterModule,\n SnackModule\n ],\n providers: [\n {\n provide: HttpClient,\n useClass: HttpService\n },\n {\n provide: RouteReuseStrategy,\n useClass: RouteReusableStrategy\n }\n ],\n exports: [\n SnackModule\n ]\n})\nexport class CoreModule {\n\n constructor(@Optional() @SkipSelf() parentModule: CoreModule) {\n // Import guard\n if (parentModule) {\n throw new Error(`${parentModule} has already been loaded. Import Core module in the root module only.`);\n }\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ActionPopupComponent } from './action-popup.component';\nimport { MaterialModule } from '../material.module';\n\n@NgModule({\n imports: [\n FlexLayoutModule,\n CommonModule,\n MaterialModule\n ],\n declarations: [\n ActionPopupComponent\n ],\n exports: [\n ActionPopupComponent\n ],\n entryComponents: [\n ActionPopupComponent\n ]\n})\nexport class ActionPopupModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { DataTableComponent } from './data-table.component';\nimport { InfiniteScrollModule } from \"ngx-infinite-scroll\";\nimport { MaterialModule } from '../material.module';\n\n\n@NgModule({\n imports: [\n FlexLayoutModule,\n CommonModule,\n InfiniteScrollModule,\n MaterialModule\n ],\n declarations: [\n DataTableComponent\n ],\n exports: [\n DataTableComponent\n ]\n})\nexport class DataTableModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { DocumentViewerComponent } from './document-viewer.component';\nimport { NgxDocViewerModule } from 'ngx-doc-viewer';\nimport { MaterialModule } from '../material.module';\n\n@NgModule({\n imports: [\n CommonModule,\n FlexLayoutModule,\n NgxDocViewerModule,\n MaterialModule\n ],\n declarations: [\n DocumentViewerComponent\n ],\n exports: [\n DocumentViewerComponent\n ]\n})\nexport class DocumentViewerModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FileDropperComponent } from './file-dropper.component';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from '../material.module';\n\n@NgModule({\n imports: [\n CommonModule,\n FlexLayoutModule,\n MaterialModule\n ],\n declarations: [\n FileDropperComponent\n ],\n exports: [FileDropperComponent]\n})\nexport class FileDropperModule { }\n","import { COMMA, ENTER } from '@angular/cdk/keycodes';\n\nexport class TechlifyTaggerTagFormConfigModel {\n selectable: boolean;\n removable: boolean;\n separatorKeysCodes: number[];\n placeholder: string;\n apiUrl: string;\n isCreateable: boolean;\n createApiUrl: string;\n isCacheTags: boolean;\n isSingle: boolean;\n\n constructor() {\n this.selectable = true;\n this.removable = true;\n this.separatorKeysCodes = [ENTER, COMMA];\n this.placeholder = 'Enter new Tag..';\n this.apiUrl = 'api/techlify-tagger-tags';\n this.createApiUrl = 'api/techlify-tagger-tags';\n this.isCreateable = true;\n this.isCacheTags = false;\n this.isSingle = false;\n }\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, ElementRef, ViewChild, OnInit, Input, OnDestroy, Inject, Optional, Self, OnChanges, SimpleChanges } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NgControl } from '@angular/forms';\nimport { MatAutocompleteSelectedEvent } from '@angular/material/autocomplete';\nimport { MatChipInputEvent } from '@angular/material/chips';\nimport { MatFormField, MatFormFieldControl, MAT_FORM_FIELD } from '@angular/material/form-field';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { HttpService } from '../core/http.service';\nimport { TechlifyTaggerTagFormConfigModel } from './techlify-tagger-tag-form-config.model';\n\n@UntilDestroy()\n@Component({\n selector: 'app-techlify-tagger-tag-form-field',\n templateUrl: './techlify-tagger-tag-form-field.component.html',\n styleUrls: ['./techlify-tagger-tag-form-field.component.scss'],\n providers: [{ provide: MatFormFieldControl, useExisting: TechlifyTaggerTagFormFieldComponent }],\n})\nexport class TechlifyTaggerTagFormFieldComponent implements OnInit, ControlValueAccessor, MatFormFieldControl<any>, OnDestroy, OnChanges {\n\n static nextId = 0;\n stateChanges = new Subject<void>();\n focused = false;\n controlType = 'techlify-tagger-form-field';\n id = `techlify-tagger-form-field-${TechlifyTaggerTagFormFieldComponent.nextId++}`;\n\n onChange = (_: any) => { };\n onTouched = () => { };\n\n tagInputCtrl = new FormControl();\n filterString: any;\n @ViewChild('tagInput') tagInput: ElementRef<HTMLInputElement>;\n\n /**Pass the configuration for Techlify Tagger */\n @Input() config: TechlifyTaggerTagFormConfigModel = new TechlifyTaggerTagFormConfigModel();\n /**Pass the Model Type for Techlify Tagger, Required */\n @Input() modelType!: string;\n /**Pass the Model ID for Techlify Tagger */\n @Input() modelId: string;\n\n /**Pass the default list of tags */\n private _allTags: any[] = [];\n @Input()\n get allTags() {\n return this._allTags;\n }\n set allTags(value) {\n this._allTags = value;\n }\n\n /**Pass the Categories to filter for a model */\n @Input() categories: string[] = [];\n /**Pass default category to be used for assigning the tags, when we filter by more than one category */\n @Input() defaultCreateCategory: string;\n\n get tags() {\n return this.allTags.filter(x => this.value.some(y => y == x.id));\n }\n\n //Default Getter and Setters for a Form Field Implementation\n get empty() {\n return this.value.length == 0;\n }\n\n get shouldLabelFloat() {\n return this.focused || !this.empty || this.tagInputCtrl.value;\n }\n\n @Input()\n get required(): boolean {\n return this._required;\n }\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n private _required = false;\n\n @Input()\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = coerceBooleanProperty(value);\n this._disabled ? this.tagInputCtrl.disable() : this.tagInputCtrl.enable();\n this.stateChanges.next();\n }\n private _disabled = false;\n\n\n private _value: any[] = [];\n @Input()\n get value(): any[] {\n return this._value;\n }\n set value(tagIds: any[]) {\n this._value = tagIds || [];\n this.stateChanges.next();\n }\n\n get errorState(): boolean {\n return this.tagInputCtrl.dirty && this.required && (this.value.length == 0);\n }\n\n @Input()\n get placeholder(): string {\n return this._placeholder;\n }\n set placeholder(value: string) {\n this._placeholder = value;\n this.stateChanges.next();\n }\n private _placeholder: string;\n\n\n ngOnInit(): void {\n\n }\n\n ngOnChanges(changes: SimpleChanges) {\n\n //API to load all tags for the model type\n if (this.allTags.length == 0) {\n this.httpService\n .cache(!this.config.isCacheTags)\n .get(this.config.apiUrl, {\n params: {\n categories: this.categories.join(','),\n perPage: '1000'\n }\n }).pipe(\n debounceTime(500),\n untilDestroyed(this)\n ).subscribe((result: any) => {\n this.allTags = result.data;\n });\n }\n\n //API to load only the selected tags for the model\n if (this.modelId && this.value.length == 0) {\n //Model Id is passed and no tags are present, so we query db for the avilable tags for the model ID.\n this.httpService\n .cache(!this.config.isCacheTags)\n .get(this.config.apiUrl, {\n params: {\n categories: this.categories.join(','),\n model_type: this.modelType,\n model_id: this.modelId,\n perPage: '1000'\n }\n }).pipe(\n debounceTime(500),\n untilDestroyed(this)\n ).subscribe((result: any) => {\n this.value = (result?.data || []).map((x: any) => x.id);\n this._handleInput();\n });\n }\n }\n\n init() {\n if (this.modelId && this.allTags.length == 0) {\n //Model Id is passed and no tags are passed, so we query db for the avilable tags for the model ID.\n this.httpService\n .cache(!this.config.isCacheTags)\n .get(this.config.apiUrl, {\n params: {\n categories: this.categories.join(','),\n model_type: this.modelType,\n model_id: this.modelId\n }\n }).pipe(\n untilDestroyed(this)\n ).subscribe((result: any) => {\n this.allTags = result.data;\n });\n }\n }\n\n get filteredTags(): any[] {\n return this._filter();\n }\n\n constructor(\n private _focusMonitor: FocusMonitor,\n private _elementRef: ElementRef<HTMLElement>,\n private httpService: HttpService,\n @Optional() @Inject(MAT_FORM_FIELD) public _formField: MatFormField,\n @Optional() @Self() public ngControl: NgControl) {\n\n this.tagInputCtrl.valueChanges\n .subscribe(filterValue => {\n this.filterString = filterValue;\n });\n\n //Set Focus Monitor\n _focusMonitor.monitor(_elementRef, true).subscribe(origin => {\n if (this.focused && !origin) {\n this.onTouched();\n }\n this.focused = !!origin;\n this.stateChanges.next();\n });\n\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n setDescribedByIds(ids: string[]) {\n // Just a empty implementation for Mat Form Field Interface\n }\n\n onContainerClick() {\n // Just a empty implementation for Mat Form Field Interface\n }\n\n\n async add(event: MatChipInputEvent) {\n const value = (event.value || '').trim();\n // Add our tag\n // Validate for single mode\n if (!this.config.isSingle || (this.value.length === 0)) {\n if (value && this.config.isCreateable) {\n const tags = this.allTags;\n let tag = tags.find((item: any) => item.title.toLowerCase() == value.toLowerCase());\n if (!tag) {\n //No tag present in the list\n try {\n const result: any = await this.httpService.post(this.config.createApiUrl, {\n title: value,\n description: value,\n category_title: (this.categories.length > 0) ? (this.defaultCreateCategory ? this.defaultCreateCategory : this.categories[0]) : ''\n }).toPromise();\n tag = result.item;\n } catch (error) {\n return;\n }\n this.allTags.push(tag);\n } else {\n //Optionally clean the existing value, to avoid duplicate\n this.remove(tag);\n }\n this.value.push(tag.id);\n this._handleInput();\n }\n }\n\n // Clear the input value\n event.input.value = '';\n\n this.tagInputCtrl.setValue(null);\n }\n\n remove(tag: any): void {\n this.value = this.value.filter(x => x !== tag.id);\n this._handleInput();\n }\n\n selected(event: MatAutocompleteSelectedEvent): void {\n // Validate for single mode\n if (!this.config.isSingle || (this.value.length === 0)) {\n //Clean the existing value, to avoid duplicate\n this.remove({ id: event.option.value });\n this.value.push(event.option.value);\n this._handleInput();\n }\n this.tagInput.nativeElement.value = '';\n this.tagInputCtrl.setValue(null);\n }\n\n private _filter(): any[] {\n const filterValue = this.filterString ? this.filterString.toString().toLowerCase() : null;\n const availableTags = this.allTags.filter((tag: any) => !this.value.some((item: any) => item == tag.id));\n return filterValue ? availableTags.filter((tag: any) => tag.title.toLowerCase().includes(filterValue)) : availableTags;\n }\n\n writeValue(tagIds: any[]): void {\n this.value = tagIds || [];\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n _handleInput(): void {\n this.onChange(this.value);\n }\n\n static ngAcceptInputType_disabled: BooleanInput;\n static ngAcceptInputType_required: BooleanInput;\n\n ngOnDestroy() {\n this.stateChanges.complete();\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TechlifyTaggerTagFormFieldComponent } from './techlify-tagger-tag-form-field.component';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MaterialModule } from '../material.module';\n\n\n\n@NgModule({\n declarations: [\n TechlifyTaggerTagFormFieldComponent\n ],\n imports: [\n CommonModule,\n MaterialModule,\n FlexLayoutModule,\n MatAutocompleteModule,\n ReactiveFormsModule\n ],\n exports: [TechlifyTaggerTagFormFieldComponent]\n})\nexport class TechlifyTaggerTagFormFieldModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SearchableSelectorComponent } from './searchable-selector.component';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatSelectInfiniteScrollDirective } from './mat-select-infinite-scroll.directive';\nimport { MaterialModule } from '../material.module';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n FlexLayoutModule,\n MaterialModule\n ],\n declarations: [\n SearchableSelectorComponent,\n MatSelectInfiniteScrollDirective\n ],\n exports: [\n SearchableSelectorComponent,\n MatSelectInfiniteScrollDirective\n ]\n})\nexport class SearchableSelectorModule { }\n","import { Component, OnInit, Input } from \"@angular/core\";\n\n@Component({\n selector: \"app-read-more\",\n templateUrl: \"./read-more.component.html\",\n styleUrls: [\"./read-more.component.scss\"]\n})\nexport class ReadMoreComponent implements OnInit {\n @Input() text: string;\n @Input() maxLength: number = 100;\n currentText: string;\n hideToggle: boolean = true;\n\n isCollapsed: boolean = true;\n\n constructor() {}\n\n ngOnInit() {\n this.determineView();\n }\n\n toggleView() {\n this.isCollapsed = !this.isCollapsed;\n this.determineView();\n }\n\n determineView() {\n if (!this.text || this.text.length <= this.maxLength) {\n this.currentText = this.text;\n this.isCollapsed = false;\n this.hideToggle = true;\n return;\n }\n this.hideToggle = false;\n if (this.isCollapsed == true) {\n this.currentText = this.text.substring(0, this.maxLength) + \"...\";\n } else if (this.isCollapsed == false) {\n this.currentText = this.text;\n }\n }\n}\n","import { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from '../material.module';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReadMoreComponent } from './read-more.component';\n\n@NgModule({\n declarations: [ReadMoreComponent],\n imports: [\n CommonModule,\n MaterialModule,\n FlexLayoutModule\n ],\n exports: [\n ReadMoreComponent\n ]\n})\nexport class ReadMoreModule { }","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { EntityFileFormComponent } from './entity-file-form/entity-file-form.component';\nimport { EntityFilesViewAllComponent } from './entity-files-view-all.component';\nimport { ReactiveFormsModule, FormsModule } from '@angular/forms';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { FileDropperModule } from '../file-dropper/file-dropper.module';\nimport { DocumentViewerModule } from '../document-viewer/document-viewer.module';\nimport { ActionPopupModule } from '../action-popup/action-popup.module';\nimport { MaterialModule } from '../material.module';\nimport { TechlifyTaggerTagFormFieldModule } from '../techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.module';\nimport { SearchableSelectorModule } from '../searchable-selector/searchable-selector.module';\nimport { ReadMoreModule } from '../read-more/read-more.module';\n\n\n@NgModule({\n declarations: [EntityFileFormComponent, EntityFilesViewAllComponent],\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n FlexLayoutModule,\n FileDropperModule,\n DocumentViewerModule,\n InfiniteScrollModule,\n ActionPopupModule,\n MaterialModule,\n TechlifyTaggerTagFormFieldModule,\n SearchableSelectorModule,\n ReadMoreModule\n ],\n exports: [\n EntityFilesViewAllComponent\n ],\n entryComponents: [EntityFileFormComponent]\n})\nexport class EntityFilesViewAllModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NoteListComponent } from './note-list/note-list.component';\nimport { NoteFormComponent } from './note-form/note-form.component';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ActionPopupModule } from '../action-popup/action-popup.module';\nimport { MaterialModule } from '../material.module';\nimport { CommentFormComponent } from './comment-form/comment-form.component';\nimport { ReadMoreModule } from '../read-more/read-more.module';\n\n@NgModule({\n declarations: [\n NoteListComponent,\n NoteFormComponent,\n CommentFormComponent,\n ],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n InfiniteScrollModule,\n FlexLayoutModule,\n ActionPopupModule,\n MaterialModule,\n ReadMoreModule\n ],\n exports: [\n NoteListComponent\n ],\n entryComponents: [NoteFormComponent]\n})\nexport class NoteModule { }\n","import { BrowserAnimationsModule } from '@angular/platform-browser/animations';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n/* Selectors */\r\nimport { NumItemsSelector } from './num-items-selector.component';\r\nimport { NumberSelector } from './number-selector.component';\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ],\r\n declarations: [\r\n NumItemsSelector, NumberSelector,\r\n ],\r\n exports: [NumItemsSelector, NumberSelector]\r\n})\r\nexport class UtilityModule { }\r\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class TimelineFilterRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { TimelineFilterRoutingModule } from './timeline-filter-routing.module';\nimport { TimelineFilterComponent } from './timeline-filter.component';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MaterialModule } from '../material.module';\n\n\n@NgModule({\n declarations: [TimelineFilterComponent],\n imports: [\n CommonModule,\n TimelineFilterRoutingModule,\n FlexLayoutModule,\n MaterialModule,\n ReactiveFormsModule\n ],\n exports: [TimelineFilterComponent]\n})\nexport class TimelineFilterModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { LoaderComponent } from './loader.component';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\n\n@NgModule({\n declarations: [\n LoaderComponent\n ],\n imports: [\n CommonModule,\n MatProgressSpinnerModule\n ],\n exports: [\n LoaderComponent\n ]\n})\nexport class LoaderModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class EmailSubscriptionRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EmailSubscriptionRoutingModule } from './email-subscription-routing.module';\n\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n EmailSubscriptionRoutingModule\n ]\n})\nexport class EmailSubscriptionModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class EmailSubscriptionUserRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EmailSubscriptionUserRoutingModule } from './email-subscription-user-routing.module';\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n EmailSubscriptionUserRoutingModule\n ]\n})\nexport class EmailSubscriptionUserModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class EmailSubscriptionUserFormRoutingModule { }\n","\nimport { Component, Inject, OnInit, TemplateRef } from '@angular/core';\nimport { FormGroup, FormBuilder, Validators } from '@angular/forms';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { finalize } from 'rxjs/operators';\nimport { AlertService } from '../../../core/alert.service';\nimport { FormValidatorService } from '../../../core/form-validator.service';\nimport { HttpService } from '../../../core/http.service';\nimport { Logger } from '../../../core/logger.service';\n\nconst log = new Logger('EmailSubscriptionUser Form');\n\nconst errorMessages: any = {\n user_id: {\n required: \"User is required\"\n },\n email_type_id: {\n required: \"Email Type is required\"\n },\n};\n\n@UntilDestroy()\n@Component({\n selector: 'app-email-subscription-user-form',\n templateUrl: './email-subscription-user-form.component.html',\n styleUrls: ['./email-subscription-user-form.component.scss']\n})\nexport class EmailSubscriptionUserFormComponent implements OnInit {\n\n updateMode: boolean;\n esUserFormGroup: FormGroup;\n esUserFormFirstAttempt: boolean;\n esUser: any;\n isSubmitLoading: boolean;\n selectedUser: any;\n selectedType: any;\n\n constructor(private fb: FormBuilder,\n private formValidatorService: FormValidatorService,\n private alertService: AlertService,\n public dialogRef: MatDialogRef<EmailSubscriptionUserFormComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private http: HttpService\n ) {\n this.createForm();\n }\n\n /** Method to create a form **/\n private createForm() {\n\n //TODO: Finialize and add more validations.\n this.esUserFormGroup = this.fb.group({\n id: [''],\n user_id: ['', Validators.required],\n email_type_id: ['', Validators.required],\n });\n }\n\n\n ngOnInit() {\n if (this.data?.esUser?.id) {\n this.esUser = this.data.esUser;\n this.updateMode = true;\n this.selectedType = this.esUser?.email_type;\n this.selectedUser = this.esUser?.user;\n this.esUserFormGroup.patchValue(this.esUser);\n }\n\n }\n\n //Method to trigger login\n submit() {\n this.esUserFormGroup.markAllAsTouched();\n this.esUserFormFirstAttempt = true;\n if (this.esUserFormGroup.valid) {\n this.isSubmitLoading = true;\n const model = this.esUserFormGroup.value;\n (\n this.updateMode ?\n this.http.put(`api/email-subscription-users/${model?.id}`, model) :\n this.http.post(`api/email-subscription-users`, model)\n )\n .pipe(\n finalize(() => this.isSubmitLoading = false),\n untilDestroyed(this)\n ).subscribe(result => {\n this.alertService.addAlert(\"Subscription saved successfully\", \"success\");\n this.dialogRef.close(result);\n });\n }\n }\n\n\n cancel() {\n this.dialogRef.close();\n }\n\n /**Method to evaluate form fields*/\n isFieldValid(field: string) {\n return this.formValidatorService.isFieldValid(field, this.esUserFormGroup, this.esUserFormFirstAttempt);\n }\n\n /**Method to find error in form fields*/\n getErrorMessage(field: string) {\n return this.formValidatorService.getErrorMessage(field, this.esUserFormGroup, errorMessages);\n }\n\n ngOnDestroy() {\n // Needed for automatic unsubscribe with untilDestroyed\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EmailSubscriptionUserFormRoutingModule } from './email-subscription-user-form-routing.module';\nimport { EmailSubscriptionUserFormComponent } from './email-subscription-user-form.component';\nimport { SearchableSelectorModule } from '../../../searchable-selector/searchable-selector.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from '../../../material.module';\nimport { LoaderModule } from '../../../loader/loader.module';\n\n\n@NgModule({\n declarations: [EmailSubscriptionUserFormComponent],\n imports: [\n CommonModule,\n MaterialModule,\n FlexLayoutModule,\n ReactiveFormsModule,\n SearchableSelectorModule,\n EmailSubscriptionUserFormRoutingModule,\n LoaderModule\n ],\n entryComponents: [EmailSubscriptionUserFormComponent]\n})\nexport class EmailSubscriptionUserFormModule { }\n","import { Component, OnInit, ViewChild } from '@angular/core';\n\nimport { MatDialog } from '@angular/material/dialog';\nimport { FormControl } from '@angular/forms';\nimport { MatSort } from '@angular/material/sort';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { EmailSubscriptionUserFormComponent } from '../email-subscription-user-form/email-subscription-user-form.component';\nimport { Router } from '@angular/router';\nimport { Logger } from '../../../core/logger.service';\nimport { PageEvent } from '../../../data-table/data-table.model';\nimport { HttpService } from '../../../core/http.service';\nimport { ActionPopupComponent } from '../../../action-popup/action-popup.component';\nimport { ActionPopup } from '../../../action-popup/action-popup.model';\n\nconst log = new Logger('EmailSubscriptionUser list');\n\n@UntilDestroy()\n@Component({\n selector: 'app-email-subscription-user-list',\n templateUrl: './email-subscription-user-list.component.html',\n styleUrls: ['./email-subscription-user-list.component.scss']\n})\nexport class EmailSubscriptionUserListComponent implements OnInit {\n\n esUserList: any[] = [];\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\n filters: any = {\n sort_by: 'created_at|desc',\n };\n\n\n @ViewChild(MatSort, { static: true }) sort: MatSort;\n\n displayColumns: FormControl = new FormControl(['index', 'user.name', 'email_type.title', 'creator.name', 'created_at', 'actions']);\n displayedColumns: any[] = [];\n availableDisplayColumns: any[] = [\n { order: 1, value: 'index', name: 'Index' },\n { order: 2, value: 'user.name', name: 'User' },\n { order: 3, value: 'email_type.title', name: 'Email Type' },\n { order: 4, value: 'creator.name', name: 'Creator' },\n { order: 5, value: 'actions', name: 'Actions' }\n ];\n\n constructor(\n private dialog: MatDialog,\n private http: HttpService,\n private router: Router,\n ) { }\n\n ngOnInit() {\n this.displayedColumns = this.displayColumns.value;\n this.initializeData();\n\n if (this.sort) {\n this.sort.sortChange.pipe(untilDestroyed(this))\n .subscribe((value: any) => {\n this.changeSort(value);\n })\n }\n }\n\n get selectedColumns(): string[] {\n return this.availableDisplayColumns\n .filter(col => (this.displayColumns.value as any).some((x: any) => x === col.value))\n .sort((a, b) => (a.order > b.order) ? 1 : ((b.order > a.order) ? -1 : 0))\n .map(col => col.value);\n }\n\n columnsChange() {\n this.displayedColumns = this.selectedColumns;\n }\n\n\n initializeData() {\n this.http.get(`api/email-subscription-users`, { params: { ...this.filters, ...this.pageEvent } })\n .pipe(untilDestroyed(this))\n .subscribe((result: any) => {\n this.esUserList = this.esUserList.concat(result.data);\n this.pageEvent.page = result.current_page;\n this.pageEvent.lastPage = result.last_page;\n });\n }\n\n filterChange(event: any) {\n this.filters = {\n ...this.filters,\n ...event\n };\n this.reload();\n }\n\n addEmailSubscriptionUser() {\n const dialogRef = this.dialog.open(EmailSubscriptionUserFormComponent, {\n width: '800px',\n autoFocus: false,\n data: {} // Any data passed here will be injected into the model\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n if (result) {\n log.debug(result);\n this.reload();\n }\n });\n }\n\n\n editEmailSubscriptionUser(event: any, esUser: any) {\n event.stopPropagation();\n const dialogRef = this.dialog.open(EmailSubscriptionUserFormComponent, {\n width: '800px',\n autoFocus: false,\n data: {\n esUser: esUser\n } // Any data passed here will be injected into the model\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n if (result) {\n log.debug(result);\n this.reload();\n }\n });\n }\n\n deleteEmailSubscriptionUser(event: any, esUser: any) {\n event.stopPropagation();\n const dialogRef = this.dialog.open(ActionPopupComponent, {\n width: '400px',\n data: <ActionPopup>{\n title: 'Delete Subscription',\n message: `Are you sure to proceed delete the esUser ${esUser.name}?`\n },\n autoFocus: false\n });\n\n dialogRef.afterClosed().subscribe(result => {\n if (result) {\n //Action confirmed\n this.http.delete(`api/email-subscription-users/${esUser?.id}`)\n .pipe(untilDestroyed(this))\n .subscribe((result: any) => {\n this.esUserList = this.esUserList.filter(x => x.id !== esUser.id);\n });\n }\n });\n }\n\n onScroll() {\n if (this.pageEvent.lastPage > this.pageEvent.page) {\n this.pageEvent.page += 1;\n this.initializeData();\n }\n }\n\n changeSort(event: any) {\n if (event.direction) {\n this.filters.sort_by = `${event.active}|${event.direction}`;\n this.reload();\n }\n }\n\n reload() {\n this.esUserList = [];\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\n this.initializeData();\n }\n\n\n ngOnDestroy() {\n //Until destroyed uses it\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { AuthenticationGuard } from '../../../core/authentication.guard';\nimport { EmailSubscriptionUserListComponent } from './email-subscription-user-list.component';\n\nexport const esulr = {\n title: 'Email Subscription Users',\n permissions: {\n only: ['app_admin'],\n redirectTo: '/'\n }\n};\n\nconst routes: Routes = [\n {\n path: '',\n component: EmailSubscriptionUserListComponent,\n canActivate: [AuthenticationGuard],\n data: esulr\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class EmailSubscriptionUserListRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class EmailSubscriptionUserListFilterRoutingModule { }\n","import { Component, OnInit, Output, EventEmitter, Input } from '@angular/core';\nimport { FormGroup, FormBuilder } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\n\n@UntilDestroy()\n@Component({\n selector: 'app-email-subscription-user-list-filter',\n templateUrl: './email-subscription-user-list-filter.component.html',\n styleUrls: ['./email-subscription-user-list-filter.component.scss']\n})\nexport class EmailSubscriptionUserListFilterComponent implements OnInit {\n\n esUserFilterForm: FormGroup;\n\n @Output() valueChange = new EventEmitter();\n\n constructor(private fb: FormBuilder) {\n this.createForm();\n }\n\n private createForm() {\n\n //TODO: Finialize and add more validations.\n this.esUserFilterForm = this.fb.group({\n user_id: [''],\n email_type_id: [''],\n });\n }\n\n ngOnInit(): void {\n\n this.esUserFilterForm.valueChanges.pipe(\n debounceTime(500),\n distinctUntilChanged(),\n untilDestroyed(this)\n ).subscribe(value => {\n this.valueChange.emit(value);\n })\n }\n\n\n resetFieldValue(field: string) {\n this.esUserFilterForm.get(field).setValue('');\n }\n\n getFieldValue(field: string) {\n return this.esUserFilterForm.get(field).value;\n }\n\n\n ngOnDestroy() {\n\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EmailSubscriptionUserListFilterRoutingModule } from './email-subscription-user-list-filter-routing.module';\nimport { EmailSubscriptionUserListFilterComponent } from './email-subscription-user-list-filter.component';\nimport { MaterialModule } from '../../../material.module';\nimport { SearchableSelectorModule } from '../../../searchable-selector/searchable-selector.module';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n\n@NgModule({\n declarations: [EmailSubscriptionUserListFilterComponent],\n imports: [\n CommonModule,\n MaterialModule,\n FlexLayoutModule,\n ReactiveFormsModule,\n SearchableSelectorModule,\n EmailSubscriptionUserListFilterRoutingModule\n ],\n exports: [EmailSubscriptionUserListFilterComponent]\n})\nexport class EmailSubscriptionUserListFilterModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EmailSubscriptionUserListRoutingModule } from './email-subscription-user-list-routing.module';\nimport { EmailSubscriptionUserListComponent } from './email-subscription-user-list.component';\nimport { EmailSubscriptionUserListFilterModule } from '../email-subscription-user-list-filter/email-subscription-user-list-filter.module';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { EmailSubscriptionUserFormModule } from '../email-subscription-user-form/email-subscription-user-form.module';\nimport { MaterialModule } from '../../../material.module';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n\n@NgModule({\n declarations: [EmailSubscriptionUserListComponent],\n imports: [\n CommonModule,\n InfiniteScrollModule,\n MaterialModule,\n FlexLayoutModule,\n ReactiveFormsModule,\n EmailSubscriptionUserListRoutingModule,\n EmailSubscriptionUserFormModule,\n EmailSubscriptionUserListFilterModule\n ],\n exports: [EmailSubscriptionUserListComponent]\n})\nexport class EmailSubscriptionUserListModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\n\nexport class EmailSubscriptionTypeRoutingModule { }","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EmailSubscriptionTypeRoutingModule } from './email-subscription-type-routing.module';\n\n\n@NgModule({\n declarations: [],\n imports: [\n CommonModule,\n EmailSubscriptionTypeRoutingModule\n ]\n})\nexport class EmailSubscriptionTypeModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class EmailSubscriptionTypeFormRoutingModule { }\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { FormGroup, FormBuilder, Validators } from '@angular/forms';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { finalize } from 'rxjs/operators';\nimport { AlertService } from '../../../core/alert.service';\nimport { FormValidatorService } from '../../../core/form-validator.service';\nimport { HttpService } from '../../../core/http.service';\n\nconst errorMessages: any = {\n title: {\n required: \"Title is required\"\n },\n code: {\n required: \"Code is required\"\n },\n frequency_id: {\n required: \"Frequency is required\"\n },\n};\n\n@UntilDestroy()\n@Component({\n selector: 'app-email-subscription-type-form',\n templateUrl: './email-subscription-type-form.component.html',\n styleUrls: ['./email-subscription-type-form.component.scss']\n})\nexport class EmailSubscriptionTypeFormComponent implements OnInit {\n\n updateMode: boolean;\n emailSubscriptionTypeFormGroup: FormGroup;\n emailSubscriptionTypeFormFirstAttempt: boolean;\n emailSubscriptionType: any;\n selectedFrequency: any;\n isLoading: boolean;\n isSubmitLoading: boolean;\n\n constructor(private fb: FormBuilder,\n private formValidatorService: FormValidatorService,\n private alertService: AlertService,\n public dialogRef: MatDialogRef<EmailSubscriptionTypeFormComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private http: HttpService\n ) {\n this.createForm();\n }\n\n /** Method to create a form **/\n private createForm() {\n\n //TODO: Finialize and add more validations.\n this.emailSubscriptionTypeFormGroup = this.fb.group({\n id: [''],\n title: ['', Validators.compose([Validators.required])],\n code: ['', Validators.compose([Validators.required])],\n frequency_id: ['', Validators.required],\n description: [''],\n });\n }\n\n ngOnInit() {\n if (this.data.emailSubscriptionType?.id) {\n this.isLoading = true;\n this.emailSubscriptionType = this.data?.emailSubscriptionType;\n this.updateMode = true;\n this.selectedFrequency = this.emailSubscriptionType?.frequency || {};\n this.emailSubscriptionTypeFormGroup.patchValue(this.emailSubscriptionType);\n }\n }\n\n //Method to trigger login\n submit() {\n this.emailSubscriptionTypeFormGroup.markAllAsTouched();\n this.emailSubscriptionTypeFormFirstAttempt = true;\n if (this.emailSubscriptionTypeFormGroup.valid) {\n this.isSubmitLoading = true;\n const model = this.emailSubscriptionTypeFormGroup.value;\n (\n this.updateMode ?\n this.http.put(`api/email-subscription-types/${model?.id}`, model) :\n this.http.post(`api/email-subscription-types`, model)\n )\n .pipe(\n finalize(() => this.isSubmitLoading = false),\n untilDestroyed(this)\n ).subscribe(result => {\n this.alertService.addAlert(\"Email Type saved successfully\", \"success\");\n this.dialogRef.close(result);\n });\n }\n }\n\n\n cancel() {\n this.dialogRef.close();\n }\n\n\n /**Method to evaluate form fields*/\n isFieldValid(field: string) {\n return this.formValidatorService.isFieldValid(field, this.emailSubscriptionTypeFormGroup, this.emailSubscriptionTypeFormFirstAttempt);\n }\n\n /**Method to find error in form fields*/\n getErrorMessage(field: string) {\n return this.formValidatorService.getErrorMessage(field, this.emailSubscriptionTypeFormGroup, errorMessages);\n }\n\n ngOnDestroy() {\n // Needed for automatic unsubscribe with untilDestroyed\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EmailSubscriptionTypeFormRoutingModule } from './email-subscription-type-form-routing.module';\nimport { EmailSubscriptionTypeFormComponent } from './email-subscription-type-form.component';\nimport { SearchableSelectorModule } from '../../../searchable-selector/searchable-selector.module';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from '../../../material.module';\nimport { LoaderModule } from '../../../loader/loader.module';\n\n\n\n@NgModule({\n declarations: [EmailSubscriptionTypeFormComponent],\n imports: [\n CommonModule,\n MaterialModule,\n FlexLayoutModule,\n ReactiveFormsModule,\n SearchableSelectorModule,\n EmailSubscriptionTypeFormRoutingModule,\n LoaderModule\n ],\n exports: [EmailSubscriptionTypeFormComponent],\n entryComponents: [EmailSubscriptionTypeFormComponent]\n})\nexport class EmailSubscriptionTypeFormModule { }\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { FormControl } from '@angular/forms';\nimport { distinctUntilChanged, debounceTime } from 'rxjs/operators';\nimport { MatSort } from '@angular/material/sort';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { EmailSubscriptionTypeFormComponent } from '../email-subscription-type-form/email-subscription-type-form.component';\nimport { PageEvent } from '../../../data-table/data-table.model';\nimport { HttpService } from '../../../core/http.service';\nimport { ActionPopupComponent } from '../../../action-popup/action-popup.component';\nimport { ActionPopup } from '../../../action-popup/action-popup.model';\n\n@UntilDestroy()\n@Component({\n selector: 'app-email-subscription-type-list',\n templateUrl: './email-subscription-type-list.component.html',\n styleUrls: ['./email-subscription-type-list.component.scss']\n})\nexport class EmailSubscriptionTypeListComponent implements OnInit {\n\n emailSubscriptionTypeList: any[] = [];\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\n filters: any = {\n sort_by: 'created_at|desc',\n isLoadRelations: true,\n relations: ['frequency']\n };\n search: FormControl = new FormControl('');\n\n\n @ViewChild(MatSort, { static: true }) sort: MatSort;\n\n displayColumns: FormControl = new FormControl(['index', 'title', 'frequency.title', 'description', 'actions']);\n displayedColumns: any[] = [];\n availableDisplayColumns: any[] = [\n { order: 1, value: 'index', name: 'Index' },\n { order: 2, value: 'title', name: 'Title' },\n { order: 3, value: 'code', name: 'Code' },\n { order: 4, value: 'frequency.title', name: 'Frequency' },\n { order: 5, value: 'description', name: 'Description' },\n { order: 6, value: 'actions', name: 'Actions' }\n ];\n\n constructor(\n private dialog: MatDialog,\n private http: HttpService,\n ) { }\n\n ngOnInit() {\n this.displayedColumns = this.displayColumns.value;\n this.initializeData();\n this.search.valueChanges.pipe(\n debounceTime(500),\n distinctUntilChanged(),\n untilDestroyed(this)\n ).subscribe(value => {\n this.filters.search = value;\n this.reload();\n });\n\n if (this.sort) {\n this.sort.sortChange.pipe(untilDestroyed(this))\n .subscribe((value: any) => {\n this.changeSort(value);\n })\n }\n }\n\n get selectedColumns(): string[] {\n return this.availableDisplayColumns\n .filter(col => (this.displayColumns.value as any).some((x: any) => x === col.value))\n .sort((a, b) => (a.order > b.order) ? 1 : ((b.order > a.order) ? -1 : 0))\n .map(col => col.value);\n }\n\n columnsChange() {\n this.displayedColumns = this.selectedColumns;\n }\n\n\n initializeData() {\n this.http.get(`api/email-subscription-types`, { params: { ...this.filters, ...this.pageEvent } })\n .pipe(untilDestroyed(this))\n .subscribe((result: any) => {\n this.emailSubscriptionTypeList = this.emailSubscriptionTypeList.concat(result.data);\n this.pageEvent.page = result.current_page;\n this.pageEvent.lastPage = result.last_page;\n });\n }\n\n addEmailSubscriptionType() {\n const dialogRef = this.dialog.open(EmailSubscriptionTypeFormComponent, {\n width: '400px',\n autoFocus: false,\n data: {} // Any data passed here will be injected into the model\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n if (result) {\n this.reload();\n }\n });\n }\n\n\n editEmailSubscriptionType(event: any, emailSubscriptionType: any) {\n event.stopPropagation();\n const dialogRef = this.dialog.open(EmailSubscriptionTypeFormComponent, {\n width: '400px',\n autoFocus: false,\n data: {\n emailSubscriptionType: emailSubscriptionType\n } // Any data passed here will be injected into the model\n });\n\n dialogRef.afterClosed().subscribe((result: any) => {\n if (result) {\n this.reload();\n }\n });\n }\n\n deleteEmailSubscriptionType(event: any, emailSubscriptionType: any) {\n event.stopPropagation();\n const dialogRef = this.dialog.open(ActionPopupComponent, {\n width: '400px',\n data: <ActionPopup>{\n title: 'Delete Email Type',\n message: `Are you sure to proceed delete the Email Type ${emailSubscriptionType.title}?`\n },\n autoFocus: false\n });\n\n dialogRef.afterClosed().subscribe(result => {\n if (result) {\n //Action confirmed\n this.http.delete(`api/email-subscription-types/${emailSubscriptionType?.id}`)\n .pipe(untilDestroyed(this))\n .subscribe((result: any) => {\n this.emailSubscriptionTypeList = this.emailSubscriptionTypeList.filter(x => x.id !== emailSubscriptionType.id);\n });\n }\n });\n }\n\n onScroll() {\n if (this.pageEvent.lastPage > this.pageEvent.page) {\n this.pageEvent.page += 1;\n this.initializeData();\n }\n }\n\n changeSort(event: any) {\n if (event.direction) {\n this.filters.sort_by = `${event.active}|${event.direction}`;\n this.reload();\n }\n }\n\n reload() {\n this.emailSubscriptionTypeList = [];\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\n this.initializeData();\n }\n\n ngOnDestroy() {\n //Until destroyed uses it\n }\n\n}","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { AuthenticationGuard } from '../../../core/authentication.guard';\n\nimport { EmailSubscriptionTypeListComponent } from './email-subscription-type-list.component';\n\nexport const estlr = {\n title: 'Email Subscription Type',\n permissions: {\n only: ['client_admin'],\n redirectTo: '/'\n }\n};\n\n\nconst routes: Routes = [\n {\n path: '',\n component: EmailSubscriptionTypeListComponent,\n canActivate: [AuthenticationGuard],\n data: estlr\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class EmailSubscriptionTypeListRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EmailSubscriptionTypeListRoutingModule } from './email-subscription-type-list-routing.module';\nimport { EmailSubscriptionTypeListComponent } from './email-subscription-type-list.component';\nimport { EmailSubscriptionTypeFormModule } from '../email-subscription-type-form/email-subscription-type-form.module';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from '../../../material.module';\nimport { ReactiveFormsModule } from '@angular/forms';\n\n\n@NgModule({\n declarations: [EmailSubscriptionTypeListComponent],\n imports: [\n CommonModule,\n MaterialModule,\n FlexLayoutModule,\n ReactiveFormsModule,\n InfiniteScrollModule,\n EmailSubscriptionTypeFormModule,\n EmailSubscriptionTypeListRoutingModule\n ],\n exports: [EmailSubscriptionTypeListComponent]\n})\nexport class EmailSubscriptionTypeListModule { }\n","import { Component, OnInit } from '@angular/core';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { HttpService } from '../../core/http.service';\nimport { PageEvent } from '../../data-table/data-table.model';\n\n@UntilDestroy()\n@Component({\n selector: 'app-email-subscription-for-user',\n templateUrl: './email-subscription-for-user.component.html',\n styleUrls: ['./email-subscription-for-user.component.scss']\n})\nexport class EmailSubscriptionForUserComponent implements OnInit {\n\n subscriptions: any[] = [];\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\n filters: any = {\n sort_by: 'created_at|desc',\n isLoadRelations: true,\n relations: 'frequency,currentUserSubscription'\n };\n\n constructor(\n private http: HttpService\n ) { }\n\n ngOnInit(): void {\n this.fetchSubscriptions();\n }\n\n fetchSubscriptions() {\n this.http.get(`api/email-subscription-types`, { params: { ...this.filters, ...this.pageEvent } })\n .pipe(untilDestroyed(this))\n .subscribe((result: any) => {\n this.subscriptions = this.subscriptions.concat(result.data);\n this.pageEvent.page = result.current_page;\n this.pageEvent.lastPage = result.last_page;\n });\n }\n\n onScroll() {\n if (this.pageEvent.lastPage > this.pageEvent.page) {\n this.pageEvent.page += 1;\n this.fetchSubscriptions();\n }\n }\n\n subscribe(sub: any) {\n this.http.post(`api/email-subscription-for-user`, { email_type_id: sub?.id })\n .pipe(untilDestroyed(this))\n .subscribe((result: any) => {\n sub.current_user_subscription = result?.item;\n });\n }\n\n unsubscribe(sub: any) {\n this.http.delete(`api/email-subscription-users/${sub?.current_user_subscription?.id}`)\n .pipe(untilDestroyed(this))\n .subscribe((_: any) => {\n sub.current_user_subscription = null;\n });\n }\n\n\n reload() {\n this.subscriptions = [];\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\n this.fetchSubscriptions();\n }\n\n ngOnDestroy() {\n //Until destroyed uses it\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { AuthenticationGuard } from '../../core/authentication.guard';\nimport { EmailSubscriptionForUserComponent } from './email-subscription-for-user.component';\n\nexport const esfur = {\n permissions: {\n only: ['client_admin']\n }\n};\n\nconst routes: Routes = [\n {\n path: '',\n component: EmailSubscriptionForUserComponent,\n canActivate: [AuthenticationGuard],\n data: esfur\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class EmailSubscriptionForUserRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EmailSubscriptionForUserRoutingModule } from './email-subscription-for-user-routing.module';\nimport { EmailSubscriptionForUserComponent } from './email-subscription-for-user.component';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from '../../material.module';\n\n\n@NgModule({\n declarations: [EmailSubscriptionForUserComponent],\n imports: [\n CommonModule,\n InfiniteScrollModule,\n MaterialModule,\n FlexLayoutModule,\n EmailSubscriptionForUserRoutingModule\n ],\n exports: [EmailSubscriptionForUserComponent]\n})\nexport class EmailSubscriptionForUserModule { }\n","import { HttpService } from '../core/http.service';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TechlifyUpdateService {\n\n constructor(private http: HttpService) { }\n\n getTechlifyUpdates(filters: any) {\n return this.http.get(`api/techlify-updates`, { params: filters }).toPromise();\n }\n\n createTechlifyUpdate(techlifyUpdate: any) {\n return this.http.post(`api/techlify-updates`, techlifyUpdate).toPromise();\n }\n\n updateTechlifyUpdate(techlifyUpdate: any) {\n return this.http.put(`api/techlify-updates/${techlifyUpdate.id}`, techlifyUpdate).toPromise();\n }\n\n deleteTechlifyUpdate(techlifyUpdateId: any) {\n return this.http.delete(`api/techlify-updates/${techlifyUpdateId}`).toPromise();\n }\n\n getTechlifyUpdate(techlifyUpdateId: any) {\n return this.http.get(`api/techlify-updates/${techlifyUpdateId}`).toPromise();\n }\n\n getNewUpdateForCurrentUser() {\n return this.http.get(`api/current-user-techlify-updates`).toPromise();\n }\n\n createUpdateViewRecord(techlifyUpdateView: any) {\n return this.http.post(`api/techlify-update-views`, techlifyUpdateView).toPromise();\n }\n\n updateCurrentUserUpdates() {\n return this.http.get(`api/techlify-updates/update-view`).toPromise();\n }\n}\n","import { AlertService } from \"../../core/alert.service\";\nimport { TechlifyUpdateService } from './../techlify-update.service';\nimport { FormControl, Validators } from '@angular/forms';\nimport { Component, EventEmitter, Inject, OnInit, Output } from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { FormValidatorService } from '../../core/form-validator.service';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { Editor, Toolbar } from 'ngx-editor';\n\nconst errorMessages: any = {\n title: {\n required: \"Title is required\",\n },\n released_on: {\n required: \"Released On is required\",\n },\n version: {\n required: \"Version is required\",\n },\n description: {\n required: \"Description is required\",\n },\n learn_more_link: {\n pattern: \"Please enter valid link\",\n }\n}\n\n@Component({\n selector: 'app-techlify-update-form',\n templateUrl: './techlify-update-form.component.html',\n styleUrls: ['./techlify-update-form.component.scss']\n})\nexport class TechlifyUpdateFormComponent implements OnInit {\n\n @Output() onSave = new EventEmitter<any>();\n techlifyUpdateForm: FormGroup;\n isUpdateMode: boolean = false;\n editor: Editor;\n toolbar: Toolbar = [\n ['bold', 'italic'],\n ['bullet_list'],\n ];\n\n constructor(\n public dialogRef: MatDialogRef<TechlifyUpdateFormComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private fb: FormBuilder,\n private formValidatorService: FormValidatorService,\n private alertService: AlertService,\n private techlifyUpdateService: TechlifyUpdateService\n ) {\n this.createForm();\n }\n\n private createForm() {\n this.techlifyUpdateForm = this.fb.group({\n id: new FormControl(''),\n title: new FormControl('', Validators.required),\n description: new FormControl('', Validators.required),\n version: new FormControl('', Validators.required),\n released_on: new FormControl('', Validators.required),\n learn_more_link: new FormControl('', Validators.compose([Validators.pattern('(https?://)?([\\\\da-z.-]+)\\\\.([a-z.]{2,6})[/\\\\w .-]*/?')])),\n });\n if (this.data.techlifyUpdateDetails) {\n this.isUpdateMode = true;\n this.techlifyUpdateForm.patchValue(this.data.techlifyUpdateDetails);\n }\n }\n\n ngOnInit() {\n this.editor = new Editor();\n }\n\n async submit() {\n if (this.techlifyUpdateForm.valid) {\n let result;\n const model = this.techlifyUpdateForm.value;\n\n try {\n result = this.isUpdateMode ? await this.techlifyUpdateService.updateTechlifyUpdate(model)\n : await this.techlifyUpdateService.createTechlifyUpdate(model);\n this.alertService.addAlert(\n \"Techlify app update saved successfully\",\n \"success\"\n );\n } catch (error) {\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\n } finally {\n if (result) {\n this.dialogRef.close(result);\n }\n }\n }\n }\n\n resetFieldValue(field: string) {\n this.techlifyUpdateForm.get(field).setValue('');\n }\n\n getFieldValue(field: string) {\n return this.techlifyUpdateForm.get(field).value;\n }\n\n /** Method to evaluate form fields*/\n isFieldValid(field: string) {\n return this.formValidatorService.isFieldValid(field, this.techlifyUpdateForm, true);\n }\n /** Method to find error in form fields*/\n getErrorMessage(field: string) {\n return this.formValidatorService.getErrorMessage(field, this.techlifyUpdateForm, errorMessages);\n }\n\n}\n","import { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MaterialModule } from './../../material.module';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TechlifyUpdateFormComponent } from './techlify-update-form.component';\nimport { NgxEditorModule } from 'ngx-editor';\n\n@NgModule({\n declarations: [TechlifyUpdateFormComponent],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MaterialModule,\n FlexLayoutModule,\n NgxEditorModule,\n ],\n exports: [\n TechlifyUpdateFormComponent\n ],\n entryComponents: [\n TechlifyUpdateFormComponent\n ]\n})\nexport class TechlifyUpdateFormModule { }\n","import { UntilDestroy } from '@ngneat/until-destroy';\nimport { untilDestroyed } from '@ngneat/until-destroy';\nimport { ActionPopup } from './../../action-popup/action-popup.model';\nimport { ActionPopupComponent } from './../../action-popup/action-popup.component';\nimport { TechlifyUpdateFormComponent } from './../techlify-update-form/techlify-update-form.component';\nimport { TechlifyUpdateService } from './../techlify-update.service';\nimport { FormControl, FormBuilder } from '@angular/forms';\nimport { FormGroup } from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { AlertService } from '../../core/alert.service';\nimport { Component, OnInit } from '@angular/core';\nimport { debounceTime } from 'rxjs/operators';\n\n@UntilDestroy()\n@Component({\n selector: 'app-techlify-updates-list',\n templateUrl: './techlify-updates-list.component.html',\n styleUrls: ['./techlify-updates-list.component.scss']\n})\nexport class TechlifyUpdatesListComponent implements OnInit {\n techlifyUpdates: any[] = [];\n displayedColumns: string[] = [\n 'index',\n 'title',\n 'version',\n 'released_on',\n 'learn_more_link',\n 'description',\n 'creator',\n 'actions'\n ];\n page: number = 1;\n lastPage: number;\n perPage: number = 25;\n isWorking: boolean = false;\n filterFormGroup: FormGroup;\n\n constructor(\n private dialog: MatDialog,\n private alertService: AlertService,\n private techlifyUpdateService: TechlifyUpdateService,\n private fb: FormBuilder,\n ) {\n this.filterFormGroup = this.fb.group({\n search: new FormControl(''),\n version: new FormControl(''),\n sort_by: new FormControl('released_on|DESC'),\n });\n }\n\n ngOnInit() {\n this.loadData();\n this.listenChanges();\n }\n\n listenChanges() {\n this.filterFormGroup.valueChanges.pipe(debounceTime(500), untilDestroyed(this))\n .subscribe(changes => {\n this.reload();\n });\n }\n\n ngOnDestroy() { }\n\n async loadData() {\n try {\n this.isWorking = true;\n var filters: any = this.filterFormGroup.value;\n filters.perPage = this.perPage;\n filters.page = this.page;\n let result: any = await this.techlifyUpdateService.getTechlifyUpdates(\n filters\n );\n this.lastPage = result.last_page || this.page;\n this.techlifyUpdates = this.techlifyUpdates.concat(result.data);\n } catch (error) {\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\n }\n finally {\n this.isWorking = false;\n }\n }\n\n reload() {\n this.techlifyUpdates = [];\n this.page = 1;\n if (!this.isWorking) {\n this.loadData();\n }\n }\n\n onScroll() {\n if (!this.isWorking && this.page < this.lastPage) {\n this.page += 1;\n this.loadData();\n }\n }\n\n modifyTechlifyUpdate(model?: any) {\n const dialogRef = this.dialog.open(TechlifyUpdateFormComponent, {\n width: \"600px\",\n data: {\n techlifyUpdateDetails: model,\n }\n });\n\n dialogRef.afterClosed().subscribe(result => {\n if (result) {\n this.reload();\n }\n });\n }\n\n async deleteTechlifyUpdate(model: any) {\n const dialogRef = this.dialog.open(ActionPopupComponent, {\n width: \"400px\",\n data: <ActionPopup>{\n title: \"Delete Update\",\n message: `Are you sure to delete this update?`\n },\n autoFocus: false\n });\n\n dialogRef.afterClosed().subscribe(async result => {\n if (result) {\n //Action confirmed\n try {\n await this.techlifyUpdateService.deleteTechlifyUpdate(model.id);\n this.alertService.addAlert(\n \"Successfully deleted the update\",\n \"success\"\n );\n this.reload();\n } catch (error) {\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\n }\n }\n });\n }\n\n resetFieldValue(field: string) {\n this.filterFormGroup.get(field).setValue(\"\");\n }\n\n sortColumn(event) {\n var direction = event.direction.toString().toUpperCase();\n this.assignFilter(event.active, direction);\n }\n\n assignFilter(column, direction) {\n switch (column) {\n case 'title': {\n return this.filterFormGroup.get('sort_by').setValue(\"title|\" + direction);\n }\n case 'released_on': {\n return this.filterFormGroup.get('sort_by').setValue(\"released_on|\" + direction);\n }\n case 'version': {\n return this.filterFormGroup.get('sort_by').setValue(\"version|\" + direction);\n }\n default: {\n return this.filterFormGroup.get('sort_by').setValue(\"created_at|DESC\");\n }\n };\n }\n\n}\n","import { TechlifyUpdatesListComponent } from './techlify-updates-list/techlify-updates-list.component';\nimport { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nconst routes: Routes = [\n { path: '', redirectTo: 'all', pathMatch: 'full' },\n { path: 'all', component: TechlifyUpdatesListComponent },\n\n //fallback\n {\n path: '**',\n redirectTo: 'all',\n pathMatch: 'full'\n }\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class TechlifyUpdateRoutingModule { }\n","import { ReadMoreModule } from '../read-more/read-more.module';\nimport { TechlifyUpdateFormModule } from './techlify-update-form/techlify-update-form.module';\nimport { TechlifyUpdateRoutingModule } from './techlify-update-routing.module';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TechlifyUpdatesListComponent } from './techlify-updates-list/techlify-updates-list.component';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MaterialModule } from '../material.module';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ActionPopupModule } from '../action-popup/action-popup.module';\n\n@NgModule({\n declarations: [TechlifyUpdatesListComponent],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n InfiniteScrollModule,\n FlexLayoutModule,\n MaterialModule,\n ActionPopupModule,\n TechlifyUpdateRoutingModule,\n TechlifyUpdateFormModule,\n ReadMoreModule,\n ]\n})\nexport class TechlifyUpdateModule { }\n","import { Inject } from '@angular/core';\nimport { MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { MatDialogRef } from '@angular/material/dialog';\nimport { Component, OnInit } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'app-update-view',\n templateUrl: './update-view.component.html',\n styleUrls: ['./update-view.component.scss']\n})\nexport class UpdateViewComponent implements OnInit {\n techlifyUpdate: any;\n rootNavUrl: any;\n\n constructor(\n public dialogRef: MatDialogRef<UpdateViewComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private router: Router\n ) { }\n\n ngOnInit(): void {\n this.techlifyUpdate = this.data.techlifyUpdate;\n this.rootNavUrl = this.data.rootNavUrl;\n }\n\n close() {\n this.dialogRef.close();\n }\n\n openUpdateHistory(): void {\n this.close();\n this.router.navigate([this.rootNavUrl + \"/update-history\"]);\n }\n\n}\n","import { UntilDestroy } from '@ngneat/until-destroy';\nimport { untilDestroyed } from '@ngneat/until-destroy';\nimport { AlertService } from './../../core/alert.service';\nimport { UpdateViewComponent } from './../update-view/update-view.component';\nimport { TechlifyUpdateService } from './../techlify-update.service';\nimport { FormControl, FormBuilder } from '@angular/forms';\nimport { FormGroup } from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Component, OnInit } from '@angular/core';\nimport { debounceTime } from 'rxjs/operators';\n\n@UntilDestroy()\n@Component({\n selector: 'app-techlify-update-history',\n templateUrl: './techlify-update-history.component.html',\n styleUrls: ['./techlify-update-history.component.scss']\n})\nexport class TechlifyUpdateHistoryComponent implements OnInit {\n techlifyUpdates: any[] = [];\n displayedColumns: string[] = [\n 'index',\n 'title',\n 'version',\n 'released_on',\n 'learn_more_link',\n 'description',\n 'creator',\n 'actions'\n ];\n page: number = 1;\n lastPage: number;\n perPage: number = 25;\n isWorking: boolean = false;\n filterFormGroup: FormGroup;\n\n constructor(\n private dialog: MatDialog,\n private techlifyUpdateService: TechlifyUpdateService,\n private fb: FormBuilder,\n private alertService: AlertService\n ) {\n this.filterFormGroup = this.fb.group({\n search: new FormControl(''),\n version: new FormControl(''),\n sort_by: new FormControl('released_on|DESC'),\n });\n }\n\n ngOnInit() {\n this.loadData();\n this.listenChanges();\n this.updateCurrentUserUpdates();\n }\n\n listenChanges() {\n this.filterFormGroup.valueChanges.pipe(debounceTime(500), untilDestroyed(this))\n .subscribe(changes => {\n this.reload();\n });\n }\n\n ngOnDestroy() { }\n\n async loadData() {\n try {\n this.isWorking = true;\n var filters: any = this.filterFormGroup.value;\n filters.perPage = this.perPage;\n filters.page = this.page;\n let result: any = await this.techlifyUpdateService.getTechlifyUpdates(\n filters\n );\n this.lastPage = result.last_page || this.page;\n this.techlifyUpdates = this.techlifyUpdates.concat(result.data);\n } catch (error) {\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\n }\n finally {\n this.isWorking = false;\n }\n }\n\n reload() {\n this.techlifyUpdates = [];\n this.page = 1;\n if (!this.isWorking) {\n this.loadData();\n }\n }\n\n onScroll() {\n if (!this.isWorking && this.page < this.lastPage) {\n this.page += 1;\n this.loadData();\n }\n }\n\n resetFieldValue(field: string) {\n this.filterFormGroup.get(field).setValue(\"\");\n }\n\n sortColumn(event) {\n var direction = event.direction.toString().toUpperCase();\n this.assignFilter(event.active, direction);\n }\n\n assignFilter(column, direction) {\n switch (column) {\n case 'title': {\n return this.filterFormGroup.get('sort_by').setValue(\"title|\" + direction);\n }\n case 'released_on': {\n return this.filterFormGroup.get('sort_by').setValue(\"released_on|\" + direction);\n }\n case 'version': {\n return this.filterFormGroup.get('sort_by').setValue(\"version|\" + direction);\n }\n default: {\n return this.filterFormGroup.get('sort_by').setValue(\"created_at|DESC\");\n }\n };\n }\n\n openUpdateView(techlifyUpdate: any): void {\n const dialogRef = this.dialog.open(UpdateViewComponent, {\n width: \"800px\",\n autoFocus: false,\n data: {\n techlifyUpdate: techlifyUpdate,\n isFromHistory: true,\n } // Any data passed here will be injected into the model\n });\n }\n\n async updateCurrentUserUpdates() {\n try {\n await this.techlifyUpdateService.updateCurrentUserUpdates();\n } catch (error) {\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\n }\n }\n}\n","import { TechlifyUpdateHistoryComponent } from './techlify-update-history.component';\nimport { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\n\nconst routes: Routes = [\n { path: '', redirectTo: 'update-history', pathMatch: 'full' },\n { path: 'update-history', component: TechlifyUpdateHistoryComponent },\n\n //fallback\n {\n path: '**',\n redirectTo: 'all',\n pathMatch: 'full'\n }\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class TechlifyUpdateHistoryRoutingModule { }\n","import { ReactiveFormsModule } from '@angular/forms';\nimport { TechlifyUpdateHistoryRoutingModule } from './techlify-update-history-routing.module';\nimport { ReadMoreModule } from '../../read-more/read-more.module';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TechlifyUpdateHistoryComponent } from './techlify-update-history.component';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { MaterialModule } from '../../material.module';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ActionPopupModule } from '../../action-popup/action-popup.module';\n\n@NgModule({\n imports: [\n CommonModule,\n ReactiveFormsModule,\n InfiniteScrollModule,\n FlexLayoutModule,\n MaterialModule,\n ActionPopupModule,\n ReadMoreModule,\n TechlifyUpdateHistoryRoutingModule\n ],\n declarations: [TechlifyUpdateHistoryComponent]\n})\nexport class TechlifyUpdateHistoryModule { }\n","import { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from './../../material.module';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UpdateViewComponent } from './update-view.component';\n\n\n\n@NgModule({\n declarations: [UpdateViewComponent],\n imports: [\n CommonModule,\n MaterialModule,\n FlexLayoutModule\n ],\n exports: [\n UpdateViewComponent\n ],\n entryComponents: [\n UpdateViewComponent\n ]\n})\nexport class UpdateViewModule { }\n","import { AlertService } from './../../../core/alert.service';\nimport { TechlifyUpdateService } from './../../techlify-update.service';\nimport { MatDialog } from '@angular/material/dialog';\nimport { Component, EmbeddedViewRef, Inject, OnInit } from '@angular/core';\nimport { MatSnackBarRef, MAT_SNACK_BAR_DATA } from '@angular/material/snack-bar';\nimport { UpdateViewComponent } from '../../update-view/update-view.component';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'app-update-notifier-snack',\n templateUrl: './update-notifier-snack.component.html',\n styleUrls: ['./update-notifier-snack.component.scss']\n})\nexport class UpdateNotifierSnackComponent implements OnInit {\n maxDescriptionLength: any = 70;\n descriptionText: any = '';\n techlifyUpdate: any;\n rootNavUrl: any;\n\n constructor(\n @Inject(MAT_SNACK_BAR_DATA) public data: any,\n private snackBarRef: MatSnackBarRef<EmbeddedViewRef<any>>,\n private dialog: MatDialog,\n private router: Router,\n private techlifyUpdateService: TechlifyUpdateService,\n private alertService: AlertService\n ) { }\n\n ngOnInit(): void {\n this.techlifyUpdate = this.data.techlifyUpdate;\n this.rootNavUrl = this.data.rootNavUrl;\n this.determineDescription(this.techlifyUpdate?.description)\n }\n\n close(): void {\n this.createUpdateViewRecord();\n this.snackBarRef.dismiss();\n }\n\n determineDescription(description: any) {\n if (!description || description.length <= this.maxDescriptionLength) {\n this.descriptionText = description;\n return;\n }\n this.descriptionText = description.substring(0, this.maxDescriptionLength) + \"...\";\n }\n\n openUpdateView(): void {\n this.close();\n const dialogRef = this.dialog.open(UpdateViewComponent, {\n width: \"800px\",\n autoFocus: false,\n data: {\n techlifyUpdate: this.techlifyUpdate,\n rootNavUrl: this.data.rootNavUrl\n } // Any data passed here will be injected into the model\n });\n }\n\n openUpdateHistory(): void {\n this.close();\n this.router.navigate([this.rootNavUrl + \"/update-history\"]);\n }\n\n async createUpdateViewRecord() {\n try {\n var techlifyUpdateView = {\n update_id: this.techlifyUpdate?.id\n };\n let result: any = await this.techlifyUpdateService.createUpdateViewRecord(techlifyUpdateView);\n }\n catch (error) {\n this.alertService.addAlert(\"Unable to process, try later\", \"warn\");\n }\n }\n}\n","import { UpdateNotifierSnackComponent } from './update-notifier-snack/update-notifier-snack.component';\nimport { TechlifyUpdateService } from './../techlify-update.service';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { MatSnackBar } from '@angular/material/snack-bar';\nimport { AlertService } from '../../core/alert.service';\n\n@Component({\n selector: 'app-update-notifier',\n templateUrl: './update-notifier.component.html',\n styleUrls: ['./update-notifier.component.scss']\n})\nexport class UpdateNotifierComponent implements OnInit {\n techlifyUpdate: any;\n @Input() rootNavUrl: string = '/techlify-updates';\n\n constructor(\n private snackBar: MatSnackBar,\n private techlifyUpdateService: TechlifyUpdateService,\n private alertService: AlertService\n ) { }\n\n ngOnInit(): void {\n }\n\n ngAfterViewInit(): void {\n setTimeout(x => {\n this.getNewUpdate();\n }, 5000);\n }\n\n async getNewUpdate() {\n try {\n let result: any = await this.techlifyUpdateService.getNewUpdateForCurrentUser();\n this.techlifyUpdate = result.item;\n if (this.techlifyUpdate) {\n this.showUpdate();\n }\n }\n catch (error) {\n console.log(\"Current user updates failed\");\n }\n }\n\n showUpdate() {\n this.snackBar.openFromComponent(UpdateNotifierSnackComponent, {\n data: {\n techlifyUpdate: this.techlifyUpdate,\n rootNavUrl: this.rootNavUrl\n },\n horizontalPosition: 'right',\n verticalPosition: 'top',\n panelClass: ['white-bg']\n });\n }\n\n}\n","import { ActionPopupModule } from './../../action-popup/action-popup.module';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from './../../material.module';\nimport { UpdateViewModule } from './../update-view/update-view.module';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UpdateNotifierComponent } from './update-notifier.component';\nimport { UpdateNotifierSnackComponent } from './update-notifier-snack/update-notifier-snack.component';\n\n\n@NgModule({\n declarations: [UpdateNotifierComponent, UpdateNotifierSnackComponent],\n imports: [\n CommonModule,\n MaterialModule,\n UpdateViewModule,\n FlexLayoutModule,\n ActionPopupModule\n ],\n exports: [\n UpdateNotifierComponent,\n ],\n entryComponents: [\n UpdateNotifierSnackComponent\n ]\n})\nexport class UpdateNotifierModule { }\n","import { Component, OnInit, Input } from '@angular/core';\nimport * as XLSX from 'xlsx';\n\n@Component({\n selector: 'app-export-excel-button',\n templateUrl: './export-excel-button.component.html',\n styleUrls: ['./export-excel-button.component.scss']\n})\nexport class ExportExcelButtonComponent implements OnInit {\n\n @Input() name: string = 'Export_Data';\n @Input() data: any[] = [];\n\n constructor() { }\n\n ngOnInit(): void {\n }\n\n exportExcel() {\n const fileName = `${this.name}_${new Date().getTime()}.xlsx`;\n const ws = XLSX.utils.json_to_sheet(this.data);\n /* generate workbook and add the worksheet */\n const wb: XLSX.WorkBook = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');\n\n /* save to file */\n XLSX.writeFile(wb, fileName);\n }\n\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ExportExcelButtonComponent } from './export-excel-button/export-excel-button.component';\nimport { MaterialModule } from '../material.module';\n\n\n\n@NgModule({\n declarations: [ExportExcelButtonComponent],\n imports: [\n CommonModule,\n MaterialModule\n ],\n exports: [ExportExcelButtonComponent]\n})\nexport class ExportExcelModule { }\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { HttpService } from '../../core/http.service';\n\n\n@UntilDestroy()\n@Component({\n selector: 'app-audit-log-view',\n templateUrl: './audit-log-view-model.component.html',\n styleUrls: ['./audit-log-view-model.component.scss']\n})\nexport class AuditLogViewModelComponent implements OnInit {\n\n logInfo: any;\n showDeltaChanges: boolean = false;\n changeList: any[] = [];\n\n constructor(\n public dialogRef: MatDialogRef<AuditLogViewModelComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private http: HttpService\n ) { }\n\n ngOnInit(): void {\n if (this.data) {\n this.http.get(`api/recent-log-for-model`, {\n params: {\n model_type: this.data?.modelType,\n model_id: this.data?.modelId\n }\n }).pipe(\n untilDestroyed(this)\n ).subscribe((result: any) => {\n this.logInfo = result?.item;\n this.getTransformedChanges();\n });\n }\n }\n\n getTransformedChanges() {\n const changes = ((this.logInfo?.action === 'deleted') ? Object.keys(this.logInfo?.object) : Object.keys(this.logInfo?.data?.changes)) || [];\n changes.forEach((key: any) => {\n const displayAttribute = (key as string).split('_').map(x => x.charAt(0).toUpperCase() + x.slice(1)).join(' ');\n this.changeList.push({ displayAttribute: displayAttribute, attribute: key, newValue: (this.logInfo?.action === 'deleted') ? '' : (this.logInfo?.object[key] ?? ''), oldValue: this.logInfo?.pre_object[key] ?? '' });\n });\n }\n\n close() {\n this.dialogRef.close();\n }\n\n}\n","import { Component, Inject, OnInit } from '@angular/core';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { filter } from 'rxjs/operators';\nimport { AuditLogViewModelComponent } from '../audit-log-view-model/audit-log-view-model.component';\n\n@UntilDestroy()\n@Component({\n selector: 'app-audit-logs-view-model',\n templateUrl: './audit-logs-view-model.component.html',\n styleUrls: ['./audit-logs-view-model.component.scss']\n})\nexport class AuditLogsViewModelComponent implements OnInit {\n\n constructor(\n public dialogRef: MatDialogRef<AuditLogViewModelComponent>,\n @Inject(MAT_DIALOG_DATA) public data: any,\n private router: Router\n ) { }\n\n ngOnInit(): void {\n this.router.events\n .pipe(filter(event => event instanceof NavigationEnd), untilDestroyed(this))\n .subscribe(_ => this.dialogRef.close());\n }\n\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { AuditLogViewModelComponent } from '../audit-log-view-model/audit-log-view-model.component';\nimport { AuditLogsViewModelComponent } from '../audit-logs-view-model/audit-logs-view-model.component';\n\n\n@Component({\n selector: 'app-audit-log-for-model',\n templateUrl: './audit-log-for-model.component.html',\n styleUrls: ['./audit-log-for-model.component.scss']\n})\nexport class AuditLogForModelComponent implements OnInit {\n\n @Input() modelType: string;\n @Input() modelId: any;\n @Input() logView: 'recent' | 'all' = 'recent';\n\n constructor(\n private dialog: MatDialog,\n ) { }\n\n ngOnInit(): void {\n\n }\n\n getLogView() {\n const dialogRef = this.dialog.open(AuditLogViewModelComponent, {\n width: '800px',\n autoFocus: false,\n data: {\n modelType: this.modelType,\n modelId: this.modelId\n } // Any data passed here will be injected into the model\n });\n }\n\n getLogsView() {\n const dialogRef = this.dialog.open(AuditLogsViewModelComponent, {\n width: '95%',\n maxWidth: 'unset',\n autoFocus: false,\n data: {\n modelType: this.modelType,\n modelId: this.modelId\n } // Any data passed here will be injected into the model\n });\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class AuditLogForModelRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class AuditLogViewModelRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { AuditLogViewModelRoutingModule } from './audit-log-view-model-routing.module';\nimport { AuditLogViewModelComponent } from './audit-log-view-model.component';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from '../../material.module';\n\n\n@NgModule({\n declarations: [AuditLogViewModelComponent],\n imports: [\n CommonModule,\n AuditLogViewModelRoutingModule,\n FlexLayoutModule,\n MaterialModule\n ],\n exports: [AuditLogViewModelComponent]\n})\nexport class AuditLogViewModelModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class AuditLogsViewModelRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class AuditLogListRoutingModule { }\n","import { Component, OnInit, OnDestroy, Input, ViewChild } from '@angular/core';\n\n\nimport { Router } from '@angular/router';\nimport { MatSort } from '@angular/material/sort';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { PageEvent } from '../../data-table/data-table.model';\nimport { DataManager } from '../../core/dataManager.service';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n@UntilDestroy()\n@Component({\n selector: 'app-audit-log-list',\n templateUrl: './audit-log-list.component.html',\n styleUrls: ['./audit-log-list.component.scss'],\n})\nexport class AuditLogListComponent implements OnInit, OnDestroy {\n\n auditLogList: any[] = [];\n @Input() objectId: any;\n @Input() objectType: any;\n @Input() showFilter: boolean = true;\n @Input() showExportButtons: boolean = true;\n @Input() userId: any;\n\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\n filters: any = { sort_by: 'created_at|desc' };\n displayedColumns: any[] = ['index', 'id', 'object_type', 'object_id', 'action', 'changes', 'created_at', 'user.email'];\n\n @ViewChild(MatSort, { static: true }) sort: MatSort;\n\n constructor(\n private dataManager: DataManager,\n private router: Router,\n public sanitizer: DomSanitizer\n ) { }\n\n ngOnInit() {\n\n this.initializeData();\n\n if (this.sort) {\n this.sort.sortChange.pipe(untilDestroyed(this))\n .subscribe((value: any) => {\n this.changeSort(value);\n })\n }\n\n }\n\n get excelData(): any[] {\n if (this.auditLogList.length > 0) {\n return this.auditLogList.map(item => {\n return {\n 'Type': item?.object_type,\n 'Action': item?.action,\n 'Data': JSON.stringify(item?.data || {}),\n 'Object': JSON.stringify(item?.object || {}),\n 'Pre-Object': JSON.stringify(item?.pre_object || {}),\n 'Created At': new Date(item?.created_at).toDateString(),\n 'Created By': item?.user?.email\n };\n });\n }\n return [];\n }\n\n changeSort(event: any) {\n if (event.direction) {\n this.filters.sort_by = `${event.active}|${event.direction}`;\n this.reload();\n }\n }\n\n logClicked(log: any) {\n this.router.navigate(['/system/audit-logs/log-view', log.id]);\n }\n\n\n async initializeData() {\n if (this.objectType) {\n this.filters = { ...this.filters, object_type: this.objectType }\n }\n if (this.objectId) {\n this.filters = { ...this.filters, object_id: this.objectId }\n }\n if (this.userId) {\n this.filters = { ...this.filters, user_id: this.userId }\n }\n const result = await this.dataManager.GET(`api/audit-logs`, { ...this.filters, ...this.pageEvent });\n this.auditLogList = this.auditLogList.concat(result.data);\n this.pageEvent.page = result.current_page;\n this.pageEvent.lastPage = result.last_page;\n }\n\n filterChange(event: any) {\n if (this.showFilter) {\n this.filters = {\n ...this.filters,\n ...event,\n object_type: this.objectType || event?.object_type || '',\n object_id: this.objectId || '',\n };\n this.reload();\n }\n }\n\n onScroll() {\n if (this.pageEvent.lastPage > this.pageEvent.page) {\n this.pageEvent.page += 1;\n this.initializeData();\n }\n }\n\n reload() {\n this.auditLogList = [];\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\n this.initializeData();\n }\n\n getTransformedChanges(log: any) {\n if (log?.data?.changes) {\n const changes = Object.keys(log?.data?.changes) || [];\n let value = '<div>';\n changes.forEach((key: any) => {\n const displayAttribute = (key as string).split('_').map(x => x.charAt(0).toUpperCase() + x.slice(1)).join(' ');\n value = `${value} <div><b>${displayAttribute}:</b> <span id=\"old-value\">${log?.pre_object[key] ?? ''}</span><span id=\"new-value\">${log?.object[key] ?? ''}</span></div>`;\n });\n value = `${value} </div>`;\n return value;\n }\n return '';\n }\n\n ngOnDestroy() {\n // Needed for automatic unsubscribe with untilDestroyed\n }\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class AuditLogListFilterRoutingModule { }\n","import { FormControl } from \"@angular/forms\";\n\nexport function DateValidator(): any {\n return (control: FormControl): { [key: string]: any } => {\n\n const val: any = new Date(control.value);\n if (!!control.value && val == 'Invalid Date') {\n return { invalidDate: true };\n }\n return null;\n };\n}","import { Component, OnInit, Output, EventEmitter, Input } from '@angular/core';\nimport { FormGroup, FormBuilder } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { FormValidatorService } from '../../core/form-validator.service';\nimport { DateValidator } from '../../date-validator';\n\n@UntilDestroy()\n@Component({\n selector: 'app-audit-log-list-filter',\n templateUrl: './audit-log-list-filter.component.html',\n styleUrls: ['./audit-log-list-filter.component.scss']\n})\nexport class AuditLogListFilterComponent implements OnInit {\n\n auditLogFilterForm: FormGroup;\n\n @Input() objectId: any;\n @Input() objectType: any;\n\n @Output() valueChange = new EventEmitter();\n\n constructor(private fb: FormBuilder, private formValidatorService: FormValidatorService) {\n this.createForm();\n }\n\n get showObjectFilter() {\n return !(this.objectId || this.objectType);\n }\n\n private createForm() {\n\n //TODO: Finialize and add more validations.\n this.auditLogFilterForm = this.fb.group({\n object_type: [''],\n action: [''],\n data: [''],\n date_to: ['', DateValidator()],\n date_from: ['', DateValidator()]\n });\n }\n\n ngOnInit(): void {\n\n this.auditLogFilterForm.valueChanges.pipe(\n debounceTime(500),\n distinctUntilChanged(),\n untilDestroyed(this)\n ).subscribe((value: any) => {\n value.date_from = value.date_from ? (value.date_from as Date).toISOString() : '';\n value.date_to = value.date_to ? (value.date_to as Date).toISOString() : '';\n this.valueChange.emit(value);\n })\n }\n\n\n resetFieldValue(field: string) {\n this.auditLogFilterForm.get(field).setValue('');\n }\n\n getFieldValue(field: string) {\n return this.auditLogFilterForm.get(field).value;\n }\n\n isFieldValid(field: string) {\n return this.formValidatorService.isFieldValid(field, this.auditLogFilterForm, true);\n }\n\n\n ngOnDestroy() {\n\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { AuditLogListFilterRoutingModule } from './audit-log-list-filter-routing.module';\nimport { AuditLogListFilterComponent } from './audit-log-list-filter.component';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MaterialModule } from '../../material.module';\nimport { SearchableSelectorModule } from '../../searchable-selector/searchable-selector.module';\n\n\n@NgModule({\n declarations: [AuditLogListFilterComponent],\n imports: [\n CommonModule,\n AuditLogListFilterRoutingModule,\n FlexLayoutModule,\n ReactiveFormsModule,\n MaterialModule,\n SearchableSelectorModule,\n ],\n exports: [AuditLogListFilterComponent]\n})\nexport class AuditLogListFilterModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { AuditLogListRoutingModule } from './audit-log-list-routing.module';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { AuditLogListComponent } from './audit-log-list.component';\nimport { AuditLogListFilterModule } from '../audit-log-list-filter/audit-log-list-filter.module';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { ExportExcelModule } from '../../export-excel/export-excel.module';\nimport { MaterialModule } from '../../material.module';\n\n\n@NgModule({\n declarations: [AuditLogListComponent],\n imports: [\n CommonModule,\n AuditLogListRoutingModule,\n ExportExcelModule,\n FlexLayoutModule,\n ReactiveFormsModule,\n MaterialModule,\n InfiniteScrollModule,\n AuditLogListFilterModule\n ],\n exports: [AuditLogListComponent]\n})\nexport class AuditLogListModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { AuditLogsViewModelRoutingModule } from './audit-logs-view-model-routing.module';\nimport { AuditLogsViewModelComponent } from './audit-logs-view-model.component';\nimport { AuditLogListModule } from '../audit-log-list/audit-log-list.module';\nimport { FlexLayoutModule } from '@angular/flex-layout';\n\n\n@NgModule({\n declarations: [AuditLogsViewModelComponent],\n imports: [\n CommonModule,\n AuditLogsViewModelRoutingModule,\n FlexLayoutModule,\n AuditLogListModule\n ],\n exports: [AuditLogsViewModelComponent]\n})\nexport class AuditLogsViewModelModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { AuditLogForModelRoutingModule } from './audit-log-for-model-routing.module';\nimport { AuditLogForModelComponent } from './audit-log-for-model.component';\nimport { AuditLogViewModelModule } from '../audit-log-view-model/audit-log-view-model.module';\nimport { AuditLogsViewModelModule } from '../audit-logs-view-model/audit-logs-view-model.module';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from '../../material.module';\n\n\n@NgModule({\n declarations: [AuditLogForModelComponent],\n imports: [\n AuditLogViewModelModule,\n AuditLogsViewModelModule,\n CommonModule,\n AuditLogForModelRoutingModule,\n FlexLayoutModule,\n MaterialModule,\n ],\n exports: [AuditLogForModelComponent]\n})\nexport class AuditLogForModelModule { }\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Location } from '@angular/common';\nimport * as jsondiffpatch from \"jsondiffpatch\"\nimport { DataManager } from '../../core/dataManager.service';\n\n@Component({\n selector: 'app-audit-log-view',\n templateUrl: './audit-log-view.component.html',\n styleUrls: ['./audit-log-view.component.scss']\n})\nexport class AuditLogViewComponent implements OnInit {\n\n logInfo: any;\n showDeltaChanges: boolean = false;\n changeList: any[] = [];\n\n constructor(\n private dataManager: DataManager,\n private route: ActivatedRoute,\n private location: Location\n ) { }\n\n ngOnInit(): void {\n this.route.paramMap.subscribe(params => {\n if (params.get('id')) {\n this.fetchLogDetail(params.get('id'));\n } else {\n this.location.back();\n }\n });\n }\n\n getTransformedChanges() {\n const changes = ((this.logInfo?.action === 'deleted') ? Object.keys(this.logInfo?.object) : Object.keys(this.logInfo?.data?.changes)) || [];\n changes.forEach((key: any) => {\n const displayAttribute = (key as string).split('_').map(x => x.charAt(0).toUpperCase() + x.slice(1)).join(' ');\n this.changeList.push({ displayAttribute: displayAttribute, attribute: key, newValue: (this.logInfo?.action === 'deleted') ? '' : (this.logInfo?.object[key] ?? ''), oldValue: this.logInfo?.pre_object[key] ?? '' });\n });\n }\n\n async fetchLogDetail(logId: any) {\n const result = await this.dataManager.GET(`api/audit-logs/${logId}`);\n this.logInfo = result.item;\n this.getTransformedChanges();\n this.patchDelta();\n }\n\n patchDelta() {\n const delta = jsondiffpatch.diff(this.logInfo?.pre_object, this.logInfo?.object);\n document.getElementById('jsondiff').innerHTML = jsondiffpatch.formatters.html.format(delta, this.logInfo?.pre_object);\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\n\nconst routes: Routes = [];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class AuditLogViewRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { AuditLogViewRoutingModule } from './audit-log-view-routing.module';\nimport { AuditLogViewComponent } from './audit-log-view.component';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { MaterialModule } from '../../material.module';\n\n\n@NgModule({\n declarations: [AuditLogViewComponent],\n imports: [\n CommonModule,\n AuditLogViewRoutingModule,\n FlexLayoutModule,\n MaterialModule\n ],\n exports: [AuditLogViewComponent]\n})\nexport class AuditLogViewModule { }\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { AuthenticationGuard } from '../core/authentication.guard';\nimport { AuditLogListComponent } from './audit-log-list/audit-log-list.component';\nimport { AuditLogViewComponent } from './audit-log-view/audit-log-view.component';\n\n\nconst routes: Routes = [\n { path: 'log-list', component: AuditLogListComponent, canActivate: [AuthenticationGuard] },\n { path: 'log-view/:id', component: AuditLogViewComponent, canActivate: [AuthenticationGuard] },\n { path: '**', redirectTo: 'log-list', pathMatch: 'full' }\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class AuditLogRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { AuditLogRoutingModule } from './audit-log-routing.module';\nimport { AuditLogListModule } from './audit-log-list/audit-log-list.module';\nimport { AuditLogViewModule } from './audit-log-view/audit-log-view.module';\n\n\n@NgModule({\n declarations: [\n ],\n imports: [\n CommonModule,\n AuditLogRoutingModule,\n AuditLogListModule,\n AuditLogViewModule\n ],\n exports: []\n})\nexport class AuditLogModule { }\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ImportCsvConfig } from '../import-csv-config';\n\n@Component({\n selector: 'app-import-success',\n templateUrl: './import-success.component.html',\n styleUrls: ['./import-success.component.scss']\n})\nexport class ImportSuccessComponent implements OnInit {\n @Input() data: any;\n @Input() config: ImportCsvConfig;\n constructor() { }\n\n ngOnInit() {\n }\n\n}\n","import { ErrorHandlerService } from './../../core/error-handler.service';\nimport { PageEvent } from './../../data-table/data-table.model';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { ImportCsvConfig } from '../import-csv-config';\nimport { HttpService } from '../../core/http.service';\n\n@Component({\n selector: 'app-import-history-list',\n templateUrl: './import-history-list.component.html',\n styleUrls: ['./import-history-list.component.scss']\n})\nexport class ImportHistoryListComponent implements OnInit {\n\n @Input() config: ImportCsvConfig;\n histories: any[] = [];\n displayedColumns: string[] = [\n 'index',\n 'imported_by',\n 'date',\n 'no_of_records'\n ];\n isWorking: boolean = false;\n filter: any;\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\n\n constructor(\n private errorHandler: ErrorHandlerService,\n private http: HttpService,\n ) {\n }\n\n ngOnInit() {\n if (this.config.importHistory.isEnabled) {\n this.filter = {\n model_type: this.config.importHistory.type,\n };\n }\n this.loadData();\n }\n\n loadData() {\n try {\n this.isWorking = true;\n this.http.get(this.config.importHistory.apiUrl, { params: { ...this.filter, ...this.pageEvent } }).subscribe((result: any) => {\n this.histories = this.histories.concat(result.data);\n this.pageEvent.page = result.current_page;\n this.pageEvent.lastPage = result.last_page;\n });\n } catch (error) {\n this.errorHandler.handleError(error);\n }\n finally {\n this.isWorking = false;\n }\n }\n\n onScroll() {\n if (this.pageEvent.lastPage > this.pageEvent.page) {\n this.pageEvent.page += 1;\n this.loadData();\n }\n }\n\n reload() {\n this.histories = [];\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\n this.loadData();\n }\n\n ngOnDestroy() {\n //Until destroyed uses it\n }\n\n}\n","import { FormValidatorService } from '../../core/form-validator.service';\nimport { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { FormArray, FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';\nimport { Location } from '@angular/common';\nimport { ImportCsvConfig } from '../import-csv-config';\n\nconst errorMessages: any = {\n property: {\n required: \"Property is required\",\n unavailable: \"Duplicate entry\"\n },\n};\n\n@Component({\n selector: 'app-field-mapping',\n templateUrl: './field-mapping.component.html',\n styleUrls: ['./field-mapping.component.scss']\n})\nexport class FieldMappingComponent implements OnInit {\n\n importMappingForm: FormGroup;\n @Input() data: any[];\n @Input() config: ImportCsvConfig;\n firstDataArray: any[] = [];\n properties: any[] = [];\n @Output() onSave = new EventEmitter();\n @Output() onReUpload= new EventEmitter();\n\n constructor(\n private fb: FormBuilder,\n private formValidatorService: FormValidatorService,\n private changeDetectorRef: ChangeDetectorRef,\n public location: Location\n ) {\n this.createImportMappingForm();\n }\n\n ngOnInit() {\n this.properties = this.config.properties;;\n this.reFectorAttributes(this.data[0]);\n }\n\n createImportMappingForm() {\n this.importMappingForm = this.fb.group({\n fields: this.fb.array([]),\n });\n }\n\n get fieldsArray(): FormArray {\n return this.importMappingForm.get('fields') as FormArray;\n }\n\n createField(field: any): FormGroup {\n var fieldForm: FormGroup = this.fb.group({\n id: new FormControl(field.id),\n label: new FormControl(field.label),\n value: new FormControl(field.value),\n property: new FormControl(field.property,\n Validators.compose(\n [\n Validators.required\n ]\n )\n ),\n propertyType: new FormControl(field.propertyType)\n });\n return fieldForm;\n }\n\n reFectorAttributes(data) {\n for (var k in data) {\n if (data.hasOwnProperty(k)) {\n var dataValue = {\n id: '',\n label: k,\n value: data[k],\n property: '',\n propertyType: ''\n };\n this.firstDataArray.push(dataValue);\n }\n }\n this.firstDataArray.forEach((element: any, mainIndex: any) => {\n element.id = mainIndex;\n this.properties.find((property: any, index: any) => {\n if (property.label.toLowerCase().includes(element.label.toLowerCase())) {\n element.property = property.value;\n element.propertyType = property.type;\n return element;\n }\n });\n });\n }\n\n next() {\n this.importMappingForm.markAllAsTouched();\n if (!this.importMappingForm.valid) {\n return;\n }\n this.onSave.emit(this.importMappingForm.value);\n }\n\n /** Method to evaluate form fields*/\n isFieldValid(field: string, form: any) {\n return this.formValidatorService.isFieldValid(field, form);\n }\n\n /** Method to find error in form fields*/\n getErrorMessage(field: string, form: any) {\n return this.formValidatorService.getErrorMessage(field, form, errorMessages);\n }\n\n ngAfterViewInit(): void {\n //Called after ngAfterContentInit when the component's view has been initialized. Applies to components only.\n //Add 'implements AfterViewInit' to the class.\n setTimeout(x => {\n this.firstDataArray.forEach((element: any) => {\n this.fieldsArray.push(this.createField(element));\n });\n this.changeDetectorRef.detectChanges();\n }, 500);\n }\n\n updatePropertyType(event: any, index: any): void {\n var field = this.properties.find((field: any) => field.value == event.value);\n if (field) {\n this.fieldsArray.controls[index].get('propertyType').setValue(field.type);\n this.uniqueValidator();\n }\n }\n\n uniqueValidator() {\n this.fieldsArray.value.forEach((field: any, index: any) => {\n var control = this.fieldsArray.controls[index].get('property');\n const isNameUnique = this.fieldsArray.value.find(propertyData =>\n propertyData.property === control.value\n && propertyData.id != this.fieldsArray.controls[index].get('id').value\n )\n ? false\n : true;\n if (!isNameUnique) {\n control.setErrors({ unavailable: true });\n }\n else {\n control.setErrors(null);\n }\n });\n }\n\n removeField(index: number) {\n if (index == -1) {\n return;\n }\n this.fieldsArray.removeAt(index);\n }\n\n reUpload() {\n this.onReUpload.emit(true);\n }\n\n}\n","import { Location } from '@angular/common';\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\n\n@Component({\n selector: 'app-failed-items-list',\n templateUrl: './failed-items-list.component.html',\n styleUrls: ['./failed-items-list.component.scss']\n})\nexport class FailedItemsListComponent implements OnInit {\n @Input() failedItems: any[];\n @Input() selectedFields: any[];\n @Output() onReUpload = new EventEmitter();\n\n constructor(\n public location: Location\n ) { }\n\n ngOnInit() {\n }\n\n isValidDate(d: any): boolean {\n var date = new Date(d);\n return date instanceof Date && !isNaN(date.getTime());\n }\n\n reUpload() {\n this.onReUpload.emit(true);\n }\n\n}\n","import { ViewerConfig } from '../document-viewer/viewer-config.model';\nimport { FileDropperConfig } from '../file-dropper/file-dropper.model';\nimport { HttpService } from '../core/http.service';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { AlertService } from '../core/alert.service';\nimport { ErrorHandlerService } from '../core/error-handler.service';\nimport * as XLSX from 'xlsx';\nimport { ImportCsvConfig } from './import-csv-config';\n@UntilDestroy()\n\n@Component({\n selector: 'app-import-csv',\n templateUrl: './import-csv.component.html',\n styleUrls: ['./import-csv.component.scss']\n})\nexport class ImportCsvComponent implements OnInit {\n result: any;\n @Input() config: ImportCsvConfig;\n filesConfig: FileDropperConfig;\n filesList: any[] = [];\n data: any[] = [];\n isUploaded: boolean = false;\n isImportTypeSelected: boolean = false;\n viewerConfig: ViewerConfig;\n fileData: any[] = [];\n failedItems: any[] = [];\n selectedFields: any[] = [];\n importSteps: any = [\n {\n id: 1,\n step: 1,\n title: 'Upload',\n progressTitle: '',\n progressDescription: ''\n },\n {\n id: 2,\n step: 2,\n title: 'Field Mappings',\n progressTitle: '',\n progressDescription: ''\n },\n {\n id: 3,\n step: 3,\n title: 'Data Validation',\n progressTitle: 'Data Being Validated',\n progressDescription: 'The data is currently being validated and checked for errors, please do not navigate away from this page. '\n },\n {\n id: 4,\n step: 3,\n title: 'Data Validation & Errors',\n progressTitle: '',\n progressDescription: ''\n },\n {\n id: 5,\n step: 4,\n title: 'Data Importing',\n progressTitle: 'Data Being Imported',\n progressDescription: 'The data is currently being imported and saved, please do not navigate away from this page. After the import is completed, you will be redirected to a page with the imported records.'\n },\n {\n id: 6,\n step: 5,\n title: 'Success Page & Data Preview',\n progressTitle: '',\n progressDescription: ''\n },\n ];\n currentStep: any = 1;\n\n constructor(\n private alertService: AlertService,\n private errorHandler: ErrorHandlerService,\n private http: HttpService,\n ) {\n this.filesConfig = {\n fileId: \"file\",\n containerId: \"fileContainer\",\n styles: {\n height: \"200px\"\n },\n acceptFile: '.csv',\n multiple: false,\n maxSize: 10,\n acceptFileText: \".csv\"\n };\n }\n\n ngOnInit() {\n }\n\n get step() {\n return this.importSteps.find(step => step.id == this.currentStep);\n }\n\n async fileChanged(event: any) {\n this.currentStep = 2;\n this.filesList = event;\n\n let selectedFile = null;\n let jsonData = null;\n const reader = new FileReader();\n const file = this.filesList[0];\n reader.onload = (event) => {\n const data = reader.result;\n selectedFile = XLSX.read(data, {\n type: 'binary',\n cellDates: true,\n });\n jsonData = selectedFile.SheetNames.reduce((initial, name) => {\n const sheet = selectedFile.Sheets[name];\n initial = XLSX.utils.sheet_to_json(sheet, {\n header: 0,\n defval: \"\",\n });\n return initial;\n }, {});\n this.fileData = jsonData;\n }\n reader.readAsBinaryString(file);\n return;\n }\n\n mappingProcessed(event: any) {\n this.currentStep = 3;\n setTimeout(x => {\n this.selectedFields = event.fields;\n const tempFileData = JSON.parse(JSON.stringify(this.fileData));\n tempFileData.forEach(data => {\n for (var key in data) {\n var field = event.fields.find((field: any) => field.label == key);\n if (field) {\n if ((field.propertyType == 'date' || field.propertyType == 'dateTime') && this.isValidDate(new Date(data[field.label]))) {\n data[field.property] = (new Date(data[field.label]) as Date).toISOString();\n }\n else {\n data[field.property] = data[field.label];\n }\n delete data[key];\n }\n else {\n delete data[key];\n }\n }\n });\n this.save(tempFileData);\n }, 2000);\n }\n\n async save(tempFileData: any) {\n try {\n this.http.post(this.config.apiUrl, { data: tempFileData })\n .pipe(\n untilDestroyed(this)\n ).subscribe((result: any) => {\n\n this.failedItems = result.failed_items;\n if (this.failedItems.length) {\n this.alertService.addAlert(result.msg, 'warn');\n }\n if (!(this.failedItems.length > 0)) {\n this.currentStep = 5;\n setTimeout(x => {\n this.currentStep = 6;\n this.result = result;\n }, 2000);\n }\n else {\n this.currentStep = 4;\n }\n });\n } catch (error) {\n if ((error.status === 422 || error.status === 400) && error.msg) {\n this.alertService.addAlert(error.msg, \"warning\");\n }\n this.errorHandler.handleError(error);\n this.reUpload();\n }\n }\n\n isValidDate(d: any) {\n return d instanceof Date && !isNaN(d.getTime());\n }\n\n reUpload() {\n this.data = [];\n this.fileData = [];\n this.filesList = [];\n this.failedItems = [];\n this.selectedFields = [];\n this.currentStep = 1;\n }\n\n}\n","import { Component, Input, OnInit } from '@angular/core';\n\n@Component({\n selector: 'app-data-import',\n templateUrl: './data-import.component.html',\n styleUrls: ['./data-import.component.scss']\n})\nexport class DataImportComponent implements OnInit {\n @Input() step: any;\n\n constructor() { }\n\n ngOnInit() {\n }\n\n}\n","import { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { DocumentViewerModule } from './../document-viewer/document-viewer.module';\nimport { FileDropperModule } from './../file-dropper/file-dropper.module';\nimport { MaterialModule } from './../material.module';\nimport { ImportSuccessComponent } from './import-success/import-success.component';\nimport { ImportHistoryListComponent } from './import-history-list/import-history-list.component';\nimport { FieldMappingComponent } from './field-mapping/field-mapping.component';\nimport { FailedItemsListComponent } from './failed-items-list/failed-items-list.component';\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ImportCsvComponent } from './import-csv.component';\nimport { RouterModule } from '@angular/router';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { DataImportComponent } from './data-import/data-import.component';\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n FlexLayoutModule,\n RouterModule,\n MaterialModule,\n FlexLayoutModule,\n FileDropperModule,\n DocumentViewerModule,\n InfiniteScrollModule\n ],\n declarations: [\n ImportCsvComponent,\n FieldMappingComponent,\n FailedItemsListComponent,\n ImportHistoryListComponent,\n ImportSuccessComponent,\n DataImportComponent\n ],\n providers: [],\n exports: [\n ImportCsvComponent\n ],\n})\nexport class ImportCsvModule { }\n","import { Component, Input, OnInit } from '@angular/core';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { PageEvent } from '../data-table/data-table.model';\nimport { HttpService } from '../core/http.service';\nimport { TimelineValue } from '../timeline-filter';\n\n@UntilDestroy()\n@Component({\n selector: 'app-login-history-for-user',\n templateUrl: './login-history-for-user.component.html',\n styleUrls: ['./login-history-for-user.component.scss']\n})\nexport class LoginHistoryForUserComponent implements OnInit {\n\n loginHistoryList: any[] = [];\n pageEvent: PageEvent = { page: 1, perPage: 25, lastPage: 1 };\n filters: any = {\n sort_by: 'created_at|desc',\n };\n historyFilterForm: FormGroup;\n displayedColumns: any[] = ['index', 'created_at'];\n @Input() userId: any;\n\n constructor(\n private http: HttpService,\n private fb: FormBuilder,\n ) {\n this.historyFilterForm = this.fb.group({\n 'duration': [''],\n 'date_from': [''],\n 'date_to': ['']\n });\n }\n\n ngOnInit() {\n this.filters.user_id = this.userId;\n this.historyFilterForm.valueChanges\n .pipe(debounceTime(500), distinctUntilChanged(), untilDestroyed(this))\n .subscribe((value: any) => {\n value.date_from = value.date_from ? (value.date_from as Date).toISOString() : '';\n value.date_to = value.date_to ? (value.date_to as Date).toISOString() : '';\n this.filterChange(value);\n });\n this.initializeData();\n }\n\n onTimelineChange(range: TimelineValue) {\n let date_from = range?.date_from ? new Date(range.date_from) : '';\n let date_to = range?.date_to ? new Date(range.date_to) : '';\n this.historyFilterForm.patchValue({\n date_from,\n date_to\n });\n }\n\n initializeData() {\n this.http.get(`api/user-login-history`, { params: { ...this.filters, ...this.pageEvent } })\n .pipe(untilDestroyed(this))\n .subscribe((result: any) => {\n this.loginHistoryList = this.loginHistoryList.concat(result.data);\n this.pageEvent.page = result.current_page;\n this.pageEvent.lastPage = result.last_page;\n });\n }\n\n filterChange(event: any) {\n this.filters = {\n ...this.filters,\n ...event\n };\n this.reload();\n }\n\n onScroll() {\n if (this.pageEvent.lastPage > this.pageEvent.page) {\n this.pageEvent.page += 1;\n this.initializeData();\n }\n }\n\n\n reload() {\n this.loginHistoryList = [];\n this.pageEvent = { page: 1, perPage: 25, lastPage: 1 };\n this.initializeData();\n }\n\n ngOnDestroy() {\n //Until destroyed uses it\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { Routes, RouterModule } from '@angular/router';\nimport { AuthenticationGuard } from '../core/authentication.guard';\nimport { LoginHistoryForUserComponent } from './login-history-for-user.component';\n\nconst routes: Routes = [\n {\n path: '',\n component: LoginHistoryForUserComponent,\n canActivate: [AuthenticationGuard]\n },\n];\n\n@NgModule({\n imports: [RouterModule.forChild(routes)],\n exports: [RouterModule]\n})\nexport class LoginHistoryForUserRoutingModule { }\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { LoginHistoryForUserRoutingModule } from './login-history-for-user-routing.module';\nimport { LoginHistoryForUserComponent } from './login-history-for-user.component';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MaterialModule } from '../material.module';\nimport { TimelineFilterModule } from '../timeline-filter/timeline-filter.module';\n\n\n@NgModule({\n declarations: [LoginHistoryForUserComponent],\n imports: [\n CommonModule,\n LoginHistoryForUserRoutingModule,\n InfiniteScrollModule,\n MaterialModule,\n FlexLayoutModule,\n ReactiveFormsModule,\n TimelineFilterModule\n ],\n exports: [LoginHistoryForUserComponent]\n})\nexport class LoginHistoryForUserModule { }\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { Component, ElementRef, OnInit, Input, OnDestroy, Inject, Optional, Self } from '@angular/core';\nimport { ControlValueAccessor, FormControl, NgControl } from '@angular/forms';\nimport { MatFormField, MatFormFieldControl, MAT_FORM_FIELD } from '@angular/material/form-field';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { HttpService } from '../core/http.service';\n\n@UntilDestroy()\n@Component({\n selector: 'app-techlify-tagger-tag-selector',\n templateUrl: './techlify-tagger-tag-selector.component.html',\n styleUrls: ['./techlify-tagger-tag-selector.component.scss'],\n providers: [{ provide: MatFormFieldControl, useExisting: TechlifyTaggerTagSelectorComponent }],\n})\nexport class TechlifyTaggerTagSelectorComponent implements OnInit, ControlValueAccessor, MatFormFieldControl<any>, OnDestroy {\n\n /**Pass the Categories to filter for a model */\n @Input() categories: string[] = [];\n @Input() multiple: boolean = false;\n @Input() enableSearch: boolean = true;\n tagSelectorCtrl = new FormControl();\n @Input() showAllTags: boolean = false;\n @Input() useSelectButtonStyle: boolean = false;\n\n tags: any[] = [];\n\n static nextId = 0;\n stateChanges = new Subject<void>();\n focused = false;\n controlType = 'techlify-tagger-selector';\n id = `techlify-tagger-selector-${TechlifyTaggerTagSelectorComponent.nextId++}`;\n\n onChange = (_: any) => { };\n onTouched = () => { };\n\n get apiUrl() {\n if (this.showAllTags) {\n return 'api/techlify-tagger-tags'\n }\n else if (this.categories?.length > 0) {\n return 'api/techlify-tagger-tags?categories=' + this.categories.join(',');\n }\n else {\n return '';\n }\n }\n\n //Default Getter and Setters for a Form Field Implementation\n get empty() {\n return this.value.length == 0;\n }\n\n get shouldLabelFloat() {\n return this.focused || !this.empty;\n }\n\n @Input()\n get required(): boolean {\n return this._required;\n }\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n private _required = false;\n\n @Input()\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = coerceBooleanProperty(value);\n this._disabled ? this.tagSelectorCtrl.disable() : this.tagSelectorCtrl.enable();\n this.stateChanges.next();\n }\n private _disabled = false;\n\n\n private _value: any;\n @Input()\n get value(): any {\n return this._value;\n }\n set value(val: any) {\n this._value = val;\n this.tagSelectorCtrl.setValue(val);\n this.stateChanges.next();\n }\n\n get errorState(): boolean {\n return this.tagSelectorCtrl.dirty && this.required && (this.value.length == 0);\n }\n\n @Input()\n get placeholder(): string {\n return this._placeholder;\n }\n set placeholder(value: string) {\n this._placeholder = value;\n this.stateChanges.next();\n }\n private _placeholder: string;\n\n\n ngOnInit(): void {\n if (this.useSelectButtonStyle) {\n this.httpService.get(this.apiUrl)\n .pipe(untilDestroyed(this))\n .subscribe((res: any) => {\n this.tags = res.data;\n })\n }\n }\n\n selectionChange(value: any) {\n this.value = value;\n this._handleInput();\n }\n\n constructor(\n private _focusMonitor: FocusMonitor,\n private _elementRef: ElementRef<HTMLElement>,\n private httpService: HttpService,\n @Optional() @Inject(MAT_FORM_FIELD) public _formField: MatFormField,\n @Optional() @Self() public ngControl: NgControl) {\n\n //Set Focus Monitor\n _focusMonitor.monitor(_elementRef, true).subscribe(origin => {\n if (this.focused && !origin) {\n this.onTouched();\n }\n this.focused = !!origin;\n this.stateChanges.next();\n });\n\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n }\n\n setDescribedByIds(ids: string[]) {\n // Just a empty implementation for Mat Form Field Interface\n }\n\n onContainerClick() {\n // Just a empty implementation for Mat Form Field Interface\n }\n\n writeValue(val: any): void {\n this.value = val;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n _handleInput(): void {\n this.onChange(this.value);\n }\n\n static ngAcceptInputType_disabled: BooleanInput;\n static ngAcceptInputType_required: BooleanInput;\n\n ngOnDestroy() {\n this.stateChanges.complete();\n this._focusMonitor.stopMonitoring(this._elementRef);\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TechlifyTaggerTagSelectorComponent } from './techlify-tagger-tag-selector.component';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\nimport { MaterialModule } from '../material.module';\nimport { SearchableSelectorModule } from '../searchable-selector/searchable-selector.module';\n\n\n\n@NgModule({\n declarations: [\n TechlifyTaggerTagSelectorComponent\n ],\n imports: [\n CommonModule,\n MaterialModule,\n FlexLayoutModule,\n MatAutocompleteModule,\n ReactiveFormsModule,\n SearchableSelectorModule,\n MatButtonToggleModule\n ],\n exports: [TechlifyTaggerTagSelectorComponent]\n})\nexport class TechlifyTaggerTagSelectorModule { }\n","import { DataManager } from './../core/dataManager.service';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TechlifyFeatureService {\n\n constructor(private dataManager: DataManager) { }\n\n getFeatures() {\n return this.dataManager.GET(`api/features`);\n }\n\n disableFeature(id: any) {\n return this.dataManager.GET(`api/feature/${id}/disable`);\n }\n\n enableFeature(id: any) {\n return this.dataManager.GET(`api/feature/${id}/enable`);\n }\n\n}\n","import { Component, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\nimport { MatDialog } from '@angular/material/dialog';\nimport { MatTableDataSource } from '@angular/material/table';\nimport { TechlifyFeatureService } from './techlify-feature.service';\nimport { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy';\nimport { debounceTime } from 'rxjs/operators';\nimport { ActionPopup, ActionPopupComponent } from '../action-popup';\nimport { DataManager } from '../core/dataManager.service';\nimport { ErrorHandlerService } from '../core/error-handler.service';\nimport { AlertService } from '../core/alert.service';\nimport { StorageService } from '../core/storage.service';\n@UntilDestroy()\n@Component({\n selector: 'app-techlify-listing-feature',\n templateUrl: './techlify-feature-listing.component.html',\n styleUrls: ['./techlify-feature-listing.component.scss']\n})\nexport class TechlifyFeatureListingComponent implements OnInit {\n\n features: any[] = []\n displayedColumns: string[] = [\n 'index',\n 'feature',\n 'description',\n 'actions',\n ]\n\n dataSource = new MatTableDataSource()\n\n page: number = 1;\n lastPage: number;\n perPage: number = 25;\n\n isWorking: boolean = false\n filterFormGroup: FormGroup;\n featureToggleForm: FormGroup;\n\n constructor(\n private dataManager: DataManager,\n private errorHandler: ErrorHandlerService,\n private fb: FormBuilder,\n private alertService: AlertService,\n private dialog: MatDialog,\n private storage: StorageService,\n private featureService: TechlifyFeatureService\n ) {\n this.filterFormGroup = this.fb.group({\n num_items: [\"\"]\n })\n }\n\n ngOnInit() {\n this.loadData()\n this.listenForChanges()\n }\n\n listenForChanges() {\n this.filterFormGroup.valueChanges\n .pipe(debounceTime(500), untilDestroyed(this))\n .subscribe((changes) => {\n this.reload()\n })\n }\n\n async loadData() {\n let result;\n try {\n this.isWorking = true\n var filter = this.filterFormGroup.value\n filter.page = this.page;\n filter.perPage = this.perPage;\n result = await this.dataManager.GET(`api/features`, filter);\n this.features = this.features.concat(result.data);\n this.dataSource = new MatTableDataSource(this.features);\n\n if (!this.storage.getItem('features')) {\n this.setStorage(this.features);\n }\n\n this.isWorking = false\n } catch (error) {\n this.errorHandler.handleError(error);\n } finally {\n this.isWorking = false;\n }\n }\n\n async toggeleFeature(element, feature) {\n let status = element ? 'Off' : \"On\";\n let data;\n const dialogRef = this.dialog.open(ActionPopupComponent, {\n width: \"400px\",\n data: <ActionPopup>{\n title: `Turn this feature ${status}?`,\n message: `Would you like to turn ${feature.title} feature ${status}`\n }\n })\n\n dialogRef.afterClosed().subscribe(async result => {\n if (result) {\n try {\n data = element\n ? await this.featureService.disableFeature(feature.id)\n : await this.featureService.enableFeature(feature.id);\n } catch (error) {\n this.errorHandler.handleError(error);\n } finally {\n this.alertService.addAlert(`You have just turned ${status} the feature ${feature.title}`, 'success');\n this.reload();\n this.storage.removeItem('features');\n this.setStorage(this.features);\n this.isWorking = false;\n }\n } else {\n this.reload();\n }\n })\n }\n\n setStorage(features) {\n let localFeatures = [];\n for (let feature of features) {\n if (!feature.client_feature) {\n if (feature.is_enabled_default) {\n localFeatures.push(feature.code);\n }\n } else {\n if (feature.client_feature.is_enabled) {\n localFeatures.push(feature.code);\n }\n }\n\n }\n this.storage.setItem(\"features\", localFeatures);\n }\n\n reload() {\n this.features = [];\n this.page = 1;\n if (!this.isWorking) {\n this.loadData();\n }\n }\n\n onScroll() {\n if (!this.isWorking && this.page < this.lastPage) {\n this.page += 1;\n this.loadData();\n }\n }\n\n sortColumn(event) {\n var direction = event.direction.toString().toUpperCase()\n this.assignFilter(event.active, direction)\n this.reload()\n }\n\n assignFilter(column, direction) {\n switch (column) {\n case 'name': {\n return this.filterFormGroup\n .get('sort_by')\n .setValue('first_name|' + direction)\n }\n case 'added_on': {\n return this.filterFormGroup\n .get('sort_by')\n .setValue('created_at|' + direction)\n }\n }\n }\n\n}\n","import { AuthenticationGuard } from './../core/authentication.guard';\nimport { Routes, RouterModule } from '@angular/router';\nimport { TechlifyFeatureListingComponent } from './techlify-feature-listing.component';\n\nconst routes: Routes = [\n {\n path: '',\n component: TechlifyFeatureListingComponent,\n canActivate: [AuthenticationGuard]\n },\n];\n\nexport const TechlifyFeatureRoutes = RouterModule.forChild(routes);\n","import { Component, Input, OnInit } from '@angular/core';\nimport { FormBuilder, FormGroup } from '@angular/forms';\n\n@Component({\n selector: 'app-on-off-switch',\n templateUrl: './on-off-switch.component.html',\n styleUrls: ['./on-off-switch.component.scss']\n})\n\nexport class OnOffSwitchComponent implements OnInit {\n\n @Input() value: boolean;\n slideToggle: FormGroup;\n\n constructor(private fb: FormBuilder) {\n this.slideToggle = this.fb.group({\n toggle: [\"\"]\n })\n }\n\n ngOnInit() {\n this.slideToggle.get('toggle').setValue(this.value);\n }\n\n}\n","import { Directive, ElementRef, Input } from '@angular/core';\nimport { ErrorHandlerService } from '../core/error-handler.service';\nimport { StorageService } from '../core/storage.service';\nimport { TechlifyFeatureService } from './techlify-feature.service';\n\n@Directive({\n selector: '[techlifyFeatureEnabled]'\n})\nexport class TechlifyFeatureEnabledDirective {\n\n features: any;\n localFeatures: any[] = [];\n @Input('techlifyFeatureEnabled') enabledFeature: any;\n\n constructor(\n private el: ElementRef,\n private featureService: TechlifyFeatureService,\n private errorHandler: ErrorHandlerService,\n private storage: StorageService) {\n\n }\n\n ngOnInit(): void {\n if (!this.storage.getItem('features')) {\n this.getFeatures();\n } else {\n this.checkForFeatureEnabled();\n }\n }\n\n async getFeatures() {\n try {\n let features = await this.featureService.getFeatures();\n\n for (let feature of features.data) {\n if (!feature.client_feature) {\n if (feature.is_enabled_default) {\n this.localFeatures.push(feature.code);\n }\n } else {\n if (feature.client_feature.is_enabled) {\n this.localFeatures.push(feature.code);\n }\n }\n\n }\n this.storage.setItem(\"features\", this.localFeatures);\n } catch (error) {\n this.errorHandler.handleError(error);\n } finally {\n this.checkForFeatureEnabled()\n }\n }\n\n checkForFeatureEnabled() {\n try {\n let features = this.storage.getItem('features');\n let features_split = features.split(',');\n\n if (features_split.includes(this.enabledFeature)) {\n this.el.nativeElement.style.display = \"show\";\n } else {\n this.el.nativeElement.remove();\n }\n\n } catch (error) {\n this.errorHandler.handleError(error);\n }\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TechlifyFeatureListingComponent } from './techlify-feature-listing.component';\n\nimport { TechlifyFeatureRoutes } from './techlify-feature.routing';\nimport { OnOffSwitchComponent } from './on-off-switch/on-off-switch.component';\nimport { FlexLayoutModule } from '@angular/flex-layout';\nimport { TechlifyFeatureEnabledDirective } from './techlify-feature-enabled.directive';\nimport { InfiniteScrollModule } from 'ngx-infinite-scroll';\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MaterialModule } from '../material.module';\n\n@NgModule({\n imports: [\n CommonModule,\n MaterialModule,\n FlexLayoutModule,\n TechlifyFeatureRoutes,\n MatSlideToggleModule,\n FormsModule,\n ReactiveFormsModule,\n InfiniteScrollModule\n ],\n declarations: [TechlifyFeatureListingComponent, OnOffSwitchComponent, TechlifyFeatureEnabledDirective],\n exports: [TechlifyFeatureListingComponent, TechlifyFeatureEnabledDirective]\n})\nexport class TechlifyFeatureModule { }\n"]}