Commit b866ec4b authored by Hugo SUBTIL's avatar Hugo SUBTIL
Browse files

Merge remote-tracking branch 'origin/dev' into V2.0

parents cb52b0ce 54358748
Pipeline #31830 passed with stage
in 46 seconds
stages:
- sonar-analysis
- quality
- build
- deploy
......@@ -16,6 +16,8 @@ build_branch:
DOCKER_TLS_CERTDIR: ''
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
only:
- merge_requests
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
stage: build
except:
......@@ -103,36 +105,53 @@ deploy_rec:
environment:
name: rec
url: https://resin-rec.grandlyon.com
# code_analysis:
# image: skilldlabs/sonar-scanner:3.4.0
# services:
# - docker:18.09-dind
# stage: sonar-analysis
# only:
# - dev
# before_script:
# - export NODE_PATH=$NODE_PATH:`npm root -g`
# - npm install -g typescript
# script:
# - >
# sonar-scanner
# -Dsonar.projectName=${SONAR_PROJECT_KEY}
# -Dsonar.projectVersion=1.0
# -Dsonar.sourceEncoding=UTF-8
# -Dsonar.projectBaseDir=.
# -Dsonar.host.url=${SONAR_URL}
# -Dsonar.projectKey=${SONAR_PROJECT_KEY}
# -Dsonar.login=${SONAR_TOKEN}
# mr:
# variables:
# DOCKER_TLS_CERTDIR: ''
# DOCKER_HOST: tcp://docker:2375/
# DOCKER_DRIVER: overlay2
# image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09
# stage: build
# only:
# - merge_requests
# script:
# - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
# - docker build --pull -t "$CI_REGISTRY_IMAGE:dev" --build-arg conf=dev .
sonarqube:
stage: quality
only:
- dev
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/sonarsource/sonar-scanner-cli:4
variables:
SONAR_USER_HOME: '${CI_PROJECT_DIR}/.sonar' # Defines the location of the analysis task cache
GIT_DEPTH: '0' # T
cache:
key: '${CI_JOB_NAME}'
paths:
- .sonar/cache
script:
- >
sonar-scanner
-Dsonar.projectName=${SONAR_PROJECT_KEY}
-Dsonar.projectVersion=1.0
-Dsonar.sourceEncoding=UTF-8
-Dsonar.projectBaseDir=.
-Dsonar.host.url=${SONAR_URL}
-Dsonar.projectKey=${SONAR_PROJECT_KEY}
-Dsonar.login=${SONAR_TOKEN}
-Dsonar.cpd.exclusions=tests/**,src/**/*.spec.ts*
-Dsonar.qualitygate.wait=true
sonarqube-mr:
stage: quality
only:
- merge_requests
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/sonarsource/sonar-scanner-cli:4
variables:
SONAR_USER_HOME: '${CI_PROJECT_DIR}/.sonar' # Defines the location of the analysis task cache
GIT_DEPTH: '0' # T
cache:
key: '${CI_JOB_NAME}'
paths:
- .sonar/cache
script:
- >
sonar-scanner
-Dsonar.projectName=${SONAR_PROJECT_KEY}
-Dsonar.projectVersion=1.0
-Dsonar.sourceEncoding=UTF-8
-Dsonar.projectBaseDir=.
-Dsonar.host.url=${SONAR_URL}
-Dsonar.projectKey=${SONAR_PROJECT_KEY}
-Dsonar.login=${SONAR_MR_TOKEN}
-Dsonar.cpd.exclusions=tests/**,src/**/*.spec.ts*
-Dsonar.qualitygate.wait=true
......@@ -39,6 +39,39 @@ All notable changes to this project will be documented in this file. See [standa
* **style:** button hover ([122fcfc](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/122fcfc1412282af29734f33985f375b83606b30))
* **style:** update button style ([c8ade31](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/c8ade31b7d4f187a2c9cb0db321dd5355e7ebb88))
### [1.16.3](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.16.2...v1.16.3) (2022-03-31)
### Bug Fixes
* **orientation:** broken layout ([67c6b23](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/67c6b23945b60b5f0fbc76d50f5b213deab7be61))
* **orientation:** issue on height ([87f8ea5](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/87f8ea5c59c2dbadb963d7e2fa5359375d47a2d7))
* **orientation:** map height ([cd75ee2](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/cd75ee22bee5e241624cd200b6e066794faa1634))
### [1.16.2](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.16.1...v1.16.2) (2022-03-31)
### Bug Fixes
* **news:** broken layout with double scroll ([44757f6](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/44757f619e9f23535cbf9c2dba502c6066732728))
### [1.16.1](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.16.0...v1.16.1) (2022-03-29)
### Features
* **cicd:** temp remove of mr jobs ([5c9a74a](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/5c9a74ad2916b986a7626ffb8726db3260d8990a))
* **posts:** add button to show more ([0211de8](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/0211de8fe54ad9c1b494b824ba59183041b9f91f))
* **posts:** restore window scroll service ([3a4b521](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/3a4b521cf5106f8175897d2c09a8963d56d279dc))
### Bug Fixes
* default limit ([2a9a707](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/2a9a707fc98046d2313b64890485ecaef22439ee))
* no display if empty post ([44f089f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/44f089f9819b8d6dedafa39cd470adf38409a67b))
* **posts:** load more posts with tag (cf. MR !225 ) ([2721c9e](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/2721c9e9f86610e43455a1e6ba9d12415c91f29e))
* **posts:** remove scroll service from app component ([6a7d319](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/commit/6a7d319061ee4c4ea6e6d4b32a32b86039844e14))
## [1.16.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/compare/v1.15.0...v1.16.0) (2022-03-18)
......
......@@ -5,12 +5,14 @@
[![Security Rating](https://sonarqube.forge.grandlyon.com/api/project_badges/measure?project=pamn_client&metric=security_rating)](https://sonarqube.forge.grandlyon.com/dashboard?id=pamn_client)
[![Vulnerabilities](https://sonarqube.forge.grandlyon.com/api/project_badges/measure?project=pamn_client&metric=vulnerabilities)](https://sonarqube.forge.grandlyon.com/dashboard?id=pamn_client)
# Pamn
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.1.3.
## Wikis
Find [here](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_client/-/wikis/home) wikis about useful informations like installation and gitflow.
## Development server
Run `npm start` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files.
......@@ -35,12 +37,16 @@ Run `npm run e2e` to execute the end-to-end tests via [Protractor](http://www.pr
Use conventional commit format. For more info please read this article on [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/)
## Documentation
## Documentation
A documentation is generated with compodoc in addition of the existing documentation on the wiki.
```sh
npm run doc:serve
```
You can now visualize it at : `localhost:8080`
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md).
import { Component } from '@angular/core';
import { User } from '../../../models/user.model';
import { AdminService } from '../../services/admin.service';
import { DeleteUserComponent } from './delete-user/delete-user.component';
import { AdministredStructuresComponent } from './administred-structures/administred-structures.component';
import { DeleteUserComponent } from './delete-user/delete-user.component';
@Component({
selector: 'app-admin-manage-users',
......@@ -105,7 +105,7 @@ export class ManageUsersComponent {
public findAttachedUsers(): void {
this.adminService.getAttachedUsers().subscribe((users) => {
this.attachedUsers = users;
this.attachedUsers.map((user) => {
this.attachedUsers.forEach((user) => {
user._id = user['id'];
});
});
......@@ -120,7 +120,7 @@ export class ManageUsersComponent {
public findUnVerifiedUsers(): void {
this.adminService.getUnVerifiedUsers().subscribe((users) => {
this.unVerifiedUsers = users;
this.unVerifiedUsers.map((user) => {
this.unVerifiedUsers.forEach((user) => {
user._id = user['id'];
});
});
......
<div class="app-container">
<app-header></app-header>
<div (scroll)="onScrollDown($event)" class="app-body">
<div class="app-body">
<router-outlet></router-outlet>
<router-outlet name="print"></router-outlet>
<router-outlet name="footer"></router-outlet>
......
......@@ -17,7 +17,7 @@
overflow-y: auto;
overflow-x: hidden;
position: relative;
height: calc(var(--vh, 1vh) * 100 - #{$header-height});
height: calc(100vh - #{$header-height});
}
.motif {
......
......@@ -5,7 +5,6 @@ import { AuthService } from './services/auth.service';
import { RouterListenerService } from './services/routerListener.service';
import { UpdateService } from './services/update.service';
import { PrintService } from './shared/service/print.service';
import { WindowScrollService } from './shared/service/windowScroll.service';
@Component({
selector: 'app-root',
......@@ -19,7 +18,6 @@ export class AppComponent implements OnInit {
public printService: PrintService,
private authService: AuthService,
private profilService: ProfileService,
private windowScrollService: WindowScrollService,
private routerListener: RouterListenerService,
private updateService: UpdateService,
private router: Router
......@@ -52,7 +50,4 @@ export class AppComponent implements OnInit {
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
}
public onScrollDown(event): void {
this.windowScrollService.scrollY.next(event);
}
}
......@@ -25,8 +25,15 @@
</div>
<div class="beneficiary">
<div class="informationHeader">{{ 'Bénéficiaire' | uppercase }}</div>
<!-- Name -->
<table class="beneficiaryNeeds">
<caption style="display: none">
Résumé du besoin de l'utilisateur pour impresion.
</caption>
<thead style="display: none">
<th>Résumé de besoin</th>
</thead>
<!-- Name -->
<tr>
<td class="informationHeader">Nom</td>
<td class="bold">{{ beneficiaryName }}</td>
......
<div id="body" *ngIf="!multiPrint" class="form" fxLayout="column">
<div
id="body"
*ngIf="!multiPrint"
class="form"
fxLayout="column"
[ngClass]="{ 'form-override': currentPage == pageTypeEnum.structuresSelection }"
>
<app-modal-confirmation
[openned]="showConfirmationModal"
[content]="'Il vous faudra de nouveau remplir le formulaire si vous quittez'"
......
......@@ -56,12 +56,17 @@
margin: 0 0.5em;
}
.form-override {
height: unset !important;
}
.form-footer {
padding: 17px 0;
width: 100%;
text-align: center;
z-index: calc($btn-phone-switch-map-list-z-index - 1);
background: $grey-8;
height: $footer-form-height;
}
.btnSwitch {
......@@ -84,7 +89,7 @@
}
.content {
min-height: 450px;
height: 100% !important;
background-color: $white;
margin-left: 25%;
margin-right: 24%;
......@@ -116,14 +121,6 @@
float: right;
height: 58vh;
padding: unset;
// height: 100%;
@media #{$tablet} {
height: 57vh !important;
}
@media #{$desktop} {
height: 100%;
}
::ng-deep .structure-card .structure {
margin-right: 16px;
......@@ -141,7 +138,6 @@
}
.progress-container {
margin-top: 1%;
margin-left: 25.5%;
width: 50%;
@media #{$tablet} {
......
import { stringify } from '@angular/compiler/src/util';
import { Component, EventEmitter, HostListener, OnInit, Output } from '@angular/core';
import { AbstractControl, Form, FormArray, FormControl, FormGroup, Validators } from '@angular/forms';
import { Component, HostListener, OnInit } from '@angular/core';
import { AbstractControl, FormArray, FormControl, FormGroup, Validators } from '@angular/forms';
import { Meta } from '@angular/platform-browser';
import { GeoJson } from '../../map/models/geojson.model';
import { Address } from '../../models/address.model';
import { OrientationFormFilters } from '../../models/orientation-filter.object';
import { Structure } from '../../models/structure.model';
......@@ -10,14 +8,13 @@ import { GeojsonService } from '../../services/geojson.service';
import { RouterListenerService } from '../../services/routerListener.service';
import { StructureService } from '../../services/structure.service';
import { CategoryEnum } from '../../shared/enum/category.enum';
import * as _ from 'lodash';
import { Category } from '../../structure-list/models/category.model';
import { Filter } from '../../structure-list/models/filter.model';
import { Module } from '../../structure-list/models/module.model';
import { SearchService } from '../../structure-list/services/search.service';
import { PageTypeEnum } from './pageType.enum';
import { Utils } from '../../utils/utils';
import { CustomRegExp } from '../../utils/CustomRegExp';
import { Utils } from '../../utils/utils';
import { PageTypeEnum } from './pageType.enum';
@Component({
selector: 'app-orientation-form',
......@@ -163,6 +160,7 @@ export class OrientationFormComponent implements OnInit {
numero: new FormControl(''),
street: new FormControl('', Validators.required),
commune: new FormControl('', Validators.required),
postcode: new FormControl(''),
}),
structureAccompaniment: new FormControl(orientationFormFilters.structureAccompaniment, Validators.required),
contactAccompanimentPhone: new FormControl(
......@@ -344,6 +342,7 @@ export class OrientationFormComponent implements OnInit {
this.getOrientationControl('address').get('numero').setValue(address.numero);
this.getOrientationControl('address').get('street').setValue(address.street);
this.getOrientationControl('address').get('commune').setValue(address.commune);
this.getOrientationControl('address').get('postcode').setValue(address.postcode);
this.userLocation = address.coordinates;
} else {
this.orientationForm.get('address').reset();
......@@ -441,7 +440,11 @@ export class OrientationFormComponent implements OnInit {
private setStructuresAndCoord(): void {
this.geoJsonService
.getCoord(this.orientationForm.value.address.numero, this.orientationForm.value.address.street, '69000')
.getCoord(
this.orientationForm.value.address.numero,
this.orientationForm.value.address.street,
this.orientationForm.value.address.postcode ? this.orientationForm.value.address.postcode : '69000'
)
.subscribe((res) => {
this.structureService.getStructures(this.filters.filter((elem) => elem.checked == true)).subscribe((data) => {
data.map((structure) => {
......@@ -518,6 +521,7 @@ export class OrientationFormComponent implements OnInit {
}
this.getOrientationControl('address').get('street').setValue(location.properties.street);
this.getOrientationControl('address').get('commune').setValue(location.properties.city);
this.getOrientationControl('address').get('postcode').setValue(location.properties.postcode);
this.setValidationsForm();
this.isLoading = false;
},
......
export class Address {
numero: string = null;
street: string = null;
commune: string = null;
coordinates? = [];
}
export class Address {
numero: string = null;
street: string = null;
commune: string = null;
postcode?: number = null;
coordinates? = [];
}
<div class="section-container no-padding" fxLayout="row" fxLayoutGap="32px">
<div *ngIf="isLoading" class="loader">
<img class="loader-gif" src="/assets/gif/loader_circle.gif" alt />
</div>
<div *ngIf="!isLoading" fxLayout="column" class="list-container" fxLayoutGap="16px">
<div fxLayout="column" class="list-container" fxLayoutGap="16px">
<!-- <div fxLayout="column" *ngIf="displayTags()">
<div fxLayout="row wrap" fxLayoutAlign="none center" fxLayoutGap="8px">
<div
......@@ -27,6 +24,14 @@
<app-post-card [post]="news" class="col" *ngFor="let news of allPosts"></app-post-card>
</div>
</div>
<div *ngIf="isLoading" class="loader">
<img class="loader-gif" src="/assets/gif/loader_circle.gif" alt />
</div>
<div *ngIf="!isLastPage && !isLoading" fxLayout="row" fxLayoutAlign="center center">
<button class="btn-primary small" (click)="loadMore()">
<div class="rowBtn" fxLayout="row" fxLayoutAlign="center center">Voir plus</div>
</button>
</div>
</div>
</div>
</div>
......@@ -27,9 +27,7 @@ h2 {
}
}
.list-container {
@media #{$tablet} {
width: 100%;
}
width: 100%;
h2 {
@media #{$large-phone} {
......@@ -239,3 +237,6 @@ h2 {
margin-bottom: 0;
}
}
.btn-primary {
margin-bottom: 20px;
}
import { Component, OnInit } from '@angular/core';
import { WindowScrollService } from '../../../shared/service/windowScroll.service';
import { TagEnum } from '../../enum/tag.enum';
import { Pagination } from '../../models/pagination.model';
import { Post } from '../../models/post.model';
......@@ -24,21 +23,9 @@ export class PostListComponent implements OnInit {
public pagination: Pagination;
public isLoading = false;
public isPublishMode = false;
public isLastPage: boolean;
constructor(
private postService: PostService,
private windowScrollService: WindowScrollService,
private route: ActivatedRoute,
private router: Router
) {
this.windowScrollService.scrollY$.subscribe((evt: any) => {
if (evt && evt.target.offsetHeight + evt.target.scrollTop >= evt.target.scrollHeight - 200) {
if (!this.isLoading) {
this.loadMore();
}
}
});
}
constructor(private postService: PostService, private route: ActivatedRoute, private router: Router) {}
ngOnInit(): void {
this.isLoading = true;
......@@ -77,12 +64,15 @@ export class PostListComponent implements OnInit {
*/
public fillArticles(news: PostWithMeta): void {
this.setNews(news);
news.meta.pagination.pages > news.meta.pagination.page ? (this.isLastPage = false) : (this.isLastPage = true);
const headLineTag = this.allPosts.filter((post: Post) =>
post.tags.some((tag) => tag && tag.slug === TagEnum.aLaUne)
);
const headIndex = this.allPosts.findIndex((post) => post.id === headLineTag[0].id);
this.allPosts.splice(headIndex, 1);
if (headLineTag.length) {
const headIndex = this.allPosts.findIndex((post) => post.id === headLineTag[0].id);
this.allPosts.splice(headIndex, 1);
}
this.allPosts = [...headLineTag, ..._.difference(this.allPosts, headLineTag)];
}
......@@ -127,12 +117,12 @@ export class PostListComponent implements OnInit {
// Transform excerpt post to have a custom author.
private addAuthorToPost(post: Post): Post {
post.author = post.excerpt;
post.excerpt = post.html.replace(/<[^>]*>/g, '');
if (post.html) post.excerpt = post.html.replace(/<[^>]*>/g, '');
return post;
}
// Load more news on scroll event.
private loadMore(): void {
public loadMore(): void {
if (this.pagination && this.pagination.page < this.pagination.pages) {
this.isLoading = true;
if (this.filters) {
......@@ -148,10 +138,8 @@ export class PostListComponent implements OnInit {
// Split news on two columns on desktop mode or one column in mobile mode.
private setNews(news: PostWithMeta): void {
this.pagination = news.meta.pagination;
const customIndex = this.allPosts.length; // For scroll loading, start with previous index.
const newPosts = news.posts.map((val, index) => {
const newPosts = news.posts.map((val) => {
val = this.addAuthorToPost(val);
index += customIndex;
return val;
});
this.allPosts = [...this.allPosts, ...newPosts];
......
......@@ -22,9 +22,11 @@ export class PostService {
);
}
public getPosts(page: number, tags?: string[]): Observable<PostWithMeta> {
/**
* 12 posts to fit new design (1 + 3 + 2 + 1 + 3 + 2)
*/
public getPosts(page: number, tags?: string[], limit: string = '12'): Observable<PostWithMeta> {
let tagsFilter = '';
if (tags) {
let tagsString = '';
// Transform tab filters to string filters
......@@ -37,7 +39,7 @@ export class PostService {
tagsFilter = `&filter=tags:${encodeURIComponent(tagsString)}`;
}
return this.http.get<PostWithMeta>(`${this.baseUrl}?page=${page}&include=tags,authors${tagsFilter}`);
return this.http.get<PostWithMeta>(`${this.baseUrl}?page=${page}&include=tags,authors${tagsFilter}&limit=${limit}`);
}
public getTags(): Observable<TagWithMeta> {
......@@ -46,7 +48,7 @@ export class PostService {
private addAuthorToPost(post: Post): Post {
post.author = post.excerpt;
post.excerpt = post.html.replace(/<[^>]*>/g, '');
if (post.html) post.excerpt = post.html.replace(/<[^>]*>/g, '');
return post;
}
}
......@@ -59,6 +59,7 @@ export class AddressAutocompleteComponent implements OnInit {
address.numero = hit.properties.housenumber ? hit.properties.housenumber : null;
address.commune = hit.properties.city;
address.coordinates = hit.geometry.coordinates;
address.postcode = hit.properties.postcode;
if (hit.properties.street) {
address.street = hit.properties.street;
} else {
......
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ReactiveFormsModule } from '@angular/forms';
import { of } from 'rxjs';
import { GeoJson } from '../../../map/models/geojson.model';
import { GeojsonService } from '../../../services/geojson.service';
import { TypeModal } from '../../enum/typeModal.enum';
import { Filter } from '../../models/filter.model';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { StructureListSearchComponent } from './structure-list-search.component';
import { Module } from '../../models/module.model';
import { TypeModal } from '../../enum/typeModal.enum';
import { GeojsonService } from '../../../services/geojson.service';
import { GeoJson } from '../../../map/models/geojson.model';
import { of } from 'rxjs';
import { StructureListSearchComponent } from './structure-list-search.component';
describe('StructureListSearchComponent', () => {
let component: StructureListSearchComponent;
......@@ -104,7 +104,6 @@ describe('StructureListSearchComponent', () => {
const checkedModules: Module[] = [{ id: evt.target.value, text: categ, count: 0 }];
component.checkedModulesFilter = checkedModules;
component.externalCheckboxCheck(evt, categ);
new Module(evt.target.value, categ);
expect(component.checkedModulesFilter.length).toEqual(0);
expect(component.numberMoreFiltersChecked).toEqual(0);