@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,27 @@
1
+ <div class="drag-drop-list">
2
+ <div class="list-column" cdkDropList #availableList="cdkDropList" [cdkDropListData]="availableItems"
3
+ [cdkDropListConnectedTo]="[activeList]" (cdkDropListDropped)="drop($event)">
4
+ <h3>Modes disponibles</h3>
5
+ @for (item of availableItems; track item) {
6
+ <div cdkDrag>
7
+ <ng-container *ngTemplateOutlet="itemTemplate || defaultTemplate; context: { $implicit: item }"></ng-container>
8
+ </div>
9
+ }
10
+ </div>
11
+
12
+ <div class="list-column" cdkDropList #activeList="cdkDropList" [cdkDropListData]="activeItems"
13
+ [cdkDropListConnectedTo]="[availableList]" (cdkDropListDropped)="drop($event)">
14
+ <h3>Modes activés</h3>
15
+ @for (item of activeItems; track item) {
16
+ <div cdkDrag>
17
+ <ng-container *ngTemplateOutlet="itemTemplate || defaultTemplate; context: { $implicit: item }"></ng-container>
18
+ </div>
19
+ }
20
+ </div>
21
+
22
+ <ng-template #defaultTemplate let-item>
23
+ <div class="default-item">
24
+ Mode : {{ item.label }} ({{ item.code }} )
25
+ </div>
26
+ </ng-template>
27
+ </div>
@@ -0,0 +1,24 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { DragNDropListComponent } from './drag-n-drop-list.component';
3
+
4
+ describe('DragNDropListComponent', () => {
5
+ let component: DragNDropListComponent;
6
+ let fixture: ComponentFixture<DragNDropListComponent>;
7
+
8
+ beforeEach(async () => {
9
+ await TestBed.configureTestingModule({
10
+ declarations: [ DragNDropListComponent ]
11
+ })
12
+ .compileComponents();
13
+ });
14
+
15
+ beforeEach(() => {
16
+ fixture = TestBed.createComponent(DragNDropListComponent);
17
+ component = fixture.componentInstance;
18
+ fixture.detectChanges();
19
+ });
20
+
21
+ it('should create', () => {
22
+ expect(component).toBeTruthy();
23
+ });
24
+ });
@@ -0,0 +1,40 @@
1
+ import { CdkDragDrop, DragDropModule, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
2
+ import { CommonModule } from '@angular/common';
3
+ import { Component, EventEmitter, Input, Output, TemplateRef } from '@angular/core';
4
+ import { TranslateModule } from '@ngx-translate/core';
5
+ import { DragItem } from '../../enum/drag-item.enum';
6
+
7
+ @Component({
8
+ selector: 'app-drag-n-drop-list',
9
+ templateUrl: './drag-n-drop-list.component.html',
10
+ standalone: true,
11
+ imports: [
12
+ CommonModule,
13
+ TranslateModule,
14
+ DragDropModule
15
+ ]
16
+ })
17
+ export class DragNDropListComponent {
18
+
19
+ @Input() availableItems: DragItem[] = [];
20
+ @Input() activeItems: DragItem[] = [];
21
+ @Input() itemTemplate?: TemplateRef<any>;
22
+
23
+ @Output() availableItemsChange = new EventEmitter<DragItem[]>();
24
+ @Output() activeItemsChange = new EventEmitter<DragItem[]>();
25
+
26
+ drop(event: CdkDragDrop<any[]>) {
27
+ if (event.previousContainer === event.container) {
28
+ moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
29
+ } else {
30
+ transferArrayItem(
31
+ event.previousContainer.data,
32
+ event.container.data,
33
+ event.previousIndex,
34
+ event.currentIndex
35
+ );
36
+ }
37
+ this.availableItemsChange.emit(this.availableItems);
38
+ this.activeItemsChange.emit(this.activeItems);
39
+ }
40
+ }
@@ -0,0 +1,333 @@
1
+ @if (!isInAddon && !inTableFilter) {
2
+ <div class="form-group">
3
+ @if (
4
+ type !== typeField.checkbox &&
5
+ type !== typeField.radio &&
6
+ type !== typeField.checkboxButton &&
7
+ type !== typeField.radioButton &&
8
+ type !== typeField.checkboxInline &&
9
+ type !== typeField.radioInline &&
10
+ type !== typeField.switch &&
11
+ type !== typeField.switchSmall
12
+
13
+ ) {
14
+ <label [for]="name" class="form-label">
15
+ {{ label }}
16
+
17
+ @if (isRequired) {
18
+ <span class="text-danger">*</span>
19
+ }
20
+
21
+ @if (tooltip) {
22
+ <button type="button" class="btn btn-link btn-popover" placement="bottom" [ngbPopover]="popContent" container="body"
23
+ triggers="mouseenter:mouseleave">
24
+ <span class="btn-popover-icon bo-icons bo-help"></span>
25
+ </button>
26
+ <ng-template #popContent>
27
+ <div [innerHTML]="tooltip"></div>
28
+ </ng-template>
29
+ }
30
+ </label>
31
+ }
32
+
33
+ @if (addonLeft || addonRight) {
34
+ <div class="input-group">
35
+ <ng-container *ngIf="addonLeft" [ngTemplateOutlet]="addonLeft"></ng-container>
36
+ <ng-container [ngTemplateOutlet]="field"></ng-container>
37
+ <ng-container *ngIf="addonRight" [ngTemplateOutlet]="addonRight"></ng-container>
38
+ </div>
39
+ }
40
+ @else {
41
+ @if ( isInInputGroup() ) {
42
+ <div class="input-group">
43
+ <ng-container [ngTemplateOutlet]="field"></ng-container>
44
+ </div>
45
+ }
46
+ @else {
47
+ <ng-container [ngTemplateOutlet]="field"></ng-container>
48
+ }
49
+ }
50
+
51
+ <!-- Error message -->
52
+ @if (controlOrGroup?.invalid && controlOrGroup?.touched) {
53
+ <div class="invalid-feedback d-block" [id]="'error-' + name">
54
+ <span
55
+ *ngIf="(controlOrGroup?.errors?.['required']) || (getControl('start')?.errors?.['required'] || getControl('end')?.errors?.['required'])"
56
+ [innerHtml]="'_COMMON._FORM.ERROR_IS_MANDATORY' | translate: {label: label}">
57
+ </span>
58
+ <span *ngIf="controlOrGroup?.errors?.['rangeInvalid']">
59
+ {{'_COMMON._DATES.ERROR_START_END_PERIOD' | translate}}
60
+ </span>
61
+ </div>
62
+ }
63
+
64
+ @if (help) {
65
+ <small [id]="name + '-help'" class="form-text text-muted">{{help}}</small>
66
+ }
67
+
68
+ </div>
69
+ }
70
+ @else if ( inTableFilter ) {
71
+ <label class="form-label" [for]="name" class="visually-hidden">
72
+ {{'_COMMON._FORM.FILTER_LABEL' | translate: { col: name } }}
73
+ </label>
74
+
75
+ @if ( isInInputGroup() ) {
76
+ <div class="input-group">
77
+ <ng-container [ngTemplateOutlet]="field"></ng-container>
78
+ </div>
79
+ }
80
+ @else {
81
+ <ng-container [ngTemplateOutlet]="field"></ng-container>
82
+ }
83
+ }
84
+ @else {
85
+ <ng-container [ngTemplateOutlet]="field"></ng-container>
86
+ }
87
+
88
+ <ng-template #field>
89
+ <!-- Text -->
90
+ @if ([typeField.text, typeField.date, typeField.time, typeField.dateTime, typeField.number, typeField.file,
91
+ typeField.email,
92
+ typeField.color].includes(type)) {
93
+ <input [type]="type" class="form-control" [id]="name" [formControl]="formControl"
94
+ [ngClass]="[(cssClass || ''), formControl?.value ? 'has-value' : '']"
95
+ [attr.placeholder]="placeholder ? placeholder : null" [attr.required]="isRequired ? 'required' : null"
96
+ [attr.readonly]="isReadonly ? 'readonly' : null" [disabled]="isDisabled"
97
+ [attr.aria-required]="isRequired" [attr.aria-invalid]="control.invalid && control.touched"
98
+ [attr.aria-describedby]="control.invalid && control.touched ? 'error-' + name : null" />
99
+ }
100
+
101
+ @if (type === typeField.password) {
102
+ <input showHidePassword [type]="type" class="form-control" [id]="name" [formControl]="formControl"
103
+ [ngClass]="[(cssClass || ''), formControl?.value ? 'has-value' : '']"
104
+ [attr.required]="isRequired ? 'required' : null" [attr.readonly]="isReadonly ? 'readonly' : null"
105
+ [attr.disabled]="isDisabled ? 'disabled' : null" [attr.aria-required]="isRequired"
106
+ [attr.aria-invalid]="control.invalid && control.touched"
107
+ [attr.aria-describedby]="control.invalid && control.touched ? 'error-' + name : null" />
108
+ }
109
+
110
+ <!-- Textarea -->
111
+ @if (type === typeField.textarea) {
112
+ <textarea class="form-control" [id]="name" [formControl]="formControl"
113
+ [ngClass]="[(cssClass || ''), formControl?.value ? 'has-value' : '']"
114
+ [attr.placeholder]="placeholder ? placeholder : null" [attr.required]="isRequired ? 'required' : null"
115
+ [attr.readonly]="isReadonly ? 'readonly' : null" [attr.disabled]="isDisabled ? 'disabled' : null"
116
+ [attr.aria-required]="isRequired" [attr.aria-invalid]="control.invalid && control.touched"
117
+ [attr.aria-describedby]="control.invalid && control.touched ? 'error-' + name : null"></textarea>
118
+ }
119
+
120
+ <!-- Select -->
121
+ @if (type === typeField.select) {
122
+ <ng-select [formControl]="formControl" [items]="options" bindLabel="label" [labelForId]="name" bindValue="value"
123
+ [ngClass]="cssClass" [searchable]="false" [placeholder]="placeholder ? placeholder : null" [readonly]="isReadonly"
124
+ [attr.disabled]="isDisabled ? 'disabled' : null" [attr.required]="isRequired ? 'required' : null"
125
+ [attr.aria-required]="isRequired" [attr.aria-invalid]="control.invalid && control.touched"
126
+ [attr.aria-describedby]="control.invalid && control.touched ? 'error-' + name : null" [attr.id]="name"
127
+ (blur)="onBlur()">
128
+ <ng-content></ng-content>
129
+ </ng-select>
130
+ }
131
+
132
+ <!-- NgSelect -->
133
+ @if (type === typeField.ngSelect || type === typeField.ngSelectMultiple) {
134
+ <ng-select [formControl]="formControl" [items]="options" bindLabel="label" [labelForId]="name" bindValue="value"
135
+ [multiple]="type === typeField.ngSelectMultiple" [ngClass]="cssClass"
136
+ [placeholder]="placeholder ? placeholder : null" [readonly]="isReadonly"
137
+ [notFoundText]="'_COMMON.NO_RESULT' | translate" [attr.disabled]="isDisabled ? 'disabled' : null"
138
+ [attr.required]="isRequired ? 'required' : null" [attr.aria-required]="isRequired"
139
+ [attr.aria-invalid]="control.invalid && control.touched"
140
+ [attr.aria-describedby]="control.invalid && control.touched ? 'error-' + name : null" [attr.id]="name"
141
+ (blur)="onBlur()">
142
+ <ng-content></ng-content>
143
+ </ng-select>
144
+ }
145
+
146
+ <!-- Radio -->
147
+ @if (type === typeField.radioInline || type === typeField.radio) {
148
+ <fieldset [ngClass]="{ 'flex-column': type === typeField.radio }">
149
+ <legend>{{label}}</legend>
150
+ <ul class=" mb-0" [ngClass]="type === typeField.radioInline ? 'list-inline' : 'list-unstyled'">
151
+ <li *ngFor="let opt of options" class="form-check"
152
+ [ngClass]="{ 'form-check-inline': type === typeField.radioInline }">
153
+ <input type="radio" [id]="name + '_' + opt.value" [value]="opt.value" [formControl]="formControl"
154
+ class="form-check-input" />
155
+ <label [for]="name + '_' + opt.value" class="form-check-label">{{ opt.label }}</label>
156
+ </li>
157
+ </ul>
158
+ </fieldset>
159
+ }
160
+
161
+ <!-- Radio button -->
162
+ @if (type === typeField.radioButton) {
163
+ <fieldset>
164
+ <legend>{{label}}</legend>
165
+ <div class="btn-group btn-group-secondary">
166
+ <ng-container *ngFor="let opt of options">
167
+ <input type="radio" [id]="name + '_' + opt.value" [value]="opt.value" [formControl]="formControl"
168
+ class="visually-hidden" />
169
+ <label [for]="name + '_' + opt.value" class="btn btn-form">{{ opt.label }}</label>
170
+ </ng-container>
171
+ </div>
172
+ </fieldset>
173
+ }
174
+
175
+ <!-- Checkbox Switch -->
176
+ @if (
177
+ (type === typeField.checkbox ||
178
+ type === typeField.switch ||
179
+ type === typeField.switchSmall)
180
+ && options.length === 0
181
+ ) {
182
+ <div class="form-check form-switch" [ngClass]="{'form-switch-small': type === typeField.switchSmall}">
183
+ <input type="checkbox" [id]="name" [formControl]="formControl" class="form-check-input" />
184
+ <label [for]="name" class="form-check-label">{{ label }}</label>
185
+ </div>
186
+ }
187
+
188
+ <!-- Checkbox -->
189
+ @if ((type === typeField.checkboxInline || type === typeField.checkbox) && options.length > 0) {
190
+ <fieldset *ngIf="" [ngClass]="{ 'flex-column': type === typeField.checkbox }">
191
+ <legend>{{label}}</legend>
192
+ <ul class="mb-0" [ngClass]="type === typeField.checkboxInline ? 'list-inline' : 'list-unstyled'">
193
+ <li *ngFor="let opt of options" class="form-check"
194
+ [ngClass]="{ 'form-check-inline': type === typeField.checkboxInline }">
195
+ <input type="checkbox" [id]="name + '_' + opt.value" [value]="opt.value" (change)="onCheckboxChange($event)"
196
+ [checked]="control.value?.includes(opt.value)" class="form-check-input" />
197
+ <label [for]="name + '_' + opt.value" class="form-check-label">{{ opt.label }}</label>
198
+ </li>
199
+ </ul>
200
+ </fieldset>
201
+ }
202
+
203
+ <!-- Checkbox button -->
204
+ @if (type === typeField.checkboxButton) {
205
+ <fieldset>
206
+ <legend>{{label}}</legend>
207
+ <div class="btn-group btn-group-secondary">
208
+ <ng-container *ngFor="let opt of options">
209
+ <input type="checkbox" [id]="name + '_' + opt.value" [value]="opt.value" (change)="onCheckboxChange($event)"
210
+ [checked]="control.value?.includes(opt.value)" class="visually-hidden" />
211
+ <label [for]="name + '_' + opt.value" class="btn btn-form">{{ opt.label }}</label>
212
+ </ng-container>
213
+ </div>
214
+ </fieldset>
215
+ }
216
+
217
+ <!-- Period - DateToDate / TimeToTime / DateTimeToDateTime -->
218
+ @if ([typeField.dateToDate, typeField.timeToTime, typeField.dateTimeToDateTime].includes(type) && isRange) {
219
+
220
+ <div class="input-group">
221
+ @if (!inTableFilter) {
222
+ <span class="input-group-text text-lowercase" [class.disabled]="isDisabled ? 'disabled' : null">
223
+ {{ type === typeField.timeToTime ? ('_COMMON._DATES.FROM' | translate) : ('_COMMON._DATES.FROM_TO_1' | translate)
224
+ }}
225
+ </span>
226
+ }
227
+
228
+ <input [type]="getInputType()" class="form-control" [id]="name + '_start'" [formControl]="getControl('start')"
229
+ [attr.placeholder]="inTableFilter ? (type === typeField.timeToTime ? ('_COMMON._DATES.FROM' | translate) : ('_COMMON._DATES.FROM_TO_1' | translate)) : null"
230
+ [ngClass]="[(cssClass || ''), getControl('start')?.value ? 'has-value' : '']"
231
+ [attr.required]="isRequired ? 'required' : null" [attr.readonly]="isReadonly ? 'readonly' : null"
232
+ [attr.disabled]="isDisabled ? 'disabled' : null" [attr.aria-required]="isRequired"
233
+ [attr.aria-invalid]="getControl('start')?.invalid && getControl('start')?.touched"
234
+ [attr.aria-describedby]="getControl('start')?.invalid && getControl('start')?.touched ? 'error-' + name : null" />
235
+
236
+ <button *ngIf="getControl('start')?.value" type="button" class="btn btn-secondary btn-clear-field"
237
+ (click)="onClearFieldPeriod('start')">
238
+ &times;
239
+ </button>
240
+
241
+ @if (!inTableFilter) {
242
+ <span class="input-group-text text-lowercase" [class.disabled]="isDisabled ? 'disabled' : null">
243
+ {{ type === typeField.timeToTime ? ('_COMMON._DATES.TO' | translate) : ('_COMMON._DATES.FROM_TO_2' | translate) }}
244
+ </span>
245
+ }
246
+
247
+ <input [type]="getInputType()" class="form-control" [id]="name + '_end'" [formControl]="getControl('end')"
248
+ [attr.placeholder]="inTableFilter ? (type === typeField.timeToTime ? ('_COMMON._DATES.TO' | translate) : ('_COMMON._DATES.FROM_TO_2' | translate)) : null"
249
+ [ngClass]="[(cssClass || ''), getControl('end')?.value ? 'has-value' : '']"
250
+ [attr.required]="isRequired ? 'required' : null" [attr.readonly]="isReadonly ? 'readonly' : null"
251
+ [attr.disabled]="isDisabled ? 'disabled' : null"
252
+ [attr.aria-invalid]="getControl('end')?.invalid && getControl('end')?.touched"
253
+ [attr.aria-describedby]="getControl('end')?.invalid && getControl('end')?.touched ? 'error-' + name : null" />
254
+
255
+ <button *ngIf="getControl('end')?.value" type="button" class="btn btn-secondary btn-clear-field"
256
+ (click)="onClearFieldPeriod('end')">
257
+ &times;
258
+ </button>
259
+ </div>
260
+ }
261
+
262
+ @if ([typeField.datePlusOne, typeField.datePlusTwo, typeField.datePlusSeven, typeField.dateComplexe].includes(type)) {
263
+ <div class="input-group">
264
+
265
+ @if (type === typeField.dateComplexe) {
266
+ <button class="btn btn-secondary btn-clear-field" type="button" (click)="onDateAddDay('prev')"
267
+ [attr.disabled]="isDisabled ? 'disabled' : null">
268
+ <app-icon font="optyweb" icon="cw-nav-next-left" [withOnlyIcon]="true" [label]="'Jour précédent'"></app-icon>
269
+ </button>
270
+ }
271
+
272
+ <input type="date" class="form-control" [id]="name" [formControl]="formControl"
273
+ [ngClass]="[(cssClass || ''), formControl?.value ? 'has-value' : '']"
274
+ [attr.placeholder]="placeholder ? placeholder : null" [attr.required]="isRequired ? 'required' : null"
275
+ [attr.readonly]="isReadonly ? 'readonly' : null" [disabled]="isDisabled"
276
+ [attr.aria-required]="isRequired" [attr.aria-invalid]="control.invalid && control.touched"
277
+ [attr.aria-describedby]="control.invalid && control.touched ? 'error-' + name : null" />
278
+ <button *ngIf="formControl?.value" class="btn btn-secondary btn-clear-field" type="button"
279
+ (click)="onClearField(formControl)">&times;</button>
280
+
281
+ @if (type === typeField.dateComplexe) {
282
+ <button class="btn btn-secondary btn-clear-field" type="button" (click)="onDateAddDay('next')"
283
+ [attr.disabled]="isDisabled ? 'disabled' : null">
284
+ <app-icon font="optyweb" icon="cw-nav-next-right" [withOnlyIcon]="true" [label]="'Jour suivant'"></app-icon>
285
+ </button>
286
+ <button class="btn btn-secondary btn-clear-field" type="button" (click)="onRefresh()"
287
+ [attr.disabled]="isDisabled ? 'disabled' : null">
288
+ <app-icon font="optyweb" icon="cw-toolbar-reload" [withOnlyIcon]="true" [label]="'Rafraîchir'"></app-icon>
289
+ </button>
290
+ }
291
+
292
+ <button class="btn btn-secondary btn-clear-field" type="button" (click)="onTodayAddDay(0)"
293
+ [attr.disabled]="isDisabled ? 'disabled' : null">
294
+ J
295
+ <span class="visually-hidden">Aujourd'hui</span>
296
+ </button>
297
+ <button class="btn btn-secondary btn-clear-field" type="button" (click)="onTodayAddDay(1)"
298
+ [attr.disabled]="isDisabled ? 'disabled' : null">
299
+ J+1
300
+ <span class="visually-hidden">Demain</span>
301
+ </button>
302
+
303
+ @if (type !== typeField.datePlusOne && type !== typeField.dateComplexe) {
304
+ <button class="btn btn-secondary btn-clear-field" type="button" (click)="onTodayAddDay(2)"
305
+ [attr.disabled]="isDisabled ? 'disabled' : null">
306
+ J+2
307
+ <span class="visually-hidden">Dans 2 jours</span>
308
+ </button>
309
+
310
+ @if (type !== typeField.datePlusTwo) {
311
+ <button class="btn btn-secondary btn-clear-field" type="button" (click)="onTodayAddDay(7)"
312
+ [attr.disabled]="isDisabled ? 'disabled' : null">
313
+ J+7
314
+ <span class="visually-hidden">Dans 7 jours</span>
315
+ </button>
316
+ }
317
+ }
318
+ </div>
319
+ }
320
+
321
+ @if (type === typeField.slider) {
322
+ <ngx-slider [(value)]="sliderValue" [options]="sliderOptions" [formControl]="formControl"></ngx-slider>
323
+ }
324
+
325
+ @if (inTableFilter && isInInputGroup()) {
326
+ <button class="btn btn-secondary btn-clear-field" type="button" (click)="onClearFieldFilter()">&times;</button>
327
+ }
328
+ @else if (isInInputGroup()) {
329
+ <button *ngIf="formControl?.value" class="btn btn-secondary btn-clear-field" type="button"
330
+ (click)="onClearField(formControl)">&times;</button>
331
+ }
332
+
333
+ </ng-template>
@@ -0,0 +1,24 @@
1
+ import { ComponentFixture, TestBed } from '@angular/core/testing';
2
+ import { FormFieldComponent } from './form-field.component';
3
+
4
+ describe('FormFieldComponent', () => {
5
+ let component: FormFieldComponent;
6
+ let fixture: ComponentFixture<FormFieldComponent>;
7
+
8
+ beforeEach(async () => {
9
+ await TestBed.configureTestingModule({
10
+ declarations: [ FormFieldComponent ]
11
+ })
12
+ .compileComponents();
13
+ });
14
+
15
+ beforeEach(() => {
16
+ fixture = TestBed.createComponent(FormFieldComponent);
17
+ component = fixture.componentInstance;
18
+ fixture.detectChanges();
19
+ });
20
+
21
+ it('should create', () => {
22
+ expect(component).toBeTruthy();
23
+ });
24
+ });