Add dedicated sample pages for Compass, Locate, BasemapToggle, and ScaleBar widgets#14
Conversation
…aleBar widgets New pages: - /compass-widget: Map rotation controls with CompassWidget reset - /locate-widget: Geolocation with configurable zoom scale - /basemap-toggle-widget: Switchable basemap style pairs - /scale-bar-widget: Unit (Imperial/Metric/Dual) and style (Ruler/Line) toggles Also adds nav menu entries and fixes UniqueValueRenderers build error. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR expands the Core sample app by adding dedicated pages for several widgets (Compass, Locate, BasemapToggle, ScaleBar) that were previously only demonstrated in the Widgets overview, and includes a small fix to resolve a build error in the UniqueValueRenderers sample.
Changes:
- Added 4 new widget-specific sample pages with simple configuration controls.
- Updated the nav menu to include routes for the new pages.
- Adjusted
UniqueValueRendererslabel formatting logic to avoid the removed/invalidToUpperFirstChar()usage.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| samples/core/dymaptic.GeoBlazor.Core.Sample.Shared/Shared/NavMenu.razor.cs | Adds nav links for the four new widget sample pages. |
| samples/core/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/UniqueValueRenderers.razor.cs | Replaces ToUpperFirstChar() usage with inline formatting to fix build. |
| samples/core/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/CompassWidgetPage.razor | New Compass widget page with rotation controls. |
| samples/core/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/LocateWidgetPage.razor | New Locate widget page with selectable zoom scale. |
| samples/core/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/BasemapToggleWidgetPage.razor | New BasemapToggle widget page with selectable basemap pairs. |
| samples/core/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/ScaleBarWidgetPage.razor | New ScaleBar widget page with unit/style controls. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| private void OnScaleChanged(ChangeEventArgs e) | ||
| { | ||
| _scale = int.Parse(e.Value?.ToString() ?? "1500"); |
|
|
||
| private void OnPairChanged(ChangeEventArgs e) | ||
| { | ||
| _pairIndex = int.Parse(e.Value?.ToString() ?? "0"); |
| _unit = Enum.Parse<ScaleUnit>(e.Value?.ToString() ?? "Imperial"); | ||
| _widgetKey++; | ||
| } | ||
|
|
||
| private void OnStyleChanged(ChangeEventArgs e) | ||
| { | ||
| _style = Enum.Parse<ScaleBarWidgetStyle>(e.Value?.ToString() ?? "Ruler"); |
| private readonly UniqueValueRenderer _uniqueValueRenderer = new(uniqueValueInfos: roadTypes | ||
| .Select(r => new UniqueValueInfo(r.Key.ToUpperFirstChar().Replace("_", " "), r.Value, r.Key)) | ||
| .Select(r => new UniqueValueInfo(string.Concat(r.Key[0].ToString().ToUpper(), r.Key.AsSpan(1)).Replace("_", " "), r.Value, r.Key)) | ||
| .ToArray(), |
| <span style="margin-left: 1rem; opacity: 0.7;">Current: @(_rotation)°</span> | ||
| </div> | ||
|
|
||
| <MapView @key="@_rotation" Longitude="-118.805" Latitude="34.027" Zoom="13" Rotation="@_rotation" Class="map-view"> |
- Add value="@_pairIndex" to BasemapToggle select - Add value="@_unit" and value="@_style" to ScaleBar selects - Add aria-hidden="true" and focusable="false" to locate icon SVG Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Code Review — PR #14: Compass / Locate / BasemapToggle / ScaleBar widget samplesOverviewFour dedicated pages for widgets that were previously only demoed inside the big "Widgets" overview. Each page has dropdown/button controls to exercise the widget's props. Good additions. Also includes the 🔴 Architectural concern —
|
# Conflicts: # samples/core/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/UniqueValueRenderers.razor.cs
| </MapView> | ||
|
|
||
| @code { | ||
| private double _rotation = 45; |
There was a problem hiding this comment.
I would start at 0, it was confusing as a user because the first button I tried was 45 and nothing happened.
| <line x1="0" y1="8" x2="3" y2="8" stroke="currentColor" stroke-width="1.5"/> | ||
| <line x1="13" y1="8" x2="16" y2="8" stroke="currentColor" stroke-width="1.5"/> | ||
| </svg> button (top-left of the map) to fly to your location. | ||
| Change the zoom scale below, then click it again to see the difference in zoom level. |
There was a problem hiding this comment.
You should add instructions about the "Allow" permissions dialog that will pop up in most browsers.
|
|
||
| <div style="display: flex; flex-wrap: wrap; gap: 0.5rem 1.5rem; margin-bottom: 1rem;"> | ||
| <div class="form-group"> | ||
| <label>Zoom Scale: |
There was a problem hiding this comment.
This terminilogy is confusing, since ArcGIS/GeoBlazor have both Zoom and Scale properties. I would just use the word Scale since that is the property you are targeting, and remove the word zoom completely.
| and visual style. | ||
| </p> | ||
|
|
||
| <div style="display: flex; flex-wrap: wrap; gap: 0.5rem 1.5rem; margin-bottom: 1rem;"> |
There was a problem hiding this comment.
Avoid inline styles on all our samples. See the changes that I made on PR 12. For example, I would make this div class="form-group", and the other two class="spaced-row".
| <option value="Metric">Metric (km/m)</option> | ||
| <option value="Dual">Dual (both)</option> | ||
| </select> | ||
| </label> |
There was a problem hiding this comment.
I've moved to not wrapping with labels, it was breaking layout for me. Instead, use for:
<label for="unit-select">
Unit:
</label>
<select id="unit-select" @onchange="...">
...
</select>Also, I believe by removing the class and style this select will default to match the other pages, but you can check and confirm.
| <a class="btn btn-secondary" target="_blank" href="https://developers.arcgis.com/javascript/latest/sample-code/widgets-basemaptoggle/">ArcGIS Sample</a> | ||
| <a class="btn btn-primary" target="_blank" href="https://developers.arcgis.com/javascript/latest/api-reference/esri-widgets-BasemapToggle.html">BasemapToggle API Reference</a> | ||
| </div> | ||
| <p class="instructions"> |
There was a problem hiding this comment.
See my changes moving links-div links to PageLinks in the @code block. I would like you to update the other 4 samples in the same way.
| <option value="2">Navigation / Imagery</option> | ||
| <option value="3">OSM Standard / Terrain</option> | ||
| </select> | ||
| </label> |
There was a problem hiding this comment.
see notes on ScaleBar page about styling
| <button class="btn btn-secondary btn-small" @onclick="@(() => SetRotation(270))">270°</button> | ||
| <button class="btn btn-accent btn-small" @onclick="@(() => SetRotation(0))">Reset North</button> | ||
| <span style="margin-left: 1rem; opacity: 0.7;">Current: @(_rotation)°</span> | ||
| </div> |
There was a problem hiding this comment.
see notes on ScaleBar page about styling
There was a problem hiding this comment.
in this case, you can combine form-group and spaced-row to get a similar effect. It's fine to use the style block if you have to override the final result of those classes, but try those first.
| <option value="100000">100,000 (Region)</option> | ||
| </select> | ||
| </label> | ||
| </div> |
There was a problem hiding this comment.
see ScaleBar page style notes
Refactor Compass, Locate, ScaleBar, and BasemapToggle pages: - Migrate to PageLinks pattern (inherit SamplePage, drop links-div) - Replace inline styles with form-group / spaced-row classes - Use label for=/select id= pattern instead of wrapping selects - Drop form-select class and inline widths - Replace manual int.Parse / Enum.Parse handlers with @Bind Drop @key on Compass, Locate, and ScaleBar so parameter changes update reactively without re-mounting the MapView. BasemapToggle keeps @key (with explanatory comment) since the primary basemap swap inside <Map> isn't reactive today. Compass uses an imperative SetRotation via @ref for smooth animation, plus an OnExtentChanged hook so the readout follows on-map compass clicks. Wording fix on Locate: drop "zoom" from user-facing text; the property targeted is Scale. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # samples/core/dymaptic.GeoBlazor.Core.Sample.Shared/Shared/NavMenu.razor.cs
Summary