Update translations, again

This commit is contained in:
Matteo Gheza 2024-01-08 23:19:37 +01:00
parent a7a18a6b6b
commit 7be73d06ba
30 changed files with 245 additions and 178 deletions

View File

@ -1 +1 @@
<button (click)="locationBackService.goBack()" id="backBtn" [title]="'go_back'|translate|titlecase"><i class="fas fa-arrow-left"></i> {{ 'go_back'|translate|titlecase }}</button>
<button (click)="locationBackService.goBack()" id="backBtn" [title]="'go_back'|translate"><i class="fas fa-arrow-left"></i> {{ 'go_back'|translate }}</button>

View File

@ -1,6 +1,6 @@
<div class="input-group flex-nowrap">
<span class="input-group-text" id="addon-wrapping">Filtra interventi per data</span>
<input type="text" [disabled]="disabled" placeholder="Seleziona un intervallo di date" class="form-control" placement="bottom"
<span class="input-group-text" id="addon-wrapping" translate>select_date_range</span>
<input type="text" [disabled]="disabled" [placeholder]="'select_date_range'|translate" class="form-control" placement="bottom"
bsDaterangepicker [bsConfig]="dateRangePickerOptions" [maxDate]="maxDate" [(bsValue)]="range" (bsValueChange)="updateValue($event)">
<button class="btn btn-outline-secondary" type="button" (click)="resetRange()">Rimuovi filtri</button>
<button class="btn btn-outline-secondary" type="button" (click)="resetRange()" translate>select_date_range</button>
</div>

View File

@ -1,5 +1,5 @@
<div class="input-group">
<input type="text" [disabled]="disabled" [placeholder]="'press_to_select_a_date'|translate|titlecase" class="form-control date-picker"
<input type="text" [disabled]="disabled" [placeholder]="'press_to_select_a_date'|translate" class="form-control date-picker"
bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [(ngModel)]="date" (ngModelChange)=updateValue()>
<input type="time" [disabled]="disabled" class="form-control" [(ngModel)]="time" (change)=updateValue()>
</div>

View File

@ -96,7 +96,7 @@ export class MapPickerComponent implements OnInit {
searchPlace() {
if(this.placeName.length < 3) {
this.translate.get('map_picker.place_min_length').subscribe((res: string) => {
this.translate.get('validation.place_min_length').subscribe((res: string) => {
this.toastr.error(res);
});
return;

View File

@ -1,9 +1,9 @@
<div class="modal-header">
<h4 class="modal-title pull-left" translate>user_info_modal.title</h4>
<h4 class="modal-title pull-left" translate>medical_examination_modal.title</h4>
<button
type="button"
class="btn-close close pull-right"
[attr.aria-label]="'close' | translate | titlecase"
[attr.aria-label]="'close' | translate | ftitlecase"
(click)="bsModalRef.hide()"
>
<span aria-hidden="true" class="visually-hidden">&times;</span>
@ -12,26 +12,26 @@
<div class="modal-body">
<form [formGroup]="form" (submit)="formSubmit()" class="row g-3">
<div class="col-md-6">
<label for="me_date" class="form-label">Data</label>
<input formControlName="date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|titlecase" id="me_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="dateMaxDate">
<label for="me_date" class="form-label">{{ 'date'|translate|ftitlecase }}</label>
<input formControlName="date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|ftitlecase" id="me_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="dateMaxDate">
</div>
<div class="col-md-6">
<label for="me_expiration_date" class="form-label">Data scadenza</label>
<input formControlName="expiration_date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|titlecase" id="me_expiration_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [minDate]="expirationDateMinDate">
<label for="me_expiration_date" class="form-label">{{ 'expiration_date'|translate|ftitlecase }}</label>
<input formControlName="expiration_date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|ftitlecase" id="me_expiration_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [minDate]="expirationDateMinDate">
</div>
<div class="col-12">
<label for="me_certifier">Ente/Certificatore</label>
<label for="me_certifier">{{ 'certifier'|translate|ftitlecase }}</label>
<input formControlName="certifier" type="text" class="form-control" id="me_certifier">
</div>
<div class="col-12">
<label for="dl_scan" class="form-label">Carica certificato medico (<u>OPZIONALE</u>, PDF)</label>
<label for="dl_scan" class="form-label">{{ 'upload_medical_examination_certificate'|translate|ftitlecase }} (<u>{{ 'optional'|translate|uppercase }}</u>, <i>.pdf</i>)</label>
<input class="form-control" type="file" id="dl_scan" (change)="onMedicalExaminationCertificateSelected($event)">
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" (click)="formSubmit()">
{{ "add" | translate | titlecase }}
{{ "add" | translate | ftitlecase }}
</button>
<button type="button" class="btn btn-secondary" (click)="bsModalRef.hide()">
{{ "close" | translate }}

View File

@ -46,7 +46,7 @@ export class ModalAddMedicalExaminationComponent implements OnInit {
event.target.value = null;
Swal.fire({
title: this.translateService.instant("error_title"),
text: this.translateService.instant("edit_user.image_format_not_supported"),
text: this.translateService.instant("validation.document_format_not_supported"),
icon: 'error',
confirmButtonText: 'Ok'
});
@ -56,7 +56,7 @@ export class ModalAddMedicalExaminationComponent implements OnInit {
event.target.value = null;
Swal.fire({
title: this.translateService.instant("error_title"),
text: this.translateService.instant("edit_user.file_too_big"),
text: this.translateService.instant("validation.file_too_big"),
icon: 'error',
confirmButtonText: 'Ok'
});

View File

@ -4,6 +4,7 @@ import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { TranslationModule } from '../../translation.module';
import { BsDatepickerModule } from 'ngx-bootstrap/datepicker';
import { FirstLetterUppercasePipe } from 'src/app/_pipes/first-letter-uppercase.pipe';
import { ModalAddMedicalExaminationComponent } from './modal-add-medical-examination.component';
@ -16,7 +17,8 @@ import { ModalAddMedicalExaminationComponent } from './modal-add-medical-examina
FormsModule,
ReactiveFormsModule,
TranslationModule,
BsDatepickerModule.forRoot()
BsDatepickerModule.forRoot(),
FirstLetterUppercasePipe
],
exports: [
ModalAddMedicalExaminationComponent

View File

@ -1,6 +1,6 @@
<div class="modal-header">
<h4 class="modal-title pull-left" translate>alert.state</h4>
<button type="button" class="btn-close close pull-right" [attr.aria-label]="'close'|translate|titlecase" (click)="bsModalRef.hide()">
<button type="button" class="btn-close close pull-right" [attr.aria-label]="'close'|translate|ftitlecase" (click)="bsModalRef.hide()">
<span aria-hidden="true" class="visually-hidden">&times;</span>
</button>
</div>
@ -14,16 +14,16 @@
<i class="fas fa-exclamation-triangle"></i> {{ 'alert.closed'|translate }}
</div>
<div class="alert alert-info" role="alert" *ngIf="!alertClosed && getCurrentUserResponse() == null">
<i class="fas fa-info-circle"></i> Sarai presente alla chiamata?
<i class="fas fa-info-circle"></i> {{ 'alert.request_response_question'|translate }}
<div class="btn-group ms-3" role="group">
<button class="btn btn-success" type="button" (click)="setCurrentUserResponse(1)">Si</button>
<button class="btn btn-danger" type="button" (click)="setCurrentUserResponse(0)">No</button>
<button class="btn btn-success" type="button" (click)="setCurrentUserResponse(1)">{{ 'yes'|translate|titlecase }}</button>
<button class="btn btn-danger" type="button" (click)="setCurrentUserResponse(0)">{{ 'no'|translate|titlecase }}</button>
</div>
</div>
<table class="table table-border table-striped w-100">
<thead>
<tr>
<td>{{ 'name'|translate|titlecase }}</td>
<td>{{ 'name'|translate|ftitlecase }}</td>
<td colspan="2">{{ 'alert.response_status'|translate }}</td>
</tr>
</thead>

View File

@ -1,6 +1,6 @@
<div class="modal-header">
<h4 class="modal-title pull-left">{{ 'update_availability_schedule'|translate }}</h4>
<button type="button" class="btn-close close pull-right" [attr.aria-label]="'close'|translate|titlecase" (click)="bsModalRef.hide()">
<button type="button" class="btn-close close pull-right" [attr.aria-label]="'close'|translate|ftitlecase" (click)="bsModalRef.hide()">
<span aria-hidden="true" class="visually-hidden">&times;</span>
</button>
</div>

View File

@ -3,7 +3,7 @@
<button
type="button"
class="btn-close close pull-right"
[attr.aria-label]="'close' | translate | titlecase"
[attr.aria-label]="'close' | translate | ftitlecase"
(click)="bsModalRef.hide()"
>
<span aria-hidden="true" class="visually-hidden">&times;</span>
@ -20,27 +20,27 @@
<th></th>
<th></th>
<tr *ngIf="user.surname">
<td>{{ 'surname'|translate|titlecase }}</td>
<td>{{ 'surname'|translate|ftitlecase }}</td>
<td>{{ user.surname }}</td>
</tr>
<tr>
<td>{{ 'name'|translate|titlecase }}</td>
<td>{{ 'name'|translate|ftitlecase }}</td>
<td>{{ user.name }}</td>
</tr>
<tr>
<td>{{ 'username'|translate|titlecase }}</td>
<td>{{ 'username'|translate|ftitlecase }}</td>
<td>{{ user.username }}</td>
</tr>
<tr *ngIf="user.birthday">
<td>{{ 'birthday'|translate|titlecase }}</td>
<td>{{ 'birthday'|translate|ftitlecase }}</td>
<td>{{ user.birthday | date:'dd/MM/yyyy' }}</td>
</tr>
<tr *ngIf="user.birthplace">
<td>{{ 'birthplace'|translate|titlecase }}</td>
<td>{{ 'birthplace'|translate|ftitlecase }}</td>
<td>{{ user.birthplace }}<ng-container *ngIf="user.birthplace_province"> ({{ user.birthplace_province }})</ng-container></td>
</tr>
<tr *ngIf="user.ssn">
<td>{{ 'ssn'|translate|titlecase }}</td>
<td>{{ 'ssn'|translate|ftitlecase }}</td>
<td>{{ user.ssn }}</td>
</tr>
<tr>
@ -50,7 +50,7 @@
</td>
</tr>
<tr *ngIf="user.address">
<td>{{ 'address'|translate|titlecase }}</td>
<td>{{ 'address'|translate|ftitlecase }}</td>
<td>
<a href="https://maps.google.com/?q={{ user.address }}" target="_blank">
{{ user.address }}<ng-container *ngIf="user.address_zip_code"> ({{ 'zip_code'|translate }} <i>{{ user.address_zip_code }}</i>)</ng-container>
@ -58,11 +58,11 @@
</td>
</tr>
<tr>
<td>{{ 'phone_number'|translate|titlecase }}</td>
<td>{{ 'phone_number'|translate|ftitlecase }}</td>
<td><a href="tel:{{ user.phone_number }}">{{ user.phone_number }}</a></td>
</tr>
<tr>
<td>{{ 'email'|translate|titlecase }}</td>
<td>{{ 'email'|translate|ftitlecase }}</td>
<td><a href="mailto:{{ user.email }}">{{ user.email }}</a></td>
</tr>
<tr>
@ -72,28 +72,28 @@
</td>
</tr>
<tr>
<td>{{ 'driver'|translate|titlecase }}</td>
<td>{{ 'driver'|translate|ftitlecase }}</td>
<td>
<i class="fa fa-check" style="color:green" *ngIf="user.driver"></i>
<i class="fa fa-times" style="color:red" *ngIf="!user.driver"></i>
</td>
</tr>
<tr>
<td>{{ 'chief'|translate|titlecase }}</td>
<td>{{ 'chief'|translate|ftitlecase }}</td>
<td>
<img alt="red helmet" src="./assets/icons/red_helmet.png" width="20px" *ngIf="user.chief"> Si
<img alt="black helmet" src="./assets/icons/black_helmet.png" width="20px" *ngIf="!user.chief"> No
</td>
</tr>
<tr *ngIf="user.course_date">
<td>{{ 'course_date'|translate|titlecase }}</td>
<td>{{ 'course_date'|translate|ftitlecase }}</td>
<td>{{ user.course_date }}</td>
</tr>
</table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" (click)="goToEditPage()" [disabled]="!canGoToEditPage">
{{ "edit" | translate | titlecase }}
{{ "edit" | translate | ftitlecase }}
</button>
<button type="button" class="btn btn-secondary" (click)="bsModalRef.hide()">
{{ "close" | translate }}

View File

@ -1,7 +1,7 @@
<ng-container *ngIf="sourceType && enablePaginationTypes.includes(sourceType)">
<div class="row mt-5 mb-3">
<div class="col-xs-12 col-12">
<input type="text" class="form-control" placeholder="{{ 'search'|translate|titlecase }}" [(ngModel)]="searchText" (ngModelChange)="onSearchTextChange($event)">
<input type="text" class="form-control" placeholder="{{ 'search'|translate|ftitlecase }}" [(ngModel)]="searchText" (ngModelChange)="onSearchTextChange($event)">
</div>
</div>
</ng-container>
@ -13,16 +13,16 @@
<table *ngIf="sourceType === 'list'" id="table" class="table table-striped table-bordered dt-responsive nowrap">
<thead>
<tr>
<th>{{ 'name'|translate|titlecase }}</th>
<th>{{ 'available'|translate|titlecase }}</th>
<th>{{ 'driver'|translate|titlecase }}</th>
<th>{{ 'name'|translate|ftitlecase }}</th>
<th>{{ 'available'|translate|ftitlecase }}</th>
<th>{{ 'driver'|translate|ftitlecase }}</th>
<ng-container *ngIf="auth.profile.can('users-read')">
<th>{{ 'call'|translate|titlecase }}</th>
<th>{{ 'call'|translate|ftitlecase }}</th>
</ng-container>
<th>{{ 'services'|translate|titlecase }}</th>
<th>{{ 'availability_minutes'|translate|titlecase }}</th>
<th>{{ 'services'|translate|ftitlecase }}</th>
<th>{{ 'availability_minutes'|translate|ftitlecase }}</th>
<ng-container *ngIf="auth.profile.can('users-update')">
<th>{{ 'edit'|translate|titlecase }}</th>
<th>{{ 'edit'|translate|ftitlecase }}</th>
</ng-container>
</tr>
</thead>
@ -60,10 +60,10 @@
<table id="table" class="table table-striped table-bordered dt-responsive nowrap">
<thead>
<tr>
<th>{{ 'action'|translate|titlecase }}</th>
<th>{{ 'changed'|translate|titlecase }}</th>
<th>{{ 'editor'|translate|titlecase }}</th>
<th>{{ 'datetime'|translate|titlecase }}</th>
<th>{{ 'action'|translate|ftitlecase }}</th>
<th>{{ 'changed'|translate|ftitlecase }}</th>
<th>{{ 'editor'|translate|ftitlecase }}</th>
<th>{{ 'datetime'|translate|ftitlecase }}</th>
</tr>
</thead>
<tbody id="table_body">
@ -82,17 +82,17 @@
<thead>
<tr>
<th>#</th>
<th>{{ 'start'|translate|titlecase }}</th>
<th>{{ 'end'|translate|titlecase }}</th>
<th>{{ 'code'|translate|titlecase }}</th>
<th>{{ 'chief'|translate|titlecase }}</th>
<th>{{ 'drivers'|translate|titlecase }}</th>
<th>{{ 'crew'|translate|titlecase }}</th>
<th>{{ 'place'|translate|titlecase }}</th>
<th>{{ 'notes'|translate|titlecase }}</th>
<th>{{ 'type'|translate|titlecase }}</th>
<th *ngIf="auth.profile.can('services-update')">{{ 'update'|translate|titlecase }}</th>
<th *ngIf="auth.profile.can('services-delete')">{{ 'remove'|translate|titlecase }}</th>
<th>{{ 'start'|translate|ftitlecase }}</th>
<th>{{ 'end'|translate|ftitlecase }}</th>
<th>{{ 'code'|translate|ftitlecase }}</th>
<th>{{ 'chief'|translate|ftitlecase }}</th>
<th>{{ 'drivers'|translate|ftitlecase }}</th>
<th>{{ 'crew'|translate|ftitlecase }}</th>
<th>{{ 'place'|translate|ftitlecase }}</th>
<th>{{ 'notes'|translate|ftitlecase }}</th>
<th>{{ 'type'|translate|ftitlecase }}</th>
<th *ngIf="auth.profile.can('services-update')">{{ 'update'|translate|ftitlecase }}</th>
<th *ngIf="auth.profile.can('services-delete')">{{ 'remove'|translate|ftitlecase }}</th>
</tr>
</thead>
<tbody id="table_body">
@ -108,7 +108,7 @@
<td>
<ng-container *ngIf="row.place.name"><i>{{ row.place.name }}</i></ng-container><br>
<ng-container *ngIf="row.place.village">{{ row.place.village }}</ng-container><br>
<a class="place_details_link cursor-pointer" (click)="openPlaceDetails(row.place.id)">{{ 'more details'|translate|titlecase }}</a>
<a class="place_details_link cursor-pointer" (click)="openPlaceDetails(row.place.id)">{{ 'more details'|translate|ftitlecase }}</a>
</td>
<td>{{ row.notes }}</td>
<td>{{ row.type }}</td>
@ -124,15 +124,15 @@
<thead>
<tr>
<td>#</td>
<th>{{ 'name'|translate|titlecase }}</th>
<th>{{ 'start'|translate|titlecase }}</th>
<th>{{ 'end'|translate|titlecase }}</th>
<th>{{ 'chief'|translate|titlecase }}</th>
<th>{{ 'crew'|translate|titlecase }}</th>
<th>{{ 'place'|translate|titlecase }}</th>
<th>{{ 'notes'|translate|titlecase }}</th>
<th *ngIf="auth.profile.can('trainings-update')">{{ 'update'|translate|titlecase }}</th>
<th *ngIf="auth.profile.can('trainings-delete')">{{ 'remove'|translate|titlecase }}</th>
<th>{{ 'name'|translate|ftitlecase }}</th>
<th>{{ 'start'|translate|ftitlecase }}</th>
<th>{{ 'end'|translate|ftitlecase }}</th>
<th>{{ 'chief'|translate|ftitlecase }}</th>
<th>{{ 'crew'|translate|ftitlecase }}</th>
<th>{{ 'place'|translate|ftitlecase }}</th>
<th>{{ 'notes'|translate|ftitlecase }}</th>
<th *ngIf="auth.profile.can('trainings-update')">{{ 'update'|translate|ftitlecase }}</th>
<th *ngIf="auth.profile.can('trainings-delete')">{{ 'remove'|translate|ftitlecase }}</th>
</tr>
</thead>
<tbody id="table_body">
@ -178,17 +178,17 @@
</ng-template>
<ng-template #nextTemplate let-disabled="disabled" let-currentPage="currentPage">
{{ 'next'|translate|titlecase }}
{{ 'next'|translate|ftitlecase }}
</ng-template>
<ng-template #prevTemplate let-disabled="disabled" let-currentPage="currentPage">
{{ 'previous'|translate|titlecase }}
{{ 'previous'|translate|ftitlecase }}
</ng-template>
<ng-template #lastTemplate let-disabled="disabled" let-currentPage="currentPage">
{{ 'last'|translate|titlecase }}
{{ 'last'|translate|ftitlecase }}
</ng-template>
<ng-template #firstTemplate let-disabled="disabled" let-currentPage="currentPage">
{{ 'first'|translate|titlecase }}
{{ 'first'|translate|ftitlecase }}
</ng-template>

View File

@ -0,0 +1,14 @@
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'ftitlecase',
standalone: true
})
export class FirstLetterUppercasePipe implements PipeTransform {
transform(value: unknown, ...args: unknown[]): unknown {
if(typeof value !== "string") return value;
return value.charAt(0).toUpperCase() + value.slice(1);
}
}

View File

@ -3,21 +3,21 @@
<form method="post" [formGroup]="serviceForm" (ngSubmit)="formSubmit()">
<div class="container">
<div class="form-group has-validation">
<label for="date-picker-start">{{ 'start'|translate|titlecase }}</label>
<label for="date-picker-start">{{ 'start'|translate|ftitlecase }}</label>
<datetime-picker formControlName="start" [class.is-invalid]="!isFieldValid('start')" id="date-picker-start"></datetime-picker>
<div class="invalid-feedback" *ngIf="start.errors?.['required']" translate>
edit_service.select_start_datetime
</div>
</div>
<div class="form-group has-validation">
<label for="date-picker-end">{{ 'end'|translate|titlecase }}</label>
<label for="date-picker-end">{{ 'end'|translate|ftitlecase }}</label>
<datetime-picker formControlName="end" [class.is-invalid]="!isFieldValid('end')" id="date-picker-end"></datetime-picker>
<div class="invalid-feedback" *ngIf="end.errors?.['required']" translate>
edit_service.select_end_datetime
</div>
</div>
<div class="form-group has-validation">
<label for="code">{{ 'code'|translate|titlecase }}</label>
<label for="code">{{ 'code'|translate|ftitlecase }}</label>
<input formControlName="code" [class.is-invalid]="!isFieldValid('code')" id="code" class="form-control"
type="text" placeholder="1234/5">
<div class="invalid-feedback" *ngIf="code.errors?.['required']" translate>
@ -25,7 +25,7 @@
</div>
</div>
<div class="form-group has-validation" [class.is-invalid-div]="!isFieldValid('chief')">
<label>{{ 'chief'|translate|titlecase }}</label>
<label>{{ 'chief'|translate|ftitlecase }}</label>
<br>
<ng-container *ngFor="let user of users">
<div class="form-check">
@ -38,7 +38,7 @@
</ng-container>
</div>
<div class="form-group has-validation" [class.is-invalid-div]="!isFieldValid('drivers')">
<label>{{ 'drivers'|translate|titlecase }}</label>
<label>{{ 'drivers'|translate|ftitlecase }}</label>
<br>
<ng-container *ngFor="let user of users">
<div class="form-check" *ngIf="user.driver">
@ -64,17 +64,17 @@
</ng-container>
</div>
<div [class.is-invalid-div]="!isFieldValid('lat')" class="mb-2">
<label>{{ 'place'|translate|titlecase }}</label>
<label>{{ 'place'|translate|ftitlecase }}</label>
<map-picker *ngIf="addingService" (markerSet)="setPlace($event.lat, $event.lng)"></map-picker>
<map-picker *ngIf="!addingService && loadedServiceLat !== ''" (markerSet)="setPlace($event.lat, $event.lng)" [selectLat]="loadedServiceLat" [selectLng]="loadedServiceLng"></map-picker>
</div>
<div class="form-group">
<label for="notes">{{ 'notes'|translate|titlecase }}</label><br>
<label for="notes">{{ 'notes'|translate|ftitlecase }}</label><br>
<textarea formControlName="notes" class="form-control" id="notes"></textarea>
</div>
<br>
<div class="form-group">
<label>{{ 'type'|translate|titlecase }}</label>
<label>{{ 'type'|translate|ftitlecase }}</label>
<br>
<div class="input-group has-validation">
<select formControlName="type" [class.is-invalid]="!isFieldValid('type')" class="form-control mr-2">
@ -82,7 +82,7 @@
<option *ngFor="let service_type of types" value="{{ service_type.id }}">{{ service_type.name }}</option>
</select>
<button class="btn btn-outline-secondary" type="button" tabindex="-1" (click)="addingType = true">
{{ 'add'|translate|titlecase }}
{{ 'add'|translate|ftitlecase }}
</button>
<div class="invalid-feedback" *ngIf="type.errors?.['required']" translate>
edit_service.select_service_type
@ -91,12 +91,12 @@
<div class="input-group mb-2 mt-2" *ngIf="addingType">
<input type="text" class="form-control" [placeholder]="'type'|translate" [(ngModel)]="newType"
[ngModelOptions]="{standalone: true}">
<button class="btn btn-secondary" type="button" (click)="addType()">{{ 'submit'|translate|titlecase }}</button>
<button class="btn btn-secondary" type="button" (click)="addType()">{{ 'submit'|translate|ftitlecase }}</button>
</div>
</div>
<br>
<button id="submit_button" type="submit" class="btn btn-primary" [disabled]="submittingForm">{{ 'submit'|translate|titlecase }}</button>
<button class="btn" type="button" (click)="formReset()" [disabled]="submittingForm">{{ 'reset'|translate|titlecase }}</button>
<button id="submit_button" type="submit" class="btn btn-primary" [disabled]="submittingForm">{{ 'submit'|translate|ftitlecase }}</button>
<button class="btn" type="button" (click)="formReset()" [disabled]="submittingForm">{{ 'reset'|translate|ftitlecase }}</button>
<div class="d-flex justify-content-center mt-2 pt-2 mb-3" *ngIf="submittingForm">
<div class="spinner spinner-border"></div>
</div>

View File

@ -130,13 +130,13 @@ export class EditServiceComponent implements OnInit {
addType() {
if (this.newType.length < 2) {
this.translate.get('edit_service.type_must_be_two_characters_long').subscribe((res: string) => {
this.translate.get('validation.type_must_be_two_characters_long').subscribe((res: string) => {
this.toastr.error(res);
});
return;
}
if (this.types.find(t => t.name == this.newType)) {
this.translate.get('edit_service.type_already_exists').subscribe((res: string) => {
this.translate.get('validation.type_already_exists').subscribe((res: string) => {
this.toastr.error(res);
});
return;

View File

@ -7,6 +7,7 @@ import { MapPickerModule } from '../../_components/map-picker/map-picker.module'
import { DatetimePickerModule } from '../../_components/datetime-picker/datetime-picker.module';
import { BackBtnModule } from '../../_components/back-btn/back-btn.module';
import { TranslationModule } from '../../translation.module';
import { FirstLetterUppercasePipe } from '../../_pipes/first-letter-uppercase.pipe';
import { EditServiceRoutingModule } from './edit-service-routing.module';
import { EditServiceComponent } from './edit-service.component';
@ -24,7 +25,8 @@ import { EditServiceComponent } from './edit-service.component';
MapPickerModule,
DatetimePickerModule,
BackBtnModule,
TranslationModule
TranslationModule,
FirstLetterUppercasePipe
]
})
export class EditServiceModule { }

View File

@ -3,21 +3,21 @@
<form method="post" [formGroup]="trainingForm" (ngSubmit)="formSubmit()">
<div class="container">
<div class="form-group has-validation">
<label for="date-picker-start">{{ 'start'|translate|titlecase }}</label>
<label for="date-picker-start">{{ 'start'|translate|ftitlecase }}</label>
<datetime-picker formControlName="start" [class.is-invalid]="!isFieldValid('start')" id="date-picker-start"></datetime-picker>
<div class="invalid-feedback" *ngIf="start.errors?.['required']" translate>
edit_training.select_start_datetime
</div>
</div>
<div class="form-group has-validation">
<label for="date-picker-end">{{ 'end'|translate|titlecase }}</label>
<label for="date-picker-end">{{ 'end'|translate|ftitlecase }}</label>
<datetime-picker formControlName="end" [class.is-invalid]="!isFieldValid('end')" id="date-picker-end"></datetime-picker>
<div class="invalid-feedback" *ngIf="end.errors?.['required']" translate>
edit_training.select_end_datetime
</div>
</div>
<div class="form-group has-validation">
<label for="name">{{ 'name'|translate|titlecase }}</label>
<label for="name">{{ 'name'|translate|ftitlecase }}</label>
<input formControlName="name" [class.is-invalid]="!isFieldValid('name')" id="name" class="form-control"
type="text" [placeholder]="'edit_training.name_placeholder'|translate">
<div class="invalid-feedback" *ngIf="name.errors?.['required']" translate>
@ -25,7 +25,7 @@
</div>
</div>
<div class="form-group has-validation" [class.is-invalid-div]="!isFieldValid('chief')">
<label>{{ 'chief'|translate|titlecase }}</label>
<label>{{ 'chief'|translate|ftitlecase }}</label>
<br>
<ng-container *ngFor="let user of users">
<div class="form-check">
@ -51,7 +51,7 @@
</ng-container>
</div>
<div class="form-group has-validation">
<label for="place">{{ 'place'|translate|titlecase }}</label>
<label for="place">{{ 'place'|translate|ftitlecase }}</label>
<input formControlName="place" [class.is-invalid]="!isFieldValid('place')" id="place" class="form-control"
type="text">
<div class="invalid-feedback" *ngIf="place.errors?.['required']" translate>
@ -59,13 +59,13 @@
</div>
</div>
<div class="form-group">
<label for="notes">{{ 'notes'|translate|titlecase }}</label><br>
<label for="notes">{{ 'notes'|translate|ftitlecase }}</label><br>
<textarea formControlName="notes" class="form-control" id="notes"></textarea>
</div>
<br>
<br>
<button id="submit_button" type="submit" class="btn btn-primary" [disabled]="submittingForm">{{ 'submit'|translate|titlecase }}</button>
<button class="btn" type="button" (click)="formReset()" [disabled]="submittingForm">{{ 'reset'|translate|titlecase }}</button>
<button id="submit_button" type="submit" class="btn btn-primary" [disabled]="submittingForm">{{ 'submit'|translate|ftitlecase }}</button>
<button class="btn" type="button" (click)="formReset()" [disabled]="submittingForm">{{ 'reset'|translate|ftitlecase }}</button>
<div class="d-flex justify-content-center mt-2 pt-2 mb-3" *ngIf="submittingForm">
<div class="spinner spinner-border"></div>
</div>

View File

@ -7,6 +7,7 @@ import { MapPickerModule } from '../../_components/map-picker/map-picker.module'
import { DatetimePickerModule } from '../../_components/datetime-picker/datetime-picker.module';
import { BackBtnModule } from '../../_components/back-btn/back-btn.module';
import { TranslationModule } from '../../translation.module';
import { FirstLetterUppercasePipe } from '../../_pipes/first-letter-uppercase.pipe';
import { EditTrainingRoutingModule } from './edit-training-routing.module';
import { EditTrainingComponent } from './edit-training.component';
@ -24,7 +25,8 @@ import { EditTrainingComponent } from './edit-training.component';
MapPickerModule,
DatetimePickerModule,
BackBtnModule,
TranslationModule
TranslationModule,
FirstLetterUppercasePipe
]
})
export class EditTrainingModule { }

View File

@ -8,142 +8,142 @@
<form [formGroup]="profileForm" (ngSubmit)="formSubmit()" class="row g-4 m-3">
<div class="col-md-6">
<label for="name" class="form-label">{{ 'name'|translate|titlecase }}</label>
<label for="name" class="form-label">{{ 'name'|translate|ftitlecase }}</label>
<input formControlName="name" autocomplete="name" type="text" class="form-control" id="name">
</div>
<div class="col-md-6">
<label for="surname" class="form-label">{{ 'surname'|translate|titlecase }}</label>
<label for="surname" class="form-label">{{ 'surname'|translate|ftitlecase }}</label>
<input formControlName="surname" autocomplete="additional-name" type="text" class="form-control" id="surname">
</div>
<div class="col-md-6">
<label for="username" class="form-label">{{ 'username'|translate|titlecase }}</label>
<label for="username" class="form-label">{{ 'username'|translate|ftitlecase }}</label>
<input formControlName="username" autocomplete="username" type="text" class="form-control" id="username">
</div>
<div class="col-md-6">
<label for="ssn" class="form-label">{{ 'ssn'|translate|titlecase }}</label>
<label for="ssn" class="form-label">{{ 'ssn'|translate|ftitlecase }}</label>
<input formControlName="ssn" autocomplete="ssn" type="text" class="form-control" id="ssn">
</div>
<div class="col-md-6">
<label for="birthday" class="form-label">{{ 'birthday'|translate|titlecase }}</label>
<input formControlName="birthday" autocomplete="bday" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|titlecase" id="birthday" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="birthdayMaxDate">
<label for="birthday" class="form-label">{{ 'birthday'|translate|ftitlecase }}</label>
<input formControlName="birthday" autocomplete="bday" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|ftitlecase" id="birthday" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="birthdayMaxDate">
</div>
<div class="col-md-6">
<label for="birthplace" class="form-label">{{ 'birthplace'|translate|titlecase }}</label>
<label for="birthplace" class="form-label">{{ 'birthplace'|translate|ftitlecase }}</label>
<div class="input-group" id="birthplace">
<input formControlName="birthplace" type="text" class="form-control" [placeholder]="'place'|translate|titlecase">
<input formControlName="birthplace_province" type="text" class="form-control" [placeholder]="'province'|translate|titlecase">
<input formControlName="birthplace" type="text" class="form-control" [placeholder]="'place'|translate|ftitlecase">
<input formControlName="birthplace_province" type="text" class="form-control" [placeholder]="'province'|translate|ftitlecase">
</div>
</div>
<h2 class="text-center mt-5"><i class="fas fa-fire-extinguisher"></i> {{ 'service_information'|translate|titlecase }}</h2>
<h2 class="text-center mt-5"><i class="fas fa-fire-extinguisher"></i> {{ 'service_information'|translate|ftitlecase }}</h2>
<div class="col-md-12">
<label for="course_date" class="form-label">{{ 'course_date'|translate|titlecase }}</label>
<input formControlName="course_date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|titlecase" id="course_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="birthdayMaxDate">
<label for="course_date" class="form-label">{{ 'course_date'|translate|ftitlecase }}</label>
<input formControlName="course_date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|ftitlecase" id="course_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [maxDate]="birthdayMaxDate">
</div>
<div class="col-md-6">
<label for="driver" class="form-label">{{ 'driver'|translate|titlecase }}</label>
<label for="driver" class="form-label">{{ 'driver'|translate|ftitlecase }}</label>
<div class="form-check form-switch">
<input formControlName="driver" class="form-check-input custom-check-input" type="checkbox" role="switch" id="driver">
</div>
</div>
<div class="col-md-6">
<label for="chief" class="form-label">{{ 'chief'|translate|titlecase }}</label>
<label for="chief" class="form-label">{{ 'chief'|translate|ftitlecase }}</label>
<div class="form-check form-switch">
<input formControlName="chief" class="form-check-input custom-check-input" type="checkbox" role="switch" id="chief">
</div>
</div>
<div class="col-md-6">
<label for="banned" class="form-label">{{ 'banned'|translate|titlecase }}</label>
<label for="banned" class="form-label">{{ 'banned'|translate|ftitlecase }}</label>
<div class="form-check form-switch">
<input formControlName="banned" class="form-check-input custom-check-input" type="checkbox" role="switch" id="banned">
</div>
</div>
<div class="col-md-6">
<label for="hidden" class="form-label">{{ 'hidden'|translate|titlecase }}</label>
<label for="hidden" class="form-label">{{ 'hidden'|translate|ftitlecase }}</label>
<div class="form-check form-switch">
<input formControlName="hidden" class="form-check-input custom-check-input" type="checkbox" role="switch" id="hidden">
</div>
</div>
<div class="col-md-6">
<label for="creation_date" class="form-label">{{ 'edit_user.creation_date'|translate|titlecase }}</label>
<label for="creation_date" class="form-label">{{ 'edit_user.creation_date'|translate|ftitlecase }}</label>
<input type="text" class="form-control" disabled id="creation_date" [value]="creation_date">
</div>
<div class="col-md-6">
<label for="update_date" class="form-label">{{ 'edit_user.last_update'|translate|titlecase }}</label>
<label for="update_date" class="form-label">{{ 'edit_user.last_update'|translate|ftitlecase }}</label>
<input type="text" class="form-control" disabled id="update_date" [value]="update_date">
</div>
<div class="col-md-12">
<label for="last_access_date" class="form-label">{{ 'edit_user.last_access'|translate|titlecase }}</label>
<label for="last_access_date" class="form-label">{{ 'edit_user.last_access'|translate|ftitlecase }}</label>
<input type="text" class="form-control" disabled id="last_access_date" [value]="last_access_date">
</div>
<h2 class="text-center mt-5"><i class="fas fa-phone"></i> {{ 'contact_information'|translate|titlecase }}</h2>
<h2 class="text-center mt-5"><i class="fas fa-phone"></i> {{ 'contact_information'|translate|ftitlecase }}</h2>
<div class="col-md-8">
<label for="address" class="form-label">{{ 'address'|translate|titlecase }}</label>
<label for="address" class="form-label">{{ 'address'|translate|ftitlecase }}</label>
<input formControlName="address" type="text" class="form-control" id="address">
</div>
<div class="col-md-4">
<label for="address_zip_code" class="form-label">{{ 'zip_code'|translate|titlecase }}</label>
<label for="address_zip_code" class="form-label">{{ 'zip_code'|translate|ftitlecase }}</label>
<input formControlName="address_zip_code" type="number" class="form-control" id="address_zip_code" placeholder="12345">
</div>
<div class="col-md-6">
<label for="phone_number" class="form-label">{{ 'phone_number'|translate|titlecase }}</label>
<label for="phone_number" class="form-label">{{ 'phone_number'|translate|ftitlecase }}</label>
<input formControlName="phone_number" type="number" class="form-control" id="phone_number">
</div>
<div class="col-md-6">
<label for="email" class="form-label">{{ 'email'|translate|titlecase }}</label>
<label for="email" class="form-label">{{ 'email'|translate|ftitlecase }}</label>
<input formControlName="email" type="email" class="form-control" id="email">
</div>
<h2 class="text-center mt-5"><i class="fas fa-id-card"></i> {{ 'documents'|translate|titlecase }}</h2>
<h2 class="text-center mt-5"><i class="fas fa-id-card"></i> {{ 'documents'|translate|ftitlecase }}</h2>
<ng-container formGroupName="driving_license">
<h3 class="text-center mt-3">{{ 'driving_license'|translate|titlecase }} <i class="fas fa-car-side"></i></h3>
<h3 class="text-center mt-3">{{ 'driving_license'|translate|ftitlecase }} <i class="fas fa-car-side"></i></h3>
<div class="col-md-12" *ngIf="dlCurrScanUrl !== null">
<img [src]="dlCurrScanUrl" class="img-fluid rounded mx-auto d-block w-50">
</div>
<div class="col-md-6">
<label for="dl_number" class="form-label">{{ 'driving_license_number'|translate|titlecase }}</label>
<label for="dl_number" class="form-label">{{ 'driving_license_number'|translate|ftitlecase }}</label>
<input formControlName="number" autocomplete="dl-number" type="text" class="form-control" id="dl_number" placeholder="AB1234567">
</div>
<div class="col-md-6">
<label for="dl_type" class="form-label">{{ 'driving_license_type'|translate|titlecase }}</label>
<label for="dl_type" class="form-label">{{ 'driving_license_type'|translate|ftitlecase }}</label>
<input formControlName="type" autocomplete="dl-type" type="text" class="form-control" id="dl_type">
</div>
<div class="col-md-6">
<label for="dl_expiration_date" class="form-label">{{ 'driving_license_expiration_date'|translate|titlecase }}</label>
<input formControlName="expiration_date" autocomplete="dl-expiration-date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|titlecase" id="dl_expiration_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [minDate]="dlExpirationMinDate">
<label for="dl_expiration_date" class="form-label">{{ 'driving_license_expiration_date'|translate|ftitlecase }}</label>
<input formControlName="expiration_date" autocomplete="dl-expiration-date" type="text" class="form-control" [placeholder]="'press_to_select_a_date'|translate|ftitlecase" id="dl_expiration_date" bsDatepicker [bsConfig]="{ adaptivePosition: true, dateInputFormat: 'DD/MM/YYYY' }" [minDate]="dlExpirationMinDate">
</div>
<div class="col-md-6">
<label for="dl_scan" class="form-label">{{ 'driving_license_scan'|translate|titlecase }}</label>
<label for="dl_scan" class="form-label">{{ 'driving_license_scan'|translate|ftitlecase }}</label>
<input class="form-control" type="file" id="dl_scan" (change)="onDrivingLicenseScanSelected($event)" #drivingLicenseFileUpload>
<div *ngIf="tmpDrivingLicenseImgData !== null">
<img [src]="tmpDrivingLicenseImgData" class="img-fluid p-1 w-75">
<button type="button" class="btn btn-primary" *ngIf="dlScanNotUploadedYet" (click)="uploadDrivingLicenseScan(drivingLicenseFileUpload)">
<i class="fas fa-upload"></i> {{ 'upload_scan'|translate|titlecase }}
<i class="fas fa-upload"></i> {{ 'upload_scan'|translate|ftitlecase }}
</button>
</div>
</div>
</ng-container>
<h2 class="text-center mt-5"><i class="fas fa-tshirt"></i> {{ 'clothings'|translate|titlecase }}</h2>
<h2 class="text-center mt-5"><i class="fas fa-tshirt"></i> {{ 'clothings'|translate|ftitlecase }}</h2>
<div class="col-md-6">
<label for="suit_size" class="form-label">{{ 'suit_size'|translate|titlecase }}</label>
<label for="suit_size" class="form-label">{{ 'suit_size'|translate|ftitlecase }}</label>
<input formControlName="suit_size" type="text" class="form-control" id="suit_size" placeholder="M, L, XL...">
</div>
<div class="col-md-6">
<label for="boot_size" class="form-label">{{ 'boot_size'|translate|titlecase }}</label>
<label for="boot_size" class="form-label">{{ 'boot_size'|translate|ftitlecase }}</label>
<input formControlName="boot_size" type="text" class="form-control" id="boot_size" placeholder="41, 42, 43...">
</div>
<div class="col-12 m-3 mt-4">
<button type="submit" class="btn btn-lg btn-primary">{{ 'update'|translate|titlecase }}</button>
<button type="submit" class="btn btn-lg btn-primary">{{ 'update'|translate|ftitlecase }}</button>
</div>
</form>
@ -185,17 +185,17 @@
<hr>
<div class="text-center">
<h3>Visite mediche</h3>
<h3>{{ 'medical_examinations'|translate|uppercase }}</h3>
<button *ngIf="!hideMEAddBtn" class="btn btn-sm btn-outline-success m-2" (click)="openModalAddMedicalExamination()">
<i class="fas fa-plus"></i> {{ 'add'|translate|titlecase }}
<i class="fas fa-plus"></i> {{ 'add'|translate|ftitlecase }}
</button>
<table class="mx-auto table table-striped table-bordered table-responsive">
<thead>
<tr>
<th>DATA</th>
<th>ENTE</th>
<th>SCADENZA</th>
<th *ngIf="!hideMECertCol">CERT.</th>
<th>{{ 'date'|translate|uppercase }}</th>
<th>{{ 'certifier'|translate|uppercase }}</th>
<th>{{ 'expiration_date'|translate|uppercase }}</th>
<th *ngIf="!hideMECertCol">{{ 'certificate_short'|translate|uppercase }}</th>
</tr>
</thead>

View File

@ -161,7 +161,7 @@ export class EditUserComponent implements OnInit {
event.target.value = null;
Swal.fire({
title: this.translateService.instant("error_title"),
text: this.translateService.instant("edit_user.image_format_not_supported"),
text: this.translateService.instant("validation.image_format_not_supported"),
icon: 'error',
confirmButtonText: 'Ok'
});
@ -171,7 +171,7 @@ export class EditUserComponent implements OnInit {
event.target.value = null;
Swal.fire({
title: this.translateService.instant("error_title"),
text: this.translateService.instant("edit_user.file_too_big"),
text: this.translateService.instant("validation.file_too_big"),
icon: 'error',
confirmButtonText: 'Ok'
});

View File

@ -6,6 +6,7 @@ import { BsDatepickerModule } from 'ngx-bootstrap/datepicker';
import { BackBtnModule } from '../../_components/back-btn/back-btn.module';
import { ModalAddMedicalExaminationModule } from 'src/app/_components/modal-add-medical-examination/modal-add-medical-examination.module';
import { TranslationModule } from '../../translation.module';
import { FirstLetterUppercasePipe } from 'src/app/_pipes/first-letter-uppercase.pipe';
import { EditUserRoutingModule } from './edit-user-routing.module';
import { EditUserComponent } from './edit-user.component';
@ -22,7 +23,8 @@ import { EditUserComponent } from './edit-user.component';
BsDatepickerModule.forRoot(),
BackBtnModule,
ModalAddMedicalExaminationModule,
TranslationModule
TranslationModule,
FirstLetterUppercasePipe
]
})
export class EditUserModule { }

View File

@ -1,8 +1,8 @@
<div class="text-center">
<h3 *ngIf="available !== undefined">{{ 'list.your_availability_is'|translate }} <b>{{ available ? ("available"|translate|uppercase) : ("unavailable"|translate|uppercase) }}{{ manual_mode ? "" : " ("+('programmed'|translate)+")" }}</b></h3>
<div id="availability-btn-group">
<button (click)="changeAvailibility(1)" type="button" id="activate-btn" class="btn btn-lg btn-success me-1">{{ 'set_available'|translate|titlecase }}</button>
<button (click)="changeAvailibility(0)" type="button" id="deactivate-btn" class="btn btn-lg btn-danger">{{ 'set_unavailable'|translate|titlecase }}</button>
<button (click)="changeAvailibility(1)" type="button" id="activate-btn" class="btn btn-lg btn-success me-1">{{ 'set_available'|translate|ftitlecase }}</button>
<button (click)="changeAvailibility(0)" type="button" id="deactivate-btn" class="btn btn-lg btn-danger">{{ 'set_unavailable'|translate|ftitlecase }}</button>
</div>
<ng-container *ngIf="manual_mode !== undefined">
<button type="button" class="btn btn-secondary" *ngIf="manual_mode" (click)="updateManualMode(0)">

View File

@ -4,11 +4,11 @@
<div class="my-2 text-danger" *ngIf="!loginResponse.loginOk">{{ loginResponse.message }}</div>
<div class="form-floating">
<input type="text" class="form-control" (keydown.enter)="inputPassword.focus()" [(ngModel)]="username" id="username" [placeholder]="'username'|translate">
<label for="username">{{ 'username'|translate|titlecase }}</label>
<label for="username">{{ 'username'|translate|ftitlecase }}</label>
</div>
<div class="form-floating">
<input type="password" class="form-control" (keydown.enter)="login()" [(ngModel)]="password" id="password" [placeholder]="'password'|translate" #inputPassword>
<label for="password">{{ 'password'|translate|titlecase }}</label>
<label for="password">{{ 'password'|translate|ftitlecase }}</label>
</div>
<button class="w-100 btn btn-lg btn-primary" (click)="login()" [disabled]="loading">
<span *ngIf="!loading" translate>login.submit_btn</span>

View File

@ -12,27 +12,27 @@
</h3>
<br>
<h4 *ngIf="place_info.name">
{{ 'name'|translate|titlecase }}: <b>{{ place_info.name }}</b>
{{ 'name'|translate|ftitlecase }}: <b>{{ place_info.name }}</b>
</h4>
<h4 *ngIf="place_info.country">
{{ 'place_details.country'|translate|titlecase }}: <b>
{{ 'place_details.country'|translate|ftitlecase }}: <b>
{{ place_info.country }} ({{ place_info.country_code }})
<ng-container *ngIf="place_info.state">- {{ place_info.state }}</ng-container>
</b>
</h4>
<h4 *ngIf="place_info.village">
{{ 'place_details.village'|translate|titlecase }}: <b>
{{ 'place_details.village'|translate|ftitlecase }}: <b>
{{ place_info.village }}
<ng-container *ngIf="place_info.suburb">- {{ place_info.suburb }}</ng-container>
</b> ({{ 'place_details.postcode'|translate }} <b>{{ place_info.postcode }}</b>)
</h4>
<h4 *ngIf="place_info.municipality">
{{ 'place_details.municipality'|translate|titlecase }}: <b>{{ place_info.municipality }}</b>
{{ 'place_details.municipality'|translate|ftitlecase }}: <b>{{ place_info.municipality }}</b>
</h4>
<h4 *ngIf="place_info.road">
{{ 'place_details.road'|translate|titlecase }}: <b>{{ place_info.road }}</b>
{{ 'place_details.road'|translate|ftitlecase }}: <b>{{ place_info.road }}</b>
</h4>
<h4 *ngIf="place_info.house_number">
{{ 'place_details.house_number'|translate|titlecase }}: <b>{{ place_info.house_number }}</b>
{{ 'place_details.house_number'|translate|ftitlecase }}: <b>{{ place_info.house_number }}</b>
</h4>
</div>

View File

@ -1,6 +1,7 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { TranslationModule } from '../../translation.module';
import { FirstLetterUppercasePipe } from 'src/app/_pipes/first-letter-uppercase.pipe';
import { LeafletModule } from '@asymmetrik/ngx-leaflet';
import { BackBtnModule } from '../../_components/back-btn/back-btn.module';
@ -17,7 +18,8 @@ import { PlaceDetailsComponent } from './place-details.component';
PlaceDetailsRoutingModule,
LeafletModule,
BackBtnModule,
TranslationModule
TranslationModule,
FirstLetterUppercasePipe
]
})
export class PlaceDetailsModule { }

View File

@ -1,6 +1,6 @@
<owner-image></owner-image>
<div class="text-center mb-4">
<button type="button" class="btn btn-primary" (click)="addService()">{{ 'add'|translate|titlecase }} {{ 'service'|translate }}</button>
<button type="button" class="btn btn-primary" (click)="addService()">{{ 'add'|translate|ftitlecase }} {{ 'service'|translate }}</button>
</div>
<div class="text-center">
<div class="alert alert-primary mt-4" role="alert">

View File

@ -1,5 +1,5 @@
<owner-image></owner-image>
<div class="text-center mb-4">
<button type="button" class="btn btn-primary" (click)="addTraining()">{{ 'add'|translate|titlecase }} {{ 'training'|translate }}</button>
<button type="button" class="btn btn-primary" (click)="addTraining()">{{ 'add'|translate|ftitlecase }} {{ 'training'|translate }}</button>
</div>
<app-table [sourceType]="'trainings'" [refreshInterval]="1200000"></app-table>

View File

@ -3,7 +3,7 @@
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/services" translate>menu.services</a>
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/trainings" translate>menu.trainings</a>
<a routerLinkActive="active" (click)="menuButtonClicked = false" routerLink="/logs" translate>menu.logs</a>
<a style="float: right;" id="logout" routerLinkActive="active" [routerLink]="auth.profile.profilePageLink">{{ 'menu.hi'|translate|titlecase }}, {{ auth.profile.name }}. <b id="logout-text" (click)="logout($event)" translate *ngIf="!auth.profile.impersonating_user">menu.logout</b><b id="logout-text" (click)="auth.logout()" translate *ngIf="auth.profile.impersonating_user">menu.stop_impersonating</b></a>
<a style="float: right;" id="logout" routerLinkActive="active" [routerLink]="auth.profile.profilePageLink">{{ 'menu.hi'|translate|ftitlecase }}, {{ auth.profile.name }}. <b id="logout-text" (click)="logout($event)" translate *ngIf="!auth.profile.impersonating_user">menu.logout</b><b id="logout-text" (click)="auth.logout()" translate *ngIf="auth.profile.impersonating_user">menu.stop_impersonating</b></a>
<a class="icon" id="menuButton" (click)="menuButtonClicked = !menuButtonClicked"></a>
</div>
@ -13,7 +13,7 @@
</div>
<alert type="danger" *ngIf="alerts.length > 0">
<strong>{{ 'warning'|translate|titlecase }}!</strong> {{ 'alert.warning_body'|translate }}<br>
<strong>{{ 'warning'|translate|ftitlecase }}!</strong> {{ 'alert.warning_body'|translate }}<br>
<ng-container *ngIf="alerts.length == 1">
{{ 'alert.current_alert'|translate }}: <a (click)="openAlert(alerts[0]['id'])"><b>{{ alerts[0]["created_at"] | date:'dd/MM/YYYY, HH:mm:ss' }}</b> ({{ 'press_for_more_info'|translate }})</a>
</ng-container>
@ -32,5 +32,5 @@
<div id="footer" class="footer text-center p-3">
{{ 'footer_text' | translate }}<br>
<p>{{ 'revision' | translate | titlecase }} {{ versions.revision }} ({{ revision_datetime_string }})</p>
<p>{{ 'revision' | translate | ftitlecase }} {{ versions.revision }} ({{ revision_datetime_string }})</p>
</div>

View File

@ -37,6 +37,9 @@ import { TrainingsComponent } from './_routes/trainings/trainings.component';
import { AuthInterceptor } from './_providers/auth-interceptor.provider';
//import { ApplicationPipesModule } from './_pipes/application-pipes.module';
import { FirstLetterUppercasePipe } from './_pipes/first-letter-uppercase.pipe';
@NgModule({
declarations: [
AppComponent,
@ -86,7 +89,12 @@ import { AuthInterceptor } from './_providers/auth-interceptor.provider';
deps: [HttpClient]
}
}),
TranslationModule
TranslationModule,
//ApplicationPipesModule
FirstLetterUppercasePipe
],
exports: [
FirstLetterUppercasePipe
],
providers: [
{

View File

@ -37,6 +37,7 @@
"current_alerts": "Current alerts",
"state": "Alert state",
"closed": "Alert closed",
"request_response_question": "Do you respond to the alert?",
"response_status": "Response status",
"no_response": "No response",
"waiting_for_response": "Waiting for response",
@ -67,7 +68,6 @@
"place_load_failed": "Place could not be loaded. Please try again"
},
"map_picker": {
"place_min_length": "Place name must be at least 3 characters long",
"loading_error": "Error loading search results. Please try again later"
},
"edit_service": {
@ -77,8 +77,6 @@
"other_crew_members": "Other crew members",
"select_type": "Select a type",
"select_service_type": "Select a service type",
"type_must_be_two_characters_long": "Type must be at least 2 characters long",
"type_already_exists": "Type already exists",
"type_added_successfully": "Type added successfully",
"service_added_successfully": "Service added successfully",
"service_add_failed": "Service could not be added. Please try again",
@ -99,12 +97,10 @@
"training_add_failed": "Training could not be added. Please try again",
"training_updated_successfully": "Training updated successfully",
"training_update_failed": "Training could not be updated. Please try again",
"training_load_failed": "Errore durante il caricamento dell'intervento. Riprovare più tardi",
"users_load_failed": "Errore durante il caricamento degli utenti. Riprovare più tardi"
"training_load_failed": "Error loading training. Please try again",
"users_load_failed": "Error loading users. Please try again"
},
"edit_user": {
"image_format_not_supported": "Image format not supported",
"file_too_big": "File too big",
"success_text": "User updated successfully",
"error_text": "User could not be updated. Please try again",
"creation_date": "User creation date",
@ -114,6 +110,17 @@
"user_info_modal": {
"title": "User info"
},
"medical_examination_modal": {
"title": "Add medical examination"
},
"validation": {
"place_min_length": "Place name must be at least 3 characters long",
"type_must_be_two_characters_long": "Type must be at least 2 characters long",
"type_already_exists": "Type already exists",
"image_format_not_supported": "Image format not supported",
"document_format_not_supported": "Document format not supported",
"file_too_big": "File too big"
},
"username": "username",
"password": "password",
"warning": "warning",
@ -160,9 +167,15 @@
"driving_license_type": "driving license type",
"driving_license_scan": "driving license scan",
"upload_scan": "upload scan",
"upload_medical_examination_certificate": "upload medical examination certificate",
"clothings": "clothings",
"suit_size": "suit size",
"boot_size": "boot size",
"medical_examinations": "medical examinations",
"date": "date",
"expiration_date": "expiration date",
"certifier": "certifier",
"certificate_short": "cert.",
"banned": "banned",
"hidden": "hidden",
"driver": "driver",
@ -195,18 +208,23 @@
"search": "search",
"submit": "invia",
"reset": "reset",
"go_back": "go back",
"go_back": "Go back",
"next": "next",
"previous": "previous",
"last": "last",
"first": "first",
"press_to_select_a_date": "press to select a date",
"press_to_select_a_date": "Press to select a date",
"footer_text": "Allerta-VVF, free software developed for volunteer firefighters brigades.",
"revision": "revision",
"unknown": "unknown",
"edit": "edit",
"never": "never",
"optional": "optional",
"not_enough_permissions": "You don't have enough permissions to access this page.",
"error_title": "Error",
"success_title": "Successo"
"success_title": "Success",
"select_date_range": "Select date range",
"remove_date_filters": "Remove date filters",
"yes": "yes",
"no": "no"
}

View File

@ -37,6 +37,7 @@
"current_alerts": "Emergenze in corso",
"state": "Stato dell'allerta",
"closed": "Allerta rientrata",
"request_response_question": "Sarai presente alla chiamata?",
"response_status": "Stato della risposta",
"no_response": "Nessuna risposta",
"waiting_for_response": "In attesa di risposta",
@ -67,7 +68,6 @@
"place_load_failed": "Errore durante il caricamento del luogo. Riprova più tardi"
},
"map_picker": {
"place_min_length": "Il nome della località deve essere di almeno 3 caratteri",
"loading_error": "Errore di caricamento dei risultati della ricerca. Riprovare più tardi"
},
"edit_service": {
@ -77,7 +77,6 @@
"other_crew_members": "Altri membri della squadra",
"select_type": "Seleziona una tipologia",
"select_service_type": "Seleziona una tipologia di intervento",
"type_must_be_two_characters_long": "La tipologia deve essere di almeno 2 caratteri",
"type_already_exists": "La tipologia è già presente",
"type_added_successfully": "Tipologia aggiunta con successo",
"service_added_successfully": "Intervento aggiunto con successo",
@ -103,8 +102,6 @@
"users_load_failed": "Errore durante il caricamento degli utenti. Riprovare più tardi"
},
"edit_user": {
"image_format_not_supported": "Formato immagine non supportato",
"file_too_big": "File troppo grande",
"success_text": "Utente aggiornato con successo",
"error_text": "L'utente non può essere aggiornato. Riprova più tardi",
"creation_date": "Data di creazione dell'utente",
@ -114,6 +111,15 @@
"user_info_modal": {
"title": "Scheda utente"
},
"medical_examination_modal": {
"title": "Aggiungi visita medica"
},
"validation": {
"place_min_length": "Il nome della località deve essere di almeno 3 caratteri",
"type_must_be_two_characters_long": "La tipologia deve essere di almeno 2 caratteri",
"image_format_not_supported": "Formato immagine non supportato",
"file_too_big": "File troppo grande"
},
"username": "username",
"password": "password",
"warning": "attenzione",
@ -160,9 +166,15 @@
"driving_license_type": "tipologia patente",
"driving_license_scan": "scansione patente",
"upload_scan": "carica scansione",
"upload_medical_examination_certificate": "carica certificato visita medica",
"clothings": "indumenti",
"suit_size": "taglia tuta",
"boot_size": "taglia scarponi",
"medical_examinations": "visite mediche",
"date": "data",
"expiration_date": "data di scadenza",
"certifier": "ente/certificatore",
"certificate_short": "cert.",
"banned": "bannato",
"hidden": "nascosto",
"driver": "autista",
@ -195,18 +207,23 @@
"search": "cerca",
"submit": "invia",
"reset": "reset",
"go_back": "torna indietro",
"go_back": "Torna indietro",
"next": "successiva",
"previous": "precedente",
"last": "ultima",
"first": "prima",
"press_to_select_a_date": "premi per selezionare una data",
"press_to_select_a_date": "Premi per selezionare una data",
"footer_text": "Allerta-VVF, software libero realizzato per i Vigili del Fuoco volontari.",
"revision": "revisione",
"unknown": "sconosciuto",
"edit": "modifica",
"never": "mai",
"optional": "opzionale",
"not_enough_permissions": "Non hai i permessi necessari per accedere a questa pagina.",
"error_title": "Errore",
"success_title": "Successo"
"success_title": "Successo",
"select_date_range": "Seleziona un intervallo di date",
"remove_date_filters": "Rimuovi filtri",
"yes": "si",
"no": "no"
}