tin-spa 2.0.0 → 2.1.1

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 (242) hide show
  1. package/README.md +2 -2
  2. package/esm2020/lib/classes/Classes.mjs +214 -0
  3. package/esm2020/lib/classes/TinCore.mjs +213 -0
  4. package/esm2020/lib/components/activity/activity.component.mjs +24 -0
  5. package/esm2020/lib/components/attach/attach.component.mjs +105 -0
  6. package/esm2020/lib/components/change-password/change-password.component.mjs +92 -0
  7. package/esm2020/lib/components/check/check.component.mjs +56 -0
  8. package/esm2020/lib/components/chips/chips.component.mjs +58 -0
  9. package/esm2020/lib/components/create-account/create-account.component.mjs +72 -0
  10. package/esm2020/lib/components/date/date.component.mjs +82 -0
  11. package/esm2020/lib/components/datetime/datetime.component.mjs +39 -0
  12. package/esm2020/lib/components/filter/filter.component.mjs +46 -0
  13. package/esm2020/lib/components/form/form.component.mjs +107 -0
  14. package/esm2020/lib/components/label/label.component.mjs +25 -0
  15. package/esm2020/lib/components/loader/loader.component.mjs +24 -0
  16. package/esm2020/lib/components/login/login.component.mjs +113 -0
  17. package/esm2020/lib/components/logs/logs.component.mjs +37 -0
  18. package/esm2020/lib/components/message/messageDialog.component.mjs +32 -0
  19. package/esm2020/lib/components/money/currency-input-mask.directive.mjs +185 -0
  20. package/esm2020/lib/components/money/currency-input-mask.module.mjs +28 -0
  21. package/esm2020/lib/components/money/money.component.mjs +108 -0
  22. package/esm2020/lib/components/nav-menu/nav-menu.component.mjs +49 -0
  23. package/esm2020/lib/components/number/number.component.mjs +102 -0
  24. package/esm2020/lib/components/option/option.component.mjs +59 -0
  25. package/esm2020/lib/components/profile/profile.component.mjs +93 -0
  26. package/esm2020/lib/components/recover-account/recover-account.component.mjs +46 -0
  27. package/esm2020/lib/components/roles/addRoleDialog.component.mjs +61 -0
  28. package/esm2020/lib/components/roles/roles.component.mjs +91 -0
  29. package/esm2020/lib/components/select/select.component.mjs +71 -0
  30. package/esm2020/lib/components/settings/settings.component.mjs +63 -0
  31. package/esm2020/lib/components/signup/signup.component.mjs +50 -0
  32. package/esm2020/lib/components/steps/steps.component.mjs +90 -0
  33. package/esm2020/lib/components/table/detailsDialog.component.mjs +137 -0
  34. package/esm2020/lib/components/table/table.component.mjs +350 -0
  35. package/esm2020/lib/components/text/text.component.mjs +166 -0
  36. package/esm2020/lib/components/tiles/tiles.component.mjs +41 -0
  37. package/esm2020/lib/components/tin-spa.component.mjs +19 -0
  38. package/esm2020/lib/components/users/users.component.mjs +119 -0
  39. package/esm2020/lib/modules/admin/admin-routing.module.mjs +29 -0
  40. package/esm2020/lib/modules/admin/admin.module.mjs +26 -0
  41. package/esm2020/lib/modules/index/index-routing.module.mjs +27 -0
  42. package/esm2020/lib/modules/index/index.module.mjs +26 -0
  43. package/esm2020/lib/modules/spa-admin.module.mjs +73 -0
  44. package/esm2020/lib/modules/spa-index.module.mjs +52 -0
  45. package/esm2020/lib/modules/spa-mat.module.mjs +67 -0
  46. package/esm2020/lib/modules/spa-user.module.mjs +49 -0
  47. package/esm2020/lib/modules/user/user-routing.module.mjs +23 -0
  48. package/esm2020/lib/modules/user/user.module.mjs +26 -0
  49. package/esm2020/lib/pipes/camelToWords.pipe.mjs +23 -0
  50. package/esm2020/lib/services/auth.service.mjs +142 -0
  51. package/esm2020/lib/services/data.service.mjs +125 -0
  52. package/esm2020/lib/services/export.service.mjs +16 -0
  53. package/esm2020/lib/services/http.service.mjs +79 -0
  54. package/esm2020/lib/services/loader-interceptor.service.mjs +77 -0
  55. package/esm2020/lib/services/loader.service.mjs +17 -0
  56. package/esm2020/lib/services/log.service.mjs +77 -0
  57. package/esm2020/lib/services/message.service.mjs +52 -0
  58. package/esm2020/lib/services/storage.service.mjs +34 -0
  59. package/esm2020/lib/services/tin-spa.service.mjs +14 -0
  60. package/esm2020/lib/tin-spa.module.mjs +114 -0
  61. package/esm2020/public-api.mjs +62 -0
  62. package/esm2020/tin-spa.mjs +5 -0
  63. package/fesm2015/tin-spa.mjs +4026 -0
  64. package/fesm2015/tin-spa.mjs.map +1 -0
  65. package/fesm2020/tin-spa.mjs +4008 -0
  66. package/fesm2020/tin-spa.mjs.map +1 -0
  67. package/index.d.ts +5 -0
  68. package/lib/classes/Classes.d.ts +69 -62
  69. package/lib/classes/TinCore.d.ts +6 -0
  70. package/lib/components/activity/activity.component.d.ts +3 -0
  71. package/lib/components/attach/attach.component.d.ts +4 -1
  72. package/lib/components/change-password/change-password.component.d.ts +3 -0
  73. package/lib/components/check/check.component.d.ts +3 -0
  74. package/lib/components/chips/chips.component.d.ts +3 -0
  75. package/lib/components/create-account/create-account.component.d.ts +3 -0
  76. package/lib/components/date/date.component.d.ts +19 -7
  77. package/lib/components/datetime/datetime.component.d.ts +3 -0
  78. package/lib/components/filter/filter.component.d.ts +4 -0
  79. package/lib/components/form/form.component.d.ts +23 -0
  80. package/lib/components/label/label.component.d.ts +3 -0
  81. package/lib/components/loader/loader.component.d.ts +3 -0
  82. package/lib/components/login/login.component.d.ts +6 -0
  83. package/lib/components/logs/logs.component.d.ts +3 -0
  84. package/lib/components/message/messageDialog.component.d.ts +3 -0
  85. package/lib/components/money/currency-input-mask.directive.d.ts +41 -0
  86. package/lib/components/money/currency-input-mask.module.d.ts +9 -0
  87. package/lib/components/money/money.component.d.ts +19 -3
  88. package/lib/components/nav-menu/nav-menu.component.d.ts +3 -0
  89. package/lib/components/number/number.component.d.ts +31 -0
  90. package/lib/components/option/option.component.d.ts +3 -0
  91. package/lib/components/profile/profile.component.d.ts +6 -2
  92. package/lib/components/recover-account/recover-account.component.d.ts +3 -0
  93. package/lib/components/roles/addRoleDialog.component.d.ts +3 -0
  94. package/lib/components/roles/roles.component.d.ts +3 -0
  95. package/lib/components/select/select.component.d.ts +5 -1
  96. package/lib/components/settings/settings.component.d.ts +3 -0
  97. package/lib/components/signup/signup.component.d.ts +3 -0
  98. package/lib/components/steps/steps.component.d.ts +3 -0
  99. package/lib/components/table/detailsDialog.component.d.ts +26 -0
  100. package/lib/components/table/table.component.d.ts +57 -17
  101. package/lib/components/text/text.component.d.ts +14 -10
  102. package/lib/components/tiles/tiles.component.d.ts +3 -0
  103. package/lib/components/tin-spa.component.d.ts +4 -4
  104. package/lib/components/users/users.component.d.ts +4 -0
  105. package/lib/modules/admin/admin-routing.module.d.ts +7 -0
  106. package/lib/modules/admin/admin.module.d.ts +9 -0
  107. package/lib/modules/index/index-routing.module.d.ts +7 -0
  108. package/lib/modules/index/index.module.d.ts +9 -0
  109. package/lib/modules/spa-admin.module.d.ts +13 -0
  110. package/lib/modules/spa-index.module.d.ts +10 -0
  111. package/lib/modules/spa-mat.module.d.ts +31 -0
  112. package/lib/modules/spa-user.module.d.ts +9 -0
  113. package/lib/modules/user/user-routing.module.d.ts +7 -0
  114. package/lib/modules/user/user.module.d.ts +9 -0
  115. package/lib/pipes/camelToWords.pipe.d.ts +7 -0
  116. package/lib/services/auth.service.d.ts +3 -0
  117. package/lib/services/data.service.d.ts +5 -1
  118. package/lib/services/export.service.d.ts +3 -4
  119. package/lib/services/http.service.d.ts +3 -0
  120. package/lib/services/loader-interceptor.service.d.ts +3 -0
  121. package/lib/services/loader.service.d.ts +3 -0
  122. package/lib/services/log.service.d.ts +3 -0
  123. package/lib/services/message.service.d.ts +3 -0
  124. package/lib/services/storage.service.d.ts +3 -0
  125. package/lib/services/tin-spa.service.d.ts +3 -0
  126. package/lib/tin-spa.module.d.ts +30 -0
  127. package/package.json +24 -23
  128. package/public-api.d.ts +7 -2
  129. package/bundles/tin-spa.umd.js +0 -3672
  130. package/bundles/tin-spa.umd.js.map +0 -1
  131. package/bundles/tin-spa.umd.min.js +0 -16
  132. package/bundles/tin-spa.umd.min.js.map +0 -1
  133. package/esm2015/lib/classes/Classes.js +0 -254
  134. package/esm2015/lib/classes/TinCore.js +0 -139
  135. package/esm2015/lib/components/activity/activity.component.js +0 -26
  136. package/esm2015/lib/components/attach/attach.component.js +0 -107
  137. package/esm2015/lib/components/change-password/change-password.component.js +0 -102
  138. package/esm2015/lib/components/check/check.component.js +0 -63
  139. package/esm2015/lib/components/chips/chips.component.js +0 -66
  140. package/esm2015/lib/components/create-account/create-account.component.js +0 -78
  141. package/esm2015/lib/components/date/date.component.js +0 -45
  142. package/esm2015/lib/components/datetime/datetime.component.js +0 -44
  143. package/esm2015/lib/components/filter/filter.component.js +0 -40
  144. package/esm2015/lib/components/label/label.component.js +0 -29
  145. package/esm2015/lib/components/loader/loader.component.js +0 -29
  146. package/esm2015/lib/components/login/login.component.js +0 -114
  147. package/esm2015/lib/components/logs/logs.component.js +0 -39
  148. package/esm2015/lib/components/message/messageDialog.component.js +0 -31
  149. package/esm2015/lib/components/money/money.component.js +0 -52
  150. package/esm2015/lib/components/nav-menu/nav-menu.component.js +0 -51
  151. package/esm2015/lib/components/option/option.component.js +0 -63
  152. package/esm2015/lib/components/profile/profile.component.js +0 -98
  153. package/esm2015/lib/components/recover-account/recover-account.component.js +0 -53
  154. package/esm2015/lib/components/roles/addRoleDialog.component.js +0 -61
  155. package/esm2015/lib/components/roles/roles.component.js +0 -94
  156. package/esm2015/lib/components/select/select.component.js +0 -77
  157. package/esm2015/lib/components/settings/settings.component.js +0 -63
  158. package/esm2015/lib/components/signup/signup.component.js +0 -57
  159. package/esm2015/lib/components/steps/steps.component.js +0 -93
  160. package/esm2015/lib/components/table/table.component.js +0 -107
  161. package/esm2015/lib/components/text/text.component.js +0 -165
  162. package/esm2015/lib/components/tiles/tiles.component.js +0 -41
  163. package/esm2015/lib/components/timeout/timeout.component.js +0 -90
  164. package/esm2015/lib/components/tin-spa.component.js +0 -19
  165. package/esm2015/lib/components/users/users.component.js +0 -120
  166. package/esm2015/lib/dnd.directive.js +0 -51
  167. package/esm2015/lib/modules/spa-admin.module.js +0 -50
  168. package/esm2015/lib/modules/spa-index.module.js +0 -35
  169. package/esm2015/lib/modules/spa-mat.module.js +0 -53
  170. package/esm2015/lib/modules/spa-user.module.js +0 -33
  171. package/esm2015/lib/services/auth.service.js +0 -155
  172. package/esm2015/lib/services/data.service.js +0 -115
  173. package/esm2015/lib/services/export.service.js +0 -29
  174. package/esm2015/lib/services/http.service.js +0 -84
  175. package/esm2015/lib/services/loader-interceptor.service.js +0 -83
  176. package/esm2015/lib/services/loader.service.js +0 -17
  177. package/esm2015/lib/services/log.service.js +0 -76
  178. package/esm2015/lib/services/message.service.js +0 -58
  179. package/esm2015/lib/services/storage.service.js +0 -42
  180. package/esm2015/lib/services/tin-spa.service.js +0 -14
  181. package/esm2015/lib/tin-spa.module.js +0 -91
  182. package/esm2015/public-api.js +0 -56
  183. package/esm2015/tin-spa.js +0 -8
  184. package/esm5/lib/classes/Classes.js +0 -313
  185. package/esm5/lib/classes/TinCore.js +0 -166
  186. package/esm5/lib/components/activity/activity.component.js +0 -27
  187. package/esm5/lib/components/attach/attach.component.js +0 -119
  188. package/esm5/lib/components/change-password/change-password.component.js +0 -104
  189. package/esm5/lib/components/check/check.component.js +0 -64
  190. package/esm5/lib/components/chips/chips.component.js +0 -68
  191. package/esm5/lib/components/create-account/create-account.component.js +0 -80
  192. package/esm5/lib/components/date/date.component.js +0 -46
  193. package/esm5/lib/components/datetime/datetime.component.js +0 -45
  194. package/esm5/lib/components/filter/filter.component.js +0 -41
  195. package/esm5/lib/components/label/label.component.js +0 -30
  196. package/esm5/lib/components/loader/loader.component.js +0 -31
  197. package/esm5/lib/components/login/login.component.js +0 -117
  198. package/esm5/lib/components/logs/logs.component.js +0 -41
  199. package/esm5/lib/components/message/messageDialog.component.js +0 -32
  200. package/esm5/lib/components/money/money.component.js +0 -53
  201. package/esm5/lib/components/nav-menu/nav-menu.component.js +0 -53
  202. package/esm5/lib/components/option/option.component.js +0 -64
  203. package/esm5/lib/components/profile/profile.component.js +0 -102
  204. package/esm5/lib/components/recover-account/recover-account.component.js +0 -55
  205. package/esm5/lib/components/roles/addRoleDialog.component.js +0 -63
  206. package/esm5/lib/components/roles/roles.component.js +0 -100
  207. package/esm5/lib/components/select/select.component.js +0 -79
  208. package/esm5/lib/components/settings/settings.component.js +0 -66
  209. package/esm5/lib/components/signup/signup.component.js +0 -59
  210. package/esm5/lib/components/steps/steps.component.js +0 -105
  211. package/esm5/lib/components/table/table.component.js +0 -109
  212. package/esm5/lib/components/text/text.component.js +0 -168
  213. package/esm5/lib/components/tiles/tiles.component.js +0 -42
  214. package/esm5/lib/components/timeout/timeout.component.js +0 -92
  215. package/esm5/lib/components/tin-spa.component.js +0 -17
  216. package/esm5/lib/components/users/users.component.js +0 -126
  217. package/esm5/lib/dnd.directive.js +0 -52
  218. package/esm5/lib/modules/spa-admin.module.js +0 -53
  219. package/esm5/lib/modules/spa-index.module.js +0 -38
  220. package/esm5/lib/modules/spa-mat.module.js +0 -56
  221. package/esm5/lib/modules/spa-user.module.js +0 -36
  222. package/esm5/lib/services/auth.service.js +0 -157
  223. package/esm5/lib/services/data.service.js +0 -116
  224. package/esm5/lib/services/export.service.js +0 -30
  225. package/esm5/lib/services/http.service.js +0 -85
  226. package/esm5/lib/services/loader-interceptor.service.js +0 -85
  227. package/esm5/lib/services/loader.service.js +0 -18
  228. package/esm5/lib/services/log.service.js +0 -112
  229. package/esm5/lib/services/message.service.js +0 -59
  230. package/esm5/lib/services/storage.service.js +0 -74
  231. package/esm5/lib/services/tin-spa.service.js +0 -16
  232. package/esm5/lib/tin-spa.module.js +0 -94
  233. package/esm5/public-api.js +0 -56
  234. package/esm5/tin-spa.js +0 -8
  235. package/fesm2015/tin-spa.js +0 -3184
  236. package/fesm2015/tin-spa.js.map +0 -1
  237. package/fesm5/tin-spa.js +0 -3422
  238. package/fesm5/tin-spa.js.map +0 -1
  239. package/lib/components/timeout/timeout.component.d.ts +0 -21
  240. package/lib/dnd.directive.d.ts +0 -8
  241. package/tin-spa.d.ts +0 -7
  242. package/tin-spa.metadata.json +0 -1
@@ -0,0 +1,32 @@
1
+ import { Component, Inject } from '@angular/core';
2
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/material/dialog";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "@angular/material/button";
7
+ import * as i4 from "@angular/material/form-field";
8
+ export class messageDialog {
9
+ constructor(dialogRef, data) {
10
+ this.dialogRef = dialogRef;
11
+ this.data = data;
12
+ }
13
+ ngOnInit() {
14
+ this.messageType = this.data.type;
15
+ this._messageSubject = this.data.subject;
16
+ this._messageDetails = this.data.details;
17
+ }
18
+ response(resp) {
19
+ this.dialogRef.close(resp);
20
+ }
21
+ }
22
+ messageDialog.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: messageDialog, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
23
+ messageDialog.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: messageDialog, selector: "lib-app-message", ngImport: i0, template: "\r\n <h2 mat-dialog-title>\r\n\r\n <mat-label *ngIf=\"messageType=='confirm'\">Confirm</mat-label>\r\n <mat-label *ngIf=\"messageType=='info'\">Information</mat-label>\r\n <mat-label *ngIf=\"messageType=='error'\">Error</mat-label>\r\n\r\n </h2>\r\n\r\n <mat-dialog-content class=\"mat-typography\">\r\n\r\n\r\n <!-- Confirm -->\r\n <p *ngIf=\"messageType=='confirm'\">{{_messageDetails}}</p>\r\n\r\n\r\n <!-- Information -->\r\n <div *ngIf=\"messageType=='info'\">\r\n\r\n <h3>{{_messageSubject}}</h3>\r\n <mat-label>{{_messageDetails}}</mat-label>\r\n\r\n </div>\r\n\r\n\r\n <!-- Error -->\r\n <div *ngIf=\"messageType=='error'\">\r\n\r\n <mat-label>{{_messageDetails}}</mat-label>\r\n\r\n </div>\r\n\r\n\r\n </mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n\r\n <button id=\"btnYes\" mat-stroked-button *ngIf=\"messageType=='confirm'\" (click)=\"response('yes')\" cdkFocusInitial>Yes</button>\r\n\r\n <button id=\"btnNo\" mat-stroked-button *ngIf=\"messageType=='confirm'\" (click)=\"response('no')\" >No</button>\r\n\r\n <button id=\"btnOK\" mat-stroked-button *ngIf=\"messageType=='info' || messageType=='error'\" (click)=\"response('ok')\" cdkFocusInitial>OK</button>\r\n\r\n</mat-dialog-actions>\r\n\r\n\r\n\r\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }] });
24
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: messageDialog, decorators: [{
25
+ type: Component,
26
+ args: [{ selector: 'lib-app-message', template: "\r\n <h2 mat-dialog-title>\r\n\r\n <mat-label *ngIf=\"messageType=='confirm'\">Confirm</mat-label>\r\n <mat-label *ngIf=\"messageType=='info'\">Information</mat-label>\r\n <mat-label *ngIf=\"messageType=='error'\">Error</mat-label>\r\n\r\n </h2>\r\n\r\n <mat-dialog-content class=\"mat-typography\">\r\n\r\n\r\n <!-- Confirm -->\r\n <p *ngIf=\"messageType=='confirm'\">{{_messageDetails}}</p>\r\n\r\n\r\n <!-- Information -->\r\n <div *ngIf=\"messageType=='info'\">\r\n\r\n <h3>{{_messageSubject}}</h3>\r\n <mat-label>{{_messageDetails}}</mat-label>\r\n\r\n </div>\r\n\r\n\r\n <!-- Error -->\r\n <div *ngIf=\"messageType=='error'\">\r\n\r\n <mat-label>{{_messageDetails}}</mat-label>\r\n\r\n </div>\r\n\r\n\r\n </mat-dialog-content>\r\n\r\n<mat-dialog-actions>\r\n\r\n <button id=\"btnYes\" mat-stroked-button *ngIf=\"messageType=='confirm'\" (click)=\"response('yes')\" cdkFocusInitial>Yes</button>\r\n\r\n <button id=\"btnNo\" mat-stroked-button *ngIf=\"messageType=='confirm'\" (click)=\"response('no')\" >No</button>\r\n\r\n <button id=\"btnOK\" mat-stroked-button *ngIf=\"messageType=='info' || messageType=='error'\" (click)=\"response('ok')\" cdkFocusInitial>OK</button>\r\n\r\n</mat-dialog-actions>\r\n\r\n\r\n\r\n" }]
27
+ }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
28
+ type: Inject,
29
+ args: [MAT_DIALOG_DATA]
30
+ }] }]; } });
31
+ ;
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZURpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy9tZXNzYWdlL21lc3NhZ2VEaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbWVzc2FnZS9tZXNzYWdlRGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBYSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7Ozs7OztBQVNwRixNQUFNLE9BQU8sYUFBYTtJQUV4QixZQUFvQixTQUFzQyxFQUFrQyxJQUFJO1FBQTVFLGNBQVMsR0FBVCxTQUFTLENBQTZCO1FBQWtDLFNBQUksR0FBSixJQUFJLENBQUE7SUFBSSxDQUFDO0lBR3JHLFFBQVE7UUFFTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFBO1FBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUUzQyxDQUFDO0lBTUQsUUFBUSxDQUFDLElBQVk7UUFFbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFN0IsQ0FBQzs7MEdBckJVLGFBQWEsOENBRTRDLGVBQWU7OEZBRnhFLGFBQWEsdURDVjFCLGd3Q0ErQ0E7MkZEckNhLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsaUJBQWlCOzswQkFNa0MsTUFBTTsyQkFBQyxlQUFlOztBQXFCcEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1hcHAtbWVzc2FnZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21lc3NhZ2VEaWFsb2cuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgbWVzc2FnZURpYWxvZyBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8bWVzc2FnZURpYWxvZz4sIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YSkgeyB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuXHJcbiAgICB0aGlzLm1lc3NhZ2VUeXBlID0gdGhpcy5kYXRhLnR5cGVcclxuICAgIHRoaXMuX21lc3NhZ2VTdWJqZWN0ID0gdGhpcy5kYXRhLnN1YmplY3Q7XHJcbiAgICB0aGlzLl9tZXNzYWdlRGV0YWlscyA9IHRoaXMuZGF0YS5kZXRhaWxzO1xyXG5cclxuICB9XHJcblxyXG4gIG1lc3NhZ2VUeXBlO1xyXG4gIF9tZXNzYWdlU3ViamVjdDtcclxuICBfbWVzc2FnZURldGFpbHM7XHJcblxyXG4gIHJlc3BvbnNlKHJlc3A6IHN0cmluZykge1xyXG5cclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJlc3ApO1xyXG5cclxuICB9XHJcblxyXG59O1xyXG5cclxuXHJcblxyXG4iLCJcclxuICA8aDIgbWF0LWRpYWxvZy10aXRsZT5cclxuXHJcbiAgICA8bWF0LWxhYmVsICpuZ0lmPVwibWVzc2FnZVR5cGU9PSdjb25maXJtJ1wiPkNvbmZpcm08L21hdC1sYWJlbD5cclxuICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJtZXNzYWdlVHlwZT09J2luZm8nXCI+SW5mb3JtYXRpb248L21hdC1sYWJlbD5cclxuICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJtZXNzYWdlVHlwZT09J2Vycm9yJ1wiPkVycm9yPC9tYXQtbGFiZWw+XHJcblxyXG4gIDwvaDI+XHJcblxyXG4gIDxtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiPlxyXG5cclxuXHJcbiAgICA8IS0tIENvbmZpcm0gLS0+XHJcbiAgICA8cCAqbmdJZj1cIm1lc3NhZ2VUeXBlPT0nY29uZmlybSdcIj57e19tZXNzYWdlRGV0YWlsc319PC9wPlxyXG5cclxuXHJcbiAgICA8IS0tIEluZm9ybWF0aW9uIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cIm1lc3NhZ2VUeXBlPT0naW5mbydcIj5cclxuXHJcbiAgICAgIDxoMz57e19tZXNzYWdlU3ViamVjdH19PC9oMz5cclxuICAgICAgPG1hdC1sYWJlbD57e19tZXNzYWdlRGV0YWlsc319PC9tYXQtbGFiZWw+XHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG5cclxuICAgIDwhLS0gRXJyb3IgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwibWVzc2FnZVR5cGU9PSdlcnJvcidcIj5cclxuXHJcbiAgICAgIDxtYXQtbGFiZWw+e3tfbWVzc2FnZURldGFpbHN9fTwvbWF0LWxhYmVsPlxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgPC9tYXQtZGlhbG9nLWNvbnRlbnQ+XHJcblxyXG48bWF0LWRpYWxvZy1hY3Rpb25zPlxyXG5cclxuICA8YnV0dG9uIGlkPVwiYnRuWWVzXCIgbWF0LXN0cm9rZWQtYnV0dG9uICAqbmdJZj1cIm1lc3NhZ2VUeXBlPT0nY29uZmlybSdcIiAoY2xpY2spPVwicmVzcG9uc2UoJ3llcycpXCIgY2RrRm9jdXNJbml0aWFsPlllczwvYnV0dG9uPlxyXG5cclxuICA8YnV0dG9uIGlkPVwiYnRuTm9cIiBtYXQtc3Ryb2tlZC1idXR0b24gKm5nSWY9XCJtZXNzYWdlVHlwZT09J2NvbmZpcm0nXCIgKGNsaWNrKT1cInJlc3BvbnNlKCdubycpXCIgPk5vPC9idXR0b24+XHJcblxyXG4gIDxidXR0b24gaWQ9XCJidG5PS1wiIG1hdC1zdHJva2VkLWJ1dHRvbiAqbmdJZj1cIm1lc3NhZ2VUeXBlPT0naW5mbycgfHwgbWVzc2FnZVR5cGU9PSdlcnJvcidcIiAoY2xpY2spPVwicmVzcG9uc2UoJ29rJylcIiBjZGtGb2N1c0luaXRpYWw+T0s8L2J1dHRvbj5cclxuXHJcbjwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG5cclxuXHJcblxyXG4iXX0=
@@ -0,0 +1,185 @@
1
+ import { Directive, HostListener, forwardRef } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { DecimalPipe } from '@angular/common';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ export const CURRENCY_INPUT_MASK_DIRECTIVE_VALUE_ACCESSOR = {
7
+ provide: NG_VALUE_ACCESSOR,
8
+ useExisting: forwardRef(() => CurrencyInputMaskDirective),
9
+ multi: true
10
+ };
11
+ export class CurrencyInputMaskDirective {
12
+ constructor(elementRef, decimalPipe) {
13
+ this.elementRef = elementRef;
14
+ this.decimalPipe = decimalPipe;
15
+ this.DECIMAL_MARK = '.';
16
+ }
17
+ ngOnInit() {
18
+ this.el = this.elementRef.nativeElement;
19
+ }
20
+ handleFocus(event) {
21
+ const strVal = this.getInputValue();
22
+ const unmaskedStr = this.getUnmaskedValue(strVal);
23
+ this.updateInputValue(unmaskedStr);
24
+ }
25
+ handleCut(event) {
26
+ setTimeout(() => {
27
+ this.inputUpdated();
28
+ }, 0);
29
+ }
30
+ handleKeypress(event) {
31
+ // Restrict characters
32
+ const newChar = String.fromCharCode(event.which);
33
+ const allowedChars = /^[\d.]+$/;
34
+ if (!allowedChars.test(newChar)) {
35
+ event.preventDefault();
36
+ return;
37
+ }
38
+ // Handle decimal mark input
39
+ const currentValue = event.target.value;
40
+ const separatorIdx = currentValue.indexOf(this.DECIMAL_MARK);
41
+ const hasFractionalPart = (separatorIdx >= 0);
42
+ if (!hasFractionalPart || newChar !== this.DECIMAL_MARK) {
43
+ return;
44
+ }
45
+ const isOutsideSelection = !this.isIdxBetweenSelection(separatorIdx);
46
+ if (isOutsideSelection) {
47
+ const positionAfterMark = separatorIdx + 1;
48
+ this.setCursorPosition(positionAfterMark);
49
+ event.preventDefault();
50
+ return;
51
+ }
52
+ }
53
+ handleInput(event) {
54
+ this.inputUpdated();
55
+ }
56
+ handlePaste(event) {
57
+ setTimeout(() => {
58
+ this.inputUpdated();
59
+ }, 1);
60
+ }
61
+ handleBlur(event) {
62
+ const strVal = this.getInputValue();
63
+ const numVal = this.convertStrToDecimal(strVal);
64
+ this.maskInput(numVal);
65
+ this.onModelTouched.apply(event);
66
+ }
67
+ registerOnChange(callbackFunction) {
68
+ this.onModelChange = callbackFunction;
69
+ }
70
+ registerOnTouched(callbackFunction) {
71
+ this.onModelTouched = callbackFunction;
72
+ }
73
+ setDisabledState(value) {
74
+ this.el.disabled = value;
75
+ }
76
+ writeValue(numValue) {
77
+ this.maskInput(numValue);
78
+ }
79
+ maskInput(numVal) {
80
+ if (!this.isNumeric(numVal)) {
81
+ this.updateInputValue('');
82
+ return;
83
+ }
84
+ const strVal = this.convertDecimalToStr(numVal);
85
+ const newVal = this.transformWithPipe(strVal);
86
+ this.updateInputValue(newVal);
87
+ }
88
+ inputUpdated() {
89
+ this.restrictDecimalValue();
90
+ const strVal = this.getInputValue();
91
+ const unmaskedVal = this.getUnmaskedValue(strVal);
92
+ const numVal = this.convertStrToDecimal(unmaskedVal);
93
+ if (numVal !== this.lastNumVal) {
94
+ this.lastNumVal = numVal;
95
+ this.onModelChange(numVal);
96
+ }
97
+ }
98
+ restrictDecimalValue() {
99
+ const strVal = this.getInputValue();
100
+ const dotIdx = strVal.indexOf(this.DECIMAL_MARK);
101
+ const hasFractionalPart = (dotIdx >= 0);
102
+ if (hasFractionalPart) {
103
+ const fractionalPart = strVal.substring(dotIdx + 1);
104
+ if (fractionalPart.length > 2) {
105
+ const choppedVal = strVal.substring(0, dotIdx + 3);
106
+ this.updateInputValue(choppedVal, true);
107
+ return;
108
+ }
109
+ }
110
+ }
111
+ transformWithPipe(str) {
112
+ return this.decimalPipe.transform(str, '1.2-2');
113
+ }
114
+ getUnmaskedValue(value) {
115
+ return value.replace(/[^-\d\\.]/g, '');
116
+ }
117
+ updateInputValue(value, savePosition = false) {
118
+ if (savePosition) {
119
+ this.saveCursorPosition();
120
+ }
121
+ this.el.value = value;
122
+ }
123
+ getInputValue() {
124
+ return this.el.value;
125
+ }
126
+ convertStrToDecimal(str) {
127
+ return (this.isNumeric(str)) ? parseFloat(str) : null;
128
+ }
129
+ convertDecimalToStr(n) {
130
+ return (this.isNumeric(n)) ? n + '' : '';
131
+ }
132
+ isNumeric(n) {
133
+ return !isNaN(parseFloat(n)) && isFinite(n);
134
+ }
135
+ saveCursorPosition() {
136
+ const position = this.el.selectionStart;
137
+ setTimeout(() => {
138
+ this.setCursorPosition(position);
139
+ }, 1);
140
+ }
141
+ setCursorPosition(position) {
142
+ this.el.selectionStart = position;
143
+ this.el.selectionEnd = position;
144
+ }
145
+ isIdxBetweenSelection(idx) {
146
+ if (this.el.selectionStart === this.el.selectionEnd) {
147
+ return false;
148
+ }
149
+ return (idx >= this.el.selectionStart && idx < this.el.selectionEnd);
150
+ }
151
+ }
152
+ CurrencyInputMaskDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CurrencyInputMaskDirective, deps: [{ token: i0.ElementRef }, { token: i1.DecimalPipe }], target: i0.ɵɵFactoryTarget.Directive });
153
+ CurrencyInputMaskDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.3.0", type: CurrencyInputMaskDirective, selector: "[appCurrencyInputMask]", host: { listeners: { "focus": "handleFocus($event)", "cut": "handleCut($event)", "keypress": "handleKeypress($event)", "input": "handleInput($event)", "paste": "handlePaste($event)", "blur": "handleBlur($event)" } }, providers: [
154
+ CURRENCY_INPUT_MASK_DIRECTIVE_VALUE_ACCESSOR,
155
+ DecimalPipe
156
+ ], ngImport: i0 });
157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CurrencyInputMaskDirective, decorators: [{
158
+ type: Directive,
159
+ args: [{
160
+ selector: '[appCurrencyInputMask]',
161
+ providers: [
162
+ CURRENCY_INPUT_MASK_DIRECTIVE_VALUE_ACCESSOR,
163
+ DecimalPipe
164
+ ]
165
+ }]
166
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.DecimalPipe }]; }, propDecorators: { handleFocus: [{
167
+ type: HostListener,
168
+ args: ['focus', ['$event']]
169
+ }], handleCut: [{
170
+ type: HostListener,
171
+ args: ['cut', ['$event']]
172
+ }], handleKeypress: [{
173
+ type: HostListener,
174
+ args: ['keypress', ['$event']]
175
+ }], handleInput: [{
176
+ type: HostListener,
177
+ args: ['input', ['$event']]
178
+ }], handlePaste: [{
179
+ type: HostListener,
180
+ args: ['paste', ['$event']]
181
+ }], handleBlur: [{
182
+ type: HostListener,
183
+ args: ['blur', ['$event']]
184
+ }] } });
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktaW5wdXQtbWFzay5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy9tb25leS9jdXJyZW5jeS1pbnB1dC1tYXNrLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDQSxVQUFVLEVBQ3ZCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQUU5QyxNQUFNLENBQUMsTUFBTSw0Q0FBNEMsR0FBUTtJQUMvRCxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsMEJBQTBCLENBQUM7SUFDekQsS0FBSyxFQUFFLElBQUk7Q0FDWixDQUFDO0FBU0YsTUFBTSxPQUFPLDBCQUEwQjtJQU9yQyxZQUNVLFVBQXNCLEVBQ3RCLFdBQXdCO1FBRHhCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFKMUIsaUJBQVksR0FBRyxHQUFHLENBQUM7SUFLdkIsQ0FBQztJQUVMLFFBQVE7UUFDTixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQzFDLENBQUM7SUFHRCxXQUFXLENBQUMsS0FBVTtRQUNwQixNQUFNLE1BQU0sR0FBVyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDNUMsTUFBTSxXQUFXLEdBQVcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBR0QsU0FBUyxD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aXQsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBFbGVtZW50UmVmLCBmb3J3YXJkUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgRGVjaW1hbFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuZXhwb3J0IGNvbnN0IENVUlJFTkNZX0lOUFVUX01BU0tfRElSRUNUSVZFX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XHJcbiAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3VycmVuY3lJbnB1dE1hc2tEaXJlY3RpdmUpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1thcHBDdXJyZW5jeUlucHV0TWFza10nLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAgQ1VSUkVOQ1lfSU5QVVRfTUFTS19ESVJFQ1RJVkVfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICBEZWNpbWFsUGlwZVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5SW5wdXRNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XHJcbiAgcHJpdmF0ZSBlbDogSFRNTElucHV0RWxlbWVudDtcclxuICBwcml2YXRlIG9uTW9kZWxDaGFuZ2U6IEZ1bmN0aW9uO1xyXG4gIHByaXZhdGUgb25Nb2RlbFRvdWNoZWQ6IEZ1bmN0aW9uO1xyXG4gIHByaXZhdGUgbGFzdE51bVZhbDogbnVtYmVyO1xyXG4gIHByaXZhdGUgREVDSU1BTF9NQVJLID0gJy4nO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgZGVjaW1hbFBpcGU6IERlY2ltYWxQaXBlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmVsID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdmb2N1cycsIFsnJGV2ZW50J10pXHJcbiAgaGFuZGxlRm9jdXMoZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3Qgc3RyVmFsOiBzdHJpbmcgPSB0aGlzLmdldElucHV0VmFsdWUoKTtcclxuICAgIGNvbnN0IHVubWFza2VkU3RyOiBzdHJpbmcgPSB0aGlzLmdldFVubWFza2VkVmFsdWUoc3RyVmFsKTtcclxuICAgIHRoaXMudXBkYXRlSW5wdXRWYWx1ZSh1bm1hc2tlZFN0cik7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjdXQnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUN1dChldmVudDogYW55KSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pbnB1dFVwZGF0ZWQoKTtcclxuICAgIH0sIDApO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5cHJlc3MnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleXByZXNzKGV2ZW50OiBhbnkpIHtcclxuICAgIC8vIFJlc3RyaWN0IGNoYXJhY3RlcnNcclxuICAgIGNvbnN0IG5ld0NoYXI6IHN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQud2hpY2gpO1xyXG4gICAgY29uc3QgYWxsb3dlZENoYXJzOiBSZWdFeHAgPSAvXltcXGQuXSskLztcclxuICAgIGlmICghYWxsb3dlZENoYXJzLnRlc3QobmV3Q2hhcikpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gSGFuZGxlIGRlY2ltYWwgbWFyayBpbnB1dFxyXG4gICAgY29uc3QgY3VycmVudFZhbHVlOiBzdHJpbmcgPSBldmVudC50YXJnZXQudmFsdWU7XHJcbiAgICBjb25zdCBzZXBhcmF0b3JJZHg6IG51bWJlciA9IGN1cnJlbnRWYWx1ZS5pbmRleE9mKHRoaXMuREVDSU1BTF9NQVJLKTtcclxuICAgIGNvbnN0IGhhc0ZyYWN0aW9uYWxQYXJ0OiBib29sZWFuID0gKHNlcGFyYXRvcklkeCA+PSAwKTtcclxuICAgIGlmICghaGFzRnJhY3Rpb25hbFBhcnQgfHwgbmV3Q2hhciAhPT0gdGhpcy5ERUNJTUFMX01BUkspIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaXNPdXRzaWRlU2VsZWN0aW9uID0gIXRoaXMuaXNJZHhCZXR3ZWVuU2VsZWN0aW9uKHNlcGFyYXRvcklkeCk7XHJcbiAgICBpZiAoaXNPdXRzaWRlU2VsZWN0aW9uKSB7XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uQWZ0ZXJNYXJrID0gc2VwYXJhdG9ySWR4ICsgMTtcclxuICAgICAgdGhpcy5zZXRDdXJzb3JQb3NpdGlvbihwb3NpdGlvbkFmdGVyTWFyayk7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVJbnB1dChldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmlucHV0VXBkYXRlZCgpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigncGFzdGUnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZVBhc3RlKGV2ZW50OiBhbnkpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmlucHV0VXBkYXRlZCgpO1xyXG4gICAgfSwgMSk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVCbHVyKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IHN0clZhbDogc3RyaW5nID0gdGhpcy5nZXRJbnB1dFZhbHVlKCk7XHJcbiAgICBjb25zdCBudW1WYWw6IG51bWJlciA9IHRoaXMuY29udmVydFN0clRvRGVjaW1hbChzdHJWYWwpO1xyXG4gICAgdGhpcy5tYXNrSW5wdXQobnVtVmFsKTtcclxuICAgIHRoaXMub25Nb2RlbFRvdWNoZWQuYXBwbHkoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShjYWxsYmFja0Z1bmN0aW9uOiBGdW5jdGlvbik6IHZvaWQge1xyXG4gICAgdGhpcy5vbk1vZGVsQ2hhbmdlID0gY2FsbGJhY2tGdW5jdGlvbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGNhbGxiYWNrRnVuY3Rpb246IEZ1bmN0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uTW9kZWxUb3VjaGVkID0gY2FsbGJhY2tGdW5jdGlvbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZWwuZGlzYWJsZWQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUobnVtVmFsdWU6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5tYXNrSW5wdXQobnVtVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYXNrSW5wdXQobnVtVmFsOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc051bWVyaWMobnVtVmFsKSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUlucHV0VmFsdWUoJycpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzdHJWYWw6IHN0cmluZyA9IHRoaXMuY29udmVydERlY2ltYWxUb1N0cihudW1WYWwpO1xyXG4gICAgY29uc3QgbmV3VmFsOiBzdHJpbmcgPSB0aGlzLnRyYW5zZm9ybVdpdGhQaXBlKHN0clZhbCk7XHJcbiAgICB0aGlzLnVwZGF0ZUlucHV0VmFsdWUobmV3VmFsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5wdXRVcGRhdGVkKCkge1xyXG4gICAgdGhpcy5yZXN0cmljdERlY2ltYWxWYWx1ZSgpO1xyXG4gICAgY29uc3Qgc3RyVmFsOiBzdHJpbmcgPSB0aGlzLmdldElucHV0VmFsdWUoKTtcclxuICAgIGNvbnN0IHVubWFza2VkVmFsOiBzdHJpbmcgPSB0aGlzLmdldFVubWFza2VkVmFsdWUoc3RyVmFsKTtcclxuICAgIGNvbnN0IG51bVZhbDogbnVtYmVyID0gdGhpcy5jb252ZXJ0U3RyVG9EZWNpbWFsKHVubWFza2VkVmFsKTtcclxuICAgIGlmIChudW1WYWwgIT09IHRoaXMubGFzdE51bVZhbCkge1xyXG4gICAgICB0aGlzLmxhc3ROdW1WYWwgPSBudW1WYWw7XHJcbiAgICAgIHRoaXMub25Nb2RlbENoYW5nZShudW1WYWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXN0cmljdERlY2ltYWxWYWx1ZSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0clZhbDogc3RyaW5nID0gdGhpcy5nZXRJbnB1dFZhbHVlKCk7XHJcbiAgICBjb25zdCBkb3RJZHg6IG51bWJlciA9IHN0clZhbC5pbmRleE9mKHRoaXMuREVDSU1BTF9NQVJLKTtcclxuICAgIGNvbnN0IGhhc0ZyYWN0aW9uYWxQYXJ0OiBib29sZWFuID0gKGRvdElkeCA+PSAwKTtcclxuICAgIGlmIChoYXNGcmFjdGlvbmFsUGFydCkge1xyXG4gICAgICBjb25zdCBmcmFjdGlvbmFsUGFydDogc3RyaW5nID0gc3RyVmFsLnN1YnN0cmluZyhkb3RJZHggKyAxKTtcclxuICAgICAgaWYgKGZyYWN0aW9uYWxQYXJ0Lmxlbmd0aCA+IDIpIHtcclxuICAgICAgICBjb25zdCBjaG9wcGVkVmFsOiBzdHJpbmcgPSBzdHJWYWwuc3Vic3RyaW5nKDAsIGRvdElkeCArIDMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlSW5wdXRWYWx1ZShjaG9wcGVkVmFsLCB0cnVlKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHRyYW5zZm9ybVdpdGhQaXBlKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmRlY2ltYWxQaXBlLnRyYW5zZm9ybShzdHIsICcxLjItMicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRVbm1hc2tlZFZhbHVlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1teLVxcZFxcXFwuXS9nLCAnJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUlucHV0VmFsdWUodmFsdWU6IHN0cmluZywgc2F2ZVBvc2l0aW9uID0gZmFsc2UpIHtcclxuICAgIGlmIChzYXZlUG9zaXRpb24pIHtcclxuICAgICAgdGhpcy5zYXZlQ3Vyc29yUG9zaXRpb24oKTtcclxuICAgIH1cclxuICAgIHRoaXMuZWwudmFsdWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0SW5wdXRWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuZWwudmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnZlcnRTdHJUb0RlY2ltYWwoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICh0aGlzLmlzTnVtZXJpYyhzdHIpKSA/IHBhcnNlRmxvYXQoc3RyKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNvbnZlcnREZWNpbWFsVG9TdHIobjogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiAodGhpcy5pc051bWVyaWMobikpID8gbiArICcnIDogJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzTnVtZXJpYyhuOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChuKSkgJiYgaXNGaW5pdGUobik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNhdmVDdXJzb3JQb3NpdGlvbigpIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uOiBudW1iZXIgPSB0aGlzLmVsLnNlbGVjdGlvblN0YXJ0O1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2V0Q3Vyc29yUG9zaXRpb24ocG9zaXRpb24pO1xyXG4gICAgfSwgMSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEN1cnNvclBvc2l0aW9uKHBvc2l0aW9uOiBudW1iZXIpIHtcclxuICAgIHRoaXMuZWwuc2VsZWN0aW9uU3RhcnQgPSBwb3NpdGlvbjtcclxuICAgIHRoaXMuZWwuc2VsZWN0aW9uRW5kID0gcG9zaXRpb247XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzSWR4QmV0d2VlblNlbGVjdGlvbihpZHg6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuZWwuc2VsZWN0aW9uU3RhcnQgPT09IHRoaXMuZWwuc2VsZWN0aW9uRW5kKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiAoaWR4ID49IHRoaXMuZWwuc2VsZWN0aW9uU3RhcnQgJiYgaWR4IDwgdGhpcy5lbC5zZWxlY3Rpb25FbmQpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -0,0 +1,28 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { CurrencyInputMaskDirective } from './currency-input-mask.directive';
5
+ import * as i0 from "@angular/core";
6
+ export class CurrencyInputModule {
7
+ }
8
+ CurrencyInputModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CurrencyInputModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
9
+ CurrencyInputModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: CurrencyInputModule, declarations: [CurrencyInputMaskDirective], imports: [CommonModule,
10
+ FormsModule], exports: [CurrencyInputMaskDirective] });
11
+ CurrencyInputModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CurrencyInputModule, imports: [CommonModule,
12
+ FormsModule] });
13
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CurrencyInputModule, decorators: [{
14
+ type: NgModule,
15
+ args: [{
16
+ imports: [
17
+ CommonModule,
18
+ FormsModule
19
+ ],
20
+ declarations: [
21
+ CurrencyInputMaskDirective
22
+ ],
23
+ exports: [
24
+ CurrencyInputMaskDirective
25
+ ]
26
+ }]
27
+ }] });
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktaW5wdXQtbWFzay5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90aW4tc3BhL3NyYy9saWIvY29tcG9uZW50cy9tb25leS9jdXJyZW5jeS1pbnB1dC1tYXNrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7O0FBYzdFLE1BQU0sT0FBTyxtQkFBbUI7O2dIQUFuQixtQkFBbUI7aUhBQW5CLG1CQUFtQixpQkFONUIsMEJBQTBCLGFBSjFCLFlBQVk7UUFDWixXQUFXLGFBTVgsMEJBQTBCO2lIQUdqQixtQkFBbUIsWUFWNUIsWUFBWTtRQUNaLFdBQVc7MkZBU0YsbUJBQW1CO2tCQVovQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7cUJBQ1o7b0JBQ0QsWUFBWSxFQUFFO3dCQUNaLDBCQUEwQjtxQkFDM0I7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLDBCQUEwQjtxQkFDM0I7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IEN1cnJlbmN5SW5wdXRNYXNrRGlyZWN0aXZlIH0gZnJvbSAnLi9jdXJyZW5jeS1pbnB1dC1tYXNrLmRpcmVjdGl2ZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtcclxuICAgIEN1cnJlbmN5SW5wdXRNYXNrRGlyZWN0aXZlXHJcbiAgXSxcclxuICBleHBvcnRzOiBbXHJcbiAgICBDdXJyZW5jeUlucHV0TWFza0RpcmVjdGl2ZVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5SW5wdXRNb2R1bGUge1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,108 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { FormControl, Validators } from '@angular/forms';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ import * as i2 from "@angular/forms";
6
+ import * as i3 from "@angular/material/form-field";
7
+ import * as i4 from "@angular/material/input";
8
+ import * as i5 from "./currency-input-mask.directive";
9
+ export class MoneyComponent {
10
+ constructor() {
11
+ this.readonly = false;
12
+ this.hint = "";
13
+ this.display = "";
14
+ this.placeholder = "";
15
+ this.value = "";
16
+ this.width = "100%";
17
+ this.currency = "";
18
+ this.valueChange = new EventEmitter();
19
+ this.leave = new EventEmitter();
20
+ this.enterPress = new EventEmitter();
21
+ //validation input
22
+ this.required = true;
23
+ this.min = 0;
24
+ this.max = 9000000000000000; //Math.max 9000000000000000
25
+ //validation
26
+ this.control = new FormControl(this.value, [Validators.required, Validators.min(this.min), Validators.max(this.max)]);
27
+ }
28
+ ngOnInit() {
29
+ if (this.placeholder == "") {
30
+ this.placeholder = "Enter " + this.display;
31
+ }
32
+ }
33
+ ngOnChanges() {
34
+ }
35
+ ngAfterViewInit() {
36
+ this.initControl(this.control);
37
+ }
38
+ initControl(control) {
39
+ if (this.readonly) {
40
+ control.setValidators(null);
41
+ control.updateValueAndValidity();
42
+ }
43
+ if (!this.required && !this.readonly) {
44
+ control.setValidators([Validators.min(this.min), Validators.max(this.max)]);
45
+ this.control.updateValueAndValidity();
46
+ }
47
+ }
48
+ changed(x) {
49
+ this.valueChange.emit(x);
50
+ }
51
+ leaved() {
52
+ this.leave.emit();
53
+ }
54
+ enterPressed() {
55
+ this.enterPress.emit();
56
+ }
57
+ validate(control) {
58
+ if (this.required && control.hasError('required')) {
59
+ return `Required`;
60
+ }
61
+ if (parseFloat(this.value) < this.min) {
62
+ return `Minimun value is ${this.min}`;
63
+ }
64
+ if (parseFloat(this.value) > this.max) {
65
+ return `Maximum value is ${this.max}`;
66
+ }
67
+ if (control.hasError('min')) {
68
+ return `Minimun value is ${this.min}`;
69
+ }
70
+ if (control.hasError('max')) {
71
+ return `Maximum value is ${this.max}`;
72
+ }
73
+ return "";
74
+ }
75
+ }
76
+ MoneyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MoneyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
77
+ MoneyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MoneyComponent, selector: "spa-money", inputs: { readonly: "readonly", hint: "hint", display: "display", placeholder: "placeholder", value: "value", width: "width", currency: "currency", required: "required", min: "min", max: "max" }, outputs: { valueChange: "valueChange", leave: "leave", enterPress: "enterPress" }, usesOnChanges: true, ngImport: i0, template: "\r\n\r\n<mat-form-field hideRequiredMarker=\"true\" [hintLabel]=\"hint\" [ngStyle]=\"{'width':width}\" hideRequiredMarker=\"true\" style=\"margin-right: 5px;\">\r\n <mat-label>{{display}}</mat-label>\r\n <input matInput appCurrencyInputMask autocomplete=\"off\" style=\"text-align: right;\"\r\n [min]=\"min\" [max]=\"max\"\r\n [ngModel]=\"value\" (ngModelChange)=\"changed($event)\" (keyup.enter)=\"enterPressed()\" (blur)=\"leaved()\" [placeholder]=\"placeholder\" [formControl]=\"control\" [readonly]=\"readonly\" />\r\n <span *ngIf=\"currency!=''\" matPrefix>{{currency}}&nbsp;</span>\r\n <mat-error *ngIf=\"control.invalid\">{{validate(control)}}</mat-error>\r\n</mat-form-field>\r\n\r\n", styles: ["input.example-right-align{-moz-appearance:textfield}.example-right-align{text-align:right}input.example-right-align::-webkit-outer-spin-button,input.example-right-align::-webkit-inner-spin-button{display:none}.curr{background-color:red}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i5.CurrencyInputMaskDirective, selector: "[appCurrencyInputMask]" }] });
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MoneyComponent, decorators: [{
79
+ type: Component,
80
+ args: [{ selector: 'spa-money', template: "\r\n\r\n<mat-form-field hideRequiredMarker=\"true\" [hintLabel]=\"hint\" [ngStyle]=\"{'width':width}\" hideRequiredMarker=\"true\" style=\"margin-right: 5px;\">\r\n <mat-label>{{display}}</mat-label>\r\n <input matInput appCurrencyInputMask autocomplete=\"off\" style=\"text-align: right;\"\r\n [min]=\"min\" [max]=\"max\"\r\n [ngModel]=\"value\" (ngModelChange)=\"changed($event)\" (keyup.enter)=\"enterPressed()\" (blur)=\"leaved()\" [placeholder]=\"placeholder\" [formControl]=\"control\" [readonly]=\"readonly\" />\r\n <span *ngIf=\"currency!=''\" matPrefix>{{currency}}&nbsp;</span>\r\n <mat-error *ngIf=\"control.invalid\">{{validate(control)}}</mat-error>\r\n</mat-form-field>\r\n\r\n", styles: ["input.example-right-align{-moz-appearance:textfield}.example-right-align{text-align:right}input.example-right-align::-webkit-outer-spin-button,input.example-right-align::-webkit-inner-spin-button{display:none}.curr{background-color:red}\n"] }]
81
+ }], ctorParameters: function () { return []; }, propDecorators: { readonly: [{
82
+ type: Input
83
+ }], hint: [{
84
+ type: Input
85
+ }], display: [{
86
+ type: Input
87
+ }], placeholder: [{
88
+ type: Input
89
+ }], value: [{
90
+ type: Input
91
+ }], width: [{
92
+ type: Input
93
+ }], currency: [{
94
+ type: Input
95
+ }], valueChange: [{
96
+ type: Output
97
+ }], leave: [{
98
+ type: Output
99
+ }], enterPress: [{
100
+ type: Output
101
+ }], required: [{
102
+ type: Input
103
+ }], min: [{
104
+ type: Input
105
+ }], max: [{
106
+ type: Input
107
+ }] } });
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbW9uZXkvbW9uZXkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbW9uZXkvbW9uZXkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBT3pELE1BQU0sT0FBTyxjQUFjO0lBRXpCO1FBNEJTLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFDYixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ1gsVUFBSyxHQUFHLE1BQU0sQ0FBQTtRQUNkLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFFYixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDM0IsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFJMUMsa0JBQWtCO1FBQ1QsYUFBUSxHQUFHLElBQUksQ0FBQztRQUNoQixRQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ1IsUUFBRyxHQUFHLGdCQUFnQixDQUFDLENBQUMsMkJBQTJCO1FBZTVELFlBQVk7UUFDWixZQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBN0RqRyxDQUFDO0lBRWpCLFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFO1lBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDNUM7SUFDSCxDQUFDO0lBRUQsV0FBVztJQUVYLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFvQjtRQUM5QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUVwQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVFLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUN2QztJQUNILENBQUM7SUFzQkQsT0FBTyxDQUFDLENBQUM7UUFDUCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFLRCxRQUFRLENBQUMsT0FBb0I7UUFFM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDakQsT0FBTyxVQUFVLENBQUM7U0FDbkI7UUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBQztZQUNwQyxPQUFPLG9CQUFvQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDdkM7UUFFRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNyQyxPQUFPLG9CQUFvQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDdkM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxvQkFBb0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ3ZDO1FBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNCLE9BQU8sb0JBQW9CLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztTQUN2QztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7MkdBeEZVLGNBQWM7K0ZBQWQsY0FBYyw2VkNSM0IsNHJCQVdBOzJGREhhLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0UsV0FBVzswRUFrQ1osUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBS0UsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3BhLW1vbmV5JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbW9uZXkuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL21vbmV5LmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTW9uZXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyID09IFwiXCIpIHtcclxuICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IFwiRW50ZXIgXCIgKyB0aGlzLmRpc3BsYXk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcygpIHtcclxuXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmluaXRDb250cm9sKHRoaXMuY29udHJvbClcclxuICB9XHJcblxyXG4gIGluaXRDb250cm9sKGNvbnRyb2w6IEZvcm1Db250cm9sKSB7XHJcbiAgICBpZiAodGhpcy5yZWFkb25seSkge1xyXG4gICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMobnVsbCk7XHJcbiAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLnJlcXVpcmVkICYmICF0aGlzLnJlYWRvbmx5KSB7XHJcblxyXG4gICAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMubWluKHRoaXMubWluKSwgVmFsaWRhdG9ycy5tYXgodGhpcy5tYXgpXSk7XHJcbiAgICAgIHRoaXMuY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhpbnQgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIGRpc3BsYXkgPSBcIlwiO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gXCJcIjtcclxuICBASW5wdXQoKSB2YWx1ZSA9IFwiXCI7XHJcbiAgQElucHV0KCkgd2lkdGggPSBcIjEwMCVcIlxyXG4gIEBJbnB1dCgpIGN1cnJlbmN5ID0gXCJcIjtcclxuXHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBsZWF2ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZW50ZXJQcmVzcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblxyXG5cclxuICAvL3ZhbGlkYXRpb24gaW5wdXRcclxuICBASW5wdXQoKSByZXF1aXJlZCA9IHRydWU7XHJcbiAgQElucHV0KCkgbWluID0gMDtcclxuICBASW5wdXQoKSBtYXggPSA5MDAwMDAwMDAwMDAwMDAwOyAvL01hdGgubWF4IDkwMDAwMDAwMDAwMDAwMDBcclxuXHJcblxyXG4gIGNoYW5nZWQoeCl7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQoeCk7XHJcbiAgfVxyXG5cclxuICBsZWF2ZWQoKSB7XHJcbiAgICB0aGlzLmxlYXZlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGVudGVyUHJlc3NlZCgpIHtcclxuICAgIHRoaXMuZW50ZXJQcmVzcy5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICAvL3ZhbGlkYXRpb25cclxuICBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKHRoaXMudmFsdWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbih0aGlzLm1pbiksIFZhbGlkYXRvcnMubWF4KHRoaXMubWF4KV0pO1xyXG5cclxuICB2YWxpZGF0ZShjb250cm9sOiBGb3JtQ29udHJvbCk6IHN0cmluZyB7XHJcblxyXG4gICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgY29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKSkge1xyXG4gICAgICByZXR1cm4gYFJlcXVpcmVkYDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFyc2VGbG9hdCh0aGlzLnZhbHVlKSA8IHRoaXMubWluKXtcclxuICAgICAgcmV0dXJuIGBNaW5pbXVuIHZhbHVlIGlzICR7dGhpcy5taW59YDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFyc2VGbG9hdCh0aGlzLnZhbHVlKSA+IHRoaXMubWF4KSB7XHJcbiAgICAgIHJldHVybiBgTWF4aW11bSB2YWx1ZSBpcyAke3RoaXMubWF4fWA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbnRyb2wuaGFzRXJyb3IoJ21pbicpKSB7XHJcbiAgICAgIHJldHVybiBgTWluaW11biB2YWx1ZSBpcyAke3RoaXMubWlufWA7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbnRyb2wuaGFzRXJyb3IoJ21heCcpKSB7XHJcbiAgICAgIHJldHVybiBgTWF4aW11bSB2YWx1ZSBpcyAke3RoaXMubWF4fWA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIiwiXHJcblxyXG48bWF0LWZvcm0tZmllbGQgaGlkZVJlcXVpcmVkTWFya2VyPVwidHJ1ZVwiIFtoaW50TGFiZWxdPVwiaGludFwiICBbbmdTdHlsZV09XCJ7J3dpZHRoJzp3aWR0aH1cIiBoaWRlUmVxdWlyZWRNYXJrZXI9XCJ0cnVlXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDVweDtcIj5cclxuICA8bWF0LWxhYmVsPnt7ZGlzcGxheX19PC9tYXQtbGFiZWw+XHJcbiAgPGlucHV0IG1hdElucHV0IGFwcEN1cnJlbmN5SW5wdXRNYXNrIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCJcclxuICBbbWluXT1cIm1pblwiIFttYXhdPVwibWF4XCJcclxuICBbbmdNb2RlbF09XCJ2YWx1ZVwiIChuZ01vZGVsQ2hhbmdlKT1cImNoYW5nZWQoJGV2ZW50KVwiIChrZXl1cC5lbnRlcik9XCJlbnRlclByZXNzZWQoKVwiIChibHVyKT1cImxlYXZlZCgpXCIgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW2Zvcm1Db250cm9sXT1cImNvbnRyb2xcIiBbcmVhZG9ubHldPVwicmVhZG9ubHlcIiAvPlxyXG4gIDxzcGFuICpuZ0lmPVwiY3VycmVuY3khPScnXCIgbWF0UHJlZml4Pnt7Y3VycmVuY3l9fSZuYnNwOzwvc3Bhbj5cclxuICA8bWF0LWVycm9yICpuZ0lmPVwiY29udHJvbC5pbnZhbGlkXCI+e3t2YWxpZGF0ZShjb250cm9sKX19PC9tYXQtZXJyb3I+XHJcbjwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4iXX0=
@@ -0,0 +1,49 @@
1
+ import { AppConfig } from './../../classes/Classes';
2
+ import { Component, Input } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/router";
5
+ import * as i2 from "../../services/auth.service";
6
+ import * as i3 from "@angular/common";
7
+ import * as i4 from "@angular/material/menu";
8
+ import * as i5 from "@angular/material/button";
9
+ import * as i6 from "@angular/material/icon";
10
+ export class NavMenuComponent {
11
+ constructor(router, authService) {
12
+ this.router = router;
13
+ this.authService = authService;
14
+ this.isExpanded = false;
15
+ this.appConfig = new AppConfig();
16
+ }
17
+ ngOnInit() {
18
+ this.authService.loggedUserFullName.subscribe(user => this.loggedUserFullName = user);
19
+ this.authService.myRoleObserv.subscribe(rol => this.myRole = rol);
20
+ this.authService.loggedinObserv.subscribe(obj => this.loggedin = obj);
21
+ }
22
+ collapse() {
23
+ this.isExpanded = false;
24
+ }
25
+ toggle() {
26
+ this.isExpanded = !this.isExpanded;
27
+ }
28
+ // logoff() {
29
+ // // this.authService.updateloggedin(false);
30
+ // // this.authService.updateRole(new Role());
31
+ // this.router.navigate(["login"]);
32
+ // // this.storageService.clear();
33
+ // }
34
+ redirectTo(link) {
35
+ this.collapse();
36
+ if (link != "") {
37
+ this.router.navigate([link]);
38
+ }
39
+ }
40
+ }
41
+ NavMenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NavMenuComponent, deps: [{ token: i1.Router }, { token: i2.AuthService }], target: i0.ɵɵFactoryTarget.Component });
42
+ NavMenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NavMenuComponent, selector: "spa-nav-menu", inputs: { appConfig: "appConfig" }, ngImport: i0, template: "<header *ngIf=\"loggedin\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n <!--<a class=\"navbar-brand\" [routerLink]=\"['/']\">Orbit</a>-->\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n\r\n <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\"navitems navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"redirectTo('login')\" class=\"d-none d-sm-block\" style=\"margin-right:2em\"> <mat-icon>logout</mat-icon> </button>\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon>account_circle</mat-icon> &nbsp;{{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"redirectTo('login')\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff;font-weight:600}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NavMenuComponent, decorators: [{
44
+ type: Component,
45
+ args: [{ selector: 'spa-nav-menu', template: "<header *ngIf=\"loggedin\">\r\n\r\n <nav class=\"toolbar navbar navbar-expand-sm navbar-toggleable-sm navbar-light border-bottom box-shadow mb-3 \" style=\"padding-right: 10px;\">\r\n\r\n <div class=\"container-fluid\" style=\"padding-right: 0px;\">\r\n <!--<a class=\"navbar-brand\" [routerLink]=\"['/']\">Orbit</a>-->\r\n\r\n <img *ngIf=\"appConfig.logo!=''\" [src]=\"appConfig.logo\" style=\"height: 50px; margin-right: 2em\" />\r\n\r\n\r\n <div style=\"font-size: 20px;\">\r\n {{appConfig.appName}}\r\n </div>\r\n\r\n\r\n <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-label=\"Toggle navigation\" [attr.aria-expanded]=\"isExpanded\" (click)=\"toggle()\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div *ngIf=\"myRole\" class=\"navitems navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse stack-top\" style=\"margin-right: 0px;\" [ngClass]=\"{ show: isExpanded }\" >\r\n\r\n <button mat-icon-button (click)=\"redirectTo('login')\" class=\"d-none d-sm-block\" style=\"margin-right:2em\"> <mat-icon>logout</mat-icon> </button>\r\n\r\n <button id=\"btnUser\" mat-button [matMenuTriggerFor]=\"profileMenu\" ><mat-icon>account_circle</mat-icon> &nbsp;{{loggedUserFullName}}</button>\r\n\r\n <mat-menu #profileMenu=\"matMenu\">\r\n <button id=\"btnProfile\" mat-menu-item (click)=\"redirectTo('home/user/profile')\" >Profile</button>\r\n <button id=\"btnLogOff\" mat-menu-item (click)=\"redirectTo('login')\">Log Off</button>\r\n </mat-menu>\r\n\r\n <div *ngFor=\"let item of appConfig.capItems\">\r\n\r\n <!-- Menu Item -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && !item.capSubItems && item.showMenu\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items ignored -->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && item.ignoreSubsDisplay\" mat-button (click)=\"redirectTo(item.link)\">{{item.display}}</button>\r\n\r\n <!-- Menu Item with Sub items to display-->\r\n <button id=\"btnMenu\" *ngIf=\"myRole[item.name] && item.capSubItems && item.showMenu && !item.ignoreSubsDisplay\" mat-button [matMenuTriggerFor]=\"adminMenu\">{{item.display}}</button>\r\n\r\n\r\n <!-- Sub Menu Items -->\r\n <mat-menu #adminMenu=\"matMenu\">\r\n\r\n <div *ngFor=\"let subItem of item.capSubItems\">\r\n\r\n <button *ngIf=\"myRole[subItem.name] && subItem.showMenu\" mat-menu-item (click)=\"redirectTo(subItem.link)\">{{subItem.display}}</button>\r\n\r\n </div>\r\n\r\n </mat-menu>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n </nav>\r\n\r\n</header>\r\n", styles: ["a.navbar-brand{white-space:normal;text-align:center;word-break:break-all}html{font-size:14px}.box-shadow{box-shadow:0 .25rem .75rem #0000000d}.toolbar{height:60px;display:flex;align-items:center;background-color:#03a;color:#fff;font-weight:600}.stack-top{z-index:9;margin:20px}.navitems{background-color:#03a}\n"] }]
46
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AuthService }]; }, propDecorators: { appConfig: [{
47
+ type: Input
48
+ }] } });
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2LW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGluLXNwYS9zcmMvbGliL2NvbXBvbmVudHMvbmF2LW1lbnUvbmF2LW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVN6RCxNQUFNLE9BQU8sZ0JBQWdCO0lBRTNCLFlBQW1CLE1BQWMsRUFBUyxXQUF3QjtRQUEvQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFhbEUsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVWLGNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBZmlDLENBQUM7SUFFdkUsUUFBUTtRQUVOLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxDQUFBO1FBQ3JGLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQTtJQUV2RSxDQUFDO0lBV0QsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUVELGFBQWE7SUFDYiwrQ0FBK0M7SUFDL0MsZ0RBQWdEO0lBQ2hELHFDQUFxQztJQUNyQyxvQ0FBb0M7SUFDcEMsSUFBSTtJQUVKLFVBQVUsQ0FBQyxJQUFZO1FBRXJCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQixJQUFJLElBQUksSUFBRSxFQUFFLEVBQUM7WUFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDOUI7SUFFSCxDQUFDOzs2R0E1Q1UsZ0JBQWdCO2lHQUFoQixnQkFBZ0Isd0ZDVjdCLDgxRkErREE7MkZEckRhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjO3VIQXFCZixTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwQ29uZmlnIH0gZnJvbSAnLi8uLi8uLi9jbGFzc2VzL0NsYXNzZXMnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgIEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc3BhLW5hdi1tZW51JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmF2LW1lbnUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25hdi1tZW51LmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmF2TWVudUNvbXBvbmVudCB7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByb3V0ZXI6IFJvdXRlciwgcHVibGljIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG5cclxuICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nZ2VkVXNlckZ1bGxOYW1lLnN1YnNjcmliZSh1c2VyID0+IHRoaXMubG9nZ2VkVXNlckZ1bGxOYW1lID0gdXNlcilcclxuICAgIHRoaXMuYXV0aFNlcnZpY2UubXlSb2xlT2JzZXJ2LnN1YnNjcmliZShyb2wgPT4gdGhpcy5teVJvbGUgPSByb2wpO1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5sb2dnZWRpbk9ic2Vydi5zdWJzY3JpYmUob2JqID0+IHRoaXMubG9nZ2VkaW4gPSBvYmopXHJcblxyXG4gIH1cclxuXHJcbiAgbXlSb2xlO1xyXG4gIGxvZ2dlZFVzZXJGdWxsTmFtZTogc3RyaW5nO1xyXG4gIGxvZ2dlZGluOiBib29sZWFuO1xyXG4gIGlzRXhwYW5kZWQgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgYXBwQ29uZmlnID0gbmV3IEFwcENvbmZpZygpO1xyXG5cclxuXHJcblxyXG4gIGNvbGxhcHNlKCkge1xyXG4gICAgdGhpcy5pc0V4cGFuZGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b2dnbGUoKSB7XHJcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSAhdGhpcy5pc0V4cGFuZGVkO1xyXG4gIH1cclxuXHJcbiAgLy8gbG9nb2ZmKCkge1xyXG4gIC8vICAgLy8gdGhpcy5hdXRoU2VydmljZS51cGRhdGVsb2dnZWRpbihmYWxzZSk7XHJcbiAgLy8gICAvLyB0aGlzLmF1dGhTZXJ2aWNlLnVwZGF0ZVJvbGUobmV3IFJvbGUoKSk7XHJcbiAgLy8gICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJsb2dpblwiXSk7XHJcbiAgLy8gICAvLyB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmNsZWFyKCk7XHJcbiAgLy8gfVxyXG5cclxuICByZWRpcmVjdFRvKGxpbms6IHN0cmluZyl7XHJcblxyXG4gICAgdGhpcy5jb2xsYXBzZSgpO1xyXG5cclxuICAgIGlmIChsaW5rIT1cIlwiKXtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2xpbmtdKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuXHJcbn1cclxuIiwiPGhlYWRlciAqbmdJZj1cImxvZ2dlZGluXCI+XHJcblxyXG4gIDxuYXYgY2xhc3M9XCJ0b29sYmFyIG5hdmJhciBuYXZiYXItZXhwYW5kLXNtIG5hdmJhci10b2dnbGVhYmxlLXNtIG5hdmJhci1saWdodCAgYm9yZGVyLWJvdHRvbSBib3gtc2hhZG93IG1iLTMgXCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxMHB4O1wiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDBweDtcIj5cclxuICAgICAgPCEtLTxhIGNsYXNzPVwibmF2YmFyLWJyYW5kXCIgW3JvdXRlckxpbmtdPVwiWycvJ11cIj5PcmJpdDwvYT4tLT5cclxuXHJcbiAgICAgIDxpbWcgKm5nSWY9XCJhcHBDb25maWcubG9nbyE9JydcIiBbc3JjXT1cImFwcENvbmZpZy5sb2dvXCIgc3R5bGU9XCJoZWlnaHQ6IDUwcHg7IG1hcmdpbi1yaWdodDogMmVtXCIgLz5cclxuXHJcblxyXG4gICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAyMHB4O1wiPlxyXG4gICAgICAgIHt7YXBwQ29uZmlnLmFwcE5hbWV9fVxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXJcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtdGFyZ2V0PVwiLm5hdmJhci1jb2xsYXBzZVwiIGFyaWEtbGFiZWw9XCJUb2dnbGUgbmF2aWdhdGlvblwiIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNFeHBhbmRlZFwiIChjbGljayk9XCJ0b2dnbGUoKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibmF2YmFyLXRvZ2dsZXItaWNvblwiPjwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwibXlSb2xlXCIgY2xhc3M9XCJuYXZpdGVtcyBuYXZiYXItY29sbGFwc2UgY29sbGFwc2UgZC1zbS1pbmxpbmUtZmxleCBmbGV4LXNtLXJvdy1yZXZlcnNlIHN0YWNrLXRvcFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAwcHg7XCIgW25nQ2xhc3NdPVwieyBzaG93OiBpc0V4cGFuZGVkIH1cIiA+XHJcblxyXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKCdsb2dpbicpXCIgY2xhc3M9XCJkLW5vbmUgZC1zbS1ibG9ja1wiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OjJlbVwiPiA8bWF0LWljb24+bG9nb3V0PC9tYXQtaWNvbj4gPC9idXR0b24+XHJcblxyXG4gICAgICAgIDxidXR0b24gaWQ9XCJidG5Vc2VyXCIgbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwicHJvZmlsZU1lbnVcIiAgPjxtYXQtaWNvbj5hY2NvdW50X2NpcmNsZTwvbWF0LWljb24+ICAmbmJzcDt7e2xvZ2dlZFVzZXJGdWxsTmFtZX19PC9idXR0b24+XHJcblxyXG4gICAgICAgIDxtYXQtbWVudSAjcHJvZmlsZU1lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuUHJvZmlsZVwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2hvbWUvdXNlci9wcm9maWxlJylcIiA+UHJvZmlsZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJ0bkxvZ09mZlwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInJlZGlyZWN0VG8oJ2xvZ2luJylcIj5Mb2cgT2ZmPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBhcHBDb25maWcuY2FwSXRlbXNcIj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1lbnUgSXRlbSAtLT5cclxuICAgICAgICAgIDxidXR0b24gaWQ9XCJidG5NZW51XCIgKm5nSWY9XCJteVJvbGVbaXRlbS5uYW1lXSAmJiAhaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51XCIgbWF0LWJ1dHRvbiAoY2xpY2spPVwicmVkaXJlY3RUbyhpdGVtLmxpbmspXCI+e3tpdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDwhLS0gTWVudSBJdGVtIHdpdGggU3ViIGl0ZW1zIGlnbm9yZWQgLS0+XHJcbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuTWVudVwiICpuZ0lmPVwibXlSb2xlW2l0ZW0ubmFtZV0gJiYgaXRlbS5jYXBTdWJJdGVtcyAmJiBpdGVtLnNob3dNZW51ICYmIGl0ZW0uaWdub3JlU3Vic0Rpc3BsYXlcIiBtYXQtYnV0dG9uIChjbGljayk9XCJyZWRpcmVjdFRvKGl0ZW0ubGluaylcIj57e2l0ZW0uZGlzcGxheX19PC9idXR0b24+XHJcblxyXG4gICAgICAgICAgPCEtLSBNZW51IEl0ZW0gd2l0aCBTdWIgaXRlbXMgdG8gZGlzcGxheS0tPlxyXG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJ0bk1lbnVcIiAqbmdJZj1cIm15Um9sZVtpdGVtLm5hbWVdICYmIGl0ZW0uY2FwU3ViSXRlbXMgJiYgaXRlbS5zaG93TWVudSAmJiAhaXRlbS5pZ25vcmVTdWJzRGlzcGxheVwiIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImFkbWluTWVudVwiPnt7aXRlbS5kaXNwbGF5fX08L2J1dHRvbj5cclxuXHJcblxyXG4gICAgICAgICAgPCEtLSBTdWIgTWVudSBJdGVtcyAtLT5cclxuICAgICAgICAgIDxtYXQtbWVudSAjYWRtaW5NZW51PVwibWF0TWVudVwiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViSXRlbSBvZiBpdGVtLmNhcFN1Ykl0ZW1zXCI+XHJcblxyXG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJteVJvbGVbc3ViSXRlbS5uYW1lXSAmJiBzdWJJdGVtLnNob3dNZW51XCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwicmVkaXJlY3RUbyhzdWJJdGVtLmxpbmspXCI+e3tzdWJJdGVtLmRpc3BsYXl9fTwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvbmF2PlxyXG5cclxuPC9oZWFkZXI+XHJcbiJdfQ==