diff --git a/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.html b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.html new file mode 100644 index 0000000000000000000000000000000000000000..1a7bcec24aa14ca1f2ddd8b2f0ce17ef85e9c6bc --- /dev/null +++ b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.html @@ -0,0 +1,105 @@ +<mat-form-field appearance='outline' class="smallInput"> + <button mat-button matSuffix [matMenuTriggerFor]="menuDep" (click)="$event.stopPropagation();" + [title]="this.translate.instant('lang.targetDepartment')"> + {{addressBANCurrentDepartment}} <i class="fa fa-chevron-down"></i> + </button> + <mat-menu #menuDep="matMenu"> + <button mat-menu-item *ngFor="let dep of departmentList" + (click)="addressBANCurrentDepartment = dep">{{dep}}</button> + </mat-menu> + <mat-icon color="primary" class="fa fa-search" matPrefix style="font-size: 15px;"> + </mat-icon> + <input type="text" #autoCompleteInput [placeholder]="this.translate.instant('lang.searchAddressBan')" matInput + [formControl]="addressBANControl" [matAutocomplete]="auto" (click)="$event.stopPropagation()" + (focus)="resetAutocompleteAddressBan()" maxlength="128"> + <mat-autocomplete #auto="matAutocomplete" (optionSelected)="selectAddressBan($event)"> + <ng-container *ngIf="addressBANResult.length > 0 && !addressBANLoading"> + <mat-option *ngFor="let addressBANResult of addressBANFilteredResult | async" [value]="addressBANResult" [title]="addressBANResult.address"> + {{addressBANResult.address}} + </mat-option> + </ng-container> + <mat-option class="autoCompleteInfoResult smallInputInfo" + *ngIf="addressBANResult.length === 0 && !addressBANLoading" disabled [innerHTML]="addressBANInfo"> + </mat-option> + <mat-option *ngIf="addressBANLoading" disabled> + <mat-spinner diameter="20"></mat-spinner> + </mat-option> + </mat-autocomplete> +</mat-form-field> +<mat-card color="primary" *ngIf="manualAddress"> + <button mat-icon-button class="address-icon" (click)="manualAddress=!manualAddress" [title]="'Afficher l\'adresse'"> + <mat-icon class="fa fa-eye"></mat-icon> + </button> + <form style="display: contents;" (ngSubmit)="onSubmit()" [formGroup]="adminFormGroup"> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_company' | translate}}</mat-label> + <input matInput formControlName="company"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_civility' | translate}}</mat-label> + <input matInput formControlName="civility"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_firstname' | translate}}</mat-label> + <input matInput formControlName="firstname"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_lastname' | translate}}</mat-label> + <input matInput formControlName="lastname"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_addressNumber' | translate}}</mat-label> + <input matInput formControlName="addressNumber"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_addressStreet' | translate}}</mat-label> + <input matInput formControlName="addressStreet"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_addressAdditional1' | translate}}</mat-label> + <input matInput formControlName="addressAdditional1"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_addressAdditional2' | translate}}</mat-label> + <input matInput formControlName="addressAdditional2"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_addressPostcode' | translate}}</mat-label> + <input matInput formControlName="addressPostcode"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_addressTown' | translate}}</mat-label> + <input matInput formControlName="addressTown"> + </mat-form-field> + <mat-form-field floatLabel="always"> + <mat-label>{{'lang.contactsParameters_addressCountry' | translate}}</mat-label> + <input matInput formControlName="addressCountry"> + </mat-form-field> + </form> +</mat-card> +<mat-card color="primary" *ngIf="!manualAddress"> + <button mat-icon-button class="address-icon" (click)="manualAddress=!manualAddress" [title]="'Editer l\'adresse'"> + <mat-icon class="fa fa-edit"></mat-icon> + </button> + <div> + {{adminFormGroup.controls['company'].value}} + </div> + <div> + {{adminFormGroup.controls['civility'].value}} {{adminFormGroup.controls['firstname'].value}} {{adminFormGroup.controls['lastname'].value}} + </div> + <div> + {{adminFormGroup.controls['addressAdditional1'].value}} + </div> + <div> + {{adminFormGroup.controls['addressNumber'].value}} {{adminFormGroup.controls['addressStreet'].value}} + </div> + <div> + {{adminFormGroup.controls['addressAdditional2'].value}} + </div> + <div> + {{adminFormGroup.controls['addressPostcode'].value}} {{adminFormGroup.controls['addressTown'].value}} + </div> + <div> + {{adminFormGroup.controls['addressCountry'].value}} + </div> +</mat-card> \ No newline at end of file diff --git a/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.scss b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..cf8353dc8c7c7a807e69aecea94d6d232daed6f0 --- /dev/null +++ b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.scss @@ -0,0 +1,32 @@ +@import '../../../../css/vars.scss'; + +.smallInput { + width: 230px !important; + font-size: 11px; + + .mat-button { + width: 30px; + height: 25px; + color: $primary; + + ::ng-deep.mat-button-wrapper { + display: flex; + line-height: initial; + align-items: center; + } + } + + ::ng-deep.mat-form-field-infix { + padding: 0px; + padding-bottom: 5px; + } +} + +.address-icon { + cursor: pointer; + z-index: 2; + position: absolute; + right: 0px; + font-size: 14px; + top: 0px; +} \ No newline at end of file diff --git a/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.ts b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..61dc915b2b2038e01edf4b0d4ef7c47da676afa1 --- /dev/null +++ b/src/frontend/app/administration/registered-mail/indexing/recipient-input.component.ts @@ -0,0 +1,113 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, Validators, FormBuilder } from '@angular/forms'; +import { Observable } from 'rxjs/internal/Observable'; +import { HttpClient } from '@angular/common/http'; +import { TranslateService } from '@ngx-translate/core'; +import { NotificationService } from '../../../../service/notification/notification.service'; +import { tap, catchError, debounceTime, filter, distinctUntilChanged, switchMap } from 'rxjs/operators'; +import { of } from 'rxjs/internal/observable/of'; + +@Component({ + selector: 'app-registered-mail-recipient-input', + templateUrl: './recipient-input.component.html', + styleUrls: ['./recipient-input.component.scss'] +}) +export class RegisteredMailRecipientInputComponent implements OnInit { + + adminFormGroup: FormGroup; + manualAddress: boolean = false; + + addressBANInfo: string = ''; + addressBANMode: boolean = true; + addressBANControl = new FormControl(); + addressBANLoading: boolean = false; + addressBANResult: any[] = []; + addressBANFilteredResult: Observable<string[]>; + addressBANCurrentDepartment: string = '75'; + departmentList: any[] = []; + + constructor( + public translate: TranslateService, + public http: HttpClient, + private _formBuilder: FormBuilder, + private notify: NotificationService, + ) { } + + ngOnInit(): void { + this.initBanSearch(); + this.initAutocompleteAddressBan(); + this.adminFormGroup = this._formBuilder.group({ + company: ['', Validators.required], + civility: ['', Validators.required], + firstname: ['', Validators.required], + lastname: ['', Validators.required], + addressNumber: ['', Validators.required], + addressStreet: ['', Validators.required], + addressAdditional1: [''], + addressAdditional2: [''], + addressPostcode: ['', Validators.required], + addressTown: ['', Validators.required], + addressCountry: [''] + }); + } + + initBanSearch() { + this.http.get('../rest/ban/availableDepartments').pipe( + tap((data: any) => { + if (data.default !== null && data.departments.indexOf(data.default.toString()) !== - 1) { + this.addressBANCurrentDepartment = data.default; + } + this.departmentList = data.departments; + }), + catchError((err: any) => { + this.notify.handleErrors(err); + return of(false); + }) + ).subscribe(); + } + + initAutocompleteAddressBan() { + this.addressBANInfo = this.translate.instant('lang.autocompleteInfo'); + this.addressBANResult = []; + this.addressBANControl.valueChanges + .pipe( + debounceTime(300), + filter(value => value.length > 2), + distinctUntilChanged(), + tap(() => this.addressBANLoading = true), + switchMap((data: any) => this.http.get('../rest/autocomplete/banAddresses', { params: { 'address': data, 'department': this.addressBANCurrentDepartment } })), + tap((data: any) => { + if (data.length === 0) { + this.addressBANInfo = this.translate.instant('lang.noAvailableValue'); + } else { + this.addressBANInfo = ''; + } + this.addressBANResult = data; + this.addressBANFilteredResult = of(this.addressBANResult); + this.addressBANLoading = false; + }) + ).subscribe(); + } + + resetAutocompleteAddressBan() { + this.addressBANResult = []; + this.addressBANInfo = this.translate.instant('lang.autocompleteInfo'); + } + + selectAddressBan(ev: any) { + this.adminFormGroup.controls['addressNumber'].setValue(ev.option.value.number); + this.adminFormGroup.controls['addressStreet'].setValue(ev.option.value.afnorName); + this.adminFormGroup.controls['addressPostcode'].setValue(ev.option.value.postalCode); + this.adminFormGroup.controls['addressTown'].setValue(ev.option.value.city); + this.adminFormGroup.controls['addressCountry'].setValue('FRANCE'); + this.addressBANControl.setValue(''); + } + + getFormatedAdress() { + const formatedAddress = {}; + Object.keys(this.adminFormGroup.controls).forEach(key => { + formatedAddress[key] = this.adminFormGroup.controls[key].value; + }); + return formatedAddress; + } +} diff --git a/src/frontend/app/document-form.module.ts b/src/frontend/app/document-form.module.ts index ab67eefda918a3f4cedd4cc3c670720c319afeee..25b130d74dcad06a0f4f98d8cee6513b0cbbbd94 100644 --- a/src/frontend/app/document-form.module.ts +++ b/src/frontend/app/document-form.module.ts @@ -5,6 +5,7 @@ import { IndexingFormComponent } from './indexation/indexing-form/indexing-form. import { TagInputComponent } from './tag/indexing/tag-input.component'; import { FolderInputComponent } from '../app/folder/indexing/folder-input.component'; import { IssuingSiteInputComponent } from '../app/administration/registered-mail/issuing-site/indexing/issuing-site-input.component'; +import { RegisteredMailRecipientInputComponent } from '../app/administration/registered-mail/indexing/recipient-input.component'; import { InternationalizationModule } from '../service/translate/internationalization.module'; import { TranslateService } from '@ngx-translate/core'; @@ -18,13 +19,15 @@ import { TranslateService } from '@ngx-translate/core'; IndexingFormComponent, TagInputComponent, FolderInputComponent, - IssuingSiteInputComponent + IssuingSiteInputComponent, + RegisteredMailRecipientInputComponent ], exports: [ IndexingFormComponent, TagInputComponent, FolderInputComponent, - IssuingSiteInputComponent + IssuingSiteInputComponent, + RegisteredMailRecipientInputComponent ], entryComponents: [ ], diff --git a/src/frontend/app/indexation/indexation.component.ts b/src/frontend/app/indexation/indexation.component.ts index d87074287d2a17db8dbe1ebc405da2880586b756..fdbf414bdb1bd0c84be68e80b18b17de7b8ea45c 100644 --- a/src/frontend/app/indexation/indexation.component.ts +++ b/src/frontend/app/indexation/indexation.component.ts @@ -155,7 +155,7 @@ export class IndexationComponent implements OnInit { onSubmit() { if (this.indexingForm.isValidForm()) { this.actionService.loading = true; - const formatdatas = this.formatDatas(this.indexingForm.getDatas()); + const formatdatas = this.indexingForm.formatDatas(this.indexingForm.getDatas()); formatdatas['modelId'] = this.currentIndexingModel.master !== null ? this.currentIndexingModel.master : this.currentIndexingModel.id; formatdatas['chrono'] = true; @@ -271,7 +271,7 @@ export class IndexationComponent implements OnInit { } refreshDatas() { - this.appDocumentViewer.setDatas(this.formatDatas(this.indexingForm.getDatas())); + this.appDocumentViewer.setDatas(this.indexingForm.formatDatas(this.indexingForm.getDatas())); } } diff --git a/src/frontend/app/indexation/indexing-form/indexing-form.component.html b/src/frontend/app/indexation/indexing-form/indexing-form.component.html index cd934d94b07034b3668da650da99c9f428e76c0d..1533261e563249499d5c28bfd060cf4b2df55f97 100644 --- a/src/frontend/app/indexation/indexing-form/indexing-form.component.html +++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.html @@ -207,6 +207,10 @@ <app-issuing-site-input #appIssuingSiteInput [registedMailType]="arrFormControl['registeredMail_type'].value" [control]="arrFormControl[field.identifier]" (afterSelected)="launchEvent($event, field)" style="width:100%;"> </app-issuing-site-input> </ng-container> + <ng-container *ngIf="field.identifier === 'registeredMail_recipient'"> + <app-registered-mail-recipient-input #appRegisteredMailRecipientInput [control]="arrFormControl[field.identifier]" style="width:100%;"> + </app-registered-mail-recipient-input> + </ng-container> </div> <div class="fieldState"> <i class="fas fa-asterisk fieldRequired" diff --git a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts index 377bdcdfb4a83bf3886a3824ea2344b4c8c014fb..650e21b031ea8d3a02866008d6455e98696b5f7b 100755 --- a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts +++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts @@ -14,6 +14,7 @@ import { DiffusionsListComponent } from '../../diffusions/diffusions-list.compon import { FunctionsService } from '../../../service/functions.service'; import { ConfirmComponent } from '../../../plugins/modal/confirm.component'; import { IssuingSiteInputComponent } from '../../administration/registered-mail/issuing-site/indexing/issuing-site-input.component'; +import { RegisteredMailRecipientInputComponent } from '../../administration/registered-mail/indexing/recipient-input.component'; @Component({ selector: 'app-indexing-form', @@ -40,6 +41,7 @@ export class IndexingFormComponent implements OnInit { @ViewChild('appDiffusionsList', { static: false }) appDiffusionsList: DiffusionsListComponent; @ViewChild('appIssuingSiteInput', { static: false }) appIssuingSiteInput: IssuingSiteInputComponent; + @ViewChild('appRegisteredMailRecipientInput', { static: false }) appRegisteredMailRecipientInput: RegisteredMailRecipientInputComponent; fieldCategories: any[] = ['mail', 'contact', 'process', 'classifying']; @@ -222,7 +224,7 @@ export class IndexingFormComponent implements OnInit { { identifier: 'registeredMail_recipient', label: this.translate.instant('lang.registeredMailRecipient'), - type: 'string', + type: 'registeredMailRecipient', default_value: null, values: [], enabled: true, @@ -490,6 +492,8 @@ export class IndexingFormComponent implements OnInit { formatData['customFields'][element.identifier.split('_')[1]] = element.default_value; + } else if (element.identifier === 'registeredMail_recipient') { + formatData[element.identifier] = this.appRegisteredMailRecipientInput.getFormatedAdress(); } else { formatData[element.identifier] = element.default_value; }