diff --git a/src/app/template/controllers/TemplateController.php b/src/app/template/controllers/TemplateController.php index 40bf25dbb4613327385f49ff779103c4882c6d61..1a46812e9a3fbc9b50ab68c783dbf20b94aff6a7 100755 --- a/src/app/template/controllers/TemplateController.php +++ b/src/app/template/controllers/TemplateController.php @@ -114,15 +114,7 @@ class TemplateController $checkEntities = TemplateModel::checkEntities(['data' => $data]); if(!empty($checkEntities)){ - $listMessage = ''; - foreach($checkEntities as $entities){ - if($listMessage!='') { - $listMessage .= ", "; - } - $listMessage = $listMessage . $entities['value_field']; - } - $message = _TEMPLATE_ERROR_CHECK_ENTITIES . $data['template_attachment_type'] . ' : ' . $listMessage; - return $response->withStatus(400)->withJson(['errors' => $message]); + return $response->withJson(['checkEntities' => $checkEntities]); } } @@ -202,6 +194,7 @@ class TemplateController $data = $request->getParams(); $data['template_type'] = $template['template_type']; $data['template_target'] = $template['template_target']; + $data['template_id'] = $aArgs['id']; if (!TemplateController::checkData(['data' => $data])) { return $response->withStatus(400)->withJson(['errors' => 'Bad Request']); @@ -211,6 +204,14 @@ class TemplateController return $response->withStatus(400)->withJson(['errors' => 'You must complete at least one of the two templates']); } + if ($data['template_target'] == 'acknowledgementReceipt' && !empty($data['entities'])) { + $checkEntities = TemplateModel::checkEntities(['data' => $data]); + + if(!empty($checkEntities)){ + return $response->withJson(['checkEntities' => $checkEntities]); + } + } + if (($data['template_type'] == 'OFFICE' || $data['template_type'] == 'OFFICE_HTML') && (!empty($data['jnlpUniqueId']) || !empty($data['uploadedFile']))) { if (!empty($data['jnlpUniqueId'])) { if (!empty($template['template_style']) && !Validator::stringType()->notEmpty()->validate($data['template_style'])) { diff --git a/src/app/template/models/TemplateModelAbstract.php b/src/app/template/models/TemplateModelAbstract.php index ab1fc78abcb65bbc825435f4adb1ab03eb9ff0a8..0d8c55b8c92c14ee31525fb3dba2752bdf168ddc 100755 --- a/src/app/template/models/TemplateModelAbstract.php +++ b/src/app/template/models/TemplateModelAbstract.php @@ -221,14 +221,14 @@ abstract class TemplateModelAbstract $data = $aArgs['data']; $listEntities = DatabaseModel::select([ - 'select' => ['ta.value_field'], - 'table' => ['templates t','templates_association ta'], - 'left_join' => ['ta.template_id = t.template_id'], - 'where' => ['t.template_attachment_type = ?', 'value_field in (?)'], - 'data' => [$data['template_attachment_type'], $data['entities']], - 'groupBy' => ['ta.value_field'] - ]); - + 'select' => ['ta.value_field', 'e.entity_label'], + 'table' => ['templates t','templates_association ta', 'entities e'], + 'left_join' => ['ta.template_id = t.template_id', 'e.entity_id = ta.value_field'], + 'where' => empty($data['template_id']) ? ['t.template_attachment_type = ?', 'value_field in (?)'] : ['t.template_attachment_type = ?', 'value_field in (?)', 't.template_id != (?)' ], + 'data' => empty($data['template_id']) ? [$data['template_attachment_type'], $data['entities']] : [$data['template_attachment_type'], $data['entities'], $data['template_id']], + 'groupBy' => ['ta.value_field', 'e.entity_label'] + ]); + return $listEntities; } } diff --git a/src/core/lang/lang-en.php b/src/core/lang/lang-en.php index dd11cbf9dc144d97d2de0818d753c76228109f58..22e9c20a6fb6ec26e1718d511940c253316e9a69 100755 --- a/src/core/lang/lang-en.php +++ b/src/core/lang/lang-en.php @@ -85,7 +85,6 @@ define('_STATUS_NOT_FOUND', 'Status not found'); define('_TEMPLATE_ADDED', 'Template added'); define('_TEMPLATE_UPDATED', 'Template updated'); define('_TEMPLATE_DELETED', 'Template deleted'); -define( '_TEMPLATE_ERROR_CHECK_ENTITIES',"The following entities already have a model of"); define('_TO_CC', 'On copy'); define('_TO_SIGN', 'For signature'); define('_UPDATE_STATUS', 'Status update'); diff --git a/src/core/lang/lang-fr.php b/src/core/lang/lang-fr.php index c0a75da8f6185d09c56855095677948ecc5a984c..0ef50a6d6dc6dae824315672e8c9ba0fc50a03f7 100755 --- a/src/core/lang/lang-fr.php +++ b/src/core/lang/lang-fr.php @@ -85,7 +85,6 @@ define('_STATUS_NOT_FOUND', 'Statut introuvable'); define('_TEMPLATE_ADDED', 'Modèle de document ajouté'); define('_TEMPLATE_UPDATED', 'Modèle de document modifié'); define('_TEMPLATE_DELETED', 'Modèle de document supprimé'); -define( '_TEMPLATE_ERROR_CHECK_ENTITIES',"Les entités suivantes ont déjà un modèle d'"); define('_TO_CC', 'En copie'); define('_TO_SIGN', 'Pour signature'); define('_UPDATE_STATUS', 'Modification du statut'); diff --git a/src/core/lang/lang-nl.php b/src/core/lang/lang-nl.php index 1f74ca59bf907e6d665d772766bbbc6c89f8254c..036ce2bb36ce6e9d8e347ce9c320956f628e5bf4 100644 --- a/src/core/lang/lang-nl.php +++ b/src/core/lang/lang-nl.php @@ -102,7 +102,6 @@ define('_PASSWORD_RULES_UPDATED', 'Wachtwoordregels gewijzigd'); define('_TEMPLATE_ADDED', 'Documentmodel toegevoegd'); define('_TEMPLATE_UPDATED', 'Documentmodel gewijzigd'); define('_TEMPLATE_DELETED', 'Documentmodel verwijderd'); -define('_TEMPLATE_ERROR_CHECK_ENTITIES',"The following entities already have a model of"); //_TO_TRANSLATE define('_USER_ALREADY_LINK_GROUP', 'De gebruiker is reeds aan deze groep gekoppeld'); define('_USER_ALREADY_LINK_ENTITY', 'De gebruiker is reeds aan deze eenheid gekoppeld'); define('_UNREACHABLE_DOCSERVER', 'Pad docserver onbereikbaar'); diff --git a/src/frontend/app/administration/administration.module.ts b/src/frontend/app/administration/administration.module.ts index d46bdf855069b755456f5351c2d62201053632c9..034adc34cb780f47d0c1c08c88e3e0de2811aea1 100755 --- a/src/frontend/app/administration/administration.module.ts +++ b/src/frontend/app/administration/administration.module.ts @@ -41,7 +41,7 @@ import { VersionsUpdateAdministrationComponent } from './versionUpdate/ve import { DocserversAdministrationComponent } from './docserver/docservers-administration.component'; import { DocserverAdministrationComponent } from './docserver/docserver-administration.component'; import { TemplatesAdministrationComponent } from './template/templates-administration.component'; -import { TemplateAdministrationComponent } from './template/template-administration.component'; +import { TemplateAdministrationComponent, TemplateAdministrationCheckEntitiesModalComponent } from './template/template-administration.component'; import { SecuritiesAdministrationComponent } from './security/securities-administration.component'; import { SendmailAdministrationComponent } from './sendmail/sendmail-administration.component'; @@ -101,7 +101,8 @@ import { ListAdministrationComponent } from './basket/list/list-admin SendmailAdministrationComponent, TechnicalAdministrationComponent, ListAdministrationComponent, - ListAdministrationComponent + ListAdministrationComponent, + TemplateAdministrationCheckEntitiesModalComponent ], entryComponents: [ UsersAdministrationRedirectModalComponent, @@ -113,7 +114,8 @@ import { ListAdministrationComponent } from './basket/list/list-admin DoctypesAdministrationRedirectModalComponent, TechnicalAdministrationComponent, ListAdministrationComponent, - ListAdministrationComponent + ListAdministrationComponent, + TemplateAdministrationCheckEntitiesModalComponent ], }) export class AdministrationModule {} \ No newline at end of file diff --git a/src/frontend/app/administration/template/template-administration-checkEntities-modal.component.html b/src/frontend/app/administration/template/template-administration-checkEntities-modal.component.html new file mode 100644 index 0000000000000000000000000000000000000000..f0749f778a1f88c90ee77aaaa1651bd66fcb4d99 --- /dev/null +++ b/src/frontend/app/administration/template/template-administration-checkEntities-modal.component.html @@ -0,0 +1,19 @@ +<mat-dialog-content style="overflow:inherit;"> + <h2 mat-dialog-title>{{lang.templateAssociateEntities}}</h2> + <div class="modal-body"> + <div class="alert alert-warning" role="alert"> + <p><b>{{lang.templateCheckEntities}}{{lang[data.template_attachment_type]}}</b></p> + </div> + <mat-list> + <mat-list-item *ngFor="let entity of data.entitiesList"> + <mat-icon mat-list-icon><i class="fa fa-share-alt" color="primary"></i></mat-icon> + <span mat-line> {{entity.entity_label}} </span> + </mat-list-item> + </mat-list> + </div> + <mat-dialog-actions> + <button mat-raised-button color="primary" type="submit" + (click)="dialogRef.close()">{{lang.close}}</button> + </mat-dialog-actions> + +</mat-dialog-content> \ No newline at end of file diff --git a/src/frontend/app/administration/template/template-administration-checkEntities-modal.scss b/src/frontend/app/administration/template/template-administration-checkEntities-modal.scss new file mode 100644 index 0000000000000000000000000000000000000000..3fa43fa11bab69e65178749deb90cbae7221e7c4 --- /dev/null +++ b/src/frontend/app/administration/template/template-administration-checkEntities-modal.scss @@ -0,0 +1,13 @@ +.mat-dialog-content{ + height: auto !important; + min-width: 30vw; + max-height: 65vh; +} + +.modal-body{ + min-height: auto; +} + +mat-dialog-actions{ + justify-content: center; +} \ No newline at end of file diff --git a/src/frontend/app/administration/template/template-administration.component.html b/src/frontend/app/administration/template/template-administration.component.html index 7305b755be6dc03c81b8d72ed0ebbda94dfa0a12..1368c39fc5eb5602af423085628354697d0431a4 100755 --- a/src/frontend/app/administration/template/template-administration.component.html +++ b/src/frontend/app/administration/template/template-administration.component.html @@ -70,17 +70,17 @@ </div> <div class="form-group" *ngIf="template.template_target == 'acknowledgementReceipt'"> - <div class="col-sm-12"> - <mat-form-field> - <mat-select [disabled]="!creationMode" id="template_attachment_type" name="template_attachment_type" title="{{lang.acknowledgementReceiptType}}" placeholder="{{lang.acknowledgementReceiptType}}" - [(ngModel)]="template.template_attachment_type" required> - <mat-option value="ar_simple">{{lang.AR_simple}}</mat-option> - <mat-option value="ar_sva">{{lang.AR_SVA}}</mat-option> - <mat-option value="ar_svr">{{lang.AR_SVR}}</mat-option> - </mat-select> - </mat-form-field> - </div> + <div class="col-sm-12"> + <mat-form-field> + <mat-select [disabled]="!creationMode" id="template_attachment_type" name="template_attachment_type" title="{{lang.acknowledgementReceiptType}}" placeholder="{{lang.acknowledgementReceiptType}}" + [(ngModel)]="template.template_attachment_type" required> + <mat-option value="ar_simple">{{lang.ar_simple}}</mat-option> + <mat-option value="ar_sva">{{lang.ar_sva}}</mat-option> + <mat-option value="ar_svr">{{lang.ar_svr}}</mat-option> + </mat-select> + </mat-form-field> </div> + </div> <div class="form-group" [hidden]="template.template_target=='attachments' || template.template_target=='notifications' || template.template_target=='doctypes' || template.template_target=='notes' || template.template_target=='acknowledgementReceipt'"> <div class="col-sm-12"> diff --git a/src/frontend/app/administration/template/template-administration.component.ts b/src/frontend/app/administration/template/template-administration.component.ts index 4297d8c35fa93ee61fa007ccc87f6c61d6bba0c7..b8d30e29175c6282147835b689c756aa31aacdc9 100755 --- a/src/frontend/app/administration/template/template-administration.component.ts +++ b/src/frontend/app/administration/template/template-administration.component.ts @@ -1,10 +1,10 @@ -import { ChangeDetectorRef, Component, OnInit, NgZone, ViewChild } from '@angular/core'; +import { ChangeDetectorRef, Component, OnInit, NgZone, ViewChild, Inject } from '@angular/core'; import { MediaMatcher } from '@angular/cdk/layout'; import { HttpClient } from '@angular/common/http'; import { Router, ActivatedRoute } from '@angular/router'; import { LANG } from '../../translate.component'; import { NotificationService } from '../../notification.service'; -import { MatSidenav } from '@angular/material'; +import { MatSidenav, MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; import { HeaderService } from '../../../service/header.service'; declare function $j(selector: any): any; @@ -43,8 +43,12 @@ export class TemplateAdministrationComponent implements OnInit { lockFound : boolean = false; intervalLockFile : any; + dialogRef : MatDialogRef<any>; + data : any[] = []; + config : any = {}; - constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private zone: NgZone, private route: ActivatedRoute, private router: Router, private notify: NotificationService, private headerService: HeaderService) { + + constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher, public http: HttpClient, private zone: NgZone, private route: ActivatedRoute, private router: Router, private notify: NotificationService, private headerService: HeaderService, public dialog: MatDialog) { $j("link[href='merged_css.php']").remove(); this.mobileQuery = media.matchMedia('(max-width: 768px)'); this._mobileQueryListener = () => changeDetectorRef.detectChanges(); @@ -293,9 +297,19 @@ export class TemplateAdministrationComponent implements OnInit { this.template.template_style = ''; } this.http.post(this.coreUrl + 'rest/templates', this.template) - .subscribe(() => { - this.router.navigate(['/administration/templates']); - this.notify.success(this.lang.templateAdded); + .subscribe((data:any) => { + if(data.checkEntities) { + this.config = { + data: { + entitiesList: data.checkEntities, + template_attachment_type: this.template.template_attachment_type + } + }; + this.dialogRef = this.dialog.open(TemplateAdministrationCheckEntitiesModalComponent, this.config); + } else { + this.router.navigate(['/administration/templates']); + this.notify.success(this.lang.templateAdded); + } }, (err) => { this.notify.error(err.error.errors); }); @@ -304,9 +318,19 @@ export class TemplateAdministrationComponent implements OnInit { this.template.template_style = ''; } this.http.put(this.coreUrl + 'rest/templates/' + this.template.template_id, this.template) - .subscribe(() => { - this.router.navigate(['/administration/templates']); - this.notify.success(this.lang.templateUpdated); + .subscribe((data:any) => { + if(data.checkEntities) { + this.config = { + data: { + entitiesList: data.checkEntities, + template_attachment_type: this.template.template_attachment_type + } + }; + this.dialogRef = this.dialog.open(TemplateAdministrationCheckEntitiesModalComponent, this.config); + } else { + this.router.navigate(['/administration/templates']); + this.notify.success(this.lang.templateUpdated); + } }, (err) => { this.notify.error(err.error.errors); }); @@ -349,4 +373,16 @@ export class TemplateAdministrationComponent implements OnInit { this.fileToImport(); this.template.uploadedFile = null; } +@Component({ + templateUrl: "template-administration-checkEntities-modal.component.html", + styleUrls: ['template-administration-checkEntities-modal.scss'] +}) +export class TemplateAdministrationCheckEntitiesModalComponent { + lang: any = LANG; + + constructor(public http: HttpClient, @Inject(MAT_DIALOG_DATA) public data: any, public dialogRef: MatDialogRef<TemplateAdministrationCheckEntitiesModalComponent>) { + } + + ngOnInit(): void {} + } diff --git a/src/frontend/lang/lang-en.ts b/src/frontend/lang/lang-en.ts index 9c6a80b3714dae43419955e19d0337c45ed82401..d67ddfe2e17ba345299ba921914dcf790dadd43e 100755 --- a/src/frontend/lang/lang-en.ts +++ b/src/frontend/lang/lang-en.ts @@ -36,9 +36,9 @@ export const LANG_EN = { "april" : "April", "aprilShort" : "Apr.", "acknowledgementReceipt" : "Acknowledgement of receipt", - 'AR_simple' : 'AR simple', - 'AR_SVA' : 'AR SVA', - 'AR_SVR' : 'AR SVR', + 'ar_simple' : 'AR simple', + 'ar_sva' : 'AR SVA', + 'ar_svr' : 'AR SVR', "archivalAgency" : "Archival agency", "archivalAgreement" : "Archival agreement", "arrivalDate" : "Arrival date", @@ -863,4 +863,6 @@ export const LANG_EN = { "electronicTemplate" : "Electronic template", "updateClosingDate" : "This will update mail <b class=\"highlight\">closing date</b>.", "updateDepartureDate" : "This will update mail <b class=\"highlight\">departure date</b>.", + "templateCheckEntities" : "The following entities already have a registered template for the type : ", + "templateAssociateEntities" : "List of entities already associated with a template", }; diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts index 19c5b44ceebfcec18490c561855f9d01acc52ebd..2e40cb15cc5abd76ddb96904b5aa052b8d0ec7fe 100755 --- a/src/frontend/lang/lang-fr.ts +++ b/src/frontend/lang/lang-fr.ts @@ -43,9 +43,9 @@ export const LANG_FR = { "april" : "Avril", "aprilShort" : "Avr.", "acknowledgementReceipt" : "Accusé de réception", - 'AR_simple' : 'AR simple', - 'AR_SVA' : 'AR SVA', - 'AR_SVR' : 'AR SVR', + 'ar_simple' : 'AR simple', + 'ar_sva' : 'AR SVA', + 'ar_svr' : 'AR SVR', "archival" : "Archivage", "archivalAgency" : "Convention d'archivage", "archivalAgreement" : "Service d'archive", @@ -888,4 +888,6 @@ export const LANG_FR = { "electronicTemplate" : "Modèle électronique", "updateClosingDate" : "Cela actualisera la <b class=\"highlight\">date de clôture</b> des courriers.", "updateDepartureDate" : "Cela actualisera la <b class=\"highlight\">date de départ</b> des courriers.", + "templateCheckEntities" : "Les entités suivantes ont déjà un modèle enregistré pour le type : ", + "templateAssociateEntities" : "Liste des entités déjà associées à un modèle", }; diff --git a/src/frontend/lang/lang-nl.ts b/src/frontend/lang/lang-nl.ts index d34cd175d2f3e46634666c8a7dd64d2a560ea9f5..5e6d46c89e159479114df7c24308d8aa6d04098c 100755 --- a/src/frontend/lang/lang-nl.ts +++ b/src/frontend/lang/lang-nl.ts @@ -877,9 +877,9 @@ export const LANG_NL = { "addNote" : "Add note", //_TO_TRANSLATE "makeActionOn" : "Do you want to do this action on", //_TO_TRANSLATE "acknowledgementReceipt" : "Acknowledgement of receipt", //_TO_TRANSLATE - 'AR_simple' : 'AR simple', //_TO_TRANSLATE - 'AR_SVA' : 'AR SVA', //_TO_TRANSLATE - 'AR_SVR' : 'AR SVR', //_TO_TRANSLATE + 'ar_simple' : 'AR simple', //_TO_TRANSLATE + 'ar_sva' : 'AR SVA', //_TO_TRANSLATE + 'ar_svr' : 'AR SVR', //_TO_TRANSLATE "tooMuchDatas" : "Too much datas to export", //_TO_TRANSLATE "warnTooMuchSelect" : "only 500 elements can be processed with an action", //_TO_TRANSLATE "elements" : "element(s)", //_TO_TRANSLATE @@ -891,4 +891,6 @@ export const LANG_NL = { "electronicTemplate" : "Electronic template", //_TO_TRANSLATE "updateClosingDate" : "This will update mail <b class=\"highlight\">closing date</b>.", //_TO_TRANSLATE "updateDepartureDate" : "This will update mail <b class=\"highlight\">departure date</b>.", //_TO_TRANSLATE + "templateCheckEntities" : "The following entities already have a registered template for the type : ", //_TO_TRANSLATE + "templateAssociateEntities" : "List of entities already associated with a template", //_TO_TRANSLATE };