@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,38 @@
1
+ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
2
+ import { AbstractControl } from '@angular/forms';
3
+ import { TranslateModule } from '@ngx-translate/core';
4
+ import { FormFieldComponent } from '../../../form-field/form-field.component';
5
+ import { TableColumn } from '../../../../models/ui/table.model';
6
+ import { CommonModule } from '@angular/common';
7
+ import { FormFieldTypeEnum } from '../../../../enum/field-type.enum';
8
+
9
+ @Component({
10
+ selector: 'app-filter',
11
+ templateUrl: './filter.component.html',
12
+ standalone: true,
13
+ imports: [
14
+ TranslateModule,
15
+ FormFieldComponent,
16
+ CommonModule
17
+ ]
18
+ })
19
+ export class FilterComponent implements OnInit {
20
+
21
+ @Input() column: TableColumn;
22
+ @Input() control!: AbstractControl;
23
+ @Input() cssClass?: string;
24
+
25
+ @Output() clearFilter = new EventEmitter<string>();
26
+
27
+ public typeField = FormFieldTypeEnum;
28
+
29
+ constructor() { }
30
+
31
+ ngOnInit(): void {
32
+ }
33
+
34
+ public onClearFilter() {
35
+ this.clearFilter.emit();
36
+ }
37
+
38
+ }
@@ -0,0 +1,104 @@
1
+ <!-- <app-actions-on-table [actionOnTable]="actionOnTable" (actionClick)="onActionClick($event)"
2
+ [customContent]="customActionsTemplate"></app-actions-on-table> -->
3
+
4
+ <!-- <div *ngIf="checkbox" class="actions-on-table on-selection">
5
+ <div class="on-selection-info"> -->
6
+ <!-- If one selected item on the current page -->
7
+ <!-- <span class="fw-bold">1</span>
8
+ {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEM_CURRENT_PAGE' | translate }} -->
9
+
10
+ <!-- If one selected item on all pages -->
11
+ <!-- <span class="fw-bold">1</span>
12
+ {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEM_ALL_PAGES' | translate }}
13
+ <span class="fw-bold">{{total}}</span> -->
14
+
15
+ <!-- If several selected items on the current page -->
16
+ <!-- <span class="fw-bold">{{number}}</span>
17
+ {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_CURRENT_PAGE' | translate }} -->
18
+
19
+ <!-- If several selected items on all pages -->
20
+ <!-- <span class="fw-bold">{{number}}</span>
21
+ {{ '_COMMON._TABLE._BULK_ACTION.SELECTED_ITEMS_ALL_PAGES' | translate }}
22
+ <span class="fw-bold">{{total}}</span> -->
23
+ <!-- </div>
24
+
25
+ <button class="btn btn-secondary btn-min-width" type="button">
26
+ {{ '_COMMON._TABLE._BULK_ACTION.EXPORT_SELECTION' | translate }}
27
+ </button>
28
+ <button class="btn btn-danger btn-min-width" type="button">
29
+ {{ '_COMMON._TABLE._BULK_ACTION.DELETE_SELECTION' | translate }}
30
+ </button>
31
+ </div>
32
+
33
+ <div class="table-responsive table-responsive-full-width mb-3" appDoubleScroll>
34
+ <table class="table table-bordered table-striped table-hover table-full-width">
35
+ <caption class="visually-hidden" [innerHTML]="'_COMMON._TABLE.CAPTION' | translate: { label: title } "></caption>
36
+ <thead>
37
+ <tr>
38
+ <th *ngIf="checkbox" scope="col" width="10">
39
+ <div class="form-check">
40
+ <input class="form-check-input" type="checkbox" id="checkme">
41
+ <label class="form-label" class="form-check-label" for="checkme">
42
+ <span class="visually-hidden">{{ '_COMMON._TABLE._THEAD.CHECK_LINE' | translate }}</span>
43
+ </label>
44
+ </div>
45
+ </th>
46
+ <ng-container *ngFor="let column of columns">
47
+ <th scope="col" [ngClass]="{'p-0': column.sort}">
48
+ <button *ngIf="column.sort" class="sorting-btn"
49
+ [ngClass]="getSortIcon(column.key)"
50
+ (click)="setSortProperty(column.key)">
51
+ {{column.label}}
52
+ <span class="sorting-icons">
53
+ <span class="bo-icons bo-sort"></span>
54
+ </span>
55
+ </button>
56
+ <ng-container *ngIf="!column.sort">
57
+ {{ column.label }}
58
+ </ng-container>
59
+ </th>
60
+ </ng-container>
61
+ </tr>
62
+ <tr *ngIf="filterForm" [formGroup]="filterForm" class="table-filter">
63
+ <th *ngIf="checkbox"></th>
64
+ <ng-container *ngFor="let column of columns">
65
+ <th>
66
+ <app-form-field *ngIf="column.filter" [type]="column.filter?.type" [name]="column.key" [control]="filterForm.get(column.key)"
67
+ [options]="column.filter?.options" [inTableFilter]="true" [cssClass]="filterForm.get(column.key).value ? 'has-value' : ''"
68
+ [placeholder]="'_COMMON._ACTION.FILTER_BY' | translate"
69
+ (clearFieldFilter)="filterForm.get(column.key).setValue('')"></app-form-field>
70
+ </th>
71
+ </ng-container>
72
+ </tr>
73
+ </thead>
74
+ <tbody>
75
+ <tr>
76
+ <td colspan="100"> -->
77
+ <!-- <app-loader></app-loader> -->
78
+ <!-- </td>
79
+ </tr>
80
+ <ng-container> -->
81
+ <!-- <tr *ngIf="paginedResult && paginedResult.result?.length <= 0">
82
+ <td class="table-info no-result" colspan="100">
83
+ {{ '_COMMON._TABLE.NO_RESULT' | translate }}
84
+ </td>
85
+ </tr> -->
86
+ <!-- </ng-container>
87
+ </tbody>
88
+
89
+ @if (legend) {
90
+ <tfoot>
91
+ <tr>
92
+ <td class="table-legend" colspan="100">
93
+ <app-legend [legend]="legend"></app-legend>
94
+ </td>
95
+ </tr>
96
+ </tfoot>
97
+ }
98
+ </table>
99
+ </div> -->
100
+
101
+ <!-- <cw-xpagination *ngIf="paginedResult && paginedResult?.pagination.PageCount >= 0"
102
+ [pagination]="paginedResult?.pagination" [pagesToShow]="pageToShow" (goPage)="goToPage($event)" (goNext)="onNext()"
103
+ (goPrev)="onPrev()" (nbResultChange)="onNbResultChange($event)">
104
+ </cw-xpagination> -->
@@ -0,0 +1,24 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { TableComponent } from './table.component';
3
+
4
+ describe('TableComponent', () => {
5
+ let component: TableComponent;
6
+ let fixture: ComponentFixture<TableComponent>;
7
+
8
+ beforeEach(async () => {
9
+ await TestBed.configureTestingModule({
10
+ declarations: [ TableComponent ]
11
+ })
12
+ .compileComponents();
13
+ });
14
+
15
+ beforeEach(() => {
16
+ fixture = TestBed.createComponent(TableComponent);
17
+ component = fixture.componentInstance;
18
+ fixture.detectChanges();
19
+ });
20
+
21
+ it('should create', () => {
22
+ expect(component).toBeTruthy();
23
+ });
24
+ });
@@ -0,0 +1,85 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, ContentChild, EventEmitter, Input, OnInit, Output, TemplateRef } from '@angular/core';
3
+ import { FormGroup, FormsModule, ReactiveFormsModule, UntypedFormBuilder } from '@angular/forms';
4
+ import { TranslateModule } from '@ngx-translate/core';
5
+ import { DoubleScrollDirective } from '../../directives/double-scroll';
6
+ // import { PaginedComponent } from '../../../extensions/pagined-component.extends';
7
+ // import { PaginationInfo } from '../../../models/pagination/pagination-info';
8
+ // import { ActiveFilter, ListFilter } from '../../models/table/IFilter';
9
+ // import { SortType } from '../../../models/table/sort-type';
10
+ import { Legend } from '../../models/ui/legend.model';
11
+ import { ActionOnTable, ActionOnTableType, TableColumn } from '../../models/ui/table.model';
12
+ // import { XpaginationComponent } from '../../xpagination/xpagination.component';
13
+ import { FormFieldComponent } from '../form-field/form-field.component';
14
+ import { LegendComponent } from "../legend/legend.component";
15
+ import { ActionsOnTableComponent } from './components/actions-on-table/actions-on-table.component';
16
+
17
+ @Component({
18
+ selector: 'app-table',
19
+ templateUrl: './table.component.html',
20
+ standalone: true,
21
+ imports: [
22
+ ActionsOnTableComponent,
23
+ TranslateModule,
24
+ FormsModule,
25
+ CommonModule,
26
+ // XpaginationComponent,
27
+ ReactiveFormsModule,
28
+ DoubleScrollDirective,
29
+ LegendComponent,
30
+ FormFieldComponent
31
+ ]
32
+ })
33
+
34
+ export class TableComponent {}
35
+
36
+ // export class TableComponent extends PaginedComponent<Array<ListFilter>> implements OnInit {
37
+
38
+ // @Input() checkbox = true;
39
+ // @Input() title: string;
40
+ // @Input() columns: TableColumn[] = [];
41
+ // @Input() actionOnTable?: ActionOnTable[] = [];
42
+ // @Input() legend?: Legend;
43
+
44
+ // @Output() actionClick = new EventEmitter<ActionOnTableType>();
45
+
46
+ // @ContentChild('customActions') customActionsTemplate?: TemplateRef<any>;
47
+
48
+ // public filter: ListFilter;
49
+ // public actionOnTableAction = ActionOnTableType;
50
+
51
+ // constructor(fb: UntypedFormBuilder) {
52
+ // super(fb);
53
+ // }
54
+
55
+ // ngOnInit(): void {
56
+ // this.filter = this.getSavedFilters(new ListFilter(this.columns));
57
+ // this.pagination = new PaginationInfo();
58
+ // this.pagination.filter = this.filter;
59
+
60
+ // // Identifier la colonne ayant defaultFilter = true
61
+ // const defaultCol = this.columns.find(col => col.filter?.defaultFilter);
62
+
63
+ // if (defaultCol?.filter) {
64
+ // this.pagination.sortInfo.sortColumnName = defaultCol.key;
65
+ // this.pagination.sortInfo.sortType = defaultCol.filter.defaultOrder ?? SortType.Asc;
66
+ // } else {
67
+ // // fallback si aucune colonne par défaut
68
+ // this.pagination.sortInfo.sortColumnName = this.columns[0]?.key ?? '';
69
+ // this.pagination.sortInfo.sortType = SortType.Asc;
70
+ // }
71
+
72
+ // this.initFilterForm(this.filter);
73
+ // //this.loadData();
74
+
75
+ // console.log('FORM ==> ', this.filterForm.value);
76
+ // console.log('FORM ==> ', this.filterForm.controls['createdAt']);
77
+ // console.log('FORM ==> ', this.filterForm.controls['createdAt'] instanceof FormGroup); // doit être true
78
+
79
+ // }
80
+
81
+ // public onActionClick(action: ActionOnTableType): void {
82
+ // this.actionClick.emit(action);
83
+ // }
84
+
85
+ // }
@@ -0,0 +1,25 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { WizardStepComponent } from './wizard-step.component';
4
+
5
+ describe('WizardStepComponent', () => {
6
+ let component: WizardStepComponent;
7
+ let fixture: ComponentFixture<WizardStepComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ WizardStepComponent ]
12
+ })
13
+ .compileComponents();
14
+ });
15
+
16
+ beforeEach(() => {
17
+ fixture = TestBed.createComponent(WizardStepComponent);
18
+ component = fixture.componentInstance;
19
+ fixture.detectChanges();
20
+ });
21
+
22
+ it('should create', () => {
23
+ expect(component).toBeTruthy();
24
+ });
25
+ });
@@ -0,0 +1,16 @@
1
+ import { Component, Input, TemplateRef, ViewChild } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'app-wizard-step',
5
+ template: '<ng-template #content><ng-content></ng-content></ng-template>',
6
+ standalone: true
7
+ })
8
+
9
+ export class WizardStepComponent {
10
+
11
+ @Input() title!: string;
12
+ @Input() completed = false;
13
+
14
+ @ViewChild('content', { static: true }) templateRef!: TemplateRef<any>;
15
+
16
+ }
@@ -0,0 +1,45 @@
1
+ <nav>
2
+ <ul class="list-inline step-list">
3
+ @for (step of steps.toArray(); track step; let i = $index) {
4
+ <li class="list-inline-item step-item">
5
+ <button class="btn step-button" [ngClass]="{
6
+ 'step-active': selectedIndex === i,
7
+ 'step-completed': step.completed,
8
+ 'step-current': selectedIndex === i && step.completed === false
9
+ }" [disabled]="(i > 0 && !steps.toArray()[i - 1]?.completed)" (click)="goToStep(i)" type="button">
10
+ <span class="step-indicator bo-icons bo-alert-success" aria-hidden="true"></span>
11
+ <span class="step-label">
12
+ {{ step.title || ('_COMMON._STEPPER.STEP' | translate) + (i + 1) }}
13
+ </span>
14
+ </button>
15
+ </li>
16
+ }
17
+ </ul>
18
+ </nav>
19
+
20
+ @for (step of steps.toArray(); track step; let i = $index) {
21
+ <section class="tab-pane" [class.active]="selectedIndex === i" [hidden]="selectedIndex !== i" role="tabpanel">
22
+ <ng-container *ngTemplateOutlet="step.templateRef"></ng-container>
23
+ </section>
24
+ }
25
+
26
+ <div class="text-center mt-5">
27
+ <div class="btn-group">
28
+ <button class="btn btn-secondary btn-min-width" (click)="previousStep()" [disabled]="selectedIndex === 0"
29
+ type="button">
30
+ {{ '_COMMON._STEPPER.PREVIOUS_STEP' | translate }}
31
+ </button>
32
+
33
+ @if (selectedIndex !== steps.length - 1) {
34
+ <button class="btn btn-primary btn-min-width" (click)="nextStep()"
35
+ [disabled]="!steps.toArray()[selectedIndex]?.completed" type="button">
36
+ {{ '_COMMON._STEPPER.NEXT_STEP' | translate }}
37
+ </button>
38
+ }
39
+ @else {
40
+ <button class="btn btn-primary btn-min-width" (click)="endWizard()" type="button">
41
+ {{ '_COMMON._ACTION.END' | translate }}
42
+ </button>
43
+ }
44
+ </div>
45
+ </div>
@@ -0,0 +1,25 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+
3
+ import { WizardStepperComponent } from './wizard-stepper.component';
4
+
5
+ describe('WizardStepperComponent', () => {
6
+ let component: WizardStepperComponent;
7
+ let fixture: ComponentFixture<WizardStepperComponent>;
8
+
9
+ beforeEach(async () => {
10
+ await TestBed.configureTestingModule({
11
+ declarations: [ WizardStepperComponent ]
12
+ })
13
+ .compileComponents();
14
+ });
15
+
16
+ beforeEach(() => {
17
+ fixture = TestBed.createComponent(WizardStepperComponent);
18
+ component = fixture.componentInstance;
19
+ fixture.detectChanges();
20
+ });
21
+
22
+ it('should create', () => {
23
+ expect(component).toBeTruthy();
24
+ });
25
+ });
@@ -0,0 +1,70 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, ContentChildren, EventEmitter, Output, QueryList } from '@angular/core';
3
+ import { TranslateModule } from '@ngx-translate/core';
4
+ import { WizardStepComponent } from './components/wizard-step.component';
5
+
6
+ @Component({
7
+ selector: 'app-wizard-stepper',
8
+ templateUrl: './wizard-stepper.component.html',
9
+ standalone: true,
10
+ imports: [
11
+ CommonModule,
12
+ TranslateModule
13
+ ]
14
+ })
15
+ export class WizardStepperComponent {
16
+ @ContentChildren(WizardStepComponent) steps!: QueryList<WizardStepComponent>;
17
+
18
+ @Output() stepChange = new EventEmitter<number>();
19
+ @Output() stepNext = new EventEmitter<number>();
20
+ @Output() stepPrevious = new EventEmitter<number>();
21
+ @Output() stepEnd = new EventEmitter<number>();
22
+
23
+ public selectedIndex = 0;
24
+
25
+ public get stepList(): WizardStepComponent[] {
26
+ return this.steps.toArray();
27
+ }
28
+
29
+ public goToStep(index: number) {
30
+ if (index < 0 || index >= this.steps.length) return;
31
+
32
+ // Vérifier que toutes les étapes précédentes sont complétées
33
+ for (let i = 0; i < index; i++) {
34
+ if (!this.steps.toArray()[i].completed) {
35
+ return; // Empêche d'aller à cette étape si une étape précédente n'est pas validée
36
+ }
37
+ }
38
+
39
+ this.selectedIndex = index;
40
+ this.stepChange.emit(this.selectedIndex);
41
+ }
42
+
43
+ public nextStep() {
44
+ if (this.selectedIndex < this.steps.length - 1) {
45
+ const currentStep = this.steps.toArray()[this.selectedIndex];
46
+ if (!currentStep.completed) {
47
+ // Si l'étape courante n'est pas validée, on bloque
48
+ return;
49
+ }
50
+ this.selectedIndex++;
51
+ this.stepNext.emit(this.selectedIndex);
52
+ this.stepChange.emit(this.selectedIndex);
53
+ }
54
+ }
55
+
56
+ public previousStep() {
57
+ if (this.selectedIndex > 0) {
58
+ this.selectedIndex--;
59
+ this.stepPrevious.emit(this.selectedIndex);
60
+ this.stepChange.emit(this.selectedIndex);
61
+ }
62
+ }
63
+
64
+ public endWizard() {
65
+ if (this.selectedIndex > 0) {
66
+ this.stepEnd.emit(this.selectedIndex);
67
+ this.stepChange.emit(this.selectedIndex);
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,64 @@
1
+ import { AfterViewChecked, Directive, ElementRef, HostListener, OnDestroy, OnInit, Renderer2 } from '@angular/core';
2
+
3
+ @Directive({
4
+ selector: '[appDoubleScroll]'
5
+ })
6
+
7
+ export class DoubleScrollDirective implements OnInit, AfterViewChecked, OnDestroy {
8
+
9
+ scroll: any;
10
+ div: any;
11
+
12
+ constructor(private el: ElementRef, private renderer: Renderer2) {
13
+ }
14
+
15
+ @HostListener('window:resize', ['$event'])
16
+ onResize() {
17
+ this.adaptScrollWidth();
18
+ }
19
+
20
+ // Si scroll le tableau on scroll aussi div.table-responsive-double-scroll
21
+ @HostListener('scroll', ['$event'])
22
+ onScroll() {
23
+ this.div.scrollLeft = this.el.nativeElement.scrollLeft;
24
+ }
25
+
26
+ ngOnInit() {
27
+
28
+ // On applique un margin-top à 0 à la table.
29
+ this.el.nativeElement.style.marginTop = '0';
30
+
31
+ // On crée le div.table-responsive-double-scroll et on l'insère avant le tableau
32
+ this.div = this.renderer.createElement('div');
33
+ this.renderer.addClass(this.div, 'table-responsive-double-scroll');
34
+ this.renderer.insertBefore(this.el.nativeElement.parentNode, this.div, this.el.nativeElement);
35
+
36
+ // On crée le div.scroll et on l'insère dans le div.table-responsive-double-scroll
37
+ this.scroll = this.renderer.createElement('div');
38
+ this.renderer.addClass(this.scroll, 'scroll');
39
+ this.renderer.appendChild(this.div, this.scroll);
40
+
41
+ // Si on scroll div.table-responsive-double-scroll on scroll aussi le tableau
42
+ this.div.addEventListener('scroll', function() {
43
+ //this.nextSibling.scrollLeft = this.scrollLeft;
44
+ this.nextSibling.style.transform = "translateX(-" + this.scrollLeft + "px)";
45
+ });
46
+ }
47
+
48
+ adaptScrollWidth() {
49
+ // On donne à div.scroll la taille du tableau
50
+ if (this.el.nativeElement.firstChild.offsetWidth > this.el.nativeElement.offsetWidth) {
51
+ this.scroll.style.width = (this.el.nativeElement.firstChild.offsetWidth + 17) + 'px';
52
+ } else {
53
+ this.scroll.style.widdth = 'auto';
54
+ }
55
+ }
56
+
57
+ ngAfterViewChecked() {
58
+ this.adaptScrollWidth();
59
+ }
60
+
61
+ ngOnDestroy() {
62
+ this.div.removeEventListener('scroll', null);
63
+ }
64
+ }
@@ -0,0 +1,99 @@
1
+ import { AfterViewChecked, AfterViewInit, Directive, ElementRef, HostListener, OnInit, Renderer2 } from '@angular/core';
2
+
3
+ @Directive({
4
+ selector: '[appRwdTabs]',
5
+ standalone: true
6
+ })
7
+
8
+ export class RwdTabsDirective implements OnInit, AfterViewInit, AfterViewChecked {
9
+ parentEl = this.el.nativeElement;
10
+ arrayLi = [];
11
+ goodOnViewInit = false;
12
+ dropdownDisplay = false;
13
+ goodOnViewChecked = false;
14
+
15
+ rwdTabsOk = false;
16
+
17
+ constructor(private el: ElementRef, private renderer: Renderer2) {
18
+ }
19
+
20
+ @HostListener('window:resize', ['$event'])
21
+ onResize() {
22
+ this.rwdTabs();
23
+ }
24
+
25
+ ngOnInit() {
26
+ }
27
+
28
+ ngAfterViewInit() {
29
+ this.liOnLoad();
30
+ // Si on a bien joué la fonction liOnLoad
31
+ if (this.goodOnViewInit) {
32
+ this.rwdTabs();
33
+ }
34
+ }
35
+
36
+ ngAfterViewChecked() {
37
+ // si on a pas réussi à récupérer les marges et les tailles
38
+ // sur le init, on le fait sur le check
39
+ if (!this.goodOnViewInit) {
40
+ this.liOnLoad();
41
+ }
42
+ // si on a pas déjà joué la fonction
43
+ if (!this.rwdTabsOk) {
44
+ this.rwdTabs();
45
+ }
46
+ }
47
+
48
+ liOnLoad() {
49
+ Array.prototype.forEach.call(this.parentEl.children, child => {
50
+ // On récupère la taille des marges
51
+ const styleChild = child.currentStyle || window.getComputedStyle(child);
52
+ const childMarginSum = parseFloat(styleChild.marginLeft);
53
+
54
+ // on teste si on arrive à récupérer les marges sur le init
55
+ if (styleChild.marginLeft !== '') {
56
+ // On stock les li et ça taille dans un tableau arrayLi
57
+ this.arrayLi.push([child, child.offsetWidth + childMarginSum]);
58
+ this.goodOnViewInit = true;
59
+ }
60
+ });
61
+ if (this.goodOnViewInit) {
62
+ // On supprime le dernier élément du tableau qui correspond au dropdown
63
+ this.arrayLi.pop();
64
+ }
65
+ }
66
+
67
+ rwdTabs() {
68
+ this.rwdTabsOk = true; // flag la fonction comme lancée
69
+
70
+ const widthUl = this.parentEl.offsetWidth;
71
+ // Largeur du dropdown à prendre en compte (ancienne charte = 90, Manett = 150)
72
+ let widthLi = !this.dropdownDisplay ? 0 : 150;
73
+ const dropDown = this.parentEl.lastChild.querySelector('.dropdown-menu');
74
+
75
+ // On parcourt le tableau de li
76
+ this.arrayLi.forEach(element => {
77
+ widthLi += element[1];
78
+ // Quand les li ne rentreent plus dans le ul
79
+ if (widthLi > widthUl) {
80
+ // On les déplace dans le dropdown
81
+ dropDown.appendChild(element[0]);
82
+ this.dropdownDisplay = true; // on indique que le dropdown doit apparaitre
83
+ } else {
84
+ // Sinon on replace l'onglet à sa place initale
85
+ this.renderer.insertBefore(this.parentEl, element[0], this.parentEl.lastChild);
86
+ }
87
+ });
88
+
89
+ // On fait apparaître le dropdown
90
+ if (this.dropdownDisplay) {
91
+ this.parentEl.lastChild.style.setProperty('display', 'block', 'important');
92
+ }
93
+ // Si le dropdown est vide on le cache de nouveau
94
+ if (dropDown.firstChild == null) {
95
+ this.parentEl.lastChild.style.setProperty('display', 'none', 'important');
96
+ this.dropdownDisplay = false;
97
+ }
98
+ }
99
+ }
@@ -0,0 +1,61 @@
1
+ import { Directive, ElementRef, Renderer2, OnInit } from '@angular/core';
2
+ import { TranslateService } from '@ngx-translate/core';
3
+
4
+ @Directive({
5
+ // eslint-disable-next-line @angular-eslint/directive-selector
6
+ selector: '[showHidePassword]',
7
+ standalone: true
8
+ })
9
+
10
+ export class ShowHidePasswordDirective implements OnInit {
11
+
12
+ private isShown = false;
13
+
14
+ constructor(
15
+ private el: ElementRef,
16
+ private renderer: Renderer2,
17
+ private translateService: TranslateService
18
+ ) {
19
+ }
20
+
21
+ ngOnInit() {
22
+ this.setup();
23
+ }
24
+
25
+ setup() {
26
+ const div = this.renderer.createElement('div');
27
+ this.renderer.insertBefore(this.el.nativeElement.parentNode, div, this.el.nativeElement);
28
+
29
+ this.renderer.appendChild(div, this.el.nativeElement);
30
+ this.renderer.addClass(div, 'see-password-container');
31
+
32
+ const button = this.renderer.createElement('button');
33
+ this.renderer.appendChild(this.el.nativeElement.parentNode, button);
34
+ this.renderer.addClass(button, 'btn');
35
+ this.renderer.setAttribute(button, 'type', 'button');
36
+ this.renderer.addClass(button, 'optyweb');
37
+ this.renderer.addClass(button, 'cw-hide-map');
38
+ this.renderer.addClass(button, 'py-2');
39
+ this.renderer.addClass(button, 'see-password');
40
+
41
+ const srOnly = this.renderer.createElement('span');
42
+ this.renderer.appendChild(button, srOnly);
43
+ this.renderer.addClass(srOnly, 'visually-hidden');
44
+ this.renderer.setProperty(srOnly,'innerHTML', this.translateService.instant('_COMMON._FORM._SHOW_HIDE_PWD.SHOW'));
45
+
46
+ this.renderer.listen(button, 'click', (event) => {
47
+ this.isShown = !this.isShown;
48
+ if (this.isShown) {
49
+ this.el.nativeElement.setAttribute('type', 'text');
50
+ this.renderer.removeClass(button, 'cw-hide-map');
51
+ this.renderer.addClass(button, 'cw-show-map');
52
+ this.renderer.setProperty(srOnly,'innerHTML', this.translateService.instant('_COMMON._FORM._SHOW_HIDE_PWD.HIDE'));
53
+ } else {
54
+ this.el.nativeElement.setAttribute('type', 'password');
55
+ this.renderer.addClass(button, 'cw-hide-map');
56
+ this.renderer.removeClass(button, 'cw-show-map');
57
+ this.renderer.setProperty(srOnly,'innerHTML', this.translateService.instant('_COMMON._FORM._SHOW_HIDE_PWD.SHOW'));
58
+ }
59
+ });
60
+ }
61
+ }
@@ -0,0 +1,5 @@
1
+ export interface DragItem {
2
+ id: number;
3
+ label: string;
4
+ order: number;
5
+ }