From 94dbc055d2204239076100e44a7fcfdc5ba131e3 Mon Sep 17 00:00:00 2001 From: Morten Nielsen Date: Thu, 1 Aug 2024 08:16:15 -0700 Subject: [PATCH] v200.5 (#588) * Set up v.next branch * WPF/MAUI: FeatureForm attachments support (#581) * Added missing trimming attribute * Move code for getting parent to common location * Add null-check * Improve app theming and theme testing * Adds support for the barcode input field (#583) * Adds support for the barcode input field * Added support to override URL clicks in PopupViewer (#584) * Added support to override URL clicks in PopupViewer * Added samples for reference * Refactor PopupViewer and event handling * Refactor hyperlink event handling and cleanup - Corrected the event name from `HyperLinkClicked` to `HyperlinkClicked` in both XAML and code-behind files for consistency and to meet case sensitivity requirements. * Refactor GetPopupViewerParent to generic * Refactor GetParent generic constraint * Broaden type check in Tapped event handler * Refine type checks and adjust imports * Refactor PopupViewer parent traversal logic * Add discard method to featureform that ensures the form is fully reset by re-evaluating expressions All add Finish method for consistency * Improve discards and avoiding cascading evaluations * Add barcode scanner example to maui sample using ZXing * Refetch attachment on discard * Fix null warning * Add error border below text field (#585) Ensures on catalyst that the textfield isn't blocked form clicking when there's an error * BugFix: BasemapGallery fails to load default Basemaps in WPF (#586) * Optimize BasemapGallery initialization Removed redundant initialization of `AvailableBasemaps` in the `BasemapGallery` constructor. Added a null check in `BasemapGallery_Loaded` to initialize `AvailableBasemaps` only if it is null, calling `_controller.LoadFromDefaultPortal()` asynchronously if needed. This change prevents unnecessary initialization and allows for external setting of `AvailableBasemaps` before the control is loaded. * Initialize AvailableBasemaps and improve load check Add initialization flag for BasemapGallery collection * Raise hyperlink event for field links https://github.com/Esri/arcgis-maps-sdk-dotnet-toolkit/issues/576 --------- Co-authored-by: Morten Nielsen Co-authored-by: Prathamesh Narkhede <55591622+prathameshnarkhede@users.noreply.github.com> --- src/Directory.Build.props | 4 +- .../Toolkit.SampleApp.Maui/MainPage.xaml.cs | 8 + .../Platforms/Android/AndroidManifest.xml | 12 +- .../Platforms/iOS/Info.plist | 2 + .../Samples/FeatureFormViewSample.xaml | 10 +- .../Samples/FeatureFormViewSample.xaml.cs | 39 ++- .../Samples/PopupViewerSample.xaml | 2 +- .../Samples/PopupViewerSample.xaml.cs | 13 +- .../Toolkit.SampleApp.Maui.csproj | 1 + .../Forms/FeatureFormViewSample.xaml.cs | 12 +- .../PopupViewer/PopupViewerSample.xaml | 2 +- .../PopupViewer/PopupViewerSample.xaml.cs | 10 + .../Internal/CalciteImageButton.cs | 43 +++ .../BasemapGallery/BasemapGallery.Windows.cs | 7 +- .../FeatureForm/FeatureFormView.Theme.xaml | 202 ++++++++++-- .../Toolkit/Internal/FileSizeConverter.cs | 71 +++++ src/Toolkit/Toolkit/Internal/MimeTypeMap.cs | 118 +++++++ .../Toolkit/LocalizedStrings/Resources.resx | 28 ++ .../AttachmentsFormElementView.Maui.cs | 240 +++++++++++++++ .../AttachmentsFormElementView.Windows.cs | 90 ++++++ .../FeatureForm/AttachmentsFormElementView.cs | 126 ++++++++ .../FeatureForm/FeatureFormView.Maui.cs | 48 ++- .../FeatureForm/FeatureFormView.Windows.cs | 15 + .../Controls/FeatureForm/FeatureFormView.cs | 152 ++++++++- .../FeatureForm/FieldFormElementView.Maui.cs | 9 + .../FeatureForm/FieldFormElementView.cs | 25 +- .../FeatureForm/FieldTemplateSelector.cs | 9 + .../FeatureForm/FormAttachmentView.Maui.cs | 288 ++++++++++++++++++ .../FeatureForm/FormAttachmentView.Windows.cs | 222 ++++++++++++++ .../FeatureForm/FormAttachmentView.cs | 239 +++++++++++++++ .../FeatureForm/TextFormInputView.Maui.cs | 31 +- .../FeatureForm/TextFormInputView.Windows.cs | 17 ++ .../Controls/FeatureForm/TextFormInputView.cs | 64 +++- .../PopupViewer/FieldsPopupElementView.cs | 12 +- .../Controls/PopupViewer/PopupViewer.Maui.cs | 12 + .../PopupViewer/PopupViewer.Windows.cs | 28 ++ .../UI/Controls/PopupViewer/PopupViewer.cs | 47 ++- .../PopupViewer/TextPopupElementView.Maui.cs | 5 +- .../TextPopupElementView.Windows.cs | 5 +- src/version.json | 2 +- 40 files changed, 2169 insertions(+), 101 deletions(-) create mode 100644 src/Toolkit/Toolkit.Maui/Internal/CalciteImageButton.cs create mode 100644 src/Toolkit/Toolkit/Internal/FileSizeConverter.cs create mode 100644 src/Toolkit/Toolkit/Internal/MimeTypeMap.cs create mode 100644 src/Toolkit/Toolkit/UI/Controls/FeatureForm/AttachmentsFormElementView.Maui.cs create mode 100644 src/Toolkit/Toolkit/UI/Controls/FeatureForm/AttachmentsFormElementView.Windows.cs create mode 100644 src/Toolkit/Toolkit/UI/Controls/FeatureForm/AttachmentsFormElementView.cs create mode 100644 src/Toolkit/Toolkit/UI/Controls/FeatureForm/FormAttachmentView.Maui.cs create mode 100644 src/Toolkit/Toolkit/UI/Controls/FeatureForm/FormAttachmentView.Windows.cs create mode 100644 src/Toolkit/Toolkit/UI/Controls/FeatureForm/FormAttachmentView.cs diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 70cd36cbf..9a2d4657c 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,8 +1,8 @@ - 200.4.0 - 200.4.0 + 200.5.0 + 200.5.0 Esri Inc. diff --git a/src/Samples/Toolkit.SampleApp.Maui/MainPage.xaml.cs b/src/Samples/Toolkit.SampleApp.Maui/MainPage.xaml.cs index 83a514067..43de1fed1 100644 --- a/src/Samples/Toolkit.SampleApp.Maui/MainPage.xaml.cs +++ b/src/Samples/Toolkit.SampleApp.Maui/MainPage.xaml.cs @@ -1,5 +1,6 @@ using Esri.ArcGISRuntime; using Esri.ArcGISRuntime.Mapping; +using Microsoft.Maui.ApplicationModel; namespace Toolkit.SampleApp.Maui; @@ -8,6 +9,13 @@ public partial class MainPage : ContentPage public MainPage() { InitializeComponent(); + ToolbarItems.Add(new ToolbarItem("Toggle Theme", null, () => + { + if (App.Current!.RequestedTheme == AppTheme.Dark) + App.Current.UserAppTheme = AppTheme.Light; + else + App.Current.UserAppTheme = AppTheme.Dark; + })); SamplesList.ItemsSource = SampleDatasource.Current.Samples; CheckAPIKey(); } diff --git a/src/Samples/Toolkit.SampleApp.Maui/Platforms/Android/AndroidManifest.xml b/src/Samples/Toolkit.SampleApp.Maui/Platforms/Android/AndroidManifest.xml index e9937ad77..e360d87b0 100644 --- a/src/Samples/Toolkit.SampleApp.Maui/Platforms/Android/AndroidManifest.xml +++ b/src/Samples/Toolkit.SampleApp.Maui/Platforms/Android/AndroidManifest.xml @@ -1,6 +1,12 @@  - - - + + + + + + + + + \ No newline at end of file diff --git a/src/Samples/Toolkit.SampleApp.Maui/Platforms/iOS/Info.plist b/src/Samples/Toolkit.SampleApp.Maui/Platforms/iOS/Info.plist index 0004a4fde..343c80563 100644 --- a/src/Samples/Toolkit.SampleApp.Maui/Platforms/iOS/Info.plist +++ b/src/Samples/Toolkit.SampleApp.Maui/Platforms/iOS/Info.plist @@ -28,5 +28,7 @@ XSAppIconAssets Assets.xcassets/appicon.appiconset + NSCameraUsageDescription + Adding attachments diff --git a/src/Samples/Toolkit.SampleApp.Maui/Samples/FeatureFormViewSample.xaml b/src/Samples/Toolkit.SampleApp.Maui/Samples/FeatureFormViewSample.xaml index 1375e0bd4..a827b7527 100644 --- a/src/Samples/Toolkit.SampleApp.Maui/Samples/FeatureFormViewSample.xaml +++ b/src/Samples/Toolkit.SampleApp.Maui/Samples/FeatureFormViewSample.xaml @@ -14,19 +14,21 @@ Map="https://www.arcgis.com/home/item.html?id=f72207ac170a40d8992b7a3507b44fad" GeoViewTapped="mapView_GeoViewTapped" /> - + - + - - + + diff --git a/src/Samples/Toolkit.SampleApp.Maui/Samples/FeatureFormViewSample.xaml.cs b/src/Samples/Toolkit.SampleApp.Maui/Samples/FeatureFormViewSample.xaml.cs index 3164fc311..cc12351e1 100644 --- a/src/Samples/Toolkit.SampleApp.Maui/Samples/FeatureFormViewSample.xaml.cs +++ b/src/Samples/Toolkit.SampleApp.Maui/Samples/FeatureFormViewSample.xaml.cs @@ -1,4 +1,5 @@ -using Esri.ArcGISRuntime.Data; +using System.Diagnostics; +using Esri.ArcGISRuntime.Data; using Esri.ArcGISRuntime.Mapping; using Esri.ArcGISRuntime.Mapping.FeatureForms; using Esri.ArcGISRuntime.Portal; @@ -54,13 +55,45 @@ private async void mapView_GeoViewTapped(object sender, Esri.ArcGISRuntime.Maui. return null; } + private async void BarcodeButtonClicked(object sender, Esri.ArcGISRuntime.Toolkit.Maui.BarcodeButtonClickedEventArgs e) + { + // If user clicks the barcode button in a barcode input element, use ZXing library (https://github.com/Redth/ZXing.Net.Maui) + // to scan a barcode using the device camera + ZXing.Net.Maui.Controls.CameraBarcodeReaderView view = new ZXing.Net.Maui.Controls.CameraBarcodeReaderView(); + TaskCompletionSource tcs = new TaskCompletionSource(); + view.BarcodesDetected += (s, e) => + { + if (tcs.TrySetResult(e.Results.FirstOrDefault()?.Value)) + Dispatcher.Dispatch(() => _ = Navigation.PopModalAsync()); + }; + ContentPage p = new ContentPage() { Content = view }; + await Navigation.PushModalAsync(p); + p.NavigatedFrom += (s, e) => tcs.TrySetResult(null); + var barcode = await tcs.Task; + if (!string.IsNullOrEmpty(barcode)) + e.FormElement.UpdateValue(barcode); + } + + private void FormAttachmentClicked(object sender, Esri.ArcGISRuntime.Toolkit.Maui.FormAttachmentClickedEventArgs e) + { + // User clicked an attachment, + // e.Handled = true; // Uncomment to override default open attachment action + Debug.WriteLine("Attachment clicked: " + e.Attachment.Name); + } private async void DiscardButton_Click(object sender, EventArgs e) { var result = await DisplayAlert("Confirm", "Discard edits?", "Yes", "Cancel"); if (result) { - formViewer.FeatureForm?.DiscardEdits(); + + ((Button)sender).IsEnabled = false; + try + { + await formViewer.DiscardEditsAsync(); + } catch { } + + ((Button)sender).IsEnabled = true; } } @@ -84,7 +117,7 @@ private async void UpdateButton_Click(object sender, EventArgs e) } try { - await formViewer.FeatureForm!.Feature.FeatureTable!.UpdateFeatureAsync(formViewer.FeatureForm.Feature); + await formViewer.FinishEditingAsync(); } catch (Exception ex) { diff --git a/src/Samples/Toolkit.SampleApp.Maui/Samples/PopupViewerSample.xaml b/src/Samples/Toolkit.SampleApp.Maui/Samples/PopupViewerSample.xaml index ef425da95..0257a6d20 100644 --- a/src/Samples/Toolkit.SampleApp.Maui/Samples/PopupViewerSample.xaml +++ b/src/Samples/Toolkit.SampleApp.Maui/Samples/PopupViewerSample.xaml @@ -12,7 +12,7 @@ - +