diff --git a/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.ts b/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.ts index abbd5b7477594358372d84b960f2865ac0914c28..8c5b1edcc726a67cb39e8244bbf6ab285828a222 100644 --- a/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.ts +++ b/src/frontend/app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component.ts @@ -93,6 +93,10 @@ export class IssuingSiteInputComponent implements OnInit { } } + getSiteLabel(id: string) { + return this.issuingSiteList.filter((site: any) => site.id === id)[0].label; + } + goTo() { window.open(`https://www.google.com/maps/search/${this.issuingSiteAddress.addressNumber}+${this.issuingSiteAddress.addressStreet},+${this.issuingSiteAddress.addressPostcode}+${this.issuingSiteAddress.addressTown},+${this.issuingSiteAddress.addressCountry}`, '_blank'); } diff --git a/src/frontend/app/adv-search/adv-search.component.html b/src/frontend/app/adv-search/adv-search.component.html index 2ec7d87c733a947c42892f8c6e263b6395046eeb..a97455d86d1ef2b495b1c3a182c2c47015e3eac7 100644 --- a/src/frontend/app/adv-search/adv-search.component.html +++ b/src/frontend/app/adv-search/adv-search.component.html @@ -45,7 +45,7 @@ <ng-container *ngIf="!isArrayType(critKey.value.values) && critKey.key !== 'meta'"> <span class="label badge-search" [title]="appCriteriaTool.getFormatLabel(critKey.value.values)" (click)="removeCriteria(critKey.key)"><i class="fa {{indexingFieldService.getField(critKey.key).icon}}" - [title]="indexingFieldService.getField(critKey.key).label"></i> {{appCriteriaTool.getFormatLabel(critKey.value.values)}} <i class="fa fa-times-circle"></i></span> + [title]="indexingFieldService.getField(critKey.key).label"></i> {{appCriteriaTool.getFormatLabel(critKey.key,critKey.value.values)}} <i class="fa fa-times-circle"></i></span> </ng-container> <ng-container *ngIf="!isArrayType(critKey.value.values) && critKey.key === 'meta'"> <span class="label badge-search" [title]="'meta'" (click)="removeCriteria(critKey.key)">{{critKey.value.values}} <i class="fa fa-times-circle"></i></span> diff --git a/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.html b/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.html index 2c570577fa23ceed79d3bf484fda5d022a38e70a..f5d52afaaf889612ba2107631c3d074b2e5bb4bd 100755 --- a/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.html +++ b/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.html @@ -9,7 +9,7 @@ <mat-autocomplete [class]="hideCriteriaList ? 'hide' : ''" #autoCriteria="matAutocomplete" (closed)="hideCriteriaList = true;" (optionSelected)="addCriteria($event.option.value)"> <mat-optgroup [label]="'Ajouter un critère de recherche'" class="criteria-list"> - <input matInput type="text" #searchCriteriaInput [formControl]="getFilterControl()" + <input type="text" #searchCriteriaInput [formControl]="getFilterControl()" style="margin-left:5px;width:150px !important;height: 20px;border: 1px solid #6666663d;padding: 10px;border-radius: 5px;" placeholder="{{'lang.filterBy' | translate}}"> <mat-option *ngIf="(getFilteredCriterias() | async)?.length===0" disabled>Aucun résultat</mat-option> @@ -81,11 +81,11 @@ </div>--> <div style="display: grid;align-items: start;grid-template-columns: repeat(2, 1fr);max-height: 300px;overflow: hidden;overflow-y: auto;"> - <div style="display: grid;align-items: baseline;grid-template-columns: 35% 60% 5%;" + <div style="display: grid;align-items: baseline;grid-template-columns: 35% 60% 5%;padding:5px;" *ngFor="let field of currentCriteria;let i=index"> <ng-container *ngIf="field.type === 'string'"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> <mat-form-field class="input-form" floatLabel="never"> <input [id]="field.identifier" type="text" matInput @@ -94,7 +94,7 @@ </ng-container> <ng-container *ngIf="field.type === 'integer'"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> <mat-form-field class="input-form" floatLabel="never"> <input [id]="field.identifier" type="number" matInput [formControl]="field.control" @@ -103,7 +103,7 @@ </ng-container> <ng-container *ngIf="['select', 'radio', 'checkbox'].indexOf(field.type) > -1"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> <plugin-select-search [id]="field.identifier" [showResetOption]="true" [label]="field.label" [placeholderLabel]="'lang.chooseValue' | translate" [formControlSelect]="field.control" @@ -112,7 +112,7 @@ </ng-container> <ng-container *ngIf="['selectAutocomplete'].indexOf(field.type) > -1"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> <plugin-select-autocomplete-search #pluginSelectAutocompleteSearch [id]="field.identifier" [showResetOption]="true" [label]="field.label" @@ -123,7 +123,7 @@ </ng-container> <ng-container *ngIf="field.type === 'date'"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> <mat-form-field class="input-form input-date" floatLabel="never" (click)="picker.open()" style="cursor:pointer;"> @@ -139,63 +139,61 @@ <mat-date-range-picker #picker></mat-date-range-picker> </mat-form-field> </ng-container> - <ng-container *ngIf="['senders','recipients'].indexOf(field.identifier) > -1"> + <ng-container *ngIf="['senders','recipients'].indexOf(field.identifier) > -1 || field.type === 'contact'"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> - <app-contact-autocomplete [id]="field.identifier" [control]="field.control" + <app-contact-autocomplete #appContactAutocomplete [id]="field.identifier" [control]="field.control" style="width:100%;"> </app-contact-autocomplete> </ng-container> <ng-container *ngIf="field.identifier === 'folders'"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> - <app-folder-input [control]="field.control" style="width:100%;"> + <app-folder-input #appFolderInput [control]="field.control" style="width:100%;"> </app-folder-input> </ng-container> <ng-container *ngIf="field.identifier === 'tags'"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> - <app-tag-input [control]="field.control" style="width:100%;"> + <app-tag-input #appTagInput [control]="field.control" style="width:100%;"> </app-tag-input> </ng-container> <ng-container *ngIf="field.type === 'banAutocomplete'"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> <app-address-ban-input [control]="field.control" style="width:100%;"> </app-address-ban-input> </ng-container> <ng-container *ngIf="field.identifier === 'registeredMail_issuingSite'"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> <app-issuing-site-input #appIssuingSiteInput [control]="field.control" style="width:100%;"> </app-issuing-site-input> </ng-container> <ng-container *ngIf="field.identifier === 'registeredMail_recipient'"> <span class="criteria-label"> - <i class="fa {{field.icon}}"></i> {{field.label}} <sup class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : + <i class="fa {{field.icon}}"></i> {{field.label}} <sup color="primary" class="searchInAttachments" *ngIf="searchInAttachments(field.identifier)" [title]="'lang.searchInAttachmentsInfo' | translate">(1)</sup> : </span> - <app-registered-mail-recipient-input #appRegisteredMailRecipientInput - [control]="field.control" style="width:100%;"> - </app-registered-mail-recipient-input> + <app-contact-autocomplete #appContactAutocomplete [id]="field.identifier" + [control]="field.control" [exclusion]="'?noUsers=true&noEntities=true&noContactsGroups=true'" style="width:100%;"> + </app-contact-autocomplete> </ng-container> - <button mat-icon-button type="button" matSuffix color="primary" + <button mat-icon-button type="button" matSuffix color="warn" (click)="$event.stopPropagation();removeCriteria(i)"> - <mat-icon class="fa fa-trash" style="color:white;"></mat-icon> + <mat-icon class="fa fa-trash"></mat-icon> </button> </div> </div> - <div - style="color: white;font-size: 12px;font-style: inherit;padding: 10px;opacity: 0.5;padding-top: 25px;"> + <div class="infoSearchDesc" style="padding-top: 25px;"> Les critères de recherche se cumulent sur la recherche rapide </div> - <div - style="color: white;font-size: 12px;font-style: inherit;padding: 10px;opacity: 0.5;"> - <sup>(1)</sup> {{'lang.searchInAttachmentsInfo' | translate}} + <div class="infoSearchDesc"> + <sup color="primary">(1)</sup> {{'lang.searchInAttachmentsInfo' | translate}} </div> </ng-container> <ng-template #loadingTemplate> diff --git a/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.scss b/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.scss index 764dfcc75a05413741c6fcae4532787029ae170a..9255b1af84fb9dfd8f94de76fec5197d51f0c2f2 100644 --- a/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.scss +++ b/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.scss @@ -61,6 +61,15 @@ color: white; } + ::ng-deep .mat-expansion-panel-content { + background: white; + border-radius: 30px; + } + + ::ng-deep .mat-expansion-panel-body { + padding-top: 5px; + } + ::ng-deep .mat-expansion-indicator::after { color: white; } @@ -85,7 +94,7 @@ .criteria-label { // width: 50%; text-align: right; - color: white; + color: #4A4A4A; white-space: pre; overflow: hidden; text-overflow: ellipsis; @@ -128,4 +137,11 @@ .searchInAttachments { cursor: help; +} + +.infoSearchDesc { + color: #4A4A4A; + font-size: 12px; + font-style: italic; + opacity: 0.8; } \ No newline at end of file diff --git a/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.ts b/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.ts index e46199d96976f3ee75c37d142cd765575b4c2efc..04fc87c0db53aaac1126d27f40a4c7a26ea7d915 100644 --- a/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.ts +++ b/src/frontend/app/adv-search/criteria-tool/criteria-tool.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild, ElementRef, EventEmitter, Output, Input } from '@angular/core'; +import { Component, OnInit, ViewChild, ElementRef, EventEmitter, Output, Input, QueryList, ViewChildren } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { TranslateService } from '@ngx-translate/core'; import { AppService } from '../../../service/app.service'; @@ -15,6 +15,11 @@ import { ConfirmComponent } from '../../../plugins/modal/confirm.component'; import { NotificationService } from '../../../service/notification/notification.service'; import { AddSearchTemplateModalComponent } from './search-template/search-template-modal.component'; import { DatePipe } from '@angular/common'; +import { ContactAutocompleteComponent } from '@appRoot/contact/autocomplete/contact-autocomplete.component'; +import { PluginSelectAutocompleteSearchComponent } from '@plugins/select-autocomplete-search/plugin-select-autocomplete-search.component'; +import { FolderInputComponent } from '@appRoot/folder/indexing/folder-input.component'; +import { TagInputComponent } from '@appRoot/tag/indexing/tag-input.component'; +import { IssuingSiteInputComponent } from '@appRoot/administration/registered-mail/issuing-site/indexing/issuing-site-input.component'; @Component({ selector: 'app-criteria-tool', @@ -44,6 +49,13 @@ export class CriteriaToolComponent implements OnInit { @ViewChild('criteriaTool', { static: false }) criteriaTool: MatExpansionPanel; @ViewChild('searchCriteriaInput', { static: false }) searchCriteriaInput: ElementRef; + @ViewChild('appFolderInput', { static: false }) appFolderInput: FolderInputComponent; + @ViewChild('appTagInput', { static: false }) appTagInput: TagInputComponent; + @ViewChild('appIssuingSiteInput', { static: false }) appIssuingSiteInput: IssuingSiteInputComponent; + + @ViewChildren('appContactAutocomplete') appContactAutocomplete: QueryList<ContactAutocompleteComponent>; + @ViewChildren('pluginSelectAutocompleteSearch') pluginSelectAutocompleteSearch: QueryList<PluginSelectAutocompleteSearchComponent>; + constructor( private _activatedRoute: ActivatedRoute, @@ -64,8 +76,6 @@ export class CriteriaToolComponent implements OnInit { } async ngOnInit(): Promise<void> { - // console.log('getAllFields()', await this.indexingFields.getAllFields()); - this.searchTermControl.setValue(this.searchTerm); this.criteria = await this.indexingFields.getAllFields(); @@ -192,14 +202,26 @@ export class CriteriaToolComponent implements OnInit { } - getLabelValue(identifier: string, value: string) { + getLabelValue(identifier: string, value: any) { if (this.functions.empty(value)) { return this.translate.instant('lang.undefined'); } else if (['doctype', 'destination'].indexOf(identifier) > -1) { return this.criteria.filter((field: any) => field.identifier === identifier)[0].values.filter((val: any) => val.id === value)[0].title; } else { + if (this.criteria.filter((field: any) => field.identifier === identifier)[0].type === 'contact' || this.criteria.filter((field: any) => field.identifier === identifier)[0].identifier === 'registeredMail_recipient') { + return this.appContactAutocomplete.toArray().filter((component: any) => component.id === identifier)[0].getFormatedContact(value.id); + } else + if (this.criteria.filter((field: any) => field.identifier === identifier)[0].identifier === 'folders') { + return this.appFolderInput.getFolderLabel(value); + } else + if (this.criteria.filter((field: any) => field.identifier === identifier)[0].identifier === 'tags') { + return this.appTagInput.getTagLabel(value); + } else + if (this.criteria.filter((field: any) => field.identifier === identifier)[0].type === 'banAutocomplete') { + return `${value.addressNumber} ${value.addressStreet}, ${value.addressTown} (${value.addressPostcode})`; + } else if (this.criteria.filter((field: any) => field.identifier === identifier)[0].type === 'selectAutocomplete') { - return 'toto'; + return this.pluginSelectAutocompleteSearch.toArray().filter((component: any) => component.id === identifier)[0].getDataLabel(value); } else { return this.criteria.filter((field: any) => field.identifier === identifier)[0].values.filter((val: any) => val.id === value)[0].label; @@ -207,12 +229,15 @@ export class CriteriaToolComponent implements OnInit { } } - getFormatLabel(value: any) { + getFormatLabel(identifier: string, value: any) { if (typeof value === 'object') { return `${this.datePipe.transform(value.start, 'dd/MM/y') } - ${this.datePipe.transform(value.end, 'dd/MM/y')}`; } else { - return value; - + if (identifier === 'registeredMail_issuingSite') { + return this.appIssuingSiteInput.getSiteLabel(value); + } else { + return value; + } } } @@ -236,7 +261,6 @@ export class CriteriaToolComponent implements OnInit { }); } else { field.control.setValue(criteria[field.identifier].values); - } } }); @@ -310,6 +334,38 @@ export class CriteriaToolComponent implements OnInit { }); } + set_status_field(elem: any) { + return new Promise((resolve, reject) => { + this.http.get(`../rest/statuses`).pipe( + tap((data: any) => { + elem.values = data.statuses.map((val: any) => { + return { + id: val.identifier, + label: val.label_status + }; + }); + resolve(true); + }) + ).subscribe(); + }); + } + + set_category_field(elem: any) { + return new Promise((resolve, reject) => { + this.http.get(`../rest/categories`).pipe( + tap((data: any) => { + elem.values = data.categories.map((val: any) => { + return { + id: val.id, + label: val.label + }; + }); + resolve(true); + }) + ).subscribe(); + }); + } + set_destination_field(elem: any) { return new Promise((resolve, reject) => { this.http.get(`../rest/indexingModels/entities`).pipe( diff --git a/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts b/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts index 846c548e471c668364045ecad943ee3f2430d983..347fef02cc87d15446cc2e72a4647dbd9aea9d27 100755 --- a/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts +++ b/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts @@ -373,4 +373,8 @@ export class ContactAutocompleteComponent implements OnInit { this.controlAutocomplete.setValue([]); this.valuesToDisplay = {}; } + + getFormatedContact(id: number) { + return this.contactService.formatContact(this.valuesToDisplay[id]); + } } diff --git a/src/frontend/app/folder/indexing/folder-input.component.ts b/src/frontend/app/folder/indexing/folder-input.component.ts index 11ffc42c8efbf8cf25186d35f1a57c056bd595f4..b3c6a5bc20f84e1679cab09f7d66c6c922019d86 100644 --- a/src/frontend/app/folder/indexing/folder-input.component.ts +++ b/src/frontend/app/folder/indexing/folder-input.component.ts @@ -13,7 +13,7 @@ import { LatinisePipe } from 'ngx-pipes'; @Component({ selector: 'app-folder-input', - templateUrl: "folder-input.component.html", + templateUrl: 'folder-input.component.html', styleUrls: [ 'folder-input.component.scss', '../../indexation/indexing-form/indexing-form.component.scss' @@ -23,7 +23,6 @@ import { LatinisePipe } from 'ngx-pipes'; export class FolderInputComponent implements OnInit { - loading: boolean = false; @@ -185,4 +184,8 @@ export class FolderInputComponent implements OnInit { }) ).subscribe(); } -} \ No newline at end of file + + getFolderLabel(id: string) { + return this.valuesToDisplay[id]; + } +} diff --git a/src/frontend/app/tag/indexing/tag-input.component.ts b/src/frontend/app/tag/indexing/tag-input.component.ts index 9b70dae7de49b05a7aef361f1190502c68c49c2a..b24fe3412eb505b772d32fc1b8cf22eb9dbc6b72 100644 --- a/src/frontend/app/tag/indexing/tag-input.component.ts +++ b/src/frontend/app/tag/indexing/tag-input.component.ts @@ -216,4 +216,8 @@ export class TagInputComponent implements OnInit { }) ).subscribe(); } + + getTagLabel(id: string) { + return this.valuesToDisplay[id]; + } } diff --git a/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.html b/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.html index 634a3231cdf3c5b65ee9af46dfddebdf2d488f57..f12dcc0c4050320c5d7ceda54f7783a3f812225b 100644 --- a/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.html +++ b/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.html @@ -6,15 +6,16 @@ <div class="mat-select-search-inner" [ngClass]="{'mat-select-search-inner-multiple': matSelect.multiple}"> - <input matInput id="searchSelectInput" [formControl]="formControlSearch" class="mat-select-search-input" + <input id="searchSelectInput" [formControl]="formControlSearch" class="mat-select-search-input" #searchSelectInput (keydown)="_handleKeydown($event)" (input)="onInputChange($event.target.value)" - (blur)="onBlur($event.target.value)" [placeholder]="'lang.search' | translate" /> - <button mat-button *ngIf="formControlSearch.value" mat-icon-button aria-label="Clear" (click)="_reset(true)" + (blur)="onBlur($event.target.value)" [placeholder]="'Saisissez un terme de recherche' | translate" /> + <button mat-button *ngIf="formControlSearch.value && !loadingSearch" mat-icon-button aria-label="Clear" (click)="_reset(true)" class="mat-select-search-clear"> <mat-icon class="fa fa-times"></mat-icon> </button> + <mat-spinner *ngIf="loadingSearch" class="mat-select-search-loading" diameter="24"></mat-spinner> </div> - <div *ngIf="value && _options?.length === 0 && datas.length > 5" class="mat-select-search-no-entries-found"> + <div *ngIf="noResult" class="mat-select-search-no-entries-found" style="font-style: italic;opacity: 0.5;"> {{'lang.noResult' | translate}} </div> <mat-option *ngIf="showResetOption" [value]="null"><i>({{'lang.emptyValue' | translate}})</i></mat-option> diff --git a/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.scss b/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.scss index 2204f82321129033a3eb05e1cf192d02721dc84e..3ab3270f9f20d4c15f360c6be68b34fb719fa305 100644 --- a/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.scss +++ b/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.scss @@ -35,7 +35,8 @@ $multiple-check-width: 33px; padding: $mat-menu-side-padding; padding-right: $mat-menu-side-padding + $clear-button-width; box-sizing: border-box; - + width: 100%; + border: none; } .mat-select-search-no-entries-found { @@ -48,6 +49,12 @@ $multiple-check-width: 33px; top: 4px; } +.mat-select-search-loading { + position: absolute; + right: 0; + top: 15px; +} + ::ng-deep.cdk-overlay-pane-select-search { /* correct offsetY so that the selected option is at the position of the select box when opening */ margin-top: -50px; diff --git a/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.ts b/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.ts index c406d6bc0c2c26635214040b03c31a719c14409c..f083f249c13438353f730c77b6be797b1aacec5d 100644 --- a/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.ts +++ b/src/frontend/plugins/select-autocomplete-search/plugin-select-autocomplete-search.component.ts @@ -8,7 +8,7 @@ import { import { ControlValueAccessor, FormControl } from '@angular/forms'; import { MatOption } from '@angular/material/core'; import { MatSelect } from '@angular/material/select'; -import { take, takeUntil, startWith, map, debounceTime, filter, tap, switchMap } from 'rxjs/operators'; +import { take, takeUntil, startWith, map, debounceTime, filter, tap, switchMap, finalize } from 'rxjs/operators'; import { Subject, ReplaySubject, Observable, forkJoin, of } from 'rxjs'; import { LatinisePipe } from 'ngx-pipes'; import { TranslateService } from '@ngx-translate/core'; @@ -99,6 +99,8 @@ export class PluginSelectAutocompleteSearchComponent implements OnInit, OnDestro formControlSearch = new FormControl(); selecteded: any = []; + noResult: boolean = null; + loadingSearch: boolean = null; /** Current search value */ get value(): string { @@ -145,6 +147,7 @@ export class PluginSelectAutocompleteSearchComponent implements OnInit, OnDestro if (opened) { // focus the search field when opening if (!this.appService.getViewMode()) { + this.noResult = null; this._focus(); } } else { @@ -177,6 +180,7 @@ export class PluginSelectAutocompleteSearchComponent implements OnInit, OnDestro .pipe( debounceTime(300), filter(value => value !== null && value.length > 2), + tap(() => this.loadingSearch = true), // distinctUntilChanged(), // tap(() => this.loading = true), switchMap((data: any) => this.getDatas(data)), @@ -192,6 +196,8 @@ export class PluginSelectAutocompleteSearchComponent implements OnInit, OnDestro }*/ this.datas = this.datas.filter((val: any) => this.formControlSelect.value.indexOf(val.id) > -1).concat(data.filter((val: any) => this.formControlSelect.value.indexOf(val.id) === -1)); this.filteredDatas = of(this.datas); + this.noResult = this.datas.filter((val: any) => this.formControlSelect.value.indexOf(val.id) === -1).length === 0; + this.loadingSearch = false; // this.loading = false; }) ).subscribe(); @@ -423,4 +429,8 @@ export class PluginSelectAutocompleteSearchComponent implements OnInit, OnDestro }) ); } + + getDataLabel(id: string) { + return this.datas.filter((item: any) => item.id === id)[0].label; + } } diff --git a/src/frontend/plugins/select-search/select-search.component.html b/src/frontend/plugins/select-search/select-search.component.html index 812ba3fcdebd40f3ca1cd78865773b2a05818e82..362fbb46e3c43f7df5ff2a5a8329f0d77406f7af 100644 --- a/src/frontend/plugins/select-search/select-search.component.html +++ b/src/frontend/plugins/select-search/select-search.component.html @@ -6,7 +6,7 @@ <div *ngIf="datas.length > 5" class="mat-select-search-inner" [ngClass]="{'mat-select-search-inner-multiple': matSelect.multiple}"> - <input matInput id="searchSelectInput" [formControl]="formControlSearch" class="mat-select-search-input" + <input id="searchSelectInput" [formControl]="formControlSearch" class="mat-select-search-input" #searchSelectInput (keydown)="_handleKeydown($event)" (input)="onInputChange($event.target.value)" (blur)="onBlur($event.target.value)" [placeholder]="this.translate.instant('lang.filterBy')" /> <button mat-button *ngIf="formControlSearch.value" mat-icon-button aria-label="Clear" (click)="_reset(true)" diff --git a/src/frontend/plugins/select-search/select-search.component.scss b/src/frontend/plugins/select-search/select-search.component.scss index 2204f82321129033a3eb05e1cf192d02721dc84e..f163de198fc6776d4db210fcf14689a96cc31b9e 100644 --- a/src/frontend/plugins/select-search/select-search.component.scss +++ b/src/frontend/plugins/select-search/select-search.component.scss @@ -35,7 +35,8 @@ $multiple-check-width: 33px; padding: $mat-menu-side-padding; padding-right: $mat-menu-side-padding + $clear-button-width; box-sizing: border-box; - + width: 100%; + border: none; } .mat-select-search-no-entries-found { diff --git a/src/frontend/service/indexing-fields.service.ts b/src/frontend/service/indexing-fields.service.ts index e9efaac88866aee1b0e358ea5c0b17983bf7ec9d..d07dcf0cbfe7eaea0cd6389ef1dd00a9942fb177 100644 --- a/src/frontend/service/indexing-fields.service.ts +++ b/src/frontend/service/indexing-fields.service.ts @@ -58,6 +58,27 @@ export class IndexingFieldsService { default_value: [], values: [], enabled: true, + indexingHide: true + }, + { + identifier: 'status', + label: this.translate.instant('lang.status'), + icon: 'fa-mail-bulk', + type: 'select', + default_value: [], + values: [], + enabled: true, + indexingHide: true + }, + { + identifier: 'category', + label: this.translate.instant('lang.category_id'), + icon: 'fa-map-signs', + type: 'select', + default_value: [], + values: [], + enabled: true, + indexingHide: true }, { identifier: 'creationDate', @@ -67,6 +88,7 @@ export class IndexingFieldsService { default_value: [], values: [], enabled: true, + indexingHide: true }, { identifier: 'recipients', diff --git a/src/frontend/tsconfig.app.json b/src/frontend/tsconfig.app.json index aaa2f826811e7e2052af980a2dfe2d7d700af6a8..8f0be6eb084a34342a5d9923f698dd3731652e3f 100755 --- a/src/frontend/tsconfig.app.json +++ b/src/frontend/tsconfig.app.json @@ -9,6 +9,9 @@ ], "@service/*": [ "../../src/frontend/service/*" + ], + "@plugins/*": [ + "../../src/frontend/plugins/*" ] } }, diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json index a89ba2369f101cc8227f4f563e1fef207827bacb..fcb8d22646a1614ac1f9fd17c27ea4c1a6699bf3 100755 --- a/src/frontend/tsconfig.json +++ b/src/frontend/tsconfig.json @@ -21,6 +21,9 @@ ], "@service/*": [ "./service/*" + ], + "@plugins/*": [ + "./plugins/*" ] } },