FlorianEisenmenger 11 месяцев назад
Родитель
Сommit
6ba29155a7
18 измененных файлов: 457 добавлений и 361 удалений
  1. +17
    -12
      angular/src/app/_components/image-upload/image-upload.component.html
  2. +1
    -1
      angular/src/app/_components/list/list.component.ts
  3. +55
    -55
      angular/src/app/_views/location/location-form/location-form.component.html
  4. +28
    -26
      angular/src/app/_views/shipping-company/shipping-company-form/shipping-company-form.component.html
  5. +31
    -24
      angular/src/app/_views/trip/trip-detail/trip-detail.component.html
  6. +78
    -78
      angular/src/app/_views/trip/trip-form/trip-form.component.html
  7. +24
    -22
      angular/src/app/_views/user-trip/user-trip-detail/user-trip-detail.component.html
  8. +24
    -20
      angular/src/app/_views/user-trip/user-trip-form/user-trip-form.component.html
  9. +46
    -51
      angular/src/app/_views/user/user-form/user-form.component.html
  10. +41
    -40
      angular/src/app/_views/vessel/vessel-form/vessel-form.component.html
  11. +15
    -13
      angular/src/app/_views/zone/zone-form/zone-form.component.html
  12. +0
    -1
      angular/src/app/core/api/v1/model/constraintViolationJsonldJsonld.ts
  13. +0
    -1
      angular/src/app/core/api/v1/model/errorJsonld.ts
  14. +6
    -2
      angular/src/assets/i18n/en.json
  15. +4
    -2
      angular/src/assets/scss/_basics.scss
  16. +35
    -3
      angular/src/assets/scss/_dark.scss
  17. +35
    -0
      angular/src/assets/scss/_form.scss
  18. +17
    -10
      httpdocs/src/DataFixtures/AppFixtures.php

+ 17
- 12
angular/src/app/_components/image-upload/image-upload.component.html Просмотреть файл

@@ -1,19 +1,24 @@
<div class="mb-3">
<label [for]="fieldId" class="form-label">{{ label }}:</label>
<div class="row">
<div class="col-12 col-lg-6 mb-3">
<label [for]="fieldId" class="form-label">{{ label }}:</label>

<!-- File-Input ist deaktiviert, wenn ein Bild existiert und nicht zum Löschen markiert ist -->
<input type="file" class="form-control" [id]="fieldId"
[disabled]="disabled || (imageUrl && showImage)"
(change)="onFileSelected($event)"/>
<!-- File-Input ist deaktiviert, wenn ein Bild existiert und nicht zum Löschen markiert ist -->
<input type="file" class="form-control" [id]="fieldId"
[disabled]="disabled || (imageUrl && showImage)"
(change)="onFileSelected($event)"/>

@if (selectedFile) {
<small class="text-muted">{{ selectedFile.name }}</small>
}
@if (selectedFile) {
<small class="text-muted">{{ selectedFile.name }}</small>
}
</div>

@if (imageUrl && showImage) {
<div class="mt-1 d-flex align-items-start gap-2">
<img [src]="imageUrl" [alt]="label" class="img-fluid" />
<button type="button" class="btn btn-sm btn-danger" (click)="deleteImage()">X</button>
<div class="col-12 col-lg-6 mb-3">
<span class="form-label">&nbsp;</span>
<div class="image-display">
<img [src]="imageUrl" [alt]="label" class="img-fluid" />
<button type="button" class="btn btn-sm btn-danger" (click)="deleteImage()">X</button>
</div>
</div>
}
</div>

+ 1
- 1
angular/src/app/_components/list/list.component.ts Просмотреть файл

@@ -295,7 +295,7 @@ export class ListComponent implements OnInit, AfterViewInit, OnDestroy {
if (elementValue !== undefined && elementValue !== null) {
return elementValue;
}
return "/assets/images/icons/dummy-product.png"
return "/assets/images/icons/dummy-person.png"
}




+ 55
- 55
angular/src/app/_views/location/location-form/location-form.component.html Просмотреть файл

@@ -4,63 +4,63 @@
</div>
<div class="spt-form">
<form [formGroup]="locationForm" (ngSubmit)="onSubmit()">
<div class="mb-3">
<label for="name" class="form-label">{{ 'common.name' | translate }}*:</label>
<input type="text" class="form-control" id="name" formControlName="name" required/>
<div class="row">
<div class="col-12 col-lg-6 mb-3">
<label for="name" class="form-label">{{ 'common.name' | translate }}*:</label>
<input type="text" class="form-control" id="name" formControlName="name" required/>
</div>
<div class="col-12 col-lg-6 mb-3">
<label for="code" class="form-label">{{ 'common.code' | translate }}*:</label>
<input type="text" class="form-control" id="code" formControlName="code" required/>
</div>
<div class="col-12 mb-3">
<label for="zoneIri" class="form-label">{{ 'model.zone' | translate }}:</label>
<app-search-select #zoneSearchSelect
[formId]="'zoneIri'"
[formLabelLangKey]="'model.zone'"
[documentForm]="form"
[getDataFunction]="getZones"
[displayedDataField]="'name'"
[listColDefinitions]="zoneColDefinitions"
[dataSet]="data?.zone"
>
</app-search-select>
<input id="zoneIri" type="hidden" formControlName="zoneIri"/>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'location.is_zone' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="isZone">
<span class="slider round"></span>
</label>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'location.is_place' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="isPlace">
<span class="slider round"></span>
</label>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'location.is_port' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="isPort">
<span class="slider round"></span>
</label>
</div>
</div>
<div class="mb-3">
<label for="code" class="form-label">{{ 'common.code' | translate }}*:</label>
<input type="text" class="form-control" id="code" formControlName="code" required/>
</div>
<div class="mb-3">
<label for="zoneIri" class="form-label">{{ 'model.zone' | translate }}:</label>
<app-search-select #zoneSearchSelect
[formId]="'zoneIri'"
[formLabelLangKey]="'model.zone'"
[documentForm]="form"
[getDataFunction]="getZones"
[displayedDataField]="'name'"
[listColDefinitions]="zoneColDefinitions"
[dataSet]="data?.zone"
>
</app-search-select>
<input id="zoneIri" type="hidden" formControlName="zoneIri"/>
</div>

<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'location.is_zone' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="isZone">
<span class="slider round"></span>
</label>
</div>

<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'location.is_place' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="isPlace">
<span class="slider round"></span>
</label>
</div>

<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'location.is_port' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="isPort">
<span class="slider round"></span>
</label>
</div>

<div class="flex gap-2">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.location' | translate }}
<div class="row">
<div class="col-12 mb-3">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>
}

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.location' | translate }}
</button>
}
</div>
</div>
</form>
</div>


+ 28
- 26
angular/src/app/_views/shipping-company/shipping-company-form/shipping-company-form.component.html Просмотреть файл

@@ -4,34 +4,36 @@
</div>
<div class="spt-form">
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<div class="mb-3">
<label for="name" class="form-label">{{ 'common.name' | translate }}*:</label>
<input type="text"
class="form-control"
id="name"
formControlName="name"
required/>
<div class="row">
<div class="col-12 col-lg-6 mb-3">
<label for="name" class="form-label">{{ 'common.name' | translate }}*:</label>
<input type="text"
class="form-control"
id="name"
formControlName="name"
required/>
</div>
<div class="col-12 col-lg-6 mb-3">
<label for="code" class="form-label">{{ 'common.code' | translate }}*:</label>
<input type="text"
class="form-control"
id="code"
formControlName="code"
required/>
</div>
</div>

<div class="mb-3">
<label for="code" class="form-label">{{ 'common.code' | translate }}*:</label>
<input type="text"
class="form-control"
id="code"
formControlName="code"
required/>
</div>

<div class="flex gap-2">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.shipping_company' | translate }}
<div class="row">
<div class="col-12 mb-3">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>
}

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.shipping_company' | translate }}
</button>
}
</div>
</div>
</form>
</div>

+ 31
- 24
angular/src/app/_views/trip/trip-detail/trip-detail.component.html Просмотреть файл

@@ -17,9 +17,9 @@
<div>
<h4 class="mb-4">{{ 'trip.itinerary_locations' | translate }}</h4>

<div *ngFor="let tripLocation of tripLocations; let i = index" class="mb-4">
<div *ngFor="let tripLocation of tripLocations; let i = index" class="p-2 mb-2 changing-list">
<div class="row">
<div class="col-12 col-md-4 mb-3">
<div class="col-12 col-md-4 mb-1">
<label [for]="'location_' + i" class="form-label">Location*:</label>
<app-search-select
[formId]="'location'"
@@ -33,7 +33,7 @@
</app-search-select>
</div>

<div class="col-12 col-md-2 mb-3">
<div class="col-12 col-md-2 mb-1">
<label class="form-label">trip.date (Date):</label>
<div>
<input
@@ -45,7 +45,7 @@
</div>
</div>

<div class="col-12 col-md-2 mb-3">
<div class="col-12 col-md-2 mb-1">
<label class="form-label">trip.date (Time):</label>
<div>
<input
@@ -57,7 +57,7 @@
</div>
</div>

<div class="col-12 col-md-2 mb-3 d-flex align-items-end">
<div class="col-12 col-md-2 mb-1 d-flex align-items-end">
<div class="form-check">
<input
class="form-check-input"
@@ -72,30 +72,33 @@
</div>
</div>

<div class="col-12 col-md-2 mb-3 d-flex align-items-end">
<button type="button" class="btn btn-danger" (click)="removeTripLocation(i)">X</button>
<div class="col-12 col-md-2 mb-1 d-flex align-items-end">
<button type="button" class="btn btn-danger mb-3" (click)="removeTripLocation(i)">X</button>
</div>
</div>
</div>

<div class="my-3">
<button type="button" class="btn btn-primary" (click)="addNewTripLocation()">+</button>
<div class="row">
<div class="col-12 mb-3">
<button type="button" class="btn btn-primary" (click)="addNewTripLocation()">+</button>
</div>
</div>

<div class="mt-4">
<button type="button" class="btn btn-primary" (click)="saveAllTripLocations()">
{{ 'basic.save' | translate }}
</button>
<div class="row">
<div class="col-12 mb-3">
<button type="button" class="btn btn-primary" (click)="saveAllTripLocations()">
{{ 'basic.save' | translate }}
</button>
</div>
</div>
</div>
</mat-tab>
<mat-tab label="{{ 'trip.assigned_users' | translate }}">
<div>
<h4 class="mb-4">{{ 'trip.assigned_users' | translate }}</h4>

<div *ngFor="let userTrip of userTrips; let i = index" class="mb-4">
<div *ngFor="let userTrip of userTrips; let i = index" class="p-2 mb-2 changing-list">
<div class="row">
<div class="col-12 col-md-6 mb-3">
<div class="col-12 col-md-10 mb-1">
<label [for]="'user_' + i" class="form-label">{{ 'model.user' | translate }}*:</label>
<app-search-select
[formId]="'user'"
@@ -110,20 +113,24 @@
</app-search-select>
</div>

<div class="col-12 col-md-2 mb-3 d-flex align-items-end">
<button type="button" class="btn btn-danger" (click)="removeUserTrip(i)">X</button>
<div class="col-12 col-md-2 d-flex align-items-end">
<button type="button" class="btn btn-danger mb-3" (click)="removeUserTrip(i)">X</button>
</div>
</div>
</div>

<div class="my-3">
<button type="button" class="btn btn-primary" (click)="addNewUserTrip()">+</button>
<div class="row">
<div class="col-12 mb-3">
<button type="button" class="btn btn-primary" (click)="addNewUserTrip()">+</button>
</div>
</div>

<div class="mt-4">
<button type="button" class="btn btn-primary" (click)="saveAllUserTrips()">
{{ 'basic.save' | translate }}
</button>
<div class="row">
<div class="col-12 mb-3">
<button type="button" class="btn btn-primary" (click)="saveAllUserTrips()">
{{ 'basic.save' | translate }}
</button>
</div>
</div>
</div>
</mat-tab>


+ 78
- 78
angular/src/app/_views/trip/trip-form/trip-form.component.html Просмотреть файл

@@ -6,87 +6,87 @@
}
<div class="spt-form">
<form [formGroup]="tripForm" (ngSubmit)="onSubmit()">
<div class="mb-3">
<label for="vesselIri" class="form-label">{{ 'trip.vessel' | translate }}*:</label>
<app-search-select #vesselSearchSelect
[formId]="'vesselIri'"
[formLabelLangKey]="'model.vessel'"
[documentForm]="form"
[getDataFunction]="getVessels"
[displayedDataField]="'name'"
[listColDefinitions]="vesselColDefinitions"
[dataSet]="data?.vessel"
>
</app-search-select>
<input id="vesselIri" type="hidden" formControlName="vesselIri" required/>
</div>
<div class="mb-3">
<label for="startLocationIri" class="form-label">{{ 'trip.start_location' | translate }}*:</label>
<app-search-select #startLocationSearchSelect
[formId]="'startLocationIri'"
[formLabelLangKey]="'model.location'"
[documentForm]="form"
[getDataFunction]="getLocations"
[displayedDataField]="'name'"
[listColDefinitions]="locationColDefinitions"
[dataSet]="data?.startLocation"
>
</app-search-select>
<input id="startLocationIri" type="hidden" formControlName="startLocationIri" required/>
</div>
<div class="mb-3">
<label for="endLocationIri" class="form-label">{{ 'trip.end_location' | translate }}*:</label>
<app-search-select #endLocationSearchSelect
[formId]="'endLocationIri'"
[formLabelLangKey]="'model.location'"
[documentForm]="form"
[getDataFunction]="getLocations"
[displayedDataField]="'name'"
[listColDefinitions]="locationColDefinitions"
[dataSet]="data?.endLocation"
>
</app-search-select>
<input id="endLocationIri" type="hidden" formControlName="endLocationIri" required/>
</div>

<div class="mb-3">
<label for="customerReference" class="form-label">{{ 'trip.customer_reference' | translate }}:</label>
<input type="text" class="form-control" id="customerReference" formControlName="customerReference"/>
</div>

<div class="mb-3">
<label for="captainName" class="form-label">{{ 'trip.captain_name' | translate }}:</label>
<input type="text" class="form-control" id="captainName" formControlName="captainName"/>
</div>

<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3">
<app-datetime-picker
[label]="'trip.start_date' | translate"
[inputId]="'startDate'"
[initialValue]="tripForm.get('startDate')?.value ?? null"
(dateTimeChange)="onDateChange($event, 'startDate')"
></app-datetime-picker>
</div>
<div class="row">
<div class="col-12 mb-3">
<label for="vesselIri" class="form-label">{{ 'trip.vessel' | translate }}*:</label>
<app-search-select #vesselSearchSelect
[formId]="'vesselIri'"
[formLabelLangKey]="'model.vessel'"
[documentForm]="form"
[getDataFunction]="getVessels"
[displayedDataField]="'name'"
[listColDefinitions]="vesselColDefinitions"
[dataSet]="data?.vessel"
>
</app-search-select>
<input id="vesselIri" type="hidden" formControlName="vesselIri" required/>
</div>
<div class="col-12 mb-3">
<label for="startLocationIri" class="form-label">{{ 'trip.start_location' | translate }}*:</label>
<app-search-select #startLocationSearchSelect
[formId]="'startLocationIri'"
[formLabelLangKey]="'model.location'"
[documentForm]="form"
[getDataFunction]="getLocations"
[displayedDataField]="'name'"
[listColDefinitions]="locationColDefinitions"
[dataSet]="data?.startLocation"
>
</app-search-select>
<input id="startLocationIri" type="hidden" formControlName="startLocationIri" required/>
</div>
<div class="col-12 mb-3">
<label for="endLocationIri" class="form-label">{{ 'trip.end_location' | translate }}*:</label>
<app-search-select #endLocationSearchSelect
[formId]="'endLocationIri'"
[formLabelLangKey]="'model.location'"
[documentForm]="form"
[getDataFunction]="getLocations"
[displayedDataField]="'name'"
[listColDefinitions]="locationColDefinitions"
[dataSet]="data?.endLocation"
>
</app-search-select>
<input id="endLocationIri" type="hidden" formControlName="endLocationIri" required/>
</div>
<div class="col-12 col-lg-6 mb-3">
<label for="customerReference" class="form-label">{{ 'trip.customer_reference' | translate }}:</label>
<input type="text" class="form-control" id="customerReference" formControlName="customerReference"/>
</div>
<div class="col-12 col-lg-6 mb-3">
<label for="captainName" class="form-label">{{ 'trip.captain_name' | translate }}:</label>
<input type="text" class="form-control" id="captainName" formControlName="captainName"/>
</div>
<div class="col-12 col-lg-6 mb-3">
<app-datetime-picker
[label]="'trip.start_date' | translate"
[inputId]="'startDate'"
[initialValue]="tripForm.get('startDate')?.value ?? null"
(dateTimeChange)="onDateChange($event, 'startDate')"
></app-datetime-picker>
</div>

<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3">
<app-datetime-picker
[label]="'trip.end_date' | translate"
[inputId]="'startDate'"
[initialValue]="tripForm.get('endDate')?.value ?? null"
(dateTimeChange)="onDateChange($event, 'endDate')"
></app-datetime-picker>
<div class="col-12 col-lg-6 mb-3">
<app-datetime-picker
[label]="'trip.end_date' | translate"
[inputId]="'startDate'"
[initialValue]="tripForm.get('endDate')?.value ?? null"
(dateTimeChange)="onDateChange($event, 'endDate')"
></app-datetime-picker>
</div>
</div>

<div class="flex gap-2">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.trip' | translate }}
<div class="row">
<div class="col-12 mb-3">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>
}

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.trip' | translate }}
</button>
}
</div>
</div>
</form>
</div>


+ 24
- 22
angular/src/app/_views/user-trip/user-trip-detail/user-trip-detail.component.html Просмотреть файл

@@ -19,9 +19,9 @@
<div>
<h4 class="mb-4">{{ 'user_trip.events' | translate }}</h4>

<div *ngFor="let userTripEvent of userTripEvents; let i = index" class="mb-4">
<div *ngFor="let userTripEvent of userTripEvents; let i = index" class="p-2 mb-2 changing-list">
<div class="row">
<div class="col-12 col-md-3 mb-3">
<div class="col-12 col-md-6 mb-3">
<label [for]="'event_' + i" class="form-label">{{ 'model.event' | translate }}*:</label>
<app-search-select
[formId]="'eventIri'"
@@ -35,7 +35,7 @@
</app-search-select>
</div>

<div class="col-12 col-md-3 mb-3">
<div class="col-12 col-md-6 mb-3">
<label [for]="'location_' + i" class="form-label">{{ 'model.location' | translate }}*:</label>
<app-search-select
[formId]="'locationIri'"
@@ -49,7 +49,7 @@
</app-search-select>
</div>

<div class="col-12 col-md-2 mb-3">
<div class="col-12 col-md-3 mb-1">
<label class="form-label">{{ 'user_trip.event_date' | translate }} ({{ 'common.date' | translate }}):</label>
<div>
<input
@@ -61,7 +61,7 @@
</div>
</div>

<div class="col-12 col-md-2 mb-3">
<div class="col-12 col-md-3 mb-1">
<label class="form-label">{{ 'user_trip.event_date' | translate }} ({{ 'common.time' | translate }}):</label>
<div>
<input
@@ -73,32 +73,34 @@
</div>
</div>

<div class="col-12 col-md-1 mb-3 d-flex align-items-end">
<button type="button" class="btn btn-danger" (click)="removeUserTripEvent(i)">X</button>
</div>
</div>

<div class="row">
<div class="col-12 mb-3">
<div class="col-12 col-md-4 mb-1">
<label [for]="'note_' + i" class="form-label">{{ 'common.note' | translate }}:</label>
<textarea
class="form-control"
[id]="'note_' + i"
rows="2"
[(ngModel)]="userTripEvent.note"
class="form-control"
[id]="'note_' + i"
rows="2"
[(ngModel)]="userTripEvent.note"
></textarea>
</div>

<div class="col-12 col-md-2 mb-1 d-flex align-items-end">
<button type="button" class="btn btn-danger" (click)="removeUserTripEvent(i)">X</button>
</div>
</div>
</div>

<div class="my-3">
<button type="button" class="btn btn-primary" (click)="addNewUserTripEvent()">+</button>
<div class="row">
<div class="col-12 col-lg-6 mb-3">
<button type="button" class="btn btn-primary" (click)="addNewUserTripEvent()">+</button>
</div>
</div>

<div class="mt-4">
<button type="button" class="btn btn-primary" (click)="saveAllUserTripEvents()">
{{ 'basic.save' | translate }}
</button>
<div class="row">
<div class="col-12 col-lg-6 mb-3">
<button type="button" class="btn btn-primary" (click)="saveAllUserTripEvents()">
{{ 'basic.save' | translate }}
</button>
</div>
</div>
</div>
</mat-tab>


+ 24
- 20
angular/src/app/_views/user-trip/user-trip-form/user-trip-form.component.html Просмотреть файл

@@ -2,22 +2,24 @@
<div class="spt-form">
@if (data !== undefined) {
<form [formGroup]="userTripForm" (ngSubmit)="onSubmit()">

<input type="hidden" formControlName="tripIri" />
<input type="hidden" formControlName="userIri" />
<input type="hidden" formControlName="signatureIri" />
<div class="mb-3">
<label for="captainName" class="form-label">{{ 'trip.captain_name' | translate }}:</label>
<input type="text" class="form-control" id="captainName" formControlName="captainName"/>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'user_trip.completed' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="completed" [disabled]="data.completed">
<span class="slider round"></span>
</label>
<div class="row">
<div class="col-12 col-lg-6 mb-3">
<label for="captainName" class="form-label">{{ 'trip.captain_name' | translate }}:</label>
<input type="text" class="form-control" id="captainName" formControlName="captainName"/>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'user_trip.completed' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="completed" [disabled]="data.completed">
<span class="slider round"></span>
</label>
</div>
</div>


<!-- Verwende die neue ImageUpload-Komponente -->
<app-image-upload
#imageUpload
@@ -32,15 +34,17 @@

</div>

<div class="flex gap-2">
<button type="submit" class="btn btn-primary" (click)="onSubmit()">
{{ 'basic.save' | translate }}
</button>

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.user_trip' | translate }}
<div class="row">
<div class="col-12 mb-3">
<button type="submit" class="btn btn-primary" (click)="onSubmit()">
{{ 'basic.save' | translate }}
</button>
}

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.user_trip' | translate }}
</button>
}
</div>
</div>
</div>

+ 46
- 51
angular/src/app/_views/user/user-form/user-form.component.html Просмотреть файл

@@ -7,49 +7,43 @@
<div class="spt-form">
<form [formGroup]="userForm" (ngSubmit)="onSubmit()">
<input type="hidden" formControlName="imageIri" />

<div class="mb-3">
<label for="email" class="form-label">{{ 'users.email' | translate }}:</label>
<input type="text" class="form-control" id="email" formControlName="email"/>
</div>

<div class="mb-3">
<label for="firstName" class="form-label">{{ 'users.firstname' | translate }}:</label>
<input type="text" class="form-control" id="firstName" formControlName="firstName"/>
</div>

<div class="mb-3">
<label for="lastName" class="form-label">{{ 'users.lastname' | translate }}:</label>
<input type="text" class="form-control" id="lastName" formControlName="lastName"/>
</div>

<div class="mb-3">
<label for="referenceId" class="form-label">{{ 'users.pilotIdNo' | translate }}:</label>
<input type="text" class="form-control" id="referenceId" formControlName="referenceId"/>
</div>

<div class="mb-3">
<label for="password" class="form-label">{{ 'users.password' | translate }}:</label>
<input type="text" class="form-control" id="password" formControlName="password"/>
</div>

<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'users.active' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="active">
<span class="slider round"></span>
</label>
</div>

<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'users.is_admin' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="isAdmin">
<span class="slider round"></span>
</label>
<div class="row">
<div class="col-12 col-lg-6 mb-3">
<label for="firstName" class="form-label">{{ 'users.firstname' | translate }}:</label>
<input type="text" class="form-control" id="firstName" formControlName="firstName"/>
</div>
<div class="col-12 col-lg-6 mb-3">
<label for="lastName" class="form-label">{{ 'users.lastname' | translate }}:</label>
<input type="text" class="form-control" id="lastName" formControlName="lastName"/>
</div>
<div class="col-12 col-lg-6 mb-3">
<label for="email" class="form-label">{{ 'users.email' | translate }}:</label>
<input type="text" class="form-control" id="email" formControlName="email"/>
</div>
<div class="col-12 col-lg-6 mb-3">
<label for="password" class="form-label">{{ 'users.password' | translate }}:</label>
<input type="text" class="form-control" id="password" formControlName="password"/>
</div>
<div class="col-12 col-lg-6 mb-3">
<label for="referenceId" class="form-label">{{ 'users.pilotIdNo' | translate }}:</label>
<input type="text" class="form-control" id="referenceId" formControlName="referenceId"/>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'users.active' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="active">
<span class="slider round"></span>
</label>
</div>
<div class="col-12 col-sm-6 col-md-4 col-lg-3 mb-3 switch-widget">
<p class="form-label">{{ 'users.is_admin' | translate }}:</p>
<label class="switch">
<input type="checkbox" formControlName="isAdmin">
<span class="slider round"></span>
</label>
</div>
</div>

<!-- Verwende die neue ImageUpload-Komponente -->
<app-image-upload
#imageUpload
[imageUrl]="data?.imageUrl"
@@ -57,17 +51,18 @@
(fileSelected)="handleFileSelected($event)"
(fileDeleted)="handleFileDeleted()">
</app-image-upload>

<div class="flex gap-2">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.user' | translate }}
<div class="row">
<div class="col-12 mb-3">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>
}

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.user' | translate }}
</button>
}
</div>
</div>
</form>
</div>

+ 41
- 40
angular/src/app/_views/vessel/vessel-form/vessel-form.component.html Просмотреть файл

@@ -4,48 +4,49 @@
</div>
<div class="spt-form">
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<div class="mb-3">
<label for="name" class="form-label">{{ 'common.name' | translate }}*:</label>
<input type="text"
class="form-control"
id="name"
formControlName="name"
required/>
<div class="row">
<div class="col-12 col-lg-6 mb-3">
<label for="name" class="form-label">{{ 'common.name' | translate }}*:</label>
<input type="text"
class="form-control"
id="name"
formControlName="name"
required/>
</div>
<div class="col-12 col-lg-6 mb-3">
<label for="code" class="form-label">{{ 'common.code' | translate }}*:</label>
<input type="text"
class="form-control"
id="code"
formControlName="code"
required/>
</div>
<div class="col-12 mb-3">
<label for="companyIri" class="form-label">{{ 'model.shipping_company' | translate }}:</label>
<app-search-select #shippingCompanySearchSelect
[formId]="'companyIri'"
[formLabelLangKey]="'model.shipping_company'"
[documentForm]="form"
[getDataFunction]="getShippingCompanies"
[displayedDataField]="'name'"
[listColDefinitions]="shippingCompanyColDefinitions"
[dataSet]="data?.company">
</app-search-select>
<input id="companyIri" type="hidden" formControlName="companyIri"/>
</div>
</div>

<div class="mb-3">
<label for="code" class="form-label">{{ 'common.code' | translate }}*:</label>
<input type="text"
class="form-control"
id="code"
formControlName="code"
required/>
</div>

<div class="mb-3">
<label for="companyIri" class="form-label">{{ 'model.shipping_company' | translate }}:</label>
<app-search-select #shippingCompanySearchSelect
[formId]="'companyIri'"
[formLabelLangKey]="'model.shipping_company'"
[documentForm]="form"
[getDataFunction]="getShippingCompanies"
[displayedDataField]="'name'"
[listColDefinitions]="shippingCompanyColDefinitions"
[dataSet]="data?.company">
</app-search-select>
<input id="companyIri" type="hidden" formControlName="companyIri"/>
</div>

<div class="flex gap-2">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.vessel' | translate }}
<div class="row">
<div class="col-12 mb-3">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>
}

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.vessel' | translate }}
</button>
}
</div>
</div>
</form>
</div>

+ 15
- 13
angular/src/app/_views/zone/zone-form/zone-form.component.html Просмотреть файл

@@ -4,21 +4,23 @@
</div>
<div class="spt-form">
<form [formGroup]="form" (ngSubmit)="onSubmit()">
<div class="mb-3">
<label for="name" class="form-label">{{ 'common.name' | translate }}*:</label>
<input type="text" class="form-control" id="name" formControlName="name" required/>
</div>

<div class="flex gap-2">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>
<div class="row">
<div class="col-12 mb-3">
<label for="name" class="form-label">{{ 'common.name' | translate }}*:</label>
<input type="text" class="form-control" id="name" formControlName="name" required/>
</div>

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.zone' | translate }}
<div class="col-12 mb-3">
<button type="submit" class="btn btn-primary" [disabled]="form.invalid">
{{ 'basic.save' | translate }}
</button>
}

@if (isEditMode()) {
<button type="button" class="ms-3 btn btn-primary" (click)="onDelete()">
{{ 'basic.delete' | translate }} {{ 'model.zone' | translate }}
</button>
}
</div>
</div>
</form>
</div>

+ 0
- 1
angular/src/app/core/api/v1/model/constraintViolationJsonldJsonld.ts Просмотреть файл

@@ -19,7 +19,6 @@ import { ConstraintViolationJsonViolationsInner } from './constraintViolationJso
export interface ConstraintViolationJsonldJsonld {
context?: ConstraintViolationJsonldJsonldContext;
readonly id?: string;
readonly type?: string;
status?: number;
violations?: Array<ConstraintViolationJsonViolationsInner>;
readonly detail?: string;


+ 0
- 1
angular/src/app/core/api/v1/model/errorJsonld.ts Просмотреть файл

@@ -18,7 +18,6 @@ import { ConstraintViolationJsonldJsonldContext } from './constraintViolationJso
export interface ErrorJsonld {
context?: ConstraintViolationJsonldJsonldContext;
readonly id?: string;
readonly type?: string;
/**
* A short, human-readable summary of the problem.
*/


+ 6
- 2
angular/src/assets/i18n/en.json Просмотреть файл

@@ -13,7 +13,10 @@
{
"name": "Name",
"code": "Code",
"created_at": "Created at"
"created_at": "Created at",
"date": "Date",
"time": "Time",
"note": "Note"
},
"trip":
{
@@ -43,7 +46,8 @@
"events": "Events",
"completed": "Completed",
"completed_at": "Completed at",
"signature": "Signature Image"
"signature": "Signature Image",
"event_date": "Event date"
},
"base_data":
{


+ 4
- 2
angular/src/assets/scss/_basics.scss Просмотреть файл

@@ -134,7 +134,7 @@ body {
}
}

.spt-headline {
.spt-headline:not(.modal-content .spt-headline) {
@media only screen and (min-width: 1200px) {
margin: -32px 0 0 50px;
}
@@ -142,6 +142,7 @@ body {

label,
.form-label {
display: block;
font-size: 13px;
margin-bottom: 5px !important;

@@ -270,7 +271,7 @@ textarea#pasteCodes {
width: 85.5%;
min-width: calc(100% - 200px);
@media only screen and (max-width: 1199px) {
width: auto;
width: 100%;
//width: calc(100% - calc(var(--bs-gutter-x) * 0.5) - calc(var(--bs-gutter-x) * 0.5));
}
}
@@ -597,6 +598,7 @@ textarea#pasteCodes {
line-height: 24px;
min-height: 38px;
cursor: text;
background-color: #fff;

&.search-empty {
&:before {


+ 35
- 3
angular/src/assets/scss/_dark.scss Просмотреть файл

@@ -27,9 +27,13 @@
select,
label a,
.form-label a,
.card-body {
.card-body,
.search-select .show-name p {
color: #fff !important;
}
.search-select .show-name p {
background: transparent;
}

.mat-mdc-paginator-icon {
fill: #fff;
@@ -53,7 +57,8 @@
fill: #3e525f;
}

.mat-mdc-tab-list .mat-ripple {
.mat-mdc-tab-list .mat-ripple,
.changing-list {
background: #4e697b;
}

@@ -80,4 +85,31 @@
background-image: url("../images/icons/icon-back-white.svg");
background-size: 100% auto;
}
}
table,
p,
ul,
ol,
dl,
.post h3,
.tasks h3 {
a {
color: #fff;
&:hover {
color: #ddd;
}
}
}
.btn-link {
color: #fff;
&:hover {
color: #ddd;
}
}
.spt-clear {
background-color: transparent;
&:before,
&:after {
background: #fff;
}
}
}

+ 35
- 0
angular/src/assets/scss/_form.scss Просмотреть файл

@@ -5,6 +5,7 @@
}

.spt-form {
overflow: hidden;
.delete-image {
display: flex;
justify-content: flex-start;
@@ -34,3 +35,37 @@
}
}

.image-display {
position: relative;
max-width: 300px;
img {
width: 100%;
}
.btn {
position: absolute;
right: 0;
top: 0;
padding: 6px 14px;
}
}

.form-control::file-selector-button {
margin: 0;
padding: 3px 5px;
color: #000;
border: none;
}
textarea.form-control {
min-height: auto;
height: 34px;
}
.form-check {
margin-bottom: 1.25rem;
}
.btn-margin {
margin-bottom: 0.75rem;
}

.changing-list {
background-color: #f6f6f6;
}

+ 17
- 10
httpdocs/src/DataFixtures/AppFixtures.php Просмотреть файл

@@ -41,7 +41,8 @@ class AppFixtures extends Fixture
'firstName' => 'Jakob',
'lastName' => 'Nordstrøm',
'password' => '12spawntree345',
'roles' => ['ROLE_ADMIN']
'roles' => ['ROLE_ADMIN'],
'reference_id' => 1
]
);
$system->_set('image', MediaObjectFactory::createOne()->_real());
@@ -53,7 +54,8 @@ class AppFixtures extends Fixture
'firstName' => 'Daniel',
'lastName' => 'Knudsen',
'password' => '12spawntree345',
'roles' => ['ROLE_ADMIN']
'roles' => ['ROLE_ADMIN'],
'reference_id' => 1
]
);
$system->_set('image', MediaObjectFactory::createOne()->_real());
@@ -66,7 +68,8 @@ class AppFixtures extends Fixture
'lastName' => 'Eisenmenger',
'password' => '12spawntree345',
'image' => MediaObjectFactory::createOne(),
'roles' => ['ROLE_ADMIN']
'roles' => ['ROLE_ADMIN'],
'reference_id' => 1
]
);
$system->_set('image', MediaObjectFactory::createOne()->_real());
@@ -79,7 +82,8 @@ class AppFixtures extends Fixture
'lastName' => 'Pilot1',
'password' => '12spawntree345',
'image' => MediaObjectFactory::createOne(),
'roles' => ['ROLE_USER']
'roles' => ['ROLE_USER'],
'reference_id' => 1
]
);
$system->_set('image', MediaObjectFactory::createOne()->_real());
@@ -87,12 +91,13 @@ class AppFixtures extends Fixture

UserFactory::createOne(
[
'email' => 'pilot1@spawntree.de',
'email' => 'pilot2@spawntree.de',
'firstName' => 'Pilot2',
'lastName' => 'Pilot2',
'password' => '12spawntree345',
'image' => MediaObjectFactory::createOne(),
'roles' => ['ROLE_USER']
'roles' => ['ROLE_USER'],
'reference_id' => 1
]
);
$system->_set('image', MediaObjectFactory::createOne()->_real());
@@ -100,12 +105,13 @@ class AppFixtures extends Fixture

UserFactory::createOne(
[
'email' => 'pilot1@spawntree.de',
'email' => 'pilot3@spawntree.de',
'firstName' => 'Pilot3',
'lastName' => 'Pilot3',
'password' => '12spawntree345',
'image' => MediaObjectFactory::createOne(),
'roles' => ['ROLE_USER']
'roles' => ['ROLE_USER'],
'reference_id' => 1
]
);
$system->_set('image', MediaObjectFactory::createOne()->_real());
@@ -113,12 +119,13 @@ class AppFixtures extends Fixture

UserFactory::createOne(
[
'email' => 'pilot1@spawntree.de',
'email' => 'pilot4@spawntree.de',
'firstName' => 'Pilot4',
'lastName' => 'Pilot4',
'password' => '12spawntree345',
'image' => MediaObjectFactory::createOne(),
'roles' => ['ROLE_USER']
'roles' => ['ROLE_USER'],
'reference_id' => 1
]
);
$system->_set('image', MediaObjectFactory::createOne()->_real());


Загрузка…
Отмена
Сохранить