521 lines
29 KiB
XML
521 lines
29 KiB
XML
<?xml version="1.0" encoding="utf-8" ?>
|
|
<controls:BaseContentPage
|
|
x:Class="gehGassiApp.Views.ProfileView"
|
|
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
|
xmlns:behaviors="clr-namespace:gehGassiApp.Behaviors"
|
|
xmlns:controls="clr-namespace:gehGassiApp.Controls"
|
|
xmlns:i="clr-namespace:gehGassiApp.Constants"
|
|
xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls"
|
|
xmlns:res="clr-namespace:gehGassiApp.Resources"
|
|
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
|
|
ControlTemplate="{StaticResource MenuPageTemplate}">
|
|
|
|
<controls:BaseContentPage.TitleView>
|
|
<controls:ShellTitleViewNoLogoControl
|
|
Initials="{Binding CurrentAppUser.Initials}"
|
|
Photo="{Binding CurrentAppUser.Photo}"
|
|
ViewModel="{Binding .}" />
|
|
</controls:BaseContentPage.TitleView>
|
|
|
|
<ContentPage.Content>
|
|
<Grid>
|
|
<ScrollView
|
|
x:Name="rootScrollView"
|
|
Padding="20"
|
|
HorizontalOptions="Fill"
|
|
IsVisible="{Binding IsNotLoading}">
|
|
<VerticalStackLayout
|
|
x:Name="rootVerticalStackLayout"
|
|
SizeChanged="rootVerticalStackLayout_SizeChanged"
|
|
Spacing="0">
|
|
<Grid
|
|
Margin="{StaticResource MarginBig}"
|
|
ColumnDefinitions="*,150,*"
|
|
VerticalOptions="Start">
|
|
|
|
<Border
|
|
Grid.Row="0"
|
|
Grid.Column="0"
|
|
Margin="10,10,0,0"
|
|
Padding="2"
|
|
BackgroundColor="{StaticResource Primary_DarkBlue}"
|
|
HorizontalOptions="Start"
|
|
IsVisible="{Binding AppUser.Verified}"
|
|
Stroke="{StaticResource Primary_White}"
|
|
StrokeShape="RoundRectangle 50"
|
|
VerticalOptions="Start">
|
|
<Image HeightRequest="32">
|
|
<Image.Source>
|
|
<FontImageSource
|
|
FontFamily="IconMoon"
|
|
Glyph="{x:Static i:IconsMoon.Icon_Check}"
|
|
Color="{StaticResource Primary_White}" />
|
|
</Image.Source>
|
|
</Image>
|
|
</Border>
|
|
|
|
<controls:RoundImageControl
|
|
Grid.Column="1"
|
|
Margin="0,15,0,0"
|
|
BorderBackgroundColor="{StaticResource Primary_White}"
|
|
BorderHeight="120"
|
|
BorderOpacity="1"
|
|
BorderStroke="{StaticResource Primary_White}"
|
|
BorderStrokeShape="RoundRectangle 12"
|
|
BorderStrokeThickness="2"
|
|
BorderWidth="120"
|
|
CornerRadius="12"
|
|
HorizontalOptions="Center"
|
|
ImageHeight="120"
|
|
ImageOpacity="1"
|
|
ImageSource="{Binding AppUser.Photo, Converter={StaticResource MissingPhotoConverter}, ConverterParameter='Human'}"
|
|
ImageWidth="120"
|
|
VerticalOptions="Start" />
|
|
|
|
<Button
|
|
Grid.Column="1"
|
|
Padding="0"
|
|
Background="{StaticResource Primary_DarkBlue_Brush}"
|
|
BorderColor="{StaticResource Primary_DarkBlue}"
|
|
BorderWidth="2"
|
|
Command="{Binding ChoosePhotoOptionCommand}"
|
|
ContentLayout="Left, 0"
|
|
CornerRadius="20"
|
|
HeightRequest="40"
|
|
HorizontalOptions="End"
|
|
Text=""
|
|
VerticalOptions="Start"
|
|
WidthRequest="40">
|
|
<Button.ImageSource>
|
|
<FontImageSource
|
|
FontFamily="MaterialIconsRegular"
|
|
Glyph="photo_camera"
|
|
Size="20"
|
|
Color="{StaticResource Primary_White}" />
|
|
</Button.ImageSource>
|
|
</Button>
|
|
<Button
|
|
Grid.Column="1"
|
|
Padding="0"
|
|
Background="{StaticResource Primary_DarkBlue}"
|
|
BorderColor="{StaticResource Primary_DarkBlue}"
|
|
BorderWidth="2"
|
|
Command="{Binding RotateRightCommand}"
|
|
ContentLayout="Left, 0"
|
|
CornerRadius="20"
|
|
HeightRequest="40"
|
|
HorizontalOptions="Start"
|
|
IsVisible="{Binding IsNewPhoto}"
|
|
Text=""
|
|
VerticalOptions="Start"
|
|
WidthRequest="40">
|
|
<Button.ImageSource>
|
|
<FontImageSource
|
|
FontFamily="IconMoon"
|
|
Glyph="{x:Static i:IconsMoon.Icon_Rotate_CW}"
|
|
Size="20"
|
|
Color="{StaticResource Primary_White}" />
|
|
</Button.ImageSource>
|
|
</Button>
|
|
|
|
<Button
|
|
Grid.Column="1"
|
|
Margin="0,15,0,0"
|
|
Padding="0"
|
|
Background="{StaticResource Primary_DarkBlue}"
|
|
BorderColor="{StaticResource Primary_DarkBlue}"
|
|
BorderWidth="2"
|
|
Command="{Binding FlipVerticalCommand}"
|
|
ContentLayout="Left, 0"
|
|
CornerRadius="20"
|
|
HeightRequest="40"
|
|
HorizontalOptions="Start"
|
|
IsVisible="{Binding IsNewPhoto}"
|
|
Text=""
|
|
VerticalOptions="Center"
|
|
WidthRequest="40">
|
|
<Button.ImageSource>
|
|
<FontImageSource
|
|
FontFamily="IconMoon"
|
|
Glyph="{x:Static i:IconsMoon.Icon_Reflect}"
|
|
Size="20"
|
|
Color="{StaticResource Primary_White}" />
|
|
</Button.ImageSource>
|
|
</Button>
|
|
|
|
<Button
|
|
Grid.Column="1"
|
|
Margin="0,0,0,-15"
|
|
Padding="0"
|
|
Background="{StaticResource Primary_DarkBlue}"
|
|
BorderColor="{StaticResource Primary_DarkBlue}"
|
|
BorderWidth="2"
|
|
Command="{Binding RotateLeftCommand}"
|
|
ContentLayout="Left, 0"
|
|
CornerRadius="20"
|
|
HeightRequest="40"
|
|
HorizontalOptions="Start"
|
|
IsVisible="{Binding IsNewPhoto}"
|
|
Text=""
|
|
VerticalOptions="End"
|
|
WidthRequest="40">
|
|
<Button.ImageSource>
|
|
<FontImageSource
|
|
FontFamily="IconMoon"
|
|
Glyph="{x:Static i:IconsMoon.Icon_Rotate_CCW}"
|
|
Size="18"
|
|
Color="{StaticResource Primary_White}" />
|
|
</Button.ImageSource>
|
|
</Button>
|
|
|
|
</Grid>
|
|
|
|
<VerticalStackLayout
|
|
HorizontalOptions="Fill"
|
|
Spacing="0"
|
|
VerticalOptions="Start">
|
|
|
|
<Label
|
|
Margin="{StaticResource MarginLabel}"
|
|
Style="{StaticResource Inter_Blue}"
|
|
Text="{x:Static res:Text.Profile_Name_Question}" />
|
|
<Border Margin="{StaticResource MarginSmall}" Style="{StaticResource EntryBorder}">
|
|
<Entry
|
|
x:Name="firstName"
|
|
Keyboard="Text"
|
|
Placeholder="{x:Static res:Text.Common_FirstName}"
|
|
Text="{Binding AppUser.FirstName, Converter={StaticResource NullToEmptyStringConverter}}">
|
|
<Entry.Behaviors>
|
|
<toolkit:TextValidationBehavior
|
|
x:Name="firstNameValidation"
|
|
Flags="ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaximumLength="150"
|
|
MinimumLength="1" />
|
|
<behaviors:SelectAllFocusedEntryBehavior />
|
|
</Entry.Behaviors>
|
|
</Entry>
|
|
</Border>
|
|
<Border Margin="{StaticResource MarginBig}" Style="{StaticResource EntryBorder}">
|
|
<Entry
|
|
x:Name="lastName"
|
|
Keyboard="Text"
|
|
Placeholder="{x:Static res:Text.Common_LastName}"
|
|
Text="{Binding AppUser.LastName, Converter={StaticResource NullToEmptyStringConverter}}">
|
|
<Entry.Behaviors>
|
|
<toolkit:TextValidationBehavior
|
|
x:Name="lastNameValidation"
|
|
Flags="ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaximumLength="150"
|
|
MinimumLength="1" />
|
|
<behaviors:SelectAllFocusedEntryBehavior />
|
|
</Entry.Behaviors>
|
|
</Entry>
|
|
</Border>
|
|
|
|
<Label
|
|
Margin="{StaticResource MarginLabel}"
|
|
Style="{StaticResource Inter_Blue}"
|
|
Text="{x:Static res:Text.Profile_Age_Question}" />
|
|
|
|
<Border Margin="{StaticResource MarginBig}" Style="{StaticResource EntryBorder}">
|
|
<Grid>
|
|
<Entry
|
|
Keyboard="Default"
|
|
Placeholder="{Binding BirthdateFormat}"
|
|
Text="{Binding BirthDay}">
|
|
<Entry.Behaviors>
|
|
<toolkit:TextValidationBehavior
|
|
Flags="ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaximumLength="10"
|
|
MinimumLength="0" />
|
|
<behaviors:DateValidationBehavior
|
|
x:Name="birthdayValidation"
|
|
Flags="ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaxDate="{Binding MaxDate}"
|
|
MinDate="01/01/1900" />
|
|
<behaviors:SelectAllFocusedEntryBehavior />
|
|
</Entry.Behaviors>
|
|
</Entry>
|
|
<Image HeightRequest="25" HorizontalOptions="End">
|
|
<Image.Source>
|
|
<FontImageSource
|
|
FontFamily="IconMoon"
|
|
Glyph="{x:Static i:IconsMoon.Icon_Calendar}"
|
|
Size="25"
|
|
Color="{StaticResource Primary_DarkBlue}" />
|
|
</Image.Source>
|
|
<Image.GestureRecognizers>
|
|
<TapGestureRecognizer Command="{Binding ShowBirthdayCalendarCommand}" CommandParameter="{x:Reference birthDatePicker}" />
|
|
</Image.GestureRecognizers>
|
|
</Image>
|
|
<DatePicker
|
|
x:Name="birthDatePicker"
|
|
Date="{Binding BirthDate}"
|
|
HeightRequest="0"
|
|
MaximumDate="{Binding MaxDate}"
|
|
MinimumDate="01/01/1900"
|
|
WidthRequest="0" />
|
|
</Grid>
|
|
</Border>
|
|
|
|
<Label
|
|
Margin="{StaticResource MarginLabel}"
|
|
Style="{StaticResource Inter_Blue}"
|
|
Text="{x:Static res:Text.Profile_Sex_Question}" />
|
|
|
|
<Border Margin="{StaticResource MarginBig}" Style="{StaticResource EntryBorder}">
|
|
<controls:PickerWithChevron
|
|
x:Name="sexPicker"
|
|
Title="{x:Static res:Text.Profile_Sex_Question}"
|
|
ios:Picker.UpdateMode="WhenFinished"
|
|
HorizontalOptions="Fill"
|
|
ItemDisplayBinding="{Binding Text}"
|
|
ItemsSource="{Binding SexItems}"
|
|
SelectedItem="{Binding SelectedSex}" />
|
|
</Border>
|
|
|
|
<Label
|
|
Margin="{StaticResource MarginLabel}"
|
|
Style="{StaticResource Inter_Blue}"
|
|
Text="{x:Static res:Text.Profile_Address_Question}" />
|
|
|
|
<Border Margin="{StaticResource MarginSmall}" Style="{StaticResource EntryBorder}">
|
|
<Entry
|
|
x:Name="addressLine1"
|
|
Keyboard="Text"
|
|
Placeholder="{x:Static res:Text.Common_Address_Line1}"
|
|
Text="{Binding AppUser.Address.AddressLine1, Converter={StaticResource NullToEmptyStringConverter}}">
|
|
<Entry.Behaviors>
|
|
<toolkit:TextValidationBehavior
|
|
x:Name="addressLine1Validation"
|
|
Flags="ValidateOnAttaching,ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaximumLength="100"
|
|
MinimumLength="1" />
|
|
<behaviors:SelectAllFocusedEntryBehavior />
|
|
</Entry.Behaviors>
|
|
</Entry>
|
|
</Border>
|
|
<Border Margin="{StaticResource MarginSmall}" Style="{StaticResource EntryBorder}">
|
|
<Entry
|
|
x:Name="addressLine2"
|
|
Keyboard="Text"
|
|
Placeholder="{x:Static res:Text.Common_Address_Line2}"
|
|
Text="{Binding AppUser.Address.AddressLine2, Converter={StaticResource NullToEmptyStringConverter}}">
|
|
<Entry.Behaviors>
|
|
<toolkit:TextValidationBehavior
|
|
x:Name="addressLine2Validation"
|
|
Flags="ValidateOnAttaching,ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaximumLength="100"
|
|
MinimumLength="0" />
|
|
<behaviors:SelectAllFocusedEntryBehavior />
|
|
</Entry.Behaviors>
|
|
</Entry>
|
|
</Border>
|
|
<Border Margin="{StaticResource MarginSmall}" Style="{StaticResource EntryBorder}">
|
|
<Entry
|
|
x:Name="zip"
|
|
Keyboard="Text"
|
|
Placeholder="{x:Static res:Text.Common_Address_Zip}"
|
|
Text="{Binding AppUser.Address.Zip, Converter={StaticResource NullToEmptyStringConverter}}">
|
|
<Entry.Behaviors>
|
|
<toolkit:TextValidationBehavior
|
|
x:Name="zipValidation"
|
|
Flags="ValidateOnAttaching,ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaximumLength="20"
|
|
MinimumLength="1" />
|
|
<behaviors:SelectAllFocusedEntryBehavior />
|
|
</Entry.Behaviors>
|
|
</Entry>
|
|
</Border>
|
|
<Border Margin="{StaticResource MarginSmall}" Style="{StaticResource EntryBorder}">
|
|
<Entry
|
|
x:Name="city"
|
|
Keyboard="Text"
|
|
Placeholder="{x:Static res:Text.Common_Address_City}"
|
|
Text="{Binding AppUser.Address.City, Converter={StaticResource NullToEmptyStringConverter}}">
|
|
<Entry.Behaviors>
|
|
<toolkit:TextValidationBehavior
|
|
x:Name="cityValidation"
|
|
Flags="ValidateOnAttaching,ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaximumLength="100"
|
|
MinimumLength="1" />
|
|
<behaviors:SelectAllFocusedEntryBehavior />
|
|
</Entry.Behaviors>
|
|
</Entry>
|
|
</Border>
|
|
<Border Margin="{StaticResource MarginSmall}" Style="{StaticResource EntryBorder}">
|
|
<controls:PickerWithChevron
|
|
Title="{x:Static res:Text.Common_SelectCountry}"
|
|
ios:Picker.UpdateMode="WhenFinished"
|
|
HorizontalOptions="Fill"
|
|
ItemDisplayBinding="{Binding Name}"
|
|
ItemsSource="{Binding Countries}"
|
|
SelectedItem="{Binding SelectedCountry}" />
|
|
</Border>
|
|
<Border Margin="{StaticResource MarginBig}" Style="{StaticResource EntryBorder}">
|
|
<controls:PickerWithChevron
|
|
Title="{x:Static res:Text.Common_SelectState}"
|
|
ios:Picker.UpdateMode="WhenFinished"
|
|
HorizontalOptions="Fill"
|
|
ItemDisplayBinding="{Binding Name}"
|
|
ItemsSource="{Binding States}"
|
|
SelectedItem="{Binding SelectedState}" />
|
|
</Border>
|
|
|
|
<Label
|
|
Margin="{StaticResource MarginLabel}"
|
|
Style="{StaticResource Inter_Blue}"
|
|
Text="{x:Static res:Text.Profile_Contact_Question}" />
|
|
|
|
<Border Margin="{StaticResource MarginSmall}" Style="{StaticResource EntryBorder}">
|
|
<Entry
|
|
x:Name="mobile"
|
|
Keyboard="Telephone"
|
|
Placeholder="{x:Static res:Text.Common_Contact_Mobile}"
|
|
Text="{Binding AppUser.Contact.Mobile, Converter={StaticResource NullToEmptyStringConverter}}">
|
|
<Entry.Behaviors>
|
|
<toolkit:TextValidationBehavior
|
|
x:Name="mobileValidation"
|
|
Flags="ValidateOnAttaching,ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaximumLength="100"
|
|
MinimumLength="0" />
|
|
<behaviors:SelectAllFocusedEntryBehavior />
|
|
</Entry.Behaviors>
|
|
</Entry>
|
|
</Border>
|
|
|
|
<Border Margin="{StaticResource MarginBig}" Style="{StaticResource EntryBorder}">
|
|
<Entry
|
|
x:Name="phone"
|
|
Keyboard="Telephone"
|
|
Placeholder="{x:Static res:Text.Common_Contact_Phone}"
|
|
Text="{Binding AppUser.Contact.Phone, Converter={StaticResource NullToEmptyStringConverter}}">
|
|
<Entry.Behaviors>
|
|
<toolkit:TextValidationBehavior
|
|
x:Name="phoneValidation"
|
|
Flags="ValidateOnAttaching,ValidateOnValueChanged"
|
|
InvalidStyle="{StaticResource InvalidEntryStyle}"
|
|
MaximumLength="100"
|
|
MinimumLength="0" />
|
|
<behaviors:SelectAllFocusedEntryBehavior />
|
|
</Entry.Behaviors>
|
|
</Entry>
|
|
</Border>
|
|
|
|
<Label
|
|
Margin="{StaticResource MarginLabel}"
|
|
Style="{StaticResource Inter_Blue}"
|
|
Text="{x:Static res:Text.Profile_Nationality_Question}" />
|
|
|
|
<Border Margin="{StaticResource MarginBig}" Style="{StaticResource EntryBorder}">
|
|
<controls:PickerWithChevron
|
|
Title="{x:Static res:Text.Common_SelectCountry}"
|
|
ios:Picker.UpdateMode="WhenFinished"
|
|
HorizontalOptions="Fill"
|
|
ItemDisplayBinding="{Binding Name}"
|
|
ItemsSource="{Binding Nationalitites}"
|
|
SelectedItem="{Binding SelectedNationality}" />
|
|
</Border>
|
|
|
|
<Label
|
|
Margin="{StaticResource MarginLabel}"
|
|
Style="{StaticResource Inter_Blue}"
|
|
Text="{x:Static res:Text.Profile_MainResidence_Question}" />
|
|
|
|
<Border Margin="{StaticResource MarginBig}" Style="{StaticResource EntryBorder}">
|
|
<controls:PickerWithChevron
|
|
Title="{x:Static res:Text.Common_SelectCountry}"
|
|
ios:Picker.UpdateMode="WhenFinished"
|
|
HorizontalOptions="Fill"
|
|
ItemDisplayBinding="{Binding Name}"
|
|
ItemsSource="{Binding MainResidences}"
|
|
SelectedItem="{Binding SelectedMainResidence}" />
|
|
</Border>
|
|
|
|
<!-- <Grid Margin="{StaticResource MarginVerySmall}" ColumnDefinitions="*,*">
|
|
<Label
|
|
Grid.Column="0"
|
|
LineBreakMode="TailTruncation"
|
|
Style="{StaticResource BodySMedium_Blue}"
|
|
Text="{x:Static res:Text.Profile_AutoPayout}"
|
|
VerticalOptions="Center" />
|
|
<Switch
|
|
Grid.Column="1"
|
|
HorizontalOptions="End"
|
|
IsToggled="{Binding AppUser.AutoPayout}"
|
|
VerticalOptions="Center">
|
|
<Switch.IsEnabled>
|
|
<MultiBinding Converter="{StaticResource AllTrueMultiConverter}">
|
|
<Binding Converter="{StaticResource IsNotNullOrEmptyToBooleanConverter}" Path="AppUser.PaymentId" />
|
|
<Binding Converter="{StaticResource IsNotNullOrEmptyToBooleanConverter}" Path="AppUser.BankId" />
|
|
<Binding Path="AppUser.KycPassed" />
|
|
</MultiBinding>
|
|
</Switch.IsEnabled>
|
|
</Switch>
|
|
</Grid>
|
|
|
|
<Label
|
|
Margin="{StaticResource MarginBig}"
|
|
Style="{StaticResource BodyCaption_GreyDark}"
|
|
Text="{x:Static res:Text.Profile_AutoPayout_Desc}" /> -->
|
|
|
|
<ActivityIndicator
|
|
HorizontalOptions="Center"
|
|
IsRunning="{Binding IsBusy}"
|
|
IsVisible="{Binding IsBusy}"
|
|
Scale="1"
|
|
VerticalOptions="Center" />
|
|
|
|
</VerticalStackLayout>
|
|
|
|
<ActivityIndicator
|
|
HorizontalOptions="Center"
|
|
IsRunning="{Binding IsSaving}"
|
|
IsVisible="{Binding IsSaving}"
|
|
Scale="1"
|
|
VerticalOptions="Center" />
|
|
|
|
<Button
|
|
x:Name="btnSave"
|
|
Command="{Binding SaveCommand}"
|
|
Text="{Static res:Text.Button_Done}">
|
|
<Button.IsEnabled>
|
|
<MultiBinding Converter="{StaticResource AllTrueMultiConverter}">
|
|
<Binding Path="IsValid" Source="{x:Reference firstNameValidation}" />
|
|
<Binding Path="IsValid" Source="{x:Reference lastNameValidation}" />
|
|
<Binding Path="IsValid" Source="{x:Reference birthdayValidation}" />
|
|
<Binding Path="IsValid" Source="{x:Reference addressLine1Validation}" />
|
|
<Binding Path="IsValid" Source="{x:Reference addressLine2Validation}" />
|
|
<Binding Path="IsValid" Source="{x:Reference zipValidation}" />
|
|
<Binding Path="IsValid" Source="{x:Reference cityValidation}" />
|
|
<Binding Path="IsValid" Source="{x:Reference mobileValidation}" />
|
|
<Binding Path="IsValid" Source="{x:Reference phoneValidation}" />
|
|
<Binding Path="AddressSelectionValid" />
|
|
<Binding Path="IsNotBusy" />
|
|
</MultiBinding>
|
|
</Button.IsEnabled>
|
|
</Button>
|
|
|
|
</VerticalStackLayout>
|
|
</ScrollView>
|
|
<VerticalStackLayout IsVisible="{Binding IsLoading}" VerticalOptions="Center">
|
|
<ActivityIndicator
|
|
HorizontalOptions="Center"
|
|
IsRunning="{Binding IsLoading}"
|
|
IsVisible="{Binding IsLoading}"
|
|
Scale="2"
|
|
VerticalOptions="Center" />
|
|
</VerticalStackLayout>
|
|
</Grid>
|
|
</ContentPage.Content>
|
|
</controls:BaseContentPage> |