postit: preserve manual rdv address with map suggestion
This commit is contained in:
parent
4010defde7
commit
1c4a079d60
3 changed files with 111 additions and 14 deletions
|
|
@ -135,6 +135,50 @@ public class BillingCommandPageViewModelTests
|
||||||
Assert.Contains("Position sélectionnée", vm.StatusMessage, StringComparison.OrdinalIgnoreCase);
|
Assert.Contains("Position sélectionnée", vm.StatusMessage, StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ApplyResolvedAddress_populates_empty_address_directly()
|
||||||
|
{
|
||||||
|
var api = new RecordingApi();
|
||||||
|
var client = new BillingApiClient(api, "https://business.example/api/v1/");
|
||||||
|
var vm =
|
||||||
|
new CommandFormSummary { Id = 12, ActionName = "Rdv", Title = "Rendez-vous" }
|
||||||
|
.CreateCommandPageViewModel(
|
||||||
|
new ActivityInfo { Code = "dev", Name = "Développement" },
|
||||||
|
new ActivityUserDisplayItem { PerformerId = "perf-1", UserName = "Alice" },
|
||||||
|
client) as RdvViewModel;
|
||||||
|
|
||||||
|
vm!.Address = string.Empty;
|
||||||
|
vm.ApplyResolvedAddress("10 rue de Rivoli, 75001 Paris");
|
||||||
|
|
||||||
|
Assert.Equal("10 rue de Rivoli, 75001 Paris", vm.Address);
|
||||||
|
Assert.False(vm.HasSuggestedAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ApplyResolvedAddress_preserves_manual_address_and_exposes_suggestion()
|
||||||
|
{
|
||||||
|
var api = new RecordingApi();
|
||||||
|
var client = new BillingApiClient(api, "https://business.example/api/v1/");
|
||||||
|
var vm =
|
||||||
|
new CommandFormSummary { Id = 12, ActionName = "Rdv", Title = "Rendez-vous" }
|
||||||
|
.CreateCommandPageViewModel(
|
||||||
|
new ActivityInfo { Code = "dev", Name = "Développement" },
|
||||||
|
new ActivityUserDisplayItem { PerformerId = "perf-1", UserName = "Alice" },
|
||||||
|
client) as RdvViewModel;
|
||||||
|
|
||||||
|
vm!.Address = "Saisie manuelle";
|
||||||
|
vm.ApplyResolvedAddress("10 rue de Rivoli, 75001 Paris");
|
||||||
|
|
||||||
|
Assert.Equal("Saisie manuelle", vm.Address);
|
||||||
|
Assert.True(vm.HasSuggestedAddress);
|
||||||
|
Assert.Equal("10 rue de Rivoli, 75001 Paris", vm.SuggestedAddress);
|
||||||
|
|
||||||
|
vm.ApplySuggestedAddressCommand.Execute(null);
|
||||||
|
|
||||||
|
Assert.Equal("10 rue de Rivoli, 75001 Paris", vm.Address);
|
||||||
|
Assert.False(vm.HasSuggestedAddress);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task InitializeAsync_loads_prestations_for_brush_and_submit_posts_selected_prestation()
|
public async Task InitializeAsync_loads_prestations_for_brush_and_submit_posts_selected_prestation()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,9 @@ public partial class RdvViewModel : BillingCommandPageViewModel
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public partial string Address { get; set; } = string.Empty;
|
public partial string Address { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
[ObservableProperty]
|
||||||
|
public partial string SuggestedAddress { get; set; } = string.Empty;
|
||||||
|
|
||||||
[ObservableProperty]
|
[ObservableProperty]
|
||||||
public partial double? Latitude { get; set; }
|
public partial double? Latitude { get; set; }
|
||||||
|
|
||||||
|
|
@ -33,6 +36,8 @@ public partial class RdvViewModel : BillingCommandPageViewModel
|
||||||
EventDate = DateTime.Now.AddDays(1);
|
EventDate = DateTime.Now.AddDays(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool HasSuggestedAddress => !string.IsNullOrWhiteSpace(SuggestedAddress);
|
||||||
|
|
||||||
protected override void ApplyExistingQuery(BillingQueryDetailsDto existingQuery)
|
protected override void ApplyExistingQuery(BillingQueryDetailsDto existingQuery)
|
||||||
{
|
{
|
||||||
ExistingQueryId = existingQuery.Id;
|
ExistingQueryId = existingQuery.Id;
|
||||||
|
|
@ -50,6 +55,7 @@ public partial class RdvViewModel : BillingCommandPageViewModel
|
||||||
if (existingQuery.Location is not null)
|
if (existingQuery.Location is not null)
|
||||||
{
|
{
|
||||||
Address = existingQuery.Location.Address ?? string.Empty;
|
Address = existingQuery.Location.Address ?? string.Empty;
|
||||||
|
SuggestedAddress = string.Empty;
|
||||||
Latitude = existingQuery.Location.Latitude;
|
Latitude = existingQuery.Location.Latitude;
|
||||||
Longitude = existingQuery.Location.Longitude;
|
Longitude = existingQuery.Location.Longitude;
|
||||||
}
|
}
|
||||||
|
|
@ -132,8 +138,40 @@ public partial class RdvViewModel : BillingCommandPageViewModel
|
||||||
if (string.IsNullOrWhiteSpace(address))
|
if (string.IsNullOrWhiteSpace(address))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Address = address.Trim();
|
var trimmedAddress = address.Trim();
|
||||||
|
if (string.IsNullOrWhiteSpace(Address))
|
||||||
|
{
|
||||||
|
Address = trimmedAddress;
|
||||||
|
SuggestedAddress = string.Empty;
|
||||||
this.SetInfoStatus("Adresse mise à jour depuis la carte.");
|
this.SetInfoStatus("Adresse mise à jour depuis la carte.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string.Equals(Address.Trim(), trimmedAddress, StringComparison.Ordinal))
|
||||||
|
{
|
||||||
|
SuggestedAddress = string.Empty;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SuggestedAddress = trimmedAddress;
|
||||||
|
this.SetInfoStatus("Adresse suggérée depuis la carte. Appliquez-la si besoin.");
|
||||||
|
}
|
||||||
|
|
||||||
|
[RelayCommand(CanExecute = nameof(HasSuggestedAddress))]
|
||||||
|
private void ApplySuggestedAddress()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(SuggestedAddress))
|
||||||
|
return;
|
||||||
|
|
||||||
|
Address = SuggestedAddress.Trim();
|
||||||
|
SuggestedAddress = string.Empty;
|
||||||
|
this.SetInfoStatus("Adresse suggérée appliquée.");
|
||||||
|
}
|
||||||
|
|
||||||
|
partial void OnSuggestedAddressChanged(string value)
|
||||||
|
{
|
||||||
|
OnPropertyChanged(nameof(HasSuggestedAddress));
|
||||||
|
ApplySuggestedAddressCommand.NotifyCanExecuteChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
x:DataType="cvm:RdvViewModel"
|
x:DataType="cvm:RdvViewModel"
|
||||||
Header="Commande billing">
|
Header="Commande billing">
|
||||||
<ScrollViewer>
|
<ScrollViewer>
|
||||||
<Grid RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto" ColumnDefinitions="Auto,*" Margin="12">
|
<Grid RowDefinitions="Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto,Auto" ColumnDefinitions="Auto,*" Margin="12">
|
||||||
<TextBlock Grid.Row="0" Grid.ColumnSpan="2"
|
<TextBlock Grid.Row="0" Grid.ColumnSpan="2"
|
||||||
Text="{Binding Title}"
|
Text="{Binding Title}"
|
||||||
FontSize="18"
|
FontSize="18"
|
||||||
|
|
@ -41,6 +41,21 @@
|
||||||
<TextBox Grid.Row="6" Grid.Column="1" Text="{Binding Address, Mode=TwoWay}" Margin="0,0,0,8" />
|
<TextBox Grid.Row="6" Grid.Column="1" Text="{Binding Address, Mode=TwoWay}" Margin="0,0,0,8" />
|
||||||
|
|
||||||
<Grid Grid.Row="7"
|
<Grid Grid.Row="7"
|
||||||
|
Grid.ColumnSpan="2"
|
||||||
|
ColumnDefinitions="*,12,Auto"
|
||||||
|
Margin="0,0,0,8"
|
||||||
|
IsVisible="{Binding HasSuggestedAddress}">
|
||||||
|
<TextBlock Grid.Column="0"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
Text="{Binding SuggestedAddress, StringFormat='Adresse suggérée: {0}'}"
|
||||||
|
TextWrapping="Wrap"
|
||||||
|
Opacity="0.8" />
|
||||||
|
<Button Grid.Column="2"
|
||||||
|
Content="Utiliser"
|
||||||
|
Command="{Binding ApplySuggestedAddressCommand}" />
|
||||||
|
</Grid>
|
||||||
|
|
||||||
|
<Grid Grid.Row="8"
|
||||||
Grid.ColumnSpan="2"
|
Grid.ColumnSpan="2"
|
||||||
ColumnDefinitions="Auto,12,Auto"
|
ColumnDefinitions="Auto,12,Auto"
|
||||||
Margin="0,0,0,8">
|
Margin="0,0,0,8">
|
||||||
|
|
@ -55,37 +70,37 @@
|
||||||
IsEnabled="{Binding CanUseCurrentLocation}" />
|
IsEnabled="{Binding CanUseCurrentLocation}" />
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
<TextBlock Grid.Row="8" Text="Latitude" VerticalAlignment="Center" Margin="0,0,12,8" />
|
<TextBlock Grid.Row="9" Text="Latitude" VerticalAlignment="Center" Margin="0,0,12,8" />
|
||||||
<TextBox Grid.Row="8" Grid.Column="1" Text="{Binding Latitude, Mode=TwoWay}" PlaceholderText="Optionnel" Margin="0,0,0,8" />
|
<TextBox Grid.Row="9" Grid.Column="1" Text="{Binding Latitude, Mode=TwoWay}" PlaceholderText="Optionnel" Margin="0,0,0,8" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="9" Text="Longitude" VerticalAlignment="Center" Margin="0,0,12,8" />
|
<TextBlock Grid.Row="10" Text="Longitude" VerticalAlignment="Center" Margin="0,0,12,8" />
|
||||||
<TextBox Grid.Row="9" Grid.Column="1" Text="{Binding Longitude, Mode=TwoWay}" PlaceholderText="Optionnel" Margin="0,0,0,8" />
|
<TextBox Grid.Row="10" Grid.Column="1" Text="{Binding Longitude, Mode=TwoWay}" PlaceholderText="Optionnel" Margin="0,0,0,8" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="10" Grid.ColumnSpan="2"
|
<TextBlock Grid.Row="11" Grid.ColumnSpan="2"
|
||||||
Text="Carte: cliquez pour positionner le rendez-vous"
|
Text="Carte: cliquez pour positionner le rendez-vous"
|
||||||
Margin="0,0,0,8"
|
Margin="0,0,0,8"
|
||||||
Opacity="0.85" />
|
Opacity="0.85" />
|
||||||
<mapsui:MapControl Grid.Row="11"
|
<mapsui:MapControl Grid.Row="12"
|
||||||
Grid.ColumnSpan="2"
|
Grid.ColumnSpan="2"
|
||||||
x:Name="LocationMap"
|
x:Name="LocationMap"
|
||||||
Height="260"
|
Height="260"
|
||||||
Margin="0,0,0,8" />
|
Margin="0,0,0,8" />
|
||||||
|
|
||||||
<TextBlock Grid.Row="12"
|
<TextBlock Grid.Row="13"
|
||||||
Text="Informations"
|
Text="Informations"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
Margin="0,0,12,8" />
|
Margin="0,0,12,8" />
|
||||||
<TextBox Grid.Row="12"
|
<TextBox Grid.Row="13"
|
||||||
Grid.Column="1"
|
Grid.Column="1"
|
||||||
Text="{Binding AdditionalInfo, Mode=TwoWay}"
|
Text="{Binding AdditionalInfo, Mode=TwoWay}"
|
||||||
Margin="0,0,0,8" />
|
Margin="0,0,0,8" />
|
||||||
|
|
||||||
<CheckBox Grid.Row="13" Grid.ColumnSpan="2"
|
<CheckBox Grid.Row="14" Grid.ColumnSpan="2"
|
||||||
Content="Je consens à la création de cette commande"
|
Content="Je consens à la création de cette commande"
|
||||||
IsChecked="{Binding Consent, Mode=TwoWay}"
|
IsChecked="{Binding Consent, Mode=TwoWay}"
|
||||||
Margin="0,4,0,12" />
|
Margin="0,4,0,12" />
|
||||||
|
|
||||||
<Grid Grid.Row="14" Grid.ColumnSpan="2" ColumnDefinitions="Auto,12,*,Auto">
|
<Grid Grid.Row="15" Grid.ColumnSpan="2" ColumnDefinitions="Auto,12,*,Auto">
|
||||||
<Button Grid.Column="0"
|
<Button Grid.Column="0"
|
||||||
Content="{Binding SubmitLabel}"
|
Content="{Binding SubmitLabel}"
|
||||||
Command="{Binding SubmitCommand}"
|
Command="{Binding SubmitCommand}"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue