@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.
- package/.eslintrc.json +37 -0
- package/ng-package.json +21 -0
- package/package.json +21 -32
- package/src/lib/bo-ui.config.ts +8 -0
- package/src/lib/components/accordions/accordions.component.html +16 -0
- package/src/lib/components/accordions/accordions.component.spec.ts +24 -0
- package/src/lib/components/accordions/accordions.component.ts +27 -0
- package/src/lib/components/accordions/components/accordions-content.component.spec.ts +24 -0
- package/src/lib/components/accordions/components/accordions-content.component.ts +28 -0
- package/src/lib/components/alert/alert.component.html +15 -0
- package/src/lib/components/alert/alert.component.spec.ts +24 -0
- package/src/lib/components/alert/alert.component.ts +36 -0
- package/src/lib/components/badge/badge.component.html +7 -0
- package/src/lib/components/badge/badge.component.spec.ts +24 -0
- package/src/lib/components/badge/badge.component.ts +24 -0
- package/src/lib/components/button/button.component.html +43 -0
- package/src/lib/components/button/button.component.spec.ts +25 -0
- package/src/lib/components/button/button.component.ts +47 -0
- package/src/lib/components/card/card.component.html +15 -0
- package/src/lib/components/card/card.component.spec.ts +25 -0
- package/src/lib/components/card/card.component.ts +30 -0
- package/src/lib/components/custom-list/custom-list.component.html +31 -0
- package/src/lib/components/custom-list/custom-list.component.spec.ts +24 -0
- package/src/lib/components/custom-list/custom-list.component.ts +42 -0
- package/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.html +27 -0
- package/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.spec.ts +24 -0
- package/src/lib/components/drag-n-drop-list/drag-n-drop-list.component.ts +40 -0
- package/src/lib/components/form-field/form-field.component.html +333 -0
- package/src/lib/components/form-field/form-field.component.spec.ts +24 -0
- package/src/lib/components/form-field/form-field.component.ts +256 -0
- package/src/lib/components/icon/icon.component.html +9 -0
- package/src/lib/components/icon/icon.component.spec.ts +25 -0
- package/src/lib/components/icon/icon.component.ts +31 -0
- package/src/lib/components/layout/admin-layout/admin-layout.component.html +17 -0
- package/src/lib/components/layout/admin-layout/admin-layout.component.ts +181 -0
- package/src/lib/components/layout/footer/footer.component.html +51 -0
- package/src/lib/components/layout/footer/footer.component.ts +65 -0
- package/src/lib/components/layout/header/header.component.html +71 -0
- package/src/lib/components/layout/header/header.component.ts +95 -0
- package/src/lib/components/layout/menu/menu.component.html +115 -0
- package/src/lib/components/layout/menu/menu.component.ts +75 -0
- package/src/lib/components/layout/menu-accordion/accordion.directive.ts +57 -0
- package/src/lib/components/layout/menu-accordion/accordionanchor.directive.ts +21 -0
- package/src/lib/components/layout/menu-accordion/accordionlink.directive.ts +45 -0
- package/src/lib/components/layout/menu-accordion/index.ts +3 -0
- package/src/lib/components/layout/sidebar/sidebar.component.html +62 -0
- package/src/lib/components/layout/sidebar/sidebar.component.ts +28 -0
- package/src/lib/components/layout/skip-links/skip-links.component.html +3 -0
- package/src/lib/components/layout/skip-links/skip-links.component.spec.ts +25 -0
- package/src/lib/components/layout/skip-links/skip-links.component.ts +19 -0
- package/src/lib/components/layout/title-breadcrumb/title-breadcrumb.component.html +10 -0
- package/src/lib/components/layout/title-breadcrumb/title-breadcrumb.component.spec.ts +25 -0
- package/src/lib/components/layout/title-breadcrumb/title-breadcrumb.component.ts +16 -0
- package/src/lib/components/legend/legend.component.html +23 -0
- package/src/lib/components/legend/legend.component.spec.ts +24 -0
- package/src/lib/components/legend/legend.component.ts +28 -0
- package/src/lib/components/loader/loader.component.html +4 -0
- package/src/lib/components/loader/loader.component.ts +16 -0
- package/src/lib/components/modals/modals.component.html +71 -0
- package/src/lib/components/modals/modals.component.spec.ts +25 -0
- package/src/lib/components/modals/modals.component.ts +49 -0
- package/src/lib/components/tab/components/tab-content.component.spec.ts +24 -0
- package/src/lib/components/tab/components/tab-content.component.ts +27 -0
- package/src/lib/components/tab/tab.component.html +59 -0
- package/src/lib/components/tab/tab.component.spec.ts +24 -0
- package/src/lib/components/tab/tab.component.ts +79 -0
- package/src/lib/components/table/components/actions-on-table/actions-on-table.component.html +50 -0
- package/src/lib/components/table/components/actions-on-table/actions-on-table.component.spec.ts +24 -0
- package/src/lib/components/table/components/actions-on-table/actions-on-table.component.ts +33 -0
- package/src/lib/components/table/components/filter/filter.component.html +21 -0
- package/src/lib/components/table/components/filter/filter.component.spec.ts +24 -0
- package/src/lib/components/table/components/filter/filter.component.ts +38 -0
- package/src/lib/components/table/table.component.html +104 -0
- package/src/lib/components/table/table.component.spec.ts +24 -0
- package/src/lib/components/table/table.component.ts +85 -0
- package/src/lib/components/wizard-stepper/components/wizard-step.component.spec.ts +25 -0
- package/src/lib/components/wizard-stepper/components/wizard-step.component.ts +16 -0
- package/src/lib/components/wizard-stepper/wizard-stepper.component.html +45 -0
- package/src/lib/components/wizard-stepper/wizard-stepper.component.spec.ts +25 -0
- package/src/lib/components/wizard-stepper/wizard-stepper.component.ts +70 -0
- package/src/lib/directives/double-scroll.ts +64 -0
- package/src/lib/directives/rwd-tabs.ts +99 -0
- package/src/lib/directives/show-hide-password.ts +61 -0
- package/src/lib/enum/drag-item.enum.ts +5 -0
- package/src/lib/enum/field-type.enum.ts +36 -0
- package/src/lib/enum/legend-type.enum.ts +5 -0
- package/src/lib/enum/modals.enum.ts +6 -0
- package/src/lib/enum/ui-type.enum.ts +11 -0
- package/src/lib/models/ui/custom-list.model.ts +14 -0
- package/src/lib/models/ui/legend.model.ts +17 -0
- package/src/lib/models/ui/table.model.ts +33 -0
- package/src/lib/services/ui/modals.service.ts +47 -0
- package/src/lib/services/version.service.ts +22 -0
- package/src/public-api.ts +49 -0
- package/tsconfig.lib.json +18 -0
- package/tsconfig.lib.prod.json +11 -0
- package/tsconfig.spec.json +14 -0
- package/tslint.json +17 -0
- package/cityway-bo-ui-1.0.0.tgz +0 -0
- package/fesm2022/cityway-bo-ui.mjs +0 -1598
- package/fesm2022/cityway-bo-ui.mjs.map +0 -1
- package/index.d.ts +0 -509
- package/styles.min.css +0 -5
- package/styles.min.css.map +0 -1
- /package/{lib → src/lib}/assets/fonts/bo/_variables.scss +0 -0
- /package/{lib → src/lib}/assets/fonts/bo/bo.scss +0 -0
- /package/{lib → src/lib}/assets/fonts/bo/bo.woff +0 -0
- /package/{lib → src/lib}/assets/fonts/bo/bo.woff2 +0 -0
- /package/{lib → src/lib}/assets/fonts/nunito/_nunito.scss +0 -0
- /package/{lib → src/lib}/assets/fonts/nunito/nunito-bold.woff +0 -0
- /package/{lib → src/lib}/assets/fonts/nunito/nunito-bold.woff2 +0 -0
- /package/{lib → src/lib}/assets/fonts/nunito/nunito-extrabold.woff +0 -0
- /package/{lib → src/lib}/assets/fonts/nunito/nunito-extrabold.woff2 +0 -0
- /package/{lib → src/lib}/assets/fonts/nunito/nunito-regular.woff +0 -0
- /package/{lib → src/lib}/assets/fonts/nunito/nunito-regular.woff2 +0 -0
- /package/{lib → src/lib}/assets/fonts/nunito/nunito-semi-bold.woff +0 -0
- /package/{lib → src/lib}/assets/fonts/nunito/nunito-semi-bold.woff2 +0 -0
- /package/{lib → src/lib}/assets/fonts/optyweb/_variables.scss +0 -0
- /package/{lib → src/lib}/assets/fonts/optyweb/optyweb.scss +0 -0
- /package/{lib → src/lib}/assets/fonts/optyweb/optyweb.woff +0 -0
- /package/{lib → src/lib}/assets/fonts/optyweb/optyweb.woff2 +0 -0
- /package/{lib → src/lib}/assets/i18n/common.en.json +0 -0
- /package/{lib → src/lib}/assets/i18n/common.fr.json +0 -0
- /package/{lib → src/lib}/assets/i18n/label.en.json +0 -0
- /package/{lib → src/lib}/assets/i18n/label.fr.json +0 -0
- /package/{lib → src/lib}/assets/images/common/bg-loader.svg +0 -0
- /package/{lib → src/lib}/assets/images/common/bg-menu.svg +0 -0
- /package/{lib → src/lib}/assets/images/common/bg-round.svg +0 -0
- /package/{lib → src/lib}/assets/images/common/check-mark.svg +0 -0
- /package/{lib → src/lib}/assets/images/common/loader.svg +0 -0
- /package/{lib → src/lib}/assets/images/common/logo-en-bw.svg +0 -0
- /package/{lib → src/lib}/assets/images/common/logo-en.svg +0 -0
- /package/{lib → src/lib}/assets/images/common/logo-fr-bw.svg +0 -0
- /package/{lib → src/lib}/assets/images/common/logo-fr.svg +0 -0
- /package/{lib → src/lib}/assets/images/favicon/android-chrome-192x192.png +0 -0
- /package/{lib → src/lib}/assets/images/favicon/android-chrome-512x512.png +0 -0
- /package/{lib → src/lib}/assets/images/favicon/apple-touch-icon.png +0 -0
- /package/{lib → src/lib}/assets/images/favicon/favicon-16x16.png +0 -0
- /package/{lib → src/lib}/assets/images/favicon/favicon-32x32.png +0 -0
- /package/{lib → src/lib}/assets/images/favicon/favicon-96x96.png +0 -0
- /package/{lib → src/lib}/assets/images/favicon/favicon.ico +0 -0
- /package/{lib → src/lib}/assets/images/favicon/site.webmanifest +0 -0
- /package/{lib → src/lib}/assets/images/icon/referential-icon.svg +0 -0
- /package/{lib → src/lib}/assets/images/login/login-bg.jpg +0 -0
- /package/{lib → src/lib}/assets/images/login/logo-cityway-baseline.svg +0 -0
- /package/{lib → src/lib}/assets/images/toast/warning.svg +0 -0
- /package/{lib → src/lib}/assets/styles/scss/_components.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/_core.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/_custom-bootstrap.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_accordion.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_alert.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_badge.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_breadcrumb.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_button-group.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_buttons.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_card.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_close.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_dropdown.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_forms.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_input-group.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_lists.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_modal.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_pagination.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_popover.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_progress.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_reboot.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_tables.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_tabs.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_tooltip.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/bootstrap/_type.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_forms-firefox.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_leaflet.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_legend.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ng-select.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ng2-dragula.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ng2-validation.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ng5-slider.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ngb-datepicker.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ngb-timepicker.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ngx-chips.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ngx-editor.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ngx-file-drop.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ngx-intl-tel-input.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ngx-slider.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_ngx-toast.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_pwd-policy.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_table.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_vis.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/_wizard-stepper.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/table/_table-action.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/table/_table-bg-cell.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/table/_table-double-scroll.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/table/_table-filter.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/table/_table-pagination.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/table/_table-popover.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/components/table/_table-sorting.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/core/_footer.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/core/_header.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/core/_layout.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/core/_menu.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/core/_sidebar.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/mixins/_utilities.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/styles.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/tools/_focus.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/tools/_loader.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/variables/_colors.scss +0 -0
- /package/{lib → src/lib}/assets/styles/scss/variables/_custom.scss +0 -0
- /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
|
+
}
|