Edit and save a shipcall

This commit is contained in:
Daniel Schick 2023-08-21 15:34:09 +02:00
parent beb9d75a90
commit 95fab27229
18 changed files with 328 additions and 153 deletions

View File

@ -1,7 +1,7 @@
//----------------------
// <auto-generated>
// Generated REST API Client Code Generator v1.7.17.0 on 18.08.2023 15:15:15
// Generated REST API Client Code Generator v1.7.17.0 on 21.08.2023 14:30:55
// Using the tool OpenAPI Generator v6.6.0
// </auto-generated>
//----------------------
@ -50,6 +50,7 @@ using System.Threading.Tasks;
*/
namespace BreCalClient.misc.Api
{
#pragma warning disable CS8073 // The result of the expression is always the same since a value of this type is never equal to 'null'
/// <summary>
/// Represents a collection of functions to interact with the API endpoints
/// </summary>
@ -6322,33 +6323,6 @@ namespace BreCalClient.misc.Model
[DataContract(Name = "shipcall")]
public partial class Shipcall : IEquatable<Shipcall>, IValidatableObject
{
/// <summary>
/// Defines Type
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public enum TypeEnum
{
/// <summary>
/// Enum Incoming for value: incoming
/// </summary>
[EnumMember(Value = "incoming")]
Incoming = 1,
/// <summary>
/// Enum Outgoing for value: outgoing
/// </summary>
[EnumMember(Value = "outgoing")]
Outgoing = 2,
/// <summary>
/// Enum Shifting for value: shifting
/// </summary>
[EnumMember(Value = "shifting")]
Shifting = 3
}
/// <summary>
/// Gets or Sets Type
/// </summary>
[DataMember(Name = "type", IsRequired = true, EmitDefaultValue = true)]
public TypeEnum Type { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="Shipcall" /> class.
/// </summary>
@ -6365,7 +6339,7 @@ namespace BreCalClient.misc.Model
/// <param name="etd">etd.</param>
/// <param name="arrivalBerthId">arrivalBerthId.</param>
/// <param name="departureBerthId">departureBerthId.</param>
/// <param name="tugReguired">tugReguired.</param>
/// <param name="tugRequired">tugRequired.</param>
/// <param name="pilotRequired">pilotRequired.</param>
/// <param name="flags">flags.</param>
/// <param name="pierSide">pierSide.</param>
@ -6383,7 +6357,7 @@ namespace BreCalClient.misc.Model
/// <param name="participants">participants.</param>
/// <param name="created">created.</param>
/// <param name="modified">modified.</param>
public Shipcall(int id = default(int), int shipId = default(int), TypeEnum type = default(TypeEnum), DateTime eta = default(DateTime), string voyage = default(string), DateTime? etd = default(DateTime?), int? arrivalBerthId = default(int?), int? departureBerthId = default(int?), bool? tugReguired = default(bool?), bool? pilotRequired = default(bool?), int? flags = default(int?), bool? pierSide = default(bool?), bool? bunkering = default(bool?), bool? replenishingTerminal = default(bool?), bool? replenishingLock = default(bool?), float? draft = default(float?), DateTime? tidalWindowFrom = default(DateTime?), DateTime? tidalWindowTo = default(DateTime?), bool? rainSensitiveCargo = default(bool?), int? recommendedTugs = default(int?), bool? anchored = default(bool?), bool? mooredLock = default(bool?), bool? canceled = default(bool?), List<int> participants = default(List<int>), DateTime created = default(DateTime), DateTime? modified = default(DateTime?))
public Shipcall(int id = default(int), int shipId = default(int), int type = default(int), DateTime eta = default(DateTime), string voyage = default(string), DateTime? etd = default(DateTime?), int? arrivalBerthId = default(int?), int? departureBerthId = default(int?), bool? tugRequired = default(bool?), bool? pilotRequired = default(bool?), int? flags = default(int?), bool? pierSide = default(bool?), bool? bunkering = default(bool?), bool? replenishingTerminal = default(bool?), bool? replenishingLock = default(bool?), float? draft = default(float?), DateTime? tidalWindowFrom = default(DateTime?), DateTime? tidalWindowTo = default(DateTime?), bool? rainSensitiveCargo = default(bool?), int? recommendedTugs = default(int?), bool? anchored = default(bool?), bool? mooredLock = default(bool?), bool? canceled = default(bool?), List<int> participants = default(List<int>), DateTime created = default(DateTime), DateTime? modified = default(DateTime?))
{
this.Id = id;
this.ShipId = shipId;
@ -6393,7 +6367,7 @@ namespace BreCalClient.misc.Model
this.Etd = etd;
this.ArrivalBerthId = arrivalBerthId;
this.DepartureBerthId = departureBerthId;
this.TugReguired = tugReguired;
this.TugRequired = tugRequired;
this.PilotRequired = pilotRequired;
this.Flags = flags;
this.PierSide = pierSide;
@ -6424,6 +6398,11 @@ namespace BreCalClient.misc.Model
[DataMember(Name = "ship_id", IsRequired = true, EmitDefaultValue = true)]
public int ShipId { get; set; }
/// <summary>
/// Gets or Sets Type
/// </summary>
[DataMember(Name = "type", IsRequired = true, EmitDefaultValue = true)]
public int Type { get; set; }
/// <summary>
/// Gets or Sets Eta
/// </summary>
[DataMember(Name = "eta", IsRequired = true, EmitDefaultValue = true)]
@ -6449,10 +6428,10 @@ namespace BreCalClient.misc.Model
[DataMember(Name = "departure_berth_id", EmitDefaultValue = true)]
public int? DepartureBerthId { get; set; }
/// <summary>
/// Gets or Sets TugReguired
/// Gets or Sets TugRequired
/// </summary>
[DataMember(Name = "tug_reguired", EmitDefaultValue = true)]
public bool? TugReguired { get; set; }
[DataMember(Name = "tug_required", EmitDefaultValue = true)]
public bool? TugRequired { get; set; }
/// <summary>
/// Gets or Sets PilotRequired
/// </summary>
@ -6554,7 +6533,7 @@ namespace BreCalClient.misc.Model
sb.Append(" Etd: ").Append(Etd).Append("\n");
sb.Append(" ArrivalBerthId: ").Append(ArrivalBerthId).Append("\n");
sb.Append(" DepartureBerthId: ").Append(DepartureBerthId).Append("\n");
sb.Append(" TugReguired: ").Append(TugReguired).Append("\n");
sb.Append(" TugRequired: ").Append(TugRequired).Append("\n");
sb.Append(" PilotRequired: ").Append(PilotRequired).Append("\n");
sb.Append(" Flags: ").Append(Flags).Append("\n");
sb.Append(" PierSide: ").Append(PierSide).Append("\n");
@ -6642,9 +6621,9 @@ namespace BreCalClient.misc.Model
this.DepartureBerthId.Equals(input.DepartureBerthId))
) &&
(
this.TugReguired == input.TugReguired ||
(this.TugReguired != null &&
this.TugReguired.Equals(input.TugReguired))
this.TugRequired == input.TugRequired ||
(this.TugRequired != null &&
this.TugRequired.Equals(input.TugRequired))
) &&
(
this.PilotRequired == input.PilotRequired ||
@ -6765,9 +6744,9 @@ namespace BreCalClient.misc.Model
{
hashCode = (hashCode * 59) + this.DepartureBerthId.GetHashCode();
}
if (this.TugReguired != null)
if (this.TugRequired != null)
{
hashCode = (hashCode * 59) + this.TugReguired.GetHashCode();
hashCode = (hashCode * 59) + this.TugRequired.GetHashCode();
}
if (this.PilotRequired != null)
{
@ -7399,5 +7378,6 @@ namespace BreCalClient.misc.Model
yield break;
}
}
#pragma warning restore CS8073 // The result of the expression is always the same since a value of this type is never equal to 'null'
}

View File

@ -337,11 +337,8 @@ components:
ship_id:
type: integer
type:
type: string
enum:
- incoming
- outgoing
- shifting
type: integer
# TODO: use an enum
eta:
type: string
format: date-time
@ -359,7 +356,7 @@ components:
departure_berth_id:
type: integer
nullable: true
tug_reguired:
tug_required:
type: boolean
nullable: true
pilot_required:

View File

@ -1,7 +1,7 @@
[*.cs]
# CS8073: The result of the expression is always the same since a value of this type is never equal to 'null'
dotnet_diagnostic.CS8073.severity = silent
dotnet_diagnostic.CS8073.severity = none
csharp_using_directive_placement = outside_namespace:silent
csharp_prefer_simple_using_statement = true:suggestion
csharp_prefer_braces = true:silent

View File

@ -0,0 +1,23 @@
// Copyright (c) 2023 schick Informatik
// Description: Helper for combobox binding of bool to combobox
//
using System;
using System.Globalization;
using System.Windows.Data;
namespace BreCalClient
{
public class BoolToIndexConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((bool) value == true) ? 0 : 1;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return ((int)value == 0);
}
}
}

View File

@ -9,6 +9,9 @@
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
mc:Ignorable="d"
Title="{x:Static p:Resources.textEditShipcall}" Height="466" Width="800" Loaded="Window_Loaded" ResizeMode="NoResize" Icon="Resources/containership.ico">
<Window.Resources>
<local:BoolToIndexConverter x:Key="boolToIndexConverter" />
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.15*"/>
@ -49,7 +52,7 @@
<Label Content="{x:Static p:Resources.textReplenishingLock}" Grid.Column="1" Grid.Row="12" />
<Label Content="{x:Static p:Resources.textDraft}" Grid.Column="0" Grid.Row="13" HorizontalContentAlignment="Right" />
<ComboBox x:Name="comboBoxShip" Margin="2" Grid.Column="1" Grid.Row="0" SelectionChanged="comboBoxShip_SelectionChanged">
<ComboBox x:Name="comboBoxShip" Margin="2" Grid.Column="1" Grid.Row="0" SelectionChanged="comboBoxShip_SelectionChanged" SelectedValuePath="Id">
<ComboBox.ItemTemplate>
<DataTemplate>
<!--Border-->
@ -65,19 +68,22 @@
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ComboBox x:Name="comboBoxCategories" Grid.Column="1" Margin="2" Grid.Row="1" />
<ComboBox x:Name="comboBoxCategories" Grid.Column="1" Margin="2" Grid.Row="1" SelectedValuePath="Key"/>
<xctk:DateTimePicker x:Name="datePickerETA" Grid.Column="1" Grid.Row="2" Margin="2" />
<TextBox x:Name="textBoxVoyage" Grid.Column="1" Grid.Row="3" Margin="2" VerticalContentAlignment="Center" />
<xctk:DateTimePicker x:Name="datePickerETD" Grid.Column="1" Grid.Row="4" Margin="2" />
<ComboBox Name="comboBoxArrivalBerth" Grid.Column="1" Grid.Row="5" Margin="2" DisplayMemberPath="Name" />
<ComboBox Name="comboBoxDepartureBerth" Grid.Column="1" Grid.Row="6" Margin="2" DisplayMemberPath="Name" />
<ComboBox Name="comboBoxArrivalBerth" Grid.Column="1" Grid.Row="5" Margin="2" DisplayMemberPath="Name" SelectedValuePath="Id" />
<ComboBox Name="comboBoxDepartureBerth" Grid.Column="1" Grid.Row="6" Margin="2" DisplayMemberPath="Name" SelectedValuePath="Id" />
<CheckBox x:Name="checkBoxTugRequired" Grid.Column="0" Grid.Row="7" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,4,0" />
<CheckBox x:Name="checkBoxPilotRequired" Grid.Column="0" Grid.Row="8" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,4,0" />
<ComboBox x:Name="comboBoxPierside" Grid.Column="1" Grid.Row="9" Margin="2" />
<ComboBox x:Name="comboBoxPierside" Grid.Column="1" Grid.Row="9" Margin="2" >
<ComboBoxItem Content="{x:Static p:Resources.textNotRotated}" />
<ComboBoxItem Content="{x:Static p:Resources.textRotated}" />
</ComboBox>
<CheckBox x:Name="checkBoxBunkering" Grid.Column="0" Grid.Row="10" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,4,0" />
<CheckBox x:Name="checkBoxReplenishingTerminal" Grid.Column="0" Grid.Row="11" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,4,0" />
<CheckBox x:Name="checkBoxReplenishingLock" Grid.Column="0" Grid.Row="12" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,4,0" />
<xctk:DoubleUpDown x:Name="doubleUpDownDraft" Grid.Column="1" Grid.Row="13" Margin="2" FormatString="C2" Minimum="0" />
<xctk:DoubleUpDown x:Name="doubleUpDownDraft" Grid.Column="1" Grid.Row="13" Margin="2" FormatString="N2" Minimum="0" />
<Label Content="{x:Static p:Resources.textParticipants}" FontWeight="DemiBold" Grid.Column="3" Grid.Row="0" />
<Label Content="{x:Static p:Resources.textAgency}" Grid.Column="2" Grid.Row="1" HorizontalContentAlignment="Right"/>
@ -93,11 +99,13 @@
<Label Content="{x:Static p:Resources.textAnchored}" Grid.Column="3" Grid.Row="11" />
<Label Content="{x:Static p:Resources.textMooredLock}" Grid.Column="3" Grid.Row="12" />
<Label Content="{x:Static p:Resources.textCancelled}" Grid.Column="3" Grid.Row="13" />
<ComboBox Name="comboBoxAgency" Grid.Column="3" Grid.Row="1" Margin="2" DisplayMemberPath="Name"/>
<ComboBox Name="comboBoxMooring" Grid.Column="3" Grid.Row="2" Margin="2" DisplayMemberPath="Name"/>
<ComboBox Name="comboBoxPilot" Grid.Column="3" Grid.Row="3" Margin="2" DisplayMemberPath="Name"/>
<ComboBox Name="comboBoxTug" Grid.Column="3" Grid.Row="4" Margin="2" DisplayMemberPath="Name"/>
<ComboBox Name="comboBoxTerminal" Grid.Column="3" Grid.Row="5" Margin="2" DisplayMemberPath="Name"/>
<ComboBox Name="comboBoxAgency" Grid.Column="3" Grid.Row="1" Margin="2" DisplayMemberPath="Name" SelectedValuePath="Id"/>
<ComboBox Name="comboBoxMooring" Grid.Column="3" Grid.Row="2" Margin="2" DisplayMemberPath="Name" SelectedValuePath="Id"/>
<ComboBox Name="comboBoxPilot" Grid.Column="3" Grid.Row="3" Margin="2" DisplayMemberPath="Name" SelectedValuePath="Id"/>
<ComboBox Name="comboBoxTug" Grid.Column="3" Grid.Row="4" Margin="2" DisplayMemberPath="Name" SelectedValuePath="Id"/>
<ComboBox Name="comboBoxTerminal" Grid.Column="3" Grid.Row="5" Margin="2" DisplayMemberPath="Name" SelectedValuePath="Id"/>
<xctk:DateTimePicker Name="datePickerTidalWindowFrom" Grid.Column="3" Grid.Row="7" Margin="2" />
<xctk:DateTimePicker Name="datePickerTidalWindowTo" Grid.Column="3" Grid.Row="8" Margin="2" />
<CheckBox x:Name="checkBoxRainsensitiveCargo" Grid.Column="2" Grid.Row="9" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,4,0" />

View File

@ -5,18 +5,9 @@
using BreCalClient.misc.Model;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace BreCalClient
{
@ -68,7 +59,7 @@ namespace BreCalClient
this.comboBoxTerminal.ItemsSource = terList;
this.comboBoxShip.ItemsSource = Ships;
this.comboBoxCategories.ItemsSource = Enum.GetValues(typeof(Shipcall.TypeEnum));
this.comboBoxCategories.ItemsSource = Enum.GetValues(typeof(Extensions.TypeEnum));
this.comboBoxArrivalBerth.ItemsSource = this.Berths;
this.comboBoxDepartureBerth.ItemsSource = this.Berths;
@ -78,12 +69,14 @@ namespace BreCalClient
private void buttonOK_Click(object sender, RoutedEventArgs e)
{
this.CopyToModel();
this.DialogResult = true; this.Close();
this.DialogResult = true;
this.Close();
}
private void buttonCancel_Click(object sender, RoutedEventArgs e)
{
this.DialogResult= false; this.Close();
this.DialogResult= false;
this.Close();
}
private void comboBoxShip_SelectionChanged(object sender, SelectionChangedEventArgs e)
@ -97,19 +90,18 @@ namespace BreCalClient
private void CopyToModel()
{
this.Shipcall.Type = (Shipcall.TypeEnum)this.comboBoxCategories.SelectedValue;
this.Shipcall.Type = (int) this.comboBoxCategories.SelectedItem;
this.Shipcall.Eta = this.datePickerETA.Value ?? DateTime.Now;
this.Shipcall.Voyage = this.textBoxVoyage.Text.Trim();
this.Shipcall.Etd = this.datePickerETD.Value ?? DateTime.Now.AddDays(1);
this.Shipcall.Anchored = this.checkBoxAnchored.IsChecked;
this.Shipcall.ShipId = ((Ship)this.comboBoxShip.SelectedItem).Id;
this.Shipcall.ArrivalBerthId = (this.comboBoxArrivalBerth.SelectedValue != null) ? ((Berth)this.comboBoxArrivalBerth.SelectedValue).Id : null;
this.Shipcall.DepartureBerthId = (this.comboBoxDepartureBerth.SelectedValue != null) ? ((Berth)this.comboBoxDepartureBerth.SelectedValue).Id : null;
this.Shipcall.ArrivalBerthId = (this.comboBoxArrivalBerth.SelectedItem != null) ? ((Berth)this.comboBoxArrivalBerth.SelectedItem).Id : null;
this.Shipcall.DepartureBerthId = (this.comboBoxDepartureBerth.SelectedItem != null) ? ((Berth)this.comboBoxDepartureBerth.SelectedItem).Id : null;
this.Shipcall.Bunkering = this.checkBoxBunkering.IsChecked;
this.Shipcall.Canceled = this.checkBoxCanceled.IsChecked;
this.Shipcall.Draft = (float?) this.doubleUpDownDraft.Value;
this.Shipcall.MooredLock = this.checkBoxMooredLock.IsChecked;
// this.Shipcall.PierSide = this.comboBoxPierside.SelectedValue;
this.Shipcall.RainSensitiveCargo = this.checkBoxRainsensitiveCargo.IsChecked;
this.Shipcall.PilotRequired = this.checkBoxPilotRequired.IsChecked;
this.Shipcall.ReplenishingLock = this.checkBoxReplenishingLock.IsChecked;
@ -117,12 +109,76 @@ namespace BreCalClient
this.Shipcall.RecommendedTugs = this.integerUpDownRecommendedTugs.Value;
this.Shipcall.TidalWindowFrom = this.datePickerTidalWindowFrom.Value;
this.Shipcall.TidalWindowTo = this.datePickerTidalWindowTo.Value;
this.Shipcall.TugReguired = this.checkBoxTugRequired.IsChecked;
this.Shipcall.TugRequired = this.checkBoxTugRequired.IsChecked;
if(this.comboBoxPierside.SelectedIndex >= 0)
{
this.Shipcall.PierSide = (this.comboBoxPierside.SelectedIndex == 0) ? true : false;
}
// remove all and add selected participants
this.Shipcall.Participants.Clear();
Participant? participant;
participant = (Participant?) this.comboBoxAgency.SelectedItem;
if (participant != null) this.Shipcall.Participants.Add(participant.Id);
participant = (Participant?) this.comboBoxMooring.SelectedItem;
if (participant != null) this.Shipcall.Participants.Add(participant.Id);
participant = (Participant?) this.comboBoxPilot.SelectedItem;
if (participant != null) this.Shipcall.Participants.Add(participant.Id);
participant = (Participant?) this.comboBoxTerminal.SelectedItem;
if (participant != null) this.Shipcall.Participants.Add(participant.Id);
participant = (Participant?) this.comboBoxTug.SelectedItem;
if (participant != null) this.Shipcall.Participants.Add(participant.Id);
// BSMD and port authority are always added
foreach(Participant p in Participants)
{
if(p.Type == (int) Extensions.ParticipantType.PORT_ADMINISTRATION) this.Shipcall.Participants.Add(p.Id);
if (p.Type == (int)Extensions.ParticipantType.BSMD) this.Shipcall.Participants.Add(p.Id);
}
}
private void CopyToControls()
{
if (this.Shipcall == null) return;
this.comboBoxCategories.SelectedItem = (Extensions.TypeEnum) this.Shipcall.Type;
if(this.Shipcall.Eta != DateTime.MinValue)
this.datePickerETA.Value = this.Shipcall.Eta;
this.textBoxVoyage.Text = this.Shipcall.Voyage;
this.datePickerETD.Value = this.Shipcall.Etd;
this.checkBoxAnchored.IsChecked = this.Shipcall.Anchored;
this.comboBoxShip.SelectedValue = this.Shipcall.ShipId;
this.comboBoxArrivalBerth.SelectedValue = this.Shipcall.ArrivalBerthId;
this.comboBoxDepartureBerth.SelectedValue = this.Shipcall.DepartureBerthId;
this.checkBoxBunkering.IsChecked = this.Shipcall.Bunkering;
this.checkBoxCanceled.IsChecked = this.Shipcall.Canceled;
this.doubleUpDownDraft.Value = this.Shipcall.Draft;
this.checkBoxMooredLock.IsChecked = this.Shipcall.MooredLock;
this.checkBoxRainsensitiveCargo.IsChecked = this.Shipcall.RainSensitiveCargo;
this.checkBoxPilotRequired.IsChecked = this.Shipcall.PilotRequired;
this.checkBoxReplenishingLock.IsChecked = this.Shipcall.ReplenishingLock;
this.checkBoxReplenishingTerminal.IsChecked = this.Shipcall.ReplenishingTerminal;
this.integerUpDownRecommendedTugs.Value = this.Shipcall.RecommendedTugs;
this.datePickerTidalWindowFrom.Value = this.Shipcall.TidalWindowFrom;
this.datePickerTidalWindowTo.Value = this.Shipcall.TidalWindowTo;
this.checkBoxTugRequired.IsChecked = this.Shipcall.TugRequired;
if(this.Shipcall.PierSide.HasValue)
{
if (this.Shipcall.PierSide.Value) this.comboBoxPierside.SelectedIndex = 0;
else this.comboBoxPierside.SelectedIndex = 1;
}
if (this.Shipcall.Participants == null) this.Shipcall.Participants = new();
foreach(int participant_id in this.Shipcall.Participants)
{
if (((List<Participant>)this.comboBoxAgency.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxAgency.SelectedValue = participant_id;
if (((List<Participant>)this.comboBoxMooring.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxMooring.SelectedValue = participant_id;
if (((List<Participant>)this.comboBoxPilot.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxPilot.SelectedValue = participant_id;
if (((List<Participant>)this.comboBoxTerminal.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxTerminal.SelectedValue = participant_id;
if (((List<Participant>)this.comboBoxTug.ItemsSource).Any(x => x.Id == participant_id)) this.comboBoxTug.SelectedValue = participant_id;
}
}

View File

@ -41,6 +41,16 @@ namespace BreCalClient
TUG = 64,
}
/// <summary>
/// Should actually be defined in yaml
/// </summary>
public enum TypeEnum
{
Incoming = 1,
Outgoing = 2,
Shifting = 3
}
#endregion
#region public helper

View File

@ -8,7 +8,9 @@
xmlns:p = "clr-namespace:BreCalClient.Resources"
mc:Ignorable="d"
Title="{DynamicResource textApplicationTitle}" Height="450" Width="800" Loaded="Window_Loaded" Closing="Window_Closing" Icon="Resources/containership.ico">
<Window.Resources>
<local:BoolToIndexConverter x:Key="boolToIndexConverter" />
</Window.Resources>
<xctk:BusyIndicator Name="busyIndicator" IsBusy="True">
<xctk:BusyIndicator.ProgressBarStyle>
<Style TargetType="ProgressBar">

View File

@ -302,10 +302,32 @@ namespace BreCalClient
}
}
private void Sc_EditRequested(ShipcallControl obj)
private async void Sc_EditRequested(ShipcallControl obj)
{
// TODO: get the shipcall from the control and show the edit control
Shipcall? sc = obj.ShipcallControlModel?.Shipcall;
if (sc != null)
{
EditShipcallControl esc = new()
{
Shipcall = sc,
Ships = _ships,
Participants = _participants,
Berths = _berths
};
if(esc.ShowDialog() ?? false)
{
try
{
await _api.ShipcallsPutAsync(sc);
obj.RefreshData();
}
catch (Exception ex)
{
ShowErrorDialog(ex.Message, "Error saving edited shipcall");
}
}
}
}
private void Sc_TimesRequested(ShipcallControl obj)
@ -314,6 +336,14 @@ namespace BreCalClient
}
private void ShowErrorDialog(string message, string caption)
{
Dispatcher.Invoke(new Action(() =>
{
MessageBox.Show(message, caption, MessageBoxButton.OK, MessageBoxImage.Error);
}));
}
#endregion
}

View File

@ -423,6 +423,15 @@ namespace BreCalClient.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Not rotated.
/// </summary>
public static string textNotRotated {
get {
return ResourceManager.GetString("textNotRotated", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to OK.
/// </summary>
@ -531,6 +540,15 @@ namespace BreCalClient.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Rotated.
/// </summary>
public static string textRotated {
get {
return ResourceManager.GetString("textRotated", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Search.
/// </summary>

View File

@ -226,6 +226,9 @@
<data name="textNewPassword" xml:space="preserve">
<value>Neues Passwort</value>
</data>
<data name="textNotRotated" xml:space="preserve">
<value>Ungedreht</value>
</data>
<data name="textOK" xml:space="preserve">
<value>OK</value>
</data>
@ -262,6 +265,9 @@
<data name="textReplenishingTerminal" xml:space="preserve">
<value>Versorgungsaufnahme Terminal</value>
</data>
<data name="textRotated" xml:space="preserve">
<value>Gedreht</value>
</data>
<data name="textSearch" xml:space="preserve">
<value>Suche</value>
</data>

View File

@ -235,6 +235,9 @@
<data name="textNewPassword" xml:space="preserve">
<value>New password</value>
</data>
<data name="textNotRotated" xml:space="preserve">
<value>Not rotated</value>
</data>
<data name="textOK" xml:space="preserve">
<value>OK</value>
</data>
@ -271,6 +274,9 @@
<data name="textReplenishingTerminal" xml:space="preserve">
<value>Replenishing terminal</value>
</data>
<data name="textRotated" xml:space="preserve">
<value>Rotated</value>
</data>
<data name="textSearch" xml:space="preserve">
<value>Search</value>
</data>

View File

@ -59,7 +59,7 @@ namespace BreCalClient
private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
this.comboBoxCategories.ItemsSource = Enum.GetValues(typeof(Shipcall.TypeEnum));
this.comboBoxCategories.ItemsSource = Enum.GetValues(typeof(Extensions.TypeEnum));
}
#endregion

View File

@ -45,86 +45,61 @@
<ColumnDefinition Width="30" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Margin="2" Grid.Column="0" >
<Image.Style>
<Style TargetType="Image">
<Setter Property="Source" Value="{Binding Shipcall.Type}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Shipcall.Type}" Value="{x:Static db2:Shipcall+TypeEnum.Incoming}">
<Setter Property="Source" Value="./Resources/arrow_down_red.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Shipcall.Type}" Value="{x:Static db2:Shipcall+TypeEnum.Outgoing}">
<Setter Property="Source" Value="./Resources/arrow_up_green.png"/>
</DataTrigger>
<DataTrigger Binding="{Binding Shipcall.Type}" Value="{x:Static db2:Shipcall+TypeEnum.Shifting}">
<Setter Property="Source" Value="./Resources/arrow_right_blue.png"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Label Grid.Column="1" FontSize="10" Content="{Binding Ship.Name}" Foreground="White" Background="#203864" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
<Image Margin="2" Grid.Column="0" PreviewMouseUp="Image_PreviewMouseUp" x:Name="imageShipcallType" />
<Label Grid.Column="1" FontSize="10" x:Name="labelShipName" Foreground="White" Background="#203864" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" PreviewMouseUp="Image_PreviewMouseUp"/>
</Grid>
<Viewbox Grid.Row="1" Grid.Column="0">
<TextBlock Text="IMO" />
</Viewbox>
<Viewbox Grid.Row="1" Grid.Column="1">
<TextBlock Text="{Binding Ship.Imo}" />
<TextBlock x:Name="textBlockIMO" />
</Viewbox>
<Viewbox Grid.Row="2" Grid.Column="0">
<TextBlock Text="{x:Static p:Resources.textCallsign}" />
</Viewbox>
<Viewbox Grid.Row="2" Grid.Column="1">
<TextBlock Text="{Binding Ship.Callsign}" />
<TextBlock x:Name="textBlockCallsign" />
</Viewbox>
<Viewbox Grid.Row="3" Grid.Column="0">
<TextBlock Text="{x:Static p:Resources.textLengthWidth}" />
</Viewbox>
<Viewbox Grid.Row="3" Grid.Column="1">
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}m/{1}m">
<Binding Path="Ship.Length" />
<Binding Path="Ship.Width" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock x:Name="textBlockLengthWidth" />
</Viewbox>
<Viewbox Grid.Row="5" Grid.Column="0">
<TextBlock Text="ETA" />
</Viewbox>
<Viewbox Grid.Row="5" Grid.Column="1">
<TextBlock Text="{Binding Shipcall.Eta}" />
<TextBlock x:Name="textBlockETA" />
</Viewbox>
<Viewbox Grid.Row="6" Grid.Column="0">
<TextBlock Text="{x:Static p:Resources.textBerth}" />
</Viewbox>
<Viewbox Grid.Row="6" Grid.Column="1">
<TextBlock Text="{Binding Berth}" />
<TextBlock x:Name="textBlockBerth" />
</Viewbox>
<Viewbox Grid.Row="7" Grid.Column="0">
<TextBlock Text="{x:Static p:Resources.textAgency}" />
</Viewbox>
<Viewbox Grid.Row="7" Grid.Column="1">
<TextBlock Text="{Binding Agency}" />
<TextBlock x:Name="textBlockAgency" />
</Viewbox>
</Grid>
<Label Grid.Row="0" Grid.Column="1" Grid.RowSpan="1" FontSize="12" Content="- / -" Foreground="White" Background="#203864" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelAgent"/>
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelAgent" PreviewMouseUp="labelAgent_PreviewMouseUp"/>
<Label Grid.Row="0" Grid.Column="2" Grid.RowSpan="1" FontSize="12" Content="- / -" Foreground="White" Background="#203864" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelMooring"/>
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelMooring" PreviewMouseUp="labelMooring_PreviewMouseUp"/>
<Label Grid.Row="0" Grid.Column="3" Grid.RowSpan="1" FontSize="12" Content="- / -" Foreground="White" Background="#203864" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelPortAuthority"/>
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelPortAuthority" PreviewMouseUp="labelPortAuthority_PreviewMouseUp" />
<Label Grid.Row="0" Grid.Column="4" Grid.RowSpan="1" FontSize="12" Content="- / -" Foreground="White" Background="#203864" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelPilot"/>
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelPilot" PreviewMouseUp="labelPilot_PreviewMouseUp"/>
<Label Grid.Row="0" Grid.Column="5" Grid.RowSpan="1" FontSize="12" Content="- / -" Foreground="White" Background="#203864" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelTug"/>
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelTug" PreviewMouseUp="labelTug_PreviewMouseUp"/>
<Label Grid.Row="0" Grid.Column="6" Grid.RowSpan="1" FontSize="12" Content="- / -" Foreground="White" Background="#203864" VerticalAlignment="Stretch"
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelTerminal"/>
HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Name="labelTerminal" PreviewMouseUp="labelTerminal_PreviewMouseUp" />

View File

@ -5,6 +5,7 @@
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace BreCalClient
{
@ -66,6 +67,29 @@ namespace BreCalClient
name = this.ShipcallControlModel.GetParticipantNameForType(Extensions.ParticipantType.TERMINAL);
if (name != null)
this.labelTerminal.Content = name;
this.labelShipName.Content = this.ShipcallControlModel?.Ship?.Name;
switch(this.ShipcallControlModel?.Shipcall?.Type)
{
case 1: // incoming
this.imageShipcallType.Source = new BitmapImage(new Uri("pack://application:,,,/BreCalClient;component/Resources/arrow_down_red.png"));
break;
case 2: // outgoing
this.imageShipcallType.Source = new BitmapImage(new Uri("pack://application:,,,/BreCalClient;component/Resources/arrow_up_green.png"));
break;
case 3: // shifting
this.imageShipcallType.Source = new BitmapImage(new Uri("pack://application:,,,/BreCalClient;component/Resources/arrow_right_blue.png"));
break;
default:
break;
}
this.textBlockAgency.Text = this.ShipcallControlModel?.Agency;
this.textBlockBerth.Text = this.ShipcallControlModel?.Berth;
this.textBlockCallsign.Text = this.ShipcallControlModel?.Ship?.Callsign;
this.textBlockETA.Text = this.ShipcallControlModel?.Shipcall?.Eta.ToString();
this.textBlockIMO.Text = this.ShipcallControlModel?.Ship?.Imo.ToString();
this.textBlockLengthWidth.Text = $"{this.ShipcallControlModel?.Ship?.Length} / {this.ShipcallControlModel?.Ship?.Width}";
}
#endregion
@ -74,7 +98,7 @@ namespace BreCalClient
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = this.ShipcallControlModel;
}
private void buttonListTimes_Click(object sender, RoutedEventArgs e)
@ -94,5 +118,39 @@ namespace BreCalClient
#endregion
private void labelAgent_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
}
private void Image_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
this.EditRequested?.Invoke(this);
}
private void labelMooring_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
}
private void labelPortAuthority_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
}
private void labelPilot_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
}
private void labelTug_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
}
private void labelTerminal_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
}
}
}

View File

@ -641,6 +641,7 @@ namespace RoleEditor
// create new participant
Participant p = new Participant();
p.Name = participant_name;
p.Type = (uint) Participant.ParticipantType.TERMINAL;
await p.Save(_dbManager);
_participants.Add(p);
pCounter++;

View File

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
// Copyright (c) 2023- schick Informatik
// Description: Enum description string conversion helper
using System.ComponentModel;
using System.Linq;
namespace brecal.model
{
@ -9,9 +9,14 @@ namespace brecal.model
{
public static string Description(this Enum eValue)
{
var nAttributes = eValue.GetType().GetField(eValue.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);
if (nAttributes.Any())
return (nAttributes.First() as DescriptionAttribute).Description;
var nAttributes = eValue.GetType().GetField(eValue.ToString())?.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (nAttributes != null)
{
if (nAttributes.Any() && nAttributes.First() != null && (nAttributes.First() is DescriptionAttribute da))
{
return da.Description;
}
}
return eValue.ToString();
}

View File

@ -1,5 +1,6 @@
from dataclasses import field
from marshmallow import Schema, fields, INCLUDE, ValidationError
from marshmallow_dataclass import dataclass
from typing import List
@ -22,7 +23,7 @@ class Berth(Schema):
deleted: bool
class Error(Schema):
message = fields.String(required=True,)
message = fields.String(required=True)
class GetVerifyInlineResp(Schema):
@ -56,7 +57,6 @@ class Participant(Schema):
class ParticipantList(Participant):
pass
class ShipcallSchema(Schema):
def __init__(self):
super().__init__(unknown=None)
@ -66,35 +66,35 @@ class ShipcallSchema(Schema):
ship_id = fields.Int()
type = fields.Int()
eta = fields.DateTime()
voyage = fields.Str()
etd = fields.DateTime()
arrival_berth_id = fields.Int()
departure_berth_id = fields.Int()
tug_required = fields.Bool()
pilot_required = fields.Bool()
flags = fields.Int()
pier_side = fields.Bool()
bunkering = fields.Bool()
replenishing_terminal = fields.Bool()
replenishing_lock = fields.Bool()
draft = fields.Float()
tidal_window_from = fields.DateTime()
tidal_window_to = fields.DateTime()
rain_sensitive_cargo = fields.Bool()
recommended_tugs = fields.Int()
anchored = fields.Bool()
moored_lock = fields.Bool()
canceled = fields.Bool()
voyage = fields.Str(Required = False, allow_none=True)
etd = fields.DateTime(Required = False, allow_none=True)
arrival_berth_id = fields.Int(Required = False, allow_none=True)
departure_berth_id = fields.Int(Required = False, allow_none=True)
tug_required = fields.Bool(Required = False, allow_none=True)
pilot_required = fields.Bool(Required = False, allow_none=True)
flags = fields.Int(Required = False, allow_none=True)
pier_side = fields.Bool(Required = False, allow_none=True)
bunkering = fields.Bool(Required = False, allow_none=True)
replenishing_terminal = fields.Bool(Required = False, allow_none=True)
replenishing_lock = fields.Bool(Required = False, allow_none=True)
draft = fields.Float(Required = False, allow_none=True)
tidal_window_from = fields.DateTime(Required = False, allow_none=True)
tidal_window_to = fields.DateTime(Required = False, allow_none=True)
rain_sensitive_cargo = fields.Bool(Required = False, allow_none=True)
recommended_tugs = fields.Int(Required = False, allow_none=True)
anchored = fields.Bool(Required = False, allow_none=True)
moored_lock = fields.Bool(Required = False, allow_none=True)
canceled = fields.Bool(Required = False, allow_none=True)
participants = fields.List(fields.Int)
created = fields.DateTime()
modified = fields.DateTime()
created = fields.DateTime(Required = False, allow_none=True)
modified = fields.DateTime(Required = False, allow_none=True)
@dataclass
class Shipcall:
id: int
ship_id: int
type: int
type: str
eta: datetime
voyage: str
etd: datetime