Using JavaScript Expressions in Geocortex Workflow

Working with JavaScript Expressions in Geocortex Workflow [Geocortex Tech Tip]

Colin Doak
Colin Doak
Technical Partner Manager
September 24, 2021

Working with JavaScript Expressions in Geocortex Workflow [Geocortex Tech Tip]

Working with JavaScript Expressions

With Geocortex Workflow, users can incorporate custom JavaScript expressions into their workflows. This is a useful functionality for manipulating and iterating over large collections of objects. Incorporating custom JavaScript into a workflow can help to increase performance speed, simplify data extraction and expand the possibilities of built-in activities.

This Geocortex Tech Tip demonstrates how to use custom JavaScript expressions in Geocortex Workflow. Additionally, it walks through multiple use cases where JavaScript significantly improves the quality and usability of a workflow.

Watch on YouTube.

Video Transcription:

Hello, my name is Colin Doak. I am a member of the Partners team here at VertiGIS. Today I’m going to show you how to use JavaScript expressions in Geocortex Workflow. Let’s get started!

Before I show you how to use JavaScript expressions in Geocortex Workflow, I’ll give some background as to why you might want to use JavaScript expressions. Geocortex Workflow is designed with activities that allow you to do pretty much everything you need to do without having to write any JavaScript code.

There are two main use cases where you might need to use JavaScript expressions.

One use case is convenience. JavaScript expressions can allow you to get to the data that you need more efficiently than an activity.

The other use case is when you are trying to do data manipulation that an activity doesn’t support. An example of this would be if you had a third-party web service that you needed to send a payload to, and it took a particular format of JSON. Hand editing that in an activity would be very difficult, if not impossible. The easiest way to do that would be to use a JavaScript function. There is another option to build a custom activity using the workflow API, but sometimes that’s overkill for something as simple as manipulating a JSON object. Instead, you could take advantage of the JavaScript function capabilities of Geocortex Workflow.

Let’s look at the two main use cases. We’ll look at the easiest one first – the convenience case. This involves being able to step into an object and manipulate that object using some of the functions that are available to it.

This first workflow that we’re looking at is very simple. I’m going to step through all the different pieces of it so that it’s very clear what it does. Each of these activities in the workflow is a “Create Value” activity. The first activity, “Get Map”, allows us to go and get the map.

Next, we’re going to get the “Layers Object”. There is an actual Get Layer activity in Geocortex Workflow, but this is an easier way to run this in the sandbox. So, I’m going to be manipulating the map’s layers collection.

I can think of a case where you might want to step into the map to get a layer based on a particular attribute of that layer that isn’t necessarily exposed by the Get Layer activity because the Get Layer activity gets the layer by the layers ID. Or if there is a particularly complex structure to the layer collection which precludes you from finding that layer. For things like that you could use this function. But really what I’m after is that it is just an easy way of demonstrating how to how to manipulate objects in JavaScript.

The first thing I’m doing is simply stepping into the map object. We’re using the 4.x API. In Workflow we get the map. We can see in the “Input Editor” a rather odd “map.map.layers”. This is a layers object. The layers object in the 4.x API includes an item collection of layers. So, that is our first step.

In the second step we’ll go into the “Layers Collection”. Again, we’re just stepping in that layers object we made earlier. In the “Input Editor” we can see “layersObject.result.items”. The “items” is a collection of the of the layers.

Now we’ll start to get into things that are a little bit more interesting and more of an application of JavaScript functions. With the items collection we’re going to use a JavaScript function called “find”. This is a common JavaScript function that is attached to most collections. With “find” we’re going to find a particular layer in the “Layers Collection”.

Here we’re going to find the “Tax Layer”. In the “Input Editor” it should say “$layers.result.find (layer => layer.layerID == 2)”. We’re using “layers.result” and the “find” function. We’re also using arrow notation which is a handy way of doing short notation for a function in JavaScript. Arrow notation is also called a Lambda expression.

For each layer in our layers collection, the arrow function is iterating over all the layers of that item collection. On the other side of the arrow, we can step into the actual object. It should say “layer.layerID == 2”. We know that the parcel layer ID is 2, so that will allow us to find that particular layer.

Again, there is an activity that can find you the layer no problem. You wouldn’t want to do this typically. But it’s a nice way of demonstrating the arrow notation and the find function.

A word of warning, the find function isn’t supported by all browsers. Older Internet Explorer browsers don’t support find. If that’s what you’re using, you can also use a filter function. So, you would just switch “find” to “filter”. This allows you to filter the layers collection into an array that only contains layers that have the layer ID equal to two, which would only be one layer. Instead of returning a layer object, you’re returning a collection of one layer object. To get at that layer you would need to add “[0]” to the end of your expression to get the first one. The better function is find. Most browsers support it, almost all of them do. But it’s a word of warning in case you have users that are using an archaic browser that doesn’t support it.

So that’s one function that collections often have. There are other functions that are available based off the different objects in the workflow. As you’re walking through an object you can put a dot at the end of your expression. If there’s a function available, it will appear from the IntelliSense and give you options about what’s available. There are more functions available than that that are listed. It’s up to you to figure out what functions a particular object has available and whether they are supported. There’s some exploration possible if you’re inclined to use these functions.

So, I’ve broken the workflow down into four steps. Typically, you wouldn’t have this breakdown, but I wanted to make it clear how it works. What you would typically do is use a single expression. I’ve done that here in “Create Value” at the bottom of the workflow.

Let’s crack that open. You can see in the “Input Editor” we’re dotting into the map object. We have an expression that says “$map1.map.map.layers.items.find (layer => layer.layerID == 2)”. Layers will always have items. It could be empty, but it will always be there. And we can find it and that will return us our parcel layer.

So, it’s possible to take all of the broken-down functions in our workflow precluding “Layers Object” and break them down into one single expression.

Let’s see this in action. I’ve got the sandbox open here. We’ll run it and see what we get back. This is handy too if you’re not familiar with the console. The console is a critical friend for any developer of workflows, especially if you’re using JavaScript expressions.

Here we have “GetMap”. You can see we’ve got the outputs of the “map”, which is a “map”. And down here are our “layers”. In the other expression here we’re getting the “layersObject”, which was that “map.map.map” layer which returns our layers object. You can see here in “layers” are “items”.

From there we can then step into the next step, which is the layers collection which was where I was using the “layersObject” and the “layers.result.items” to get the layers. Here we have a collection of layers.

Here we have the “taxLayer”, which was from that find expression with the arrow notation. This returns us the actual result. This is the layer object.

Here is our “SingleExpression” where we compressed all the activities into one. We get the same result as the tax layer.

This is a handy way of being able to step into objects. It’s a way for you to leverage JavaScript in your workflow.

So, that’s the main use case. There are other instances, as I mentioned earlier, where you’ll want to step into a function to execute a particular operation. For example, manipulating a JSON object. There are two use cases for this. The first is if there isn’t an activity that supports it in a workflow, and you don’t want to go through the process of building a custom activity to do something as simple as JSON object manipulation. The second is performance, especially around for-each loops.

For-each loops work quite well in a workflow. There’s nothing wrong with them. However, if you’re iterating over a lot of objects, they can be very slow. This is particularly an issue if you’re nesting for-each loops. If you have a for-each loop that contains another for-each loop, and you’re manipulating a lot of objects, that can be extremely slow. Note when I say a lot of objects, I mean 2000, 10,000, up to 50,000. If you have 50,000 objects and you’re in a for-each loop, that’s going to be too slow to be usable. That’s when you would want to write JavaScript functions.

So, let’s take a look at that. Here we have a slightly more complex workflow. We’ve carried over some parts from the previous workflow. We’ve got the map and we’re using that “Single Expression” to get the tax layer. Then what I’m doing is using the tax layer to “Query Layer”. I’ll query the tax layer to get a feature set of all the features in the tax layer that will allow me to do so. So, I’m going to end up with 2000 parcels.

Next what I’ll do is create a collection, or an empty array, of active parcels. This is just a test. A confirmation of whether I want to go fast. I’m setting a timer. If I want to go fast, I’ll “Evaluate Expression”. If I want to go slow, I’ll do the “For Each”. At the very end of the workflow, I’m using “endTime” and then I’m jumping over to create the time and alert how much time it took.

Let’s jump right into the “For Each” loop here on the right. What I’m doing is manipulating some of the parcels. This doesn’t really mean anything, it’s just an exercise to update a particular feature. I’m checking to see if the status of the parcel is active. If it is, I’ll “Create Feature”. Then I’ll “Set Feature Attribute” to that new features “Attribute Name” so it’s the same as the feature that I’m iterating over. It’s kind of meaningless, but it’s just a way of exercising a for-each loop.

On the left side of the workflow, we’re doing the exact same thing. But this time we’re doing it in a function. When we’re creating a function, we’ll use the “Evaluate Expression” activity. This is handy for writing your JavaScript functions.

We’ll crack this open and the first thing you’ll notice is that I’ve got a function but it’s an anonymous function, I haven’t given it a name. The reason that I can do this is because I’ve set the scope by putting an open parenthesis and a close parenthesis around the expression. That allows me to define the scope of the function and have it run immediately. Basically, I’ve wrapped the function in a scope that allows me to use these extra parentheses right here to pass in some parameters.

I’ll break that down a bit so it’s clear. We’ve got our open parentheses and you define your function. “activeParcels” are the inputs to our function. This is the actual code inside of the function, and then we’ll close the function. We have the close parentheses and then another set of open and close parentheses around our parameters. Our parameters in this case are “$query1.features” and “$activeParcels.result”. “$query1.features” is our feature set returned from the query. “$activeParcels.result” is that empty array.

If you look at the loop what we’re doing is iterating over each “feature of features”. We’re checking to see if the state of “STATUS” is equal to “ACTIVE”. Then we’re creating a JSON object, which is a feature object. We’re setting the JSON objects “NAME”, setting the JSON objects “f.attribute” collections “NAME” to the “features.attributes[“NAME”]”. Then we set the “f.geometry” and add it to the “activeParcels”.This is pretty much the same thing that we did in the other loop.

The real takeaway is that you want to have an open parenthesis and close parenthesis containing your function. That sets the scope. Then you can pass in parameters to your function from your workflow using the dollar sign notation and the attributes parentheses. So, we’ve got open and close parentheses right here with the parameters, or inputs, of our function.

Let’s take a look at this. We’ll jump over to our sandbox. We’ll run this. A prompt comes up asking “Go Fast?”. We want to go slow. When we go slow, we’ll be running the for-each loop in the workflow and that will be seizing the for-each activity. So, we’ll click “Cancel”.

It tells us that it took “2.592 seconds” to iterate over 2000 records. That’s not terrible, but if you had 50,000 records, you’d be waiting a long time.

Let’s run this one more time and go fast. We’ll click “OK” to go fast. It only takes “0.003 seconds” this time so you can tell right away that it’s much faster to run a function than it is to do a for-each loop. This is a real savings. If we had 50,000 records instead of 2000 it would still be a bit slow, but nothing compared to the for-each loop. So, this is a really good use case for using a function.

Now a couple of handy things. You can’t jump into functions. You can see that we have “Evaluate” and it doesn’t really tell you anything in the console. So, if there’s a problem in your function and it doesn’t work, how are you going to be able to debug it? There’s a handy thing that you can do. Within your function you can add a line called “debugger;”. What this does causes the code to break on that particular line.

Let’s go see that action. We’ll go back to the sandbox. You need to have your console open to for this to work. I’ll re-run it. I’ll click “OK” when it asks, “Go Fast?”. You’ll see that it comes up saying “Paused in debugger”. You can see that the debugger has opened in the console. I’ll expand it a bit and you can see that we’ve jumped into the compiled code of that function. The for loop has been broken into a for “var” etc., which is typical for JavaScript.

Then we can start walking through the code. Because we’re walking through the code, we’re able to jump into particular objects, take a look at them and then debug them. So, this debugger line is a lifesaver especially if you have a complex function that you need to debug.

That is essentially how to use JavaScript functions. To reiterate, you’ve got the typical use cases where you want to step into an object and find functions that are available with that object. This is typical for collections and for Esri objects as well. The other use case is when you want to write a full expression using the function and the function scope. This allows you to manipulate the object or iterate it over an object using pure JavaScript.

A final caveat that you need to be aware of is that because we need to ensure that we are running safe code, it isn’t possible to create a new object in one of these expressions. So, for example, if I wanted to write “var x = new Feature ()”, that is not available. Because we’re running our code in a strict mode, this would be a security violation and you’re not allowed to do that. You’re only allowed to manipulate objects as they’re available, you can’t create new objects within an expression function. So, that’s just something to keep in mind.

Using JavaScript is a very handy way of being able to iterate over things and to manipulate objects. For example, if you need to manipulate or change a feature into a different JSON object, a function is a great way to go.

Want to learn more about the capabilities of Geocortex Workflow? Click the button below for more information on what is possible with Geocortex Workflow.

Discover Geocortex Workflow


Categories:
Archive
Open: 2021
2021
December 17, 2021

How to Use the Social Sharing Feature in Geocortex Web [Geocortex Tech Tip]

December 10, 2021

Geocortex Workflow Tips & Tricks [Geocortex Tech Tip]

December 6, 2021

How GIS is Helping to Create More Sustainable Communities

December 3, 2021

Configuring Visibility Filters in Geocortex Web [Geocortex Web]

November 26, 2021

Copying Layout Components in Geocortex Web [Geocortex Tech Tip]

November 19, 2021

Registering your Portal with the SaaS Environment [Geocortex Tech Tip]

November 5, 2021

Launching Geocortex Inline with Startup Parameters [Geocortex Tech Tip]

October 22, 2021

Using the New Dashboard in Workflow Designer [Geocortex Tech Tip]

October 15, 2021

Load Different Layouts on Startup in Geocortex Web [Geocortex Tech Tip]

October 1, 2021

Layout Editing in Geocortex Web [Geocortex Tech Tip]

September 24, 2021

Working with JavaScript Expressions in Geocortex Workflow [Geocortex Tech Tip]

September 17, 2021

How to Configure a Pivot Grid in Geocortex Reporting [Geocortex Tech Tip]

September 3, 2021

Advanced Configuration of KPI Cards in Geocortex Web

August 25, 2021

Eliminating Data Silos: Integrating Enterprise Systems with ArcGIS

August 20, 2021

Best Practices for Building a Workflow that Works in Multiple Environments [Geocortex Tech Tip]

August 13, 2021

Manipulating Charts in Geocortex Web [Geocortex Tech Tip]

August 6, 2021

Deploying the Hosted Widgets [Geocortex Tech Tip]

July 28, 2021

Geocortex products now available as out-of-the-box widgets within Esri’s ArcGIS Online®

July 23, 2021

Using JSON Data Sources to Pass Data to a Report [Geocortex Tech Tip]

July 16, 2021

Deploying an app from Development to Production in Geocortex Web [Geocortex Tech Tip]

July 2, 2021

Using Built-In Geocortex Workflows [Geocortex Tech Tip]

June 18, 2021

Save and Load Projects in Geocortex Web [Geocortex Tech Tip]

June 4, 2021

Integrating Geocortex Workflow with Maximo [Geocortex Tech Tip]

May 16, 2021

Integrate key business systems to enhance your GIS

May 13, 2021

5 Benefits of GIS-integrated content management with ArcGIS and Laserfiche

May 5, 2021

Why Top Asset Managers are Integrating ArcGIS and Maximo

March 31, 2021

Building Next Level Linear Referencing Apps with Geocortex Inline

March 30, 2021

How to run FME processes using Geocortex Workflow

March 22, 2021

Configuring permissions on geoprocessing tasks with Geocortex Access Control

March 12, 2021

Run a report from Survey123 using web hooks in Geocortex Reporting

March 5, 2021

How to debug workflows in Geocortex Mobile [Geocortex Tech Tip]

February 26, 2021

How to find an app item by client ID in Geocortex Item Manager

February 19, 2021

How to compare items in Geocortex Item Manager [Geocortex Tech Tip]

February 12, 2021

How to view and edit the JSON of an item in Geocortex Item Manager [Geocortex Tech Tip]

January 29, 2021

Using Geocortex Printing to run a print from a Geocortex Workflow

January 29, 2021

User added data in Geocortex Inline [Geocortex Tech Tip]

January 15, 2021

How to create mobile map areas in Geocortex Mobile using Geocortex Workflow

January 8, 2021

Mastering geometry editing with Geocortex Mobile [Geocortex Tech Tip]

Open: 2020
2020
December 18, 2020

Configuring multiple charts in a band using Geocortex Inline [Geocortex Tech Tip]

December 4, 2020

Using JavaScript to set advanced permissions in Geocortex Access Control

November 27, 2020

Using SVG images in Geocortex Printing and Geocortex Reporting [Geocortex Tech Tip]

November 20, 2020

Integrating third party maps like Mapillary into Geocortex Web

November 13, 2020

Conditional Chart Symbology in Geocortex Inline [Geocortex Tech Tip]

November 6, 2020

Understanding permission inheritance in Geocortex Access Control [Geocortex Tech Tip]

October 30, 2020

How to use URL routing in Geocortex Printing [Geocortex Tech Tip]

October 23, 2020

Improving suggestions by using the Cast activity with Geocortex Workflow

October 16, 2020

Considerations when migrating from Geocortex Viewer for HTML5 to Geocortex Web [Geocortex Tech Tip]

October 9, 2020

Launching a report from Geocortex Inline [Geocortex Tech Tip]

October 2, 2020

How to include the current map image in a report [Geocortex Tech Tip]

September 25, 2020

Database monitoring in Geocortex Analytics [Geocortex Tech Tip]

September 18, 2020

Efficiently setting field permissions using advanced JavaScript permissions [Geocortex Tech Tip]

September 11, 2020

How to set different user and group permissions on fields and attributes in Geocortex Access Control [Geocortex Tech Tip]

September 4, 2020

Filter expression syntax and operators with Geocortex Access Control [Geocortex Tech Tip]

August 28, 2020

Leveraging attribute filters in Geocortex Access Control [Geocortex Tech Tip]

August 21, 2020

Using layer filter effects in Geocortex Web [Geocortex Tech Tip]

August 14, 2020

Conditional Tips in Geocortex Inline [Geocortex Tech Tip]

August 7, 2020

Configuring KPI cards in Geocortex Web [Geocortex Tech Tip]

July 31, 2020

Find your way around a workflow using the new Navigator component [Geocortex Tech Tip]

July 24, 2020

Working with symbols in Geocortex Workflow (Accessing JavaScript 3.x & 4.x playground etc) [Geocortex Tech Tip]

July 22, 2020

Simplify Pipeline Integrity Management with Geocortex Inline [Webinar]

July 17, 2020

Configuring Geocortex Web Events in Geocortex Web [Geocortex Tech Tip]

July 10, 2020

Creating and configuring launch links in Geocortex Mobile [Geocortex Tech Tip]

July 3, 2020

Using environment variables for application management in Geocortex Web and Geocortex Mobile Designer [Geocortex Tech Tip]

June 26, 2020

Understanding feature actions in the Geocortex Web and Geocortex Mobile Designers [Geocortex Tech Tip]

June 19, 2020

Geocortex Essentials import/export support enhancements in 4.13 [Geocortex Tech Tip]

June 12, 2020

Using Union Geometries in Geocortex Workflow [Geocortex Tech Tip]

June 5, 2020

Removing unneeded applications in Geocortex Web and Geocortex Mobile Designer [Geocortex Tech Tip]

May 29, 2020

A deeper dive on advanced View Designer configuration [Geocortex Tech Tip]

May 22, 2020

Launching a workflow in Geocortex Inline [Geocortex Tech Tip]

May 20, 2020

Geocortex Essentials 4.13: Additional development tools and external widget support let you customize your apps even further

May 15, 2020

Understanding points of interest and station locator [Geocortex Tech Tip]

May 8, 2020

Using the Inline Designer to build linear referencing views [Geocortex Tech Tip]

May 1, 2020

Understanding performance differences between Geocortex Workflow and the workflow capability in Geocortex Essentials [Geocortex Tech Tip]

April 24, 2020

Printing a vector tile layer in Geocortex Printing vs the Printing widget in Geocortex Essentials [Geocortex Tech Tip]

April 17, 2020

Producing layer reports in Geocortex Reporting vs the Reporting widget in Geocortex Essentials [Geocortex Tech Tip]

April 10, 2020

Comparing dynamic forms in Geocortex Workflow vs Geocortex Essentials [Geocortex Tech Tip]

April 7, 2020

Take control of your GIS with Geocortex Access Control [Webinar]

April 3, 2020

Performing field inspections with Geocortex Mobile (OOB Editing) [Geocortex Tech Tip]

March 27, 2020

Working with Conditional Expressions in Geocortex Reporting [Geocortex Tech Tip]

March 20, 2020

Export support and new third party map integration widgets [Geocortex Tech Tip]

March 13, 2020

Configure and Monitor a Web AppBuilder Web Application from Geocortex Analytics [Geocortex Tech Tip]

March 11, 2020

Geocortex Events and COVID-19/Coronavirus

March 6, 2020

Running a batch script from an alarm with Geocortex Analytics [Geocortex Tech Tip]

February 28, 2020

Understand how your users are engaging with the tools in your applications [Geocortex Tech Tip]

February 21, 2020

How to manage alarms in Geocortex Analytics [Geocortex Tech Tip]

Open: 2019
2019
December 18, 2019

Geocortex in 2019, and a glimpse of what's to come

December 5, 2019

Four key benefits to adopting a mobile GIS solution

November 29, 2019

Using Geocortex Mobile to collect survey data [Geocortex Tech Tip]

November 27, 2019

Dive into Geocortex Analytics [Webinar]

November 22, 2019

How to input parameters on prints [Geocortex Tech Tip]

November 15, 2019

How to include feature attachments in reports [Geocortex Tech Tip]

November 14, 2019

Understanding application management in the Designer [Geocortex Tech Tip]

November 14, 2019

How to reference symbology from web maps [Geocortex Tech Tip]

November 14, 2019

How Geocortex Mobile can integrate with other apps [Geocortex Tech Tip]

November 14, 2019

Implementing Arcade Expressions in Geocortex Essentials [Geocortex Tech Tip]

November 14, 2019

Customer Spotlight: Geocortex Mobile

November 14, 2019

How to Format Your Reports [Geocortex Tech Tip]

November 14, 2019

Showing an image in a form after a file picker [Geocortex Tech Tip]

November 14, 2019

Richard Wiegmann Joins VertiGIS as President and CEO

September 27, 2019

Understanding the toolbar in Geocortex Web [Geocortex Tech Tip]

September 20, 2019

Refining Results in Geocortex Web [Geocortex Tech Tip]

September 19, 2019

Charting data using Geocortex Reporting: Honing your charting skills

September 13, 2019

Utilizing the flexibility of layout in Geocortex Web [Geocortex Tech Tip]

September 6, 2019

Creating Geocortex Web applications that move seamlessly between 2D and 3D [Geocortex Tech Tip]

August 28, 2019

Geocortex adds support for Arcade scripting and ArcGIS Online smart mapping

August 23, 2019

How to create sections and groups for your reports [Geocortex Tech Tip]

August 16, 2019

Displaying SQL Server Data in Geocortex Workflow [Geocortex Tech Tip]

August 14, 2019

Customer Spotlight: Geocortex Essentials

August 8, 2019

City of Austin: Spreading floodplain awareness with Geocortex

August 1, 2019

Geocortex Essentials 4.12: Improved integration with ArcGIS® Online

July 25, 2019

Introduction to Geocortex Printing: Learn to build stunning print templates

July 17, 2019

Updates to the Geocortex Product Life Cycle

July 8, 2019

Extending Web AppBuilder for ArcGIS® with Geocortex Essentials [Webinar]

July 4, 2019

City of Bellingham: Using Geocortex to take the stress out of water shut-off

June 27, 2019

Geocortex at the 2019 Esri User Conference

June 14, 2019

Customer Spotlight: Geocortex Workflow

May 17, 2019

Important Notice - Outage Issues & New Support Cases

May 17, 2019

How to build a summary report with aggregations of feature data [Geocortex Tech Tip]

May 16, 2019

Technology Q&A: Geocortex Mobile

May 10, 2019

How to create print templates for Web AppBuilder for ArcGIS®[Geocortex Tech Tip]

May 8, 2019

Dive into Geocortex Printing [Webinar]

May 3, 2019

Using Geocortex Workflow and Geocortex Reporting to produce a multi-layer report [Geocortex Tech Tip]

May 1, 2019

Market-Leading GIS Software and Services Companies Join to Form VertiGIS

May 1, 2019

Introducing VertiGIS

April 18, 2019

Integrating Workflows into Geocortex Mobile [Geocortex Tech Tip]

April 17, 2019

Customer Spotlight: Geocortex Reporting

April 12, 2019

Using Geocortex Go to preview app configurations [Geocortex Tech Tip]

April 10, 2019

How to Address Complex Form Navigation Using Geocortex Workflow

April 5, 2019

Building native, offline IOS, Android and Windows apps with Geocortex Mobile Viewer [Geocortex Tech Tip]

April 3, 2019

Streamlining mobile operations with Geocortex Mobile Viewer [Webinar]

March 29, 2019

A better way to run geoprocessing tasks in Web AppBuilder for ArcGIS [Geocortex Tech Tip]

March 28, 2019

Extend the reach and capabilities of your applications with integrations [eBook]

March 22, 2019

Displaying data from SQL Database when you select features [Geocortex Tech Tip]

March 20, 2019

How Geocortex users are enriching the communities they serve

March 15, 2019

How to Configure a Geocortex Essentials layer report with Geocortex Reporting 5 [Geocortex Tech Tip]

March 14, 2019

Region of Waterloo: How GIS & Geocortex technology helped meet local Source Protection Plan requirements

March 6, 2019

Integrating Business Intelligence and Data Sources with Geocortex Essentials [Webinar]

March 1, 2019

How to quickly add attachments to new features when editing [Geocortex Tech Tip]

February 22, 2019

Generating a report with sub reports from external data sources [Geocortex Tech Tip]

February 20, 2019

Geocortex Essentials 4.11: Saving Time & Increasing Efficiency

February 15, 2019

Accessing Samples and Building your First Workflow [Geocortex Tech Tip]

February 12, 2019

Open Beta of Geocortex Printing 5 Has Begun

February 8, 2019

Different Ways of Creating Selections of Features in Geocortex Viewer for HTML 5 [Geocortex Tech Tip]

February 6, 2019

4 Best Practices to Follow When Using Geocortex Workflow 5

February 1, 2019

Creating a Report that Displays a Screenshot of the Map [Geocortex Tech Tip]

January 28, 2019

Diving Into Geocortex Reporting 5 [Geocortex Tech Tip]

January 24, 2019

How Geocortex is Advancing Water Management Solutions

January 16, 2019

Creating Custom User Experiences with Geocortex Workflow 5 [Webinar]

January 11, 2019

Showing the search results using the item picker in Geocortex Workflow 5 [Geocortex Tech Tip]

January 9, 2019

City of Troy: Using GIS and asset management technologies to manage legislative requirements

January 4, 2019

Using scripting to put attachments in reports in Geocortex Reporting 5 [Geocortex Tech Tip]

Open: 2018
2018
December 21, 2018

Integrating Pictometry, Bing and other 3rd party maps within your Geocortex applications

December 19, 2018

Recapping the Texas Geocortex Regional User Group

December 14, 2018

How to use Geocortex Workflow 5 to populate the Attribute Table in Web AppBuilder for ArcGIS [Geocortex Tech Tip]

December 12, 2018

Finding yourself: Using geolocation in mobile and web applications [Webinar]

December 7, 2018

Enabling real-time user-to-user map collaboration within Geocortex Essentials

December 5, 2018

Reflecting on 2018

November 30, 2018

Creating mailing labels with reports with Geocortex Reporting 5 [Geocortex Tech Tip]

November 29, 2018

Alberta Energy Regulator: Supporting safe and responsible energy resource operations

November 26, 2018

Important update for ArcGIS and Transport Layer Security (TLS) Protocol Support!

November 23, 2018

Using fine-grained security to control access to layers, features, attributes and application functionality [Geocortex Tech Tip]

November 21, 2018

Enhancing Web AppBuilder for ArcGIS® with Geocortex Reporting [Webinar]

November 16, 2018

Using Geocortex Workflow 5 to automatically display a form for editing layer attributes [Geocortex Tech Tip]

November 15, 2018

Geocortex Achieves Esri’s “Release Ready Specialty” Designation

November 14, 2018

Celebrating GIS Day with York Regional Police: How GIS Data Has Mitigated Risk & Increased Efficiency in Crime Prevention

November 9, 2018

How to access a SQL database from a workflow using Geocortex Workflow 5 [Geocortex Tech Tip]

November 2, 2018

How to send an email from a workflow using Geocortex Workflow 5 [Geocortex Tech Tip]

October 26, 2018

How to add and configure charts inside reports with Geocortex Reporting 5 [Geocortex Tech Tip]

October 24, 2018

Geocortex Water Webinar Series

October 19, 2018

Integrating Geocortex Essentials with ArcGIS Online and ArcGIS Enterprise portal [Geocortex Tech Tip]

October 17, 2018

Cross-Platform Development with Xamarin [Webinar]

October 12, 2018

City of Fort Collins: Dynamic flood maps for public awareness, and flood insurance rate saving

October 2, 2018

Technology Q&A: Geocortex Workflow 5 “Behind the Firewall”

June 27, 2018

Geocortex Essentials 4.10 is here!

June 12, 2018

Geocortex and the GDPR

June 6, 2018

Geocortex at the 2018 Esri User Conference

May 15, 2018

Technology Q&A: The evolution of Geocortex and Web AppBuilder for ArcGIS

April 25, 2018

How to manage data collected from Geocortex Workflow 5 forms [Geocortex Tech Tip]

April 18, 2018

Delivering accessible mapping applications for everyone [Geocortex Tech Tip]

April 11, 2018

How to search for data in a non-spatial database [Geocortex Tech Tip]

April 5, 2018

Configuring Geocortex Analytics to monitor a new Portal for ArcGIS instance [Geocortex Tech Tip]

March 27, 2018

Getting started with forms in Geocortex Workflow 5 [Geocortex Tech Tip]

March 21, 2018

Using Geocortex Workflow with Web AppBuilder for ArcGIS [Geocortex Tech Tip]

March 15, 2018

Understanding tool usage in your GIS applications [Geocortex Tech Tip]

March 7, 2018

Running Geocortex Essentials workflows from an identify operation [Geocortex Tech Tip]

March 2, 2018

GIS Health Assessment: A new way to think about your system

February 28, 2018

Using the in-app help system in Geocortex Workflow 5 [Geocortex Tech Tip]

February 21, 2018

How to configure a personalized dashboard in Geocortex Analytics [Geocortex Tech Tip]

January 25, 2018

GIS is shifting to SaaS, and it’s a win for everyone


Categories

Popular Tags
Access Control Accessibility ArcGIS ArcGIS Online customer spotlight Customer Story Designer Energy Esri Geocortex Geocortex 5-Series Geocortex Access Control Geocortex Analytics geocortex customers Geocortex Essentials Geocortex Inline geocortex integrations geocortex item manager geocortex mobile Geocortex Mobile Viewer geocortex printing Geocortex Reporting Geocortex Reporting 5 geocortex tech tip Geocortex Tech Tips geocortex training Geocortex Viewer for HTML5 geocortex web Geocortex Web Viewer Geocortex Workflow Geocortex Workflow 5 GIS GIS Health gis integrations Integrations mobile gis Pipelines Tech Tip Tech Tips Tip Tips vertigis Web AppBuilder Web GIS Workflow

Contributors