Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prep for Release #221

Merged
merged 169 commits into from
Aug 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
169 commits
Select commit Hold shift + click to select a range
d74a00c
Adding CSV Layer
AndersenBell May 12, 2023
85e7a49
Merge branch 'develop' into feature/65_add_csv_layer
AndersenBell May 12, 2023
8c504bd
Merge branch 'develop' into feature/65_add_csv_layer
AndersenBell May 19, 2023
985dd8f
initial widget class setup
seahro Jun 13, 2023
c473ade
add bookmarks to widgets.razor
seahro Jun 13, 2023
6354db8
add bookmars to navmenu
seahro Jun 13, 2023
7762f2f
working on arcGisJsInterop
seahro Jun 13, 2023
fa590f3
working on arcgisjsinterop
seahro Jun 13, 2023
fa6f3a4
Merge branch 'develop' into feature/65_add_csv_layer
AndersenBell Jun 30, 2023
ed44896
Merge branch 'develop' into feature/181_bookmarks_widget
seahro Jul 10, 2023
ffa9238
Merge branch 'develop' into feature/65_add_csv_layer
AndersenBell Jul 10, 2023
78b1a26
wip, combo-box not rendering correctly
TimPurdum Jul 11, 2023
c1fd020
Fixing sample copying on new builds, code review changes
AndersenBell Jul 11, 2023
1d96b96
Merge branch 'develop' into feature/181_bookmarks_widget
seahro Jul 11, 2023
9e0720c
bookmark widget .cs complete js interop working...
seahro Jul 11, 2023
e06cc03
adding missing warning disable
AndersenBell Jul 12, 2023
a02a94a
add bookmark in definitions
seahro Jul 12, 2023
71bf8d8
adjusting bookmark widget
seahro Jul 12, 2023
fb92a13
Updating examples, adding copyright to layers object
AndersenBell Jul 12, 2023
5cf8ad6
working, tested
TimPurdum Jul 12, 2023
2a0f04a
Add XML documentation for new classes and properties
TimPurdum Jul 12, 2023
501bb14
working on widgets page and bookmark class
seahro Jul 12, 2023
386825b
Added cursor management for new Pro sample
TimPurdum Jul 13, 2023
3364906
working
seahro Jul 13, 2023
f3eb99d
Merge pull request #169 from dymaptic/feature/65_add_csv_layer
TimPurdum Jul 13, 2023
cc3cdb7
Merge pull request #194 from dymaptic/feature/193_feature_edits
TimPurdum Jul 13, 2023
040deb2
working on widget
seahro Jul 13, 2023
d8859a7
merge conflict resolved
seahro Jul 13, 2023
2dd80c8
bookmark page map rendering working on individual bookmarks
seahro Jul 13, 2023
0dbc1b8
Adding measurement widget
AndersenBell Jul 13, 2023
d5c788c
building expand widget to hold bookmarks
seahro Jul 14, 2023
1f92e12
wip bookmarks
AndersenBell Jul 14, 2023
efe1d57
working
seahro Jul 14, 2023
bd44d4d
updating with branch 51
seahro Jul 14, 2023
f46d028
fixing viewpoint
AndersenBell Jul 14, 2023
7d419d7
separating bookmark and viewpoint classes into individual files
seahro Jul 14, 2023
46ee506
merging 181 and 51
seahro Jul 14, 2023
e245534
working on merge conflicts
seahro Jul 14, 2023
c996387
fixing some things
AndersenBell Jul 14, 2023
19a38fe
Extra fixes for Pro widgets
TimPurdum Jul 14, 2023
0189d60
working kml layer razor page
seahro Jul 14, 2023
72f06c4
razor page almost complete
seahro Jul 17, 2023
7f8e3a0
add class and references, working on jstinterop
seahro Jul 17, 2023
09a3657
working on razor display
seahro Jul 17, 2023
87ba7b8
updating naming of class
AndersenBell Jul 17, 2023
9cd95f4
adding time extent and thumbnails
AndersenBell Jul 17, 2023
0ce01bb
Adding support for expander properties
AndersenBell Jul 17, 2023
c69749b
kml layer and popups properly displaying
seahro Jul 17, 2023
f188c7c
cleaned up code
seahro Jul 17, 2023
dbffbb6
Merge pull request #198 from dymaptic/feature/193_extra_fixes
TimPurdum Jul 18, 2023
6bd3769
adding expand mode
AndersenBell Jul 18, 2023
697d343
Merge branch 'develop' into feature/51-bookmarks-widget
AndersenBell Jul 18, 2023
c523d61
Merge branch 'develop' into feature/58_measurement_widget
AndersenBell Jul 18, 2023
8d35418
initial razor page build
seahro Jul 18, 2023
6496cba
code review feedback
AndersenBell Jul 18, 2023
86ad13f
refactor two button add kml layer
seahro Jul 18, 2023
4a67a0a
added comment
TimPurdum Jul 19, 2023
a323b46
code review feedback
AndersenBell Jul 19, 2023
cbeca17
Merge branch 'develop' into feature/51-bookmarks-widget
AndersenBell Jul 19, 2023
8f3f4c3
removing bookmark page
AndersenBell Jul 19, 2023
8c040e2
code review feedback
AndersenBell Jul 19, 2023
5c521f3
2nd btn functional working on addremove method
seahro Jul 19, 2023
99246d5
two button set working to show/remove the layer
seahro Jul 19, 2023
94b64ee
comments added and cleaned up extraneous items from class
seahro Jul 19, 2023
4d5f54e
refactored required property added error and successful test
seahro Jul 19, 2023
dbbc0c2
build out interop file
seahro Jul 19, 2023
7b9e98c
Merge pull request #196 from dymaptic/feature/58_measurement_widget
TimPurdum Jul 19, 2023
b3f53a3
spelling error
seahro Jul 19, 2023
2b0522c
working on class
seahro Jul 19, 2023
d418a97
working on refactor the class with registration methods
seahro Jul 19, 2023
27da60e
successfully tested
seahro Jul 20, 2023
aa52ef1
working on testrunner.js issue
seahro Jul 20, 2023
d393fa2
testrunner issue solved
seahro Jul 20, 2023
d5eb0f4
successful load with url, unsuccessful test result
seahro Jul 20, 2023
78cc399
Moved and consolidated tests, fixed FeatureLayer unregister bug
TimPurdum Jul 21, 2023
ea14719
Merge pull request #203 from dymaptic/feature/202_wasm_test_runner
TimPurdum Jul 21, 2023
304a864
update with new test folder in develop
seahro Jul 21, 2023
e1a8abf
branch integration complete and readded layertest file and assertlaye…
seahro Jul 21, 2023
b615c14
corrected js test issue and reformat the renderfragment in layertests…
seahro Jul 21, 2023
b062c51
corrected conditional
seahro Jul 21, 2023
dfa1c77
Merge branch 'develop' into feature/70_add_wcslayer
seahro Jul 21, 2023
e2fcd6f
refactor after feedback
seahro Jul 21, 2023
147cada
Merge pull request #199 from dymaptic/feature/64_add_kmllayer
TimPurdum Jul 21, 2023
445614f
getting bookmark example working
AndersenBell Jul 21, 2023
03cedb1
Merge branch 'feature/51-bookmarks-widget' into feature/bookmark-testing
AndersenBell Jul 21, 2023
25adc96
Merge branch 'feature/bookmark-testing' into feature/51-bookmarks-widget
AndersenBell Jul 21, 2023
1dcf3ce
Merge branch 'develop' into feature/51-bookmarks-widget
AndersenBell Jul 21, 2023
5a47c3f
razor pg working
seahro Jul 21, 2023
4c28e8a
code review feedback
AndersenBell Jul 21, 2023
737b14e
fixing comment
AndersenBell Jul 21, 2023
0ca7b69
Merge pull request #200 from dymaptic/feature/51-bookmarks-widget
AndersenBell Jul 21, 2023
db3c255
working
seahro Jul 21, 2023
3312ec2
update branch
seahro Jul 21, 2023
4766c02
working
seahro Jul 24, 2023
aac38d7
Merge branch 'develop' into feature/70_add_wcslayer
seahro Jul 24, 2023
a2956e7
raster stretch renderer added, multi dimensionaldefinition next
seahro Jul 24, 2023
54525e2
dimensiondefinition class in place working on methods
seahro Jul 24, 2023
4648a5a
dimensiondefinition added to builder and definitions
seahro Jul 24, 2023
87fddb5
add color ramp class working on definitions
seahro Jul 24, 2023
d3e154c
working
seahro Jul 25, 2023
1eba18c
rasterstretch converter in place and child component registration in …
seahro Jul 25, 2023
2812782
working on razor display
seahro Jul 25, 2023
b252340
initial render working color blend only black n white currently still…
seahro Jul 25, 2023
4a617db
multicolorramp and algorithmic color ramps in place working on wrappi…
seahro Jul 26, 2023
e57049f
dimensionaldefinition and renderer added to razor sample page
seahro Jul 26, 2023
8b7df91
layer properties set up for rendering on razor page
seahro Jul 26, 2023
23bf08d
adjusting rgb list to map color property in js/ts
seahro Jul 27, 2023
34bba50
refactoring color objects
seahro Jul 27, 2023
496554c
build without errors, markup kick back raster exception error. add wc…
seahro Jul 27, 2023
d7779bc
razor page working no color works correctly color loads but colors st…
seahro Jul 28, 2023
0090d1a
interop refactor working
seahro Jul 31, 2023
3826a2e
working
seahro Jul 31, 2023
27120e6
working wcs in jsinterop
seahro Jul 31, 2023
517739d
Adding support for time slider
AndersenBell Aug 1, 2023
6525f1d
fix popup actions
TimPurdum Aug 2, 2023
010ca64
update version for beta build, fix assetCopy (PS defaults changed aga…
TimPurdum Aug 2, 2023
2ada0a3
major adjustments to jsbuilder, interop, and the classes. both layer…
seahro Aug 2, 2023
68b966e
adding tickConfig builder
AndersenBell Aug 2, 2023
30241bf
refactor rasterstretchrenderer out of renderer
seahro Aug 2, 2023
44e6d7f
color ramps rendering correctly and cleanup complete
seahro Aug 2, 2023
2e00b1b
remove commented out code items
seahro Aug 2, 2023
817a9d8
working on test, broken
TimPurdum Aug 2, 2023
39f5ebc
WIP
TimPurdum Aug 2, 2023
08f4674
working on corrections
seahro Aug 2, 2023
0b1ef68
Added unit test, comment
TimPurdum Aug 3, 2023
f8b42c1
Merge pull request #208 from dymaptic/bug/207_popup_actions
TimPurdum Aug 3, 2023
8a034de
added guides for new layers, new widgets
TimPurdum Aug 3, 2023
8074f18
Merge branch 'develop' into feature/timeslider-support
AndersenBell Aug 3, 2023
bfb30be
Updating Timeinfo
AndersenBell Aug 3, 2023
8456157
Merge pull request #206 from dymaptic/feature/timeslider-support
AndersenBell Aug 3, 2023
2024863
corrected layer.cs to add wcs layer and added additional dimensional …
seahro Aug 3, 2023
8674a33
equality checks removed, testing
TimPurdum Aug 3, 2023
f981c67
Clean up and revert bug-causing change to `featureLayerView.ts`
TimPurdum Aug 3, 2023
a466965
set values on server-side featurelayers in `updateLayer`, but needs t…
TimPurdum Aug 3, 2023
8c8e89a
refactors complete and rendering correctly
seahro Aug 3, 2023
6f13522
Updating feature layer Symbol rendering
AndersenBell Aug 3, 2023
228b5f3
improve building dotNetFeatureLayer from JS, fix bug in pro
TimPurdum Aug 3, 2023
15ebcbf
corrections complete
seahro Aug 3, 2023
e10156b
cleaning up code
AndersenBell Aug 3, 2023
0e56901
Merge pull request #217 from dymaptic/bug/214_sql_filter
TimPurdum Aug 4, 2023
d74ab28
Merge pull request #213 from dymaptic/bug/212_highlighting
TimPurdum Aug 4, 2023
148377e
typescript cleanup
AndersenBell Aug 4, 2023
f4be912
Merge branch 'develop' into feature/typescript-cleanup
AndersenBell Aug 4, 2023
a7a18fd
adding warnings as errors
AndersenBell Aug 4, 2023
630a332
Cleanup warnings, unused code
TimPurdum Aug 4, 2023
2360c16
Merge pull request #218 from dymaptic/feature/typescript-cleanup
AndersenBell Aug 4, 2023
e9f3057
Merge pull request #216 from dymaptic/feature/215_featurelayer_bug
AndersenBell Aug 4, 2023
4d382d3
build fixes for release mode
TimPurdum Aug 4, 2023
160b292
pr review 2 refactors and succesfully tested
seahro Aug 7, 2023
118a10f
merge from develop
TimPurdum Aug 7, 2023
03dd90e
starting corrections for warnings
seahro Aug 7, 2023
9391fa3
working on corrections
seahro Aug 7, 2023
23be778
warnings as errors "issues" corrected
seahro Aug 7, 2023
a197586
realigned branch with remote
seahro Aug 7, 2023
d25dd22
Lifecycle and component limitations
TimPurdum Aug 7, 2023
4825b16
Tested, cleanup
TimPurdum Aug 7, 2023
d1c451f
Merge pull request #204 from dymaptic/feature/70_add_wcslayer
TimPurdum Aug 7, 2023
4b84475
Update package version, remove beta tag in preparation for release
TimPurdum Aug 7, 2023
4d5ee46
Added more general development guidance
TimPurdum Aug 8, 2023
861c37f
Bug fixes and support for pro freatures
AndersenBell Aug 8, 2023
98b3da8
Merge branch 'develop' into bug/149_equality_checks
TimPurdum Aug 9, 2023
e6dcc62
updating legend widget
AndersenBell Aug 9, 2023
67fc02c
fixing layer effects
AndersenBell Aug 9, 2023
7618cdc
Tested removed equality settings, improved CSV layer and sample
TimPurdum Aug 9, 2023
c2fca33
Merge pull request #219 from dymaptic/feature/pro_updates
AndersenBell Aug 9, 2023
d2523a7
fix for build warning/error
TimPurdum Aug 9, 2023
9af5325
Merge pull request #220 from dymaptic/bug/149_equality_checks
TimPurdum Aug 9, 2023
44edf20
Merge pull request #211 from dymaptic/feature/210_dev_docs
TimPurdum Aug 9, 2023
f95ba4d
Review cleanup
TimPurdum Aug 9, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -372,3 +372,4 @@ MigrationBackup/
/docs/vendor
/docs/.DS_Store
/src/dymaptic.GeoBlazor.Core/Documentation/**/*
/test/dymaptic.GeoBlazor.Core.Test.Blazor.Wasm/wwwroot/appsettings.json
156 changes: 156 additions & 0 deletions DeveloperGuide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
# Developer Documentation
This document is intended for developers and maintainers of the GeoBlazor source code. The guidelines are for new
development and refactoring of existing code, but may not be adhered to by all existing code.

## General Goals
- Support end user use of ArcGIS tools without having to write JavaScript
- Support components as both Razor markup elements and C# code object
- Support idiomatic C# coding patterns
- Maintain a close relationship between ArcGIS and GeoBlazor architecture to allow easier maintenance, updates, and documentation

## Understanding The GeoBlazor (and Blazor) Lifecycle
Blazor components are built around the concept of automatic binding and updating when C# properties and variables change.
Each time Blazor detects a change, it will re-render the component and all of its child-components, and then update the client html.
The Blazor component lifecycle method `OnAfterRender` and `OnAfterRenderAsync` can thus be triggered many times during a
component's lifetime, and are usually called _at least_ twice on startup. Similarly, the method `OnParametersSet` and
`OnParametersSetAsync` will be called every time Blazor detects a change in a component parameter (which also then triggers a render).

Unlike normal Blazor components, however, GeoBlazor components are not being rendered to HTML. Instead, they are being passed
as data to a JavaScript layer, where they are used to generate the relevant ArcGIS objects. As you can imagine, calling the
same JavaScript to render in ArcGIS repeatedly would be a bad idea. Therefore, GeoBlazor has checks in place to guarantee
that a map is only rendered once, and then on actual component changes. This creates a few limitations and new capabilities
that normal Blazor components do not have.

### GeoBlazor Component Limitations
- Synchronous property setters will not automatically cause a map to update. This is because all JavaScript calls (at
least those that support all Blazor modes) are asynchronous, and there is no safe way to trigger an async method from
a synchronous setter. Instead, the suggested pattern is to implement asynchronous `Set{PropertyName}()` methods that
can call a custom JS function to update the value.
- Similarly, property getters do not automatically load the latest value from JavaScript. If the property is expected to
be updated regularly and "read", you should implement an asynchronous `Get{PropertyName}()` method to load the value
from JavaScript.
- Some Blazor parameters are only read once on the first render, and will not auto-bind to value changes like other components.
Users will have to be guided to use the async `Set` methods to update properties after initial render. For example,
we do try to support binding in the top-level `MapView` parameters such as `Latitude`, `Longitude`, and `Zoom`. However,
once a user zooms or scrolls the map manually, we cannot support the binding anymore, because the map would always "snap"
back to its original position, so the binding stops being read after manual map manipulation.
- GeoBlazor components must be nested in their proper parent components. Methods like `RegisterChildComponent` should be
implemented for each child component, and `[RequiredParameter]` should be used to enforce a parameter that needs to be set
by the user. This approach should provide clear error messages if the user places a component in the wrong place or forgets
a parameter.

### GeoBlazor Component Capabilities
- Unlike other Blazor components. GeoBlazor MapComponents can be created in C# code as well as in markup. To avoid the
`BL0005:Component parameter should not be set outside of its component` warning, we create two constructors for each
component, one empty constructor for razor markup, and another one that sets all properties and uses
`#pragma warning disable BL0005` to silence the warning.

## MapComponents
- A `MapComponent` is a Razor (aka Blazor) Component that can be declared in Razor markup. For example, `MapView`,
`Map`, `FeatureLayer`, and `Graphic` are all `MapComponent`s.
- `MapComponent`s are usually 1-1 with ArcGIS JavaScript classes.
- `MapComponent`s, with a few top-level exceptions (e.g., `MapView`, `Map`), can also be declared in C# code.
- There should always be two constructors, an empty one for razor, and one that sets all public properties that should be used
when creating the component in C#.
- Properties should never be set in C# _after_ the component has been rendered to JavaScript.
The following patterns should be followed and enforced as much as possible:
- Define the property in razor markup, either as a `Parameter` or as a child component
- Use the constructor to set all properties
- Add an async `Set{PropertyName}` method, which calls to JavaScript to update the value (this is not needed for every property, just commonly updated ones)
- Properties with simple/primitive types (e.g. int, double, string, bool, enum) should be marked as `[Parameter]`s for Blazor.
This will also generate a warning if a user tries to set these properties by hand in code after the component is rendered.
- Properties with object types should *also* inherit from `MapComponent`, so they can be written as child tags in razor markup.
- MapComponent properties should have `{ get; private set; }` to force folks to use one of the patterns described above.
- If there are any `MapComponent` properties, `RegisterChildComponent`, `UnregisterChildComponent`, and
`ValidateRequiredChildred` should be implemented and handle all child `MapComponent` properties

## JSON Serialization
- All `enum` types should be marked with the `[JsonConverter(typeof(EnumToKebabCaseStringConverter<{YourType}>))]` attribute
- Inherited Types sometimes require custom `JsonConverter` implementations to avoid serializing as the base type. See `LayerConverter` as an example.
- If you want to avoid passing `null` properties, mark properties with `[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]`.
However, this will also be dealt with in the next section about `Converting GeoBlazor Objects to ArcGIS`.

## Converting GeoBlazor Objects to ArcGIS
- Simple/primitive values can be easily copied from a C# object to an ArcGIS object. However, complex objects tend to fail, for several reasons outlined below.
- Setting a value in an ArcGIS object to `null` when it expects a value can cause it to fail silently. There are several patterns to avoid this.
- If setting the value in a constructor, use `?? undefined` to avoid setting the value to `null`.
```js
let template = new PopupTemplate({
title: popupTemplateObject.title ?? undefined,
content: content ?? undefined,
outFields: popupTemplateObject.outFields ?? undefined,
overwriteActions: popupTemplateObject.overwriteActions ?? false,
returnGeometry: popupTemplateObject.returnGeometry ?? false
});
```
- Check the for `undefined` and `null` before setting the value.
```js
if (popupTemplateObject.title !== undefined && popupTemplateObject.title !== null) {
template.title = popupTemplateObject.title;
}
```
- Several of the TypeScript files have a shorthand function for this called `hasValue`.
```js
if (hasValue(popupTemplateObject.title)) {
template.title = popupTemplateObject.title;
}
```
- The GeoBlazor C# types are serialized with a `Guid` `id` property. This is used to store and find references between
the two languages. However, this may also be causing some issues when simply "setting" a dotnet object to an ArcGIS object.
ArcGIS _tries_ to auto-cast objects, but unknown properties could cause it to fail.
- The suggested pattern for creating a complex ArcGIS object is to define a `buildJs...` function in `jsBuilder.ts`. This
gives you a place to implement the null checks and other conversion logic necessary. You may have to use several nested `buildJs...` functions.

## Converting ArcGIS Objects to GeoBlazor Objects
- While it is not as common, there are times when you need to convert an ArcGIS object to a GeoBlazor object. This is usually
done when an event is fired from the JavaScript side, and you need to pass the object back to C#.
- The JsonSerializer _may_ handle the ArcGIS object correctly
- If not, you can define a `buildDotNet...` function in `dotNetBuilder.ts` to do any necessary conversions.

## The JavaScript Wrapper Pattern
- In order to call methods on an ArcGIS object, you need a reference to the JS object. However, as described above, we
often need a "shim" layer in which to cast arguments from a GeoBlazor object to an ArcGIS object. For objects like `Layers`
and `Widgets`, this is often done by providing a `wrapper`. This is a separate TypeScript class file that has a reference
to the original JS object, and replicates the method calls while allows for building custom types. See `featureLayerWrapper.ts` for an example.
- If an object has no functions that we want to support, or if the functions only take primitive types, you do not really need a wrapper.

## Development Process
- Identify a feature in the ArcGIS JavaScript SDK that you want to support in GeoBlazor
- If there is no related gissue, create one and assign it to yourself
- Create a new branch for your work with the pattern `feature/{gissue-number}_{short-description}`
- Find a relevant sample from the ArcGIS JavaScript SDK, if one exists
- Create a new sample page in `dymaptic.GeoBlazor.Core.Samples.Shared/Pages`. Use the same header pattern as other samples
- The links in the sample header should point to a) the JS sample page and b) the data source (e.g., feature service) used, if available
- Implement the necessary C# classes and methods to support the feature
- Implement TypeScript functions and classes if necessary for your C# classes to call and use. See the `Widgets` and `Layers` details below for more examples
- If possible, flesh out all properties and methods from ArcGIS classes in your C# implementation, even if they are not directly used in the sample
- Write unit tests in `dymaptic.GeoBlazor.Core.Tests.Blazor.Shared` to test your new classes and methods

### Adding a New Layer Type
- Create a new C# class in the `dymaptic.GeoBlazor.Core/Components/Layers` folder that inherits from `Layer`.
- Implement the `LayerType` property. The type value should match the layer `type` value in ArcGIS.
```csharp
/// <inheritdoc />
[JsonPropertyName("type")]
public override string LayerType => "layer-type";
```
- Add your new layer type to `LayerConverter` for serialization.
- Implement all properties from the ArcGIS Layer class. Use the `MapComponents` rules outlined above.
- Add your layer to the switch statement in the `createLayer` function of `arcGisJsInterop.ts`. Use the `Converting GeoBlazor Objects to ArcGIS` rules outlined above.
- If the layer has methods that we want to support, create a `wrapper` class for it. See `The JavaScript Wrapper Pattern` above.
- Create a new Layer samples page in `dymaptic.GeoBlazor.Core.Samples.Shared/Pages`. Also add to the `NavMenu.razor`.
- Create a new unit test in `dymaptic.GeoBlazor.Core.Tests.Blazor.Shared/Components/LayerTests.razor`.

### Adding a New Widget
- Create a new C# class in the `dymaptic.GeoBlazor.Core/Components/Widgets` folder that inherits from `Widget`.
- Implement the `WidgetType` property. The type value should match the widget `type` value in ArcGIS.
```csharp
/// <inheritdoc />
[JsonPropertyName("type")]
public override string WidgetType => "widget-type";
```
- Add your widget to the switch statement in the `createWidget` function of `arcGisJsInterop.ts`. Use the `Converting GeoBlazor Objects to ArcGIS` rules outlined above.
- If the widget has methods that we want to support, create a `wrapper` class for it. See `The JavaScript Wrapper Pattern` above.
- Create a new Widget samples page in `dymaptic.GeoBlazor.Core.Samples.Shared/Pages`. Also add to the `NavMenu.razor`.
- Alternatively, for simple widgets, you can add them to the `Widgets.razor` sample.
- Create a new unit test in `dymaptic.GeoBlazor.Core.Tests.Blazor.Shared/Components/WidgetTests.razor`.
26 changes: 0 additions & 26 deletions docs/404.html

This file was deleted.

1 change: 0 additions & 1 deletion docs/CNAME

This file was deleted.

37 changes: 0 additions & 37 deletions docs/Gemfile

This file was deleted.

95 changes: 0 additions & 95 deletions docs/Gemfile.lock

This file was deleted.

12 changes: 0 additions & 12 deletions docs/ReadMe.md

This file was deleted.

Loading