Skip to content

Commit

Permalink
Feature/fields edition restriction (#43)
Browse files Browse the repository at this point in the history
* Save the country ID of the monitor the user belongs to

* Restrict the edition of the government entities

* Restrict the edition of the operators

* Restrict the edition of the laws
  • Loading branch information
clementprdhomme committed Oct 26, 2017
1 parent 05ecbd8 commit be4a4eb
Show file tree
Hide file tree
Showing 13 changed files with 168 additions and 82 deletions.
38 changes: 19 additions & 19 deletions src/app/pages/fields/governments/government-detail.component.html
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
<otp-loader *ngIf="loading" overlay fixed></otp-loader>
<form *ngIf="!loading" name="form" class="c-form" (ngSubmit)="isAdmin && f.valid && onSubmit()" #f="ngForm" novalidate>
<form *ngIf="!loading" name="form" class="c-form" (ngSubmit)="canEdit() && f.valid && onSubmit()" #f="ngForm" novalidate>
<div class="c-container -j-between -t-d-column -t-a-start">
<h2 *ngIf="!isAdmin">{{'Government entity details' | translate}}</h2>
<h2 *ngIf="isAdmin && !government.id">{{'New government entity' | translate}}</h2>
<h2 *ngIf="isAdmin && government.id">{{'Edit government entity' | translate}}</h2>
<h2 *ngIf="!canEdit()">{{'Government entity details' | translate}}</h2>
<h2 *ngIf="canEdit() && !government.id">{{'New government entity' | translate}}</h2>
<h2 *ngIf="canEdit() && government.id">{{'Edit government entity' | translate}}</h2>
<div class="c-button-container -j-end form-group" *otpMinTablet>
<button *ngIf="!isAdmin" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="isAdmin" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="isAdmin && !government.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="isAdmin && government.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
<button *ngIf="!canEdit()" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="canEdit()" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="canEdit() && !government.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="canEdit() && government.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
</div>
</div>

<div class="form-container">
<!-- 1. Name -->
<div class="form-group -required">
<label for="name_field">{{'Name' | translate}}</label>
<input id="name_field" type="text" class="form-control" name="name_field" [(ngModel)]="government['government-entity']" #name_field="ngModel" [disabled]="!isAdmin" required />
<input id="name_field" type="text" class="form-control" name="name_field" [(ngModel)]="government['government-entity']" #name_field="ngModel" [disabled]="!canEdit()" required />
<div *ngIf="f.submitted && !name_field.valid" class="help-text">{{'Please enter the name' | translate}}</div>
</div>

<!-- 2. Country -->
<div class="form-group -required">
<label for="country_field">{{'Country' | translate}}</label>
<select id="country_field" name="country_field" [(ngModel)]="government.country" #country_field="ngModel" [disabled]="!isAdmin" required>
<select id="country_field" name="country_field" [(ngModel)]="government.country" #country_field="ngModel" [disabled]="!canEdit()" required>
<option disabled [value]="null">{{'Select a country' | translate}}</option>
<option *ngFor="let country of countries" [ngValue]="country">{{ country.name }}</option>
</select>
Expand All @@ -33,25 +33,25 @@ <h2 *ngIf="isAdmin && government.id">{{'Edit government entity' | translate}}</h
<!-- 3. Details -->
<div class="form-group">
<label for="details_field">{{'Details'}}</label>
<textarea id="details_field" name="details_field" [(ngModel)]="government.details" #details_field="ngModel" [disabled]="!isAdmin"></textarea>
<textarea id="details_field" name="details_field" [(ngModel)]="government.details" #details_field="ngModel" [disabled]="!canEdit()"></textarea>
</div>
</div>

<div class="form-footer">
<div class="c-container -j-end -t-d-column -t-a-start" *otpMinTablet>
<div class="c-button-container -j-end form-group">
<button *ngIf="!isAdmin" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="isAdmin" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="isAdmin && !government.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="isAdmin && government.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
<button *ngIf="!canEdit()" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="canEdit()" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="canEdit() && !government.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="canEdit() && government.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
</div>
</div>

<otp-action-bar *otpMaxTablet>
<button *ngIf="!isAdmin" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="isAdmin" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="isAdmin && !government.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="isAdmin && government.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
<button *ngIf="!canEdit()" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="canEdit()" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="canEdit() && !government.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="canEdit() && government.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
</otp-action-bar>
</div>
</form>
10 changes: 10 additions & 0 deletions src/app/pages/fields/governments/government-detail.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,5 +89,15 @@ export class GovernmentDetailComponent {
this.router.navigate(['../..'], { relativeTo: this.route });
}

/**
* Return whether the logged user can edit the government
* @returns {boolean}
*/
canEdit(): boolean {
if (!this.isAdmin) {
return false;
}

return this.government.country.id === this.authService.userCountryId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<otp-filters>
<otp-filter [name]="'Country' | translate" values="countries" prop="country" name-attr="name"></otp-filter>
</otp-filters>
<a *ngIf="authService.isAdmin()" class="c-button -primary" routerLink="new">
<a *ngIf="isAdmin" class="c-button -primary" routerLink="new">
{{'New government entity' | translate}}
</a>
</div>
Expand All @@ -15,8 +15,8 @@
</otp-table-column>
<otp-table-column [name]="'Actions' | translate">
<ng-template let-row="row" table-cell-template>
<button class="action" (click)="onEdit(row)" [attr.aria-label]="(authService.isAdmin() ? 'Edit' :'Info') | translate">
<otp-icon [name]="authService.isAdmin() ? '#icon-edit' : '#icon-info'"></otp-icon>
<button class="action" (click)="onEdit(row)" [attr.aria-label]="(canEdit(row) ? 'Edit' :'Info') | translate">
<otp-icon [name]="canEdit(row) ? '#icon-edit' : '#icon-info'"></otp-icon>
</button>
</ng-template>
</otp-table-column>
Expand Down
15 changes: 15 additions & 0 deletions src/app/pages/fields/governments/government-list.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import { Component } from '@angular/core';
})
export class GovernmentListComponent extends TableFilterBehavior {

isAdmin = this.authService.isAdmin();

constructor(
protected service: GovernmentsService,
private router: Router,
Expand Down Expand Up @@ -40,6 +42,19 @@ export class GovernmentListComponent extends TableFilterBehavior {
return string.slice(0, limit) + '...';
}

/**
* Return whether the logged user can edit the government
* @param {Government} government
* @returns {boolean}
*/
canEdit(government: Government): boolean {
if (!this.isAdmin) {
return false;
}

return government.country.id === this.authService.userCountryId;
}

onEdit(row): void {
// Without relativeTo, the navigation doesn't work properly
this.router.navigate(['edit', row.id], { relativeTo: this.route });
Expand Down
52 changes: 26 additions & 26 deletions src/app/pages/fields/laws/law-detail.component.html
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
<otp-loader *ngIf="loading" overlay fixed></otp-loader>
<form *ngIf="!loading" name="form" class="c-form" (ngSubmit)="isAdmin && f.valid && onSubmit()" #f="ngForm" novalidate>
<form *ngIf="!loading" name="form" class="c-form" (ngSubmit)="canEdit() && f.valid && onSubmit()" #f="ngForm" novalidate>
<div class="c-container -j-between -t-d-column -t-a-start">
<h2 *ngIf="!isAdmin">{{'Law details' | translate}}</h2>
<h2 *ngIf="isAdmin && !law.id">{{'New law' | translate}}</h2>
<h2 *ngIf="isAdmin && law.id">{{'Edit law' | translate}}</h2>
<h2 *ngIf="!canEdit()">{{'Law details' | translate}}</h2>
<h2 *ngIf="canEdit() && !law.id">{{'New law' | translate}}</h2>
<h2 *ngIf="canEdit() && law.id">{{'Edit law' | translate}}</h2>
<div class="c-button-container -j-end form-group" *otpMinTablet>
<button *ngIf="!isAdmin" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="isAdmin" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="isAdmin && !law.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="isAdmin && law.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
<button *ngIf="!canEdit()" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="canEdit()" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="canEdit() && !law.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="canEdit() && law.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
</div>
</div>

Expand All @@ -17,7 +17,7 @@ <h2 *ngIf="isAdmin && law.id">{{'Edit law' | translate}}</h2>
<!-- 1. Country -->
<div class="form-group -required">
<label for="country_id">{{'Country' | translate}}</label>
<select id="country_id" name="country_id" [(ngModel)]="law && law.country" #country_id="ngModel" required [disabled]="!isAdmin">
<select id="country_id" name="country_id" [(ngModel)]="law && law.country" #country_id="ngModel" required [disabled]="!canEdit()">
<option [value]="null" disabled>{{'Select a country' | translate}}</option>
<option *ngFor="let country of countries" [ngValue]="country">{{ country.name }}</option>
</select>
Expand All @@ -27,7 +27,7 @@ <h2 *ngIf="isAdmin && law.id">{{'Edit law' | translate}}</h2>
<!-- 2. Subcategory -->
<div class="form-group -required">
<label for="subcategory">{{'Subcategory' | translate}}</label>
<select id="subcategory" name="subcategory" [(ngModel)]="law && law.subcategory" #subcategory="ngModel" required [disabled]="!isAdmin">
<select id="subcategory" name="subcategory" [(ngModel)]="law && law.subcategory" #subcategory="ngModel" required [disabled]="!canEdit()">
<option [value]="null" disabled>{{'Select a subcategory' | translate}}</option>
<option *ngFor="let subcategory of subcategories" [ngValue]="subcategory">{{ subcategory.name }}</option>
</select>
Expand All @@ -37,67 +37,67 @@ <h2 *ngIf="isAdmin && law.id">{{'Edit law' | translate}}</h2>
<!-- 3. Observation according to legal text -->
<div class="form-group">
<label for="law_field">{{'Observation according to legal text' | translate}}</label>
<textarea id="law_field" class="form-control" name="law_field" [(ngModel)]="law && law['written-infraction']" #law_field="ngModel" [disabled]="!isAdmin"></textarea>
<textarea id="law_field" class="form-control" name="law_field" [(ngModel)]="law && law['written-infraction']" #law_field="ngModel" [disabled]="!canEdit()"></textarea>
</div>

<!-- 4. Legal reference (infraction) -->
<div class="form-group">
<label for="infraction">{{'Legal reference (infraction)' | translate}}</label>
<textarea id="infraction" class="form-control" name="infraction" [(ngModel)]="law && law.infraction" #infraction="ngModel" [disabled]="!isAdmin"></textarea>
<textarea id="infraction" class="form-control" name="infraction" [(ngModel)]="law && law.infraction" #infraction="ngModel" [disabled]="!canEdit()"></textarea>
</div>

<!-- 5. Legal reference (sanction) -->
<div class="form-group">
<label for="sanctions">{{'Legal reference (sanction)' | translate}}</label>
<textarea id="sanctions" class="form-control" name="sanctions" [(ngModel)]="law && law.sanctions" #sanctions="ngModel" [disabled]="!isAdmin"></textarea>
<textarea id="sanctions" class="form-control" name="sanctions" [(ngModel)]="law && law.sanctions" #sanctions="ngModel" [disabled]="!canEdit()"></textarea>
</div>

<!-- 6. Minimum fine -->
<div class="form-group">
<label for="min_fine">{{'Minimum fine' | translate}}</label>
<input id="min_fine" type="text" class="form-control" name="min_fine" [(ngModel)]="law && law['min-fine']" #min_fine="ngModel" [disabled]="!isAdmin" />
<input id="min_fine" type="text" class="form-control" name="min_fine" [(ngModel)]="law && law['min-fine']" #min_fine="ngModel" [disabled]="!canEdit()" />
</div>

<!-- 7. Maximum fine -->
<div class="form-group">
<label for="max_fine">{{'Maximum fine' | translate}}</label>
<input id="max_fine" type="text" class="form-control" name="max_fine" [(ngModel)]="law && law['max-fine']" #max_fine="ngModel" [disabled]="!isAdmin" />
<input id="max_fine" type="text" class="form-control" name="max_fine" [(ngModel)]="law && law['max-fine']" #max_fine="ngModel" [disabled]="!canEdit()" />
</div>

<!-- 8. Penal servitude -->
<div class="form-group">
<label for="penal_servitude">{{'Penal servitude' | translate}}</label>
<textarea id="penal_servitude" type="text" class="form-control" name="penal_servitude" [(ngModel)]="law && law['penal-servitude']" #penal_servitude="ngModel" [disabled]="!isAdmin"></textarea>
<textarea id="penal_servitude" type="text" class="form-control" name="penal_servitude" [(ngModel)]="law && law['penal-servitude']" #penal_servitude="ngModel" [disabled]="!canEdit()"></textarea>
</div>

<!-- 9. Other penalties -->
<div class="form-group">
<label for="other_penalties">{{'Other penalties' | translate}}</label>
<textarea id="other_penalties" type="text" class="form-control" name="other_penalties" [(ngModel)]="law && law['other-penalties']" #other_penalties="ngModel" [disabled]="!isAdmin"></textarea>
<textarea id="other_penalties" type="text" class="form-control" name="other_penalties" [(ngModel)]="law && law['other-penalties']" #other_penalties="ngModel" [disabled]="!canEdit()"></textarea>
</div>

<!-- 10. APV -->
<div class="form-group">
<label for="apv">{{'APV' | translate}}</label>
<textarea id="apv" type="text" class="form-control" name="apv" [(ngModel)]="law && law.apv" #flegt="ngModel" [disabled]="!isAdmin"></textarea>
<textarea id="apv" type="text" class="form-control" name="apv" [(ngModel)]="law && law.apv" #flegt="ngModel" [disabled]="!canEdit()"></textarea>
</div>
</div>

<div class="form-footer">
<div class="c-container -j-end -t-d-column -t-a-start" *otpMinTablet>
<div class="c-button-container -j-end form-group">
<button *ngIf="!isAdmin" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="isAdmin" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="isAdmin && !law.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="isAdmin && law.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
<button *ngIf="!canEdit()" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="canEdit()" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="canEdit() && !law.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="canEdit() && law.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
</div>
</div>

<otp-action-bar *otpMaxTablet>
<button *ngIf="!isAdmin" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="isAdmin" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="isAdmin && !law.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="isAdmin && law.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
<button *ngIf="!canEdit()" type="button" (click)="onClickBack()" class="c-button -secondary">{{'Go back' | translate}}</button>
<button *ngIf="canEdit()" type="button" (click)="onCancel()" class="c-button -secondary">{{'Cancel' | translate}}</button>
<button *ngIf="canEdit() && !law.id" type="submit" class="c-button -primary">{{'Create' | translate}}</button>
<button *ngIf="canEdit() && law.id" type="submit" class="c-button -primary">{{'Save' | translate}}</button>
</otp-action-bar>
</div>

Expand Down
12 changes: 12 additions & 0 deletions src/app/pages/fields/laws/law-detail.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,16 @@ export class LawDetailComponent {
this.router.navigate(['../..'], { relativeTo: this.route });
}

/**
* Return whether the logged user can edit the law
* @returns {boolean}
*/
canEdit(): boolean {
if (!this.isAdmin) {
return false;
}

return this.law.country.id === this.authService.userCountryId;
}

}
6 changes: 3 additions & 3 deletions src/app/pages/fields/laws/law-list.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<otp-filter [name]="'Subcategory' | translate" values="subcategories" prop="subcategory" name-attr="name"></otp-filter>
<otp-filter [name]="'Complete' | translate" [values]="{ 'True': true, 'False': false }" prop="complete"></otp-filter>
</otp-filters>
<button *ngIf="authService.isAdmin()" (click)="onClickNewLaw()" class="c-button -primary">
<button *ngIf="isAdmin" (click)="onClickNewLaw()" class="c-button -primary">
{{'New law' | translate}}
</button>
</div>
Expand All @@ -20,10 +20,10 @@
</otp-table-column> -->
<otp-table-column [name]="'Actions' | translate">
<ng-template let-row="row" table-cell-template>
<ng-template [ngIf]="!authService.isAdmin()">
<ng-template [ngIf]="!canEdit(row)">
<button class="action" (click)="onEdit(row)" [attr.aria-label]="'Info' | translate"><otp-icon name="#icon-info"></otp-icon></button>
</ng-template>
<ng-template [ngIf]="authService.isAdmin()">
<ng-template [ngIf]="canEdit(row)">
<button class="action" (click)="onEdit(row)" [attr.aria-label]="'Edit' | translate"><otp-icon name="#icon-edit"></otp-icon></button>
</ng-template>
</ng-template>
Expand Down
Loading

0 comments on commit be4a4eb

Please sign in to comment.