@yoozsoft/yoozsoft-ng 3.1.4 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +11 -4
  2. package/assets/js/UTIF.js-master/LICENSE +21 -0
  3. package/assets/js/UTIF.js-master/README.md +72 -0
  4. package/assets/js/UTIF.js-master/UTIF.js +1763 -0
  5. package/assets/js/UTIF.js-master/package-lock.json +13 -0
  6. package/assets/styles/ys-layout.scss +21 -47
  7. package/assets/styles/ys-preloader.scss +12 -12
  8. package/datepicker/src/models/date-time-format.d.ts +0 -1
  9. package/datepicker/src/ys-datepicker/ys-datepicker.component.d.ts +7 -1
  10. package/directives/src/password-match/ys-password-match.directive.d.ts +1 -1
  11. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs +172 -162
  12. package/fesm2022/yoozsoft-yoozsoft-ng-datepicker.mjs.map +1 -1
  13. package/fesm2022/yoozsoft-yoozsoft-ng-directives.mjs +6 -10
  14. package/fesm2022/yoozsoft-yoozsoft-ng-directives.mjs.map +1 -1
  15. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs +145 -0
  16. package/fesm2022/yoozsoft-yoozsoft-ng-file-upload.mjs.map +1 -0
  17. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs +8 -15
  18. package/fesm2022/yoozsoft-yoozsoft-ng-footer.mjs.map +1 -1
  19. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs +16 -9
  20. package/fesm2022/yoozsoft-yoozsoft-ng-loading.mjs.map +1 -1
  21. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs +36 -31
  22. package/fesm2022/yoozsoft-yoozsoft-ng-navbar.mjs.map +1 -1
  23. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs +6 -8
  24. package/fesm2022/yoozsoft-yoozsoft-ng-overlay.mjs.map +1 -1
  25. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs +90 -62
  26. package/fesm2022/yoozsoft-yoozsoft-ng-password-strength.mjs.map +1 -1
  27. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs +17 -17
  28. package/fesm2022/yoozsoft-yoozsoft-ng-progress.mjs.map +1 -1
  29. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs +64 -23
  30. package/fesm2022/yoozsoft-yoozsoft-ng-select.mjs.map +1 -1
  31. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs +50 -57
  32. package/fesm2022/yoozsoft-yoozsoft-ng-sidebar.mjs.map +1 -1
  33. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs +150 -0
  34. package/fesm2022/yoozsoft-yoozsoft-ng-tiff-viewer.mjs.map +1 -0
  35. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs +106 -0
  36. package/fesm2022/yoozsoft-yoozsoft-ng-toast.mjs.map +1 -0
  37. package/{toasts → file-upload}/index.d.ts +1 -1
  38. package/file-upload/public-api.d.ts +1 -0
  39. package/file-upload/src/ys-file-upload/ys-file-upload.component.d.ts +51 -0
  40. package/loading/src/ys-loading-mask/ys-loading-mask.component.d.ts +5 -2
  41. package/navbar/src/models/navbar-brand.d.ts +2 -0
  42. package/navbar/src/models/navbar-item.d.ts +1 -0
  43. package/navbar/src/ys-navbar/ys-navbar.component.d.ts +13 -12
  44. package/overlay/src/ys-overlay/ys-overlay.component.d.ts +1 -1
  45. package/package.json +26 -46
  46. package/password-strength/public-api.d.ts +1 -0
  47. package/password-strength/src/directives/index.d.ts +1 -0
  48. package/password-strength/src/directives/ys-password-strength.directive.d.ts +18 -0
  49. package/password-strength/src/models/strength-validation-feedback.d.ts +2 -0
  50. package/password-strength/src/ys-password-strength/ys-password-strength.component.d.ts +4 -5
  51. package/select/src/ys-select/ys-select.component.d.ts +14 -4
  52. package/sidebar/src/models/index.d.ts +0 -1
  53. package/sidebar/src/models/sidebar-item-active.d.ts +1 -0
  54. package/sidebar/src/services/sidebar.service.d.ts +7 -10
  55. package/sidebar/src/ys-sidebar/ys-sidebar.component.d.ts +13 -15
  56. package/tiff-viewer/index.d.ts +5 -0
  57. package/tiff-viewer/public-api.d.ts +1 -0
  58. package/tiff-viewer/src/ys-tiff-viewer/ys-tiff-viewer.component.d.ts +48 -0
  59. package/{layout → toast}/index.d.ts +1 -1
  60. package/toast/public-api.d.ts +3 -0
  61. package/{toasts/src/ys-toasts/ys-toasts.component.d.ts → toast/src/ys-toast/ys-toast.component.d.ts} +4 -4
  62. package/assets/images/user.jpg +0 -0
  63. package/assets/styles/ys-layout-pin.scss +0 -153
  64. package/esm2022/datepicker/public-api.mjs +0 -12
  65. package/esm2022/datepicker/src/models/date-range.mjs +0 -2
  66. package/esm2022/datepicker/src/models/date-time-format.mjs +0 -4
  67. package/esm2022/datepicker/src/models/index.mjs +0 -4
  68. package/esm2022/datepicker/src/models/jalali-date.mjs +0 -74
  69. package/esm2022/datepicker/src/services/index.mjs +0 -3
  70. package/esm2022/datepicker/src/services/ys-date-parser-formatter.service.mjs +0 -32
  71. package/esm2022/datepicker/src/services/ys-datepicker-i18n.service.mjs +0 -66
  72. package/esm2022/datepicker/src/ys-datepicker/ys-datepicker.component.mjs +0 -108
  73. package/esm2022/datepicker/src/ys-datepicker-persian/ys-datepicker-persian.component.mjs +0 -127
  74. package/esm2022/datepicker/src/ys-datepicker-popup/ys-datepicker-popup.component.mjs +0 -130
  75. package/esm2022/datepicker/src/ys-datepicker-popup-persian/ys-datepicker-popup-persian.component.mjs +0 -136
  76. package/esm2022/datepicker/src/ys-datepicker-range-popup/ys-datepicker-range-popup.component.mjs +0 -157
  77. package/esm2022/datepicker/src/ys-datepicker-range-popup-persian/ys-datepicker-range-popup-persian.component.mjs +0 -167
  78. package/esm2022/datepicker/yoozsoft-yoozsoft-ng-datepicker.mjs +0 -5
  79. package/esm2022/directives/public-api.mjs +0 -6
  80. package/esm2022/directives/src/password-match/ys-password-match.directive.mjs +0 -49
  81. package/esm2022/directives/yoozsoft-yoozsoft-ng-directives.mjs +0 -5
  82. package/esm2022/footer/public-api.mjs +0 -6
  83. package/esm2022/footer/src/models/footer-brand.mjs +0 -2
  84. package/esm2022/footer/src/models/index.mjs +0 -3
  85. package/esm2022/footer/src/models/social-network.mjs +0 -2
  86. package/esm2022/footer/src/ys-footer/ys-footer.component.mjs +0 -32
  87. package/esm2022/footer/yoozsoft-yoozsoft-ng-footer.mjs +0 -5
  88. package/esm2022/layout/public-api.mjs +0 -5
  89. package/esm2022/layout/src/ys-layout/ys-layout.component.mjs +0 -72
  90. package/esm2022/layout/yoozsoft-yoozsoft-ng-layout.mjs +0 -5
  91. package/esm2022/loading/public-api.mjs +0 -5
  92. package/esm2022/loading/src/ys-loading-mask/ys-loading-mask.component.mjs +0 -20
  93. package/esm2022/loading/yoozsoft-yoozsoft-ng-loading.mjs +0 -5
  94. package/esm2022/navbar/public-api.mjs +0 -6
  95. package/esm2022/navbar/src/models/index.mjs +0 -3
  96. package/esm2022/navbar/src/models/navbar-brand.mjs +0 -2
  97. package/esm2022/navbar/src/models/navbar-item.mjs +0 -2
  98. package/esm2022/navbar/src/ys-navbar/ys-navbar.component.mjs +0 -86
  99. package/esm2022/navbar/yoozsoft-yoozsoft-ng-navbar.mjs +0 -5
  100. package/esm2022/overlay/public-api.mjs +0 -5
  101. package/esm2022/overlay/src/ys-overlay/ys-overlay.component.mjs +0 -20
  102. package/esm2022/overlay/yoozsoft-yoozsoft-ng-overlay.mjs +0 -5
  103. package/esm2022/password-strength/public-api.mjs +0 -6
  104. package/esm2022/password-strength/src/models/index.mjs +0 -5
  105. package/esm2022/password-strength/src/models/regx.mjs +0 -7
  106. package/esm2022/password-strength/src/models/strength-validation-control.mjs +0 -2
  107. package/esm2022/password-strength/src/models/strength-validation-feedback.mjs +0 -25
  108. package/esm2022/password-strength/src/models/strength-validation-option.mjs +0 -25
  109. package/esm2022/password-strength/src/ys-password-strength/ys-password-strength.component.mjs +0 -69
  110. package/esm2022/password-strength/yoozsoft-yoozsoft-ng-password-strength.mjs +0 -5
  111. package/esm2022/progress/public-api.mjs +0 -6
  112. package/esm2022/progress/src/services/index.mjs +0 -2
  113. package/esm2022/progress/src/services/progress.service.mjs +0 -18
  114. package/esm2022/progress/src/ys-progress/ys-progress.component.mjs +0 -32
  115. package/esm2022/progress/yoozsoft-yoozsoft-ng-progress.mjs +0 -5
  116. package/esm2022/public-api.mjs +0 -5
  117. package/esm2022/select/public-api.mjs +0 -5
  118. package/esm2022/select/src/ys-select/ys-select.component.mjs +0 -63
  119. package/esm2022/select/yoozsoft-yoozsoft-ng-select.mjs +0 -5
  120. package/esm2022/sidebar/public-api.mjs +0 -8
  121. package/esm2022/sidebar/src/models/index.mjs +0 -6
  122. package/esm2022/sidebar/src/models/sidebar-item-active.mjs +0 -2
  123. package/esm2022/sidebar/src/models/sidebar-item.mjs +0 -2
  124. package/esm2022/sidebar/src/models/sidebar-state.mjs +0 -2
  125. package/esm2022/sidebar/src/models/user-image.mjs +0 -2
  126. package/esm2022/sidebar/src/models/user-profile.mjs +0 -2
  127. package/esm2022/sidebar/src/services/index.mjs +0 -2
  128. package/esm2022/sidebar/src/services/sidebar.service.mjs +0 -39
  129. package/esm2022/sidebar/src/ys-sidebar/ys-sidebar.component.mjs +0 -68
  130. package/esm2022/sidebar/yoozsoft-yoozsoft-ng-sidebar.mjs +0 -5
  131. package/esm2022/toasts/public-api.mjs +0 -7
  132. package/esm2022/toasts/src/models/index.mjs +0 -3
  133. package/esm2022/toasts/src/models/toast-info.mjs +0 -2
  134. package/esm2022/toasts/src/models/toast-type.mjs +0 -8
  135. package/esm2022/toasts/src/services/index.mjs +0 -2
  136. package/esm2022/toasts/src/services/toast.service.mjs +0 -44
  137. package/esm2022/toasts/src/ys-toasts/ys-toasts.component.mjs +0 -53
  138. package/esm2022/toasts/yoozsoft-yoozsoft-ng-toasts.mjs +0 -5
  139. package/esm2022/yoozsoft-yoozsoft-ng.mjs +0 -5
  140. package/fesm2022/yoozsoft-yoozsoft-ng-layout.mjs +0 -83
  141. package/fesm2022/yoozsoft-yoozsoft-ng-layout.mjs.map +0 -1
  142. package/fesm2022/yoozsoft-yoozsoft-ng-toasts.mjs +0 -111
  143. package/fesm2022/yoozsoft-yoozsoft-ng-toasts.mjs.map +0 -1
  144. package/layout/public-api.d.ts +0 -1
  145. package/layout/src/ys-layout/ys-layout.component.d.ts +0 -24
  146. package/sidebar/src/models/sidebar-state.d.ts +0 -4
  147. package/toasts/public-api.d.ts +0 -3
  148. /package/{toasts → toast}/src/models/index.d.ts +0 -0
  149. /package/{toasts → toast}/src/models/toast-info.d.ts +0 -0
  150. /package/{toasts → toast}/src/models/toast-type.d.ts +0 -0
  151. /package/{toasts → toast}/src/services/index.d.ts +0 -0
  152. /package/{toasts → toast}/src/services/toast.service.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-navbar.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/navbar/src/ys-navbar/ys-navbar.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/navbar/src/ys-navbar/ys-navbar.component.html","../../../../projects/yoozsoft/yoozsoft-ng/navbar/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/navbar/yoozsoft-yoozsoft-ng-navbar.ts"],"sourcesContent":["import { NgClass, NgFor, NgIf } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterLink, RouterLinkActive } from '@angular/router';\r\nimport { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { NavbarBrand, NavbarItem } from '../models';\r\n\r\n@Component({\r\n selector: 'ys-navbar',\r\n standalone: true,\r\n imports: [\r\n NgIf,\r\n NgFor,\r\n NgClass,\r\n RouterLink,\r\n RouterLinkActive,\r\n ReactiveFormsModule,\r\n NgbTooltipModule\r\n ],\r\n templateUrl: './ys-navbar.component.html',\r\n styleUrls: ['./ys-navbar.component.scss']\r\n})\r\nexport class YsNavbarComponent {\r\n\r\n searchForm: FormGroup;\r\n\r\n @Input() id: string = 'navbar01'\r\n @Input() theme: string = 'dark';\r\n @Input() styleClass: string = 'navbar-expand-lg bg-primary';\r\n\r\n @Input() items: NavbarItem[] = [];\r\n @Input() sideItems: NavbarItem[] = [];\r\n\r\n @Input() search: boolean = false;\r\n @Input() searchLabel: string | null = 'Search';\r\n @Input() searchIconClass?: string;\r\n @Input() searchPlaceholder?: string = 'Search';\r\n\r\n @Input() brand: NavbarBrand | null = null;\r\n\r\n @Input() sidebarToggler: boolean = false;\r\n @Input() sidebarToggled: boolean = false;\r\n\r\n // @Input() sidebarPinnerIconClass: string = \"fa-solid fa-angle-left\";\r\n @Input() sidebarTogglerIconClass: string = \"fa-solid fa-angle-right\";\r\n\r\n @Output() toggleSidebar: EventEmitter<boolean> = new EventEmitter();\r\n\r\n @Output() onSearch: EventEmitter<string> = new EventEmitter();\r\n\r\n constructor(private formBuilder: FormBuilder) {\r\n this.searchForm = this.formBuilder.group({\r\n searchValue: ['']\r\n });\r\n }\r\n\r\n onToggleSidebar() {\r\n this.sidebarToggled = !this.sidebarToggled;\r\n this.toggleSidebar.emit(this.sidebarToggled);\r\n }\r\n\r\n submitSearch() {\r\n this.onSearch.emit(this.searchForm.get('searchValue')?.value);\r\n }\r\n\r\n isDropdown(item: NavbarItem) {\r\n return item.items?.length! > 0;\r\n }\r\n\r\n}\r\n","<nav class=\"navbar\" [ngClass]=\"styleClass\" [attr.data-bs-theme]=\"theme\">\r\n <div class=\"container-fluid\">\r\n <button *ngIf=\"sidebarToggler\" class=\"sidebar-toggler me-2\" type=\"button\" (click)=\"onToggleSidebar()\">\r\n <i class=\"{{sidebarTogglerIconClass}} sidebar-toggler-icon p-1\" [ngClass]=\"{'toggled': sidebarToggled}\"></i>\r\n </button>\r\n\r\n <a class=\"navbar-brand\" [ngClass]=\"{'me-auto': items.length <= 0}\" href=\"{{brand?.href}}\">\r\n <img *ngIf=\"brand?.src\" src=\"{{brand?.src}}\" alt=\"{{brand?.alt}}\" width=\"30\" height=\"24\">\r\n {{brand?.label}}\r\n </a>\r\n <button *ngIf=\"items.length > 0 || sideItems.length > 0 || search\" class=\"navbar-toggler ms-auto\" type=\"button\"\r\n data-bs-toggle=\"collapse\" [attr.data-bs-target]=\"'#' + id\" [attr.aria-controls]=\"id\" aria-expanded=\"false\"\r\n aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div class=\"collapse navbar-collapse\" [id]=\"id\">\r\n\r\n <ul *ngIf=\"items.length > 0\" class=\"navbar-nav me-auto\">\r\n <ng-container *ngFor=\"let navItem of items\">\r\n <li *ngIf=\"!isDropdown(navItem)\" class=\"nav-item\">\r\n <a class=\"nav-link\" [routerLink]=\"navItem.routerLink\" [routerLinkActive]=\"['active']\"\r\n ngbTooltip=\"{{navItem.tooltipLabel}}\">\r\n <i *ngIf=\"navItem.iconClass\" class=\"pe-2 {{navItem.iconClass}}\"></i>\r\n {{navItem.label}}\r\n <span class=\"visually-hidden\">(current)</span>\r\n </a>\r\n </li>\r\n\r\n <li *ngIf=\"isDropdown(navItem)\" class=\"nav-item dropdown\">\r\n <a class=\"nav-link dropdown-toggle\" ngbTooltip=\"{{navItem.tooltipLabel}}\" data-bs-toggle=\"dropdown\"\r\n role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i *ngIf=\"navItem.iconClass\" class=\"pe-2 {{navItem.iconClass}}\"></i>\r\n <span *ngIf=\"navItem.label\">{{navItem.label}}</span>\r\n </a>\r\n <div class=\"dropdown-menu px-2\">\r\n <ng-container *ngFor=\"let navSubItem of navItem.items\">\r\n\r\n <a *ngIf=\"!navSubItem.isDivider\" class=\"dropdown-item rounded\" [routerLink]=\"navSubItem.routerLink\"\r\n [routerLinkActive]=\"['active']\" ngbTooltip=\"{{navSubItem.tooltipLabel}}\">\r\n <i *ngIf=\"navSubItem.iconClass\" class=\"me-2 {{navSubItem.iconClass}}\"></i>\r\n <span *ngIf=\"navSubItem.label\">{{navSubItem.label}}</span>\r\n </a>\r\n\r\n <div *ngIf=\"navSubItem.isDivider\" class=\"dropdown-divider\"></div>\r\n\r\n </ng-container>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n\r\n <ul *ngIf=\"sideItems.length > 0\" class=\"navbar-nav flex-row ms-auto nav-side\" [ngClass]=\"{'me-md-2': search}\">\r\n <ng-container *ngFor=\"let sideItem of sideItems\">\r\n\r\n <li *ngIf=\"!isDropdown(sideItem)\" class=\"nav-item\">\r\n <a class=\"nav-link\" [routerLink]=\"sideItem.routerLink\" [routerLinkActive]=\"['active']\"\r\n (click)=\"sideItem.onClick && sideItem.onClick($event)\" role=\"button\"\r\n ngbTooltip=\"{{sideItem.tooltipLabel}}\">\r\n <i *ngIf=\"sideItem.iconClass\" class=\"pe-2 {{sideItem.iconClass}}\"></i>\r\n <span *ngIf=\"sideItem.label\">{{sideItem.label}}</span>\r\n </a>\r\n </li>\r\n\r\n <li *ngIf=\"isDropdown(sideItem)\" class=\"nav-item dropdown\">\r\n <a class=\"nav-link dropdown-toggle\" ngbTooltip=\"{{sideItem.tooltipLabel}}\" data-bs-toggle=\"dropdown\"\r\n data-bs-display=\"static\" aria-expanded=\"false\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i *ngIf=\"sideItem.iconClass\" class=\"pe-2 {{sideItem.iconClass}}\"></i>\r\n <span *ngIf=\"sideItem.label\">{{sideItem.label}}</span>\r\n </a>\r\n <div class=\"dropdown-menu px-2 dropdown-menu-end\">\r\n <ng-container *ngFor=\"let sideItemSubItem of sideItem.items\">\r\n\r\n <a *ngIf=\"!sideItemSubItem.isDivider\" class=\"dropdown-item text-center rounded\"\r\n [routerLink]=\"sideItemSubItem.routerLink\" [routerLinkActive]=\"['active']\"\r\n (click)=\"sideItemSubItem.onClick && sideItemSubItem.onClick($event)\" role=\"button\"\r\n ngbTooltip=\"{{sideItemSubItem.tooltipLabel}}\">\r\n <i *ngIf=\"sideItemSubItem.iconClass\" class=\"me-2 {{sideItemSubItem.iconClass}}\"></i>\r\n <span *ngIf=\"sideItemSubItem.label\">{{sideItemSubItem.label}}</span>\r\n </a>\r\n\r\n <div *ngIf=\"sideItemSubItem.isDivider\" class=\"dropdown-divider\"></div>\r\n\r\n </ng-container>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <form *ngIf=\"search\" class=\"d-flex mt-2 mt-md-0\" [ngClass]=\"{'ms-auto': sideItems.length <= 0}\"\r\n [formGroup]=\"searchForm\" (submit)=\"submitSearch()\">\r\n <input class=\"form-control me-sm-2\" type=\"search\" placeholder=\"{{searchPlaceholder}}\"\r\n formControlName=\"searchValue\">\r\n <button class=\"btn btn-secondary my-2 my-sm-0\" type=\"submit\">\r\n <i *ngIf=\"searchIconClass\" class=\"{{searchIconClass}}\"></i>\r\n <span *ngIf=\"searchLabel\">{{searchLabel}}</span>\r\n </button>\r\n </form>\r\n </div>\r\n </div>\r\n</nav>","/*\r\n * Public API Surface of ys-navbar\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-navbar/ys-navbar.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-navbar.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/navbar/src/ys-navbar/ys-navbar.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/navbar/src/ys-navbar/ys-navbar.component.html","../../../../projects/yoozsoft/yoozsoft-ng/navbar/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/navbar/yoozsoft-yoozsoft-ng-navbar.ts"],"sourcesContent":["import { NgClass, NgFor, NgIf } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\r\nimport { RouterLink, RouterLinkActive } from '@angular/router';\r\nimport { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { NavbarBrand, NavbarItem } from '../models';\r\n\r\n@Component({\r\n selector: 'ys-navbar',\r\n imports: [\r\n NgIf,\r\n NgFor,\r\n NgClass,\r\n RouterLink,\r\n RouterLinkActive,\r\n ReactiveFormsModule,\r\n NgbTooltipModule\r\n ],\r\n templateUrl: './ys-navbar.component.html',\r\n styleUrl: './ys-navbar.component.scss'\r\n})\r\nexport class YsNavbarComponent implements OnInit {\r\n\r\n searchForm: FormGroup;\r\n\r\n @Input() id: string = 'mainNavbar'\r\n @Input() theme?: string = 'dark';\r\n @Input() styleClass?: string;\r\n\r\n @Input() brand: NavbarBrand | null = null;\r\n\r\n @Input() items: NavbarItem[] = [];\r\n @Input() endItems: NavbarItem[] = [];\r\n\r\n @Input() isSearch: boolean = false;\r\n @Input() searchLabel: string | null = 'Search';\r\n @Input() searchIconClass?: string;\r\n @Input() searchPlaceholder?: string = 'Search';\r\n\r\n @Input() isSidebarToggler: boolean = false;\r\n @Input() isSidebarToggled: boolean = true;\r\n @Input() sidebarTogglerIconClass: string = \"fa-solid fa-angle-right\";\r\n\r\n @Output() toggleSidebar: EventEmitter<boolean> = new EventEmitter();\r\n @Output() search: EventEmitter<string> = new EventEmitter();\r\n\r\n constructor(private formBuilder: FormBuilder) {\r\n this.searchForm = this.formBuilder.group({\r\n searchValue: ['']\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n // this.toggleSidebar.emit(this.isSidebarToggled);\r\n }\r\n\r\n onToggleSidebar() {\r\n this.isSidebarToggled = !this.isSidebarToggled;\r\n this.toggleSidebar.emit(this.isSidebarToggled);\r\n }\r\n\r\n submitSearch() {\r\n this.search.emit(this.searchForm.get('searchValue')?.value);\r\n }\r\n\r\n isDropdown(item: NavbarItem) {\r\n return item.items?.length;\r\n }\r\n\r\n}\r\n","<nav class=\"navbar navbar-expand-lg bg-primary\" [ngClass]=\"styleClass\" [attr.data-bs-theme]=\"theme\">\r\n <div class=\"container-fluid\">\r\n\r\n <button *ngIf=\"isSidebarToggler\" class=\"sidebar-toggler me-2\" type=\"button\" (click)=\"onToggleSidebar()\"\r\n aria-expanded=\"false\" aria-label=\"Toggle sidebar\" [ngClass]=\"{'toggled': isSidebarToggled}\">\r\n <i class=\"{{sidebarTogglerIconClass}} sidebar-toggler-icon p-1\"></i>\r\n </button>\r\n\r\n <a class=\"navbar-brand\" [ngClass]=\"{'me-auto': !items.length}\" href=\"{{brand?.href}}\">\r\n <img *ngIf=\"brand?.src\" src=\"{{brand?.src}}\" alt=\"{{brand?.alt}}\" width=\"{{brand?.width}}\"\r\n height=\"{{brand?.height}}\">\r\n {{brand?.label}}\r\n </a>\r\n\r\n <button *ngIf=\"items.length || endItems.length || search\" class=\"navbar-toggler ms-auto\" type=\"button\"\r\n data-bs-toggle=\"collapse\" [attr.data-bs-target]=\"'#' + id\" [attr.aria-controls]=\"id\" aria-expanded=\"false\"\r\n aria-label=\"Toggle navigation\">\r\n <span class=\"navbar-toggler-icon\"></span>\r\n </button>\r\n\r\n <div class=\"collapse navbar-collapse\" [id]=\"id\">\r\n\r\n <ul *ngIf=\"items.length\" class=\"navbar-nav me-auto\" [ngClass]=\"{'mb-2': isSearch}\">\r\n <ng-container *ngFor=\"let navItem of items\">\r\n\r\n <li *ngIf=\"!isDropdown(navItem)\" class=\"nav-item\">\r\n <a class=\"nav-link\" [ngClass]=\"{'disabled': navItem.disabled}\"\r\n (click)=\"navItem.onClick && navItem.onClick($event)\" [attr.aria-disabled]=\"navItem.disabled\"\r\n [routerLink]=\"navItem.routerLink\" [routerLinkActive]=\"['active']\"\r\n ngbTooltip=\"{{navItem.tooltipLabel}}\" aria-current=\"page\">\r\n\r\n <i *ngIf=\"navItem.iconClass\" class=\"pe-2 {{navItem.iconClass}}\"></i>\r\n\r\n {{navItem.label}}\r\n\r\n </a>\r\n </li>\r\n\r\n <li *ngIf=\"isDropdown(navItem)\" class=\"nav-item dropdown\">\r\n <a class=\"nav-link dropdown-toggle\" [ngClass]=\"{'disabled': navItem.disabled}\"\r\n [attr.aria-disabled]=\"navItem.disabled\" ngbTooltip=\"{{navItem.tooltipLabel}}\"\r\n data-bs-toggle=\"dropdown\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n\r\n <i *ngIf=\"navItem.iconClass\" class=\"pe-2 {{navItem.iconClass}}\"></i>\r\n\r\n <span *ngIf=\"navItem.label\">{{navItem.label}}</span>\r\n\r\n </a>\r\n <ul class=\"dropdown-menu px-2\">\r\n <li *ngFor=\"let navSubItem of navItem.items\">\r\n\r\n <a *ngIf=\"!navSubItem.isDivider\" class=\"dropdown-item rounded\"\r\n (click)=\"navSubItem.onClick && navSubItem.onClick($event)\"\r\n [ngClass]=\"{'disabled': navSubItem.disabled}\"\r\n [attr.aria-disabled]=\"navItem.disabled\" [routerLink]=\"navSubItem.routerLink\"\r\n [routerLinkActive]=\"['active']\" ngbTooltip=\"{{navSubItem.tooltipLabel}}\">\r\n\r\n <i *ngIf=\"navSubItem.iconClass\" class=\"me-2 {{navSubItem.iconClass}}\"></i>\r\n\r\n <span *ngIf=\"navSubItem.label\">{{navSubItem.label}}</span>\r\n\r\n </a>\r\n\r\n <hr *ngIf=\"navSubItem.isDivider\" class=\"dropdown-divider\">\r\n\r\n </li>\r\n </ul>\r\n </li>\r\n\r\n </ng-container>\r\n\r\n </ul>\r\n\r\n <ul *ngIf=\"endItems.length > 0\" class=\"navbar-nav flex-row ms-auto nav-end me-2\" [ngClass]=\"{'nav-end-me-0': search}\">\r\n <ng-container *ngFor=\"let endItem of endItems\">\r\n\r\n <li *ngIf=\"!isDropdown(endItem)\" class=\"nav-item\">\r\n <a class=\"nav-link\" [routerLink]=\"endItem.routerLink\" [routerLinkActive]=\"['active']\"\r\n (click)=\"endItem.onClick && endItem.onClick($event)\" role=\"button\"\r\n ngbTooltip=\"{{endItem.tooltipLabel}}\">\r\n <i *ngIf=\"endItem.iconClass\" class=\"pe-2 {{endItem.iconClass}}\"></i>\r\n <span *ngIf=\"endItem.label\">{{endItem.label}}</span>\r\n </a>\r\n </li>\r\n\r\n <li *ngIf=\"isDropdown(endItem)\" class=\"nav-item dropdown\">\r\n <a class=\"nav-link dropdown-toggle\" ngbTooltip=\"{{endItem.tooltipLabel}}\"\r\n data-bs-toggle=\"dropdown\" data-bs-display=\"static\" aria-expanded=\"false\" role=\"button\"\r\n aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i *ngIf=\"endItem.iconClass\" class=\"pe-2 {{endItem.iconClass}}\"></i>\r\n <span *ngIf=\"endItem.label\">{{endItem.label}}</span>\r\n </a>\r\n <div class=\"dropdown-menu px-2 dropdown-menu-end\">\r\n <ng-container *ngFor=\"let endItemSubItem of endItem.items\">\r\n\r\n <a *ngIf=\"!endItemSubItem.isDivider\" class=\"dropdown-item text-center rounded\"\r\n [routerLink]=\"endItemSubItem.routerLink\" [routerLinkActive]=\"['active']\"\r\n (click)=\"endItemSubItem.onClick && endItemSubItem.onClick($event)\" role=\"button\"\r\n ngbTooltip=\"{{endItemSubItem.tooltipLabel}}\">\r\n <i *ngIf=\"endItemSubItem.iconClass\" class=\"me-2 {{endItemSubItem.iconClass}}\"></i>\r\n <span *ngIf=\"endItemSubItem.label\">{{endItemSubItem.label}}</span>\r\n </a>\r\n\r\n <div *ngIf=\"endItemSubItem.isDivider\" class=\"dropdown-divider\"></div>\r\n\r\n </ng-container>\r\n </div>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n\r\n <form *ngIf=\"isSearch\" class=\"search-form d-flex\" role=\"search\" [ngClass]=\"{'ms-auto': !endItems.length}\"\r\n [formGroup]=\"searchForm\" (submit)=\"submitSearch()\">\r\n <input name=\"searchValue\" id=\"searchValue\" formControlName=\"searchValue\" class=\"form-control me-2\" type=\"search\"\r\n placeholder=\"{{searchPlaceholder}}\" aria-label=\"Search\">\r\n <button name=\"submitBtn\" class=\"btn btn-outline-success\" type=\"submit\">\r\n <i *ngIf=\"searchIconClass\" class=\"{{searchIconClass}}\"></i>\r\n <span *ngIf=\"searchLabel\">{{searchLabel}}</span>\r\n </button>\r\n </form>\r\n\r\n <!-- <form *ngIf=\"search\" class=\"d-flex mt-2 mt-md-0\" [ngClass]=\"{'ms-auto': endItems.length <= 0}\"\r\n [formGroup]=\"searchForm\" (submit)=\"submitSearch()\">\r\n <input class=\"form-control me-sm-2\" type=\"search\" placeholder=\"{{searchPlaceholder}}\"\r\n formControlName=\"searchValue\">\r\n <button class=\"btn btn-secondary my-2 my-sm-0\" type=\"submit\">\r\n <i *ngIf=\"searchIconClass\" class=\"{{searchIconClass}}\"></i>\r\n <span *ngIf=\"searchLabel\">{{searchLabel}}</span>\r\n </button>\r\n </form> -->\r\n </div>\r\n </div>\r\n</nav>","/*\r\n * Public API Surface of ys-navbar\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-navbar/ys-navbar.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -3,16 +3,14 @@ import * as i0 from '@angular/core';
3
3
  import { EventEmitter, Component, Input, Output } from '@angular/core';
4
4
 
5
5
  class YsOverlayComponent {
6
- constructor() {
7
- this.show = false;
8
- this.onClick = new EventEmitter();
9
- }
10
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: YsOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.3", type: YsOverlayComponent, isStandalone: true, selector: "ys-overlay", inputs: { show: "show" }, outputs: { onClick: "onClick" }, ngImport: i0, template: "<div class=\"ys-overlay bg-dark\" (click)=\"onClick.emit($event)\" [ngClass]=\"{'show': show}\"></div>", styles: ["@-webkit-keyframes fadeIn-overlay{0%{opacity:0}to{opacity:.5}}@keyframes fadeIn-overlay{0%{opacity:0}to{opacity:.5}}.ys-overlay{position:fixed;inset:0;z-index:100;opacity:.5;display:none;-webkit-animation:fadeIn-overlay .5s;animation:fadeIn-overlay .5s}.ys-overlay.show{display:block}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
6
+ show = false;
7
+ onClick = new EventEmitter();
8
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: YsOverlayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.3", type: YsOverlayComponent, isStandalone: true, selector: "ys-overlay", inputs: { show: "show" }, outputs: { onClick: "onClick" }, ngImport: i0, template: "<div class=\"overlay bg-dark\" (click)=\"onClick.emit($event)\" [ngClass]=\"{'show': show}\"></div>", styles: ["@-webkit-keyframes fadeIn-overlay{0%{opacity:0}to{opacity:.5}}@keyframes fadeIn-overlay{0%{opacity:0}to{opacity:.5}}.overlay{position:fixed;inset:0;z-index:100;opacity:.5;display:none;-webkit-animation:fadeIn-overlay .5s;animation:fadeIn-overlay .5s}.overlay.show{display:block}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
12
10
  }
13
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: YsOverlayComponent, decorators: [{
11
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: YsOverlayComponent, decorators: [{
14
12
  type: Component,
15
- args: [{ selector: 'ys-overlay', standalone: true, imports: [NgClass], template: "<div class=\"ys-overlay bg-dark\" (click)=\"onClick.emit($event)\" [ngClass]=\"{'show': show}\"></div>", styles: ["@-webkit-keyframes fadeIn-overlay{0%{opacity:0}to{opacity:.5}}@keyframes fadeIn-overlay{0%{opacity:0}to{opacity:.5}}.ys-overlay{position:fixed;inset:0;z-index:100;opacity:.5;display:none;-webkit-animation:fadeIn-overlay .5s;animation:fadeIn-overlay .5s}.ys-overlay.show{display:block}\n"] }]
13
+ args: [{ selector: 'ys-overlay', imports: [NgClass], template: "<div class=\"overlay bg-dark\" (click)=\"onClick.emit($event)\" [ngClass]=\"{'show': show}\"></div>", styles: ["@-webkit-keyframes fadeIn-overlay{0%{opacity:0}to{opacity:.5}}@keyframes fadeIn-overlay{0%{opacity:0}to{opacity:.5}}.overlay{position:fixed;inset:0;z-index:100;opacity:.5;display:none;-webkit-animation:fadeIn-overlay .5s;animation:fadeIn-overlay .5s}.overlay.show{display:block}\n"] }]
16
14
  }], propDecorators: { show: [{
17
15
  type: Input
18
16
  }], onClick: [{
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-overlay.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/overlay/src/ys-overlay/ys-overlay.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/overlay/src/ys-overlay/ys-overlay.component.html","../../../../projects/yoozsoft/yoozsoft-ng/overlay/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/overlay/yoozsoft-yoozsoft-ng-overlay.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ys-overlay',\r\n standalone: true,\r\n imports: [NgClass],\r\n templateUrl: './ys-overlay.component.html',\r\n styleUrls: ['./ys-overlay.component.scss']\r\n})\r\nexport class YsOverlayComponent {\r\n @Input() show: boolean = false;\r\n @Output() onClick: EventEmitter<any> = new EventEmitter();\r\n}\r\n","<div class=\"ys-overlay bg-dark\" (click)=\"onClick.emit($event)\" [ngClass]=\"{'show': show}\"></div>","/*\r\n * Public API Surface of ys-overlay\r\n */\r\n\r\nexport * from './src/ys-overlay/ys-overlay.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAUa,kBAAkB,CAAA;AAP/B,IAAA,WAAA,GAAA;QAQW,IAAI,CAAA,IAAA,GAAY,KAAK,CAAC;AACrB,QAAA,IAAA,CAAA,OAAO,GAAsB,IAAI,YAAY,EAAE,CAAC;AAC3D,KAAA;8GAHY,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECV/B,wGAAgG,EAAA,MAAA,EAAA,CAAA,gSAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDMpF,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAIN,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAP9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,YAAY,EACV,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,wGAAA,EAAA,MAAA,EAAA,CAAA,gSAAA,CAAA,EAAA,CAAA;8BAKT,IAAI,EAAA,CAAA;sBAAZ,KAAK;gBACI,OAAO,EAAA,CAAA;sBAAhB,MAAM;;;AEZT;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-overlay.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/overlay/src/ys-overlay/ys-overlay.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/overlay/src/ys-overlay/ys-overlay.component.html","../../../../projects/yoozsoft/yoozsoft-ng/overlay/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/overlay/yoozsoft-yoozsoft-ng-overlay.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ys-overlay',\r\n imports: [NgClass],\r\n templateUrl: './ys-overlay.component.html',\r\n styleUrl: './ys-overlay.component.scss'\r\n})\r\nexport class YsOverlayComponent {\r\n\r\n @Input() show: boolean = false;\r\n @Output() onClick: EventEmitter<MouseEvent> = new EventEmitter();\r\n\r\n}\r\n","<div class=\"overlay bg-dark\" (click)=\"onClick.emit($event)\" [ngClass]=\"{'show': show}\"></div>","/*\r\n * Public API Surface of ys-overlay\r\n */\r\n\r\nexport * from './src/ys-overlay/ys-overlay.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MASa,kBAAkB,CAAA;IAEpB,IAAI,GAAY,KAAK;AACpB,IAAA,OAAO,GAA6B,IAAI,YAAY,EAAE;uGAHrD,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECT/B,qGAA6F,EAAA,MAAA,EAAA,CAAA,0RAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDKjF,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIN,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAN9B,SAAS;+BACE,YAAY,EAAA,OAAA,EACb,CAAC,OAAO,CAAC,EAAA,QAAA,EAAA,qGAAA,EAAA,MAAA,EAAA,CAAA,0RAAA,CAAA,EAAA;8BAMT,IAAI,EAAA,CAAA;sBAAZ;gBACS,OAAO,EAAA,CAAA;sBAAhB;;;AEZH;;AAEG;;ACFH;;AAEG;;;;"}
@@ -1,6 +1,7 @@
1
- import { NgIf, NgClass } from '@angular/common';
2
1
  import * as i0 from '@angular/core';
3
- import { Component, Input } from '@angular/core';
2
+ import { Component, Input, Directive } from '@angular/core';
3
+ import { NgIf, NgClass } from '@angular/common';
4
+ import * as i1 from '@angular/forms';
4
5
  import { Validators } from '@angular/forms';
5
6
 
6
7
  const StrongPasswordRegx = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\D*\d)(?=.*[!@#$%^&*]).{8,}$/;
@@ -8,59 +9,46 @@ const UppercaseRegx = /^.*[A-Z]/;
8
9
  const LowercaseRegx = /^.*[a-z]/;
9
10
  const DigitRegx = /^.*[0-9].*/;
10
11
  const NonAlphanumericRegx = /^.*[!@#$%^&*]/;
11
- // export const MinLengthRegx: RegExp = /^.{8,}/;
12
+ // export const MinLength8Regx: RegExp = /^.{8,}/;
12
13
 
13
14
  class StrengthValidationFeedback {
15
+ required;
16
+ uppercase;
17
+ lowercase;
18
+ digit;
19
+ nonAlphanumeric;
20
+ minLength;
14
21
  constructor(options) {
15
- this.uppercase = 'At least one uppercase letter.';
16
- this.lowercase = 'At least one lowercase letter.';
17
- this.digit = 'At least one digit.';
18
- this.nonAlphanumeric = 'At least one special character (e.g., !, @, #, $).';
19
- this.minLength = 'At least 8 characters long.';
20
- if (options?.uppercase !== undefined) {
21
- this.uppercase = options?.uppercase;
22
- }
23
- if (options?.lowercase !== undefined) {
24
- this.lowercase = options?.lowercase;
25
- }
26
- if (options?.digit !== undefined) {
27
- this.digit = options?.digit;
28
- }
29
- if (options?.nonAlphanumeric !== undefined) {
30
- this.nonAlphanumeric = options?.nonAlphanumeric;
31
- }
32
- if (options?.minLength !== undefined) {
33
- this.minLength = options?.minLength;
34
- }
22
+ this.required = options?.required == undefined ? 'Please enter a valid password.' : options?.required;
23
+ this.uppercase = options?.uppercase == undefined ? 'At least one uppercase letter.' : options?.uppercase;
24
+ this.lowercase = options?.lowercase == undefined ? 'At least one lowercase letter.' : options?.lowercase;
25
+ this.digit = options?.digit == undefined ? 'At least one digit.' : options?.digit;
26
+ this.nonAlphanumeric = options?.nonAlphanumeric == undefined ? 'At least one special character (e.g., !, @, #, $).' : options?.nonAlphanumeric;
27
+ this.minLength = options?.minLength == undefined ? 'At least 8 characters long.' : options?.minLength;
35
28
  }
36
29
  }
37
30
 
38
31
  class StrengthValidationOption {
32
+ requireUppercase;
33
+ requireLowercase;
34
+ requireDigit;
35
+ requireNonAlphanumeric;
36
+ requiredMinLength;
39
37
  constructor(options) {
40
- this.requireUppercase = true;
41
- this.requireLowercase = true;
42
- this.requireDigit = true;
43
- this.requireNonAlphanumeric = true;
44
- this.requiredMinLength = 8;
45
- if (options?.requireUppercase !== undefined) {
46
- this.requireUppercase = options?.requireUppercase;
47
- }
48
- if (options?.requireLowercase !== undefined) {
49
- this.requireLowercase = options?.requireLowercase;
50
- }
51
- if (options?.requireDigit !== undefined) {
52
- this.requireDigit = options?.requireDigit;
53
- }
54
- if (options?.requireNonAlphanumeric !== undefined) {
55
- this.requireNonAlphanumeric = options?.requireNonAlphanumeric;
56
- }
57
- if (options?.requiredMinLength !== undefined) {
58
- this.requiredMinLength = options?.requiredMinLength;
59
- }
38
+ this.requireUppercase = options?.requireUppercase == undefined ? true : options?.requireUppercase;
39
+ this.requireLowercase = options?.requireLowercase == undefined ? true : options?.requireLowercase;
40
+ this.requireDigit = options?.requireDigit == undefined ? true : options?.requireDigit;
41
+ this.requireNonAlphanumeric = options?.requireNonAlphanumeric == undefined ? true : options?.requireNonAlphanumeric;
42
+ this.requiredMinLength = options?.requiredMinLength == undefined ? 8 : options?.requiredMinLength;
60
43
  }
61
44
  }
62
45
 
63
46
  class YsPasswordStrengthComponent {
47
+ passwordHelp = null;
48
+ displayFeedback = true;
49
+ feedback = new StrengthValidationFeedback();
50
+ minLengthRegx = new RegExp('');
51
+ _control;
64
52
  get control() { return this._control; }
65
53
  set control(value) {
66
54
  this._control = value;
@@ -72,20 +60,15 @@ class YsPasswordStrengthComponent {
72
60
  }
73
61
  const strongPasswordRegx = new RegExp(`${this._control.options.requireUppercase ? '^(?=[^A-Z]*[A-Z])' : ''}${this._control.options.requireLowercase ? '(?=[^a-z]*[a-z])' : ''}${this._control.options.requireDigit ? '(?=\\D*\\d)' : ''}${this._control.options.requireNonAlphanumeric ? '(?=.*[!@#$%^&*])' : ''}.{${this._control.options.requiredMinLength},}$`);
74
62
  this.minLengthRegx = new RegExp(`.{${this._control.options.requiredMinLength},}$`);
75
- this._control.formControl?.addValidators(Validators.pattern(strongPasswordRegx));
76
- }
77
- constructor() {
78
- this.minLengthRegx = new RegExp('');
79
- this.passwordHelp = null;
80
- this.displayFeedback = true;
81
- this.feedback = new StrengthValidationFeedback();
63
+ this._control.formControl?.addValidators([Validators.required, Validators.pattern(strongPasswordRegx)]);
64
+ this._control.formControl?.updateValueAndValidity();
82
65
  }
83
66
  get requiredOptionsLength() { return Object.values(this.control?.options).filter(x => x).length; }
84
- get hasUppercase() { return UppercaseRegx.test(this.control?.formControl?.value); }
85
- get hasLowercase() { return LowercaseRegx.test(this.control?.formControl?.value); }
86
- get hasDigit() { return DigitRegx.test(this.control?.formControl?.value); }
87
- get hasNonAlphanumeric() { return NonAlphanumericRegx.test(this.control?.formControl?.value); }
88
- get hasMinLength() { return this.minLengthRegx.test(this.control?.formControl?.value); }
67
+ get hasUppercase() { return this.control?.formControl?.value && UppercaseRegx.test(this.control?.formControl?.value); }
68
+ get hasLowercase() { return this.control?.formControl?.value && LowercaseRegx.test(this.control?.formControl?.value); }
69
+ get hasDigit() { return this.control?.formControl?.value && DigitRegx.test(this.control?.formControl?.value); }
70
+ get hasNonAlphanumeric() { return this.control?.formControl?.value && NonAlphanumericRegx.test(this.control?.formControl?.value); }
71
+ get hasMinLength() { return this.control?.formControl?.value && this.minLengthRegx.test(this.control?.formControl?.value); }
89
72
  get strengthMeter() {
90
73
  let strength = -1;
91
74
  if (this.control?.options?.requireUppercase && this.hasUppercase)
@@ -108,20 +91,65 @@ class YsPasswordStrengthComponent {
108
91
  this.strengthMeter == 0 ? "pink" :
109
92
  '';
110
93
  }
111
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: YsPasswordStrengthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
112
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.3", type: YsPasswordStrengthComponent, isStandalone: true, selector: "ys-password-strength", inputs: { control: "control", passwordHelp: "passwordHelp", displayFeedback: "displayFeedback", feedback: "feedback" }, ngImport: i0, template: "<div class=\"password-strength\" *ngIf=\"control\">\r\n <div class=\"d-flex flex-row mt-2\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 4\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\" (strengthMeter >= 0) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 3\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 1) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 2\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 2) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 1\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 3) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 0\" class=\"rounded-start rounded-end\"\r\n [ngClass]=\"(strengthMeter >= 4) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n </div>\r\n <small *ngIf=\"passwordHelp\" id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp}}</small>\r\n <div *ngIf=\"displayFeedback && (control.formControl?.touched || control.formControl?.dirty) && control.formControl?.errors?.['pattern']\"\r\n class=\"invalid-feedback d-grid \">\r\n <span *ngIf=\"control.options?.requireUppercase\"\r\n [ngClass]=\"{'text-success': hasUppercase}\">{{feedback?.uppercase}}</span>\r\n <span *ngIf=\"control.options?.requireLowercase\"\r\n [ngClass]=\"{'text-success': hasLowercase}\">{{feedback?.lowercase}}</span>\r\n <span *ngIf=\"control.options?.requireDigit\" [ngClass]=\"{'text-success': hasDigit}\">{{feedback?.digit}}</span>\r\n <span *ngIf=\"control.options?.requireNonAlphanumeric\"\r\n [ngClass]=\"{'text-success': hasNonAlphanumeric}\">{{feedback?.nonAlphanumeric}}</span>\r\n <span *ngIf=\"control.options?.requiredMinLength\"\r\n [ngClass]=\"{'text-success': hasMinLength}\">{{feedback?.minLength}}</span>\r\n </div>\r\n</div>\r\n<div *ngIf=\"!control\">\r\n Password strength control is undefined.\r\n</div>", styles: [".is-invalid ys-password-strength~.invalid-feedback{display:block}.password-strength hr{border-top:3px solid;margin:0;opacity:.75!important}.password-strength .gray{color:var(--bs-gray-300)}.password-strength .pink{color:var(--bs-pink)}.password-strength .red{color:var(--bs-red)}.password-strength .orange{color:var(--bs-orange)}.password-strength .yellow{color:var(--bs-yellow)}.password-strength .green{color:var(--bs-green)}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
94
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: YsPasswordStrengthComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
95
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.3", type: YsPasswordStrengthComponent, isStandalone: true, selector: "ys-password-strength", inputs: { passwordHelp: "passwordHelp", displayFeedback: "displayFeedback", feedback: "feedback", control: "control" }, ngImport: i0, template: "<div class=\"password-strength\" *ngIf=\"control\">\r\n\r\n <div class=\"d-flex flex-row mt-1\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 4\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\" (strengthMeter >= 0) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 3\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 1) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 2\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 2) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 1\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 3) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 0\" class=\"rounded-start rounded-end\"\r\n [ngClass]=\"(strengthMeter >= 4) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n </div>\r\n\r\n <small *ngIf=\"passwordHelp\" id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp}}</small>\r\n\r\n <div *ngIf=\"displayFeedback && control.formControl?.errors?.['pattern'] && (control.formControl?.touched || control.formControl?.dirty)\"\r\n class=\"invalid-feedback d-grid \">\r\n\r\n <span *ngIf=\"control.options?.requireUppercase\"\r\n [ngClass]=\"{'text-success': hasUppercase}\">{{feedback?.uppercase}}</span>\r\n <span *ngIf=\"control.options?.requireLowercase\"\r\n [ngClass]=\"{'text-success': hasLowercase}\">{{feedback?.lowercase}}</span>\r\n <span *ngIf=\"control.options?.requireDigit\" [ngClass]=\"{'text-success': hasDigit}\">{{feedback?.digit}}</span>\r\n <span *ngIf=\"control.options?.requireNonAlphanumeric\"\r\n [ngClass]=\"{'text-success': hasNonAlphanumeric}\">{{feedback?.nonAlphanumeric}}</span>\r\n <span *ngIf=\"control.options?.requiredMinLength\"\r\n [ngClass]=\"{'text-success': hasMinLength}\">{{feedback?.minLength}}</span>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"control.formControl?.errors?.['required'] && (control.formControl?.touched || control.formControl?.dirty)\"\r\n class=\"invalid-feedback d-grid \">\r\n {{feedback?.required}}\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!control\">\r\n Password strength control is undefined.\r\n</div>", styles: [".is-invalid ys-password-strength~.invalid-feedback{display:block}.password-strength hr{border-top:3px solid;margin:0;opacity:.75!important}.password-strength .gray{color:var(--bs-gray-300)}.password-strength .pink{color:var(--bs-pink)}.password-strength .red{color:var(--bs-red)}.password-strength .orange{color:var(--bs-orange)}.password-strength .yellow{color:var(--bs-yellow)}.password-strength .green{color:var(--bs-green)}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
113
96
  }
114
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: YsPasswordStrengthComponent, decorators: [{
97
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: YsPasswordStrengthComponent, decorators: [{
115
98
  type: Component,
116
- args: [{ selector: 'ys-password-strength', standalone: true, imports: [NgIf, NgClass], template: "<div class=\"password-strength\" *ngIf=\"control\">\r\n <div class=\"d-flex flex-row mt-2\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 4\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\" (strengthMeter >= 0) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 3\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 1) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 2\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 2) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 1\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 3) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 0\" class=\"rounded-start rounded-end\"\r\n [ngClass]=\"(strengthMeter >= 4) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n </div>\r\n <small *ngIf=\"passwordHelp\" id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp}}</small>\r\n <div *ngIf=\"displayFeedback && (control.formControl?.touched || control.formControl?.dirty) && control.formControl?.errors?.['pattern']\"\r\n class=\"invalid-feedback d-grid \">\r\n <span *ngIf=\"control.options?.requireUppercase\"\r\n [ngClass]=\"{'text-success': hasUppercase}\">{{feedback?.uppercase}}</span>\r\n <span *ngIf=\"control.options?.requireLowercase\"\r\n [ngClass]=\"{'text-success': hasLowercase}\">{{feedback?.lowercase}}</span>\r\n <span *ngIf=\"control.options?.requireDigit\" [ngClass]=\"{'text-success': hasDigit}\">{{feedback?.digit}}</span>\r\n <span *ngIf=\"control.options?.requireNonAlphanumeric\"\r\n [ngClass]=\"{'text-success': hasNonAlphanumeric}\">{{feedback?.nonAlphanumeric}}</span>\r\n <span *ngIf=\"control.options?.requiredMinLength\"\r\n [ngClass]=\"{'text-success': hasMinLength}\">{{feedback?.minLength}}</span>\r\n </div>\r\n</div>\r\n<div *ngIf=\"!control\">\r\n Password strength control is undefined.\r\n</div>", styles: [".is-invalid ys-password-strength~.invalid-feedback{display:block}.password-strength hr{border-top:3px solid;margin:0;opacity:.75!important}.password-strength .gray{color:var(--bs-gray-300)}.password-strength .pink{color:var(--bs-pink)}.password-strength .red{color:var(--bs-red)}.password-strength .orange{color:var(--bs-orange)}.password-strength .yellow{color:var(--bs-yellow)}.password-strength .green{color:var(--bs-green)}\n"] }]
117
- }], ctorParameters: () => [], propDecorators: { control: [{
99
+ args: [{ selector: 'ys-password-strength', imports: [NgIf, NgClass], template: "<div class=\"password-strength\" *ngIf=\"control\">\r\n\r\n <div class=\"d-flex flex-row mt-1\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 4\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\" (strengthMeter >= 0) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 3\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 1) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 2\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 2) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 1\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 3) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 0\" class=\"rounded-start rounded-end\"\r\n [ngClass]=\"(strengthMeter >= 4) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n </div>\r\n\r\n <small *ngIf=\"passwordHelp\" id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp}}</small>\r\n\r\n <div *ngIf=\"displayFeedback && control.formControl?.errors?.['pattern'] && (control.formControl?.touched || control.formControl?.dirty)\"\r\n class=\"invalid-feedback d-grid \">\r\n\r\n <span *ngIf=\"control.options?.requireUppercase\"\r\n [ngClass]=\"{'text-success': hasUppercase}\">{{feedback?.uppercase}}</span>\r\n <span *ngIf=\"control.options?.requireLowercase\"\r\n [ngClass]=\"{'text-success': hasLowercase}\">{{feedback?.lowercase}}</span>\r\n <span *ngIf=\"control.options?.requireDigit\" [ngClass]=\"{'text-success': hasDigit}\">{{feedback?.digit}}</span>\r\n <span *ngIf=\"control.options?.requireNonAlphanumeric\"\r\n [ngClass]=\"{'text-success': hasNonAlphanumeric}\">{{feedback?.nonAlphanumeric}}</span>\r\n <span *ngIf=\"control.options?.requiredMinLength\"\r\n [ngClass]=\"{'text-success': hasMinLength}\">{{feedback?.minLength}}</span>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"control.formControl?.errors?.['required'] && (control.formControl?.touched || control.formControl?.dirty)\"\r\n class=\"invalid-feedback d-grid \">\r\n {{feedback?.required}}\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!control\">\r\n Password strength control is undefined.\r\n</div>", styles: [".is-invalid ys-password-strength~.invalid-feedback{display:block}.password-strength hr{border-top:3px solid;margin:0;opacity:.75!important}.password-strength .gray{color:var(--bs-gray-300)}.password-strength .pink{color:var(--bs-pink)}.password-strength .red{color:var(--bs-red)}.password-strength .orange{color:var(--bs-orange)}.password-strength .yellow{color:var(--bs-yellow)}.password-strength .green{color:var(--bs-green)}\n"] }]
100
+ }], propDecorators: { passwordHelp: [{
101
+ type: Input
102
+ }], displayFeedback: [{
103
+ type: Input
104
+ }], feedback: [{
105
+ type: Input
106
+ }], control: [{
118
107
  type: Input
119
- }], passwordHelp: [{
108
+ }] } });
109
+
110
+ class YsPasswordStrengthDirective {
111
+ el;
112
+ viewContainerRef;
113
+ injector;
114
+ control;
115
+ passwordHelp = null;
116
+ displayFeedback = true;
117
+ feedback = new StrengthValidationFeedback();
118
+ options;
119
+ constructor(el, viewContainerRef, injector, control) {
120
+ this.el = el;
121
+ this.viewContainerRef = viewContainerRef;
122
+ this.injector = injector;
123
+ this.control = control;
124
+ }
125
+ ngOnInit() {
126
+ const element = this.el.nativeElement;
127
+ const elementParent = element.parentElement;
128
+ const formControl = this.control.control;
129
+ const passwordStrengthComponent = this.viewContainerRef.createComponent(YsPasswordStrengthComponent, { injector: this.injector });
130
+ elementParent.insertBefore(passwordStrengthComponent.location.nativeElement, element.nextSibling);
131
+ const passwordStrength = passwordStrengthComponent.instance;
132
+ passwordStrength.passwordHelp = this.passwordHelp;
133
+ passwordStrength.displayFeedback = this.displayFeedback;
134
+ passwordStrength.feedback = this.feedback;
135
+ passwordStrength.control = { formControl: formControl, options: this.options };
136
+ }
137
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: YsPasswordStrengthDirective, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }, { token: i0.Injector }, { token: i1.NgControl }], target: i0.ɵɵFactoryTarget.Directive });
138
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.1.3", type: YsPasswordStrengthDirective, isStandalone: true, selector: "[ysPasswordStrength]", inputs: { passwordHelp: "passwordHelp", displayFeedback: "displayFeedback", feedback: "feedback", options: "options" }, ngImport: i0 });
139
+ }
140
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: YsPasswordStrengthDirective, decorators: [{
141
+ type: Directive,
142
+ args: [{
143
+ selector: '[ysPasswordStrength]'
144
+ }]
145
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }, { type: i0.Injector }, { type: i1.NgControl }], propDecorators: { passwordHelp: [{
120
146
  type: Input
121
147
  }], displayFeedback: [{
122
148
  type: Input
123
149
  }], feedback: [{
124
150
  type: Input
151
+ }], options: [{
152
+ type: Input
125
153
  }] } });
126
154
 
127
155
  /*
@@ -132,5 +160,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImpor
132
160
  * Generated bundle index. Do not edit.
133
161
  */
134
162
 
135
- export { DigitRegx, LowercaseRegx, NonAlphanumericRegx, StrengthValidationFeedback, StrengthValidationOption, StrongPasswordRegx, UppercaseRegx, YsPasswordStrengthComponent };
163
+ export { DigitRegx, LowercaseRegx, NonAlphanumericRegx, StrengthValidationFeedback, StrengthValidationOption, StrongPasswordRegx, UppercaseRegx, YsPasswordStrengthComponent, YsPasswordStrengthDirective };
136
164
  //# sourceMappingURL=yoozsoft-yoozsoft-ng-password-strength.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-password-strength.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/regx.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/strength-validation-feedback.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/strength-validation-option.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/ys-password-strength/ys-password-strength.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/ys-password-strength/ys-password-strength.component.html","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/yoozsoft-yoozsoft-ng-password-strength.ts"],"sourcesContent":["export const StrongPasswordRegx: RegExp = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*]).{8,}$/;\r\nexport const UppercaseRegx: RegExp = /^.*[A-Z]/;\r\nexport const LowercaseRegx: RegExp = /^.*[a-z]/;\r\nexport const DigitRegx: RegExp = /^.*[0-9].*/;\r\nexport const NonAlphanumericRegx: RegExp = /^.*[!@#$%^&*]/;\r\n// export const MinLengthRegx: RegExp = /^.{8,}/;","export class StrengthValidationFeedback {\r\n uppercase?: string;\r\n lowercase?: string;\r\n digit?: string;\r\n nonAlphanumeric?: string;\r\n minLength?: string;\r\n\r\n constructor(\r\n options?: {\r\n uppercase?: string,\r\n lowercase?: string,\r\n digit?: string,\r\n nonAlphanumeric?: string,\r\n minLength?: string\r\n }\r\n ) {\r\n this.uppercase = 'At least one uppercase letter.';\r\n this.lowercase = 'At least one lowercase letter.';\r\n this.digit = 'At least one digit.';\r\n this.nonAlphanumeric = 'At least one special character (e.g., !, @, #, $).';\r\n this.minLength = 'At least 8 characters long.';\r\n\r\n if (options?.uppercase !== undefined) { this.uppercase = options?.uppercase; }\r\n if (options?.lowercase !== undefined) { this.lowercase = options?.lowercase; }\r\n if (options?.digit !== undefined) { this.digit = options?.digit; }\r\n if (options?.nonAlphanumeric !== undefined) { this.nonAlphanumeric = options?.nonAlphanumeric; }\r\n if (options?.minLength !== undefined) { this.minLength = options?.minLength; }\r\n }\r\n}","export class StrengthValidationOption {\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireDigit?: boolean;\r\n requireNonAlphanumeric?: boolean;\r\n requiredMinLength: number;\r\n\r\n constructor(\r\n options?: {\r\n requireUppercase?: boolean,\r\n requireLowercase?: boolean,\r\n requireDigit?: boolean,\r\n requireNonAlphanumeric?: boolean,\r\n requiredMinLength?: number\r\n }\r\n ) {\r\n this.requireUppercase = true;\r\n this.requireLowercase = true;\r\n this.requireDigit = true;\r\n this.requireNonAlphanumeric = true;\r\n this.requiredMinLength = 8;\r\n\r\n if (options?.requireUppercase !== undefined) { this.requireUppercase = options?.requireUppercase; }\r\n if (options?.requireLowercase !== undefined) { this.requireLowercase = options?.requireLowercase; }\r\n if (options?.requireDigit !== undefined) { this.requireDigit = options?.requireDigit; }\r\n if (options?.requireNonAlphanumeric !== undefined) { this.requireNonAlphanumeric = options?.requireNonAlphanumeric; }\r\n if (options?.requiredMinLength !== undefined) { this.requiredMinLength = options?.requiredMinLength; }\r\n }\r\n}","import { NgClass, NgIf } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { Validators } from '@angular/forms';\r\nimport { DigitRegx, LowercaseRegx, NonAlphanumericRegx, StrengthValidationControl, StrengthValidationFeedback, StrengthValidationOption, UppercaseRegx } from '../models';\r\n\r\n@Component({\r\n selector: 'ys-password-strength',\r\n standalone: true,\r\n imports: [NgIf, NgClass],\r\n templateUrl: './ys-password-strength.component.html',\r\n styleUrl: './ys-password-strength.component.scss'\r\n})\r\nexport class YsPasswordStrengthComponent {\r\n\r\n private minLengthRegx: RegExp = new RegExp('');\r\n\r\n private _control?: StrengthValidationControl;\r\n @Input()\r\n get control(): StrengthValidationControl | undefined { return this._control; }\r\n set control(value: StrengthValidationControl | undefined) {\r\n this._control = value;\r\n\r\n if (!this._control) { return; }\r\n\r\n if (!this._control.options) {\r\n this._control.options = new StrengthValidationOption();\r\n }\r\n\r\n const strongPasswordRegx: RegExp = new RegExp(\r\n `${this._control.options.requireUppercase ? '^(?=[^A-Z]*[A-Z])' : ''\r\n }${this._control.options.requireLowercase ? '(?=[^a-z]*[a-z])' : ''\r\n }${this._control.options.requireDigit ? '(?=\\\\D*\\\\d)' : ''\r\n }${this._control.options.requireNonAlphanumeric ? '(?=.*[!@#$%^&*])' : ''\r\n }.{${this._control.options.requiredMinLength},}$`);\r\n\r\n this.minLengthRegx = new RegExp(`.{${this._control.options.requiredMinLength},}$`);\r\n\r\n this._control.formControl?.addValidators(Validators.pattern(strongPasswordRegx));\r\n }\r\n\r\n @Input() passwordHelp: string | null = null;\r\n @Input() displayFeedback: boolean = true;\r\n @Input() feedback: StrengthValidationFeedback | null = new StrengthValidationFeedback();\r\n\r\n constructor() { }\r\n\r\n get requiredOptionsLength(): number { return Object.values(this.control?.options!).filter(x => x).length; }\r\n\r\n get hasUppercase(): boolean { return UppercaseRegx.test(this.control?.formControl?.value); }\r\n get hasLowercase(): boolean { return LowercaseRegx.test(this.control?.formControl?.value); }\r\n get hasDigit(): boolean { return DigitRegx.test(this.control?.formControl?.value); }\r\n get hasNonAlphanumeric(): boolean { return NonAlphanumericRegx.test(this.control?.formControl?.value); }\r\n get hasMinLength(): boolean { return this.minLengthRegx.test(this.control?.formControl?.value); }\r\n\r\n get strengthMeter(): number {\r\n\r\n let strength: number = -1;\r\n if (this.control?.options?.requireUppercase && this.hasUppercase) strength += 1;\r\n if (this.control?.options?.requireLowercase && this.hasLowercase) strength += 1;\r\n if (this.control?.options?.requireDigit && this.hasDigit) strength += 1;\r\n if (this.control?.options?.requireNonAlphanumeric && this.hasNonAlphanumeric) strength += 1;\r\n if (this.control?.options?.requiredMinLength && this.hasMinLength) strength += 1;\r\n\r\n return strength + (5 - this.requiredOptionsLength);\r\n }\r\n\r\n get strengthStyleClass(): string {\r\n return this.strengthMeter == 4 ? \"green\" :\r\n this.strengthMeter == 3 ? \"yellow\" :\r\n this.strengthMeter == 2 ? \"orange\" :\r\n this.strengthMeter == 1 ? \"red\" :\r\n this.strengthMeter == 0 ? \"pink\" :\r\n '';\r\n }\r\n\r\n}\r\n","<div class=\"password-strength\" *ngIf=\"control\">\r\n <div class=\"d-flex flex-row mt-2\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 4\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\" (strengthMeter >= 0) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 3\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 1) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 2\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 2) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 1\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 3) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 0\" class=\"rounded-start rounded-end\"\r\n [ngClass]=\"(strengthMeter >= 4) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n </div>\r\n <small *ngIf=\"passwordHelp\" id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp}}</small>\r\n <div *ngIf=\"displayFeedback && (control.formControl?.touched || control.formControl?.dirty) && control.formControl?.errors?.['pattern']\"\r\n class=\"invalid-feedback d-grid \">\r\n <span *ngIf=\"control.options?.requireUppercase\"\r\n [ngClass]=\"{'text-success': hasUppercase}\">{{feedback?.uppercase}}</span>\r\n <span *ngIf=\"control.options?.requireLowercase\"\r\n [ngClass]=\"{'text-success': hasLowercase}\">{{feedback?.lowercase}}</span>\r\n <span *ngIf=\"control.options?.requireDigit\" [ngClass]=\"{'text-success': hasDigit}\">{{feedback?.digit}}</span>\r\n <span *ngIf=\"control.options?.requireNonAlphanumeric\"\r\n [ngClass]=\"{'text-success': hasNonAlphanumeric}\">{{feedback?.nonAlphanumeric}}</span>\r\n <span *ngIf=\"control.options?.requiredMinLength\"\r\n [ngClass]=\"{'text-success': hasMinLength}\">{{feedback?.minLength}}</span>\r\n </div>\r\n</div>\r\n<div *ngIf=\"!control\">\r\n Password strength control is undefined.\r\n</div>","/*\r\n * Public API Surface of ys-password-strength\r\n */\r\n\r\nexport * from './src/models';\r\nexport * from './src/ys-password-strength/ys-password-strength.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-password-strength.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/regx.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/strength-validation-feedback.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/models/strength-validation-option.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/ys-password-strength/ys-password-strength.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/ys-password-strength/ys-password-strength.component.html","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/src/directives/ys-password-strength.directive.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/password-strength/yoozsoft-yoozsoft-ng-password-strength.ts"],"sourcesContent":["export const StrongPasswordRegx: RegExp = /^(?=[^A-Z]*[A-Z])(?=[^a-z]*[a-z])(?=\\D*\\d)(?=.*[!@#$%^&*]).{8,}$/;\r\nexport const UppercaseRegx: RegExp = /^.*[A-Z]/;\r\nexport const LowercaseRegx: RegExp = /^.*[a-z]/;\r\nexport const DigitRegx: RegExp = /^.*[0-9].*/;\r\nexport const NonAlphanumericRegx: RegExp = /^.*[!@#$%^&*]/;\r\n// export const MinLength8Regx: RegExp = /^.{8,}/;","export class StrengthValidationFeedback {\r\n required?: string;\r\n uppercase?: string;\r\n lowercase?: string;\r\n digit?: string;\r\n nonAlphanumeric?: string;\r\n minLength?: string;\r\n\r\n constructor(\r\n options?: {\r\n required?: string,\r\n uppercase?: string,\r\n lowercase?: string,\r\n digit?: string,\r\n nonAlphanumeric?: string,\r\n minLength?: string\r\n }\r\n ) {\r\n this.required = options?.required == undefined ? 'Please enter a valid password.' : options?.required;\r\n this.uppercase = options?.uppercase == undefined ? 'At least one uppercase letter.' : options?.uppercase;\r\n this.lowercase = options?.lowercase == undefined ? 'At least one lowercase letter.' : options?.lowercase;\r\n this.digit = options?.digit == undefined ? 'At least one digit.' : options?.digit;\r\n this.nonAlphanumeric = options?.nonAlphanumeric == undefined ? 'At least one special character (e.g., !, @, #, $).' : options?.nonAlphanumeric;\r\n this.minLength = options?.minLength == undefined ? 'At least 8 characters long.' : options?.minLength;\r\n }\r\n}","export class StrengthValidationOption {\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireDigit?: boolean;\r\n requireNonAlphanumeric?: boolean;\r\n requiredMinLength: number;\r\n\r\n constructor(\r\n options?: {\r\n requireUppercase?: boolean,\r\n requireLowercase?: boolean,\r\n requireDigit?: boolean,\r\n requireNonAlphanumeric?: boolean,\r\n requiredMinLength?: number\r\n }\r\n ) {\r\n this.requireUppercase = options?.requireUppercase == undefined ? true : options?.requireUppercase;\r\n this.requireLowercase = options?.requireLowercase == undefined ? true : options?.requireLowercase;\r\n this.requireDigit = options?.requireDigit == undefined ? true : options?.requireDigit;\r\n this.requireNonAlphanumeric = options?.requireNonAlphanumeric == undefined ? true : options?.requireNonAlphanumeric;\r\n this.requiredMinLength = options?.requiredMinLength == undefined ? 8 : options?.requiredMinLength;\r\n }\r\n}","import { NgClass, NgIf } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { Validators } from '@angular/forms';\r\nimport { DigitRegx, LowercaseRegx, NonAlphanumericRegx, StrengthValidationControl, StrengthValidationFeedback, StrengthValidationOption, UppercaseRegx } from '../models';\r\n\r\n@Component({\r\n selector: 'ys-password-strength',\r\n imports: [NgIf, NgClass],\r\n templateUrl: './ys-password-strength.component.html',\r\n styleUrl: './ys-password-strength.component.scss'\r\n})\r\nexport class YsPasswordStrengthComponent {\r\n\r\n @Input() passwordHelp: string | null = null;\r\n @Input() displayFeedback: boolean = true;\r\n @Input() feedback: StrengthValidationFeedback | null = new StrengthValidationFeedback();\r\n\r\n private minLengthRegx: RegExp = new RegExp('');\r\n\r\n private _control?: StrengthValidationControl;\r\n @Input()\r\n get control(): StrengthValidationControl | undefined { return this._control; }\r\n set control(value: StrengthValidationControl | undefined) {\r\n this._control = value;\r\n\r\n if (!this._control) { return; }\r\n\r\n if (!this._control.options) {\r\n this._control.options = new StrengthValidationOption();\r\n }\r\n\r\n const strongPasswordRegx: RegExp = new RegExp(\r\n `${this._control.options.requireUppercase ? '^(?=[^A-Z]*[A-Z])' : ''\r\n }${this._control.options.requireLowercase ? '(?=[^a-z]*[a-z])' : ''\r\n }${this._control.options.requireDigit ? '(?=\\\\D*\\\\d)' : ''\r\n }${this._control.options.requireNonAlphanumeric ? '(?=.*[!@#$%^&*])' : ''\r\n }.{${this._control.options.requiredMinLength},}$`);\r\n\r\n this.minLengthRegx = new RegExp(`.{${this._control.options.requiredMinLength},}$`);\r\n\r\n this._control.formControl?.addValidators([Validators.required, Validators.pattern(strongPasswordRegx)]);\r\n this._control.formControl?.updateValueAndValidity();\r\n\r\n }\r\n\r\n get requiredOptionsLength(): number { return Object.values(this.control?.options!).filter(x => x).length; }\r\n\r\n get hasUppercase(): boolean { return this.control?.formControl?.value && UppercaseRegx.test(this.control?.formControl?.value); }\r\n get hasLowercase(): boolean { return this.control?.formControl?.value && LowercaseRegx.test(this.control?.formControl?.value); }\r\n get hasDigit(): boolean { return this.control?.formControl?.value && DigitRegx.test(this.control?.formControl?.value); }\r\n get hasNonAlphanumeric(): boolean { return this.control?.formControl?.value && NonAlphanumericRegx.test(this.control?.formControl?.value); }\r\n get hasMinLength(): boolean { return this.control?.formControl?.value && this.minLengthRegx.test(this.control?.formControl?.value); }\r\n\r\n get strengthMeter(): number {\r\n\r\n let strength: number = -1;\r\n if (this.control?.options?.requireUppercase && this.hasUppercase)\r\n strength += 1;\r\n if (this.control?.options?.requireLowercase && this.hasLowercase)\r\n strength += 1;\r\n if (this.control?.options?.requireDigit && this.hasDigit)\r\n strength += 1;\r\n if (this.control?.options?.requireNonAlphanumeric && this.hasNonAlphanumeric)\r\n strength += 1;\r\n if (this.control?.options?.requiredMinLength && this.hasMinLength)\r\n strength += 1;\r\n\r\n return strength + (5 - this.requiredOptionsLength);\r\n }\r\n\r\n get strengthStyleClass(): string {\r\n return this.strengthMeter == 4 ? \"green\" :\r\n this.strengthMeter == 3 ? \"yellow\" :\r\n this.strengthMeter == 2 ? \"orange\" :\r\n this.strengthMeter == 1 ? \"red\" :\r\n this.strengthMeter == 0 ? \"pink\" :\r\n '';\r\n }\r\n\r\n}\r\n","<div class=\"password-strength\" *ngIf=\"control\">\r\n\r\n <div class=\"d-flex flex-row mt-1\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 4\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\" (strengthMeter >= 0) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 3\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 1) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 2\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 2) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 1\" class=\"rounded-start rounded-end me-1\"\r\n [ngClass]=\"(strengthMeter >= 3) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n <hr *ngIf=\"this.requiredOptionsLength > 0\" class=\"rounded-start rounded-end\"\r\n [ngClass]=\"(strengthMeter >= 4) ? strengthStyleClass : 'gray'\"\r\n [style.width.%]=\"[100 / requiredOptionsLength]\">\r\n </div>\r\n\r\n <small *ngIf=\"passwordHelp\" id=\"passwordHelp\" class=\"form-text text-muted\">{{passwordHelp}}</small>\r\n\r\n <div *ngIf=\"displayFeedback && control.formControl?.errors?.['pattern'] && (control.formControl?.touched || control.formControl?.dirty)\"\r\n class=\"invalid-feedback d-grid \">\r\n\r\n <span *ngIf=\"control.options?.requireUppercase\"\r\n [ngClass]=\"{'text-success': hasUppercase}\">{{feedback?.uppercase}}</span>\r\n <span *ngIf=\"control.options?.requireLowercase\"\r\n [ngClass]=\"{'text-success': hasLowercase}\">{{feedback?.lowercase}}</span>\r\n <span *ngIf=\"control.options?.requireDigit\" [ngClass]=\"{'text-success': hasDigit}\">{{feedback?.digit}}</span>\r\n <span *ngIf=\"control.options?.requireNonAlphanumeric\"\r\n [ngClass]=\"{'text-success': hasNonAlphanumeric}\">{{feedback?.nonAlphanumeric}}</span>\r\n <span *ngIf=\"control.options?.requiredMinLength\"\r\n [ngClass]=\"{'text-success': hasMinLength}\">{{feedback?.minLength}}</span>\r\n\r\n </div>\r\n\r\n <div *ngIf=\"control.formControl?.errors?.['required'] && (control.formControl?.touched || control.formControl?.dirty)\"\r\n class=\"invalid-feedback d-grid \">\r\n {{feedback?.required}}\r\n </div>\r\n</div>\r\n\r\n<div *ngIf=\"!control\">\r\n Password strength control is undefined.\r\n</div>","import { Directive, ElementRef, Injector, Input, OnInit, ViewContainerRef } from '@angular/core';\r\nimport { AbstractControl, NgControl } from '@angular/forms';\r\nimport { StrengthValidationFeedback, StrengthValidationOption } from '../models';\r\nimport { YsPasswordStrengthComponent } from '../ys-password-strength/ys-password-strength.component';\r\n\r\n@Directive({\r\n selector: '[ysPasswordStrength]'\r\n})\r\nexport class YsPasswordStrengthDirective implements OnInit {\r\n\r\n @Input() passwordHelp: string | null = null;\r\n @Input() displayFeedback: boolean = true;\r\n @Input() feedback: StrengthValidationFeedback | null = new StrengthValidationFeedback();\r\n @Input() options?: StrengthValidationOption;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private viewContainerRef: ViewContainerRef,\r\n private injector: Injector,\r\n private control: NgControl\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n const element = this.el.nativeElement;\r\n const elementParent = element.parentElement;\r\n\r\n const formControl: AbstractControl<any, any> | null = this.control.control;\r\n\r\n const passwordStrengthComponent = this.viewContainerRef.createComponent(YsPasswordStrengthComponent, { injector: this.injector });\r\n elementParent.insertBefore(passwordStrengthComponent.location.nativeElement, element.nextSibling);\r\n\r\n const passwordStrength: YsPasswordStrengthComponent = passwordStrengthComponent.instance;\r\n passwordStrength.passwordHelp = this.passwordHelp;\r\n passwordStrength.displayFeedback = this.displayFeedback;\r\n passwordStrength.feedback = this.feedback;\r\n passwordStrength.control = { formControl: formControl, options: this.options };\r\n\r\n }\r\n\r\n}\r\n","/*\r\n * Public API Surface of ys-password-strength\r\n */\r\n\r\nexport * from './src/directives';\r\nexport * from './src/models';\r\nexport * from './src/ys-password-strength/ys-password-strength.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -4,38 +4,38 @@ import { BehaviorSubject } from 'rxjs';
4
4
  import { NgClass, AsyncPipe } from '@angular/common';
5
5
 
6
6
  class ProgressService {
7
- constructor() {
8
- this._loading$ = new BehaviorSubject(false);
9
- }
7
+ _loading$ = new BehaviorSubject(false);
10
8
  get loading$() { return this._loading$.asObservable(); }
11
9
  setLoading(loading) {
12
10
  this._loading$.next(loading);
13
11
  }
14
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ProgressService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
15
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ProgressService }); }
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: ProgressService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
13
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: ProgressService });
16
14
  }
17
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: ProgressService, decorators: [{
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: ProgressService, decorators: [{
18
16
  type: Injectable
19
17
  }] });
20
18
 
21
19
  class YsProgressComponent {
20
+ progressService;
21
+ loading$;
22
+ /**
23
+ * Set reverse animation direction.
24
+ */
25
+ reverse = false;
26
+ styleClass = null;
27
+ height = 3;
28
+ label = null;
22
29
  constructor(progressService) {
23
30
  this.progressService = progressService;
24
- /**
25
- * Set reverse animation direction.
26
- */
27
- this.reverse = false;
28
- this.styleClass = null;
29
- this.height = 3;
30
- this.label = null;
31
31
  this.loading$ = progressService.loading$;
32
32
  }
33
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: YsProgressComponent, deps: [{ token: ProgressService }], target: i0.ɵɵFactoryTarget.Component }); }
34
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.3", type: YsProgressComponent, isStandalone: true, selector: "ys-progress", inputs: { reverse: "reverse", styleClass: "styleClass", height: "height", label: "label" }, ngImport: i0, template: "<div class=\"progress\" role=\"progressbar\" [style]=\"'height: '+ height +'px'\">\r\n <div class=\"progress-bar {{styleClass}}\"\r\n [ngClass]=\"{'indeterminate': (loading$ | async), 'direction-reverse': reverse}\">\r\n {{(loading$ | async) && label ? label : ''}}\r\n </div>\r\n</div>", styles: ["@keyframes progress-indeterminate{0%{left:-25%;width:25%}to{left:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{left:-100%;width:25%}to{left:25%;width:25%}}.progress .progress-bar.indeterminate{position:relative}.progress .direction-reverse{animation-direction:reverse!important}::ng-deep html[dir=rtl] .progress .progress-bar.indeterminate{animation:progress-indeterminate-rtl 3s linear infinite}::ng-deep html[dir=ltr] .progress .progress-bar.indeterminate,::ng-deep html :not(dir) .progress .progress-bar.indeterminate{animation:progress-indeterminate 3s linear infinite}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
33
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: YsProgressComponent, deps: [{ token: ProgressService }], target: i0.ɵɵFactoryTarget.Component });
34
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.3", type: YsProgressComponent, isStandalone: true, selector: "ys-progress", inputs: { reverse: "reverse", styleClass: "styleClass", height: "height", label: "label" }, ngImport: i0, template: "<div class=\"progress\" role=\"progressbar\" [style]=\"'height: '+ height +'px'\">\r\n <div class=\"progress-bar {{styleClass}}\"\r\n [ngClass]=\"{'indeterminate': (loading$ | async), 'direction-reverse': reverse}\">\r\n {{(loading$ | async) && label ? label : ''}}\r\n </div>\r\n</div>", styles: ["@keyframes progress-indeterminate{0%{left:-25%;width:25%}to{left:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{left:-100%;width:25%}to{left:25%;width:25%}}.progress .progress-bar.indeterminate{position:relative}.progress .direction-reverse{animation-direction:reverse!important}::ng-deep html[dir=rtl] .progress .progress-bar.indeterminate{animation:progress-indeterminate-rtl 3s linear infinite}::ng-deep html[dir=ltr] .progress .progress-bar.indeterminate,::ng-deep html :not(dir) .progress .progress-bar.indeterminate{animation:progress-indeterminate 3s linear infinite}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] });
35
35
  }
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: YsProgressComponent, decorators: [{
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: YsProgressComponent, decorators: [{
37
37
  type: Component,
38
- args: [{ selector: 'ys-progress', standalone: true, imports: [NgClass, AsyncPipe], template: "<div class=\"progress\" role=\"progressbar\" [style]=\"'height: '+ height +'px'\">\r\n <div class=\"progress-bar {{styleClass}}\"\r\n [ngClass]=\"{'indeterminate': (loading$ | async), 'direction-reverse': reverse}\">\r\n {{(loading$ | async) && label ? label : ''}}\r\n </div>\r\n</div>", styles: ["@keyframes progress-indeterminate{0%{left:-25%;width:25%}to{left:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{left:-100%;width:25%}to{left:25%;width:25%}}.progress .progress-bar.indeterminate{position:relative}.progress .direction-reverse{animation-direction:reverse!important}::ng-deep html[dir=rtl] .progress .progress-bar.indeterminate{animation:progress-indeterminate-rtl 3s linear infinite}::ng-deep html[dir=ltr] .progress .progress-bar.indeterminate,::ng-deep html :not(dir) .progress .progress-bar.indeterminate{animation:progress-indeterminate 3s linear infinite}\n"] }]
38
+ args: [{ selector: 'ys-progress', imports: [NgClass, AsyncPipe], template: "<div class=\"progress\" role=\"progressbar\" [style]=\"'height: '+ height +'px'\">\r\n <div class=\"progress-bar {{styleClass}}\"\r\n [ngClass]=\"{'indeterminate': (loading$ | async), 'direction-reverse': reverse}\">\r\n {{(loading$ | async) && label ? label : ''}}\r\n </div>\r\n</div>", styles: ["@keyframes progress-indeterminate{0%{left:-25%;width:25%}to{left:100%;width:25%}}@keyframes progress-indeterminate-rtl{0%{left:-100%;width:25%}to{left:25%;width:25%}}.progress .progress-bar.indeterminate{position:relative}.progress .direction-reverse{animation-direction:reverse!important}::ng-deep html[dir=rtl] .progress .progress-bar.indeterminate{animation:progress-indeterminate-rtl 3s linear infinite}::ng-deep html[dir=ltr] .progress .progress-bar.indeterminate,::ng-deep html :not(dir) .progress .progress-bar.indeterminate{animation:progress-indeterminate 3s linear infinite}\n"] }]
39
39
  }], ctorParameters: () => [{ type: ProgressService }], propDecorators: { reverse: [{
40
40
  type: Input
41
41
  }], styleClass: [{
@@ -1 +1 @@
1
- {"version":3,"file":"yoozsoft-yoozsoft-ng-progress.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/progress/src/services/progress.service.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/src/ys-progress/ys-progress.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/src/ys-progress/ys-progress.component.html","../../../../projects/yoozsoft/yoozsoft-ng/progress/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/yoozsoft-yoozsoft-ng-progress.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class ProgressService {\r\n private _loading$ = new BehaviorSubject<boolean>(false);\r\n\r\n get loading$() { return this._loading$.asObservable(); }\r\n\r\n setLoading(loading: boolean) {\r\n this._loading$.next(loading);\r\n }\r\n}\r\n","import { AsyncPipe, NgClass } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ProgressService } from '../services';\r\n\r\n@Component({\r\n selector: 'ys-progress',\r\n standalone: true,\r\n imports: [NgClass, AsyncPipe],\r\n templateUrl: './ys-progress.component.html',\r\n styleUrls: ['./ys-progress.component.scss']\r\n})\r\nexport class YsProgressComponent {\r\n\r\n loading$: Observable<boolean>;\r\n\r\n /**\r\n * Set reverse animation direction.\r\n */\r\n @Input() reverse: boolean = false;\r\n @Input() styleClass: string | null = null;\r\n @Input() height: number = 3;\r\n @Input() label: string | null = null;\r\n\r\n constructor(private progressService: ProgressService) {\r\n this.loading$ = progressService.loading$;\r\n }\r\n\r\n}\r\n","<div class=\"progress\" role=\"progressbar\" [style]=\"'height: '+ height +'px'\">\r\n <div class=\"progress-bar {{styleClass}}\"\r\n [ngClass]=\"{'indeterminate': (loading$ | async), 'direction-reverse': reverse}\">\r\n {{(loading$ | async) && label ? label : ''}}\r\n </div>\r\n</div>","/*\r\n * Public API Surface of ys-progress\r\n */\r\n\r\nexport * from './src/services';\r\nexport * from './src/ys-progress/ys-progress.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ProgressService"],"mappings":";;;;;MAIa,eAAe,CAAA;AAD5B,IAAA,WAAA,GAAA;AAEU,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;AAOzD,KAAA;IALC,IAAI,QAAQ,GAAK,EAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,EAAE;AAExD,IAAA,UAAU,CAAC,OAAgB,EAAA;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KAC9B;8GAPU,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;kHAAf,eAAe,EAAA,CAAA,CAAA,EAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;;;MCSE,mBAAmB,CAAA;AAY9B,IAAA,WAAA,CAAoB,eAAgC,EAAA;QAAhC,IAAe,CAAA,eAAA,GAAf,eAAe,CAAiB;AARpD;;AAEG;QACM,IAAO,CAAA,OAAA,GAAY,KAAK,CAAC;QACzB,IAAU,CAAA,UAAA,GAAkB,IAAI,CAAC;QACjC,IAAM,CAAA,MAAA,GAAW,CAAC,CAAC;QACnB,IAAK,CAAA,KAAA,GAAkB,IAAI,CAAC;AAGnC,QAAA,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC;KAC1C;8GAdU,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,ECZhC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,oTAKM,EDGM,MAAA,EAAA,CAAA,4kBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,+EAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FAIjB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,oTAAA,EAAA,MAAA,EAAA,CAAA,4kBAAA,CAAA,EAAA,CAAA;iFAWpB,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,UAAU,EAAA,CAAA;sBAAlB,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;;;AEtBR;;AAEG;;ACFH;;AAEG;;;;"}
1
+ {"version":3,"file":"yoozsoft-yoozsoft-ng-progress.mjs","sources":["../../../../projects/yoozsoft/yoozsoft-ng/progress/src/services/progress.service.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/src/ys-progress/ys-progress.component.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/src/ys-progress/ys-progress.component.html","../../../../projects/yoozsoft/yoozsoft-ng/progress/public-api.ts","../../../../projects/yoozsoft/yoozsoft-ng/progress/yoozsoft-yoozsoft-ng-progress.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class ProgressService {\r\n\r\n private _loading$ = new BehaviorSubject<boolean>(false);\r\n\r\n get loading$() { return this._loading$.asObservable(); }\r\n\r\n setLoading(loading: boolean) {\r\n this._loading$.next(loading);\r\n }\r\n}\r\n","import { AsyncPipe, NgClass } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport { ProgressService } from '../services';\r\n\r\n@Component({\r\n selector: 'ys-progress',\r\n imports: [NgClass, AsyncPipe],\r\n templateUrl: './ys-progress.component.html',\r\n styleUrl: './ys-progress.component.scss'\r\n})\r\nexport class YsProgressComponent {\r\n\r\n loading$: Observable<boolean>;\r\n\r\n /**\r\n * Set reverse animation direction.\r\n */\r\n @Input() reverse: boolean = false;\r\n @Input() styleClass: string | null = null;\r\n @Input() height: number = 3;\r\n @Input() label: string | null = null;\r\n\r\n constructor(private progressService: ProgressService) {\r\n this.loading$ = progressService.loading$;\r\n }\r\n\r\n}\r\n","<div class=\"progress\" role=\"progressbar\" [style]=\"'height: '+ height +'px'\">\r\n <div class=\"progress-bar {{styleClass}}\"\r\n [ngClass]=\"{'indeterminate': (loading$ | async), 'direction-reverse': reverse}\">\r\n {{(loading$ | async) && label ? label : ''}}\r\n </div>\r\n</div>","/*\r\n * Public API Surface of ys-progress\r\n */\r\n\r\nexport * from './src/services';\r\nexport * from './src/ys-progress/ys-progress.component';\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ProgressService"],"mappings":";;;;;MAIa,eAAe,CAAA;AAElB,IAAA,SAAS,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;IAEvD,IAAI,QAAQ,GAAK,EAAA,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;AAEtD,IAAA,UAAU,CAAC,OAAgB,EAAA;AACzB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;;uGAPnB,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAAf,eAAe,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;MCQY,mBAAmB,CAAA;AAYV,IAAA,eAAA;AAVpB,IAAA,QAAQ;AAER;;AAEG;IACM,OAAO,GAAY,KAAK;IACxB,UAAU,GAAkB,IAAI;IAChC,MAAM,GAAW,CAAC;IAClB,KAAK,GAAkB,IAAI;AAEpC,IAAA,WAAA,CAAoB,eAAgC,EAAA;QAAhC,IAAe,CAAA,eAAA,GAAf,eAAe;AACjC,QAAA,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ;;uGAb/B,mBAAmB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,eAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,ECXhC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,oTAKM,EDEM,MAAA,EAAA,CAAA,4kBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,OAAO,+EAAE,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,CAAA;;2FAIjB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAN/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EACd,OAAA,EAAA,CAAC,OAAO,EAAE,SAAS,CAAC,EAAA,QAAA,EAAA,oTAAA,EAAA,MAAA,EAAA,CAAA,4kBAAA,CAAA,EAAA;iFAWpB,OAAO,EAAA,CAAA;sBAAf;gBACQ,UAAU,EAAA,CAAA;sBAAlB;gBACQ,MAAM,EAAA,CAAA;sBAAd;gBACQ,KAAK,EAAA,CAAA;sBAAb;;;AErBH;;AAEG;;ACFH;;AAEG;;;;"}