Custom Grid Transformation ๐ŸŒ

By default, Alloy uses a simple Helmert transformation when converting geometry from the British National Grid coordinate system (EPSG:27700) to WGS 84 (EPSG:4326). This works well most of the time and requires no user input.

However, it can result in slight misalignment in a handful of cases, and we do like to give you choices where we can!

Therefore, as of the October 2023 update, you can now specify a grid shift file for a particular transformation (e.g. OSTN02, OSTN15) when importing or exporting geometry data via the API.

To use a different transformation, first upload its grid shift file to Alloy. The max size is 100MB and the supported formats are:  GSB, LLA, DAT.

Using the API

When using the Alloy API to import or export data, just add +nadgrids=<fileid> to the proj4 string (where <fileid>is the Item ID of your uploaded grid shift file).

When importing data using the ImportSettingsDataWebModel, you can specify the proj4 string as part of its geometry property.

When importing NSG/NLPG data using one of the two ImportSettingsStandardFormatWebModels, no proj4j string is specified. Instead, you can populate its gridFileItemID property with the Item ID of the grid shift file.

Using Alloy Web

When configuring a custom import in Alloy Web, you can configure the Geometry in step 3.

After choosing the Type, select the magnifier icon in the Coordinate system field and choose one of those listed. This populates the field with a proj4 string, which you can then suffix with +nadgrids=<fileid>.

The Return of Access Policies โœ…

Access policies are back, baby! Use them to enforce item-level access control.

Back in February, we announced that access policies were being temporarily removed, with a new implementation coming in future. They originally worked by tracing paths between the user and the item they were trying to access. In practice, the performance cost was too high, so we took them back to the drawing board.

We're pleased to announce that the new implementation of access policies has now arrived!

How do they work?

You can create one or more access policies for a particular design/interface. Each access policy can have one or more rules.

A rule applies to one or more user groups. It grants them conditional read access to items of that design/interface, based on the value each item has for a given attribute/property.

Currently, access policies can only be created and managed via the Alloy API.

What are they good for?

Access policies are enforced throughout Alloy. If a user isn't granted access to an item, it won't appear for them, regardless of whether they're using the map, the Data Explorer, etc.

This lets you control which items appear for which user groups. For example:

  • The "Emergency" group can only see tasks whose Priority attribute is "High" or "Critical".
  • The "Waste Sector C" group can only see waste jobs whose Geometry attribute is located within a specific area.
  • The "Acme Contractor" group can only see assets whose Default Team attribute is set to one of their teams.

What about Permissions?

Access policies are designed to work alongside Permissions. Think of them as a more granular replacement for the Read permission.

If you enable the Read permission on a design/interface, it grants read access to all of its items.

Alternatively, you can disable the Read permission and use access policies to grant conditional access to items, based on the values they hold.

Learn more

To learn about creating and managing access policies via the Alloy API, see Access Policies on the Alloy Help site.

Please note: the relational expressions will become available on 30th November, as part of the Alloy v2.53 release.

Vote for Causeway Alloy at the Construction Computing 'Hammers Awards'! ๐Ÿ†


We are absolutely thrilled to announce that Causeway Alloy has been shortlisted for the 'Asset Management Product of the Year' at this year's Construction Computing 'Hammers Awards'! 🎉

This recognition is a testament to our commitment to providing exceptional products for our customers. We take great pride in our innovative Asset Management solution and its ability to transform businesses.

Now, we need your support! Cast your vote for Causeway Alloy by clicking here: Vote!

Voting closes on Nov 1st with the winners announced on Nov 9th. Your vote will play a crucial role in determining the winner of this prestigious award.

We greatly appreciate your continued support and trust in our products. Thank you for being a part of our journey!

Alloy September 2023 Update

This month brings temporary map layers, automatic map refresh on Mobile, and some delicious new item form expression nodes. The update took place during the evening of the 28th September. For a full list of changes in v2.51, please visit the Alloy Changelog.

Show Data Explorer results on the map 🗺️

Ever wanted to quickly view a set of query results on the map, without having to create a layer?

Well, now you can! In the Data Explorer, select the bottom-right menu and choose Show on map to create a temporary layer containing all the resulting items from the current query tab (providing their Geometry attribute is populated).

The temporary layer will remain until you log out or select its X button in the Layers panel.

Include item links in a workflow SMS 🔗

When building a workflow, you can add a Message action node to the sequence and configure it to send an SMS to the provided phone number.

If you populate the action's Linked Items attribute, the SMS will now contain a direct link to each item stored in the attribute.

New Conditional expression nodes ❔

Oh, we're not done yet 😎. Here comes another barrelful of item form expression nodes!

This month, we've added many new types of Conditional node to the Item Form Expression Builder. These act as logical functions that compare values from other nodes and produce corresponding output:

  • AND - if both inputs are true, output true.
  • OR - if at least one input is true, output true.
  • Contains - if input A contains input B, output true.
  • Greater Than - if input A is greater than input B, output true.
  • Less Than - if input A is less than input B, output true.
  • Match - if string A matches the regular expression stored in string B, output true.
  • Is Null - if the input is null (e.g. a form control is empty), output true.

In addition, we've added some "IF statement" conditional nodes for each data type, which effectively operate like this:

IF the input boolean is true THEN output value1 ELSE output value2.

For example, ­the Number conditional node will output one of two input numbers, depending on whether the input boolean is true or false.

These new conditionals provide a massive boost to the power of expressions, enabling you to weave potentially complex logic into the behaviour of your item forms. For a complete list of node types, see Alloy Help.

Optimised drag sensitivity ⏺️ ➡️

We've recently been experimenting with the sensitivity of drag-and-drop in Alloy Web. That is, how long do you need to select and hold something before you can drag it (such as controls in the Item Form Builder)?

Everyone has a different feel for this, so it can be tricky to find a level that most people are comfortable with.

We think we've got it tweaked just right now. However, if dragging things doesn't feel right to you, please contact Support with your feedback.

Automatic map refresh for filtered items on Mobile 🗺️

In Alloy Mobile, you can filter tasks according to their status and whether they're assigned to you or your team. 

To update the map accordingly, so that it only displays the filtered tasks, you had to select the Search Here button.

Now, the map refreshes automatically whenever you change the filters, to ensure that you're always looking at the correct items.


Goodbye Workflow Action Groups ๐Ÿ‘‹

Overview

A workflow action group lets you define a series of actions that can be stored on its own and referenced in other workflows. A workflow within a workflow, if you will.

However, now that manual workflows have parameters, they can provide this functionality in a better way. Therefore, for simplicity and consistency, we're removing workflow action groups and updating manual workflows so they can be referenced within other workflows.

Who will be affected?

Users who create and edit workflows via the Alloy API.

Details

You'll be able to reference a manual workflow in your workflow by creating an action whose design implements designInterfaces_workflowManualTrigger:

  • The parametersDesignCode property must be set to the design code of the manual workflow.
  • The new OutputActionId property must be set to the ID of the action that represents the final output of the referenced manual workflow. This output will be passed on to the next action in your workflow.

While it will be possible to chain multiple workflows (a workflow that references a manual workflow that references a manual workflow...), rest assured that Alloy will stop you from creating any circular references! 😮‍💨

Parameters

If the referenced manual workflow requires any parameters, you can supply them in the parameters array when adding/editing the relevant action in your workflow.

Depending on the type of WorkflowComputedItemAttributeWebModel used, you can supply values computed during your workflow, or pass on any parameter values that were supplied to your workflow when triggered.

Removed endpoints

All WorkflowActionGroup endpoints will be removed from the Alloy API.

Expected Release Date

26th October 2023 as part of the Alloy v2.52 release.

Alloy August 2023 Update

This month sees the addition of some highly requested quality-of-life improvements, along with more node types for the Item Form Expression Builder. The update took place during the evening of the 31st August. For a full list of changes in v2.50, please visit the Alloy Changelog.

Turn off all layers 🗺️

Alloy lets you create any number of layers and layer styles, providing you with limitless ways of overlaying different items on the map. Therefore, many organisations have crafted hundreds of custom layers to represent their item data in various ways.

Sometimes, you want to clear the map to focus your attention. Previously, this meant having to scroll through all those layers in the Layers panel, turning off the enabled ones as you go. This could be a real hassle in large organisations.

But no longer! We've added a button to the action bar that lets you Turn off all layers. Bam, the map is now empty and ready for you to enable just the layers you want to see.

Improved sorting in Data Explorer ↕️

When viewing a query in the Data Explorer, you can select any column header to sort the results by that attribute.

Previously, after selecting a column header once, it wasn't possible to unsort the results again.  Selecting the column header would only switch between Sort ascending and Sort descending.

Now, selecting the column header a third time will cancel the sort.

New Date and Date Time expression nodes 📆 🕘

In May, we released the Item Form Expression Builder, to help you harness the power of codeless expressions and make your item forms responsive to user input. We're continuing to expand this feature by adding more node types.

This month, we've added two new sets of Date and Date Time node types to the top bar. Broadly speaking, they let you:

  • add unit values to a date/time
  • subtract unit values from a date/time
  • construct a date/time from multiple unit values
  • calculate the difference between two dates/times
  • extract a unit value from a date/time

This makes it possible for item forms to generate and display dynamic dates and times.

For example, imagine a Highway Jobs item form that automatically populates the Target Time attribute with a value 14 days from now. It could even apply different increments depending on the selected Priority value!

This would give the user immediate feedback on when the job is expected to be completed.

New "Is Triggering" expression node 🔫

We've also added a new global node type to the Item Form Expression Builder.

The new Is Triggering node checks whether the expression was triggered by the selected control property (or Alloy global variable) and outputs a corresponding boolean value.

In other words, this lets you create an expression that can produce different final outputs depending on how it was triggered. This adds a whole new dimension of conditional behaviour to item forms!

For example, imagine an item form with a Checkbox control and two Number controls. The Checkbox's Value property targets an expression that outputs "true" when the Value properties of the two Number controls are equal. However, thanks to an Is Triggering node, the expression can only output "true" when the second Number control is updated. 

Now available in French 🥐

Alloy has been translated! If your web browser's language is set to French, Alloy will now automatically display in French. Où est la bibliothèque?

Fun fact: Alloy is also available in Dutch, German and Spanish 😮

Warning when replacing data ⚠️

When configuring an import in Gateway, you can set it to operate in Replace mode. This will delete all items in the selected design before replacing them with the import items.

This wasn't made clear enough previously, so we've revised our documentation and Alloy will now display clear warnings when selecting Replace and again before the point of no return.


Optimised asset creation on Android ⚡

In Alloy Mobile, you can register new assets while out in the field. Naturally, this involves choosing the design of the asset you want to create.

Previously, the app would list all the asset designs in your organisation. As this typically ranges in the hundreds, you'd often end up doing lots of scrolling to reach the one you want.

Now, the app will only list the asset designs that you have permission to create, resulting in a shorter list that's easier to select from.


Alloy July 2023 Update

Following last month's avalanche of new features, there are fewer noteworthy changes this month. The update took place during the evening of the 27th July. For a full list of changes in v2.49, please visit the Alloy Changelog.

Pull down to refresh pickers ⏬

You can now refresh the content of any picker by dragging the list downwards. A significant improvement for touchscreen users and fun for mouse users too!

Time picker improvements 🕘

Previously, editing the digits of a time picker was tricky. This was because the boxes acted like text fields, so you had to move the text cursor to the right place and press the Backspace/Delete key accordingly.

Now, you can simply select a box and type to overwrite its contents or press Backspace/Delete to clear its contents and reset to 00:00.

We've made it a bit smarter too, so it can handle more natural number input, e.g. selecting the first box and pressing 3 then 5 will result in 03:05 instead of 23:00.

While it's hard to illustrate the differences here, try it out and you'll see what we mean!

Timestamp photos in waste events 📷

In Alloy Mobile Android, the Timestamp in-app photos setting has now been expanded to include photos taken directly during any waste event, making it easy to see at a glance when the photo was captured.

Alloy June 2023 Update

This month sees major changes to the Report Builder, new nodes in the Item Form Expressions Builder and a couple of tasty workflow improvements. The update took place during the evening of the 29th June. For a full list of changes in v2.48, please visit the Alloy Changelog.

Report Builder toolbar ⬆️

When editing the layout of a report document, you can select a control to show its properties. However, you'll notice that they've moved from here…

…to up here! 😮

When we first designed the Document Layout Editor, we sought to give you maximum flexibility in customising the document's structure and content. It was therefore possible to set every one of a control's properties dynamically.

After some time and feedback, it became apparent that this was a bit overkill! Turns out, nobody wants to set the margins of a control based on the runtime value of a data source header. They just want to choose a value and move on.

Therefore, we've streamlined control properties by removing this functionality and moving them into a top toolbar, making it much simpler and quicker to configure them to your liking.

Fear not, any existing reports with dynamically set properties will remain unchanged. From now on though, those properties can only be overwritten with constant values (unless you use the API).

Horizontal Repeaters ➡️

In the Document Layout Editor, you can add a Repeater control to a flow document. These look and behave similarly to Vertical stack controls, with any child controls inside being automatically arranged in a vertical formation.

However, depending on the data being repeated, this can lead to unnecessarily long documents with lots of pages, e.g. listing multiple photo attachments.

To address this, Repeaters now inherit the layout properties of any container they're placed in. As a result, a Repeater placed within a Horizontal stack will have its contents arranged horizontally!

You may want to enable the Horizontal stack's Wrap property, to ensure the Repeater's content doesn't go off the page.

Item data source - Item Id header 🆔

In the Report Builder, you can create an Item data source to represent the attributes and properties of a particular item.

Until now, the data source's Item Id header couldn't be compared against other Item IDs, because the stored data was Text type rather than Alloy ID type.

This has now been resolved, meaning you can now do things like use the Item Id header as a parameter within an AQS data source.

For example, to get the attachments of a particular item, you can now create an AQS data source with a query that fetches all Files items whose parent ID matches the Item Id header of the Item data source.

You also have more flexibility when creating Join data sources. For more details, see this previous announcement.

Use dates in item form expressions 📆

Last month, we released the new Item Form Expressions Builder, to help you harness the power of expressions and make your item forms responsive to user input.

We'll be adding more node types over the coming months, to increase the number of data types you can work with and the ways you can manipulate data.

The first of these are the Date and Date Time nodes, which now appear in the list of Literals (fixed values used in one expression), Globals (dynamic values shared across the form's expressions) and Finals (expression outputs).

This means you can now reference the Default Value and Value properties of any Date/DateTime picker controls included on the item form.

You can also reference the current date and time, opening up all kinds of possibilities for expressions that change the behaviour of an item form depending on when it's being filled in!

For example, imagine being able to see when an item was last created/edited when filling out an item form. This can now be achieved by doing the following:

  1. Add a Last Modified Date Time attribute to the design.
  2. Add a Date Time picker control for the attribute to the design's item form.
  3. Create a simple expression:
    1. Add a Date Time global node set to Date Time Now.
    2. Add a Date Time final node.
    3. Link the nodes together.
  4. Set the Value property of the attribute's control to target your expression (and enable the Read Only property for good measure).

Customise workflow email subject ✉️

When editing a workflow, you can add a Message action that sends an email to one or more addresses.

The email's subject line was always Workflow Notification. This wasn't ideal if you received frequent workflow emails, as you couldn't tell them apart without opening them.

Therefore, the Message action now has an optional Subject field, so you can override the default with something more distinct.

Workflow type subtitles 🏷️

When workflows are listed in the Search panel, you can now see whether they are Event, Manual or Scheduled. A nice little convenience boost!

Convert coordinates during export 🌐

In the Data Explorer, you can export the data you're viewing for use outside of Alloy.

If that data contains geometry coordinates, you can now change the Coordinate system from the default WGS84 Lat/Lng to one of three other popular systems.

Efficient syncing on Alloy Mobile ✅

When you create or edit items in Alloy Mobile, it contacts various Alloy API endpoints to fetch and save the necessary data.

As you can see, most of the contacted endpoints were on the Extended Web API, which provided greater functionality at the cost of medium performance.

After months of hard work, we succeeded in reproducing the functionality of the Extended Web API in the higher-performing Web API.

As a result, Alloy Mobile now contacts just one endpoint for all its needs: /api/bulk/generic

This means that syncing is simpler, faster and more reliable than before!

Repeaters in Horizontal Stacks are going sideways โžก๏ธ

Overview

In the Report Builder, you can add a Repeater control to a flow document's layout that iterates over a specific header of a given data source. When the report is run, any "child" controls inside the Repeater control will appear once for each iteration.

Currently, the child controls within a Repeater control are automatically arranged in a vertical formation. However, depending on the data being repeated, this can lead to unnecessarily long documents containing lots of pages.

Therefore, we're making it possible to stack repeated content horizontally - by placing the Repeater control within a Horizontal stack control!

Who will be affected?

This will affect new and existing reports containing Repeater controls.

Details

Repeater controls at the root of a flow document will be unchanged.

However, if a Repeater control is placed within a container, the appearance of its child controls will be determined by that container. This means that:

  • A Repeater control within a Horizontal stack control will now repeat horizontally.
  • A Repeater control within a Vertical stack control will continue to repeat vertically.
  • A Repeater control within a Repeater control will behave according to its parent control.
  • The Repeater control's Margins and Relative Width won't be applicable.

Initially, repeated content will only appear horizontally when the report is run. The Document Layout Editor will be updated to reflect this new behaviour in the subsequent Alloy release.

Wrap child controls

As flow documents typically use portrait orientation, it's important for Horizontal stack controls to have their Wrap child controls property set to Yes when appropriate. Otherwise, their child controls may go off the page!

Therefore, to ensure that any newly-horizontal content remains visible after the change, we recommend checking your custom reports for any Repeater controls within Horizontal stack controls and configuring them as above.

Expected release

29th June 2023 as part of the Alloy v2.48 release.

Report data source header changes ๐Ÿ“„

Overview

In the Report Builder, you can create an Item data source to represent the attributes and properties of a particular item, and an AQS data source to fetch the attribute data of multiple items.

You may have tried to use an Item data source as a parameter within an AQS data source, e.g. to fetch the defect items raised against that item. Currently, this doesn’t work because the Item Id header of the Item data source is a Text type, which isn't directly comparable with actual Item IDs.

Therefore, we're changing the Item Id header type from Text (string) to Link (AlloyId[]) to make this possible!

To accommodate this, a few other changes will also happen.

Who will be affected?

This will affect report builders wishing to use an Item data source as a parameter within an AQS data source.

Details

The Item data sources in everyone's custom reports will be updated with this change automatically.

However, any existing AQS data sources containing an unusable parameter as described above will still throw an error (1586360664 - Parameter type String cannot be used in node of type AlloyId). To fix this, simply recreate the parameter.

No more sorting by Item Id

After this change, it will no longer be possible to sort by the Item Id header on any data source. Doing so will throw an error (1603203353 - Ordering is not supported on the following type AlloyId).

Hardly anyone has attempted this, so we don't envisage it causing issues going forward.

More flexible joins

To create a Join data source, you must select a header from each of the two data sources you wish to join. Currently, you can only join headers of the same type (or a Link type to a Text type).

After this change, it will be possible to join a Text header to any other header type and vice versa. The other header type will be "stringified" for comparison.

AQS statistics constraints

AQS statistics data sources contain two headers to represent the data returned by its query. The Key header is a Text type and the Value header is a Number type.

After this change, API users will be able to specify the type of these headers via two new optional properties:

  • KeyConstraint - corresponds to the attribute being grouped on, so can be set to any attribute type.

  • ValueConstraint - corresponds to the aggregated values of the attribute being queried, so can be set to Number, DateTime or GeoJSON.

These can be declared within the relevant request model when using the /api/custom-report/{customReportCode}/data-source endpoint to add (Swagger/ReDoc) or edit (Swagger/ReDoc) an AQS statistics data source.

This will be useful for creating joins in some scenarios.

For example, imagine having an AQS statistics data source that counts Waste Containers grouped by type, and an AQS data source that fetches items of the Waste Container Types design.

To create a Join data source from these, you would select the Key header (String) of the first data source and the Item Id header (Link) of the second data source.

By default, the Item Id header will be stringified for comparison with the Key header, so the join should work. However, you can set KeyConstraint to "Link" to ensure an accurate comparison.

Expected release

29th June 2023 as part of the Alloy v2.48 release.

Show Previous EntriesShow Previous Entries