├── .codeclimate.yml
├── .csslintrc
├── .eslintignore
├── .eslintrc
├── .github
└── FUNDING.yml
├── .gitignore
├── .nojekyll
├── .snyk
├── .travis.yml
├── LICENSE.md
├── README.md
├── config
├── app.js
├── basemapToggle.js
├── basemaps.js
├── disclaimer.html
├── disclaimer.js
├── elevationProfile.js
├── exportGraphics.js
├── fullscreen.js
├── geoprocessor.js
├── heatmap.js
├── identifyPanel.js
├── introduction.js
├── introductionWidget.js
├── locatorControl.js
├── mapLoading.js
├── mapillary.js
├── maptiks.js
├── messagebox.js
├── mousehover.js
├── openexternalmap.js
├── printplus.js
├── printplusWidget.js
├── qrcode.js
├── queryStringSearch.js
├── report.js
├── reportWidget.js
├── search.js
├── searchWidget-relatedRecords.js
├── searchWidget.js
├── share.js
├── table.js
├── what3words.js
├── zoomToFeature-multiple.js
└── zoomToFeature.js
├── css
├── bootstrap.min.css
└── cmv.css
├── demo.html
├── gruntfile.js
├── images
├── attributesTables1.jpg
├── disclaimer1.jpg
├── disclaimer2.jpg
├── export1.jpg
├── exportgraphics1.jpg
├── fullscreen1.jpg
├── geoprocessor1.jpg
├── heatmap1.jpg
├── identifypanel1.jpg
├── introduction1.jpg
├── introduction2.jpg
├── mapillary1.jpg
├── messagebox1.jpg
├── openexternalmap1.jpg
├── printplus1.jpg
├── qrcode1.jpg
├── report1.jpg
├── report2.jpg
├── search1.jpg
├── search2.jpg
├── share1.jpg
├── what3words1.jpg
└── zoomToFeature1.jpg
├── index.html
├── package.json
├── tests
└── Export
│ └── index.html
└── widgets
├── AttributesTable.js
├── AttributesTable
├── README.md
├── Table.js
├── _FeaturesMixin.js
├── _FindTaskMixin.js
├── _GraphicsMixin.js
├── _GridMixin.js
├── _QueryTaskMixin.js
├── _ToolbarMixin.js
├── css
│ └── AttributesTable.css
├── nls
│ └── AttributesTable.js
└── templates
│ └── AttributesTable.html
├── Disclaimer.js
├── Disclaimer
├── README.md
├── css
│ └── Disclaimer.css
├── nls
│ └── Disclaimer.js
└── templates
│ └── Disclaimer.html
├── ElevationProfile.js
├── ElevationProfile
├── css
│ ├── Draw.css
│ ├── ElevationProfile.css
│ └── fonts
│ │ ├── draw-icons.eot
│ │ ├── draw-icons.svg
│ │ ├── draw-icons.ttf
│ │ └── draw-icons.woff
└── templates
│ └── ElevationProfile.html
├── Export.js
├── Export
├── README.md
├── css
│ └── Export.css
├── lib
│ ├── jszip-3.1.3.min.js
│ ├── shpwrite-0.2.6.min.js
│ ├── terraformer-1.0.8.min.js
│ ├── terraformer-arcgis-parser-1.0.5.min.js
│ ├── tokml.min.js
│ ├── topojson.min.js
│ ├── wellknown-0.4.2.min.js
│ └── xlsx.core-0.9.12.min.js
├── nls
│ └── Export.js
└── templates
│ └── Export.html
├── ExportGraphics.js
├── ExportGraphics
├── README.md
├── css
│ └── ExportGraphics.css
├── nls
│ └── ExportGraphics.js
└── templates
│ └── ExportGraphics.html
├── FullScreen.js
├── FullScreen
├── README.md
├── css
│ └── FullScreen.css
├── nls
│ └── FullScreen.js
└── templates
│ └── FullScreen.html
├── Geoprocessor.js
├── HeatMap
├── README.md
├── css
│ ├── Draw.css
│ ├── Heatmap.css
│ └── fonts
│ │ ├── draw-icons.eot
│ │ ├── draw-icons.svg
│ │ ├── draw-icons.ttf
│ │ └── draw-icons.woff
├── nls
│ └── Heatmap.js
└── templates
│ └── Heatmap.html
├── Heatmap.js
├── IdentifyPanel.js
├── IdentifyPanel
├── README.md
├── css
│ └── IdentifyPanel.css
├── nls
│ └── IdentifyPanel.js
└── templates
│ └── IdentifyPanel.html
├── Introduction.js
├── Introduction
├── README.md
├── css
│ ├── Introduction.css
│ ├── introjs-dark.css
│ ├── introjs-flattener.css
│ ├── introjs-modern.css
│ ├── introjs-nassim.css
│ ├── introjs-nazanin.css
│ ├── introjs-royal.css
│ ├── introjs-rtl.min.css
│ └── introjs.min.css
└── intro.min.js
├── LayerLabels.js
├── LayerToggle.js
├── LocatorControl.js
├── LocatorControl
├── css
│ └── LocatorControl.css
├── nls
│ └── LocatorControl.js
└── templates
│ └── LocatorControl.html
├── MapLoading.js
├── Mapillary.js
├── Mapillary
├── README.md
├── css
│ └── Mapillary.css
├── mapillary-style.json
├── nls
│ ├── Mapillary.js
│ ├── es
│ │ └── Mapillary.js
│ ├── fr
│ │ └── Mapillary.js
│ ├── pt-br
│ │ └── Mapillary.js
│ └── pt-pt
│ │ └── Mapillary.js
└── templates
│ └── Mapillary.html
├── Maptiks.js
├── MessageBox.js
├── MessageBox
├── README.md
└── css
│ └── MessageBox.css
├── OpenExternalMap.js
├── OpenExternalMap
├── README.md
├── css
│ └── OpenExternalMap.css
├── nls
│ └── resource.js
└── templates
│ └── OpenExternalMap.html
├── PrintPlus.js
├── PrintPlus
├── README.md
├── css
│ └── Print.css
├── images
│ ├── image.png
│ └── pdf.png
└── templates
│ ├── Print.html
│ └── PrintResult.html
├── QRCode.js
├── QRCode
├── README.md
├── css
│ └── QRCode.css
├── images
│ └── icon.png
├── nls
│ └── QRCode.js
├── qrcode.min.js
└── templates
│ └── QRCode.html
├── Report.js
├── Report
├── README.md
├── css
│ └── Report.css
├── lib
│ ├── jspdf-1.3.4.min.js
│ └── jspdf.plugin.autotable-2.3.1.min.js
├── nls
│ └── Report.js
└── templates
│ └── Report.html
├── ReportReactor.js
├── Search.js
├── Search
├── GetDistinctValues.js
├── QueryBuilder
│ ├── QueryBuilderMixin.js
│ └── lib
│ │ ├── query-builder.default.min.css
│ │ ├── query-builder.standalone.min.js
│ │ ├── querybuilder-bootstrap-shim.min.css
│ │ ├── selectize.bootstrap3.min.css
│ │ ├── selectize.default.min.css
│ │ ├── selectize.min.js
│ │ └── sql-parser.min.js
├── README.md
├── css
│ ├── AdvancedSearch.css
│ ├── Draw.css
│ ├── Search.css
│ └── fonts
│ │ ├── draw-icons.eot
│ │ ├── draw-icons.svg
│ │ ├── draw-icons.ttf
│ │ └── draw-icons.woff
├── nls
│ └── Search.js
└── templates
│ └── Search.html
├── Share.js
├── Share
├── README.md
├── css
│ └── Share.css
├── nls
│ └── Share.js
└── templates
│ └── Share.html
├── ToggleStreetViewTiles.js
├── What3Words.js
├── What3Words
├── README.md
├── css
│ └── What3Words.css
├── images
│ ├── what3words_logo.png
│ └── what3words_pin.png
├── nls
│ └── resources.js
└── templates
│ └── What3Words.html
├── ZoomToFeature.js
└── ZoomToFeature
├── README.md
├── css
└── ZoomToFeature.css
├── nls
└── resources.js
└── templates
└── ZoomToFeature.html
/.codeclimate.yml:
--------------------------------------------------------------------------------
1 | version: "2"
2 | checks:
3 | argument-count:
4 | enabled: true
5 | config:
6 | threshold: 10
7 | complex-logic:
8 | enabled: true
9 | config:
10 | threshold: 10
11 | file-lines:
12 | enabled: false
13 | method-complexity:
14 | enabled: true
15 | config:
16 | threshold: 10
17 | method-count:
18 | enabled: true
19 | config:
20 | threshold: 50
21 | method-lines:
22 | enabled: true
23 | config:
24 | threshold: 100
25 | nested-control-flow:
26 | enabled: true
27 | config:
28 | threshold: 10
29 | return-statements:
30 | enabled: true
31 | config:
32 | threshold: 10
33 | similar-code:
34 | enabled: false
35 | identical-code:
36 | enabled: false
37 | plugins:
38 | eslint:
39 | enabled: true
40 | channel: "eslint-3"
41 | csslint:
42 | enabled: true
43 | exclude_patterns:
44 | - "**/gruntfile.js"
45 | - "cmv/**/*"
46 | - "**/**.min.css"
47 | - "**/**.min.js"
--------------------------------------------------------------------------------
/.csslintrc:
--------------------------------------------------------------------------------
1 | /* https://github.com/CSSLint/csslint/wiki/Rules */
2 | {
3 | "important": false,
4 | "adjoining-classes": false,
5 | "known-properties": false,
6 | "box-sizing": false,
7 | "box-model": false,
8 | "overqualified-elements": false,
9 | "display-property-grouping": false,
10 | "bulletproof-font-face": false,
11 | "compatible-vendor-prefixes": false,
12 | "regex-selectors": false,
13 | "errors": true,
14 | "duplicate-background-images": false,
15 | "duplicate-properties": false,
16 | "empty-rules": false,
17 | "selector-max-approaching": false,
18 | "gradients": false,
19 | "fallback-colors": false,
20 | "font-sizes": false,
21 | "font-faces": false,
22 | "floats": false,
23 | "star-property-hack": false,
24 | "outline-none": false,
25 | "import": false,
26 | "ids": false,
27 | "underscore-property-hack": false,
28 | "rules-count": false,
29 | "qualified-headings": false,
30 | "selector-max": false,
31 | "shorthand": false,
32 | "text-indent": false,
33 | "unique-headings": false,
34 | "universal-selector": false,
35 | "unqualified-attributes": false,
36 | "vendor-prefix": false,
37 | "zero-units": false
38 | }
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | **/*{.,-}min.js
2 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [tmcgee] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: tmcgee # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.sublime-workspace
2 | *.sublime-project
3 | node_modules/
4 | dist/
5 | .project
6 | change.log
7 | .sublime-grunt.cache
8 |
--------------------------------------------------------------------------------
/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/.nojekyll
--------------------------------------------------------------------------------
/.snyk:
--------------------------------------------------------------------------------
1 | # Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
2 | version: v1.14.1
3 | ignore: {}
4 | # patches apply the minimum changes required to fix a vulnerability
5 | patch:
6 | SNYK-JS-LODASH-567746:
7 | - eslint > lodash:
8 | patched: '2020-05-17T19:32:32.275Z'
9 | - grunt-contrib-compress > lodash:
10 | patched: '2020-05-17T19:32:32.275Z'
11 | - grunt-contrib-csslint > lodash:
12 | patched: '2020-05-17T19:32:32.275Z'
13 | - grunt-contrib-watch > lodash:
14 | patched: '2020-05-17T19:32:32.275Z'
15 | - eslint > inquirer > lodash:
16 | patched: '2020-05-17T19:32:32.275Z'
17 | - eslint > table > lodash:
18 | patched: '2020-05-17T19:32:32.275Z'
19 | - grunt-eslint > eslint > lodash:
20 | patched: '2020-05-17T19:32:32.275Z'
21 | - grunt > grunt-legacy-log > lodash:
22 | patched: '2020-05-17T19:32:32.275Z'
23 | - grunt > grunt-legacy-util > lodash:
24 | patched: '2020-05-17T19:32:32.275Z'
25 | - grunt-contrib-clean > async > lodash:
26 | patched: '2020-05-17T19:32:32.275Z'
27 | - grunt-contrib-connect > async > lodash:
28 | patched: '2020-05-17T19:32:32.275Z'
29 | - grunt-contrib-watch > async > lodash:
30 | patched: '2020-05-17T19:32:32.275Z'
31 | - grunt-contrib-compress > archiver > lodash:
32 | patched: '2020-05-17T19:32:32.275Z'
33 | - grunt-eslint > eslint > inquirer > lodash:
34 | patched: '2020-05-17T19:32:32.275Z'
35 | - grunt-eslint > eslint > table > lodash:
36 | patched: '2020-05-17T19:32:32.275Z'
37 | - grunt > grunt-legacy-log > grunt-legacy-log-utils > lodash:
38 | patched: '2020-05-17T19:32:32.275Z'
39 | - grunt-contrib-compress > archiver > async > lodash:
40 | patched: '2020-05-17T19:32:32.275Z'
41 | - grunt-contrib-connect > portscanner > async > lodash:
42 | patched: '2020-05-17T19:32:32.275Z'
43 | - grunt-contrib-compress > archiver > archiver-utils > lodash:
44 | patched: '2020-05-17T19:32:32.275Z'
45 | - grunt-contrib-compress > archiver > zip-stream > lodash:
46 | patched: '2020-05-17T19:32:32.275Z'
47 | - grunt-contrib-watch > gaze > globule > lodash:
48 | patched: '2020-05-17T19:32:32.275Z'
49 | - grunt-contrib-compress > archiver > zip-stream > archiver-utils > lodash:
50 | patched: '2020-05-17T19:32:32.275Z'
51 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - 'node'
4 | sudo: false
5 | before_install: npm install -g grunt-cli
6 | script: grunt build --verbose
7 | deploy:
8 | provider: releases
9 | api_key:
10 | secure: PbeHwM34muUp/D+g9gbpBj/ABYtKRmPkgRpvSMl8zxFw/slFEoepA25komkh4QO1VGV5xGtUiIz8F6Rg+uhgWiid0F+GAxDjVc9NAUAeK9ONzKpo9H5f7JJrESBnEp06R6CVR/hVPN5v2UlKUJd2MoRYHKTM/GlnCY8/L+0j0bU=
11 | file: dist/cmv-widgets.zip
12 | on:
13 | repo: tmcgee/cmv-widgets
14 | tags: true
15 | all_branches: true
16 | skip_cleanup: true
17 | notifications:
18 | slack:
19 | secure: PGsxufNYe3UrJhJnblafVeCrOjYjfVs8N6leOVCriIhxwIWpDS+whiGOpQQxZNRVN4beSgEhCbewNXHT0t3RT/Mrz4G800Gkdi+JaVADM5ZUSvAzM+02J780MSmbityVBwsHAQpn1/+cBInKQ/Yxf+G2b4f4ZDBloThrJwxLHTA=
20 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Copyright (c) 2015 Tim McGee
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy
4 | of this software and associated documentation files (the "Software"), to deal
5 | in the Software without restriction, including without limitation the rights
6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | copies of the Software, and to permit persons to whom the Software is
8 | furnished to do so, subject to the following conditions:
9 |
10 | The above copyright notice and this permission notice shall be included in all
11 | copies or substantial portions of the Software.
12 |
13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | SOFTWARE.
--------------------------------------------------------------------------------
/config/app.js:
--------------------------------------------------------------------------------
1 | (function () {
2 | var path = location.pathname.replace(/[^/]+$/, '');
3 | window.dojoConfig = {
4 | async: true,
5 | packages: [
6 | {
7 | name: 'viewer',
8 | location: 'https://cdn.jsdelivr.net/gh/cmv/cmv-app@develop/viewer/js/viewer'
9 | }, {
10 | name: 'gis',
11 | location: 'https://cdn.jsdelivr.net/gh/cmv/cmv-app@develop/viewer/js/gis'
12 | }, {
13 | name: 'config',
14 | location: path + 'config'
15 | }, {
16 | name: 'widgets',
17 | location: path + 'widgets'
18 | }, {
19 | name: 'proj4js',
20 | location: '//cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.15'
21 | }, {
22 | name: 'flag-icon-css',
23 | location: '//cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.8.0'
24 | },
25 |
26 | // jquery is only required for the Advanced Search in Search widget
27 | {
28 | name: 'jquery',
29 | location: '//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1',
30 | main: 'jquery.min'
31 | }
32 | // end jquery
33 | ]
34 | };
35 |
36 | require(window.dojoConfig, [
37 | 'dojo/_base/declare',
38 |
39 | // minimal Base Controller
40 | 'viewer/_ControllerBase',
41 |
42 | // *** Controller Mixins
43 | // Use the core mixins, add custom mixins
44 | // or replace core mixins with your own
45 | 'viewer/_ConfigMixin', // manage the Configuration
46 | 'viewer/_LayoutMixin', // build and manage the Page Layout and User Interface
47 | 'viewer/_MapMixin', // build and manage the Map
48 | 'viewer/_WidgetsMixin', // build and manage the Widgets
49 | // 'viewer/_WebMapMixin' // for WebMaps
50 | 'viewer/_SidebarMixin' // for mobile sidebar
51 | //'config/_customMixin'
52 |
53 | ], function (
54 | declare,
55 |
56 | _ControllerBase,
57 | _ConfigMixin,
58 | _LayoutMixin,
59 | _MapMixin,
60 | _WidgetsMixin,
61 | // _WebMapMixin
62 | _SidebarMixin
63 | //_MyCustomMixin
64 |
65 | ) {
66 | var App = declare([
67 | // Mixin for Mobile Sidebar
68 | _SidebarMixin,
69 | _LayoutMixin,
70 | _WidgetsMixin,
71 | // _WebMapMixin,
72 | _MapMixin,
73 | _ConfigMixin,
74 | _ControllerBase
75 | ]);
76 | var app = new App();
77 | app.startup();
78 | });
79 | })();
80 |
--------------------------------------------------------------------------------
/config/basemapToggle.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 5,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Basemap Toggle Example',
13 | subHeader: 'This is an example of using a basemap toggle',
14 | pageTitle: 'CMV Basemap Toggle Example'
15 | },
16 |
17 | panes: {
18 | left: {
19 | collapsible: false,
20 | style: 'display:none'
21 | }
22 | },
23 | collapseButtonsPane: 'center', //center or outer
24 |
25 | operationalLayers: [],
26 |
27 | widgets: {
28 | basemaps: {
29 | include: true,
30 | id: 'basemaps',
31 | type: 'domNode',
32 | path: 'esri/dijit/BasemapToggle',
33 | srcNodeRef: 'basemapsDijit',
34 | options: {
35 | map: true,
36 | basemap: 'satellite'
37 | }
38 | }
39 | }
40 | });
--------------------------------------------------------------------------------
/config/basemaps.js:
--------------------------------------------------------------------------------
1 | define([], function () {
2 |
3 | return {
4 | map: true, // needs a reference to the map
5 | // define all valid basemaps here.
6 | basemaps: {
7 | streets: {},
8 | 'streets-night-vector': {}, // requires v3.16 or higher
9 | 'streets-navigation-vector': {}, // requires v3.16 or higher
10 | 'streets-relief-vector': {}, // requires v3.16 or higher
11 | satellite: {},
12 | hybrid: {},
13 | topo: {},
14 | terrain: {},
15 | 'gray-vector': {}, // requires v3.16 or higher
16 | 'dark-gray-vector': {}, // requires v3.16 or higher
17 | oceans: {},
18 | 'national-geographic': {},
19 | osm: {}
20 | }
21 | };
22 | });
--------------------------------------------------------------------------------
/config/disclaimer.html:
--------------------------------------------------------------------------------
1 |
2 | This application contains layers generated from differing datasets and datum. This was utilized due to the nature and extent of the data. As a result you may see differences in contouring by as much as three feet.
3 |
4 | Do not make any business decisions based on this data before validating the information with the original data provider.
5 |
6 |
--------------------------------------------------------------------------------
/config/disclaimer.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 5,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Disclaimer Widget',
13 | subHeader: 'This is an example of using a disclaimer',
14 | pageTitle: 'CMV Disclaimer Widget'
15 | },
16 |
17 | panes: {
18 | left: {
19 | collapsible: false,
20 | style: 'display:none'
21 | }
22 | },
23 | collapseButtonsPane: 'center', //center or outer
24 |
25 | operationalLayers: [],
26 |
27 | widgets: {
28 | disclaimer: {
29 | include: true,
30 | id: 'disclaimer',
31 | type: 'floating',
32 | path: 'widgets/Disclaimer',
33 | title: 'Attention!!!',
34 | iconClass: 'fas fa-exclamation-circle',
35 | preload: true,
36 | paneOptions: {
37 | className: 'floating-disclaimer',
38 | style: 'height:320px;width:350px;'
39 | },
40 | options: {
41 |
42 | // you can customize the button text
43 | i18n: {
44 | // accept: 'Arghhhh!',
45 | // decline: 'Run Away!'
46 | },
47 |
48 | // you can put your content right in the config
49 | //content: 'Abandon all hope, ye who enter here...
'
50 |
51 | // or you can provide the url for another page with the content
52 | href: 'config/disclaimer.html'
53 |
54 | // the url to go to, if the user declines
55 | //declineHref: 'http://esri.com/'
56 |
57 | }
58 |
59 | }
60 | }
61 | });
--------------------------------------------------------------------------------
/config/elevationProfile.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'topo',
6 | center: [-120.0417, 39.0917],
7 | zoom: 10,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Elevation Profile Example',
13 | subHeader: 'This is an example of using the Elevation Profile widget',
14 | pageTitle: 'CMV Elevation Profile Widget'
15 | },
16 |
17 | collapseButtonsPane: 'center', //center or outer
18 |
19 | panes: {
20 | bottom: {
21 | id: 'sidebarBottom',
22 | placeAt: 'outer',
23 | splitter: true,
24 | collapsible: true,
25 | region: 'bottom',
26 | open: 'none', // using false doesn't work
27 | style: 'height: 350px',
28 | content: '
'
29 | }
30 | },
31 |
32 | operationalLayers: [],
33 |
34 | widgets: {
35 | growler: {
36 | include: true,
37 | id: 'growler',
38 | type: 'domNode',
39 | path: 'gis/dijit/Growler',
40 | srcNodeRef: 'growlerDijit',
41 | options: {}
42 | },
43 | elevationProfile: {
44 | include: true,
45 | type: 'titlePane',
46 | path: 'widgets/ElevationProfile',
47 | canFloat: true,
48 | title: 'Elevation Profile',
49 | iconClass: 'fas fa-fw fa-chart-area',
50 | open: true,
51 | position: 0,
52 | options: {
53 | map: true
54 | }
55 | },
56 |
57 | attributesTable: {
58 | include: true,
59 | id: 'attributesContainer',
60 | type: 'domNode',
61 | srcNodeRef: 'attributesContainer',
62 | path: 'widgets/AttributesTable',
63 | options: {
64 | map: true,
65 | mapClickMode: true,
66 |
67 | // use a tab container for multiple tables or
68 | // show only a single table
69 | useTabs: true,
70 |
71 | // used to open the sidebar after a query has completed
72 | sidebarID: 'sidebarBottom'
73 | }
74 | }
75 |
76 | }
77 | });
78 |
--------------------------------------------------------------------------------
/config/exportGraphics.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 5,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Export Graphics Widget',
13 | subHeader: 'This is an example of exporting graphics from specific layers',
14 | pageTitle: 'CMV Export Graphics Widget'
15 | },
16 |
17 | collapseButtonsPane: 'center', //center or outer
18 |
19 | operationalLayers: [],
20 |
21 | widgets: {
22 | growler: {
23 | include: true,
24 | id: 'growler',
25 | type: 'domNode',
26 | path: 'gis/dijit/Growler',
27 | srcNodeRef: 'growlerDijit',
28 | options: {}
29 | },
30 |
31 | drawContentPane: {
32 | include: true,
33 | id: 'drawContentPane',
34 | type: 'titlePane',
35 | title: 'Drawing',
36 | path: 'dijit/layout/ContentPane',
37 | iconClass: 'fas fa-fw fa-paint-brush',
38 | position: 0,
39 | open: true,
40 | options: {
41 | content: '
'
42 | }
43 | },
44 |
45 | draw: {
46 | include: true,
47 | id: 'draw',
48 | type: 'domNode',
49 | srcNodeRef: 'drawDijit',
50 | path: 'gis/dijit/Draw',
51 | options: {
52 | map: true,
53 | style: 'padding-bottom:15px;border-bottom: 1px solid #CCC;',
54 | mapClickMode: true
55 | }
56 | },
57 |
58 | exportGraphics: {
59 | include: true,
60 | id: 'exportGraphics',
61 | type: 'domNode',
62 | srcNodeRef: 'exportGraphicsDijit',
63 | path: 'widgets/ExportGraphics',
64 | options: {
65 | map: true,
66 |
67 | exportOptions: {
68 | excel: false,
69 | xlsExcel: false,
70 | csv: false,
71 |
72 | shapefile: true,
73 | kml: true,
74 | kmz: true,
75 | geojson: false,
76 | topojson: false,
77 | wkt: false,
78 |
79 | defaultExportType: 'shapefile',
80 | // this option can be a string or a function that returns
81 | // a string.
82 | //
83 | // filename: 'my_results'
84 | filename: function () {
85 | var date = new Date();
86 | return 'export_graphics_' + date.toLocaleDateString();
87 | }
88 | }
89 |
90 | }
91 | },
92 |
93 | exportDialog: {
94 | include: true,
95 | id: 'export',
96 | type: 'floating',
97 | path: 'widgets/Export',
98 | title: ' Export',
99 | preload: true,
100 | options: {}
101 | }
102 | }
103 | });
104 |
--------------------------------------------------------------------------------
/config/fullscreen.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 5,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Full Screen Widget',
13 | subHeader: 'This is an example of maximizing the map to full screen',
14 | pageTitle: 'CMV Full Screen Widget'
15 | },
16 |
17 | panes: {
18 | left: {
19 | content: '
Full Screen Widget This pane will collapse when the map is full screen.'
20 | }
21 | },
22 | collapseButtonsPane: 'center', //center or outer
23 |
24 | operationalLayers: [],
25 |
26 | widgets: {
27 | fullScreen: {
28 | include: true,
29 | id: 'fullScreen',
30 | type: 'domNode',
31 | path: 'widgets/FullScreen',
32 | srcNodeRef: 'homeButton',
33 | options: {}
34 | },
35 | basemaps: {
36 | include: true,
37 | id: 'basemaps',
38 | type: 'domNode',
39 | path: 'gis/dijit/Basemaps',
40 | srcNodeRef: 'basemapsDijit',
41 | options: 'config/basemaps'
42 | }
43 | }
44 | });
45 |
--------------------------------------------------------------------------------
/config/heatmap.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: true,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 3,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Heatmap Widget',
13 | subHeader: 'This is an example of the CMV Heatmap widget',
14 | pageTitle: 'CMV Heatmap Widget'
15 | },
16 |
17 | operationalLayers: [
18 | {
19 | type: 'feature',
20 | url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/Earthquakes_Since1970/MapServer/0',
21 | title: 'Earthquakes Since 1970',
22 | options: {
23 | id: 'earthquakes',
24 | opacity: 1.0,
25 | visible: true,
26 | mode: 0
27 | }
28 | },
29 | {
30 | type: 'feature',
31 | url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer/0',
32 | title: 'Cities',
33 | options: {
34 | id: 'cities',
35 | opacity: 1.0,
36 | visible: false
37 | }
38 | }
39 | ],
40 |
41 | widgets: {
42 |
43 | layerControl: {
44 | include: true,
45 | id: 'layerControl',
46 | type: 'titlePane',
47 | path: 'gis/dijit/LayerControl',
48 | title: 'Layers',
49 | iconClass: 'fas fa-th-list',
50 | open: false,
51 | position: 0,
52 | preload: true,
53 | options: {
54 | map: true,
55 | layerControlLayerInfos: true,
56 | separated: true
57 | }
58 | },
59 |
60 | heatmap: {
61 | include: true,
62 | id: 'heatmap',
63 | type: 'titlePane',
64 | title: 'Heatmap',
65 | iconClass: 'fas fa-fire',
66 | open: true,
67 | position: 1,
68 | path: 'widgets/Heatmap',
69 | options: {
70 | map: true,
71 | layerControlLayerInfos: true,
72 | layers: [
73 | //{id: 'earthquakes', fields: ['magnitude', 'num_deaths']}
74 | ]
75 | }
76 | },
77 | messagebox: {
78 | include: true,
79 | id: 'messagebox',
80 | type: 'invisible',
81 | path: 'widgets/MessageBox',
82 | options: {}
83 | }
84 | }
85 | });
--------------------------------------------------------------------------------
/config/introduction.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 3,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Introduction Widget',
13 | subHeader: 'This is an example of the CMV Introduction widget',
14 | pageTitle: 'CMV Introduction Widget'
15 | },
16 |
17 | operationalLayers: [
18 | {
19 | type: 'dynamic',
20 | url: 'https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/PublicSafety/PublicSafetyOperationalLayers/MapServer',
21 | title: 'Louisville Public Safety',
22 | options: {
23 | id: 'louisvillePubSafety',
24 | opacity: 1.0,
25 | visible: false
26 | }
27 | }
28 | ],
29 |
30 | widgets: {
31 |
32 | introduction: {
33 | include: true,
34 | id: 'introduction',
35 | type: 'invisible',
36 | path: 'widgets/Introduction',
37 | options: 'config/introductionWidget'
38 | },
39 |
40 | search: {
41 | include: true,
42 | type: 'domNode',
43 | path: 'esri/dijit/Search',
44 | srcNodeRef: 'geocoderButton',
45 | options: {
46 | map: true,
47 | visible: true,
48 | enableInfoWindow: false,
49 | enableButtonMode: false,
50 | expanded: false
51 | }
52 | },
53 |
54 | layerControl: {
55 | include: true,
56 | id: 'layerControl',
57 | type: 'titlePane',
58 | path: 'gis/dijit/LayerControl',
59 | title: 'Layers',
60 | iconClass: 'fas fa-th-list',
61 | open: true,
62 | position: 0,
63 | options: {
64 | map: true,
65 | layerControlLayerInfos: true
66 | }
67 | },
68 |
69 | measure: {
70 | include: true,
71 | id: 'measurement',
72 | type: 'titlePane',
73 | canFloat: true,
74 | path: 'gis/dijit/Measurement',
75 | title: 'Measure',
76 | iconClass: 'fas fa-fw fa-expand',
77 | open: false,
78 | position: 1,
79 | options: {
80 | map: true,
81 | mapClickMode: true
82 | }
83 | },
84 |
85 | print: {
86 | include: true,
87 | id: 'print',
88 | type: 'titlePane',
89 | canFloat: true,
90 | path: 'gis/dijit/Print',
91 | title: 'Print',
92 | iconClass: 'fas fa-fw fa-print',
93 | open: false,
94 | position: 2,
95 | options: {
96 | map: true,
97 | printTaskURL: 'https://utility.arcgisonline.com/arcgis/rest/services/Utilities/PrintingTools/GPServer/Export%20Web%20Map%20Task'
98 | }
99 | }
100 |
101 | }
102 | });
--------------------------------------------------------------------------------
/config/locatorControl.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 5,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Locator Control Widget',
13 | subHeader: 'This is an example of using the Locator Control widget',
14 | pageTitle: 'CMV Locator Conntrol Widget'
15 | },
16 |
17 | panes: {
18 | left: {
19 | collapsible: false,
20 | style: 'display:none'
21 | }
22 | },
23 | collapseButtonsPane: 'center', //center or outer
24 |
25 | operationalLayers: [],
26 |
27 | widgets: {
28 | growler: {
29 | include: true,
30 | id: 'growler',
31 | type: 'domNode',
32 | path: 'gis/dijit/Growler',
33 | srcNodeRef: 'growlerDijit',
34 | options: {}
35 | },
36 | locateButton: {
37 | include: true,
38 | id: 'locateButton',
39 | type: 'domNode',
40 | path: 'gis/dijit/LocateButton',
41 | srcNodeRef: 'homeButton',
42 | options: {
43 | map: true,
44 | scale: 1000,
45 | highlightLocation: true,
46 | useTracking: false,
47 | clearOnTrackingStop: true,
48 | geolocationOptions: {
49 | maximumAge: 0,
50 | timeout: 5000,
51 | enableHighAccuracy: true
52 | }
53 | }
54 | },
55 | locatorControl: {
56 | include: true,
57 | id: 'locatorControl',
58 | type: 'floating',
59 | path: 'widgets/LocatorControl',
60 | title: 'Locator Settings',
61 | iconClass: 'fas fa-compass',
62 | preload: true,
63 | options: {
64 | html: ' ',
65 | domTarget: 'locateButton',
66 | openOnStartup: true
67 | }
68 | }
69 | }
70 | });
71 |
--------------------------------------------------------------------------------
/config/mapLoading.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'esri/layers/ImageParameters'
3 | ], function (ImageParameters) {
4 |
5 | var imageParameters = new ImageParameters();
6 | imageParameters.format = 'png32';
7 |
8 | return {
9 | isDebug: false,
10 |
11 | mapOptions: {
12 | basemap: 'streets',
13 | center: [-96.59179687497497, 39.09596293629694],
14 | zoom: 5,
15 | sliderStyle: 'small'
16 | },
17 |
18 | titles: {
19 | header: 'CMV MapLoader Widget',
20 | subHeader: 'This is an example of using a Map Loader',
21 | pageTitle: 'CMV MapLoader'
22 | },
23 |
24 | panes: {
25 | left: {
26 | collapsible: false,
27 | style: 'display:none'
28 | }
29 | },
30 |
31 | collapseButtonsPane: 'center', //center or outer
32 |
33 | operationalLayers: [
34 | {
35 | type: 'dynamic',
36 | url: 'https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/PublicSafety/PublicSafetyOperationalLayers/MapServer',
37 | title: 'Louisville Public Safety',
38 | options: {
39 | id: 'louisvillePubSafety',
40 | opacity: 1.0,
41 | visible: true,
42 | imageParameters: imageParameters
43 | }
44 | },
45 | {
46 | type: 'dynamic',
47 | url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/DamageAssessment/MapServer',
48 | title: 'Damage Assessment',
49 | options: {
50 | id: 'DamageAssessment',
51 | opacity: 1.0,
52 | visible: true,
53 | imageParameters: imageParameters
54 | }
55 | },
56 | {
57 | type: 'dynamic',
58 | url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer',
59 | title: 'Cities',
60 | options: {
61 | id: 'cities',
62 | opacity: 0.7,
63 | visible: true,
64 | imageParameters: imageParameters
65 | }
66 | }
67 | ],
68 |
69 | widgets: {
70 | mapLoading: {
71 | include: true,
72 | type: 'map',
73 | path: 'widgets/MapLoading',
74 | options: {
75 | map: true
76 | }
77 | }
78 | }
79 | };
80 | });
--------------------------------------------------------------------------------
/config/mapillary.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: true,
3 |
4 | mapOptions: {
5 | basemap: 'topo',
6 | center: [-122.435, 37.775],
7 | zoom: 13,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Mapillary Widget',
13 | subHeader: 'This is an example of displaying street level imagery from Mapillary',
14 | pageTitle: 'CMV Mapillary Widget'
15 | },
16 |
17 | collapseButtonsPane: 'center', //center or outer
18 |
19 | operationalLayers: [],
20 |
21 | widgets: {
22 | mapillary: {
23 | include: true,
24 | type: 'titlePane',
25 | title: 'Mapillary',
26 | iconClass: 'fas fa-location-arrow fa-rotate-90',
27 | open: true,
28 | position: 0,
29 | path: 'widgets/Mapillary',
30 | canFloat: true,
31 | paneOptions: {
32 | resizable: true,
33 | resizeOptions: {
34 | minSize: {
35 | w: 250,
36 | h: 250
37 | }
38 | }
39 | },
40 | options: {
41 | map: true,
42 | mapillaryOptions: {
43 | // this is for demo purposes only
44 | // get your own clientID at mapillary.com
45 | clientID: 'cjJ1SUtVOEMtdy11b21JM0tyYTZIQTpiNjQ0MTgzNTIzZGM2Mjhl',
46 | photoID: null
47 | }
48 | }
49 | }
50 | }
51 | });
52 |
--------------------------------------------------------------------------------
/config/maptiks.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'esri/layers/ImageParameters'
3 | ], function (ImageParameters) {
4 |
5 | var imageParameters = new ImageParameters();
6 | imageParameters.format = 'png32';
7 |
8 | return {
9 | isDebug: false,
10 |
11 | mapOptions: {
12 | basemap: 'streets',
13 | center: [-96.59179687497497, 39.09596293629694],
14 | zoom: 5,
15 | sliderStyle: 'small'
16 | },
17 |
18 | titles: {
19 | header: 'CMV Maptiks Widget',
20 | subHeader: 'This is an example of using the CMV Maptiks Widget',
21 | pageTitle: 'CMV Maptiks Widget'
22 | },
23 |
24 | collapseButtonsPane: 'center', //center or outer
25 |
26 | operationalLayers: [
27 | {
28 | type: 'dynamic',
29 | url: 'https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/PublicSafety/PublicSafetyOperationalLayers/MapServer',
30 | title: 'Louisville Public Safety',
31 | options: {
32 | id: 'louisvillePubSafety',
33 | opacity: 1.0,
34 | visible: true,
35 | imageParameters: imageParameters
36 | }
37 | },
38 | {
39 | type: 'dynamic',
40 | url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/DamageAssessment/MapServer',
41 | title: 'Damage Assessment',
42 | options: {
43 | id: 'DamageAssessment',
44 | opacity: 1.0,
45 | visible: true,
46 | imageParameters: imageParameters
47 | }
48 | },
49 | {
50 | type: 'dynamic',
51 | url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer',
52 | title: 'Cities',
53 | options: {
54 | id: 'cities',
55 | opacity: 0.7,
56 | visible: true,
57 | imageParameters: imageParameters
58 | }
59 | }
60 | ],
61 |
62 | widgets: {
63 | layerControl: {
64 | include: true,
65 | id: 'layerControl',
66 | type: 'titlePane',
67 | path: 'gis/dijit/LayerControl',
68 | title: 'Layers',
69 | iconClass: 'fas fa-th-list',
70 | open: true,
71 | position: 0,
72 | options: {
73 | map: true,
74 | layerControlLayerInfos: true
75 | }
76 | },
77 |
78 | maptiks: {
79 | include: true,
80 | type: 'map',
81 | path: 'widgets/Maptiks',
82 | options: {
83 | map: true,
84 | // signup and get your track code and id at https://maptiks.com/
85 | maptiksTrackcode: '',
86 | maptiksId: ''
87 | }
88 | }
89 | }
90 | };
91 | });
--------------------------------------------------------------------------------
/config/messagebox.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: true,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 5,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV MessageBox Widget',
13 | subHeader: 'This is an example of Confirm and Alert MessageBoxes',
14 | pageTitle: 'CMV MessageBox Widget'
15 | },
16 |
17 | panes: {
18 | left: {
19 | collapsible: false,
20 | style: 'display:none'
21 | }
22 | },
23 |
24 | operationalLayers: [],
25 |
26 | widgets: {
27 |
28 | // widget to create the MessageBox
29 | messagebox: {
30 | include: true,
31 | id: 'messagebox',
32 | type: 'invisible',
33 | path: 'widgets/MessageBox',
34 | options: {
35 | nameSpace: 'app' // optional namespace
36 | }
37 | },
38 |
39 | // simple widget to show how to open
40 | // and respond to a message box
41 | callMeAMessageBox: {
42 | include: true,
43 | id: 'callMeAMessageBox',
44 | type: 'invisible',
45 | path: 'dijit/_WidgetBase',
46 | options: {
47 | map: true,
48 | startup: function () {
49 | // waiting a second. not normally needed when used in your code
50 | window.setTimeout(function () {
51 |
52 | // use the same namespace defined in the messagebox options above
53 | // can be called from anywhere in your code
54 | var mb = window.app.MessageBox;
55 | mb.confirm({
56 | title: 'Delete Feature?',
57 | content: 'Are you sure you want to delete this feature? This action cannot be undone.'
58 | }).then(
59 | function (result) {
60 | // respond based on the results returned from the confirm MessageBox
61 | if (result === mb.okMessage) {
62 | mb.alert({
63 | title: 'Feature Deleted',
64 | content: 'You chose to delete the feature.'
65 | });
66 | } else if (result === mb.cancelMessage) {
67 | mb.alert({
68 | title: 'NOT Deleted',
69 | content: 'You chose NOT to delete the feature.'
70 | });
71 | }
72 | },
73 | function (/* result */) {}
74 | );
75 | }, 1000);
76 | }
77 | }
78 | }
79 | }
80 | });
--------------------------------------------------------------------------------
/config/openexternalmap.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'topo',
6 | center: [-122.385, 37.615],
7 | zoom: 12,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Open External Map Widget',
13 | subHeader: 'This is an example of using the Open External Map widget',
14 | pageTitle: 'CMV Open External Map Widget'
15 | },
16 |
17 | panes: {
18 | left: {
19 | style: 'width:350px;'
20 | }
21 | },
22 | collapseButtonsPane: 'center', //center or outer
23 |
24 | operationalLayers: [],
25 |
26 | widgets: {
27 | growler: {
28 | include: true,
29 | id: 'growler',
30 | type: 'domNode',
31 | path: 'gis/dijit/Growler',
32 | srcNodeRef: 'growlerDijit',
33 | options: {}
34 | },
35 | externalmap: {
36 | include: true,
37 | id: 'externalmap',
38 | type: 'titlePane',
39 | canFloat: true,
40 | position: 0,
41 | path: 'widgets/OpenExternalMap',
42 | title: 'Open External Map',
43 | open: true,
44 | options: {
45 | map: true
46 | }
47 | },
48 | toggleStreetViewTiles: {
49 | include: true,
50 | type: 'invisible',
51 | path: 'widgets/ToggleStreetViewTiles',
52 | options: {
53 | map: true
54 | }
55 | }
56 | }
57 | });
--------------------------------------------------------------------------------
/config/printplus.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'esri/config',
3 | 'esri/tasks/GeometryService'
4 | ], function (esriConfig, GeometryService) {
5 |
6 | esriConfig.defaults.geometryService = new GeometryService('https://tasks.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer');
7 |
8 | return {
9 | isDebug: true,
10 |
11 | mapOptions: {
12 | basemap: 'topo',
13 | center: [-120.0417, 39.0917],
14 | zoom: 10,
15 | sliderStyle: 'small'
16 | },
17 |
18 | titles: {
19 | header: 'CMV PrintPlus Widget',
20 | subHeader: 'This is an example of the PrintPlus Widget',
21 | pageTitle: 'CMV PrintPlus Widget'
22 | },
23 |
24 | collapseButtonsPane: 'center', //center or outer
25 |
26 | operationalLayers: [],
27 |
28 | widgets: {
29 | growler: {
30 | include: true,
31 | id: 'growler',
32 | type: 'domNode',
33 | path: 'gis/dijit/Growler',
34 | srcNodeRef: 'growlerDijit',
35 | options: {}
36 | },
37 | print: {
38 | include: true,
39 | id: 'print',
40 | type: 'titlePane',
41 | path: 'widgets/PrintPlus',
42 | canFloat: false,
43 | title: 'Print Plus',
44 | iconClass: 'fas fa-print',
45 | open: true,
46 | position: 0,
47 | options: 'config/printplusWidget'
48 | }
49 | }
50 | };
51 | });
--------------------------------------------------------------------------------
/config/qrcode.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'topo',
6 | center: [-122.385, 37.615],
7 | zoom: 12,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV QR Code Widget',
13 | subHeader: 'This is an example of using the QR Code widget',
14 | pageTitle: 'CMV QRCode Widget'
15 | },
16 |
17 | collapseButtonsPane: 'center', //center or outer
18 |
19 | operationalLayers: [],
20 |
21 | widgets: {
22 | qrcode: {
23 | include: true,
24 | type: 'titlePane',
25 | position: 0,
26 | path: 'widgets/QRCode',
27 | title: 'QR Code',
28 | iconClass: 'fas fa-qrcode',
29 | open: true,
30 | options: {
31 | map: true
32 | }
33 | }
34 | }
35 | });
--------------------------------------------------------------------------------
/config/queryStringSearch.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/io-query'
3 | ], function (ioQuery) {
4 |
5 | var uri = window.location.href;
6 | var qs = uri.substring(uri.indexOf('?') + 1, uri.length);
7 | var qsObj = ioQuery.queryToObject(qs);
8 | var fips = qsObj.fips || '';
9 |
10 | return {
11 | isDebug: false,
12 |
13 | mapOptions: {
14 | basemap: 'streets',
15 | center: [-96.59179687497497, 39.09596293629694],
16 | zoom: 5,
17 | sliderStyle: 'small'
18 | },
19 |
20 | panes: {
21 | left: {
22 | collapsible: false,
23 | style: 'display:none'
24 | },
25 | bottom: {
26 | id: 'sidebarBottom',
27 | placeAt: 'outer',
28 | splitter: true,
29 | collapsible: true,
30 | region: 'bottom',
31 | style: 'height:200px;',
32 | content: '
'
33 | }
34 | },
35 |
36 | operationalLayers: [],
37 |
38 | widgets: {
39 | growler: {
40 | include: true,
41 | id: 'growler',
42 | type: 'domNode',
43 | path: 'gis/dijit/Growler',
44 | srcNodeRef: 'growlerDijit',
45 | options: {}
46 | },
47 | attributesTable: {
48 | include: true,
49 | id: 'attributesContainer',
50 | type: 'domNode',
51 | srcNodeRef: 'attributesContainer',
52 | path: 'widgets/AttributesTable',
53 | options: {
54 | map: true,
55 | mapClickMode: true,
56 |
57 | // use a tab container for multiple tables or
58 | // show only a single table
59 | useTabs: false,
60 |
61 | // used to open the sidebar after a query has completed
62 | sidebarID: 'sidebarBottom',
63 |
64 | tables: [
65 | {
66 | title: 'Census',
67 | topicID: 'censusQuery',
68 | queryOptions: {
69 | queryParameters: {
70 | url: 'https://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Census_USA/MapServer/4',
71 | where: 'FIPS = \'' + fips + '\''
72 | },
73 | idProperty: 'ObjectID'
74 | },
75 | toolbarOptions: {
76 | show: false
77 | }
78 | }
79 | ]
80 | }
81 | }
82 | }
83 | };
84 | });
--------------------------------------------------------------------------------
/config/report.js:
--------------------------------------------------------------------------------
1 | define([], function () {
2 |
3 | return {
4 | isDebug: false,
5 |
6 | //default mapClick mode, mapClickMode lets widgets know what mode the map is in to avoid multipult map click actions from taking place (ie identify while drawing).
7 | defaultMapClickMode: 'identify',
8 | mapOptions: {
9 | basemap: 'hybrid',
10 | center: [-122.6314, 38.2658],
11 | zoom: 19,
12 | sliderStyle: 'small'
13 | },
14 |
15 | titles: {
16 | header: 'CMV Report Widget',
17 | subHeader: 'Identify a parcel by clicking the map',
18 | pageTitle: 'CMV Report Widget'
19 | },
20 |
21 | panes: {
22 | left: {
23 | collapsible: false,
24 | style: 'display:none'
25 | }
26 | },
27 | collapseButtonsPane: 'center', //center or outer
28 |
29 | operationalLayers: [
30 | {
31 | type: 'dynamic',
32 | url: 'http://gis-webpub.sonoma-county.org/arcgis/rest/services/BaseMap/Parcels/MapServer',
33 | title: 'Parcels',
34 | options: {
35 | id: 'parcels',
36 | opacity: 1
37 | }
38 | }
39 | ],
40 |
41 | widgets: {
42 | growler: {
43 | include: true,
44 | id: 'growler',
45 | type: 'domNode',
46 | path: 'gis/dijit/Growler',
47 | srcNodeRef: 'growlerDijit',
48 | options: {}
49 | },
50 | identify: {
51 | include: true,
52 | id: 'identify',
53 | type: 'invisible',
54 | path: 'gis/dijit/Identify',
55 | options: {
56 | map: true,
57 | mapClickMode: true,
58 | mapRightClickMenu: true,
59 | identifyLayerInfos: true,
60 | identifyTolerance: 5,
61 | identifies: {
62 | parcels: {
63 | 0: {
64 | fieldInfos: [
65 | {
66 | fieldName: 'APN',
67 | visible: true
68 | },
69 | {
70 | fieldName: 'Reports',
71 | visible: true,
72 | formatter: function () {
73 | return 'Parcel Report ';
74 | },
75 | useExpression: false
76 | }
77 | ]
78 | }
79 | }
80 | }
81 | }
82 | },
83 | report: {
84 | include: true,
85 | id: 'report',
86 | type: 'invisible',
87 | path: 'widgets/Report',
88 | options: 'config/reportWidget'
89 | },
90 | reportReactor: {
91 | include: true,
92 | id: 'reportReactor',
93 | type: 'invisible',
94 | path: 'widgets/ReportReactor',
95 | options: {
96 | map: true
97 | }
98 | }
99 | }
100 | };
101 | });
--------------------------------------------------------------------------------
/config/share.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 5,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Sharing Widget',
13 | subHeader: 'This is an example of using the Sharing widget',
14 | pageTitle: 'CMV Sharing Widget'
15 | },
16 |
17 |
18 | panes: {
19 | left: {
20 | collapsible: false,
21 | style: 'display:none'
22 | }
23 | },
24 | collapseButtonsPane: 'center', //center or outer
25 |
26 | operationalLayers: [],
27 |
28 | widgets: {
29 | share: {
30 | include: true,
31 | id: 'share',
32 | type: 'floating',
33 | path: 'widgets/Share',
34 | title: 'Share This Map',
35 | iconClass: 'fas fa-share-alt',
36 | preload: true,
37 | paneOptions: {
38 | draggable: false,
39 | html: ' link '.replace('link', 'Share'),
40 | domTarget: 'helpDijit',
41 | style: 'height:390px;width:285px;'
42 | },
43 | options: {
44 | map: true,
45 | draggable: true
46 | }
47 | }
48 | }
49 | });
--------------------------------------------------------------------------------
/config/what3words.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'esri/config'
3 | ], function (esriConfig) {
4 |
5 | esriConfig.defaults.io.corsEnabledServers.push('api.what3words.com');
6 |
7 | return {
8 | isDebug: false,
9 |
10 | mapOptions: {
11 | basemap: 'streets',
12 | center: [-96.59179687497497, 39.09596293629694],
13 | zoom: 5,
14 | sliderStyle: 'small'
15 | },
16 |
17 | titles: {
18 | header: 'CMV what3words Widget',
19 | subHeader: 'This is an example of using what3words',
20 | pageTitle: 'CMV what3words Widget'
21 | },
22 |
23 | collapseButtonsPane: 'center', //center or outer
24 |
25 | operationalLayers: [],
26 |
27 | widgets: {
28 | growler: {
29 | include: true,
30 | id: 'growler',
31 | type: 'domNode',
32 | path: 'gis/dijit/Growler',
33 | srcNodeRef: 'growlerDijit',
34 | options: {}
35 | },
36 | what3words: {
37 | include: true,
38 | id: 'what3words',
39 | type: 'titlePane',
40 | title: 'what3words',
41 | canFloat: true,
42 | position: 0,
43 | open: true,
44 | path: 'widgets/What3Words',
45 | options: {
46 | map: true,
47 | key: '123456'
48 | }
49 | }
50 | }
51 | };
52 | });
--------------------------------------------------------------------------------
/config/zoomToFeature-multiple.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 5,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Multiple Zoom To Feature Widgets',
13 | subHeader: 'This is an example of including multiple widgets in the same titlePane',
14 | pageTitle: 'CMV Mutiple Zoom To Feature Widgets'
15 | },
16 |
17 | collapseButtonsPane: 'center', //center or outer
18 |
19 | operationalLayers: [],
20 |
21 | widgets: {
22 | zoomContent: {
23 | include: true,
24 | id: 'zoomContent',
25 | type: 'titlePane',
26 | title: 'Zoom to A County',
27 | path: 'dijit/layout/ContentPane',
28 | position: 0,
29 | open: true,
30 | options: {
31 | content: '
'
32 | }
33 | },
34 | anotherWidget: {
35 | include: true,
36 | id: 'anotherWidget',
37 | type: 'titlePane',
38 | title: 'Another widget',
39 | path: 'dijit/layout/ContentPane',
40 | position: 1,
41 | open: false,
42 | options: {}
43 | },
44 | zoomToFeature1: {
45 | include: true,
46 | type: 'domNode',
47 | id: 'zoomToFeature1',
48 | srcNodeRef: 'zoomToDijit-1',
49 | path: 'widgets/ZoomToFeature',
50 | options: {
51 | map: true,
52 | // you can customize the button text
53 | i18n: {
54 | selectFeature: 'California County'
55 | },
56 | url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/2',
57 | field: 'NAME',
58 | where: 'STATE_FIPS = \'06\''
59 | }
60 | },
61 | zoomToFeature2: {
62 | include: true,
63 | type: 'domNode',
64 | id: 'zoomToFeature2',
65 | srcNodeRef: 'zoomToDijit-2',
66 | path: 'widgets/ZoomToFeature',
67 | options: {
68 | map: true,
69 | // you can customize the button text
70 | i18n: {
71 | selectFeature: 'Kansas County'
72 | },
73 | style: 'margin-top:50px;',
74 | url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/2',
75 | field: 'NAME',
76 | where: 'STATE_FIPS = \'20\''
77 | }
78 | },
79 | zoomToFeature3: {
80 | include: true,
81 | type: 'domNode',
82 | id: 'zoomToFeature3',
83 | srcNodeRef: 'zoomToDijit-3',
84 | path: 'widgets/ZoomToFeature',
85 | options: {
86 | map: true,
87 | // you can customize the button text
88 | i18n: {
89 | selectFeature: 'South Carolina County'
90 | },
91 | style: 'margin-top:50px;',
92 | url: 'http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/2',
93 | field: 'NAME',
94 | where: 'STATE_FIPS = \'45\''
95 | }
96 | }
97 | }
98 | });
--------------------------------------------------------------------------------
/config/zoomToFeature.js:
--------------------------------------------------------------------------------
1 | define({
2 | isDebug: false,
3 |
4 | mapOptions: {
5 | basemap: 'streets',
6 | center: [-96.59179687497497, 39.09596293629694],
7 | zoom: 5,
8 | sliderStyle: 'small'
9 | },
10 |
11 | titles: {
12 | header: 'CMV Zoom To Feature Widget',
13 | subHeader: 'This is an example of zooming to a feature',
14 | pageTitle: 'CMV Zoom To Feature Widget'
15 | },
16 |
17 | collapseButtonsPane: 'center', //center or outer
18 |
19 | operationalLayers: [],
20 |
21 | widgets: {
22 | zoomToFeature: {
23 | include: true,
24 | id: 'zoomToFeature',
25 | type: 'titlePane',
26 | title: 'Zoom to A California County',
27 | iconClass: 'fas fa-search-location',
28 | position: 0,
29 | open: true,
30 | path: 'widgets/ZoomToFeature',
31 | options: {
32 | map: true,
33 | // you can customize the button text
34 | i18n: {
35 | selectFeature: 'Select A County'
36 | },
37 | url: 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/2',
38 | field: 'NAME',
39 | where: 'STATE_FIPS = \'06\''
40 | }
41 | }
42 | }
43 | });
--------------------------------------------------------------------------------
/css/cmv.css:
--------------------------------------------------------------------------------
1 | html, body {
2 | height: 100%;
3 | width: 100%;
4 | overflow: hidden;
5 | }
6 |
7 | body {
8 | font-weight: 300;
9 | background-color: #333;
10 | color: #fff;
11 | }
12 | a {
13 | font-weight: 400;
14 | color: #00CCFF;
15 | }
16 |
17 | a:hover {
18 | color: #fff;
19 | }
20 |
21 | .splash p {
22 | margin-top: 0.5em;
23 | margin-bottom: 1em;
24 | line-height: 1.6em;
25 | font-size: 18px;
26 | text-shadow: 2px 2px #000;
27 | }
28 |
29 | .splash h1 {
30 | font-weight: bold;
31 | font-size: 32px;
32 | text-shadow: 2px 2px #000;
33 | }
34 |
35 | .splash h2 {
36 | font-weight: bold;
37 | font-size: 24px;
38 | margin-bottom: 0.5em;
39 | text-shadow: 2px 2px #000;
40 | }
41 |
42 | .splash {
43 | height: 100%;
44 | padding-top: 4em;
45 | background-image: url('http://cmv.io/images/bg.jpg');
46 | background-position: center;
47 | background-size: cover;
48 | text-align: center;
49 | overflow-y: auto;
50 | }
51 |
52 | .navbar-default {
53 | position: absolute;
54 | background-color: rgba(0,0,0,0.8);
55 | margin-right: 18px;
56 | color: #fff;
57 | }
58 |
59 | .navbar-default .navbar-brand {
60 | font-size: 24px;
61 | font-weight: bold;
62 | background-image: url('http://cmv.io/images/rocket-logo.png');
63 | background-repeat: no-repeat;
64 | background-size: 60px;
65 | background-position: 0px 8px;
66 | padding-left: 70px;
67 | }
68 |
69 | .navbar-default .navbar-brand,
70 | .navbar-default .navbar-nav > li {
71 | font-weight: 400;
72 | }
73 |
74 | .btn {
75 | font-size: 22px;
76 | text-shadow: none;
77 | }
78 |
79 | .example {
80 | width: 100%;
81 | background-color: #FFF;
82 | border: 1px solid #999;
83 | padding: 8px;
84 | margin-bottom: 32px;
85 | box-shadow: 4px 4px #000;
86 | }
87 | .example img {
88 | width: 100%;
89 | border: 1px solid #999;
90 | }
91 |
92 | @media screen and (max-width: 767px) {
93 | .navbar-default .navbar-brand {
94 | font-size: 20px;
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/demo.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
36 |
44 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/images/attributesTables1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/attributesTables1.jpg
--------------------------------------------------------------------------------
/images/disclaimer1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/disclaimer1.jpg
--------------------------------------------------------------------------------
/images/disclaimer2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/disclaimer2.jpg
--------------------------------------------------------------------------------
/images/export1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/export1.jpg
--------------------------------------------------------------------------------
/images/exportgraphics1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/exportgraphics1.jpg
--------------------------------------------------------------------------------
/images/fullscreen1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/fullscreen1.jpg
--------------------------------------------------------------------------------
/images/geoprocessor1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/geoprocessor1.jpg
--------------------------------------------------------------------------------
/images/heatmap1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/heatmap1.jpg
--------------------------------------------------------------------------------
/images/identifypanel1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/identifypanel1.jpg
--------------------------------------------------------------------------------
/images/introduction1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/introduction1.jpg
--------------------------------------------------------------------------------
/images/introduction2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/introduction2.jpg
--------------------------------------------------------------------------------
/images/mapillary1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/mapillary1.jpg
--------------------------------------------------------------------------------
/images/messagebox1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/messagebox1.jpg
--------------------------------------------------------------------------------
/images/openexternalmap1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/openexternalmap1.jpg
--------------------------------------------------------------------------------
/images/printplus1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/printplus1.jpg
--------------------------------------------------------------------------------
/images/qrcode1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/qrcode1.jpg
--------------------------------------------------------------------------------
/images/report1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/report1.jpg
--------------------------------------------------------------------------------
/images/report2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/report2.jpg
--------------------------------------------------------------------------------
/images/search1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/search1.jpg
--------------------------------------------------------------------------------
/images/search2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/search2.jpg
--------------------------------------------------------------------------------
/images/share1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/share1.jpg
--------------------------------------------------------------------------------
/images/what3words1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/what3words1.jpg
--------------------------------------------------------------------------------
/images/zoomToFeature1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/images/zoomToFeature1.jpg
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "cmv-widgets",
3 | "version": "v1.14.10",
4 | "author": "Tim McGee, MoosePoint Technology",
5 | "license": "MIT",
6 | "year": "2018",
7 | "homepage": "https://tmcgee.github.io/cmv-widgets/",
8 | "repository": "https://github.com/tmcgee/cmv-widgets",
9 | "dependencies": {
10 | "csslint": "1.0.x",
11 | "eslint": "~7.32.0",
12 | "grunt": "~1.4.0",
13 | "grunt-postcss": "~0.9.0",
14 | "grunt-contrib-clean": "~2.0.0",
15 | "grunt-contrib-connect": "~2.1.0",
16 | "grunt-contrib-copy": "1.0.x",
17 | "grunt-contrib-csslint": "~2.0.0",
18 | "grunt-contrib-cssmin": "~3.0.0",
19 | "grunt-eslint": "23.0.0",
20 | "grunt-contrib-uglify": "~4.0.0",
21 | "grunt-contrib-watch": "~1.1.0",
22 | "grunt-newer": "~1.3.0",
23 | "grunt-open": "0.2.x",
24 | "grunt-contrib-compress": "~1.6.0",
25 | "snyk": "^1.321.0"
26 | },
27 | "engine": "node >= 8",
28 | "scripts": {
29 | "snyk-protect": "snyk protect",
30 | "prepublish": "npm run snyk-protect"
31 | },
32 | "snyk": true
33 | }
--------------------------------------------------------------------------------
/widgets/AttributesTable/css/AttributesTable.css:
--------------------------------------------------------------------------------
1 | /*csslint order-alphabetical: false */
2 | .cmvAttributesContainerWidget {
3 | height: 100%;
4 | width: 100%;
5 | }
6 | .attributesTabContainer {
7 | height: 100%;
8 | }
9 | .cmvAttributesTableWidget .attributesTableToolbar {
10 | position:absolute;
11 | top: 0;
12 | left: 0;
13 | right: 0;
14 | display:none;
15 | }
16 |
17 | .cmvAttributesTableWidget .attributesTableGrid {
18 | position:absolute;
19 | top: 0;
20 | left: 0;
21 | bottom: 0;
22 | right: 0;
23 | width: auto;
24 | height: auto;
25 | padding: 0;
26 | overflow: hidden;
27 | overflow-x: auto;
28 | }
29 |
30 | .cmvAttributesTableWidget .attributesTableZoomMenu,
31 | .cmvAttributesTableWidget .attributesTableClearMenu,
32 | .cmvAttributesTableWidget .attributesTableExportMenu {
33 | display: none;
34 | }
35 |
36 | .cmvAttributesTableWidget .attributesTableExportMenu {
37 | float: right;
38 | margin-right: 15px;
39 | }
40 |
41 | /*
42 | used with dgrid "column reorder" extension
43 | prevents the column header text from resizing when user mouses over header
44 | */
45 | .cmvAttributesTableWidget .dgrid .dgrid-header .dgrid-cell {
46 | display: table-cell;
47 | }
48 |
49 | /* for a floating widget, will this ever be used? */
50 | .floatingWidget .cmvAttributesTableWidget .attributesTableGrid {
51 | top: 0;
52 | height: 300px;
53 | position:relative;
54 | }
55 |
--------------------------------------------------------------------------------
/widgets/AttributesTable/nls/AttributesTable.js:
--------------------------------------------------------------------------------
1 | // http://dojotoolkit.org/reference-guide/1.10/dojo/i18n.html
2 | define({
3 | root: {
4 | messages: {
5 | searching: {
6 | title: 'Searching',
7 | message: 'Please wait...',
8 | level: 'info'
9 | },
10 |
11 | searchError: {
12 | title: 'Search Error',
13 | message: 'Sorry, an error occurred and your search could not be completed.'
14 | },
15 |
16 | confirmCloseTab: {
17 | title: 'Close Tab?',
18 | content: 'Do you really want to close this tab?'
19 | },
20 |
21 |
22 | searchResults: {
23 | title: 'Search Results',
24 | message: null,
25 | noFeatures: 'No features',
26 | newFeatures: 'new',
27 | feature: 'feature',
28 | features: 'features',
29 | found: 'found',
30 | total: 'total'
31 | }
32 | },
33 |
34 | menus: {
35 | zoom: {
36 | title: 'Zoom',
37 | zoomToFeatures: 'Zoom To All Features',
38 | zoomToSelectedFeatures: 'Zoom To Selected Feature(s)',
39 | zoomToSourceGraphics: 'Zoom To Source Graphic(s)',
40 | zoomToBuffer: 'Zoom To Buffer'
41 | },
42 |
43 | view: {
44 | title: 'Display',
45 | showAllRecords: 'Display All Records',
46 | showOnlySelectedRecords: 'Display Only Selected Record(s)'
47 | },
48 |
49 | clear: {
50 | title: 'Clear',
51 | clearFeatures: 'Clear All Features',
52 | clearSelectedFeatures: 'Clear Selected Feature(s)',
53 | clearSourceGraphics: 'Clear Source Graphic(s)',
54 | clearBufferGraphics: 'Clear Buffer',
55 | clearGrid: 'Clear Grid',
56 | clearAll: 'Clear All',
57 | clearSelectedRecords: 'Clear Selected Record(s)'
58 | },
59 |
60 | 'export': {
61 | title: 'Export'
62 | }
63 | }
64 | }
65 | });
66 |
--------------------------------------------------------------------------------
/widgets/Disclaimer.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dojo/cookie',
4 |
5 | 'dijit/_WidgetBase',
6 | 'dijit/_TemplatedMixin',
7 | 'dijit/_WidgetsInTemplateMixin',
8 | 'gis/dijit/_FloatingWidgetMixin',
9 |
10 | 'dojo/text!./Disclaimer/templates/Disclaimer.html',
11 | 'dojo/i18n!./Disclaimer/nls/Disclaimer',
12 |
13 | 'dijit/layout/ContentPane',
14 | 'dijit/form/Form',
15 | 'dijit/form/Button',
16 |
17 | 'xstyle/css!./Disclaimer/css/Disclaimer.css'
18 |
19 | ], function (
20 | declare,
21 | cookie,
22 |
23 | _WidgetBase,
24 | _TemplatedMixin,
25 | _WidgetsInTemplateMixin,
26 | _FloatingWidgetMixin,
27 |
28 | DisclaimerTemplate,
29 | i18n
30 | ) {
31 |
32 | return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _FloatingWidgetMixin], {
33 | widgetsInTemplate: true,
34 | templateString: DisclaimerTemplate,
35 | defaultI18n: i18n,
36 | i18n: {},
37 | baseClass: 'cmvDisclaimerWidget',
38 | draggable: false,
39 |
40 | openOnStartup: true,
41 |
42 | content: '',
43 | href: null,
44 | declineHref: '#',
45 |
46 | useCookies: false,
47 | cookieName: 'skipCMVDisclaimer',
48 | cookieValue: 'true',
49 | cookieProps: {
50 | expires: new Date(Date.now() + (30 * 24 * 60 * 60 * 1000)) // show disclaimer every 30 days
51 | },
52 |
53 | postMixInProperties: function () {
54 | this.inherited(arguments);
55 | this.i18n = this.mixinDeep(this.defaultI18n, this.i18n);
56 | },
57 |
58 | postCreate: function () {
59 | this.inherited(arguments);
60 |
61 | this.messageNode.set('content', this.content);
62 | if (this.href) {
63 | this.messageNode.set('href', this.href);
64 | }
65 |
66 | // prevent the dialog from closing with the escape key
67 | this.parentWidget._onKey = function () {};
68 |
69 | // check for cookies
70 | if (this.useCookies) {
71 | var chkCookie = cookie(this.cookieName);
72 | if (chkCookie && chkCookie === this.cookieValue) {
73 | this.openOnStartup = false;
74 | }
75 | }
76 | },
77 |
78 | acceptDisclaimer: function () {
79 | this.parentWidget.hide();
80 |
81 | // set a cookie so it is only show again
82 | if (this.useCookies) {
83 | cookie(this.cookieName, this.cookieValue, this.cookieProps);
84 | }
85 | },
86 |
87 | declineDisclaimer: function () {
88 | window.location.href = this.declineHref;
89 | },
90 |
91 | mixinDeep: function (dest, source) {
92 | //Recursively mix the properties of two objects
93 | var empty = {};
94 | for (var name in source) {
95 | if (!(name in dest) || (dest[name] !== source[name] && (!(name in empty) || empty[name] !== source[name]))) {
96 | try {
97 | if (source[name].constructor === Object) {
98 | dest[name] = this.mixinDeep(dest[name], source[name]);
99 | } else {
100 | dest[name] = source[name];
101 | }
102 | } catch (e) {
103 | // Property in destination object not set. Create it and set its value.
104 | dest[name] = source[name];
105 | }
106 | }
107 | }
108 | return dest;
109 | }
110 | });
111 | });
--------------------------------------------------------------------------------
/widgets/Disclaimer/README.md:
--------------------------------------------------------------------------------
1 | #Disclaimer Widget for CMV
2 | A simple yet configurable disclaimer widget for CMV
3 |
4 | ---
5 | ## Configurable Options
6 |
7 | | Parameter | Type | Description |
8 | | :----: | :--: | ----------- |
9 | | `openOnStart` | Boolean | Default is true |
10 | | `style` | String | Include the height to center the dialog properly. |
11 | | `content` | String | Default is ''. The HTML you want to display in the disclaimer dialog |
12 | | `href` | String | Default is null. Instead of HTML, you can point to a page that contains your HTML text. |
13 | | `declineHref` | String | Default is `javascript:void(0)`. The url to navigate to when you user presses the decline button|
14 | | `i18n` | Object | Default is {}. You can override the Internationalization with your own strings for the text on the buttons. See example below |
15 | | `useCookies` | Boolean | Default is false. Whether to set a cookie so the disclaimer will not be seen again for X Days|
16 | | `cookieName` | String | Default is `skipCMVDisclaimer`. Name of the cookie to set.|
17 | | `cookieValue` | String | Default is `true`. This value can be whatever you want it to be.|
18 | | `cookieProps` | Object | Default is `{expires: new Date(Date.now() + (30 * 24 * 60 * 60 * 1000))`. Using the default, the disclaimer will be shown every 30 days.|
19 |
20 |
21 | ---
22 | ## Example Configuration:
23 | #### Using content from an HTML page:
24 | ``` javascript
25 | disclaimer: {
26 | include: true,
27 | id: 'disclaimer',
28 | type: 'floating',
29 | path: 'widgets/Disclaimer',
30 | title: 'Disclaimer',
31 | options: {
32 |
33 | // pre-define the height so the dialog is centered properly
34 | style: 'height:295px;width:375px;',
35 |
36 | // or you can provide the url for another page that includes the content
37 | href: './disclaimer.html'
38 |
39 | }
40 | }
41 | ```
42 |
43 | ## Screenshot:
44 | 
45 |
46 |
47 | ---
48 | ## Example Configuration:
49 | #### Using content supplied in the widget configuration:
50 | ``` javascript
51 | disclaimer: {
52 | include: true,
53 | id: 'disclaimer',
54 | type: 'floating',
55 | path: 'widgets/Disclaimer',
56 | title: 'Beware!!!',
57 | options: {
58 |
59 | // you can customize the button text
60 | i18n: {
61 | accept: 'Arghhhh!',
62 | decline: 'Run Away!'
63 | },
64 |
65 | // pre-define the height so the dialog is centered properly
66 | style: 'height:295px;width:375px;',
67 |
68 | // you can put your content right in the config
69 | content: 'Abandon all hope, ye who enter here...
'
70 |
71 | // or you can provide the url for another page that includes the content
72 | //href: './disclaimer.html',
73 |
74 | // the url to go to if the user declines.
75 | //declineHref: 'http://esri.com/'
76 |
77 | }
78 | }
79 | ```
80 |
81 | ## Screenshot:
82 | 
83 |
--------------------------------------------------------------------------------
/widgets/Disclaimer/css/Disclaimer.css:
--------------------------------------------------------------------------------
1 | /*csslint ids: false, order-alphabetical: false */
2 | .cmvDisclaimerWidget {
3 | display: flex;
4 | flex-direction: column;
5 | width: 100%;
6 | height: 100%;
7 | }
8 |
9 | .cmvDisclaimerWidget .disclaimerMessageContainer {
10 | flex: 1;
11 | padding: 0;
12 | }
13 |
14 | .cmvDisclaimerWidget .disclaimerButtonContainer {
15 | left: 0;
16 | right: 0;
17 | padding: 8px 20px 0 20px;
18 | text-align: center;
19 | }
20 |
21 | .cmvDisclaimerWidget .acceptDisclaimerIcon {
22 | color: #009900;
23 | }
24 |
25 | .cmvDisclaimerWidget .acceptDisclaimerButton {
26 | float: left;
27 | }
28 |
29 | .cmvDisclaimerWidget .declineDisclaimerIcon {
30 | color: #CC0000;
31 | }
32 |
33 | .cmvDisclaimerWidget .declineDisclaimerButton {
34 | float: right;
35 | }
36 |
37 | .floating-disclaimer .dijitDialogCloseIcon {
38 | display: none;
39 | }
40 |
41 | #disclaimer_parent_underlay {
42 | display: block;
43 | }
44 |
45 | .floating-disclaimer {
46 | display: flex;
47 | flex-direction: column;
48 | }
49 |
50 | .floating-disclaimer .dijitDialogPaneContent {
51 | flex: 1;
52 | }
53 |
54 | @media screen and (max-width: 400px) {
55 | .floating-disclaimer {
56 | min-height: 55%;
57 | min-width: 90%;
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/widgets/Disclaimer/nls/Disclaimer.js:
--------------------------------------------------------------------------------
1 | // http://dojotoolkit.org/reference-guide/1.10/dojo/i18n.html
2 | define({
3 | root: {
4 | accept: 'Accept',
5 | decline: 'Decline'
6 | }
7 | });
8 |
9 |
--------------------------------------------------------------------------------
/widgets/Disclaimer/templates/Disclaimer.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/widgets/ElevationProfile/css/Draw.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";
2 |
3 | @font-face {
4 | font-family: "draw-icons";
5 | font-style: normal;
6 | font-weight: normal;
7 | src:url("./fonts/draw-icons.eot");
8 | src:url("./fonts/draw-icons.eot?#iefix") format("embedded-opentype"),
9 | url("./fonts/draw-icons.woff") format("woff"),
10 | url("./fonts/draw-icons.ttf") format("truetype"),
11 | url("./fonts/draw-icons.svg#draw-icons") format("svg");
12 | }
13 |
14 | /* csslint order-alphabetical: 0 */
15 | .cmvElevationProfileWidget .draw-icon-polyline:before,
16 | .cmvElevationProfileWidget .draw-icon-freehand-polyline:before {
17 | font-family: "draw-icons";
18 | font-style: normal;
19 | font-variant: normal;
20 | font-weight: normal;
21 | line-height: 1;
22 | speak: none;
23 | text-transform: none;
24 | -webkit-font-smoothing: antialiased;
25 | -moz-osx-font-smoothing: grayscale;
26 | }
27 |
28 | .cmvElevationProfileWidget .draw-icon-polyline:before {
29 | content: "\e004";
30 | }
31 |
32 | .cmvElevationProfileWidget .draw-icon-freehand-polyline:before {
33 | content: "\e007";
34 | }
--------------------------------------------------------------------------------
/widgets/ElevationProfile/css/ElevationProfile.css:
--------------------------------------------------------------------------------
1 | .cmvElevationProfileWidget .elevationMeasurementUnits {
2 | float: right;
3 | height: 100px;
4 | margin-left: 20px;
5 | width: 150px;
6 | }
7 |
8 | .cmvElevationProfileWidget label {
9 | margin-left: 5px;
10 | }
11 |
12 | .esriElevationProfile,
13 | .esriElevationProfileChartNode {
14 | height: calc(100% - 20px) !important;
15 | left: 0;
16 | min-height: 150px !important;
17 | position: absolute;
18 | top: 0;
19 | width: calc(100% - 10px) !important;
20 | }
--------------------------------------------------------------------------------
/widgets/ElevationProfile/css/fonts/draw-icons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/ElevationProfile/css/fonts/draw-icons.eot
--------------------------------------------------------------------------------
/widgets/ElevationProfile/css/fonts/draw-icons.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Generated by Fontastic.me
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/widgets/ElevationProfile/css/fonts/draw-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/ElevationProfile/css/fonts/draw-icons.ttf
--------------------------------------------------------------------------------
/widgets/ElevationProfile/css/fonts/draw-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/ElevationProfile/css/fonts/draw-icons.woff
--------------------------------------------------------------------------------
/widgets/ElevationProfile/templates/ElevationProfile.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | Measurement Unit:
4 |
5 | Miles
6 | Kilometers
7 | Meters
8 | Nautical Miles
9 | Yards
10 | Feet
11 |
12 |
13 |
14 | Digitize a route:
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/widgets/Export/css/Export.css:
--------------------------------------------------------------------------------
1 | .floatingWidget .cmvExportWidget {
2 | width: 285px;
3 | }
4 |
5 | .cmvExportWidget .exportContainer {
6 | padding: 10px;
7 | }
8 |
9 | .cmvExportWidget .divWkidSection {
10 | display: none;
11 | margin-top: 15px;
12 | }
13 |
14 | .cmvExportWidget .divWkidTextSection {
15 | color: #999;
16 | margin-top: 10px;
17 | }
18 | .cmvExportWidget .divWkidText {
19 | height: 120px;
20 | margin:5px;
21 | overflow-x: hidden;
22 | width:100%;
23 | }
24 |
25 | .cmvExportWidget .divExportButton,
26 | .cmvExportWidget .divExportLink {
27 | margin-top: 15px;
28 | text-align: center;
29 | width: 100%;
30 | }
31 |
32 | #export_parent_underlay {
33 | display: block;
34 | }
35 |
--------------------------------------------------------------------------------
/widgets/Export/lib/terraformer-arcgis-parser-1.0.5.min.js:
--------------------------------------------------------------------------------
1 | !function(e,r){if("object"==typeof module&&"object"==typeof module.exports&&(exports=module.exports=r(require("terraformer"))),"object"==typeof e.navigator){if(!e.Terraformer)throw new Error("Terraformer.ArcGIS requires the core Terraformer library. https://github.com/esri/Terraformer");e.Terraformer.ArcGIS=r(e.Terraformer)}}(this,function(e){function r(e){var r,t,o,i,n=0,s=0,a=[];o=e.match(/((\+|\-)[^\+\-]+)/g),i=parseInt(o[0],32);for(var c=1;co;o++)r=e[o+1],t+=(r[0]-n[0])*(r[1]+n[1]),n=r;return t>=0}function s(e){var r=[],o=e.slice(0),i=t(o.shift().slice(0));if(i.length>=4){n(i)||i.reverse(),r.push(i);for(var s=0;s=4&&(n(a)&&a.reverse(),r.push(a))}}return r}function a(e){for(var r=[],t=0;t=0;i--){var n=o[i].slice(0);r.push(n)}return r}function c(r,t){var o=e.Tools.arraysIntersectArrays(r,t),i=e.Tools.coordinatesContainPoint(r,t[0]);return!o&&i?!0:!1}function u(r){for(var o,i,s,a=[],u=[],p=0;p=0;o--)if(i=a[o][0],c(i,s)){a[o].push(s),g=!0;break}g||h.push(s)}for(;h.length;){s=h.pop();var m=!1;for(o=a.length-1;o>=0;o--)if(i=a[o][0],e.Tools.arraysIntersectArrays(i,s)){a[o].push(s),m=!0;break}m||a.push([s.reverse()])}return 1===a.length?{type:"Polygon",coordinates:a[0]}:{type:"MultiPolygon",coordinates:a}}function p(t,o){var n={};o=o||{},o.idAttribute=o.idAttribute||void 0,"number"==typeof t.x&&"number"==typeof t.y&&(n.type="Point",n.coordinates=[t.x,t.y],(t.z||t.m)&&n.coordinates.push(t.z),t.m&&n.coordinates.push(t.m)),t.points&&(n.type="MultiPoint",n.coordinates=t.points.slice(0)),t.paths&&(1===t.paths.length?(n.type="LineString",n.coordinates=t.paths[0].slice(0)):(n.type="MultiLineString",n.coordinates=t.paths.slice(0))),t.rings&&(n=u(t.rings.slice(0))),(t.compressedGeometry||t.geometry||t.attributes)&&(n.type="Feature",t.compressedGeometry&&(t.geometry={paths:[r(t.compressedGeometry)]}),n.geometry=t.geometry?p(t.geometry):null,n.properties=t.attributes?i(t.attributes):null,t.attributes&&(n.id=t.attributes[o.idAttribute]||t.attributes.OBJECTID||t.attributes.FID));var s=t.geometry?t.geometry.spatialReference:t.spatialReference;return s&&102100===s.wkid&&(n=e.toGeographic(n)),new e.Primitive(n)}function l(r,t){var o;t=t||{};var n=t.idAttribute||"OBJECTID";o=t.sr?{wkid:t.sr}:r&&r.crs===e.MercatorCRS?{wkid:102100}:{wkid:4326};var c,u={};switch(r.type){case"Point":u.x=r.coordinates[0],u.y=r.coordinates[1],r.coordinates[2]&&(u.z=r.coordinates[2]),r.coordinates[3]&&(u.m=r.coordinates[3]),u.spatialReference=o;break;case"MultiPoint":u.points=r.coordinates.slice(0),u.spatialReference=o;break;case"LineString":u.paths=[r.coordinates.slice(0)],u.spatialReference=o;break;case"MultiLineString":u.paths=r.coordinates.slice(0),u.spatialReference=o;break;case"Polygon":u.rings=s(r.coordinates.slice(0)),u.spatialReference=o;break;case"MultiPolygon":u.rings=a(r.coordinates.slice(0)),u.spatialReference=o;break;case"Feature":r.geometry&&(u.geometry=l(r.geometry,t)),u.attributes=r.properties?i(r.properties):{},r.id&&(u.attributes[n]=r.id);break;case"FeatureCollection":for(u=[],c=0;c
2 |
3 |
4 | ${i18n.selectType}:
5 |
6 |
7 |
8 |
${i18n.selectProjection}:
9 |
10 |
${i18n.projection}:
11 |
12 |
13 |
14 |
15 | ${i18n.export}
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/widgets/ExportGraphics/README.md:
--------------------------------------------------------------------------------
1 | # Export Graphics Widget for CMV
2 |
3 | The Export Graphics widget works with the [Export](https://github.com/tmcgee/cmv-widgets#export) widget to allow the user to export graphic features from one or more Graphic or Feature layers.
4 |
5 | ---
6 |
7 | ## Configurable Options
8 |
9 | | Parameter | Type | Description |
10 | | :----: | :--: | ----------- |
11 | | `layerIds` | Array | Default includes the layer IDs used by the CMV [Draw](https://github.com/cmv/cmv-apps) widget and the [Advanced Draw](https://github.com/ishiland/cmv-widgets#advanceddraw) widget contributed by [isiland](https://github.com/ishiland/). |
12 | | `includeMapGraphics` | Boolean | IF you want to include graphics added to the map, not a specific layer. Default is false. |
13 | | `exportOptions` | Object | Options to pass to the Export widget. Default is {} |
14 |
15 | ---
16 |
17 | ## Example Configuration:
18 |
19 | ``` javascript
20 | exportGraphics: {
21 | include: true,
22 | id: 'exportGraphics',
23 | type: 'domNode',
24 | srcNodeRef: 'exportGraphicsDijit',
25 | path: 'widgets/ExportGraphics',
26 | options: {
27 | map: true,
28 |
29 | exportOptions: {
30 | excel: false,
31 | xlsExcel: false,
32 | csv: false,
33 |
34 | shapefile: true,
35 | kml: true,
36 | kmz: true,
37 | geojson: false,
38 | topojson: false,
39 | wkt: false,
40 |
41 | defaultExportType: 'shapefile',
42 | // this option can be a string or a function that returns
43 | // a string.
44 | //
45 | // filename: 'my_results'
46 | filename: function () {
47 | var date = new Date();
48 | return 'export_graphics_' + date.toLocaleDateString();
49 | }
50 | }
51 |
52 | }
53 | }
54 | ```
55 |
56 | ## Screenshot:
57 |
58 | 
59 |
--------------------------------------------------------------------------------
/widgets/ExportGraphics/css/ExportGraphics.css:
--------------------------------------------------------------------------------
1 | .cmvExportGraphicsWidget .exportGraphicsContainer {
2 | margin-top: 15px;
3 | text-align: center;
4 | }
5 |
--------------------------------------------------------------------------------
/widgets/ExportGraphics/nls/ExportGraphics.js:
--------------------------------------------------------------------------------
1 | // http://dojotoolkit.org/reference-guide/1.10/dojo/i18n.html
2 | define({
3 | root: {
4 | buttonLabel: 'Export Graphics',
5 | noGraphicsMessage: {
6 | title: 'Export Graphics',
7 | message: 'There are no graphics to export.',
8 | level: 'warning'
9 | }
10 | }
11 | });
--------------------------------------------------------------------------------
/widgets/ExportGraphics/templates/ExportGraphics.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | ${i18n.buttonLabel}
4 |
5 |
6 |
--------------------------------------------------------------------------------
/widgets/FullScreen/README.md:
--------------------------------------------------------------------------------
1 | #Full Screen Widget for CMV
2 | A simple widget containing a button to toggle the CMV map to a maximized full screen view and restore it to the original dimensions. By default, any sidebar panes in the application are collapsed when the map is maximized to full screen.
3 |
4 | ---
5 | ## Configurable Options
6 |
7 | | Parameter | Type | Description |
8 | | :----: | :--: | ----------- |
9 | | `domNodeID` | String | Default is 'borderContainerOuter' If you want to maximize a different div, substitute the id of the desired div. |
10 | | `closePanes` | Array | An array of the panes you want to close when the map is maximized. Default is ['left', 'right', 'top', 'bottom']. Use [] if you do not want to close the panes. |
11 |
12 | ---
13 | ## Example Configuration:
14 | ``` javascript
15 | fullScreen: {
16 | include: true,
17 | id: 'fullScreen',
18 | type: 'domNode',
19 | path: 'widgets/FullScreen',
20 | srcNodeRef: 'homeButton',
21 | options: {}
22 | }
23 | ```
24 | ## Screenshot:
25 | 
26 |
27 |
--------------------------------------------------------------------------------
/widgets/FullScreen/css/FullScreen.css:
--------------------------------------------------------------------------------
1 | /*csslint important: false, box-model: false, order-alphabetical: false */
2 | div:-webkit-full-screen {
3 | top: 0 !important;
4 | left: 0 !important;
5 | height: 100% !important;
6 | width: 100% !important;
7 | }
8 | div:-moz-full-screen {
9 | top: 0 !important;
10 | left: 0 !important;
11 | height: 100% !important;
12 | width: 100% !important;
13 | }
14 | div:-o-full-screen {
15 | top: 0 !important;
16 | left: 0 !important;
17 | height: 100% !important;
18 | width: 100% !important;
19 | }
20 | div:full-screen {
21 | top: 0 !important;
22 | left: 0 !important;
23 | height: 100% !important;
24 | width: 100% !important;
25 | }
26 | div:-ms-fullscreen {
27 | top: 0 !important;
28 | left: 0 !important;
29 | height: 100% !important;
30 | width: 100% !important;
31 | }
32 | div:fullscreen {
33 | top: 0 !important;
34 | left: 0 !important;
35 | height: 100% !important;
36 | width: 100% !important;
37 | }
38 |
39 | /*
40 | Ensure that popup menus (like basemap widget)
41 | are above the full screen map and panes
42 | */
43 | .cmv .dijitPopup {
44 | z-index: 2147483647 !important;
45 | }
46 |
47 | .cmvFullScreenWidget .FullScreenButton {
48 | height: 32px;
49 | width: 32px;
50 | overflow: hidden !important;
51 | border: 1px solid #999;
52 | font-size: 22px;
53 | color: #FFF;
54 | background-color: #666;
55 | background-color: rgba(102, 102, 102,0.80);
56 | -webkit-border-radius: 5px;
57 | border-radius: 5px;
58 | cursor: pointer;
59 | text-align: center;
60 | -webkit-user-select: none;
61 | -moz-user-select: none;
62 | -ms-user-select: none;
63 | user-select: none;
64 | }
65 | .cmvFullScreenWidget .FullScreenButton:hover {
66 | background-color: #333;
67 | background-color: rgba(102,102,102,0.90);
68 | }
69 |
70 | .cmvFullScreenWidget .FullScreenButton:active {
71 | background-color: #ccc;
72 | background-color: rgba(102,102,102,0.60);
73 | }
74 |
75 | .cmvFullScreenWidget .FullScreen {
76 | margin: 4px;
77 | transform: rotate(45deg);
78 | }
79 |
80 | .cmvFullScreenWidget .FullScreenRestore {
81 | transform: rotate(0deg);
82 | }
83 |
84 | .cmvFullScreenWidget .FullScreen:before {
85 | content: '\f0b2';
86 | }
87 |
88 | .cmvFullScreenWidget .FullScreenRestore:before {
89 | content: '\f066';
90 | }
--------------------------------------------------------------------------------
/widgets/FullScreen/nls/FullScreen.js:
--------------------------------------------------------------------------------
1 | // http://dojotoolkit.org/reference-guide/1.10/dojo/i18n.html
2 | define({
3 | root: {
4 | fullscreen: 'Make Map Full Screen',
5 | restore: 'Restore Map to Original Size'
6 | }
7 | });
--------------------------------------------------------------------------------
/widgets/FullScreen/templates/FullScreen.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/widgets/Geoprocessor.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 |
5 | 'dojo/_base/lang',
6 | 'dojo/topic',
7 |
8 | 'esri/tasks/FeatureSet',
9 | 'esri/tasks/Geoprocessor',
10 | 'esri/graphic',
11 | 'esri/tasks/LinearUnit',
12 | 'esri/symbols/SimpleMarkerSymbol'
13 |
14 | ], function (
15 | declare,
16 | _WidgetBase,
17 |
18 | lang,
19 | topic,
20 |
21 | FeatureSet,
22 | Geoprocessor,
23 | Graphic,
24 | LinearUnit,
25 | SimpleMarkerSymbol
26 | ) {
27 |
28 | return declare([_WidgetBase], {
29 |
30 | topicID: 'attributesContainer',
31 |
32 | url: 'https://sampleserver6.arcgisonline.com/ArcGIS/rest/services/Elevation/ESRI_Elevation_World/GPServer/Viewshed',
33 |
34 | symbol: {
35 | type: 'esriSMS',
36 | style: 'esriSMSCircle',
37 | size: 14,
38 | color: [0, 255, 0, 64],
39 | outline: {
40 | type: 'esriSLS',
41 | style: 'esriSLSSolid',
42 | color: [255, 0, 0],
43 | width: 1
44 | }
45 | },
46 |
47 | distance: 5,
48 | distanceUnits: 'esriMiles',
49 |
50 | postCreate: function () {
51 | this.inherited(arguments);
52 |
53 | // execute the computeViewShed method when user clicks the map
54 | this.map.on('click', lang.hitch(this, 'computeViewShed'));
55 | },
56 |
57 | computeViewShed: function (evt) {
58 | // remove previous point, if any
59 | this.map.graphics.clear();
60 |
61 | // add the point to the map
62 | var pointSymbol = new SimpleMarkerSymbol(this.symbol);
63 | var graphic = new Graphic(evt.mapPoint, pointSymbol);
64 | this.map.graphics.add(graphic);
65 |
66 | // create the feature set to pass to the GP
67 | var featureSet = new FeatureSet();
68 | featureSet.features = [graphic];
69 | var vsDistance = new LinearUnit();
70 | vsDistance.distance = this.distance;
71 | vsDistance.units = this.distanceUnits;
72 | var params = {
73 | 'Input_Observation_Point': featureSet,
74 | 'Viewshed_Distance': vsDistance
75 | };
76 |
77 | // execute the GP
78 | var gp = new Geoprocessor(this.url);
79 | gp.setOutputSpatialReference({
80 | wkid: this.map.spatialReference.wkid
81 | });
82 |
83 | gp.execute(params, lang.hitch(this, 'drawViewshed'));
84 | },
85 |
86 | // process the results of GP
87 | drawViewshed: function (results) {
88 | // clear any query Results
89 | topic.publish(this.topicID + '/clearQueryResults');
90 |
91 | // clear any previous features
92 | topic.publish(this.topicID + '/clearFeatures');
93 |
94 | // load the features into the table
95 | topic.publish(this.topicID + '/populateGrid', results[0].value);
96 |
97 | // open the bottom pane
98 | topic.publish('viewer/togglePane', {
99 | pane: 'bottom',
100 | show: 'block'
101 | });
102 | }
103 | });
104 | });
--------------------------------------------------------------------------------
/widgets/HeatMap/README.md:
--------------------------------------------------------------------------------
1 | # Heatmap Widget for CMV
2 | The Heatmap Widget uses a HeatmapRenderer to render feature layer data into a raster visualization that emphasizes areas of higher density or weighted values. The blur radius, maximum value and minimum value for the renderer can be adjusted. All features from the layer can be included or use draw tools to select a subset of features.
3 |
4 | The HeatmapRenderer uses a Gaussian Blur technique to average the influence of each point out over the area determined by the 'blurRadius' (the radius (in pixels) of the circle over which the majority of each point's value is spread out.). A Gaussian blur uses a Gaussian, or Normal, distribution (also called a Bell-curve) to spread value out in vertical and horizontal directions.
5 |
6 | The Heatmap widget was inspired by this WAB widget: https://github.com/AdriSolid/WAB-Custom-Widgets#heat-map-wab-27-fire-live-demo
7 |
8 | ---
9 | ## Configurable Options
10 |
11 | | Parameter | Type | Description |
12 | | :----: | :--: | ----------- |
13 | | `layerControlLayerInfos` | Boolean | |
14 | | `layers` | Array| |
15 | | `addToLayerControl` | Boolean | |
16 | | `geometryType` | String | |
17 | | `drawingOptions` | Object | |
18 | | `blurRadius` | Number | |
19 | | `maxValue` | Number | |
20 | | `minValue` | Number | |
21 | | `colorStops` | Array | |
22 | | `topicID` | String | |
23 |
24 |
25 | ---
26 | ## Example Configuration:
27 | ``` javascript
28 | heatmap: {
29 | include: true,
30 | id: 'heatmap',
31 | type: 'titlePane',
32 | title: 'Heatmap',
33 | iconClass: 'fas fa-fire',
34 | open: true,
35 | position: 1,
36 | path: 'widgets/Heatmap',
37 | options: {
38 | map: true,
39 | layerControlLayerInfos: true
40 | }
41 | }
42 | ```
43 | ## Screenshot:
44 | 
45 |
46 |
--------------------------------------------------------------------------------
/widgets/HeatMap/css/Draw.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";
2 |
3 | @font-face {
4 | font-family: "draw-icons";
5 | font-style: normal;
6 | font-weight: normal;
7 | src:url("./fonts/draw-icons.eot");
8 | src:url("./fonts/draw-icons.eot?#iefix") format("embedded-opentype"),
9 | url("./fonts/draw-icons.woff") format("woff"),
10 | url("./fonts/draw-icons.ttf") format("truetype"),
11 | url("./fonts/draw-icons.svg#draw-icons") format("svg");
12 | }
13 |
14 | /* csslint order-alphabetical: 0 */
15 | .cmvHeatmapWidget .draw-icon-rectangle:before,
16 | .cmvHeatmapWidget .draw-icon-circle:before,
17 | .cmvHeatmapWidget .draw-icon-freehand-polygon:before,
18 | .cmvHeatmapWidget .draw-icon-point:before,
19 | .cmvHeatmapWidget .draw-icon-polyline:before,
20 | .cmvHeatmapWidget .draw-icon-text:before,
21 | .cmvHeatmapWidget .draw-icon-freehand-polyline:before,
22 | .cmvHeatmapWidget .draw-icon-polygon:before,
23 | .cmvHeatmapWidget .draw-icon-polygon:before {
24 | font-family: "draw-icons";
25 | font-style: normal;
26 | font-variant: normal;
27 | font-weight: normal;
28 | text-transform: none;
29 | speak: none;
30 | line-height: 1;
31 | -webkit-font-smoothing: antialiased;
32 | -moz-osx-font-smoothing: grayscale;
33 | }
34 |
35 | .cmvHeatmapWidget .draw-icon-rectangle:before {
36 | content: "\e005";
37 | }
38 |
39 | .cmvHeatmapWidget .draw-icon-circle:before {
40 | content: "\e001";
41 | }
42 |
43 | .cmvHeatmapWidget .draw-icon-freehand-polygon:before {
44 | content: "\e002";
45 | }
46 |
47 | .cmvHeatmapWidget .draw-icon-polygon:before {
48 | content: "\e008";
49 | }
50 |
--------------------------------------------------------------------------------
/widgets/HeatMap/css/Heatmap.css:
--------------------------------------------------------------------------------
1 | .cmvHeatmapWidget .heatmapSizer {
2 | margin-bottom: 20px;
3 | margin-left: 10px;
4 | margin-top:5px;
5 | width: calc(100% - 20px) !important;
6 | }
7 |
8 | .cmvHeatmapWidget .heatmapSlider {
9 | margin-bottom: 20px;
10 | margin-left: 5px;
11 | margin-top: 5px;
12 | width: calc(100% - 10px) !important;
13 | }
--------------------------------------------------------------------------------
/widgets/HeatMap/css/fonts/draw-icons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/HeatMap/css/fonts/draw-icons.eot
--------------------------------------------------------------------------------
/widgets/HeatMap/css/fonts/draw-icons.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Generated by Fontastic.me
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/widgets/HeatMap/css/fonts/draw-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/HeatMap/css/fonts/draw-icons.ttf
--------------------------------------------------------------------------------
/widgets/HeatMap/css/fonts/draw-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/HeatMap/css/fonts/draw-icons.woff
--------------------------------------------------------------------------------
/widgets/HeatMap/nls/Heatmap.js:
--------------------------------------------------------------------------------
1 | define({
2 | root: ({
3 | Labels: {
4 | selectLayer: 'Select a layer',
5 | selectField: 'Select a numeric field',
6 | blurRadius: 'Blur Radius',
7 | maxValue: 'Max Pixel Intensity',
8 | minValue: 'Min Pixel Intensity',
9 | heatmapSlider: 'Heatmap Slider',
10 | configureRenderer: 'Adjust Heatmap Renderer',
11 | featureSelection: 'Select Features'
12 | },
13 | Messages: {
14 | confirm: {
15 | title: 'Remove All Heatmaps?',
16 | content: 'Do you want to remove all the Heatmap layers?'
17 | }
18 | },
19 | Buttons: {
20 | createHeatmap: {
21 | label: 'Create Heatmap',
22 | showLabel: true
23 | },
24 | clearAll: {
25 | label: 'Clear All',
26 | showLabel: true
27 | },
28 | stopDrawing: {
29 | label: 'Stop Drawing',
30 | showLabel: false
31 | },
32 | selectByRectangle: {
33 | label: 'Select By Rectangle',
34 | showLabel: false
35 | },
36 | selectByEllipse: {
37 | label: 'Select By Ellipse',
38 | showLabel: false
39 | },
40 | selectByCircle: {
41 | label: 'Select By Circle',
42 | showLabel: false
43 | },
44 | selectByPolygon: {
45 | label: 'Select By Polygon',
46 | showLabel: false
47 | },
48 | selectByFreehandPolygon: {
49 | label: 'Select By Freehand Polygon',
50 | showLabel: false
51 | }
52 | }
53 | })
54 | });
--------------------------------------------------------------------------------
/widgets/IdentifyPanel/README.md:
--------------------------------------------------------------------------------
1 | # IdentifyPanel for CMV
2 | A widget to replace the map's infoWindow including integration with the [Export](https://github.com/tmcgee/cmv-widgets#export) widget. You can include your own buttons as well. This widget is an updated and enhanced version of one originally created by [Doug Chamberlain](https://github.com/dougrchamberlain/IdentifyPanel).
3 |
4 | ---
5 | ## Example Configuration:
6 | ``` javascript
7 | identifyPanel: {
8 | include: true,
9 | type: 'titlePane',
10 | path: 'widgets/IdentifyPanel',
11 | position: 0,
12 | title: 'Identify Features',
13 | iconClass: 'fas fa-info-circle',
14 | open: true,
15 | options: {
16 | map: true,
17 | mapClickMode: true,
18 | buttons: [
19 | {
20 | id: 'identifypanel-button-example',
21 | label: 'This is an example button',
22 | iconClass: 'fas fa-fw fa-comment',
23 | showLabel: false,
24 | style: 'float:left;margin-right:10px;display:none;',
25 | onClick: function () {
26 | /*eslint no-alert: 0*/
27 | alert('Hello from the Test Button');
28 | }
29 | }
30 | ]
31 | }
32 | }
33 | ```
34 | ## Screenshot:
35 | 
36 |
37 |
--------------------------------------------------------------------------------
/widgets/IdentifyPanel/css/IdentifyPanel.css:
--------------------------------------------------------------------------------
1 | .cmvIdentifyPanelWidget .identifypanel-noinfo-node i,
2 | .cmvIdentifyPanelWidget .identifypanel-loading-node i {
3 | margin-right: 6px;
4 | }
5 |
6 | .cmvIdentifyPanelWidget .identifypanel-noinfo-node {
7 | color: #900;
8 | }
9 |
10 | .cmvIdentifyPanelWidget .esriPopup {
11 | position: relative;
12 | }
13 |
14 | .cmvIdentifyPanelWidget .identifypanel-actions-node {
15 | background-color: #F7F7F7;
16 | border: 1px solid silver;
17 | border-radius: 0;
18 | margin-top: 6px;
19 | min-height: 33px;
20 | padding: 2px;
21 | }
22 |
23 | .cmvIdentifyPanelWidget .identifypanel-actions-node .float-right {
24 | float: right;
25 | }
26 |
27 | .cmvIdentifyPanelWidget .identifypanel-actions-node .dijitButtonNode {
28 | height: 22px;
29 | overflow: hidden;
30 | padding: 2px 6px;
31 | width: 20px;
32 | }
33 |
34 | .cmvIdentifyPanelWidget .esriPopup .sizer {
35 | width: 100%;
36 | }
37 |
38 | .cmvIdentifyPanelWidget .esriPopup .sizer .contentPane {
39 | background-color: transparent;
40 | margin-top: 10px;
41 | padding: 0;
42 | }
43 |
44 | .cmvIdentifyPanelWidget .esriPopup .contentPane .header {
45 | margin-bottom: 6px;
46 | margin-left: 6px;
47 | }
48 |
49 | .cmvIdentifyPanelWidget .esriPopup .contentPane .hzLine {
50 | display: none;
51 | }
52 |
53 | .cmvIdentifyPanelWidget .esriPopup .contentPane table.attrTable {
54 | border: 1px solid silver;
55 | border-radius: 4px;
56 | }
57 |
58 | .cmvIdentifyPanelWidget .esriPopup .contentPane table.attrTable tr:nth-child(even) {
59 | background-color: #f7f7f7;
60 | }
61 | .cmvIdentifyPanelWidget .esriPopup .contentPane table.attrTable td {
62 | padding: 4px;
63 | }
64 |
65 | .esriPopup .pointer,
66 | .esriPopup .outerPointer {
67 | display: none !important;
68 | }
69 |
--------------------------------------------------------------------------------
/widgets/IdentifyPanel/nls/IdentifyPanel.js:
--------------------------------------------------------------------------------
1 | // https://dojotoolkit.org/reference-guide/1.10/dojo/i18n.html
2 | define({
3 | root: {
4 | Labels: {
5 | instructions: 'Click the map to identify features.',
6 | identifying: 'Identifying...',
7 | noInformation: 'No information available at that location.',
8 | feature: 'Viewing Feature',
9 | features: 'Features'
10 | },
11 | Buttons: {
12 | clearFeatures: {
13 | label: 'Clear Features',
14 | showLabel: false
15 | },
16 | firstFeature: {
17 | label: 'First Feature',
18 | showLabel: false
19 | },
20 | lastFeature: {
21 | label: 'Last Feature',
22 | showLabel: false
23 | },
24 | previousFeature: {
25 | label: 'Previous Feature',
26 | showLabel: false
27 | },
28 | nextFeature: {
29 | label: 'Next Feature',
30 | showLabel: false
31 | },
32 | zoomToFeature: {
33 | label: 'Zoom To Feature',
34 | showLabel: false
35 | },
36 | exportFeature: {
37 | label: 'Export Feature',
38 | showLabel: false
39 | }
40 | }
41 | }
42 | });
43 |
--------------------------------------------------------------------------------
/widgets/IdentifyPanel/templates/IdentifyPanel.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | ${i18n.Labels.instructions}
4 |
5 |
6 | ${i18n.Labels.noInformation}
7 |
8 |
9 | ${i18n.Labels.identifying}
10 |
11 |
12 |
13 |
14 |
29 |
--------------------------------------------------------------------------------
/widgets/Introduction.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 |
5 | 'dojo/_base/lang',
6 | 'dojo/on',
7 | 'dojo/dom-construct',
8 | 'dojo/cookie',
9 | 'module',
10 |
11 | './Introduction/intro.min',
12 |
13 | 'xstyle/css!./Introduction/css/introjs.min.css',
14 | 'xstyle/css!./Introduction/css/Introduction.css'
15 |
16 | ], function (
17 | declare,
18 | _WidgetBase,
19 |
20 | lang,
21 | on,
22 | domConstruct,
23 | cookie,
24 | module,
25 |
26 | IntroJS
27 | ) {
28 |
29 | return declare([_WidgetBase], {
30 |
31 | html: null,
32 | domTarget: null,
33 |
34 | // Documentation https://introjs.com/docs/themes/list
35 | introTheme: null,
36 |
37 | // Documentation: https://introjs.com/docs/intro/options/
38 | introOptions: {
39 | steps: [
40 | {
41 | intro: 'Hello world!'
42 | }
43 | ]
44 | },
45 |
46 | showAtStartup: true,
47 | showDelay: 1000,
48 |
49 | cookieKey: 'cmvIntroduction',
50 | cookieOptions: {
51 | expires: new Date(Date.now() + (360000 * 24 * 30)) // show every 30 days
52 | },
53 |
54 | postCreate: function () {
55 | this.introJs = IntroJS;
56 |
57 | if (this.introTheme) {
58 | var path = module.uri.substring(0, module.uri.lastIndexOf('.'));
59 | require(['xstyle/css!' + path + '/css/introjs-' + this.introTheme + '.css']);
60 | }
61 |
62 | if (this.html && this.domTarget) {
63 | var btn = domConstruct.place(this.html, this.domTarget);
64 | on(btn, 'click', lang.hitch(this, 'show'));
65 |
66 | if (this.showAtStartup) {
67 | var introCookie = cookie(this.cookieKey);
68 | if (!introCookie) {
69 | // pause to allow some slower widgets to get loaded
70 | window.setTimeout(lang.hitch(this, 'show'), this.showDelay);
71 | }
72 |
73 | }
74 | } else {
75 | this.show();
76 | }
77 | },
78 |
79 | show: function () {
80 | this.intro = this.introJs();
81 | this.intro.setOptions(this.introOptions);
82 | this.intro.start();
83 |
84 | // The expiration date X days in the future
85 | cookie(this.cookieKey, true, this.cookieOptions);
86 | }
87 |
88 | });
89 | });
90 |
--------------------------------------------------------------------------------
/widgets/Introduction/css/Introduction.css:
--------------------------------------------------------------------------------
1 | .introjs-tooltip {
2 | max-width: 400px;
3 | }
4 |
5 | .introjs-tooltipbuttons {
6 | border-top: 1px solid;
7 | margin-top: 0.75em;
8 | }
9 |
10 | .introjs-helperNumberLayer {
11 | left: -6px;
12 | }
13 |
14 | .introjs-tooltiptext h4 {
15 | border-bottom: 1px solid;
16 | margin-bottom: 0.75em;
17 | margin-top: 0.25em;
18 | padding: 0.5em;
19 | }
--------------------------------------------------------------------------------
/widgets/Introduction/css/introjs-flattener.css:
--------------------------------------------------------------------------------
1 | .introjs-helperNumberLayer {
2 | font-family: tahoma, Arial, verdana, sans-serif;
3 | font-size: 14px;
4 | text-shadow: none;
5 | width: 22px;
6 | height: 22px;
7 | line-height: 22px;
8 | border: 2px solid #ecf0f1;
9 | border-radius: 50%;
10 | background: #e74c3c;
11 | }
12 |
13 | .introjs-helperLayer {
14 | background-color: #FFF;
15 | background-color: rgba(255,255,255,.9);
16 | border: none;
17 | border-radius: 2px;
18 | }
19 |
20 | .introjs-tooltip {
21 | letter-spacing: .1em;
22 | color: #2c3e50;
23 | font-family: tahoma, Arial, verdana, sans-serif;
24 | border-radius: 2px;
25 | }
26 |
27 | .introjs-button {
28 | padding: 0.6em 0.8em;
29 | text-shadow: none;
30 | font-weight: bold;
31 | color: #2c3e50;
32 | font-family: tahoma, Arial, verdana, sans-serif;
33 | background: #ecf0f1;
34 | background-image: none;
35 | -webkit-border-radius: .2em;
36 | -moz-border-radius: .2em;
37 | border-radius: .2em;
38 | -webkit-transition: background .3s, border .3s;
39 | -moz-transition: background .3s, border .3s;
40 | -ms-transition: background .3s, border .3s;
41 | -o-transition: background .3s, border .3s;
42 | transition: background .3s, border .3s;
43 | }
44 |
45 | .introjs-prevbutton {
46 | border-radius: .2em 0 0 .2em;
47 | }
48 |
49 | .introjs-nextbutton {
50 | border-radius: 0 .2em .2em 0;
51 | }
52 |
53 | .introjs-button:hover, .introjs-button:focus {
54 | background: #2c3e50;
55 | color: #fff;
56 | box-shadow: none;
57 | border-color: #2c3e50;
58 | text-decoration: none;
59 | }
60 |
--------------------------------------------------------------------------------
/widgets/Introduction/css/introjs-modern.css:
--------------------------------------------------------------------------------
1 | .introjs-tooltip {
2 | background-color: rgba(000, 0, 0, 0.5);
3 | color: #fff;
4 | }
5 |
6 | .introjs-button,
7 | .introjs-button:hover, .introjs-button:focus, .introjs-button:active,
8 | .introjs-disabled, .introjs-disabled:focus, .introjs-disabled:hover {
9 | outline: none;
10 | background-image: none;
11 | background-color: transparent;
12 | color: #fff;
13 | border: 1px solid transparent;
14 | border-radius: 50px;
15 | box-shadow: none;
16 | border-shadow: none;
17 | text-shadow: none;
18 | }
19 |
20 | .introjs-button:hover, .introjs-button:focus, .introjs-button:active {
21 | border: 1px solid #fff
22 | }
23 | .introjs-disabled, .introjs-disabled:focus, .introjs-disabled:hover {
24 | color: #ccc;
25 | border: 1px solid transparent;
26 | }
27 |
28 | .introjs-arrow {
29 | border: 10px solid #fff;
30 | }
31 | .introjs-arrow.top, .introjs-arrow.top-middle, .introjs-arrow.top-right {
32 | border-color: transparent transparent rgba(000, 0, 0, 0.5);
33 | top: -20px;
34 | left: 20px;
35 | }
36 | .introjs-arrow.bottom, .introjs-arrow.bottom-middle, .introjs-arrow.bottom-right {
37 | border-color: rgba(000, 0, 0, 0.5) transparent transparent;
38 | bottom: -20px;
39 | left: 20px;
40 | }
41 | .introjs-arrow.left, .introjs-arrow.right {
42 | top: 20px;
43 | }
44 | .introjs-arrow.left-bottom, .introjs-arrow.right-bottom {
45 | bottom: 20px;
46 | }
47 |
48 | .introjs-arrow.left, .introjs-arrow.left-bottom {
49 | left: -20px;
50 | border-color: transparent rgba(000, 0, 0, 0.5) transparent transparent;
51 | }
52 | .introjs-arrow.right, .introjs-arrow.right-bottom {
53 | right: -20px;
54 | border-color: transparent transparent transparent rgba(000, 0, 0, 0.5);
55 | }
56 |
--------------------------------------------------------------------------------
/widgets/Introduction/css/introjs-rtl.min.css:
--------------------------------------------------------------------------------
1 | .introjs-tooltipbuttons{text-align:left}.introjs-skipbutton{margin-left:5px}.introjs-tooltip{direction:rtl}.introjs-prevbutton{border:1px solid #d4d4d4;border-left:none;-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-nextbutton{border:1px solid #d4d4d4;-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em}.introjs-bullets ul li{float:right}
2 |
--------------------------------------------------------------------------------
/widgets/LayerLabels.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 |
5 | 'dojo/_base/lang',
6 | 'dojo/_base/array',
7 |
8 | 'esri/symbols/TextSymbol',
9 | 'esri/layers/LabelClass'
10 | ], function (
11 | declare,
12 | _WidgetBase,
13 |
14 | lang,
15 | array,
16 |
17 | TextSymbol,
18 | LabelClass
19 | ) {
20 | return declare([_WidgetBase], {
21 | textSymbol: {
22 | type: 'esriTS',
23 | color: [33, 33, 33, 255],
24 | font: {
25 | size: 10,
26 | family: 'Arial',
27 | weight: 'bolder'
28 | }
29 | },
30 |
31 | // array of feature layers
32 | layers: [],
33 |
34 | postCreate: function () {
35 | this.inherited(arguments);
36 | array.forEach(this.layers, lang.hitch(this, function (layer) {
37 | var mapLayer = this.map.getLayer(layer.id);
38 | if (mapLayer) {
39 | var label = new TextSymbol(layer.textSymbol || this.textSymbol);
40 | var labelClass = new LabelClass({
41 | 'labelExpressionInfo': layer.labelExpressionInfo,
42 | symbol: label
43 | });
44 | mapLayer.setLabelingInfo([labelClass]);
45 | }
46 | }));
47 | }
48 | });
49 | });
--------------------------------------------------------------------------------
/widgets/LayerToggle.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 | 'dojo/topic',
5 | 'dojo/_base/array',
6 | 'dojo/_base/lang'
7 | ], function (
8 | declare,
9 | _WidgetBase,
10 | topic,
11 | array,
12 | lang
13 | ) {
14 | return declare([_WidgetBase], {
15 | map: true,
16 |
17 | // array of IDs for layers that can be toggled
18 | layerGroup: [],
19 |
20 | // ID of labels layer (if any)
21 | labelsID: null,
22 |
23 | postCreate: function () {
24 | this.inherited(arguments);
25 | topic.subscribe('layerControl/layerToggle', lang.hitch(this, function (r) {
26 | if (array.indexOf(this.layerGroup, r.id) >= 0) {
27 | array.forEach(this.layerGroup, lang.hitch(this, function (id) {
28 | if (id !== r.id) {
29 | var lyr = this.map.getLayer(id);
30 | if (lyr) {
31 | lyr.setVisibility(false);
32 | }
33 | }
34 | }));
35 | }
36 | }));
37 | }
38 | });
39 | });
--------------------------------------------------------------------------------
/widgets/LocatorControl.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 | 'dijit/_TemplatedMixin',
5 | 'dijit/_WidgetsInTemplateMixin',
6 | 'gis/dijit/_FloatingWidgetMixin',
7 |
8 | 'dojo/_base/lang',
9 | 'dojo/on',
10 | 'dojo/dom-construct',
11 |
12 | 'dijit/registry',
13 |
14 | 'dojo/text!./LocatorControl/templates/LocatorControl.html',
15 | 'dojo/i18n!./LocatorControl/nls/LocatorControl',
16 |
17 | 'dijit/form/Form',
18 | 'dijit/form/CheckBox',
19 | 'dijit/form/NumberTextBox',
20 |
21 | 'xstyle/css!./LocatorControl/css/LocatorControl.css'
22 |
23 | ], function (
24 | declare,
25 | _WidgetBase,
26 | _TemplatedMixin,
27 | _WidgetsInTemplateMixin,
28 | _FloatingWidgetMixin,
29 |
30 | lang,
31 | on,
32 | domConstruct,
33 |
34 | registry,
35 |
36 | template,
37 | i18n
38 | ) {
39 | return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, _FloatingWidgetMixin], {
40 | widgetsInTemplate: true,
41 | templateString: template,
42 | i18n: i18n,
43 | baseClass: 'cmwLocatorControlWidget',
44 |
45 | html: ' ',
46 | domTarget: 'helpDijit',
47 | draggable: true,
48 |
49 | locatorWidgetID: 'locateButton_widget',
50 | locateWidget: null,
51 |
52 | postCreate: function () {
53 | this.inherited(arguments);
54 |
55 | if (!this.parentWidget.toggleable) {
56 | this.parentWidget.draggable = this.draggable;
57 | var btn = domConstruct.place(this.html, this.domTarget);
58 | on(btn, 'click', lang.hitch(this.parentWidget, 'show'));
59 | }
60 |
61 | this.widgetChecker = window.setInterval(lang.hitch(this, 'checkForLocator'), 100);
62 | },
63 |
64 | onValueChange: function () {
65 | if (this.locateWidget) {
66 | this.locateWidget.set('centerAt', this.centerAtDijit.get('checked'));
67 | this.locateWidget.set('useTracking', this.useTrackingDijit.get('checked'));
68 |
69 | this.locateWidget.set('setScale', this.setScaleDijit.get('checked'));
70 | this.locateWidget.set('scale', this.scaleDijit.get('value'));
71 | }
72 | },
73 |
74 | checkForLocator: function () {
75 | var widget = registry.byId(this.locatorWidgetID);
76 | if (widget) {
77 | this.locateWidget = widget;
78 |
79 | this.centerAtDijit.set('checked', this.locateWidget.get('centerAt'));
80 | this.useTrackingDijit.set('checked', this.locateWidget.get('useTracking'));
81 |
82 | this.setScaleDijit.set('checked', this.locateWidget.get('setScale'));
83 | this.scaleDijit.set('value', this.locateWidget.get('scale'));
84 |
85 | window.clearInterval(this.widgetChecker);
86 | return;
87 | }
88 | }
89 | });
90 | });
--------------------------------------------------------------------------------
/widgets/LocatorControl/css/LocatorControl.css:
--------------------------------------------------------------------------------
1 | /*csslint box-model: false */
2 | .cmwLocatorControlWidget {
3 | width: 100%;
4 | }
5 |
6 | .floatingWidget .cmwLocatorControlWidget {
7 | margin: 10px;
8 | width: 200px;
9 | }
10 |
11 | .floatingWidget .cmwLocatorControlWidget .locatorInputFields:first-child {
12 | margin-bottom: 40px;
13 | }
14 |
15 | .cmwLocatorControlWidget label {
16 | font-weight: bold;
17 | margin-left: 5px;
18 | }
19 |
20 |
--------------------------------------------------------------------------------
/widgets/LocatorControl/nls/LocatorControl.js:
--------------------------------------------------------------------------------
1 | define({
2 | root: {
3 | centerAt: 'Center Map?',
4 | useTracking: 'Tracking My Position?',
5 | setScale: 'Set Map Scale?',
6 | scale: 'Scale (meters)'
7 | }
8 | });
--------------------------------------------------------------------------------
/widgets/LocatorControl/templates/LocatorControl.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/widgets/MapLoading.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 |
5 | 'dojo/_base/lang',
6 | 'dojo/on',
7 | 'dojo/dom-style',
8 | 'dojo/topic',
9 |
10 | 'put-selector/put'
11 |
12 | ], function (
13 | declare,
14 | _WidgetBase,
15 |
16 | lang,
17 | on,
18 | domStyle,
19 | topic,
20 |
21 | put
22 | ) {
23 |
24 | return declare([_WidgetBase], {
25 |
26 | className: 'fas fa-spinner fa-spin',
27 | style: 'color:#333;text-shadow:2px 2px #eee;font-size:32px;display:none;position:absolute;top:calc(50% - 16px);left:calc(50% - 16px);z-index:999',
28 | textStyle: 'color:#333;text-shadow:2px 2px #eee;font-size:32px;display:none;position:absolute;top:calc(50% - 16px);left:calc(50% + 20px);z-index:999',
29 | theText: '',
30 |
31 | postCreate: function () {
32 | this.inherited(arguments);
33 |
34 | this.loading = put(this.map.root, 'i', {
35 | className: this.className,
36 | style: this.style
37 | });
38 |
39 | this.theText = this.msgText || {};
40 | if (this.theText.length > 0) {
41 | this.loadingText = put(this.map.root, 'i', {
42 | className: '',
43 | style: this.textStyle,
44 | textContent: this.theText
45 | });
46 | }
47 | on(this.map, 'update-start', lang.hitch(this, 'showLoading'));
48 | on(this.map, 'update-end', lang.hitch(this, 'hideLoading'));
49 |
50 | topic.subscribe('showLoading/showLoading', lang.hitch(this, 'showLoading'));
51 | topic.subscribe('showLoading/hideLoading', lang.hitch(this, 'hideLoading'));
52 | },
53 |
54 | showLoading: function () {
55 | domStyle.set(this.loading, 'display', 'block');
56 | if (this.theText.length > 0) {
57 | domStyle.set(this.loadingText, 'display', 'block');
58 | }
59 | this.map.disableMapNavigation();
60 | this.map.hideZoomSlider();
61 | },
62 |
63 | hideLoading: function () {
64 | domStyle.set(this.loading, 'display', 'none');
65 | if (this.theText.length > 0) {
66 | domStyle.set(this.loadingText, 'display', 'none');
67 | }
68 | this.map.enableMapNavigation();
69 | this.map.showZoomSlider();
70 | }
71 | });
72 | });
73 |
--------------------------------------------------------------------------------
/widgets/Mapillary/README.md:
--------------------------------------------------------------------------------
1 | # Mapillary Widget for CMV
2 | A replacement for the CMV Google StreetView widget that display street level imagery from [Mapillary](https://www.mapillary.com/) using [MapillaryJS](https://github.com/mapillary/mapillary-js).
3 |
4 | To use MapillaryJS you must [create an account](https://www.mapillary.com/signup) and [obtain a Client ID](https://www.mapillary.com/app/settings/developers).
5 |
6 | ---
7 | ## Configurable Options
8 |
9 | | Parameter | Type | Description |
10 | | :----: | :--: | ----------- |
11 | | `mapillaryOptions` | Object | Options supported by the [Mapillary Viewer](https://github.com/mapillary/mapillary-js) |
12 | | `layerOptions` | Object | Options for the VectorTiles layer displaying the Mapillary coverage |
13 |
14 | ---
15 | ## Example Configuration:
16 | ``` javascript
17 | mapillary: {
18 | include: true,
19 | type: 'titlePane',
20 | title: 'Mapillary',
21 | iconClass: 'fas fa-location-arrow fa-rotate-90',
22 | open: true,
23 | position: 0,
24 | path: 'widgets/Mapillary',
25 | canFloat: true,
26 | paneOptions: {
27 | resizable: true,
28 | resizeOptions: {
29 | minSize: {
30 | w: 250,
31 | h: 250
32 | }
33 | }
34 | },
35 | options: {
36 | map: true,
37 | mapillaryOptions: {
38 | clientID: 'insert-your-own-client-id',
39 | photoID: null
40 | }
41 | }
42 | }
43 | ```
44 | ## Screenshot:
45 | 
46 |
47 |
--------------------------------------------------------------------------------
/widgets/Mapillary/css/Mapillary.css:
--------------------------------------------------------------------------------
1 | .cmvMapillaryWidget {
2 | min-height: 275px;
3 | position: relative;
4 | width: 100%;
5 | }
6 |
7 | .cmvMapillaryWidget .mapillary-button {
8 | left: 4px;
9 | position: absolute;
10 | top: 4px;
11 | z-index: 9;
12 | }
13 |
14 | .cmvMapillaryWidget .mapillary-button .dijitButtonNode {
15 | color: #36AF6D;
16 | font-size: 1.5em;
17 | padding: 6px 6px 6px 6px;
18 | }
19 |
20 | .cmvMapillaryWidget .mapillary-container {
21 | background-color: #202020;
22 | height: calc(100% - 40px);
23 | position: absolute;
24 | top: 0;
25 | width: 100%;
26 | }
27 |
28 | .floatingWidget .cmvMapillaryWidget .mapillary-container {
29 | height: 275px;
30 | width: 400px;
31 | }
32 |
33 | .cmvMapillaryWidget .mapillary-checkbox {
34 | bottom: 0;
35 | height: 20px;
36 | margin: 10px;
37 | position: absolute;
38 | }
39 |
40 | .cmvMapillaryWidget .mapillary-instructions, .cmvMapillaryWidget .mapillary-no-results {
41 | background-color: #202020;
42 | height: 100%;
43 | position: absolute;
44 | width: 100%;
45 | z-index: 2;
46 | }
47 |
48 | .cmvMapillaryWidget .mapillary-no-results {
49 | display: none;
50 | }
51 |
52 | .cmvMapillaryWidget .mapillary-instructions-text, .cmvMapillaryWidget .mapillary-no-results-text {
53 | color: white;
54 | padding: 10px;
55 | position: absolute;
56 | top: 50px;
57 | z-index: 2;
58 | }
59 |
60 | .cmvMapillaryWidget .mapillary-js {
61 | height: 100%;
62 | position: absolute;
63 | width: 100%;
64 | }
65 |
66 | .cmvMapillaryWidget .mapillary-js canvas {
67 | bottom: 0;
68 | left: 0;
69 | position: absolute;
70 | right: 0;
71 | top: 0;
72 | }
73 |
--------------------------------------------------------------------------------
/widgets/Mapillary/mapillary-style.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 8,
3 | "sources": {
4 | "mapillary-source": {
5 | "tiles": [
6 | "https://d25uarhxywzl1j.cloudfront.net/v0.1/{z}/{x}/{y}.mvt"
7 | ],
8 | "type": "vector",
9 | "minzoom": 0,
10 | "maxzoom": 18
11 | }
12 | },
13 | "layers": [
14 | {
15 | "id": "mapillary-lines",
16 | "type": "line",
17 | "source": "mapillary-source",
18 | "source-layer": "mapillary-sequences",
19 | "minzoom": 6,
20 | "layout": {
21 | "line-join": "round",
22 | "line-cap": "round"
23 | },
24 | "paint": {
25 | "line-color": "#39AF64",
26 | "line-width": 2
27 | }
28 | },
29 | {
30 | "id": "mapillary-overview",
31 | "type": "symbol",
32 | "source": "mapillary-source",
33 | "source-layer": "mapillary-sequence-overview",
34 | "maxzoom": 6,
35 | "layout": {
36 | "icon-image": "Road/Rectangle green yellow (Alt)/2",
37 | "icon-allow-overlap": true,
38 | "symbol-avoid-edges": true
39 | }
40 | },
41 | {
42 | "id": "mapillary-dots",
43 | "type": "symbol",
44 | "source": "mapillary-source",
45 | "source-layer": "mapillary-images",
46 | "minzoom": 14,
47 | "layout": {
48 | "icon-image": "Road/Rectangle green yellow (Alt)/2",
49 | "icon-allow-overlap": true,
50 | "symbol-avoid-edges": true
51 | }
52 | }
53 | ]
54 | }
--------------------------------------------------------------------------------
/widgets/Mapillary/nls/Mapillary.js:
--------------------------------------------------------------------------------
1 | // https://dojotoolkit.org/reference-guide/1.10/dojo/i18n.html
2 | define({
3 | root: {
4 | messages: {
5 | instructions: 'Click the Mapillary button then click the map at your desired location.',
6 | notAvailable: 'Unfortunately, Mapillary imagery is not yet available at that location.'
7 | },
8 | rightClickMenuItem: {
9 | label: 'Mapillary imagery here'
10 | }
11 | },
12 | 'es': true,
13 | 'fr': true,
14 | 'pt-br': true,
15 | 'pt-pt': true
16 | });
17 |
18 |
--------------------------------------------------------------------------------
/widgets/Mapillary/nls/es/Mapillary.js:
--------------------------------------------------------------------------------
1 | define ({
2 | messages: {
3 | instructions: 'Haga clic en el botón de Mapillary a continuación, haga clic en el mapa en su posición deseada.',
4 | notAvailable: 'Desafortunadamente, Mapillary todavía no está disponible en ese lugar.'
5 | },
6 | rightClickMenuItem: {
7 | label: 'Mapillary aquí'
8 | }
9 | });
--------------------------------------------------------------------------------
/widgets/Mapillary/nls/fr/Mapillary.js:
--------------------------------------------------------------------------------
1 | define ({
2 | messages: {
3 | instructions: 'Cliquez sur le bouton Mapillary puis cliquez sur la carte à l\'endroit désiré.',
4 | notAvailable: 'Malheureusement, les images de Mapillary ne sont pas encore disponible à cet endroit.'
5 | },
6 | rightClickMenuItem: {
7 | label: 'Ouvrir Mapillary à cet endroit'
8 | }
9 | });
--------------------------------------------------------------------------------
/widgets/Mapillary/nls/pt-br/Mapillary.js:
--------------------------------------------------------------------------------
1 | // http://dojotoolkit.org/reference-guide/1.10/dojo/i18n.html
2 | define({
3 | messages: {
4 | instructions: 'Clique no botão do Mapillary e depois clique na localização desejada no mapa.',
5 | notAvailable: 'Infelizmente, o Mapillary não está disponível nesta localização.'
6 | },
7 | rightClickMenuItem: {
8 | label: 'Mapillary aqui'
9 | }
10 | });
--------------------------------------------------------------------------------
/widgets/Mapillary/nls/pt-pt/Mapillary.js:
--------------------------------------------------------------------------------
1 | // http://dojotoolkit.org/reference-guide/1.10/dojo/i18n.html
2 | define({
3 | messages: {
4 | instructions: 'Clique no botão do Mapillary e depois clique na localização desejada no mapa.',
5 | notAvailable: 'Infelizmente, o Mapillary não está disponível nesta localização.'
6 | },
7 | rightClickMenuItem: {
8 | label: 'Mapillary aqui'
9 | }
10 | });
--------------------------------------------------------------------------------
/widgets/Mapillary/templates/Mapillary.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/widgets/Maptiks.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 |
5 | 'dojo/_base/lang'
6 | ], function (
7 | declare,
8 | _WidgetBase,
9 |
10 | lang
11 | ) {
12 |
13 | // signup and get your track code and id at https://maptiks.com/
14 | return declare([_WidgetBase], {
15 | baseClass: 'maptiks-widget',
16 |
17 | maptiksTrackcode: null,
18 | maptiksID: null,
19 |
20 | postCreate: function () {
21 | this.inherited(arguments);
22 |
23 | require(['//cdn.maptiks.com/esri3/mapWrapper.js'], lang.hitch(this, function (mapWrapper) {
24 | var container = this.map.container;
25 | var maptiksMapOptions = {
26 | 'maptiks_trackcode': this.maptiksTrackcode,
27 | 'maptiks_id': this.maptiksId
28 | };
29 | mapWrapper(container, maptiksMapOptions, this.map);
30 | }));
31 | }
32 | });
33 | });
--------------------------------------------------------------------------------
/widgets/MessageBox.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 |
5 | 'dojo/_base/lang',
6 | 'dojo/_base/array',
7 | 'dojo/dom-class',
8 | 'dojo/Deferred',
9 | 'dojo/aspect',
10 |
11 | 'dijit/ConfirmDialog',
12 |
13 | 'xstyle/css!./MessageBox/css/MessageBox.css'
14 |
15 | ], function (
16 | declare,
17 | _WidgetBase,
18 |
19 | lang,
20 | array,
21 | domClass,
22 | Deferred,
23 | aspect,
24 |
25 | ConfirmDialog
26 | ) {
27 |
28 | return declare([_WidgetBase], {
29 |
30 | nameSpace: null,
31 | okMessage: 'MessageBox.OK',
32 | cancelMessage: 'MessageBox.Cancel',
33 |
34 | startup: function () {
35 |
36 | // create the namespace if it doesn't exist
37 | if (this.nameSpace && (typeof this.nameSpace === 'string')) {
38 | this.nameSpace = this._createNamespace(this.nameSpace);
39 | }
40 | var ns = this.nameSpace || window;
41 |
42 | // only create it once
43 | if (!ns.MessageBox) {
44 | ns.MessageBox = {
45 | okMessage: this.okMessage,
46 | cancelMessage: this.cancelMessage,
47 |
48 | confirm: lang.hitch(this, function (opts) {
49 | opts = lang.mixin(opts, {
50 | 'class': 'cmvMessageBox cmvConfirmDialog'
51 | });
52 | return this._createDialog(opts);
53 | }),
54 |
55 | alert: lang.hitch(this, function (opts) {
56 | opts = lang.mixin(opts, {
57 | 'class': 'cmvMessageBox cmvAlertDialog'
58 | });
59 | return this._createDialog(opts);
60 | })
61 | };
62 | }
63 | },
64 |
65 | _createNamespace: function () {
66 | var o = null,
67 | d = null;
68 | array.forEach(arguments, function (v) {
69 | d = v.split('.');
70 | o = window[d[0]] = window[d[0]] || {};
71 | array.forEach(d.slice(1), function (v2) {
72 | o = o[v2] = o[v2] || {};
73 | });
74 | });
75 | return o;
76 | },
77 |
78 | _createDialog: function (opts) {
79 | var deferred = new Deferred(),
80 | signal = null,
81 | signals = [];
82 |
83 | var dialog = new ConfirmDialog(opts);
84 | dialog.startup();
85 | domClass.add(dialog.okButton.domNode, 'cmvOKButton');
86 | domClass.add(dialog.cancelButton.domNode, 'cmvCancelButton');
87 |
88 | function destroyDialog () {
89 | array.forEach(signals, function (sig) {
90 | sig.remove();
91 | });
92 | }
93 |
94 | signal = aspect.after(dialog, 'onExecute', lang.hitch(this, function () {
95 | destroyDialog();
96 | deferred.resolve(this.okMessage);
97 | }));
98 | signals.push(signal);
99 |
100 | signal = aspect.after(dialog, 'onCancel', lang.hitch(this, function () {
101 | destroyDialog();
102 | deferred.resolve(this.cancelMessage);
103 | }));
104 | signals.push(signal);
105 |
106 | dialog.show();
107 |
108 | signal = aspect.after(dialog, 'onHide', function () {
109 | signal.remove();
110 | dialog.destroyRecursive();
111 | });
112 |
113 | return deferred;
114 | }
115 | });
116 | });
117 |
--------------------------------------------------------------------------------
/widgets/MessageBox/README.md:
--------------------------------------------------------------------------------
1 | #Message Box for CMV
2 | Show a modal Confirmation or Alert dialog box. Intended to be called from other widgets.
3 |
4 | ---
5 | ## Configurable Options
6 |
7 | | Parameter | Type | Description |
8 | | :----: | :--: | ----------- |
9 | | `nameSpace` | String | Default is null Optional Namespace. If omitted, the global window Namespace is used. |
10 | | `okMessage` | String | Default is 'MessageBox.OK'. |
11 | | `cancelMessage` | String | Default is 'MessageBox.Cancel'. |
12 |
13 |
14 | ---
15 | ## Example Configuration:
16 | ``` javascript
17 | messagebox: {
18 | include: true,
19 | id: 'messagebox',
20 | type: 'invisible',
21 | path: 'widgets/MessageBox',
22 | options: {
23 | nameSpace: 'app' // optional namespace
24 | }
25 | }
26 | ```
27 | ## Screenshot:
28 | 
29 |
30 |
--------------------------------------------------------------------------------
/widgets/MessageBox/css/MessageBox.css:
--------------------------------------------------------------------------------
1 | .cmvMessageBox {
2 | max-width: 275px;
3 | }
4 |
5 | .cmvMessageBox .dijitDialogPaneContent {
6 | padding: 12px;
7 | }
8 |
9 | .cmvMessageBox .dijitDialogPaneActionBar {
10 | padding: 8px;
11 | }
12 |
13 | .cmvMessageBox .dijitDialogPaneActionBar .dijitIcon {
14 | display: inline-block;
15 | margin-top: -4px;
16 | }
17 |
18 | .cmvMessageBox .dijitDialogPaneActionBar .dijitIcon:before {
19 | display: block;
20 | font-family: 'Font Awesome\ 5 Free';
21 | }
22 |
23 | .cmvMessageBox .dijitDialogPaneActionBar .cmvOKButton .dijitIcon:before {
24 | color: #090;
25 | content: '\f00c';
26 | }
27 |
28 | .cmvMessageBox .dijitDialogPaneActionBar .cmvCancelButton .dijitIcon:before {
29 | color: #B00;
30 | content: '\f05e';
31 | }
32 |
33 | .cmvMessageBox .dijitDialogCloseIcon {
34 | display: none;
35 | }
36 |
37 | .cmvMessageBox .dijitDialogTitle:before {
38 | color: #00B;
39 | font-family: 'Font Awesome\ 5 Free';
40 | margin-left: -5px;
41 | margin-right: 10px;
42 | }
43 |
44 | .cmvMessageBox .dijitDialogPaneActionBar {
45 | text-align: center;
46 | }
47 |
48 | .cmvConfirmDialog .dijitDialogTitle:before {
49 | content: '\f059';
50 | }
51 |
52 | .cmvAlertDialog .dijitDialogTitle:before {
53 | content: '\f05a';
54 | }
55 |
56 | .cmvAlertDialog .dijitDialogPaneActionBar .cmvCancelButton {
57 | display: none;
58 | }
--------------------------------------------------------------------------------
/widgets/OpenExternalMap/README.md:
--------------------------------------------------------------------------------
1 | #Open External Map for CMV
2 | Open maps in an external window for Google Hybrid, Google StreetView, Bing Hybrid, Bing Bird's Eye, Bing Streetside, MapQuest and OpenStreetMap. The map is centered on the coordinates based on a map click or Latitude and Longitude values provided by the user. Can be combined with the [Toggle StreetView Tiles](https://github.com/tmcgee/cmv-widgets#toggle-streetview-tiles) widget to show the availability of Google StreetView while clicking on the map.
3 |
4 | ---
5 | ## Configurable Options
6 |
7 | | Parameter | Type | Description |
8 | | :----: | :--: | ----------- |
9 | | `param` | String | Default is 'blah' Description. |
10 |
11 | ---
12 | ## Example Configuration:
13 | ``` javascript
14 | externalmap: {
15 | include: true,
16 | id: 'externalmap',
17 | type: 'titlePane',
18 | canFloat: true,
19 | position: 0,
20 | path: 'widgets/OpenExternalMap',
21 | title: 'Open External Map',
22 | open: true,
23 | options: {
24 | map: true
25 | }
26 | }
27 | ```
28 | ## Screenshot:
29 | 
30 |
31 |
--------------------------------------------------------------------------------
/widgets/OpenExternalMap/css/OpenExternalMap.css:
--------------------------------------------------------------------------------
1 | .cmwOpenExternalMapWidget .OEMapButton {
2 | float: left;
3 | margin: 0 10px 0 0;
4 | }
5 | .cmwOpenExternalMapWidget .OEMapInstructions {
6 | margin-top: 5px;
7 | min-height: 50px;
8 | }
9 | .cmwOpenExternalMapWidget .OEMapLatitudeLabel,
10 | .cmwOpenExternalMapWidget .OEMapLongitudeLabel {
11 | display: inline-block;
12 | font-weight: bold;
13 | margin-right: 5px;
14 | text-align: right;
15 | width: 75px;
16 | }
17 | .cmwOpenExternalMapWidget .OEMapLatitudeInput,
18 | .cmwOpenExternalMapWidget .OEMapLongitudeInput {
19 | margin-bottom: 5px;
20 | width: 95px;
21 | }
22 | .cmwOpenExternalMapWidget .OEMapLatitudeDMSLabel,
23 | .cmwOpenExternalMapWidget .OEMapLongitudeDMSLabel {
24 | display: inline-block;
25 | margin-left: 5px;
26 | }
27 | .cmwOpenExternalMapWidget .buttonContainer {
28 | margin-top: 20px;
29 | text-align: center;
30 | }
31 | .cmwOpenExternalMapWidget .buttonContainer .mapLabel {
32 | font-weight: bold;
33 | margin-bottom: 5px;
34 | margin-top: 10px;
35 | }
36 | .cmwOpenExternalMapWidget .buttonContainer .mapButton {
37 | margin-bottom: 5px;
38 | margin-right: 20px;
39 | }
40 | .cmwOpenExternalMapWidget .buttonContainer .dijitButtonDisabled .fa {
41 | opacity: 0.65;
42 | }
43 | .cmwOpenExternalMapWidget .fab:before {
44 | font-family: "Font Awesome 5 Brands";
45 | }
--------------------------------------------------------------------------------
/widgets/OpenExternalMap/nls/resource.js:
--------------------------------------------------------------------------------
1 | define({
2 | root: {
3 | locationInstructions: 'Click the button and then click the map OR just enter the Latitude and Longitude.',
4 | latitudeLabel: 'Latitude',
5 | latitudePlaceholder: '37.776840',
6 | latitudeInvalid: 'Please enter a valid number for Latitude.',
7 | longitudeLabel: 'Longitude',
8 | longitudePlaceholder: '-122.421985',
9 | longitudeInvalid: 'Please enter a valid number for Longitude.',
10 | streetViewNotAvailable: 'StreetView Imagery is not available for this area.'
11 | }
12 | });
--------------------------------------------------------------------------------
/widgets/OpenExternalMap/templates/OpenExternalMap.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/widgets/PrintPlus/css/Print.css:
--------------------------------------------------------------------------------
1 | /*csslint box-model: false, order-alphabetical: false */
2 | /*lcs Print Enhancements - added "position: relative" to anchor the position of relativeScale*/
3 | .gis_PrintPlusDijit {
4 | width: 100%;
5 | position: relative;
6 | }
7 |
8 | .gis_PrintPlusDijit .printResult {
9 | height: 28px;
10 | margin-bottom: 3px;
11 | width: 100%;
12 | }
13 |
14 | .gis_PrintPlusDijit .printResult .printResultTable {
15 | width: 100%;
16 | }
17 |
18 | .gis_PrintPlusDijit .printResult .bold {
19 | font-weight: bold;
20 | }
21 |
22 | .gis_PrintPlusDijit .printResultError {
23 | font-weight: bold;
24 | color: red;
25 | }
26 |
27 | .gis_PrintPlusDijit .printResultHover table:hover {
28 | background-color: #D4E7F8;
29 | cursor: pointer;
30 | }
31 |
32 | .gis_PrintPlusDijit .buttonActionBar {
33 | padding: 3px 0 2px 0;
34 | text-align: right;
35 | width: 100%;
36 | }
37 |
38 | .gis_PrintPlusDijit .formContainer {
39 | margin-bottom: -1px;
40 | width: 100%;
41 | }
42 |
43 | .gis_PrintPlusDijit .resultsContainer {
44 | width: 100%;
45 | margin-top: 10px;
46 | margin-bottom: 5px;
47 | }
48 |
49 | .gis_PrintPlusDijit .pdfIcon {
50 | width: 30px;
51 | background-image: url(../images/pdf.png);
52 | background-repeat: no-repeat;
53 | background-position: center;
54 | }
55 |
56 | .gis_PrintPlusDijit .imageIcon {
57 | width: 30px;
58 | background-image: url(../images/image.png);
59 | background-repeat: no-repeat;
60 | background-position: center;
61 | }
--------------------------------------------------------------------------------
/widgets/PrintPlus/images/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/PrintPlus/images/image.png
--------------------------------------------------------------------------------
/widgets/PrintPlus/images/pdf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/PrintPlus/images/pdf.png
--------------------------------------------------------------------------------
/widgets/PrintPlus/templates/PrintResult.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ${count}.
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/widgets/QRCode/README.md:
--------------------------------------------------------------------------------
1 | #QR Codes for CMV
2 | Shows a QR code for the current map to open mobile applications on your phone/tablet such as:
3 |
4 | - Google Maps
5 | - OSMAnd
6 | - Waze
7 | - Apple Maps
8 | - Trek2There (Esri Labs)
9 | - Navigator for ArcGIS
10 |
11 | ---
12 | ## Example Configuration:
13 | ``` javascript
14 | qrcode: {
15 | include: true,
16 | type: 'titlePane',
17 | position: 0,
18 | path: 'widgets/QRCode',
19 | title: 'QR Code',
20 | open: true,
21 | options: {
22 | map: true
23 | }
24 | }
25 | ```
26 | ## Screenshot:
27 | 
28 |
29 | This widget was adapted from [this one](https://github.com/Esri/arcgis-webappbuilder-widgets-themes/tree/master/widgets/Qr2Go) intended for the Esri Web App Builder.
30 |
31 |
--------------------------------------------------------------------------------
/widgets/QRCode/css/QRCode.css:
--------------------------------------------------------------------------------
1 | .cmvQRCodeMapWidget {
2 | position: relative;
3 | width: 100%;
4 | }
5 | .cmvQRCodeMapWidget .QRCodeButton {
6 | position: absolute;
7 | right: 5px;
8 | top: 50px;
9 | }
10 | .cmvQRCodeMapWidget .QRCodeForm {
11 | margin: 10px 5px;
12 | }
13 | .cmvQRCodeMapWidget .QRCodeCode {
14 | margin: 15px 25%;
15 | min-width: 128px;
16 | text-align: center;
17 | width: 100%;
18 | }
--------------------------------------------------------------------------------
/widgets/QRCode/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/QRCode/images/icon.png
--------------------------------------------------------------------------------
/widgets/QRCode/nls/QRCode.js:
--------------------------------------------------------------------------------
1 | define({
2 | root: ({
3 | qrCodeName: 'QRCode',
4 | clickMapName: 'Click on the map'
5 | })
6 | });
--------------------------------------------------------------------------------
/widgets/QRCode/templates/QRCode.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
10 |
11 |
Scan this QR Code with your phone/tablet:
12 |
15 |
16 |
--------------------------------------------------------------------------------
/widgets/Report/css/Report.css:
--------------------------------------------------------------------------------
1 | .cmvReportWidget {
2 | background-color: rgba(33, 33, 33, 0.8);
3 | display: none;
4 | height: 100%;
5 | left: 0;
6 | position: absolute;
7 | top: 0;
8 | width: 100%;
9 | z-index: 1001;
10 | }
11 |
12 | .cmvReportWidget .reportOverlayContents {
13 | display: block;
14 | font-size: 16px;
15 | height: 50px;
16 | left: 0;
17 | position: absolute;
18 | text-align: center;
19 | top: calc(50% - 25px);
20 | vertical-align: middle;
21 | width: 100%;
22 | }
23 |
24 | .cmvReportWidget .reportOverlayContents i {
25 | color: #FF0;
26 | }
27 |
28 | .cmvReportWidget .reportOverlayContents div {
29 | color: #FFF;
30 | margin-top: 15px;
31 | }
--------------------------------------------------------------------------------
/widgets/Report/nls/Report.js:
--------------------------------------------------------------------------------
1 | define({
2 | root: {
3 | label: 'Preparing your report...'
4 | }
5 | });
--------------------------------------------------------------------------------
/widgets/Report/templates/Report.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/widgets/ReportReactor.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 |
5 | 'dojo/query',
6 | 'dojo/on',
7 | 'dojo/topic',
8 | 'dojo/_base/lang'
9 |
10 | ], function (
11 | declare,
12 | _WidgetBase,
13 |
14 | domQuery,
15 | on,
16 | topic,
17 | lang
18 | ) {
19 | return declare([_WidgetBase], {
20 |
21 | postCreate: function () {
22 | this.inherited(arguments);
23 |
24 | this.map.infoWindow.on('selection-change', lang.hitch(this, function (evt) {
25 | var infoWindow = evt.target;
26 | var nodes = domQuery('#parcel-report', infoWindow.domNode),
27 | targetNode = null;
28 | if (nodes.length > 0) {
29 | targetNode = nodes[0];
30 | if (targetNode) {
31 | on(targetNode, 'click', lang.hitch(this, 'parcelReportClick'));
32 | }
33 | }
34 | }));
35 | },
36 |
37 | parcelReportClick: function () {
38 | var feature = this.map.infoWindow.getSelectedFeature();
39 | topic.publish('parcelReportWidget/createReport', {
40 | feature: feature
41 | });
42 | return false;
43 | }
44 |
45 | });
46 | });
--------------------------------------------------------------------------------
/widgets/Search/GetDistinctValues.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dojo/_base/lang',
4 | 'dojo/_base/array',
5 | 'dojo/topic',
6 | 'dojo/Deferred',
7 |
8 | 'esri/tasks/query',
9 | 'esri/tasks/QueryTask'
10 |
11 | ], function (
12 | declare,
13 | lang,
14 | arrayUtil,
15 | topic,
16 | Deferred,
17 |
18 | Query,
19 | QueryTask
20 | ) {
21 |
22 | return declare(null, {
23 |
24 | url: null,
25 | fieldName: null,
26 |
27 | /**
28 | * @constructor
29 | * @param {string} url The URL to the ArcGIS Server REST resource that represents a map service layer.
30 | * @param {string} fieldName The field name for which to retrieve unique values.
31 | * @param {string} where The where expression with which to filter the query.
32 | */
33 | constructor: function (url, fieldName, where) {
34 | this.url = url;
35 | this.fieldName = fieldName;
36 | if (!where) {
37 | where = '1=1';
38 | }
39 | this.where = where;
40 | },
41 |
42 | /**
43 | * Execute the query to return distinct values.
44 | * @return {void}
45 | */
46 | executeQuery: function () {
47 | var deferred = new Deferred();
48 |
49 | var queryTask = new QueryTask(this.url);
50 | var query = new Query();
51 | query.outFields = [this.fieldName];
52 | query.orderByFields = [this.fieldName];
53 | query.returnDistinctValues = true;
54 | query.returnGeometry = false;
55 | query.where = this.where;
56 |
57 | queryTask.on('complete', lang.hitch(this, function (records) {
58 | var featureSet = records.featureSet,
59 | results = [];
60 | if (featureSet.features) {
61 | if (featureSet.features.length > 0) {
62 | results = arrayUtil.map(featureSet.features, function (feature) {
63 | return feature.attributes[this.fieldName];
64 | }, this);
65 | deferred.resolve(results);
66 | }
67 | }
68 | }));
69 |
70 | queryTask.on('error', lang.hitch(this, function (error) {
71 | // an error occurred so no loading of the Select control with values
72 | topic.publish('viewer/handleError', {
73 | error: error
74 | });
75 | deferred.reject(error);
76 | }));
77 |
78 | queryTask.execute(query);
79 | return deferred;
80 | }
81 | });
82 | });
--------------------------------------------------------------------------------
/widgets/Search/QueryBuilder/lib/query-builder.default.min.css:
--------------------------------------------------------------------------------
1 | /*!
2 | * jQuery QueryBuilder 2.4.1
3 | * Copyright 2014-2017 Damien "Mistic" Sorel (http://www.strangeplanet.fr)
4 | * Licensed under MIT (http://opensource.org/licenses/MIT)
5 | */
6 |
7 | .query-builder .rule-container,.query-builder .rule-placeholder,.query-builder .rules-group-container{position:relative;margin:4px 0;border-radius:5px;padding:5px;border:1px solid #EEE;background:rgba(255,255,255,.9)}.query-builder .drag-handle,.query-builder .error-container,.query-builder .rule-container .rule-filter-container,.query-builder .rule-container .rule-operator-container,.query-builder .rule-container .rule-value-container{display:inline-block;margin:0 5px 0 0;vertical-align:middle}.query-builder .rules-group-container{padding:10px 10px 6px;border:1px solid #DCC896;background:rgba(250,240,210,.5)}.query-builder .rules-group-header{margin-bottom:10px}.query-builder .rules-group-header .group-conditions .btn.readonly:not(.active),.query-builder .rules-group-header .group-conditions input[name$=_cond]{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;white-space:nowrap}.query-builder .rules-group-header .group-conditions .btn.readonly{border-radius:3px}.query-builder .rules-list{list-style:none;padding:0 0 0 15px;margin:0}.query-builder .rule-value-container{border-left:1px solid #DDD;padding-left:5px}.query-builder .rule-value-container label{margin-bottom:0;font-weight:400}.query-builder .rule-value-container label.block{display:block}.query-builder .rule-value-container input[type=number],.query-builder .rule-value-container input[type=text],.query-builder .rule-value-container select{padding:1px}.query-builder .error-container{display:none;cursor:help;color:red}.query-builder .has-error{background-color:#FDD;border-color:#F99}.query-builder .has-error .error-container{display:inline-block!important}.query-builder .dragging::after,.query-builder .dragging::before,.query-builder .rules-list>:last-child::after{display:none}.query-builder .rules-list>::after,.query-builder .rules-list>::before{content:'';position:absolute;left:-10px;width:10px;height:calc(50% + 4px);border-color:#CCC;border-style:solid}.query-builder .rules-list>::before{top:-4px;border-width:0 0 2px 2px}.query-builder .rules-list>::after{top:50%;border-width:0 0 0 2px}.query-builder .rules-list>:first-child::before{top:-12px;height:calc(50% + 14px)}.query-builder .rules-list>:last-child::before{border-radius:0 0 0 4px}.query-builder .error-container+.tooltip .tooltip-inner{color:#F99!important}.query-builder p.filter-description{margin:5px 0 0;background:#D9EDF7;border:1px solid #BCE8F1;color:#31708F;border-radius:5px;padding:2.5px 5px;font-size:.8em}.query-builder .rules-group-header [data-invert]{margin-left:5px}.query-builder .drag-handle{cursor:move;vertical-align:middle;margin-left:5px}.query-builder .dragging{position:fixed;opacity:.5;z-index:100}.query-builder .rule-placeholder{border:1px dashed #BBB;opacity:.7}
--------------------------------------------------------------------------------
/widgets/Search/QueryBuilder/lib/querybuilder-bootstrap-shim.min.css:
--------------------------------------------------------------------------------
1 | .query-builder,.query-builder *{margin:0;padding:0;box-sizing:border-box}.query-builder{font-family:sans-serif}.query-builder .hide{display:none}.query-builder .pull-right{float:right!important}.query-builder .btn{text-transform:none;display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.query-builder .btn.focus,.query-builder .btn:focus,.query-builder .btn:hover{color:#333;text-decoration:none}.query-builder .btn.active,.query-builder .btn:active{background-image:none;outline:0;box-shadow:0 3px 5px rgba(0,0,0,.125) inset}.query-builder .btn-success{color:#FFF;background-color:#5CB85C;border-color:#4CAE4C}.query-builder .btn-primary{color:#FFF;background-color:#337AB7;border-color:#2E6DA4}.query-builder .btn-danger{color:#FFF;background-color:#D9534F;border-color:#D43F3A}.query-builder .btn-success.active,.query-builder .btn-success.focus,.query-builder .btn-success:active,.query-builder .btn-success:focus,.query-builder .btn-success:hover{color:#FFF;background-color:#449D44;border-color:#398439}.query-builder .btn-primary.active,.query-builder .btn-primary.focus,.query-builder .btn-primary:active,.query-builder .btn-primary:focus,.query-builder .btn-primary:hover{color:#FFF;background-color:#286090;border-color:#204D74}.query-builder .btn-danger.active,.query-builder .btn-danger.focus,.query-builder .btn-danger:active,.query-builder .btn-danger:focus,.query-builder .btn-danger:hover{color:#FFF;background-color:#C9302C;border-color:#AC2925}.query-builder .btn-group{position:relative;display:inline-block;vertical-align:middle}.query-builder .btn-group>.btn{position:relative;float:left}.query-builder .btn-group>.btn:first-child{margin-left:0}.query-builder .btn-group>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.query-builder .btn-group>.btn:last-child:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.query-builder .btn-group .btn+.btn,.query-builder .btn-group .btn+.btn-group,.query-builder .btn-group .btn-group+.btn,.query-builder .btn-group .btn-group+.btn-group{margin-left:-1px}.query-builder .btn-group-xs>.btn,.query-builder .btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}
--------------------------------------------------------------------------------
/widgets/Search/css/AdvancedSearch.css:
--------------------------------------------------------------------------------
1 |
2 | .cmvSearchWidget .query-builder .rules-group-container {
3 | background-color: #F9F9F9;
4 | border: 1px solid rgb(158, 158, 158);
5 | padding: 5px;
6 | }
7 |
8 | .cmvSearchWidget .query-builder > .rules-group-container {
9 | background-color: inherit;
10 | border-width: 0;
11 | margin-top: 0;
12 | }
13 |
14 | .cmvSearchWidget .query-builder .rule-placeholder {
15 | background-color: inherit;
16 | padding: 0;
17 | }
18 |
19 | .cmvSearchWidget .query-builder .rule-container {
20 | background-color: #F0F0F0;
21 | }
22 |
23 | .cmvSearchWidget .query-builder .rules-operator-container {
24 | margin-left: 5px;
25 | }
26 |
27 | .cmvSearchWidget .query-builder input[type=number],
28 | .cmvSearchWidget .query-builder input[type=text],
29 | .cmvSearchWidget .query-builder select {
30 | border-radius: 4px;
31 | -webkit-box-shadow: none;
32 | box-shadow: none;
33 | margin-top: 2px;
34 | padding: 6px;
35 | }
36 | .cmvSearchWidget .query-builder select {
37 | border-color: rgb(158, 158, 158);
38 | }
39 |
40 | .cmvSearchWidget .query-builder .selectize-control.single .selectize-input {
41 | background-color: #FFF;
42 | background-image: none;
43 | border-color: rgb(158, 158, 158);
44 | border-radius: 4px;
45 | margin-top: 2px;
46 | padding: 4px;
47 | }
48 | .cmvSearchWidget .query-builder .selectize-control.single .selectize-input:after {
49 | border-width: 5px 3px 0;
50 | right: 8px;
51 | }
52 | /*
53 | .cmvSearchWidget .advancedSearchImportExport {
54 | float: right;
55 | }
56 |
57 | .cmvSearchWidget #searchWidgetImportExportDialog {
58 | text-align: center;
59 | }
60 |
61 | .cmvSearchWidget #searchWidgetImportExportDialog textarea {
62 | min-width: 300px;
63 | width: auto;
64 | }
65 |
66 | .cmvSearchWidget #searchWidgetImportExportDialog div[data-dojo-attach-point="searchAdvancedImportDialogBtn"] {
67 | margin-top: 5px;
68 | }
69 | */
--------------------------------------------------------------------------------
/widgets/Search/css/Draw.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";
2 |
3 | @font-face {
4 | font-family: "draw-icons";
5 | font-style: normal;
6 | font-weight: normal;
7 | src:url("./fonts/draw-icons.eot");
8 | src:url("./fonts/draw-icons.eot?#iefix") format("embedded-opentype"),
9 | url("./fonts/draw-icons.woff") format("woff"),
10 | url("./fonts/draw-icons.ttf") format("truetype"),
11 | url("./fonts/draw-icons.svg#draw-icons") format("svg");
12 | }
13 |
14 | /* csslint order-alphabetical: 0 */
15 | .cmvSearchWidget .draw-icon-rectangle:before,
16 | .cmvSearchWidget .draw-icon-circle:before,
17 | .cmvSearchWidget .draw-icon-freehand-polygon:before,
18 | .cmvSearchWidget .draw-icon-point:before,
19 | .cmvSearchWidget .draw-icon-polyline:before,
20 | .cmvSearchWidget .draw-icon-text:before,
21 | .cmvSearchWidget .draw-icon-freehand-polyline:before,
22 | .cmvSearchWidget .draw-icon-polygon:before,
23 | .cmvSearchWidget .draw-icon-polygon:before {
24 | font-family: "draw-icons";
25 | font-style: normal;
26 | font-variant: normal;
27 | font-weight: normal;
28 | text-transform: none;
29 | speak: none;
30 | line-height: 1;
31 | -webkit-font-smoothing: antialiased;
32 | -moz-osx-font-smoothing: grayscale;
33 | }
34 |
35 | .cmvSearchWidget .draw-icon-rectangle:before {
36 | content: "\e005";
37 | }
38 |
39 | .cmvSearchWidget .draw-icon-circle:before {
40 | content: "\e001";
41 | }
42 |
43 | .cmvSearchWidget .draw-icon-freehand-polygon:before {
44 | content: "\e002";
45 | }
46 |
47 | .cmvSearchWidget .draw-icon-point:before {
48 | content: "\e003";
49 | }
50 |
51 | .cmvSearchWidget .draw-icon-polyline:before {
52 | content: "\e004";
53 | }
54 |
55 | .cmvSearchWidget .draw-icon-text:before {
56 | content: "\e006";
57 | }
58 |
59 | .cmvSearchWidget .draw-icon-freehand-polyline:before {
60 | content: "\e007";
61 | }
62 |
63 | .cmvSearchWidget .draw-icon-polygon:before {
64 | content: "\e008";
65 | }
66 |
--------------------------------------------------------------------------------
/widgets/Search/css/Search.css:
--------------------------------------------------------------------------------
1 | .cmvSearchWidget {
2 | height: 520px;
3 | }
4 |
5 | .cmvSearchWidget .tabContainer {
6 | height: 100%;
7 | width: 100%;
8 | }
9 |
10 | .cmvSearchWidget .searchTab {
11 | overflow-y: hidden;
12 | padding: 10px;
13 | width: 100%;
14 | }
15 |
16 | .cmvSearchWidget .searchByAttribute {
17 | display: flex;
18 | flex-direction: column;
19 | }
20 |
21 | .cmvSearchWidget .searchSelector {
22 | margin-top: 10px;
23 | }
24 |
25 | .cmvSearchWidget .searchBody {
26 | border: 1px solid #BBB;
27 | border-radius: 4px;
28 | flex: 1;
29 | margin-bottom: 10px;
30 | overflow-x: hidden;
31 | overflow-y: auto;
32 | padding-top: 5px;
33 | }
34 |
35 | .cmvSearchWidget .searchContains {
36 | border-bottom: 1px solid #CCC;
37 | padding: 0 0 10px 20px;
38 | }
39 |
40 | .cmvSearchWidget .searchBottomButtons {
41 | bottom: 5px;
42 | left: 0;
43 | position: absolute;
44 | right: 0;
45 | }
46 |
47 | .cmvSearchWidget label,
48 | .cmvSearchWidget .searchFieldLabel {
49 | font-weight: bold;
50 | margin-left: 5px;
51 | margin-right: 5px;
52 | }
53 |
54 | .cmvSearchWidget .searchFieldLabel {
55 | display: inline-block;
56 | margin-top: 5px;
57 | text-align: right;
58 | vertical-align: top;
59 | white-space: nowrap;
60 | }
61 |
62 | .cmvSearchWidget .searchField {
63 | margin: 0 5px 10px 5px;
64 | max-width: 400px;
65 | }
66 |
67 | .cmvSearchWidget .dijitSelect {
68 | height: 30px;
69 | width: 100%;
70 | }
71 |
72 | .cmvSearchWidget .searchFeaturesIcon {
73 | background-repeat: no-repeat;
74 | float: left;
75 | height: 40px;
76 | margin: 10px 11px 12px 11px;
77 | text-align: center;
78 | width: 40px;
79 | }
80 |
81 | .cmvSearchWidget .searchFeaturesIcon:hover {
82 | background-color: #C0C0C0;
83 | }
84 |
85 | .cmvSearchWidget .centered {
86 | text-align: center;
87 | }
--------------------------------------------------------------------------------
/widgets/Search/css/fonts/draw-icons.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/Search/css/fonts/draw-icons.eot
--------------------------------------------------------------------------------
/widgets/Search/css/fonts/draw-icons.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Generated by Fontastic.me
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/widgets/Search/css/fonts/draw-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/Search/css/fonts/draw-icons.ttf
--------------------------------------------------------------------------------
/widgets/Search/css/fonts/draw-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/Search/css/fonts/draw-icons.woff
--------------------------------------------------------------------------------
/widgets/Search/nls/Search.js:
--------------------------------------------------------------------------------
1 | // http://dojotoolkit.org/reference-guide/1.10/dojo/i18n.html
2 | define({
3 | root: {
4 | Labels: {
5 | selectALayer: 'Select A Layer',
6 | selectAQuery: 'Select A Query',
7 | spatialFilter: 'Apply Spatial Filter',
8 | buffer: 'Buffer',
9 | displayBuffer: 'Display Buffer Only',
10 | attributeAddToExisting: 'Add To Existing Results',
11 | spatialAddToExisting: 'Add To Existing Results',
12 | selectFeaturesBy: 'Select Features By',
13 | tabTitleByAttribute: 'By Attribute',
14 | tabTitleByShape: 'By Shape',
15 | exactMatches: 'Find exact matches only',
16 |
17 | importDialogTitle: 'Import Query',
18 | exportDialogTitle: 'Export Query',
19 |
20 | // used for "Spatial Filters"
21 | spatialFilters: {
22 | entireMap: 'Entire Map (No Filter)',
23 | currentExtent: 'Current Map Extent',
24 | identifiedFeature: 'Identified Feature',
25 | searchSource: 'Spatial Filter Used for Search',
26 | searchFeatures: 'Features in Search Results',
27 | searchSelected: 'Selected Features in Search Results',
28 | searchBuffer: 'Buffer Used for Search'
29 | }
30 | },
31 | Buttons: {
32 | search: {
33 | label: 'Search',
34 | showLabel: true
35 | },
36 | stopDrawing: {
37 | label: 'Stop Drawing',
38 | showLabel: true
39 | },
40 | selectByRectangle: {
41 | label: 'Select By Rectangle',
42 | showLabel: false
43 | },
44 | selectByCircle: {
45 | label: 'Select By Circle',
46 | showLabel: false
47 | },
48 | selectByPoint: {
49 | label: 'Select By Point',
50 | showLabel: false
51 | },
52 | selectByPolyline: {
53 | label: 'Select By Line',
54 | showLabel: false
55 | },
56 | selectByFreehandPolyline: {
57 | label: 'Select By Freehand Line',
58 | showLabel: false
59 | },
60 | selectByPolygon: {
61 | label: 'Select By Polygon',
62 | showLabel: false
63 | },
64 | selectByFreehandPolygon: {
65 | label: 'Select By Freehand Polygon',
66 | showLabel: false
67 | },
68 | selectByIdentify: {
69 | label: 'Select By Identified Feature(s)',
70 | showLabel: false
71 | },
72 | selectBySelected: {
73 | label: 'Select By Selected Feature(s)',
74 | showLabel: false
75 | },
76 | switchToBasic: {
77 | label: 'Switch to Basic Search',
78 | showLabel: true
79 | },
80 | switchToAdvanced: {
81 | label: 'Switch to Advanced Search',
82 | showLabel: true
83 | },
84 | importSQL: {
85 | label: 'Import',
86 | showLabel: false
87 | },
88 | exportSQL: {
89 | label: 'Export',
90 | showLabel: false
91 | },
92 | clearFields: {
93 | label: 'Clear',
94 | showLabel: true
95 | }
96 | }
97 | }
98 | });
--------------------------------------------------------------------------------
/widgets/Share/README.md:
--------------------------------------------------------------------------------
1 | #Share Widget for CMV
2 | Share your map by using Facebook, Twitter, Google+, E-Mail, Link, or embedded iFrame code.
3 |
4 | ---
5 | ## Configurable Options
6 |
7 | | Parameter | Type | Description |
8 | | :----: | :--: | ----------- |
9 | | `bitlyLogin` | String | The username for the bitly url shortener. Default = '' |
10 | | `bitlyKey` | String | The API Key for the bitly url shortener. Default = '' |
11 | | `title` | String | Link title. If you do not provide one, the application's title will be used. Default = '' |
12 | | `image` | String | Image url that will be used when sharing with Facebook. Default = '' |
13 | | `summary` | String | Summary text that will be used when sharing with Facebook. Default = '' |
14 | | `hashtags` | String | Hash tags that will be used when sharing with Twitter. Default = '' |
15 | | `useExtent` | Boolean | Set the default state for checkbox for 'include map extent'. Default = false |
16 |
17 | ###Note:
18 | The user of the application must have an account for Facebook, Twitter or Google+ to share with any of those services. No account is required for sharing via E-Mail or Link.
19 |
20 | You can copy the Embed Map text box contents and paste that into an html document to embed this map in a different website.
21 |
22 | ###Note:
23 | The bitly API does not shorten the url, if you are running the application using your local machine with a url that starts with `http://localhost` or `http://machinename`
24 |
25 | ---
26 | ## Example Configuration for use as a floating widget:
27 | ``` javascript
28 | share: {
29 | include: true,
30 | id: 'share',
31 | type: 'floating',
32 | path: 'widgets/Share',
33 | title: 'Share This Map',
34 | options: {
35 | map: true
36 | }
37 | }
38 | ```
39 |
40 | ## Example Configuration for use as a titlePane widget:
41 | ``` javascript
42 | share: {
43 | include: true,
44 | id: 'share',
45 | type: 'titlePane',
46 | path: 'widgets/Share',
47 | title: 'Share This Map',
48 | open: true,
49 | canFloat: true,
50 | position: 0,
51 | options: {
52 | map: true
53 | }
54 | }
55 | ```
56 |
57 | ## Screenshot:
58 | 
59 |
60 | ---
61 | ##Credits
62 | This widget was originally adapted from the Share widget for WebApp Builder found [here](https://github.com/USEPA/Public_Web_AppBuilder/tree/master/widgets/Share)
--------------------------------------------------------------------------------
/widgets/Share/css/Share.css:
--------------------------------------------------------------------------------
1 | /*csslint box-model: false */
2 | .cmvShareWidget {
3 | padding-bottom: 10px;
4 | width: 100%;
5 | }
6 |
7 | .floatingWidget .cmvShareWidget {
8 | margin: 10px;
9 | width: 250px;
10 | }
11 |
12 | .cmvShareWidget label {
13 | display: block;
14 | font-weight: bold;
15 | }
16 |
17 | .cmvShareWidget .icon-clear {
18 | clear: both;
19 | }
20 |
21 | .cmvShareWidget .icon-container {
22 | margin: 10px;
23 | }
24 |
25 | .cmvShareWidget .use-extent-container,
26 | .cmvShareWidget .map-url-container,
27 | .cmvShareWidget .embed-map-container,
28 | .cmvShareWidget .embed-map-size-container {
29 | margin-bottom: 10px;
30 | }
31 |
32 | .cmvShareWidget .map-size-label,
33 | .cmvShareWidget .extent-checkbox {
34 | float: left;
35 | margin-right: 5px;
36 | }
37 |
38 | .cmvShareWidget .esriRTL .map-size-label,
39 | .cmvShareWidget .esrlRTL .extent-checkbox {
40 | float: right;
41 | margin-left: 5px;
42 | }
43 |
44 | .cmvShareWidget .map-url {
45 | width: 100%;
46 | }
47 |
48 | .cmvShareWidget .embed-map-size-dropdown {
49 | float: left;
50 | }
51 |
52 | .cmvShareWidget .esriRTL .embed-map-size-dropdown {
53 | float: right;
54 | }
55 |
56 | .cmvShareWidget .textarea {
57 | height: 100px;
58 | margin-bottom: 10px;
59 | padding: 5px;
60 | width: 100%;
61 | }
62 |
63 | .floatingWidget .cmvShareWidget .map-url,
64 | .floatingWidget .cmvShareWidget .textarea {
65 | width: 95%;
66 | }
67 |
68 | .cmvShareWidget .icon {
69 | color: #666;
70 | color: rgba(0, 0, 0, 0.5);
71 | cursor: pointer;
72 | display: block;
73 | float: left;
74 | font-family: 'Font Awesome\ 5 Free';
75 | font-size: 32px;
76 | margin-bottom: 10px;
77 | margin-right: 15px;
78 | text-decoration: none;
79 | }
80 |
81 | .cmvShareWidget .icon-gplus {
82 | font-size: 25px;
83 | margin-top: 2px;
84 | }
85 | .cmvShareWidget .icon-link {
86 | font-size: 26px;
87 | margin-top: 2px;
88 | }
89 |
90 | .cmvShareWidget .icon:hover {
91 | color: #000;
92 | color: rgba(0, 0, 0, 1);
93 | }
94 |
95 | .cmvShareWidget .icon:visited {
96 | color: #666;
97 | color: rgba(0, 0, 0, 0.5);
98 | }
99 |
100 | .cmvShareWidget .esriRTL .icon {
101 | float: right;
102 | margin: 0 0 0 10px;
103 | }
104 |
105 | .cmvShareWidget .icon-twitter:before {
106 | content: '\f099';
107 | }
108 |
109 | .cmvShareWidget .icon-facebook:before {
110 | content: '\f082';
111 | }
112 |
113 | .cmvShareWidget .icon-gplus:before {
114 | content: '\f0d5';
115 | }
116 |
117 | .cmvShareWidget .icon-mail:before {
118 | content: '\f0e0';
119 | }
120 |
121 | .cmvShareWidget .icon-link:before {
122 | content: '\f0c1';
123 | }
--------------------------------------------------------------------------------
/widgets/Share/nls/Share.js:
--------------------------------------------------------------------------------
1 | define({
2 | root: ({
3 | title: 'Share',
4 | url: 'Map Link',
5 | embed: 'Embed Map',
6 | extent: 'include map extent',
7 | size: 'Size (w/h):',
8 | facebookTooltip: 'Facebook',
9 | twitterTooltip: 'Twitter',
10 | gplusTooltip: 'Google Plus',
11 | emailTooltip: 'Email'
12 | })
13 | });
14 |
--------------------------------------------------------------------------------
/widgets/Share/templates/Share.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
${i18n.extent}
13 |
14 |
15 | ${i18n.url}
16 |
17 |
18 |
19 |
${i18n.embed}
20 |
21 |
22 |
23 |
24 |
25 |
${i18n.size}
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/widgets/ToggleStreetViewTiles.js:
--------------------------------------------------------------------------------
1 | define([
2 | 'dojo/_base/declare',
3 | 'dijit/_WidgetBase',
4 |
5 | 'dojo/_base/lang',
6 | 'dojo/topic',
7 |
8 | 'esri/layers/WebTiledLayer'
9 | ], function (
10 | declare,
11 | _WidgetBase,
12 |
13 | lang,
14 | topic,
15 |
16 | WebTiledLayer
17 | ) {
18 | return declare([_WidgetBase], {
19 | url: 'https://maps.googleapis.com/maps/vt?lyrs=svv&apiv3&style=40,18&gl=US&&x={col}&y={row}&z={level}',
20 |
21 | options: {
22 | id: 'streetViewAvailability',
23 | title: ' StreetView Availability',
24 | copyright: 'Google',
25 | opacity: 1,
26 | minScale: 500000,
27 | visible: false
28 | },
29 |
30 | postCreate: function () {
31 | this.inherited(arguments);
32 | this.svLayer = new WebTiledLayer(this.url, this.options);
33 | this.map.addLayer(this.svLayer);
34 | this.own(topic.subscribe('mapClickMode/currentSet', lang.hitch(this, 'checkMapClickMode')));
35 | },
36 |
37 | checkMapClickMode: function (mode) {
38 | if (this.svLayer) {
39 | this.svLayer.setVisibility(mode === 'streetview' || mode === 'externalmap');
40 | }
41 | }
42 | });
43 | });
--------------------------------------------------------------------------------
/widgets/What3Words/README.md:
--------------------------------------------------------------------------------
1 | #what3words Widget for CMV
2 | A simple widget to send a 3 word address or lat/lng to what3words and zoom the map to the resulting location. The lat/lng and 3 word address for the location are displayed from the search result.
3 |
4 | ---
5 | ## Configurable Options
6 |
7 | | Parameter | Type | Description |
8 | | :----: | :--: | ----------- |
9 | | `key` | String | Default is ` `. Your what3words key. You will need to supply this. Available [here]( https://developer.what3words.com/api-register). (required) |
10 | | `url` | String | Default is `https://api.what3words.com/`. The url for the what3words api. You should not need to change this. |
11 | | `symbol` | Object | JSON used with [PictureMarkerSymbol](https://developers.arcgis.com/javascript/jsapi/picturemarkersymbol-amd.html) for the placemark. |
12 | | `growlID` | String | Default is `w3w-search`. Used to dismiss the "Searching" growl when the search is completed. |
13 | | `spatialReference` | Number | Default is `null`. Spatial Reference. uses the map's spatial reference if none provided. |
14 | | `pointExtentSize` | Number | Default is `null`. Uses 0.001 for decimal degrees (wkid 4326) or 2500 for meters/feet if none provided. |
15 | | `proj4BaseURL` | String | Default is `https://epsg.io/`. The base url for reprojecting points not in WGS 84 (4326) or Web Mercator (3857/10211). |
16 | | `proj4Catalog` | String | Default is `EPSG`. Options are ESRI, EPSG and SR-ORG. See https://epsg.io/ for more information |
17 | | `projCustomURL` | String | Default is `null`. if desired, you can load a projection file from your server instead of using one from epsg.io. |
18 |
19 | ---
20 | ## Example Configuration:
21 | ``` javascript
22 | what3words: {
23 | include: true,
24 | id: 'what3words',
25 | type: 'titlePane',
26 | title: 'what3words',
27 | canFloat: true,
28 | position: 0,
29 | open: true,
30 | path: 'widgets/What3Words',
31 | options: {
32 | map: true,
33 | key: 'YOUR-W3W-API-KEY'
34 | }
35 | }
36 | ```
37 | Be sure to include the url for the what3words api in the array or corsEnabledServers or use a proxy.
38 | ```
39 | esriConfig.defaults.io.corsEnabledServers.push('api.what3words.com');
40 | ```
41 | ## To Do
42 | 1. Add method for user to click on map to get w3w address via position search.
43 | 2. Complete and test access to position search from right-click menu.
44 |
45 | ## Screenshot:
46 | 
--------------------------------------------------------------------------------
/widgets/What3Words/css/What3Words.css:
--------------------------------------------------------------------------------
1 | .cmwWhat3WordsWidget .w3wText {
2 | margin-bottom: 15px;
3 | width:100%;
4 | }
5 | .cmwWhat3WordsWidget label {
6 | margin-left: 5px;
7 | }
8 |
9 | .cmwWhat3WordsWidget a .w3wLink {
10 | background-image: url('../images/what3words_logo.png');
11 | background-position: center;
12 | background-repeat: no-repeat;
13 | height: 52px;
14 | margin-bottom: 15px;
15 | width: 100%;
16 | }
17 | .cmwWhat3WordsWidget .buttonContainer {
18 | text-align: center;
19 | }
--------------------------------------------------------------------------------
/widgets/What3Words/images/what3words_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/What3Words/images/what3words_logo.png
--------------------------------------------------------------------------------
/widgets/What3Words/images/what3words_pin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tmcgee/cmv-widgets/66bf742310738903ee1d7adf76759c12df7917c8/widgets/What3Words/images/what3words_pin.png
--------------------------------------------------------------------------------
/widgets/What3Words/nls/resources.js:
--------------------------------------------------------------------------------
1 | define({
2 | root: {
3 | stringInstructions: 'Enter a 3 word address separated by dots',
4 | stringPlaceholder: 'palace.waddle.tribal',
5 | positionInstructions: 'or enter coordinates as Lat and Long.',
6 | positionPlaceholder: '37.773 -122.421',
7 | linkText: 'Learn more about what3words',
8 | searchButton: 'Search',
9 | clearButton: 'Clear Result',
10 | growlTitle: 'what3words',
11 | searching: 'Searching what3words...',
12 | success: 'what3words location found!',
13 | failure: 'The request to what3words failed.',
14 | invalidLength: 'The what3word address must be at least 14 characters and not longer than 38 characters.',
15 | invalidWordLength: ' must be at least 3 characters and not longer than 12 characters.',
16 | not3Words: 'The what3word address must have exactly 3 words separated by dotslike "palace.waddle.tribal".',
17 | notPosition: 'The position must be a latitude and longitude pair like "37.773 -122.421".',
18 | rightClickMenuItem: {
19 | label: 'what3words location here'
20 | }
21 | }
22 | });
--------------------------------------------------------------------------------
/widgets/What3Words/templates/What3Words.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/widgets/ZoomToFeature/README.md:
--------------------------------------------------------------------------------
1 | #Zoom To Feature Widget for CMV
2 | A simple widget to provide a drop-down list of features to zoom the map to. Similar to bookmarks but driven by actual data in a Map Service.
3 |
4 | ---
5 | ## Configurable Options
6 |
7 | | Parameter | Type | Description |
8 | | :----: | :--: | ----------- |
9 | | `url` | String | url of the MapServer to Query. (required) |
10 | | `field` | String | description field for display in drop-down list. (required) |
11 | | `where` | String | A where clause to filter the resulting feature set. Default is '1=1' |
12 | | `i18n` | Object | Default is {}. You can override the Internationalization with your own strings for the text in the widget. See example below. |
13 |
14 | ---
15 | ## Example Configuration:
16 | ``` javascript
17 | zoomToFeature: {
18 | include: true,
19 | id: 'zoomToFeature',
20 | type: 'titlePane',
21 | title: 'Zoom to A California County',
22 | position: 0,
23 | open: true,
24 | path: 'widgets/ZoomToFeature',
25 | options: {
26 | map: true,
27 |
28 | url: 'http://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/2',
29 | field: 'NAME',
30 | where: 'STATE_FIPS = \'06\'',
31 |
32 | // you can customize the text
33 | i18n: {
34 | selectFeature: "Select A County"
35 | }
36 | }
37 | }
38 | ```
39 |
40 | ## Screenshot:
41 | 
--------------------------------------------------------------------------------
/widgets/ZoomToFeature/css/ZoomToFeature.css:
--------------------------------------------------------------------------------
1 | .cmwZoomToFeatureWidget .featureSelect {
2 | margin-bottom: 10px;
3 | width:100%;
4 | }
5 |
6 | .cmwZoomToFeatureWidget .buttonContainer {
7 | text-align: right;
8 | }
--------------------------------------------------------------------------------
/widgets/ZoomToFeature/nls/resources.js:
--------------------------------------------------------------------------------
1 | define({
2 | root: {
3 | selectFeature: 'Select A Feature',
4 | clearButton: 'Clear Result'
5 | }
6 | });
--------------------------------------------------------------------------------
/widgets/ZoomToFeature/templates/ZoomToFeature.html:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------