Our DynaPDF functions got new capabilities to create signature fields. We can sign PDFs for years, but now you can show a field on the PDF page with a custom appearance. The PDF viewer validates the signature and shows the status next to your own graphics. For form fields we can now attach images to buttons in forms. To draw gradients, you can now create radial and axial shadings.
If you like data structures with our plugin, check out the improved matrix functions. Columns and rows can now be named and accessed by name. The Matrix.Evaluate function allows you to pass an expression, so we evaluate it for each value to generate a new value. To add or subtract a value, you can check the new Matrix.Add function. We have two functions to copy rows or columns from one matrix to another: Matrix.CopyColumn and Matrix.CopyRow.
For JSON we added a JSON.SortWithEvaluate function to sort JSON objects or arrays with custom expression. Your expression can check the JSON to compare and define how the JSON values are compared. The JSON.AddArrayToArray function quickly copies the content of one array to append another JSON array.
The SQL functions to other databases can get you all fields in a row or the whole result set as a JSON block. You can get and set all parameters for a SQL command with JSON. Those functions can be used together with FM.SQL.JSONRecord and FM.SQL.JSONRecords functions to export data to foreign databases. In the other direction, to FileMaker, the SQL.InsertOrUpdateRecords function can now pass dates, times and timestamps better.
To synchronize multiple scripts in FileMaker server between WebDirect and Script Engine, we got new Mutex functions. They also help to synchronize use of our SharedMemory functions.
Our list functions got new ways to count items in the list and find the index of the first matching element. The List.SortWithEvaluate and QuickList.SortWithEvaluate functions allow you to sort lists with custom expressions. Your expression is evaluated to compare two entries and provide a custom sorting.
For CURL we can now provide HTTP headers as JSON with our new CURL.GetHeaderAsJSON function. If you need to use a specific CURL library, you can load it with the CURL.LoadLibrary function. For Linux we load libidn dynamically if installed and use it to resolve domain names with unicode characters. For MacOS and Windows we let the system do this. We enabled SSPI, Kerberos 5 and SPNEGO for CURL functions on Windows.
Our new plugin allows you to use LibXL in version 3.9, the library we use to read and write Excel documents (xlsx and xls) without having Microsoft Excel being installed. The new version enables us to read styled text from cells in the document and return them as styled text in FileMaker with XL.Sheet.CellReadStyledText function. In the other direction, we can pass styled text from a FileMaker field directly to a cell in the Excel document with XL.Sheet.CellWriteStyledText function. You can query whether a cell contains styled text with XL.Sheet.CellIsStyledText and you can set the calculation mode for the whole document. For columns and rows you can now let LibXL return you the size in pixels to better adjust pictures to place to the right size.
The hotkey functions can now define hotkeys to work only in ScriptWorkspace and to be permanently stored in preferences file. This helps to automate actions in Script Workspace in relation to our custom contextual menu commands there. Please enjoy improved font size support in the Script Workspace.
The new XML.Compact function can compact XML and is the reverse for XML.Format function. With WebView.SetInternetExplorerHiDPI function you can enable HiDPI support for the web viewer on Windows. The CoreML functions can now pass 2D data with CoreML.Add2DArrayParameter function. With WebView.InstallUserMediaAccess and new preferences keys you can enable camera access within web viewer on MacOS and iOS.
Finally we updated CURL to version 7.70.0, DynaPDF to 220.127.116.11, SQLAPI to 5.0.6, LibXL to 3.9 and OpenSSL to 1.1.1g.
See release notes for a complete list of changes.