diff --git a/src/frontend/app/app-common.module.ts b/src/frontend/app/app-common.module.ts index 78b69d50f3e92b11f57b13553c3f6119bb6a7509..f1b05a92455eb46a3b32660872b36206e6eb4f8b 100755 --- a/src/frontend/app/app-common.module.ts +++ b/src/frontend/app/app-common.module.ts @@ -79,6 +79,9 @@ import { LinkedResourceListComponent } from './linkedResource/linked-resource-li import { InternationalizationModule } from '../service/translate/internationalization.module'; import { TranslateService } from '@ngx-translate/core'; +import { RegisteredMailImportComponent } from '@appRoot/registeredMail/import/registered-mail-import.component'; + + @NgModule({ imports: [ CommonModule, @@ -100,6 +103,7 @@ import { TranslateService } from '@ngx-translate/core'; SearchHomeComponent, BasketHomeComponent, IndexingGroupModalComponent, + RegisteredMailImportComponent, SmdFabSpeedDialComponent, SmdFabSpeedDialTrigger, SmdFabSpeedDialActions, @@ -186,6 +190,7 @@ import { TranslateService } from '@ngx-translate/core'; providers: [], entryComponents: [ IndexingGroupModalComponent, + RegisteredMailImportComponent, AlertComponent, ConfirmComponent ], diff --git a/src/frontend/app/header/header-right.component.html b/src/frontend/app/header/header-right.component.html index 21df50a6ebeabb89305ac2e5ca78c0acccb5216e..f848893f0588fbb8d246601959474f944bf4ab7d 100644 --- a/src/frontend/app/header/header-right.component.html +++ b/src/frontend/app/header/header-right.component.html @@ -1,22 +1,4 @@ <div class="bg-head-title-tool"> - <!--<form *ngIf="!hideSearch" ngNoForm style="height: 40px;" name="choose_query" id="choose_query" method="post" - action="index.php?display=true&dir=indexing_searching&page=search_adv_result"> - <input type="hidden" name="meta[]" value="baskets_clause#baskets_clause#select_simple"> - <input type="hidden" name="meta[]" value="welcome#welcome#welcome"> - <input type="hidden" name="baskets_clause" value="true"> - <mat-form-field floatLabel="never" style="width:100%;margin-top: -3px;margin-left:-13px;font-size: 12px;" *ngIf="privilegeService.hasCurrentUserPrivilege('adv_search_mlb')"> - <input #searchInput="matInput" matInput type="text" (blur)="hideSearch = !hideSearch" name="welcome" title="{{'lang.searchMails' | translate}}" placeholder="{{'lang.searchMails' | translate}}"> - <button mat-icon-button matSuffix *ngIf="!appService.getViewMode()" style="opacity:0.5;"> - <mat-icon class="fa fa-search" style="font-size:22px;"></mat-icon> - </button> - </mat-form-field> - <input #searchHome type="submit" name="submit" value="" style="display:none;"> - </form> - - <button title="{{'lang.quickSearchInfo' | translate}} : {{'lang.quickSearchTarget' | translate}}" (click)="showSearchInput()" mat-icon-button *ngIf="hideSearch && privilegeService.hasCurrentUserPrivilege('adv_search_mlb')" - style="opacity:0.5;"> - <mat-icon class="fa fa-search" style="font-size:22px;"></mat-icon> - </button>--> <form *ngIf="hideSearchBar()" (ngSubmit)="goTo()" #criteriaFormUp="ngForm"> <mat-form-field floatLabel="never" class="basket-search"> <input class="metaSearch" type="text" matInput diff --git a/src/frontend/app/header/header-right.component.ts b/src/frontend/app/header/header-right.component.ts index 2fd2fa2f9f9b6c988b55342cf23c17fc2b2a3048..a4eef0a90c9634b1f53213d71528112e5fb8ea75 100644 --- a/src/frontend/app/header/header-right.component.ts +++ b/src/frontend/app/header/header-right.component.ts @@ -10,6 +10,8 @@ import { AppService } from '../../service/app.service'; import { PrivilegeService } from '../../service/privileges.service'; import { FunctionsService } from '../../service/functions.service'; import { AuthService } from '../../service/auth.service'; +import { RegisteredMailImportComponent } from '@appRoot/registeredMail/import/registered-mail-import.component'; + @Component({ selector: 'header-right', @@ -47,7 +49,18 @@ export class HeaderRightComponent implements OnInit { this.config = { panelClass: 'maarch-modal', data: { indexingGroups: shortcut.groups, link: shortcut.route } }; this.dialogRef = this.dialog.open(IndexingGroupModalComponent, this.config); } else if (shortcut.angular === true) { - this.router.navigate([shortcut.route]); + const component = shortcut.route.split('__'); + + if (component.length === 2) { + this.dialog.open(RegisteredMailImportComponent, { + disableClose: true, + width: '99vw', + maxWidth: '99vw', + panelClass: 'maarch-full-height-modal' + }); + } else { + this.router.navigate([shortcut.route]); + } } else { location.href = shortcut.route; } diff --git a/src/frontend/app/registeredMail/import/registered-mail-import.component.html b/src/frontend/app/registeredMail/import/registered-mail-import.component.html new file mode 100644 index 0000000000000000000000000000000000000000..67636d1039d748d738e1d34f913481405550b42a --- /dev/null +++ b/src/frontend/app/registeredMail/import/registered-mail-import.component.html @@ -0,0 +1,109 @@ +<div class="mat-dialog-content-container"> + <h1 mat-dialog-title>{{'lang.importRegisteredMails' | translate}}</h1> + <div mat-dialog-content> + <mat-toolbar class="import-tool" [class.hide]="csvData.length === 0 || loading"> + <span style="flex:1;"> + <mat-slide-toggle color="primary" [checked]="hasHeader" (change)="toggleHeader()"> + {{'lang.csvHeader' | translate}} + </mat-slide-toggle> + </span> + <span style="flex:1;text-align: center;"><i class="fa fa-users" + color="primary"></i> {{'lang.registeredMails' | translate}} : <b + color="primary">{{countAll}}</b> + </span> + </mat-toolbar> + <ng-container *ngIf="loading; else elseTemplate"> + <div class="loader"> + <mat-spinner></mat-spinner> + </div> + </ng-container> + <ng-template #elseTemplate> + <input type="file" name="files[]" #uploadFile id="uploadFile" (change)="uploadCsv($event)" accept=".csv" + style="display: none;"> + <div *ngIf="csvData.length === 0" appUploadFileDragDrop (click)="uploadFile.click()" + (onFileDropped)="dndUploadFile($event)" class="dndFile"> + <div> + {{'lang.dndFileCsvDesc' | translate}} + <mat-form-field appearance="outline" style="font-size:14px;" (click)="$event.stopPropagation()"> + <mat-label>{{'lang.delimiter' | translate}}</mat-label> + <mat-select [(ngModel)]="currentDelimiter" (click)="$event.stopPropagation()"> + <mat-option *ngFor="let delimiter of delimiters" [value]="delimiter"> + {{delimiter === '\t' ? 'TAB' : delimiter}} + </mat-option> + </mat-select> + </mat-form-field> + </div> + </div> + <div class="row" style="margin: 0px;"> + <div class="col-md-12"> + <mat-paginator #paginator [length]="100" [hidePageSize]="true" [pageSize]="10"> + </mat-paginator> + </div> + </div> + <div style="width:100%;box-shadow: inset 0px 0px 5px 0px rgba(0,0,0,0.75);padding:10px;"> + <div style="overflow: auto;"> + <mat-table *ngIf="csvData.length > 0" #table [dataSource]="dataSource" + [style.width.px]="contactColumns.length * 300"> + <ng-container *ngFor="let column of contactColumns;let i=index;"> + <ng-container [matColumnDef]="column.id"> + <mat-header-cell *matHeaderCellDef style="padding-left: 5px;padding-right: 5px;"> + <ng-container *ngIf="!column.form; else elseTemplate"> + <i class="fas fa-database" color="primary" + [title]="'lang.dbColumn' | translate"></i> <b color="primary" + [title]="'lang.dbColumn' | translate">{{column.label}}</b> + <i class="fas fa-arrows-alt-h"></i> + <i class="fas fa-file-csv" [title]="'lang.csvColumn' | translate"></i> + <mat-form-field [title]="'lang.csvColumn' | translate" + (click)="$event.stopPropagation()" style="width: 80px !important;"> + <mat-select [(ngModel)]="associatedColmuns[column.id]" + (selectionChange)="changeColumn(column, $event.value)"> + <mat-option value=""></mat-option> + <mat-option *ngFor="let col of csvColumns" [value]="col"> + {{col}} + </mat-option> + </mat-select> + </mat-form-field> + </ng-container> + <ng-template #elseTemplate> + <i class="fas fa-database" color="primary" + [title]="'lang.dbColumn' | translate"></i> <b color="primary" + [title]="'lang.dbColumn' | translate">{{column.label}}</b> + <i class="fas fa-arrows-alt-h"></i> + <i class="fas fa-file-csv" [title]="'lang.csvColumn' | translate"></i> + <mat-form-field [title]="'lang.csvColumn' | translate" + (click)="$event.stopPropagation()" style="width: 80px !important;"> + <mat-select [(ngModel)]="associatedColmuns[column.id]" + (selectionChange)="changeColumn(column, $event.value)"> + <mat-option *ngFor="let val of column.values" [value]="val"> + {{val.label}} + </mat-option> + </mat-select> + </mat-form-field> + </ng-template> + </mat-header-cell> + <mat-cell *matCellDef="let element" style="padding-left: 5px;padding-right: 5px;"> + <ng-container + *ngIf="column.emptyValueMode && functionsService.empty(element[column.id]); else elseTemplate"> + <i style="opacity: 0.5;">{{'lang.emptyValue' | translate}}</i> + </ng-container> + <ng-template #elseTemplate> + {{element[column.id]}} + </ng-template> + </mat-cell> + </ng-container> + </ng-container> + <mat-header-row *matHeaderRowDef="getcontactColumnsIds()"></mat-header-row> + <mat-row *matRowDef="let row; columns: getcontactColumnsIds();"></mat-row> + </mat-table> + </div> + </div> + </ng-template> + </div> + <span class="divider-modal"></span> + <div mat-dialog-actions class="actions"> + <button mat-raised-button mat-button *ngIf="csvData.length > 0" color="primary" [disabled]="loading" + (click)="onSubmit()">{{'lang.validate' | translate}}</button> + <button mat-raised-button mat-button [disabled]="loading" + [mat-dialog-close]="">{{'lang.cancel' | translate }}</button> + </div> +</div> \ No newline at end of file diff --git a/src/frontend/app/registeredMail/import/registered-mail-import.component.scss b/src/frontend/app/registeredMail/import/registered-mail-import.component.scss new file mode 100644 index 0000000000000000000000000000000000000000..54270b8b88185bea9367c28e8bd99160ef0e5362 --- /dev/null +++ b/src/frontend/app/registeredMail/import/registered-mail-import.component.scss @@ -0,0 +1,27 @@ +@import '../../../css/vars.scss'; + +.loader { + display: flex; + height: 100%; + align-items: center; + justify-content: center; +} + +.hide { + display: none; +} + +.import-tool { + font-size: 14px; +} + +.dndFile { + height: 100%; + display: flex; + align-items: center; + margin: 0px; + justify-content: center; + font-size: 30px; + opacity: 0.5 !important; + cursor: pointer; +} \ No newline at end of file diff --git a/src/frontend/app/registeredMail/import/registered-mail-import.component.ts b/src/frontend/app/registeredMail/import/registered-mail-import.component.ts new file mode 100644 index 0000000000000000000000000000000000000000..04a14d45eb2dfb2f56c5295470e2bbfaf5f019f6 --- /dev/null +++ b/src/frontend/app/registeredMail/import/registered-mail-import.component.ts @@ -0,0 +1,340 @@ +import { Component, OnInit, Inject, ViewChild } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { NotificationService } from '../../../service/notification/notification.service'; +import { MAT_DIALOG_DATA, MatDialogRef, MatDialog } from '@angular/material/dialog'; +import { TranslateService } from '@ngx-translate/core'; +import { MatTableDataSource } from '@angular/material/table'; +import { FunctionsService } from '../../../service/functions.service'; +import { ConfirmComponent } from '../../../plugins/modal/confirm.component'; +import { filter, exhaustMap, tap, catchError, map } from 'rxjs/operators'; +import { of } from 'rxjs/internal/observable/of'; +import { AlertComponent } from '../../../plugins/modal/alert.component'; +import { LocalStorageService } from '../../../service/local-storage.service'; +import { HeaderService } from '../../../service/header.service'; +import { MatPaginator } from '@angular/material/paginator'; +import { Papa } from 'ngx-papaparse'; +import { IndexingFieldsService } from '@service/indexing-fields.service'; + +@Component({ + templateUrl: 'registered-mail-import.component.html', + styleUrls: ['registered-mail-import.component.scss'] +}) +export class RegisteredMailImportComponent implements OnInit { + + loading: boolean = false; + + contactColumns: any[] = [ + { + id: 'registeredMail_reference', + label: this.translate.instant('lang.registeredMailReference'), + }, + { + id: 'company', + label: this.translate.instant('lang.contactsParameters_company'), + }, + { + id: 'civility', + label: this.translate.instant('lang.contactsParameters_civility'), + }, + { + id: 'firstname', + label: this.translate.instant('lang.contactsParameters_firstname'), + }, + { + id: 'lastname', + label: this.translate.instant('lang.contactsParameters_lastname'), + }, + { + id: 'department', + label: this.translate.instant('lang.contactsParameters_department'), + }, + { + id: 'addressAdditional1', + label: this.translate.instant('lang.contactsParameters_addressAdditional1'), + }, + { + id: 'addressNumber', + label: this.translate.instant('lang.contactsParameters_addressNumber'), + }, + { + id: 'addressStreet', + label: this.translate.instant('lang.contactsParameters_addressStreet'), + }, + { + id: 'addressAdditional2', + label: this.translate.instant('lang.contactsParameters_addressAdditional2'), + }, + { + id: 'addressPostcode', + label: this.translate.instant('lang.contactsParameters_addressPostcode'), + }, + { + id: 'addressTown', + label: this.translate.instant('lang.contactsParameters_addressTown'), + }, + { + id: 'addressCountry', + label: this.translate.instant('lang.contactsParameters_addressCountry'), + }, + ]; + + csvColumns: string[] = [ + + ]; + + delimiters = [';', ',', '\t']; + currentDelimiter = ';'; + + associatedColmuns: any = {}; + dataSource = new MatTableDataSource(null); + hasHeader: boolean = true; + csvData: any[] = []; + contactData: any[] = []; + countAll: number = 0; + countAdd: number = 0; + countUp: number = 0; + + @ViewChild(MatPaginator, { static: false }) paginator: MatPaginator; + + constructor( + public translate: TranslateService, + public http: HttpClient, + private notify: NotificationService, + public functionsService: FunctionsService, + private localStorage: LocalStorageService, + private headerService: HeaderService, + public dialog: MatDialog, + public dialogRef: MatDialogRef<RegisteredMailImportComponent>, + private papa: Papa, + public indexingFields: IndexingFieldsService, + @Inject(MAT_DIALOG_DATA) public data: any, + ) { + } + + ngOnInit(): void { + ['registeredMail_warranty', 'registeredMail_type', 'departureDate', 'registeredMail_letter'].forEach(element => { + console.log(element); + + const field = this.indexingFields.getField(element); + + this.contactColumns.unshift({ + id: field.identifier, + label: field.label, + values: field.values, + form: true + }); + + }); + + + console.log(this.contactColumns); + + + this.setConfiguration(); + // this.initCustomFields(); + } + + getcontactColumnsIds() { + return this.contactColumns.map(col => col.id); + } + + /*initCustomFields() { + this.http.get(`../rest/contactsCustomFields`).pipe( + map((data: any) => { + data = data.customFields.map(custom => { + return { + id: `contactCustomField_${custom.id}`, + label: custom.label, + type: custom.type + }; + }); + return data; + }), + tap((customFields) => { + this.contactColumns = this.contactColumns.concat(customFields); + }), + catchError((err: any) => { + this.notify.handleSoftErrors(err); + return of(false); + }) + ).subscribe(); + }*/ + + changeColumn(coldb: any, colCsv: string) { + this.contactData = []; + + for (let index = this.hasHeader ? 1 : 0; index < this.csvData.length; index++) { + const data = this.csvData[index]; + + const objContact = {}; + + this.contactColumns.forEach(key => { + objContact[key.id] = coldb === key.id ? data[this.csvColumns.filter(col => col === colCsv)[0]] : data[this.associatedColmuns[key.id]]; + }); + + this.contactData.push(objContact); + } + + this.countAdd = this.csvData.filter((data: any, index: number) => index > 0 && this.functionsService.empty(data[this.associatedColmuns['id']])).length; + this.countUp = this.csvData.filter((data: any, index: number) => index > 0 && !this.functionsService.empty(data[this.associatedColmuns['id']])).length; + + setTimeout(() => { + this.dataSource = new MatTableDataSource(this.contactData); + this.dataSource.paginator = this.paginator; + }, 0); + } + + uploadCsv(fileInput: any) { + if (fileInput.target.files && fileInput.target.files[0] && (fileInput.target.files[0].type === 'text/csv' || fileInput.target.files[0].type === 'application/vnd.ms-excel')) { + this.loading = true; + + let rawCsv = []; + const reader = new FileReader(); + + reader.readAsText(fileInput.target.files[0]); + + reader.onload = (value: any) => { + this.papa.parse(value.target.result, { + complete: (result) => { + // console.log('Parsed: ', result); + + rawCsv = result.data; + rawCsv = rawCsv.filter(data => data.length === rawCsv[0].length); + + let dataCol = []; + let objData = {}; + + this.setCsvColumns(rawCsv[0]); + this.countAll = this.hasHeader ? rawCsv.length - 1 : rawCsv.length; + + for (let index = 0; index < rawCsv.length; index++) { + objData = {}; + dataCol = rawCsv[index]; + dataCol.forEach((element: any, index2: number) => { + objData[this.csvColumns[index2]] = element; + }); + this.csvData.push(objData); + } + this.initData(); + this.countAdd = this.csvData.filter((data: any, index: number) => index > 0 && this.functionsService.empty(data[this.associatedColmuns['id']])).length; + this.countUp = this.csvData.filter((data: any, index: number) => index > 0 && !this.functionsService.empty(data[this.associatedColmuns['id']])).length; + this.localStorage.save(`importContactFields_${this.headerService.user.id}`, this.currentDelimiter); + + this.loading = false; + } + }); + }; + } else { + this.dialog.open(AlertComponent, { panelClass: 'maarch-modal', autoFocus: false, disableClose: true, data: { title: this.translate.instant('lang.notAllowedExtension') + ' !', msg: this.translate.instant('lang.file') + ' : <b>' + fileInput.target.files[0].name + '</b>, ' + this.translate.instant('lang.type') + ' : <b>' + fileInput.target.files[0].type + '</b><br/><br/><u>' + this.translate.instant('lang.allowedExtensions') + '</u> : <br/>' + 'text/csv' } }); + } + } + + setCsvColumns(headerData: string[] = null) { + if (headerData.filter(col => this.functionsService.empty(col)).length > 0) { + this.csvColumns = Object.keys(headerData).map((val, index) => `${index}`); + } else { + this.csvColumns = headerData; + } + } + + toggleHeader() { + this.hasHeader = !this.hasHeader; + this.countAll = this.hasHeader ? this.csvData.length - 1 : this.csvData.length; + if (this.hasHeader) { + this.countAdd = this.csvData.filter((data: any, index: number) => index > 0 && this.functionsService.empty(data[this.associatedColmuns['id']])).length; + this.countUp = this.csvData.filter((data: any, index: number) => index > 0 && !this.functionsService.empty(data[this.associatedColmuns['id']])).length; + } else { + this.countAdd = this.csvData.filter((data: any, index: number) => this.functionsService.empty(data[this.associatedColmuns['id']])).length; + this.countUp = this.csvData.filter((data: any, index: number) => !this.functionsService.empty(data[this.associatedColmuns['id']])).length; + } + this.initData(); + } + + initData() { + this.contactData = []; + for (let index = this.hasHeader ? 1 : 0; index < this.csvData.length; index++) { + const data = this.csvData[index]; + const objContact = {}; + + this.contactColumns.forEach((key, indexCol) => { + const indexCsvCol = this.csvColumns.indexOf(key.label); + this.associatedColmuns[key.id] = indexCsvCol > -1 ? this.csvColumns[indexCsvCol] : ''; + objContact[key.id] = indexCsvCol > -1 ? data[this.csvColumns[indexCsvCol]] : ''; + }); + this.contactData.push(objContact); + + } + setTimeout(() => { + this.dataSource = new MatTableDataSource(this.contactData); + this.dataSource.paginator = this.paginator; + }, 0); + } + + dndUploadFile(event: any) { + const fileInput = { + target: { + files: [ + event[0] + ] + } + }; + this.uploadCsv(fileInput); + } + + onSubmit() { + const dataToSend: any[] = []; + let confirmText = ''; + this.translate.get('lang.confirmImportContacts', { 0: this.countAll }).subscribe((res: string) => { + confirmText = `${res} ?<br/><br/>`; + // confirmText += `<ul><li><b>${this.countAdd}</b> ${this.translate.instant('lang.additions')}</li><li><b>${this.countUp}</b> ${this.translate.instant('lang.modifications')}</li></ul>`; + }); + let dialogRef = this.dialog.open(ConfirmComponent, { panelClass: 'maarch-modal', autoFocus: false, disableClose: true, data: { title: this.translate.instant('lang.import'), msg: confirmText } }); + dialogRef.afterClosed().pipe( + filter((data: string) => data === 'ok'), + tap(() => { + this.loading = true; + this.csvData.forEach((element: any, index: number) => { + if ((this.hasHeader && index > 0) || !this.hasHeader) { + const objContact = {}; + this.contactColumns.forEach((key) => { + if (element[this.associatedColmuns[key.id]] === undefined) { + objContact[key.id] = ''; + } else { + objContact[key.id] = element[this.associatedColmuns[key.id]]; + } + }); + dataToSend.push(objContact); + } + }); + console.log(dataToSend); + }), + /*exhaustMap(() => this.http.put(`../rest/contacts/import`, { contacts: dataToSend })), + tap((data: any) => { + let textModal = ''; + if (data.errors.count > 0) { + textModal += `<br/>${data.errors.count} ${this.translate.instant('lang.withErrors')} : <ul>`; + data.errors.details.forEach(element => { + textModal += `<li> ${this.translate.instant('lang.' + element.lang, { 0: element.langParam })} (${this.translate.instant('lang.line')} : ${this.hasHeader ? element.index + 2 : element.index + 1})</li>`; + }); + textModal += '</ul>'; + } + dialogRef = this.dialog.open(AlertComponent, { panelClass: 'maarch-modal', autoFocus: false, disableClose: true, data: { title: this.translate.instant('lang.import'), msg: '<b>' + data.success + '</b> / <b>' + this.countAll + '</b> ' + this.translate.instant('lang.importedContacts') + '.' + textModal } }); + }), + exhaustMap(() => dialogRef.afterClosed()),*/ + tap(() => { + this.dialogRef.close('success'); + }), + catchError((err: any) => { + this.loading = false; + this.notify.handleSoftErrors(err); + return of(false); + }) + ).subscribe(); + } + + setConfiguration() { + if (this.localStorage.get(`importContactFields_${this.headerService.user.id}`) !== null) { + this.currentDelimiter = this.localStorage.get(`importContactFields_${this.headerService.user.id}`); + } + } +} diff --git a/src/frontend/service/privileges.service.ts b/src/frontend/service/privileges.service.ts index 781168bcabbbb1b7dc1a76ae29d4199353f68641..126423e4cca8e46d84b0a7f84c4fcb3c39dbf5dc 100755 --- a/src/frontend/service/privileges.service.ts +++ b/src/frontend/service/privileges.service.ts @@ -530,6 +530,16 @@ export class PrivilegeService { 'unit': 'registeredMails', 'angular': true, 'shortcut': false + }, + { + 'id': 'registered_mail_mass_import', + 'label': 'lang.importRegisteredMails', + 'comment': 'lang.importRegisteredMails', + 'route': 'administration/contact/list/import/contact-import.component__modal', + 'style': 'fas fa-dolly-flatbed', + 'unit': 'registeredMails', + 'angular': true, + 'shortcut': false } ]; diff --git a/src/frontend/tsconfig.app.json b/src/frontend/tsconfig.app.json index e5652e102dd94fcf9f67277096c12a29332baf5d..aaa2f826811e7e2052af980a2dfe2d7d700af6a8 100755 --- a/src/frontend/tsconfig.app.json +++ b/src/frontend/tsconfig.app.json @@ -3,6 +3,14 @@ "compilerOptions": { "outDir": "../out-tsc/app", "baseUrl": "../../apps/maarch_entreprise/", + "paths": { + "@appRoot/*": [ + "../../src/frontend/app/*" + ], + "@service/*": [ + "../../src/frontend/service/*" + ] + } }, "files": [ "main.ts", diff --git a/src/frontend/tsconfig.json b/src/frontend/tsconfig.json index e80e8cc892384a9a4511330d5e7e2f1eba925370..a89ba2369f101cc8227f4f563e1fef207827bacb 100755 --- a/src/frontend/tsconfig.json +++ b/src/frontend/tsconfig.json @@ -14,10 +14,18 @@ "lib": [ "es2018", "dom" - ] + ], + "paths": { + "@appRoot/*": [ + "./app/*" + ], + "@service/*": [ + "./service/*" + ] + } }, "angularCompilerOptions": { "fullTemplateTypeCheck": true, "strictInjectionParameters": true } -} \ No newline at end of file +} diff --git a/src/lang/lang-fr.json b/src/lang/lang-fr.json index 3a41056c0449e3f9910ac068b301d04c7ac9b3cc..13c49d15fca96dda26b57bb7cc8e924bea2b6f1d 100644 --- a/src/lang/lang-fr.json +++ b/src/lang/lang-fr.json @@ -2014,5 +2014,6 @@ "contactInput" : "Champ contact", "issuingSiteSample": "MAARCH - Nanterre", "registeredMailReferenceSample": "01/01/2020 - Ma référence", - "registeredMailRecipientSample": "MAARCH-LES-BAINS PATRICIA PETIT" + "registeredMailRecipientSample": "MAARCH-LES-BAINS PATRICIA PETIT", + "importRegisteredMails": "Importer des recommandés" }