@cityway/bo-ui 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/.eslintrc.json +37 -0
  2. package/ng-package.json +21 -0
  3. package/package.json +21 -32
  4. package/src/lib/bo-ui.config.ts +8 -0
  5. package/src/lib/components/accordions/accordions.component.html +16 -0
  6. package/src/lib/components/accordions/accordions.component.spec.ts +24 -0
  7. package/src/lib/components/accordions/accordions.component.ts +27 -0
  8. package/src/lib/components/accordions/components/accordions-content.component.spec.ts +24 -0
  9. package/src/lib/components/accordions/components/accordions-content.component.ts +28 -0
  10. package/src/lib/components/alert/alert.component.html +15 -0
  11. package/src/lib/components/alert/alert.component.spec.ts +24 -0
  12. package/src/lib/components/alert/alert.component.ts +36 -0
  13. package/src/lib/components/badge/badge.component.html +7 -0
  14. package/src/lib/components/badge/badge.component.spec.ts +24 -0
  15. package/src/lib/components/badge/badge.component.ts +24 -0
  16. package/src/lib/components/button/button.component.html +43 -0
  17. package/src/lib/components/button/button.component.spec.ts +25 -0
  18. package/src/lib/components/button/button.component.ts +47 -0
  19. package/src/lib/components/card/card.component.html +15 -0
  20. package/src/lib/components/card/card.component.spec.ts +25 -0
  21. package/src/lib/components/card/card.component.ts +30 -0
  22. package/src/lib/components/custom-list/custom-list.component.html +31 -0
  23. package/src/lib/components/custom-list/custom-list.component.spec.ts +24 -0
  24. package/src/lib/components/custom-list/custom-list.component.ts +42 -0
  25. package/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.html +27 -0
  26. package/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.spec.ts +24 -0
  27. package/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.ts +40 -0
  28. package/src/lib/components/form-field/form-field.component.html +333 -0
  29. package/src/lib/components/form-field/form-field.component.spec.ts +24 -0
  30. package/src/lib/components/form-field/form-field.component.ts +256 -0
  31. package/src/lib/components/icon/icon.component.html +9 -0
  32. package/src/lib/components/icon/icon.component.spec.ts +25 -0
  33. package/src/lib/components/icon/icon.component.ts +31 -0
  34. package/src/lib/components/layout/admin-layout/admin-layout.component.html +17 -0
  35. package/src/lib/components/layout/admin-layout/admin-layout.component.ts +181 -0
  36. package/src/lib/components/layout/footer/footer.component.html +51 -0
  37. package/src/lib/components/layout/footer/footer.component.ts +65 -0
  38. package/src/lib/components/layout/header/header.component.html +71 -0
  39. package/src/lib/components/layout/header/header.component.ts +95 -0
  40. package/src/lib/components/layout/menu/menu.component.html +115 -0
  41. package/src/lib/components/layout/menu/menu.component.ts +75 -0
  42. package/src/lib/components/layout/menu-accordion/accordion.directive.ts +57 -0
  43. package/src/lib/components/layout/menu-accordion/accordionanchor.directive.ts +21 -0
  44. package/src/lib/components/layout/menu-accordion/accordionlink.directive.ts +45 -0
  45. package/src/lib/components/layout/menu-accordion/index.ts +3 -0
  46. package/src/lib/components/layout/sidebar/sidebar.component.html +62 -0
  47. package/src/lib/components/layout/sidebar/sidebar.component.ts +28 -0
  48. package/src/lib/components/layout/skip-links/skip-links.component.html +3 -0
  49. package/src/lib/components/layout/skip-links/skip-links.component.spec.ts +25 -0
  50. package/src/lib/components/layout/skip-links/skip-links.component.ts +19 -0
  51. package/src/lib/components/layout/title-breadcrumb/title-breadcrumb.component.html +10 -0
  52. package/src/lib/components/layout/title-breadcrumb/title-breadcrumb.component.spec.ts +25 -0
  53. package/src/lib/components/layout/title-breadcrumb/title-breadcrumb.component.ts +16 -0
  54. package/src/lib/components/legend/legend.component.html +23 -0
  55. package/src/lib/components/legend/legend.component.spec.ts +24 -0
  56. package/src/lib/components/legend/legend.component.ts +28 -0
  57. package/src/lib/components/loader/loader.component.html +4 -0
  58. package/src/lib/components/loader/loader.component.ts +16 -0
  59. package/src/lib/components/modals/modals.component.html +71 -0
  60. package/src/lib/components/modals/modals.component.spec.ts +25 -0
  61. package/src/lib/components/modals/modals.component.ts +49 -0
  62. package/src/lib/components/tab/components/tab-content.component.spec.ts +24 -0
  63. package/src/lib/components/tab/components/tab-content.component.ts +27 -0
  64. package/src/lib/components/tab/tab.component.html +59 -0
  65. package/src/lib/components/tab/tab.component.spec.ts +24 -0
  66. package/src/lib/components/tab/tab.component.ts +79 -0
  67. package/src/lib/components/table/components/actions-on-table/actions-on-table.component.html +50 -0
  68. package/src/lib/components/table/components/actions-on-table/actions-on-table.component.spec.ts +24 -0
  69. package/src/lib/components/table/components/actions-on-table/actions-on-table.component.ts +33 -0
  70. package/src/lib/components/table/components/filter/filter.component.html +21 -0
  71. package/src/lib/components/table/components/filter/filter.component.spec.ts +24 -0
  72. package/src/lib/components/table/components/filter/filter.component.ts +38 -0
  73. package/src/lib/components/table/table.component.html +104 -0
  74. package/src/lib/components/table/table.component.spec.ts +24 -0
  75. package/src/lib/components/table/table.component.ts +85 -0
  76. package/src/lib/components/wizard-stepper/components/wizard-step.component.spec.ts +25 -0
  77. package/src/lib/components/wizard-stepper/components/wizard-step.component.ts +16 -0
  78. package/src/lib/components/wizard-stepper/wizard-stepper.component.html +45 -0
  79. package/src/lib/components/wizard-stepper/wizard-stepper.component.spec.ts +25 -0
  80. package/src/lib/components/wizard-stepper/wizard-stepper.component.ts +70 -0
  81. package/src/lib/directives/double-scroll.ts +64 -0
  82. package/src/lib/directives/rwd-tabs.ts +99 -0
  83. package/src/lib/directives/show-hide-password.ts +61 -0
  84. package/src/lib/enum/drag-item.enum.ts +5 -0
  85. package/src/lib/enum/field-type.enum.ts +36 -0
  86. package/src/lib/enum/legend-type.enum.ts +5 -0
  87. package/src/lib/enum/modals.enum.ts +6 -0
  88. package/src/lib/enum/ui-type.enum.ts +11 -0
  89. package/src/lib/models/ui/custom-list.model.ts +14 -0
  90. package/src/lib/models/ui/legend.model.ts +17 -0
  91. package/src/lib/models/ui/table.model.ts +33 -0
  92. package/src/lib/services/ui/modals.service.ts +47 -0
  93. package/src/lib/services/version.service.ts +22 -0
  94. package/src/public-api.ts +49 -0
  95. package/tsconfig.lib.json +18 -0
  96. package/tsconfig.lib.prod.json +11 -0
  97. package/tsconfig.spec.json +14 -0
  98. package/tslint.json +17 -0
  99. package/cityway-bo-ui-1.0.0.tgz +0 -0
  100. package/fesm2022/cityway-bo-ui.mjs +0 -1598
  101. package/fesm2022/cityway-bo-ui.mjs.map +0 -1
  102. package/index.d.ts +0 -509
  103. package/styles.min.css +0 -5
  104. package/styles.min.css.map +0 -1
  105. /package/{lib → src/lib}/assets/fonts/bo/_variables.scss +0 -0
  106. /package/{lib → src/lib}/assets/fonts/bo/bo.scss +0 -0
  107. /package/{lib → src/lib}/assets/fonts/bo/bo.woff +0 -0
  108. /package/{lib → src/lib}/assets/fonts/bo/bo.woff2 +0 -0
  109. /package/{lib → src/lib}/assets/fonts/nunito/_nunito.scss +0 -0
  110. /package/{lib → src/lib}/assets/fonts/nunito/nunito-bold.woff +0 -0
  111. /package/{lib → src/lib}/assets/fonts/nunito/nunito-bold.woff2 +0 -0
  112. /package/{lib → src/lib}/assets/fonts/nunito/nunito-extrabold.woff +0 -0
  113. /package/{lib → src/lib}/assets/fonts/nunito/nunito-extrabold.woff2 +0 -0
  114. /package/{lib → src/lib}/assets/fonts/nunito/nunito-regular.woff +0 -0
  115. /package/{lib → src/lib}/assets/fonts/nunito/nunito-regular.woff2 +0 -0
  116. /package/{lib → src/lib}/assets/fonts/nunito/nunito-semi-bold.woff +0 -0
  117. /package/{lib → src/lib}/assets/fonts/nunito/nunito-semi-bold.woff2 +0 -0
  118. /package/{lib → src/lib}/assets/fonts/optyweb/_variables.scss +0 -0
  119. /package/{lib → src/lib}/assets/fonts/optyweb/optyweb.scss +0 -0
  120. /package/{lib → src/lib}/assets/fonts/optyweb/optyweb.woff +0 -0
  121. /package/{lib → src/lib}/assets/fonts/optyweb/optyweb.woff2 +0 -0
  122. /package/{lib → src/lib}/assets/i18n/common.en.json +0 -0
  123. /package/{lib → src/lib}/assets/i18n/common.fr.json +0 -0
  124. /package/{lib → src/lib}/assets/i18n/label.en.json +0 -0
  125. /package/{lib → src/lib}/assets/i18n/label.fr.json +0 -0
  126. /package/{lib → src/lib}/assets/images/common/bg-loader.svg +0 -0
  127. /package/{lib → src/lib}/assets/images/common/bg-menu.svg +0 -0
  128. /package/{lib → src/lib}/assets/images/common/bg-round.svg +0 -0
  129. /package/{lib → src/lib}/assets/images/common/check-mark.svg +0 -0
  130. /package/{lib → src/lib}/assets/images/common/loader.svg +0 -0
  131. /package/{lib → src/lib}/assets/images/common/logo-en-bw.svg +0 -0
  132. /package/{lib → src/lib}/assets/images/common/logo-en.svg +0 -0
  133. /package/{lib → src/lib}/assets/images/common/logo-fr-bw.svg +0 -0
  134. /package/{lib → src/lib}/assets/images/common/logo-fr.svg +0 -0
  135. /package/{lib → src/lib}/assets/images/favicon/android-chrome-192x192.png +0 -0
  136. /package/{lib → src/lib}/assets/images/favicon/android-chrome-512x512.png +0 -0
  137. /package/{lib → src/lib}/assets/images/favicon/apple-touch-icon.png +0 -0
  138. /package/{lib → src/lib}/assets/images/favicon/favicon-16x16.png +0 -0
  139. /package/{lib → src/lib}/assets/images/favicon/favicon-32x32.png +0 -0
  140. /package/{lib → src/lib}/assets/images/favicon/favicon-96x96.png +0 -0
  141. /package/{lib → src/lib}/assets/images/favicon/favicon.ico +0 -0
  142. /package/{lib → src/lib}/assets/images/favicon/site.webmanifest +0 -0
  143. /package/{lib → src/lib}/assets/images/icon/referential-icon.svg +0 -0
  144. /package/{lib → src/lib}/assets/images/login/login-bg.jpg +0 -0
  145. /package/{lib → src/lib}/assets/images/login/logo-cityway-baseline.svg +0 -0
  146. /package/{lib → src/lib}/assets/images/toast/warning.svg +0 -0
  147. /package/{lib → src/lib}/assets/styles/scss/_components.scss +0 -0
  148. /package/{lib → src/lib}/assets/styles/scss/_core.scss +0 -0
  149. /package/{lib → src/lib}/assets/styles/scss/_custom-bootstrap.scss +0 -0
  150. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_accordion.scss +0 -0
  151. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_alert.scss +0 -0
  152. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_badge.scss +0 -0
  153. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_breadcrumb.scss +0 -0
  154. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_button-group.scss +0 -0
  155. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_buttons.scss +0 -0
  156. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_card.scss +0 -0
  157. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_close.scss +0 -0
  158. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_dropdown.scss +0 -0
  159. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_forms.scss +0 -0
  160. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_input-group.scss +0 -0
  161. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_lists.scss +0 -0
  162. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_modal.scss +0 -0
  163. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_pagination.scss +0 -0
  164. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_popover.scss +0 -0
  165. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_progress.scss +0 -0
  166. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_reboot.scss +0 -0
  167. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_tables.scss +0 -0
  168. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_tabs.scss +0 -0
  169. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_tooltip.scss +0 -0
  170. /package/{lib → src/lib}/assets/styles/scss/bootstrap/_type.scss +0 -0
  171. /package/{lib → src/lib}/assets/styles/scss/components/_forms-firefox.scss +0 -0
  172. /package/{lib → src/lib}/assets/styles/scss/components/_leaflet.scss +0 -0
  173. /package/{lib → src/lib}/assets/styles/scss/components/_legend.scss +0 -0
  174. /package/{lib → src/lib}/assets/styles/scss/components/_ng-select.scss +0 -0
  175. /package/{lib → src/lib}/assets/styles/scss/components/_ng2-dragula.scss +0 -0
  176. /package/{lib → src/lib}/assets/styles/scss/components/_ng2-validation.scss +0 -0
  177. /package/{lib → src/lib}/assets/styles/scss/components/_ng5-slider.scss +0 -0
  178. /package/{lib → src/lib}/assets/styles/scss/components/_ngb-datepicker.scss +0 -0
  179. /package/{lib → src/lib}/assets/styles/scss/components/_ngb-timepicker.scss +0 -0
  180. /package/{lib → src/lib}/assets/styles/scss/components/_ngx-chips.scss +0 -0
  181. /package/{lib → src/lib}/assets/styles/scss/components/_ngx-editor.scss +0 -0
  182. /package/{lib → src/lib}/assets/styles/scss/components/_ngx-file-drop.scss +0 -0
  183. /package/{lib → src/lib}/assets/styles/scss/components/_ngx-intl-tel-input.scss +0 -0
  184. /package/{lib → src/lib}/assets/styles/scss/components/_ngx-slider.scss +0 -0
  185. /package/{lib → src/lib}/assets/styles/scss/components/_ngx-toast.scss +0 -0
  186. /package/{lib → src/lib}/assets/styles/scss/components/_pwd-policy.scss +0 -0
  187. /package/{lib → src/lib}/assets/styles/scss/components/_table.scss +0 -0
  188. /package/{lib → src/lib}/assets/styles/scss/components/_vis.scss +0 -0
  189. /package/{lib → src/lib}/assets/styles/scss/components/_wizard-stepper.scss +0 -0
  190. /package/{lib → src/lib}/assets/styles/scss/components/table/_table-action.scss +0 -0
  191. /package/{lib → src/lib}/assets/styles/scss/components/table/_table-bg-cell.scss +0 -0
  192. /package/{lib → src/lib}/assets/styles/scss/components/table/_table-double-scroll.scss +0 -0
  193. /package/{lib → src/lib}/assets/styles/scss/components/table/_table-filter.scss +0 -0
  194. /package/{lib → src/lib}/assets/styles/scss/components/table/_table-pagination.scss +0 -0
  195. /package/{lib → src/lib}/assets/styles/scss/components/table/_table-popover.scss +0 -0
  196. /package/{lib → src/lib}/assets/styles/scss/components/table/_table-sorting.scss +0 -0
  197. /package/{lib → src/lib}/assets/styles/scss/core/_footer.scss +0 -0
  198. /package/{lib → src/lib}/assets/styles/scss/core/_header.scss +0 -0
  199. /package/{lib → src/lib}/assets/styles/scss/core/_layout.scss +0 -0
  200. /package/{lib → src/lib}/assets/styles/scss/core/_menu.scss +0 -0
  201. /package/{lib → src/lib}/assets/styles/scss/core/_sidebar.scss +0 -0
  202. /package/{lib → src/lib}/assets/styles/scss/mixins/_utilities.scss +0 -0
  203. /package/{lib → src/lib}/assets/styles/scss/styles.scss +0 -0
  204. /package/{lib → src/lib}/assets/styles/scss/tools/_focus.scss +0 -0
  205. /package/{lib → src/lib}/assets/styles/scss/tools/_loader.scss +0 -0
  206. /package/{lib → src/lib}/assets/styles/scss/variables/_colors.scss +0 -0
  207. /package/{lib → src/lib}/assets/styles/scss/variables/_custom.scss +0 -0
  208. /package/{lib → src/lib}/assets/styles/scss/variables/_site.scss +0 -0
@@ -0,0 +1,71 @@
1
+ <header role="banner" class="header">
2
+ <form [formGroup]="formHeader">
3
+ <nav class="navbar custom-navbar bg-faded main-header">
4
+ <button type="button" class="btn btn-primary menu-link" (click)="onClick()"
5
+ [title]="isMenuOpened ? ('_COMMON._MENU.BTN_MAIN_MENU_CLOSE' | translate) : ('_COMMON._MENU.BTN_MAIN_MENU_OPEN' | translate)">
6
+ <span class="bo-icons" [ngClass]="isMenuOpened ? 'bo-menu-expanded' : 'bo-menu-collapsed' "
7
+ aria-hidden="true"></span>
8
+ <span class="visually-hidden">{{ '_COMMON._MENU.BTN_MAIN_MENU' | translate}}</span>
9
+ </button>
10
+
11
+ <nav aria-label="breadcrumb">
12
+ <ol class="breadcrumb align-items-center">
13
+ <li class="breadcrumb-item">
14
+ <a href="/#">
15
+ <span class="optyweb cw-nav-home d-block d-md-none" aria-hidden="true"></span>
16
+ <span class="visually-hidden d-block d-md-none">{{ "_COMMON._BREADCRUMB.HOME" | translate }}</span>
17
+ <span class="d-none d-md-block">{{ "_COMMON._BREADCRUMB.HOME" | translate }}</span>
18
+ </a>
19
+ </li>
20
+ <li *ngFor="let item of getMenus(parent)" class="breadcrumb-item active">
21
+ <a *ngIf="!item.disabled" [routerLink]="item.link" href="#">{{item.title | translate}}</a>
22
+ <span *ngIf="item.disabled">{{item.title | translate}}</span>
23
+ </li>
24
+ <li aria-current="page" class="breadcrumb-item active navbar-heading">
25
+ <h1>{{ heading | translate:headingUrlParamsOptions }}</h1>
26
+ </li>
27
+ </ol>
28
+ </nav>
29
+
30
+ <span class="me-auto"></span>
31
+
32
+ <ul class="navbar-nav">
33
+
34
+ <li class="nav-item ms-0" ngbDropdown placement="right">
35
+ <button class="header-login d-flex align-items-center btn btn-light" id="language"
36
+ ngbDropdownToggle type="button">
37
+ <span class="optyweb cw-misc-man2 header-avatar" aria-hidden="true"></span>
38
+ <span class="header-indicator">
39
+ <span class="bo-icons bo-alert-success" aria-hidden="true"></span>
40
+ <span class="visually-hidden">{{ '_COMMON._USER.LBL_LOGGED' | translate }}</span>
41
+ <!-- <img src="assets/images/common/check-mark.svg" [alt]="'_COMMON._USER.LBL_LOGGED' | translate"
42
+ class="header-indicator" width="15" height="15"> -->
43
+ </span>
44
+ <span class="d-none d-lg-inline-block ms-3 me-1">{{ loginName }}</span>
45
+ </button>
46
+ <div ngbDropdownMenu class="dropdown-menu dropdown-menu-right">
47
+ <div class="dropdown-header font-md d-md-none">
48
+ <span>{{ loginName }}</span>
49
+ </div>
50
+ <a class="dropdown-item" href="javascript:;">
51
+ <span>{{'_COMMON._USER.LBL_SETTINGS' | translate}}</span>
52
+ </a>
53
+ <a class="dropdown-item" href="javascript:;">
54
+ <span>{{'_COMMON._USER.LBL_PROFILE' | translate}}</span>
55
+ </a>
56
+ <a class="dropdown-item" href="javascript:;">
57
+ <span>{{'_COMMON._USER.LBL_NOTIFICATIONS' | translate}}</span>
58
+ </a>
59
+ <div class="dropdown-divider"></div>
60
+ <a class="dropdown-item" href="javascript:;">
61
+ <span>{{'_COMMON._USER.LBL_HELP' | translate}}</span>
62
+ </a>
63
+ <a class="dropdown-item" href="javascript:;">
64
+ <span>{{ '_COMMON._ACTION.SIGN_OUT' | translate }}</span>
65
+ </a>
66
+ </div>
67
+ </li>
68
+ </ul>
69
+ </nav>
70
+ </form>
71
+ </header>
@@ -0,0 +1,95 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';
3
+ import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
4
+ import { RouterModule } from '@angular/router';
5
+ import { JwtHelperService } from '@auth0/angular-jwt';
6
+ import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';
7
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
8
+ import { User } from 'oidc-client';
9
+ import { Parent } from '../admin-layout/admin-layout.component';
10
+
11
+ @Component({
12
+ selector: 'app-header',
13
+ templateUrl: './header.component.html',
14
+ standalone: true,
15
+ imports: [
16
+ ReactiveFormsModule,
17
+ RouterModule,
18
+ CommonModule,
19
+ TranslateModule,
20
+ NgbDropdownModule
21
+ ]
22
+ })
23
+
24
+ export class HeaderComponent implements OnInit, OnChanges {
25
+ @Input() heading: string;
26
+ @Input() headingUrlParamsOptions: Array<string>;
27
+ @Input() parent: any;
28
+ @Input() isMenuOpened: boolean;
29
+ @Output() toggleSidenav = new EventEmitter<void>();
30
+
31
+ public parentTitle: string | Array<string>;
32
+ public parentLink: string | Array<string>;
33
+ public loadMenu: boolean;
34
+ public extractedBy: string;
35
+ public loginName: string;
36
+ public formHeader: UntypedFormGroup;
37
+ public lang: string;
38
+
39
+ private jwtHelper: JwtHelperService;
40
+
41
+ constructor(
42
+ public translateService: TranslateService,
43
+ private fb: UntypedFormBuilder,
44
+ ) {
45
+ this.parent = null;
46
+ this.jwtHelper = new JwtHelperService();
47
+ }
48
+
49
+ ngOnInit() {
50
+ this.formHeader = this.fb.group({
51
+ lang: ['fr', Validators.compose([Validators.required])],
52
+ });
53
+ this.loginName = 'Admin';
54
+ }
55
+
56
+ public changeLang(lang: string) {
57
+ localStorage.setItem('lang', lang);
58
+ this.lang = lang;
59
+ this.translateService.setDefaultLang(lang);
60
+ this.translateService.use(lang);
61
+ }
62
+
63
+ ngOnChanges(simpleChanges: SimpleChanges) {
64
+ // Si il y a un changement et que la variable envoye par le parent a une currentValue
65
+ if (simpleChanges && simpleChanges['parent'] && simpleChanges['parent'].currentValue) {
66
+ // attribution des datas a nos variables pour notre HTML
67
+ this.parentLink = simpleChanges['parent'].currentValue.link;
68
+ this.parentTitle = simpleChanges['parent'].currentValue.title;
69
+ }
70
+
71
+ // Si il y a un changement et que la variable envoye par le parent a une currentValue
72
+ if (simpleChanges && simpleChanges['heading'] && simpleChanges['heading'].currentValue) {
73
+ // Attribution des datas a nos variables pour notre HTML
74
+ this.heading = simpleChanges['heading'].currentValue;
75
+ // Si la variable du parent (parent) n'as pas change
76
+ if (!simpleChanges['heading']) {
77
+ // alors on la supprime pour le cote HTML
78
+ delete this.parent;
79
+ }
80
+ }
81
+ }
82
+
83
+ /** Renvoie un tableau de menus */
84
+ getMenus(parent: Parent | Array<Parent>) {
85
+ if (parent === null || parent === undefined) {
86
+ return new Array();
87
+ }
88
+ // Soit 1 element , soit 1 tableau en entée
89
+ return parent instanceof Array ? parent : new Array(parent);
90
+ }
91
+
92
+ public onClick() {
93
+ this.toggleSidenav.emit()
94
+ }
95
+ }
@@ -0,0 +1,115 @@
1
+ <!-- <ul class="navigation" appAccordion>
2
+ <ng-container *ngFor="let menuitem of menus; index as Index">
3
+ <ng-container *ngIf="!menuitem.hide">
4
+ <li *ngIf="menuitem.type !== 'divider' && menuitem.type !== 'title'" appAccordionLink [group]="menuitem.state"
5
+ [ngClass]="menuitem.state.includes(currentRoute) ? 'navigation-item menu-opened' : 'navigation-item'" routerLinkActive="active"> -->
6
+ <!-- INTERNAL LINK -->
7
+ <!-- <a *ngIf="menuitem.type === 'link' && isOpened" [ngClass]="{'disabled': menuitem.disabled}" class="navigation-link"
8
+ [routerLink]="menuitem.state">
9
+ <ng-container [ngTemplateOutlet]="menuItem"></ng-container>
10
+ </a>
11
+ <a *ngIf="menuitem.type === 'link' && !isOpened" [ngClass]="{'disabled': menuitem.disabled}" class="navigation-link"
12
+ [routerLink]="menuitem.state" placement="right" [ngbTooltip]="menuitem.name | translate" container="body"
13
+ tooltipClass="menu-tooltip">
14
+ <ng-container [ngTemplateOutlet]="menuItem"></ng-container>
15
+ </a> -->
16
+ <!-- EXTERNAL LINK ou EXTERNAL LINK IN A TAB-->
17
+ <!-- <a *ngIf="menuitem.type === 'extLink' || menuitem.type === 'extTabLink' && isOpened" class="navigation-link"
18
+ [href]="menuitem.state" [attr.target]="menuitem.type === 'extTabLink' ? '_blanck' : null">
19
+ <ng-container [ngTemplateOutlet]="menuItem"></ng-container>
20
+ </a>
21
+ <a *ngIf="menuitem.type === 'extLink' || menuitem.type === 'extTabLink' && !isOpened" class="navigation-link"
22
+ [href]="menuitem.state" [attr.target]="menuitem.type === 'extTabLink' ? '_blanck' : null"
23
+ placement="right" [ngbTooltip]="menuitem.name | translate" container="body"
24
+ tooltipClass="menu-tooltip">
25
+ <ng-container [ngTemplateOutlet]="menuItem"></ng-container>
26
+ </a> -->
27
+
28
+ <!--
29
+ <ng-template #menuItem>
30
+ <span class="{{ menuitem.icon }} me-3 icon" aria-hidden="true"></span>
31
+ <span class="title me-auto">{{ menuitem.name | translate }}</span>
32
+ <span *ngFor="let badge of menuitem.badge" class="badge badge-{{ badge.type }} me-3">{{ badge.value }}</span>
33
+ </ng-template>
34
+
35
+ <ng-container *ngIf="isOpened">
36
+ <button *ngIf="menuitem.type === 'sub' || menuitem.type === 'sub-reorder'" type="button" class="navigation-link btn navigation-btn"
37
+ (click)="onShow(Index)" [ngClass]="isCollapsed[Index] ? 'collapsed' : ''"
38
+ [attr.aria-expanded]="!isCollapsed[Index]" aria-controls="collapseExample">
39
+ <ng-container [ngTemplateOutlet]="menuItem"></ng-container>
40
+ <span class="menu-caret optyweb cw-nav-collapse2" aria-hidden="true"></span>
41
+ </button>
42
+ <ul *ngIf="menuitem.type === 'sub'" class="navigation-submenu" [ngbCollapse]
43
+ [(ngbCollapse)]="isCollapsed[Index]">
44
+ <ng-container *ngFor="let childitem of menuitem.children">
45
+ <li *ngIf="!childitem.hide" class="navigation-item" routerLinkActive="active"
46
+ [ngClass]="{disabled: childitem.disabled}">
47
+ <a [routerLink]="['/', menuitem.state, childitem.state ]" class="navigation-submenu-link">
48
+ {{ childitem.name | translate }}
49
+ </a>
50
+ </li>
51
+ </ng-container>
52
+ </ul>
53
+ <ul *ngIf="menuitem.type === 'sub-reorder'" class="navigation-submenu" [ngbCollapse]
54
+ [(ngbCollapse)]="isCollapsed[Index]">
55
+ <ng-container *ngFor="let childitem of menuitem.children">
56
+ <li *ngIf="!childitem.hide" class="navigation-item" routerLinkActive="active"
57
+ [ngClass]="{disabled: childitem.disabled}">
58
+ <a [routerLink]="childitem.state" class="navigation-submenu-link">
59
+ {{ childitem.name | translate }}
60
+ </a>
61
+ </li>
62
+ </ng-container>
63
+ </ul>
64
+ </ng-container>
65
+ </li>
66
+
67
+ <ng-container *ngIf="!isOpened">
68
+ <li ngbDropdown *ngIf="menuitem.type !== 'divider' && menuitem.type !== 'title'" appAccordionLink
69
+ [group]="menuitem.state" class="navigation-dropdown" [autoClose]="true"
70
+ [container]="'body'" [dropdownClass]="'navigation-submenu-dropdown'" routerLinkActive="active" #myDrop="ngbDropdown"
71
+ (mouseenter)="$event.stopPropagation(); myDrop.open();" (mouseleave)="$event.stopPropagation(); myDrop.close();">
72
+ <button *ngIf="menuitem.type === 'sub' || menuitem.type === 'sub-reorder'" type="button" class="navigation-link btn navigation-btn"
73
+ id="dropdownBasic1" ngbDropdownToggle (click)="onShow(Index)">
74
+ <span class="{{ menuitem.icon }} me-3 icon" aria-hidden="true"></span>
75
+ <span class="title me-auto">{{ menuitem.name | translate }}</span>
76
+ <span *ngFor="let badge of menuitem.badge" class="badge badge-{{ badge.type }} me-3">{{ badge.value
77
+ }}</span>
78
+ <span class="menu-caret optyweb cw-nav-expand2" aria-hidden="true"></span>
79
+ </button>
80
+ <ul ngbDropdownMenu *ngIf="menuitem.type === 'sub'" class="navigation-submenu"
81
+ [ngClass]="'navigation-submenu-collapsed'"
82
+ (mouseenter)="$event.stopPropagation(); myDrop.open();" (mouseleave)="$event.stopPropagation(); myDrop.close();">
83
+ <ng-container *ngFor="let childitem of menuitem.children">
84
+ <li *ngIf="!childitem.hide" class="navigation-item" routerLinkActive="active"
85
+ [ngClass]="{disabled: childitem.disabled}">
86
+ <a [routerLink]="['/', menuitem.state, childitem.state ]" class="navigation-submenu-link" ngbDropdownItem>
87
+ {{ childitem.name | translate }}
88
+ </a>
89
+ </li>
90
+ </ng-container>
91
+ </ul>
92
+ <ul ngbDropdownMenu *ngIf="menuitem.type === 'sub-reorder'" class="navigation-submenu"
93
+ [ngClass]="'navigation-submenu-collapsed'"
94
+ (mouseenter)="$event.stopPropagation(); myDrop.open();" (mouseleave)="$event.stopPropagation(); myDrop.close();">
95
+ <ng-container *ngFor="let childitem of menuitem.children">
96
+ <li *ngIf="!childitem.hide" class="navigation-item" routerLinkActive="active"
97
+ [ngClass]="{disabled: childitem.disabled}">
98
+ <a [routerLink]="childitem.state" class="navigation-submenu-link" ngbDropdownItem>
99
+ {{ childitem.name | translate }}
100
+ </a>
101
+ </li>
102
+ </ng-container>
103
+ </ul>
104
+ </li>
105
+ </ng-container>
106
+
107
+ <li *ngIf="menuitem.type === 'divider'" class="navigation-item">
108
+ <hr />
109
+ </li>
110
+ <li *ngIf="menuitem.type === 'title'" class="navigation-item">
111
+ <span class="navigation-title">{{ menuitem.name | translate }}</span>
112
+ </li>
113
+ </ng-container>
114
+ </ng-container>
115
+ </ul> -->
@@ -0,0 +1,75 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, Input } from '@angular/core';
3
+ import { Router, RouterModule } from '@angular/router';
4
+ import { NgbCollapseModule, NgbDropdownModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
5
+ import { TranslateModule, TranslateService } from '@ngx-translate/core';
6
+ import { NgxPermissionsService } from 'ngx-permissions';
7
+ import { AccordionDirective, AccordionLinkDirective } from '../menu-accordion';
8
+
9
+ @Component({
10
+ selector: 'app-menu',
11
+ templateUrl: './menu.component.html',
12
+ standalone: true,
13
+ imports: [
14
+ CommonModule,
15
+ RouterModule,
16
+ NgbTooltipModule,
17
+ NgbCollapseModule,
18
+ NgbDropdownModule,
19
+ AccordionLinkDirective,
20
+ TranslateModule,
21
+ AccordionLinkDirective,
22
+ AccordionDirective
23
+ ]
24
+ })
25
+ export class MenuComponent {
26
+
27
+ // @Input() isOpened = true;
28
+
29
+ // public menus: MenuItem[];
30
+ // public currentRoute: string;
31
+ // public isCollapsed: boolean [] = [];
32
+
33
+ // constructor(
34
+ // public menuService: MenuService,
35
+ // public translate: TranslateService,
36
+ // private permissionStoreService: NgxPermissionsService,
37
+ // private router: Router
38
+ // ) {
39
+
40
+ // this.menus = this.menuService.getAll();
41
+ // this.menuService.menu$.subscribe({ next: menu => this.menus = menu });
42
+
43
+ // this.currentRoute = this.router.url.split('/')[1];
44
+ // // check for permissions
45
+ // this.menus.forEach(menu => {
46
+ // if(this.currentRoute && menu.state.includes(this.currentRoute)) {
47
+ // this.isCollapsed.push(false);
48
+ // } else {
49
+ // this.isCollapsed.push(true);
50
+ // }
51
+ // if (menu.permissions) {
52
+ // this.permissionStoreService.hasPermission(menu.permissions).then(hasPermission => menu.hide = !hasPermission);
53
+ // }
54
+ // if (menu.children) {
55
+ // menu.children.forEach(childMenu => {
56
+ // if (childMenu.permissions) {
57
+ // this.permissionStoreService.hasPermission(childMenu.permissions).then(r => childMenu.hide = !r);
58
+ // }
59
+ // });
60
+ // }
61
+ // });
62
+ // router.events.subscribe(() => this.currentRoute = null);
63
+ // }
64
+
65
+
66
+ // public onShow(index): void {
67
+ // this.menus.forEach((menu, indexMenu) => {
68
+ // if (indexMenu !== index) {
69
+ // this.isCollapsed[indexMenu] = true;
70
+ // }
71
+ // });
72
+ // this.isCollapsed[index] = !this.isCollapsed[index];
73
+ // }
74
+
75
+ }
@@ -0,0 +1,57 @@
1
+
2
+ import { filter } from 'rxjs/operators';
3
+ import { AfterContentChecked, AfterViewInit, Directive, OnInit } from '@angular/core';
4
+ import { NavigationEnd, Router } from '@angular/router';
5
+
6
+
7
+ import { AccordionLinkDirective } from './accordionlink.directive';
8
+
9
+ @Directive({
10
+ selector: '[appAccordion]',
11
+ standalone: true
12
+ })
13
+ export class AccordionDirective implements AfterContentChecked {
14
+
15
+ protected navlinks: AccordionLinkDirective[] = [];
16
+
17
+ constructor(private router: Router) {
18
+ setTimeout(() => this.checkOpenLinks());
19
+ }
20
+
21
+ ngAfterContentChecked(): void {
22
+ this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe((e) => this.checkOpenLinks());
23
+ }
24
+
25
+ closeOtherLinks(openLink: AccordionLinkDirective): void {
26
+ this.navlinks.forEach((link: AccordionLinkDirective) => {
27
+ if (link !== openLink) {
28
+ link.open = false;
29
+ }
30
+ });
31
+ }
32
+
33
+ addLink(link: AccordionLinkDirective): void {
34
+ this.navlinks.push(link);
35
+ }
36
+
37
+ removeGroup(link: AccordionLinkDirective): void {
38
+ const index = this.navlinks.indexOf(link);
39
+ if (index !== -1) {
40
+ this.navlinks.splice(index, 1);
41
+ }
42
+ }
43
+
44
+ checkOpenLinks() {
45
+ this.navlinks.forEach((link: AccordionLinkDirective) => {
46
+ if (link.group) {
47
+ const routeUrl = this.router.url;
48
+ const currentUrl = routeUrl.split('/');
49
+ if (currentUrl.indexOf(link.group) > 0) {
50
+ link.open = true;
51
+ this.closeOtherLinks(link);
52
+ }
53
+ }
54
+ });
55
+ }
56
+
57
+ }
@@ -0,0 +1,21 @@
1
+ import { Directive, HostListener, Inject } from '@angular/core';
2
+
3
+ import { AccordionLinkDirective } from './accordionlink.directive';
4
+
5
+ @Directive({
6
+ selector: '[appAccordionToggle]',
7
+ standalone: true
8
+ })
9
+ export class AccordionAnchorDirective {
10
+
11
+ protected navlink: AccordionLinkDirective;
12
+
13
+ constructor( @Inject(AccordionLinkDirective) navlink: AccordionLinkDirective) {
14
+ this.navlink = navlink;
15
+ }
16
+
17
+ @HostListener('click', ['$event'])
18
+ onClick(e: any) {
19
+ this.navlink.toggle();
20
+ }
21
+ }
@@ -0,0 +1,45 @@
1
+ import { Directive, HostBinding, Inject, Input, OnDestroy, OnInit } from '@angular/core';
2
+ import { AccordionDirective } from './accordion.directive';
3
+
4
+
5
+ @Directive({
6
+ selector: '[appAccordionLink]',
7
+ standalone: true
8
+ })
9
+ export class AccordionLinkDirective implements OnInit, OnDestroy {
10
+
11
+ @Input() public group: any;
12
+
13
+ @HostBinding('class.open')
14
+
15
+ protected _open: boolean;
16
+ protected nav: AccordionDirective;
17
+
18
+ constructor(@Inject(AccordionDirective) nav: AccordionDirective) {
19
+ this.nav = nav;
20
+ }
21
+
22
+ @Input()
23
+ get open(): boolean {
24
+ return this._open;
25
+ }
26
+
27
+ set open(value: boolean) {
28
+ this._open = value;
29
+ if (value) {
30
+ this.nav.closeOtherLinks(this);
31
+ }
32
+ }
33
+
34
+ ngOnInit(): any {
35
+ this.nav.addLink(this);
36
+ }
37
+
38
+ ngOnDestroy(): any {
39
+ this.nav.removeGroup(this);
40
+ }
41
+
42
+ toggle(): any {
43
+ this.open = !this.open;
44
+ }
45
+ }
@@ -0,0 +1,3 @@
1
+ export * from './accordionanchor.directive';
2
+ export * from './accordionlink.directive';
3
+ export * from './accordion.directive';
@@ -0,0 +1,62 @@
1
+ <div class="sidebar-scroll">
2
+ <div class="sidebar">
3
+ <nav class="navbar custom-navbar main-brand justify-content-center text-center">
4
+ <a class="navbar-brand text-decoration-none" [routerLink]="['/']" [ngClass]="{'invisible': !isOpened}">
5
+ <div class="navbar-brand-name text-wrap">
6
+ <!-- {{ configuration.appSettings.name }} -->
7
+ </div>
8
+ <div class="navbar-brand-project">
9
+ <!-- {{ configuration.appSettings.clientName }} -->
10
+ </div>
11
+ </a>
12
+ <button type="button" class="btn btn-primary btn-close-menu d-lg-none" (click)="onClick()">
13
+ <span class="optyweb cw-toolbar-close1" aria-hidden="true"></span>
14
+ <span class="visually-hidden">{{ '_COMMON._SIDEBAR.CLOSE_BTN' | translate }}</span>
15
+ </button>
16
+ </nav>
17
+
18
+ <!-- main navigation -->
19
+ <!-- <nav *ngIf="menuService.menu$ | async" class="main-menu">
20
+ <app-menu [isOpened]="isOpened"></app-menu>
21
+ </nav> -->
22
+
23
+ <nav class="navbar custom-navbar sidebar-footer bg-white" [ngClass]="{'sidebar-footer-closed': !isOpened}">
24
+ <ul class="navbar-nav w-100">
25
+ <!-- <li class="nav-item">
26
+ <a class="btn nav-link d-flex" href="assets/docs/fr/manuel.pdf" container="body" type="button"
27
+ [ngbTooltip]="'_COMMON._USER.LBL_USER_MANUAL' | translate" [placement]="isOpened ? 'top' : 'right'">
28
+ <span class="bo-icons bo-manual" aria-hidden="true"></span>
29
+ <span class="visually-hidden">{{ '_COMMON._USER.LBL_USER_MANUAL' | translate }}</span>
30
+ </a>
31
+ </li>
32
+ <ng-container *ngIf="authService.isLoggedIn()">
33
+ <li class="nav-item">
34
+ <button (click)="authService.logout()" class="btn nav-link d-flex" container="body" type="button"
35
+ [ngbTooltip]="'_COMMON._APPLICATION.LOGOUT' | translate" [placement]="isOpened ? 'top' : 'right'">
36
+ <span class="optyweb cw-nav-connexion" aria-hidden="true"></span>
37
+ <span class="visually-hidden">{{ '_COMMON._APPLICATION.LOGOUT' | translate }}</span>
38
+ </button>
39
+ </li>
40
+ </ng-container>
41
+ <ng-container *ngIf="!authService.isLoggedIn()">
42
+ <li class="nav-item">
43
+ <button (click)="authService.startAuthentication()" class="btn nav-link d-flex" container="body"
44
+ type="button" [ngbTooltip]="'_COMMON._APPLICATION.LOGIN' | translate"
45
+ [placement]="isOpened ? 'top' : 'right'">
46
+ <span class="optyweb cw-nav-connexion" aria-hidden="true"></span>
47
+ <span class="visually-hidden">{{ '_COMMON._APPLICATION.LOGIN' | translate }}</span>
48
+ </button>
49
+ </li>
50
+ </ng-container>
51
+ <li class="nav-item docked-hidden">
52
+ <a [href]="configuration.authentication.portalSettings.urlApplications" class="nav-link d-flex"
53
+ container="body" [ngbTooltip]="'_COMMON._APPLICATION.CHANGE' | translate"
54
+ [placement]="isOpened ? 'top' : 'right'">
55
+ <span class="bo-icons bo-change-app" aria-hidden="true"></span>
56
+ <span class="visually-hidden">{{ '_COMMON._APPLICATION.CHANGE' | translate }}</span>
57
+ </a>
58
+ </li> -->
59
+ </ul>
60
+ </nav>
61
+ </div>
62
+ </div>
@@ -0,0 +1,28 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
3
+ import { TranslateModule } from '@ngx-translate/core';
4
+ import { MenuComponent } from '../menu/menu.component';
5
+ import { CommonModule } from '@angular/common';
6
+ import { RouterModule } from '@angular/router';
7
+
8
+ @Component({
9
+ selector: 'app-sidebar',
10
+ templateUrl: './sidebar.component.html',
11
+ standalone: true,
12
+ imports: [
13
+ TranslateModule,
14
+ MenuComponent,
15
+ NgbTooltipModule,
16
+ CommonModule,
17
+ RouterModule
18
+ ]
19
+ })
20
+ export class SidebarComponent {
21
+
22
+ @Output() toggleSidenav = new EventEmitter<void>();
23
+ @Input() isOpened: boolean;
24
+
25
+ public onClick() {
26
+ this.toggleSidenav.emit()
27
+ }
28
+ }
@@ -0,0 +1,3 @@
1
+ <div class="skip-links">
2
+ <a href="#content">{{ '_COMMON._SKIP_LINKS.CONTENT' | translate }}</a>
3
+ </div>
@@ -0,0 +1,25 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { SkipLinksComponent } from './skip-links.component';
4
+
5
+ describe('SkipLinksComponent', () => {
6
+ let component: SkipLinksComponent;
7
+ let fixture: ComponentFixture<SkipLinksComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ SkipLinksComponent ]
12
+ })
13
+ .compileComponents();
14
+ });
15
+
16
+ beforeEach(() => {
17
+ fixture = TestBed.createComponent(SkipLinksComponent);
18
+ component = fixture.componentInstance;
19
+ fixture.detectChanges();
20
+ });
21
+
22
+ it('should create', () => {
23
+ expect(component).toBeTruthy();
24
+ });
25
+ });
@@ -0,0 +1,19 @@
1
+ import { Component, OnInit } from '@angular/core';
2
+ import { TranslateModule } from '@ngx-translate/core';
3
+
4
+ @Component({
5
+ selector: 'app-skip-links',
6
+ templateUrl: './skip-links.component.html',
7
+ standalone: true,
8
+ imports: [
9
+ TranslateModule
10
+ ]
11
+ })
12
+ export class SkipLinksComponent implements OnInit {
13
+
14
+ constructor() { }
15
+
16
+ ngOnInit(): void {
17
+ }
18
+
19
+ }
@@ -0,0 +1,10 @@
1
+ <div class="bg-white border-bottom px-3 py-3">
2
+ <h1>{{heading}}</h1>
3
+ <nav aria-label="breadcrumb">
4
+ <ol class="breadcrumb">
5
+ <li class="breadcrumb-item"><a href="#">{{ 'GENERIC.HOME' | translate}}</a></li>
6
+ <li class="breadcrumb-item">{{ 'GENERIC.HOME' | translate}}</li>
7
+ <li class="breadcrumb-item active" aria-current="page">{{ heading | uppercase | translate }}</li>
8
+ </ol>
9
+ </nav>
10
+ </div>