Compare commits

...

7 Commits

Author SHA1 Message Date
ce2fdba811 Add phone number validation in message view models and update UI to display error messages 2025-07-22 16:28:09 +02:00
0ee468ef8c Remove secure text entry setting for iOS and add launch configuration for .NET MAUI 2025-07-22 16:01:12 +02:00
931d126e8e
Merge branch 'features/paymenttype-cash' into develop 2025-07-22 14:36:15 +02:00
0e7db09d33 Update terms acceptance logic and improve accessibility
- Initialize `_acceptedTermsMangopay` to `true` in
  `AddPaymentUserViewModel.cs` and `BecomeWalkerViewModel.cs`.
- Set `AcceptedTermsMangopay` to `true` on refresh.
- Add `AutomationId` attributes to email and password
  `Entry` elements in `LoginFormView.xaml` for better
  accessibility.
- Comment out a `Grid` element and remove the `Switch`
  control for `AcceptedTermsMangopay` in
  `AddPaymentUserView.xaml` and `BecomeWalkerView.xaml`.
2025-07-20 13:50:02 +02:00
fb0e7978ee Implement PaymentInfoPopup with ViewModel and acknowledgment functionality 2025-07-15 13:05:23 +02:00
1c44f686ab Refactor XAML and ViewModel code to comment out not needed UI elements and logic for mangopay 2025-07-15 11:19:46 +02:00
e6671d19fb Add PaymentType column to Walks table in migration 20250706144607
- Introduced a new column 'PaymentType' of type INTEGER to the 'Walks' table.
- Set default value for 'PaymentType' to 0.
- Implemented migration methods to handle the addition and removal of the column.
2025-07-14 14:01:34 +02:00
39 changed files with 2235 additions and 85 deletions

15
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": ".NET MAUI",
"type": "maui",
"request": "launch",
"preLaunchTask": "maui: Build"
}
]
}

1
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1 @@
{}

View File

@ -352,7 +352,7 @@ namespace gehGassiApp.Core.Services
var json = JsonSerializer.Serialize(registerDto, _jsonOptions);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/v2/Account/Register", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/v3/Account/Register", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{
@ -453,7 +453,7 @@ namespace gehGassiApp.Core.Services
var json = JsonSerializer.Serialize(registerDto, _jsonOptions);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/v2/Account/RegisterExternal", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/v3/Account/RegisterExternal", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{
@ -5952,7 +5952,7 @@ namespace gehGassiApp.Core.Services
var json = JsonSerializer.Serialize(requestDto, _jsonOptions);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/walks/AcceptPublicWalkRequest", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/v2/walks/AcceptPublicWalkRequest", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{
@ -7499,7 +7499,7 @@ namespace gehGassiApp.Core.Services
var json = JsonSerializer.Serialize(requestDto, _jsonOptions);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/walks/CancelWalk", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/v2/walks/CancelWalk", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{
@ -7688,7 +7688,7 @@ namespace gehGassiApp.Core.Services
var json = JsonSerializer.Serialize(requestDto, _jsonOptions);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/walks/ConfirmWalk", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/v2/walks/ConfirmWalk", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{
@ -7754,7 +7754,7 @@ namespace gehGassiApp.Core.Services
var json = JsonSerializer.Serialize(requestDto, _jsonOptions);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/walks/ConfirmWalkWithRating", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/v2/walks/ConfirmWalkWithRating", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{
@ -7953,7 +7953,7 @@ namespace gehGassiApp.Core.Services
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/walks/CreateWalkDirect", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/v2/walks/CreateWalkDirect", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{
@ -8032,7 +8032,7 @@ namespace gehGassiApp.Core.Services
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/walks/CreateWalkRequest", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/v2/walks/CreateWalkRequest", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{
@ -8106,7 +8106,7 @@ namespace gehGassiApp.Core.Services
var json = JsonSerializer.Serialize(requestDto, _jsonOptions);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/walks/AcceptWalk", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/v2/walks/AcceptWalk", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{

View File

@ -1,6 +1,11 @@

migrations:
dotnet ef migrations add XXX --project gehGassiApp.Data --startup-project gehGassiApp.DbConfig
dotnet ef database update --project gehGassiApp.Data --startup-project gehGassiApp.DbConfig
add-migration xxx -Project gehGassiApp.Data -StartupProject gehGassiApp.DbConfig
add-migration Initial -Project gehGassiApp.Data -StartupProject gehGassiApp.DbConfig

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace gehGassiApp.Data.Migrations
{
/// <inheritdoc />
public partial class Walk_PaymentType_Added : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
name: "PaymentType",
table: "Walks",
type: "INTEGER",
nullable: false,
defaultValue: 0);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "PaymentType",
table: "Walks");
}
}
}

View File

@ -15,7 +15,7 @@ namespace gehGassiApp.Data.Migrations
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "7.0.2");
modelBuilder.HasAnnotation("ProductVersion", "8.0.12");
modelBuilder.Entity("gehGassiApp.Domain.Common.Rating", b =>
{
@ -1345,6 +1345,9 @@ namespace gehGassiApp.Data.Migrations
b.Property<int>("PaymentStatus")
.HasColumnType("INTEGER");
b.Property<int>("PaymentType")
.HasColumnType("INTEGER");
b.Property<double>("PickupAddressLat")
.HasColumnType("REAL");

View File

@ -130,7 +130,20 @@ namespace gehGassiApp.Domain.Common
/// </summary>
GehGassi = 10
}
/// <summary>
/// Zahlungsart für einen Walk
/// </summary>
public enum WalkPaymentType
{
/// <summary>
/// Mit MangoPay bezahlen (z.B. Kreditkarte)
/// </summary>
MangoPay = 1,
/// <summary>
/// Barzahlung
/// </summary>
Cash = 10
}
/// <summary>
/// Zahlungsstatus in der App
/// </summary>

View File

@ -176,7 +176,11 @@ namespace gehGassiApp.Domain.Walks
/// </summary>
[Required]
public PaymentStatus PaymentStatus { get; set; }
/// <summary>
/// Welche Art von Bezahlung wurde verwendet
/// </summary>
[Required]
public WalkPaymentType PaymentType { get; set; }
/// <summary>
/// Datum der Erstellung des Walks
/// </summary>
@ -437,7 +441,11 @@ namespace gehGassiApp.Domain.Walks
/// Zahlungsstatus des Walks
/// </summary>
public PaymentStatus PaymentStatus { get; set; }
/// <summary>
/// Welche Art von Bezahlung wurde verwendet
/// </summary>
[Required]
public WalkPaymentType PaymentType { get; set; }
/// <summary>
/// Id des Gutscheins der verwendet wurde, wenn einer verwendet wurde
/// </summary>

View File

@ -150,7 +150,7 @@
<Switch Grid.Column="1" VerticalOptions="Center" HorizontalOptions="End" IsToggled="{Binding ViewModel.AcceptedPrivacy}"></Switch>
</Grid>
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="10"
<!-- <Grid ColumnDefinitions="*,Auto" ColumnSpacing="10"
IsVisible="{Binding ViewModel.AppUserType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enum:AppUserType.DogWalker}}" >
<Label Grid.Column="0" Text="{x:Static res:Text.Register_AcceptTermsMangopay}" Style="{StaticResource LinkLabelStyle}" HorizontalOptions="Start" Padding="0,0,0,0" LineBreakMode="TailTruncation">
<Label.GestureRecognizers>
@ -158,7 +158,7 @@
</Label.GestureRecognizers>
</Label>
<Switch Grid.Column="1" VerticalOptions="Center" HorizontalOptions="End" IsToggled="{Binding ViewModel.AcceptedTermsMangopay}"></Switch>
</Grid>
</Grid> -->
</VerticalStackLayout>
<VerticalStackLayout Spacing="0" IsVisible="{Binding ViewModel.AppUserType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enum:AppUserType.DogWalker}}" Margin="{StaticResource MarginBig}">

View File

@ -117,7 +117,7 @@
<Switch Grid.Column="1" VerticalOptions="Center" HorizontalOptions="End" IsToggled="{Binding ViewModel.AcceptedPrivacy}"></Switch>
</Grid>
<Grid ColumnDefinitions="*,Auto" ColumnSpacing="10"
<!-- <Grid ColumnDefinitions="*,Auto" ColumnSpacing="10"
IsVisible="{Binding ViewModel.AppUserType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enum:AppUserType.DogWalker}}" >
<Label Grid.Column="0" Text="{x:Static res:Text.Register_AcceptTermsMangopay}" Style="{StaticResource LinkLabelStyle}" HorizontalOptions="Start" Padding="0,0,0,0" LineBreakMode="TailTruncation">
<Label.GestureRecognizers>
@ -125,7 +125,7 @@
</Label.GestureRecognizers>
</Label>
<Switch Grid.Column="1" VerticalOptions="Center" HorizontalOptions="End" IsToggled="{Binding ViewModel.AcceptedTermsMangopay}"></Switch>
</Grid>
</Grid> -->
</VerticalStackLayout>
<VerticalStackLayout Spacing="0" IsVisible="{Binding ViewModel.AppUserType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enum:AppUserType.DogWalker}}" Margin="{StaticResource MarginBig}">

View File

@ -103,7 +103,7 @@ public static class MauiProgram
fonts.AddFont("Inter-Medium.ttf", "InterMedium");
fonts.AddFont("Inter-SemiBold.ttf", "InterSemiBold");
fonts.AddFont("icomoon.ttf", "IconMoon");
fonts.AddFont("MaterialIcons-Regular.ttf", "IconFont");
fonts.AddFont("MaterialIcons-Regular.ttf", "MaterialIconsRegular");
}).UseLocalNotifications()
.ConfigureMauiHandlers((handlers) =>
{
@ -504,7 +504,7 @@ public static class MauiProgram
#endif
#if IOS
handler.PlatformView.BorderStyle = UITextBorderStyle.None;
handler.PlatformView.SecureTextEntry = false;
// handler.PlatformView.SecureTextEntry = false;
#endif
}

View File

@ -27,8 +27,6 @@
<string>Assets.xcassets/appicon.appiconset</string>
<key>CFBundleIdentifier</key>
<string></string>
<key>CFBundleShortVersionString</key>
<string>1.274</string>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
@ -69,7 +67,7 @@
<array>
<string>remote-notification</string>
</array>
<key>CFBundleVersion</key>
<string>274</string>
<key>CFBundleIdentifier</key>
<string></string>
</dict>
</plist>

View File

@ -184,7 +184,7 @@
<Image.Source>
<FontImageSource
x:Name="homeImageSource"
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
Glyph="home"
Color="{StaticResource Primary_DarkBlue}" />
</Image.Source>
@ -217,7 +217,7 @@
<Image.Source>
<FontImageSource
x:Name="homeWalkerImageSource"
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
Glyph="home"
Color="{StaticResource Primary_DarkBlue}" />
</Image.Source>
@ -505,7 +505,7 @@
Background="Transparent"
Command="{TemplateBinding BindingContext.NavigateBackCommand}"
FontAttributes="Bold"
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
FontSize="40"
HorizontalOptions="End"
Text="close"

View File

@ -203,7 +203,9 @@ namespace gehGassiApp.ViewModels.Account
if (AppUserType == AppUserType.DogOwner)
return true;
if (AcceptedTermsMangopay && SelectedNationality != null && SelectedMainResidence != null)
// if (AcceptedTermsMangopay && SelectedNationality != null && SelectedMainResidence != null)
// return true;
if (SelectedNationality != null && SelectedMainResidence != null)
return true;
return false;

View File

@ -1,4 +1,5 @@
using System.Collections.ObjectModel;
using System.Text.RegularExpressions;
using System.Web;
using CommunityToolkit.Maui.Core.Extensions;
using CommunityToolkit.Mvvm.ComponentModel;
@ -28,6 +29,13 @@ namespace gehGassiApp.ViewModels.Messages
private readonly IFavouriteService _favouriteService;
private string _conversationId;
// Regex pattern für Telefonnummer-Erkennung
private static readonly Regex PhoneNumberRegex = new Regex(
@"(\+\d{1,4}[\s\-\(\)]*(?:\(0\)[\s\-]*)?[\d\s\-\(\)\/]{7,15})|" + // Internationale Nummern mit Ländercode
@"(0\d{2,5}[\s\-\/]*\d{4,12})|" + // Deutsche Festnetz-/Mobilnummern
@"(\d{10,15})", // Reine Zahlenketten (10-15 Ziffern)
RegexOptions.Compiled | RegexOptions.IgnoreCase);
/// <summary>
/// Erstellt eine Instanz
/// </summary>
@ -50,6 +58,40 @@ namespace gehGassiApp.ViewModels.Messages
_favouriteService = favouriteService;
Title = Text.View_Title_Messages;
SelectedMenu = MenuSelected.Messages;
// PropertyChanged Event für Message registrieren
PropertyChanged += OnPropertyChanged;
}
/// <summary>
/// Handler für PropertyChanged Events
/// </summary>
private void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(Message))
{
ValidateForPhoneNumbers(Message);
}
}
/// <summary>
/// Validiert den Text auf Telefonnummern
/// </summary>
/// <param name="text">Zu validierender Text</param>
private void ValidateForPhoneNumbers(string text)
{
if (string.IsNullOrWhiteSpace(text))
{
HasPhoneNumber = false;
PhoneNumberErrorMessage = string.Empty;
return;
}
var hasPhone = PhoneNumberRegex.IsMatch(text);
HasPhoneNumber = hasPhone;
PhoneNumberErrorMessage = hasPhone
? "Aus Sicherheitsgründen können keine Telefonnummern geteilt werden. Bitte nutzen Sie unseren integrierten Messenger."
: string.Empty;
}
/// <summary>
@ -84,6 +126,18 @@ namespace gehGassiApp.ViewModels.Messages
[ObservableProperty]
private string _message;
/// <summary>
/// Gibt an, ob eine Telefonnummer im Text erkannt wurde
/// </summary>
[ObservableProperty]
private bool _hasPhoneNumber;
/// <summary>
/// Fehlermeldung für Telefonnummer-Validierung
/// </summary>
[ObservableProperty]
private string _phoneNumberErrorMessage;
/// <summary>
/// Wird pull to refresh ausgeführt?
/// </summary>
@ -98,7 +152,7 @@ namespace gehGassiApp.ViewModels.Messages
[RelayCommand]
public async Task Send()
{
if (!string.IsNullOrWhiteSpace(Message))
if (!string.IsNullOrWhiteSpace(Message) && !HasPhoneNumber)
{
IsBusy = true;
using var cts = new CancellationTokenSource(Core.Common.Constants.CreateTimeout);

View File

@ -1,4 +1,5 @@
using System.Collections.ObjectModel;
using System.Text.RegularExpressions;
using System.Web;
using CommunityToolkit.Maui.Core.Extensions;
using CommunityToolkit.Mvvm.ComponentModel;
@ -30,6 +31,13 @@ namespace gehGassiApp.ViewModels.Messages
private readonly IFavouriteService _favouriteService;
private string _conversationId;
// Regex pattern für Telefonnummer-Erkennung
private static readonly Regex PhoneNumberRegex = new Regex(
@"(\+\d{1,4}[\s\-\(\)]*(?:\(0\)[\s\-]*)?[\d\s\-\(\)\/]{7,15})|" + // Internationale Nummern mit Ländercode
@"(0\d{2,5}[\s\-\/]*\d{4,12})|" + // Deutsche Festnetz-/Mobilnummern
@"(\d{10,15})", // Reine Zahlenketten (10-15 Ziffern)
RegexOptions.Compiled | RegexOptions.IgnoreCase);
/// <summary>
/// Erstellt eine Instanz
@ -53,6 +61,40 @@ namespace gehGassiApp.ViewModels.Messages
_favouriteService = favouriteService;
Title = Text.View_Title_Messages;
SelectedMenu = MenuSelected.Messages;
// PropertyChanged Event für Message registrieren
PropertyChanged += OnPropertyChanged;
}
/// <summary>
/// Handler für PropertyChanged Events
/// </summary>
private void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == nameof(Message))
{
ValidateForPhoneNumbers(Message);
}
}
/// <summary>
/// Validiert den Text auf Telefonnummern
/// </summary>
/// <param name="text">Zu validierender Text</param>
private void ValidateForPhoneNumbers(string text)
{
if (string.IsNullOrWhiteSpace(text))
{
HasPhoneNumber = false;
PhoneNumberErrorMessage = string.Empty;
return;
}
var hasPhone = PhoneNumberRegex.IsMatch(text);
HasPhoneNumber = hasPhone;
PhoneNumberErrorMessage = hasPhone
? "Aus Sicherheitsgründen können keine Telefonnummern geteilt werden. Bitte nutzen Sie unseren integrierten Messenger."
: string.Empty;
}
/// <summary>
@ -87,6 +129,18 @@ namespace gehGassiApp.ViewModels.Messages
[ObservableProperty]
private string _message;
/// <summary>
/// Gibt an, ob eine Telefonnummer im Text erkannt wurde
/// </summary>
[ObservableProperty]
private bool _hasPhoneNumber;
/// <summary>
/// Fehlermeldung für Telefonnummer-Validierung
/// </summary>
[ObservableProperty]
private string _phoneNumberErrorMessage;
/// <summary>
/// Wird pull to refresh ausgeführt?
/// </summary>
@ -101,7 +155,7 @@ namespace gehGassiApp.ViewModels.Messages
[RelayCommand]
public async Task Send()
{
if (!string.IsNullOrWhiteSpace(Message))
if (!string.IsNullOrWhiteSpace(Message) && !HasPhoneNumber)
{
IsBusy = true;
using var cts = new CancellationTokenSource(Core.Common.Constants.CreateTimeout);

View File

@ -81,7 +81,7 @@ namespace gehGassiApp.ViewModels.More
/// Hat der Benutzer die MangoPay-AGB akzeptiert?
/// </summary>
[ObservableProperty]
private bool _acceptedTermsMangopay;
private bool _acceptedTermsMangopay = true;
#region Commands
@ -177,7 +177,7 @@ namespace gehGassiApp.ViewModels.More
{
SelectedNationality = null;
SelectedMainResidence = null;
AcceptedTermsMangopay = false;
AcceptedTermsMangopay = true;
IsBusy = true;
await Task.Delay(Core.Common.Constants.AnimationDelayDetails);

View File

@ -91,7 +91,7 @@ namespace gehGassiApp.ViewModels.More
/// Hat der Benutzer die MangoPay-AGB akzeptiert?
/// </summary>
[ObservableProperty]
private bool _acceptedTermsMangopay;
private bool _acceptedTermsMangopay = true;
#region Commands
@ -193,7 +193,7 @@ namespace gehGassiApp.ViewModels.More
{
SelectedNationality = null;
SelectedMainResidence = null;
AcceptedTermsMangopay = false;
AcceptedTermsMangopay = true;
IsBusy = true;
await Task.Delay(Core.Common.Constants.AnimationDelayDetails);

View File

@ -0,0 +1,57 @@
using CommunityToolkit.Maui.Views;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
namespace gehGassiApp.ViewModels.Popups
{
/// <summary>
/// ViewModel für das Zahlungshinweis-Popup
///
/// Verwendung:
/// // Prüfen ob bereits angezeigt
/// if (!PaymentInfoPopupViewModel.HasInfoBeenShown())
/// {
/// var popup = new PaymentInfoPopup();
/// await Shell.Current.CurrentPage.ShowPopupAsync(popup);
/// }
/// </summary>
public partial class PaymentInfoPopupViewModel : ObservableObject
{
private readonly Popup _popup;
private const string PAYMENT_INFO_SHOWN_KEY = "payment_info_july_shown_2025";
public PaymentInfoPopupViewModel(Popup popup)
{
_popup = popup;
}
/// <summary>
/// Prüft, ob der Zahlungshinweis bereits angezeigt wurde
/// </summary>
public static bool HasInfoBeenShown()
{
return Preferences.Get(PAYMENT_INFO_SHOWN_KEY, false);
}
/// <summary>
/// Markiert den Hinweis als angezeigt
/// </summary>
private static void MarkInfoAsShown()
{
Preferences.Set(PAYMENT_INFO_SHOWN_KEY, true);
}
/// <summary>
/// User hat den Hinweis zur Kenntnis genommen
/// </summary>
[RelayCommand]
private async Task Acknowledge()
{
// Hinweis als angezeigt markieren
MarkInfoAsShown();
// Popup schließen
await _popup.CloseAsync(true);
}
}
}

View File

@ -35,6 +35,7 @@
<Entry
x:Name="email"
Keyboard="Email"
AutomationId="Login"
Placeholder="{x:Static res:Text.Login_Username}"
Text="{Binding Email}">
<Entry.Behaviors>
@ -48,6 +49,7 @@
<Entry
Grid.Column="0"
HorizontalOptions="Fill"
AutomationId="Password"
IsPassword="{Binding Source={x:Reference showPasswordTrigger}, Path=HidePassword}"
Keyboard="Text"
Placeholder="{x:Static res:Text.Login_Password}"

View File

@ -77,7 +77,7 @@
WidthRequest="40">
<Button.ImageSource>
<FontImageSource
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
Glyph="photo_camera"
Size="20"
Color="{StaticResource Primary_White}" />

View File

@ -76,7 +76,7 @@
WidthRequest="40">
<Button.ImageSource>
<FontImageSource
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
Glyph="photo_camera"
Size="20"
Color="{StaticResource Primary_White}" />

View File

@ -17,7 +17,7 @@
</controls:BaseContentPage.TitleView>
<ContentPage.Content>
<Grid RowDefinitions="*,Auto" HorizontalOptions="Fill" VerticalOptions="FillAndExpand" Padding="20,10,20,0" RowSpacing="0">
<Grid RowDefinitions="*,Auto,Auto" HorizontalOptions="Fill" VerticalOptions="FillAndExpand" Padding="20,10,20,0" RowSpacing="0">
<Grid Grid.Row="0" VerticalOptions="FillAndExpand" HorizontalOptions="Fill">
<CollectionView x:Name="messages" ItemsSource="{Binding Messages}" ItemTemplate="{StaticResource MessageIosDataTemplateSelector}" HorizontalOptions="Fill" VerticalOptions="Fill"
@ -54,11 +54,21 @@
<MultiBinding Converter="{StaticResource AllTrueMultiConverter}">
<Binding Source="{x:Reference notEmptyValidation}" Path="IsValid"></Binding>
<Binding Path="IsBusy" Converter="{StaticResource InvertedBoolConverter}"></Binding>
<Binding Path="HasPhoneNumber" Converter="{StaticResource InvertedBoolConverter}"></Binding>
</MultiBinding>
</ImageButton.IsEnabled>
</ImageButton>
</Grid>
</Border>
<!-- Fehlermeldung für Telefonnummer-Validierung -->
<Label Grid.Row="2"
Text="{Binding PhoneNumberErrorMessage}"
IsVisible="{Binding HasPhoneNumber}"
TextColor="Red"
FontSize="12"
Margin="0,5,0,0"
HorizontalOptions="Fill" />
</Grid>
</ContentPage.Content>

View File

@ -19,7 +19,7 @@
<ContentPage.Content>
<Grid RowDefinitions="*,Auto" Padding="20" RowSpacing="20" HorizontalOptions="Fill" VerticalOptions="FillAndExpand">
<Grid RowDefinitions="*,Auto,Auto" Padding="20" RowSpacing="20" HorizontalOptions="Fill" VerticalOptions="FillAndExpand">
<RefreshView Grid.Row="0" IsRefreshing="{Binding IsRefreshing}" Command="{Binding RefreshCommand}">
<Grid HorizontalOptions="Fill" VerticalOptions="FillAndExpand">
<CollectionView x:Name="messages" ItemsSource="{Binding MessageGroups}" ItemTemplate="{StaticResource MessageDataTemplateSelector}" HorizontalOptions="Fill" IsGrouped="True"
@ -59,11 +59,21 @@
<MultiBinding Converter="{StaticResource AllTrueMultiConverter}">
<Binding Source="{x:Reference notEmptyValidation}" Path="IsValid"></Binding>
<Binding Path="IsBusy" Converter="{StaticResource InvertedBoolConverter}"></Binding>
<Binding Path="HasPhoneNumber" Converter="{StaticResource InvertedBoolConverter}"></Binding>
</MultiBinding>
</ImageButton.IsEnabled>
</ImageButton>
</Grid>
</Border>
<!-- Fehlermeldung für Telefonnummer-Validierung -->
<Label Grid.Row="2"
Text="{Binding PhoneNumberErrorMessage}"
IsVisible="{Binding HasPhoneNumber}"
TextColor="Red"
FontSize="12"
Margin="0,5,0,0"
HorizontalOptions="Fill" />
</Grid>
</ContentPage.Content>

View File

@ -64,7 +64,7 @@
ItemsSource="{Binding MainResidences}"
SelectedItem="{Binding SelectedMainResidence}" />
</Border>
<Grid
<!-- <Grid
Margin="{StaticResource MarginBig}"
ColumnDefinitions="*,Auto"
ColumnSpacing="10">
@ -83,7 +83,7 @@
HorizontalOptions="End"
IsToggled="{Binding AcceptedTermsMangopay}"
VerticalOptions="Center" />
</Grid>
</Grid> -->
<ActivityIndicator
HorizontalOptions="Center"

View File

@ -64,8 +64,8 @@
ItemDisplayBinding="{Binding Name}"
ItemsSource="{Binding MainResidences}"
SelectedItem="{Binding SelectedMainResidence}" />
</Border>
<Grid
</Border>
<!-- <Grid
Margin="{StaticResource MarginBig}"
ColumnDefinitions="*,Auto"
ColumnSpacing="10">
@ -84,7 +84,7 @@
HorizontalOptions="End"
IsToggled="{Binding AcceptedTermsMangopay}"
VerticalOptions="Center" />
</Grid>
</Grid>-->
<ActivityIndicator
HorizontalOptions="Center"

View File

@ -476,7 +476,7 @@
</Grid.GestureRecognizers>
</Grid>
<Border Style="{StaticResource Separator}" />
<!-- <Border Style="{StaticResource Separator}" />
<Grid
ColumnDefinitions="24,*,24"
@ -599,7 +599,7 @@
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding PayoutsCommand}" />
</Grid.GestureRecognizers>
</Grid>
</Grid> -->
<Border Style="{StaticResource Separator}" />

View File

@ -441,7 +441,7 @@
</Grid.GestureRecognizers>
</Grid>
<Border Style="{StaticResource Separator}" />
<!-- <Border Style="{StaticResource Separator}" />
<Grid
ColumnDefinitions="24,*,24"
@ -484,9 +484,9 @@
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding BankAccountCommand}" />
</Grid.GestureRecognizers>
</Grid>
</Grid> -->
<Border Style="{StaticResource Separator}" />
<!-- <Border Style="{StaticResource Separator}" />
<Grid
ColumnDefinitions="24,*,24"
@ -529,9 +529,9 @@
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding IdentityProofCommand}" />
</Grid.GestureRecognizers>
</Grid>
</Grid> -->
<Border Style="{StaticResource Separator}" />
<!-- <Border Style="{StaticResource Separator}" />
<Grid
ColumnDefinitions="24,*,24"
@ -564,7 +564,7 @@
<Grid.GestureRecognizers>
<TapGestureRecognizer Command="{Binding PayoutsCommand}" />
</Grid.GestureRecognizers>
</Grid>
</Grid> -->
<Border Style="{StaticResource Separator}" />

View File

@ -136,7 +136,7 @@
BorderWidth="1"
Command="{Binding PreviousStepCommand}"
CornerRadius="30"
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
FontSize="40"
HeightRequest="60"
HorizontalOptions="Start"
@ -158,7 +158,7 @@
BorderWidth="1"
Command="{Binding NextStepCommand}"
CornerRadius="30"
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
FontSize="40"
HeightRequest="60"
HorizontalOptions="End"

View File

@ -0,0 +1,98 @@
<?xml version="1.0" encoding="utf-8" ?>
<toolkit:Popup
x:Class="gehGassiApp.Views.Popups.PaymentInfoPopup"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:res="clr-namespace:gehGassiApp.Resources"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
CanBeDismissedByTappingOutsideOfPopup="True"
Color="Transparent">
<!-- Popup Content -->
<Border
Padding="0"
BackgroundColor="White"
StrokeShape="RoundRectangle 16"
StrokeThickness="0"
WidthRequest="350">
<!-- Drop Shadow Effect -->
<Border.Shadow>
<Shadow
Brush="{AppThemeBinding Light={StaticResource Grey_Dark},
Dark={StaticResource Grey_Dark_Dark}}"
Opacity="0.3"
Radius="8"
Offset="0,4" />
</Border.Shadow>
<Grid RowDefinitions="Auto,Auto,Auto">
<!-- Header -->
<Border
Grid.Row="0"
Padding="20,16"
BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}"
StrokeShape="RoundRectangle 16,16,0,0"
StrokeThickness="0">
<Label
Style="{StaticResource H4}"
Text="Zahlungshinweis"
TextColor="{AppThemeBinding Light={StaticResource Primary_White},
Dark={StaticResource Primary_White_Dark}}"
VerticalOptions="Center" />
</Border>
<!-- Content Bereich -->
<VerticalStackLayout
Grid.Row="1"
Padding="20,20"
Spacing="16">
<!-- Info Icon -->
<Label
FontFamily="MaterialIconsRegular"
FontSize="48"
HorizontalOptions="Center"
Text="info"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
<!-- Info Text -->
<Label
HorizontalTextAlignment="Center"
LineHeight="1.4"
Style="{StaticResource BodyM}"
Text="Leider sind diese Funktionen im Juli nicht verfügbar. Wir arbeiten aber fleißig an einer Lösung."
TextColor="{AppThemeBinding Light={StaticResource Grey_Dark},
Dark={StaticResource Grey_Dark_Dark}}" />
<!-- Additional Info -->
<Label
HorizontalTextAlignment="Center"
LineHeight="1.4"
Style="{StaticResource BodyM}"
Text="Im Juli sind nur Barzahlungen verfügbar."
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}"
FontAttributes="Bold" />
</VerticalStackLayout>
<!-- Action Button -->
<Button
Grid.Row="2"
Margin="20,0,20,20"
BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}"
Command="{Binding AcknowledgeCommand}"
CornerRadius="12"
FontAttributes="Bold"
FontSize="{StaticResource FontLabelM}"
Text="Verstanden"
TextColor="White" />
</Grid>
</Border>
</toolkit:Popup>

View File

@ -0,0 +1,13 @@
using CommunityToolkit.Maui.Views;
using gehGassiApp.ViewModels.Popups;
namespace gehGassiApp.Views.Popups;
public partial class PaymentInfoPopup : Popup
{
public PaymentInfoPopup()
{
InitializeComponent();
BindingContext = new PaymentInfoPopupViewModel(this);
}
}

View File

@ -36,7 +36,7 @@
Background="Transparent"
Command="{Binding DeclineCommand}"
FontAttributes="Bold"
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
FontSize="40"
HorizontalOptions="End"
Text="close"
@ -53,7 +53,7 @@
<!-- Icon - Gestapelte Napf-Icons -->
<Image
Margin="0,0,0,-10"
Margin="0,0,0,-20"
HeightRequest="120"
HorizontalOptions="Center"
Source="coins.png"
@ -109,7 +109,7 @@
<!-- Action Button -->
<Button
Grid.Row="2"
Margin="30,0,30,30"
Margin="30,0,30,20"
BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}"
Command="{Binding AcceptCommand}"

View File

@ -36,7 +36,7 @@
BackgroundColor="Transparent"
Command="{Binding CloseCommand}"
FontAttributes="Bold"
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
FontSize="40"
HorizontalOptions="End"
Style="{StaticResource LinkButton}"

View File

@ -89,7 +89,7 @@
WidthRequest="40">
<Button.ImageSource>
<FontImageSource
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
Glyph="photo_camera"
Size="20"
Color="{StaticResource Primary_White}" />
@ -442,7 +442,7 @@
SelectedItem="{Binding SelectedMainResidence}" />
</Border>
<Grid Margin="{StaticResource MarginVerySmall}" ColumnDefinitions="*,*">
<!-- <Grid Margin="{StaticResource MarginVerySmall}" ColumnDefinitions="*,*">
<Label
Grid.Column="0"
LineBreakMode="TailTruncation"
@ -467,7 +467,7 @@
<Label
Margin="{StaticResource MarginBig}"
Style="{StaticResource BodyCaption_GreyDark}"
Text="{x:Static res:Text.Profile_AutoPayout_Desc}" />
Text="{x:Static res:Text.Profile_AutoPayout_Desc}" /> -->
<ActivityIndicator
HorizontalOptions="Center"

View File

@ -95,7 +95,7 @@
WidthRequest="40">
<Button.ImageSource>
<FontImageSource
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
Glyph="photo_camera"
Size="20"
Color="{StaticResource Primary_White}" />
@ -500,7 +500,7 @@
SelectedItem="{Binding SelectedMainResidence}" />
</Border>
<Grid Margin="{StaticResource MarginVerySmall}" ColumnDefinitions="*,*">
<!-- <Grid Margin="{StaticResource MarginVerySmall}" ColumnDefinitions="*,*">
<Label
Grid.Column="0"
LineBreakMode="TailTruncation"
@ -522,7 +522,7 @@
</Switch>
</Grid>
<Label Style="{StaticResource BodyCaption_GreyDark}" Text="{x:Static res:Text.Profile_AutoPayout_Desc}" />
<Label Style="{StaticResource BodyCaption_GreyDark}" Text="{x:Static res:Text.Profile_AutoPayout_Desc}" /> -->
<ActivityIndicator
HorizontalOptions="Center"

View File

@ -51,7 +51,7 @@
<Button
Margin="0,0,-5,-35"
Command="{Binding NavigateBackCommand}"
FontFamily="IconFont"
FontFamily="MaterialIconsRegular"
FontSize="30"
HorizontalOptions="End"
Style="{StaticResource LinkButton}"

View File

@ -45,16 +45,12 @@
<GenerateSatelliteAssembliesForCore>True</GenerateSatelliteAssembliesForCore>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-android|AnyCPU'">
<ApplicationDisplayVersion>1.274</ApplicationDisplayVersion>
<ApplicationVersion>274</ApplicationVersion>
<AndroidUseAapt2>True</AndroidUseAapt2>
<AndroidCreatePackagePerAbi>False</AndroidCreatePackagePerAbi>
<AndroidPackageFormat>apk</AndroidPackageFormat>
<ApplicationId>com.gehgassi.local</ApplicationId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='DebugStaging|net8.0-android|AnyCPU'">
<ApplicationDisplayVersion>1.274</ApplicationDisplayVersion>
<ApplicationVersion>274</ApplicationVersion>
<AndroidUseAapt2>True</AndroidUseAapt2>
<AndroidCreatePackagePerAbi>False</AndroidCreatePackagePerAbi>
<AndroidPackageFormat>apk</AndroidPackageFormat>
@ -62,8 +58,6 @@
<ApplicationId>com.gehgassi.local</ApplicationId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-android|AnyCPU'">
<ApplicationDisplayVersion>1.274</ApplicationDisplayVersion>
<ApplicationVersion>274</ApplicationVersion>
<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
<RunAOTCompilation>True</RunAOTCompilation>
<PublishTrimmed>True</PublishTrimmed>
@ -73,8 +67,6 @@
<ApplicationId>com.gehgassi.gehgassi</ApplicationId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Staging|net8.0-android|AnyCPU'">
<ApplicationDisplayVersion>1.274</ApplicationDisplayVersion>
<ApplicationVersion>274</ApplicationVersion>
<EmbedAssembliesIntoApk>True</EmbedAssembliesIntoApk>
<RunAOTCompilation>True</RunAOTCompilation>
<PublishTrimmed>True</PublishTrimmed>
@ -84,8 +76,6 @@
<ApplicationId>com.gehgassi.local</ApplicationId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net8.0-ios|AnyCPU'">
<ApplicationDisplayVersion>1.274</ApplicationDisplayVersion>
<ApplicationVersion>274</ApplicationVersion>
<ApplicationId>com.gehgassi.local</ApplicationId>
<MtouchDebug>True</MtouchDebug>
<MtouchLink>None</MtouchLink>
@ -94,16 +84,12 @@
<ForceSimulatorX64ArchitectureInIDE>true</ForceSimulatorX64ArchitectureInIDE>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='DebugStaging|net8.0-ios|AnyCPU'">
<ApplicationDisplayVersion>1.274</ApplicationDisplayVersion>
<ApplicationVersion>274</ApplicationVersion>
<ApplicationId>com.gehgassi.local</ApplicationId>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Release|net8.0-ios|AnyCPU'">
<UseInterpreter>True</UseInterpreter>
<ApplicationDisplayVersion>1.274</ApplicationDisplayVersion>
<ApplicationVersion>274</ApplicationVersion>
<CodesignEntitlements>Platforms\iOS\Entitlements.production.plist</CodesignEntitlements>
<CodesignKey></CodesignKey>
<CodesignProvision></CodesignProvision>
@ -113,8 +99,6 @@
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Staging|net8.0-ios|AnyCPU'">
<ApplicationDisplayVersion>1.274</ApplicationDisplayVersion>
<ApplicationVersion>274</ApplicationVersion>
<ApplicationId>com.gehgassi.local</ApplicationId>
</PropertyGroup>
@ -140,8 +124,13 @@
<MauiImage Include="Resources\Images\*" />
<!-- Custom Fonts -->
<MauiFont Include="Resources\Fonts\*" />
<!-- <MauiFont Include="Resources\Fonts\*" /> -->
<!-- Durch akuellen Bug müssen alle Fonts einzeln referenziert werden: https://learn.microsoft.com/en-us/answers/questions/1684493/custom-fonts-not-working-when-uploading-maui-andro -->
<MauiFont Include="Resources\Fonts\icomoon.ttf" Alias="IconMoon" />
<MauiFont Include="Resources\Fonts\Inter-Medium.ttf" Alias="InterMedium" />
<MauiFont Include="Resources\Fonts\Inter-Regular.ttf" Alias="InterRegular" />
<MauiFont Include="Resources\Fonts\Inter-SemiBold.ttf" Alias="InterSemiBold" />
<MauiFont Include="Resources\Fonts\MaterialIcons-Regular.ttf" Alias="MaterialIconsRegular" />
<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
<!-- https://github.com/dotnet/maui/issues/14044 -->
<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
@ -158,10 +147,6 @@
<None Remove="Platforms\Android\google-services_Live.json" />
<None Remove="Platforms\Android\Resources\drawable\appiconpush2.svg" />
<None Remove="Platforms\Android\Resources\xml\auto_backup_rules.xml" />
<None Remove="Resources\Fonts\icomoon.ttf" />
<None Remove="Resources\Fonts\Inter-Medium.ttf" />
<None Remove="Resources\Fonts\Inter-Regular.ttf" />
<None Remove="Resources\Fonts\Inter-SemiBold.ttf" />
<None Remove="Resources\Images\aggression_level_high.svg" />
<None Remove="Resources\Images\aggression_level_low.svg" />
<None Remove="Resources\Images\aggression_level_medium.svg" />