+ All Categories
Home > Documents > Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View...

Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View...

Date post: 28-May-2020
Category:
Upload: others
View: 14 times
Download: 0 times
Share this document with a friend
41
Building Your Own Widget with the ArcGIS Building Your Own Widget with the ArcGIS API for JavaScript API for JavaScript Matt Driscoll – Matt Driscoll – JC Franco – JC Franco – @driskull @driskull @arfncode @arfncode
Transcript
Page 1: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Building Your Own Widget with the ArcGISBuilding Your Own Widget with the ArcGISAPI for JavaScriptAPI for JavaScript

Matt Driscoll – Matt Driscoll –

JC Franco – JC Franco –

@driskull@driskull

@arfncode@arfncode

Page 2: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

AgendaAgendaAbout WidgetsWidget FrameworkStylingBuild A Widget!

Page 3: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

WidgetsWidgets

Page 4: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

AboutAboutWhat?

Encapsulated UI componentsCohesive (integrated, uni�ed)Single-purpose pieces of functionality

Why?ReusableInterchangeable

How?esri/Widgets/Widget

Page 5: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Widget FrameworkWidget Framework

Page 6: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

ArchitectureArchitectureViews + ViewModels

Separation of concernsReusable

UI replacementEasier integration

Built with TypeScript

Page 7: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

ViewsViewsExtend esri/widgets/WidgetRely on ViewModelFocus on UI

Page 8: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

ViewModelsViewModelsExtend esri/core/AccessorProvide APIs to support viewFocus on business logic

Page 9: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

View + ViewModel in actionView + ViewModel in actionView renders its state

state = view + ViewModel propsView calls VMs APIs

causes a change (e.g., property or result)View updates

Page 10: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

esri/widgets/Widgetesri/widgets/WidgetLifecycleAPI consistency

Uni�ed object constructorPropertiesWatching

Page 11: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

LifecycleLifecycleconstructorpostInitializerenderdestroy

Page 12: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

renderrenderDe�nes UIReacts to stateUses JSXVDOM

Page 13: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

renderrender example examplerender() { const { x, y, scale } = this; return ( <div bind={this} class={CSS.base} onclick={this._handleClick} title="map info" tabIndex={0}> <p>x: {x}</p> <p>y: {y}</p> <p>scale: {scale}</p> </div> ); }

Widget rendering

Page 14: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

ImplementingImplementingDecoratorsDecorators

@subclass + declared@property

autocastcomputedread-onlyaliased

@aliasOf@renderable@accessibleHandler

Page 15: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

ImplementingImplementingExtend esri/widgets/Widget

/// <amd-dependency path="esri/core/tsSupport/declareExtendsHelper" name="__extends" /> /// <amd-dependency path="esri/core/tsSupport/decorateHelper" name="__decorate" /> @subclass("MyWidget") class MyWidget extends declared(Widget) { } export = MyWidget;

Page 16: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

ImplementingImplementingImplement render

// ... class MyWidget extends declared(Widget) { render() { return ( <div>I'm a widget</div> ); } } // ...

Page 17: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

ImplementingImplementingDe�ne properties

// ... @property() @renderable() name: string = "I'm a widget"; render() { return ( <div>{this.name}</div> ); } // ...

Page 18: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

New in 4.7New in 4.7Uni�ed CSS classesAnimation hooksDefault iconClass and label properties

Page 19: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Uni�ed CSS classesUni�ed CSS classesUse class attributeWidget#classes builds node classjoin utility is deprecatedclasses attribute is deprecated

Page 20: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Uni�ed CSS classesUni�ed CSS classes// 4.6 render() { const dynamicClasses = { [CSS.active]: this.isActive }; return ( <div class={join(CSS.base, CSS.mixin)} classes={dynamicClasses}>{/* ... */}</div> ); }

Page 21: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Uni�ed CSS classesUni�ed CSS classes// 4.7 render() { const dynamicClasses = { [CSS.active]: this.isActive }; return ( <div class={this.classes(CSS.base, CSS.mixin, dynamicClasses)}>{/* ... */}</div> ); }

Page 22: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Animation hooksAnimation hooksCSS or JSNode attributesenterAnimationexitAnimationupdateAnimation (JS-only)

cssTransition (CSS-only)

Page 23: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Animation hooksAnimation hooksrender() { const { visible } = this; const content = visible ? ( <div enterAnimation={cssTransition("enter", CSS.fadeIn)} exitAnimation={cssTransition("exit", CSS.fadeOut)}>{/*...*/}</div> ) : null; return ( <div class={CSS.base}> {content} </div> ); }

Page 24: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

iconClassiconClass and and labellabelUI hints for container widgetsExpand uses iconClass ( )

iconClass - class namelabel – localized widget label

exampleEsri icon font

@subclass("MyWidget") class MyWidget extends declared(Widget) { @property() iconClass: string = "esri-icon-basemap"; @property() label: string = i18n.widgetLabel; }

Page 25: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

RecapRecapViews + ViewModelsesri/widgets/Widgetrender()

Page 26: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

StylingStyling

Page 27: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

How?How?BEMSass

Page 28: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Naming CSS classesNaming CSS classesBlock Element Modi�er (Block Element Modi�er ( ) )

Scopes styles to blocksSemanticLow speci�city

BEMBEM

// block .example-widget {} // block__element .example-widget__input {} // block--modifier .example-widget--loading {} // block__element--modifier .example-widget__input--disabled {}

Page 29: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Styling with Styling with CSS preprocessorPowered-up CSS

NestingVariablesFunctionsMixinsInheritance

SassSass

Page 30: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Sass makes it easier to...Sass makes it easier to...RestyleOrganizeWrite less code :)

Page 31: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

RecapRecapBEMSass

Page 33: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

VM: API DesignVM: API Designinterface BookmarksViewModel { bookmarkItems: Collection<BookmarkItem>; state: "loading" | "ready" | "disabled"; // will be computed property view: MapView; goTo(item: BookmarkItem): IPromise<any>; } interface BookmarkItem { active: Boolean; extent: Extent; name: string; }

Page 35: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Let's RecapLet's RecapWidgets are single functionality UI componentsWe use them for reusability/interchangeabilityWidget FrameworkConstructing a widget

ViewModelsViews

StylingBEMSass

Page 36: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Suggested SessionSuggested SessionArcGIS API for JavaScript: Customizing Widgets

Page 38: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Questions?Questions?For exampleFor example

� �

� Where can I �nd the slides/source?

esriurl.com/buildwidgetsds2018

Page 39: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change
Page 40: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Thank you!Thank you!

Page 41: Building Your Own Widget with ArcGIS API for … › library › userconf › devsummit...View renders its state state = view + ViewModel props View calls VMs APIs causes a change

Recommended