From 0337fb37867b64ce9d777d5de6df3d20fead3172 Mon Sep 17 00:00:00 2001 From: "florian.azizian" <florian.azizian@maarch.org> Date: Thu, 24 Sep 2020 18:48:28 +0200 Subject: [PATCH] FEAT #14539 TIME 3:15 Contact form for registeredMail recipient + countries list in contact form + short label in registeredMail sender --- .../controllers/RegisteredMailController.php | 5 ++ .../controllers/RegisteredMailTrait.php | 18 ++++++- .../page/form/contacts-form.component.html | 12 ++++- .../page/form/contacts-form.component.ts | 50 +++++++++++++++++-- .../contact-autocomplete.component.ts | 5 +- .../indexing-form.component.html | 5 +- .../indexing-form/indexing-form.component.ts | 8 +-- 7 files changed, 90 insertions(+), 13 deletions(-) diff --git a/src/app/registeredMail/controllers/RegisteredMailController.php b/src/app/registeredMail/controllers/RegisteredMailController.php index 4a81aa81c1a..b04bdc68069 100644 --- a/src/app/registeredMail/controllers/RegisteredMailController.php +++ b/src/app/registeredMail/controllers/RegisteredMailController.php @@ -35,6 +35,7 @@ use Slim\Http\Request; use Slim\Http\Response; use SrcCore\models\DatabaseModel; use SrcCore\models\ValidatorModel; +use User\models\UserModel; class RegisteredMailController { @@ -410,8 +411,12 @@ class RegisteredMailController public static function generateRegisteredMailPDf(array $args) { + $resource = ResModel::getById(['select' => ['typist'], 'resId' => $args['resId']]); + $primaryEntity = UserModel::getPrimaryEntityById(['select' => ['short_label'], 'id' => $resource['typist']]); + $sender = ContactController::getContactAfnor([ 'company' => $args['issuingSite']['label'], + 'firstname' => $primaryEntity['short_label'], 'address_number' => $args['issuingSite']['address_number'], 'address_street' => $args['issuingSite']['address_street'], 'address_additional1' => $args['issuingSite']['address_additional1'], diff --git a/src/app/registeredMail/controllers/RegisteredMailTrait.php b/src/app/registeredMail/controllers/RegisteredMailTrait.php index c942b22dba0..14b5e6a95e8 100644 --- a/src/app/registeredMail/controllers/RegisteredMailTrait.php +++ b/src/app/registeredMail/controllers/RegisteredMailTrait.php @@ -12,6 +12,7 @@ namespace RegisteredMail\controllers; +use Contact\models\ContactModel; use Parameter\models\ParameterModel; use RegisteredMail\models\IssuingSiteModel; use RegisteredMail\models\RegisteredMailModel; @@ -42,7 +43,22 @@ trait RegisteredMailTrait return ['errors' => ['R3 warranty is not allowed for type RW']]; } elseif (empty($args['data']['recipient']) || empty($args['data']['issuingSiteId'])) { return ['errors' => ['recipient or issuingSiteId is missing to print registered mail']]; - } elseif ((empty($args['data']['recipient']['company']) && (empty($args['data']['recipient']['lastname']) || empty($args['data']['recipient']['firstname']))) || empty($args['data']['recipient']['addressStreet']) || empty($args['data']['recipient']['addressPostcode']) || empty($args['data']['recipient']['addressTown']) || empty($args['data']['recipient']['addressCountry'])) { + } elseif (empty($args['data']['recipient'][0]['id'])) { + return ['errors' => ['recipient is empty']]; + } + + $args['data']['recipient'] = ContactModel::getById( + [ + 'select' => ['company', 'lastname', 'firstname', 'address_town as "addressTown"', 'address_number as "addressNumber"', 'address_street as "addressStreet"', 'address_country as "addressCountry"', 'address_postcode as "addressPostcode"', 'address_additional1 as addressAdditional1', 'address_additional2 as addressAdditional2', 'department'], + 'id' => $args['data']['recipient'][0]['id']] + ); + + if (empty($args['data']['recipient']['lastname']) && !empty($args['data']['recipient']['department'])) { + $args['data']['recipient']['lastname'] = $args['data']['recipient']['department']; + } + unset($args['data']['recipient']['department']); + + if ((empty($args['data']['recipient']['company']) && (empty($args['data']['recipient']['lastname']) || empty($args['data']['recipient']['firstname']))) || empty($args['data']['recipient']['addressStreet']) || empty($args['data']['recipient']['addressPostcode']) || empty($args['data']['recipient']['addressTown']) || empty($args['data']['recipient']['addressCountry'])) { return ['errors' => ['company and firstname/lastname, or addressStreet, addressPostcode, addressTown or addressCountry is empty in Recipient']]; } diff --git a/src/frontend/app/administration/contact/page/form/contacts-form.component.html b/src/frontend/app/administration/contact/page/form/contacts-form.component.html index 908068b6281..921466400dd 100644 --- a/src/frontend/app/administration/contact/page/form/contacts-form.component.html +++ b/src/frontend/app/administration/contact/page/form/contacts-form.component.html @@ -104,7 +104,7 @@ *ngIf="(field.unit === unit.id && unit.id !== 'address') || (field.unit === unit.id && unit.id === 'address' && !addressBANMode)"> <p mat-line class="contact-content" *ngIf="field.display"> <ng-container - *ngIf="field.type === 'string' && field.id !== 'communicationMeans' && field.id !== 'externalId_m2m'"> + *ngIf="field.type === 'string' && field.id !== 'communicationMeans' && field.id !== 'externalId_m2m' && field.id != 'addressCountry'"> <mat-form-field> <input matInput [formControl]="field.control" [placeholder]="field.label" (blur)="checkCompany(field);checkFilling();" (ngModelChange)="toUpperCase(field, $event)" [required]="field.required"> @@ -255,6 +255,16 @@ [innerHTML]="field.desc"></mat-hint> </mat-form-field> </ng-container> + <ng-container *ngIf="field.id === 'addressCountry'"> + <mat-form-field> + <input matInput #autoCompleteInput [formControl]="field.control" [placeholder]="field.label" [matAutocomplete]="matAutocompleteCountries"> + <mat-autocomplete #matAutocompleteCountries="matAutocomplete" isOpen="true" (optionSelected)="selectCountry($event)"> + <mat-option *ngFor="let country of countriesFilteredResult | async" [value]="country"> + {{country}} + </mat-option> + </mat-autocomplete> + </mat-form-field> + </ng-container> </p> <button *ngIf="field.display" [disabled]="!canDelete(field)" mat-icon-button matSuffix color="warn" (click)="removeField(field)"> diff --git a/src/frontend/app/administration/contact/page/form/contacts-form.component.ts b/src/frontend/app/administration/contact/page/form/contacts-form.component.ts index c3d8488b642..9bf36133dfc 100644 --- a/src/frontend/app/administration/contact/page/form/contacts-form.component.ts +++ b/src/frontend/app/administration/contact/page/form/contacts-form.component.ts @@ -6,7 +6,7 @@ import { HeaderService } from '../../../../../service/header.service'; import { MatSidenav } from '@angular/material/sidenav'; import { AppService } from '../../../../../service/app.service'; import { MatDialog } from '@angular/material/dialog'; -import { switchMap, catchError, filter, exhaustMap, tap, debounceTime, distinctUntilChanged, finalize, map } from 'rxjs/operators'; +import { switchMap, catchError, filter, exhaustMap, tap, debounceTime, distinctUntilChanged, finalize, map, startWith } from 'rxjs/operators'; import { FormControl, Validators, ValidatorFn } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; import { ContactService } from '../../../../../service/contact.service'; @@ -15,6 +15,7 @@ import { trigger, transition, style, animate } from '@angular/animations'; import { Observable } from 'rxjs/internal/Observable'; import { of } from 'rxjs/internal/observable/of'; import { environment } from '../../../../../environments/environment'; +import { LatinisePipe } from 'ngx-pipes'; @Component({ selector: 'app-contact-form', @@ -43,7 +44,10 @@ export class ContactsFormComponent implements OnInit { @ViewChild('snav2', { static: true }) public sidenavRight: MatSidenav; - + countries: any = []; + countriesFilteredResult: Observable<string[]>; + countryControl = new FormControl(); + loading: boolean = false; @Input() creationMode: boolean = true; @@ -304,7 +308,8 @@ export class ContactsFormComponent implements OnInit { public appService: AppService, public dialog: MatDialog, private contactService: ContactService, - public functions: FunctionsService + public functions: FunctionsService, + private latinisePipe: LatinisePipe ) { } ngOnInit(): void { @@ -333,6 +338,8 @@ export class ContactsFormComponent implements OnInit { this.initAutocompleteAddressBan(); this.initAutocompleteCommunicationMeans(); this.initAutocompleteExternalIdM2M(); + this.getCountries(); + this.initAutocompleteCountries(); }), finalize(() => this.loading = false), catchError((err: any) => { @@ -363,6 +370,8 @@ export class ContactsFormComponent implements OnInit { this.initAutocompleteAddressBan(); this.initAutocompleteCommunicationMeans(); this.initAutocompleteExternalIdM2M(); + this.getCountries(); + this.initAutocompleteCountries(); }), exhaustMap(() => this.http.get('../rest/contacts/' + this.contactId)), map((data: any) => { @@ -451,6 +460,41 @@ export class ContactsFormComponent implements OnInit { this.contactForm.filter(contact => contact.id === 'civility')[0].values = formatedCivilities; } + getCountries() { + this.http.get(`../rest/registeredMail/countries`).pipe( + tap((data: any) => { + this.countries = data.countries.map( + (item: any) => this.latinisePipe.transform(item.toUpperCase())); + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); + }) + ).subscribe(); + } + + initAutocompleteCountries() { + this.contactForm.map((field: any) => { + if (field.id === 'addressCountry') { + this.countriesFilteredResult = field.control.valueChanges + .pipe( + startWith(''), + map((value: any) => this._filter(value)) + ); + } + }); + } + + private _filter(value: string): string[] { + const filterValue = value.toLowerCase(); + return this.countries.filter((option: any) => option.toLowerCase().includes(filterValue)); + } + + selectCountry(ev: any) { + const indexFieldAddressCountry = this.contactForm.map(field => field.id).indexOf('addressCountry'); + this.contactForm[indexFieldAddressCountry].control.setValue(ev.option.value); + } + initCustomElementForm(data: any) { let valArr: ValidatorFn[] = []; diff --git a/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts b/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts index 776e94044bd..846c548e471 100755 --- a/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts +++ b/src/frontend/app/contact/autocomplete/contact-autocomplete.component.ts @@ -28,8 +28,6 @@ import { FunctionsService } from '../../../service/functions.service'; export class ContactAutocompleteComponent implements OnInit { - - loading: boolean = false; loadingValues: boolean = true; @@ -56,6 +54,7 @@ export class ContactAutocompleteComponent implements OnInit { @Input('control') controlAutocomplete: FormControl; @Input() id: string = 'contact-autocomplete'; + @Input() exclusion: string = ''; @Input() singleMode: boolean = false; @@ -156,7 +155,7 @@ export class ContactAutocompleteComponent implements OnInit { } getDatas(data: string) { - return this.http.get('../rest/autocomplete/correspondents', { params: { 'search': data } }); + return this.http.get('../rest/autocomplete/correspondents' + this.exclusion, { params: { 'search': data } }); } selectOpt(ev: any) { 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 f6cf72724df..b955edd081d 100644 --- a/src/frontend/app/indexation/indexing-form/indexing-form.component.html +++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.html @@ -212,7 +212,10 @@ </app-issuing-site-input> </ng-container> <ng-container *ngIf="field.identifier === 'registeredMail_recipient'"> - <app-registered-mail-recipient-input #appRegisteredMailRecipientInput [control]="arrFormControl[field.identifier]" [registeredMailType]="arrFormControl['registeredMail_type'].value" style="width:100%;"> + <app-contact-autocomplete *ngIf="mode === 'indexation'" [exclusion]="'?noUsers=true&noEntities=true&noContactsGroups=true'" [id]="field.identifier" [singleMode]="true" [control]="arrFormControl[field.identifier]" style="width:100%;" (retrieveDocumentEvent)="retrieveDocumentEvent.emit()"> + </app-contact-autocomplete> + + <app-registered-mail-recipient-input *ngIf="mode !== 'indexation'" #appRegisteredMailRecipientInput [control]="arrFormControl[field.identifier]" [registeredMailType]="arrFormControl['registeredMail_type'].value" style="width:100%;"> </app-registered-mail-recipient-input> </ng-container> </div> 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 90487d3fbcf..8b80f07744a 100755 --- a/src/frontend/app/indexation/indexing-form/indexing-form.component.ts +++ b/src/frontend/app/indexation/indexing-form/indexing-form.component.ts @@ -225,9 +225,9 @@ export class IndexingFormComponent implements OnInit { { identifier: 'registeredMail_recipient', label: this.translate.instant('lang.registeredMailRecipient'), - type: 'registeredMailRecipient', + type: 'autocomplete', default_value: null, - values: [], + values: ['/rest/autocomplete/correspondents'], enabled: true, }, { @@ -501,8 +501,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 if (element.identifier === 'registeredMail_recipient') { + // formatData[element.identifier] = this.appRegisteredMailRecipientInput.getFormatedAdress(); } else { formatData[element.identifier] = element.default_value; } -- GitLab