You cannot downgrade from version 2.x to version 1.x automatically (without manually re-importing datasets with recovery APIs) Upgrading from 1.x to 2.x is done for you automatically, with data migration. See release notes for the version 2.0.1 We advise you to take extra care with upgrading to version 2.x+ from 1.x branch and test your form configurations in your test environments first, before upgrading your live environments. |
If you have any questions about upgrading to ConfiForms version 2.x or have any issues, please contact us via Support Request Form See also Known issues |
Development versions could be found here: http://vertuna.com/builds/ |
Since ConfiForms app version 2.x we will publish release notes here
|
Helps you to see what version of the attachment is used by ConfiForms record, what page is referenced and it's internal IDs and attributes
/ajax/confiforms/rest/storage-details.action?pageId=819201&formName=f&fieldName=mypage - pageId: where the form is defined - formName: name of the form - fieldName: (optional) to limit the output to analyze only the specific field and it's data |
Option needs to be enabled in the app's general settings first and then can be accessed from any form's Admin UI
Remember that you need to allow export and search on your ConfiForms Form (Definition) and you form shall not be set to shown only own records to non-admin users. Also you shall have ConfiForms views built over your form. As Confluence search index is disconnected from ConfiForms data then you need to make sure you inform Confluence about the need to reindex the contents - This can be done with the help of ConfiForms IFTTT Integration Rules macro with action set to "Force page to reindex". Please be aware that this action only suggests Confluence indexer to index the page, and actual indexing might take a while to start and complete
@ExportAsService({ConfiFormsStorageComponent.class}) @Named("confiFormsStorageComponent") |
public interface ConfiFormsStorageComponent { String findFieldValueById(ContentEntityObject contentEntityObject, String formName, String id, String fieldName); RegEntry findById(ContentEntityObject contentEntityObject, String formName, String id); List<RegEntry> findByAll(ContentEntityObject contentEntityObject, String formName); List<RegEntry> findRecordsByCurrentUser(ContentEntityObject contentEntityObject, String formName); List<RegEntry> findRecordsByUser(ContentEntityObject contentEntityObject, String formName, String username); void updateField(ContentEntityObject contentEntityObject, String formName, String query, String field, String value) throws Exception; } |
Implemented a way to receive notifications from ConfiForms Form submission routine (by overriding the following JavaScript functions)
function onCFSubmitStarted(formName){ } function onCFSubmitFinished(formName){ } function onCFSubmitError(formName){ } |
You can override it for example like this
onCFSubmitStarted = function(formName) { alert('The form is about to be submitted'); } |
Fixed support for accessing _previousState for the ConfiForms record when used to send email/ in-app notification.
Example: In a form we have 2 fields: "a" and "b". And want to notify about the change, together with previous values
<ac:structured-macro ac:macro-id="be9a1667-0b16-470c-8511-951bf66dd733" ac:name="confiform-ifttt" ac:schema-version="1"> <ac:parameter ac:name="condition">hasChanged():true</ac:parameter> <ac:parameter ac:name="action">Send Notification</ac:parameter> <ac:parameter ac:name="event">onModified</ac:parameter> <ac:parameter ac:name="title">testing hasChanged</ac:parameter> <ac:parameter ac:name="who">admin</ac:parameter> <ac:rich-text-body> <p> <ac:structured-macro ac:macro-id="c4def14c-d432-4bb9-86a7-912288fedf71" ac:name="confiform-field" ac:schema-version="1"> <ac:parameter ac:name="fieldName">_previousState.a</ac:parameter> </ac:structured-macro> → <ac:structured-macro ac:macro-id="76a0b38f-4cfc-40a9-9746-993585a122d2" ac:name="confiform-field" ac:schema-version="1"> <ac:parameter ac:name="fieldName">a</ac:parameter> </ac:structured-macro> </p> <p> <ac:structured-macro ac:macro-id="81d4aa93-f85f-48fc-a853-37bcb8375557" ac:name="confiform-field" ac:schema-version="1"> <ac:parameter ac:name="fieldName">_previousState.b</ac:parameter> </ac:structured-macro> → <ac:structured-macro ac:macro-id="840e6523-60d5-4b47-b724-476e6a753ec0" ac:name="confiform-field" ac:schema-version="1"> <ac:parameter ac:name="fieldName">b</ac:parameter> </ac:structured-macro> </p> </ac:rich-text-body> </ac:structured-macro> |
Introducing new virtual function to help you to format the number in the given locale: formatNumberWithLocale. See more details in Virtual functions
<ac:structured-macro ac:macro-id="d860f6a8-91e0-4b60-ac8b-f9d77f53aa33" ac:name="confiform-table" ac:schema-version="1"> <ac:parameter ac:name="formName">f</ac:parameter> <ac:rich-text-body> <p> <br/> </p> </ac:rich-text-body> </ac:structured-macro> <p>only equals</p> <ac:structured-macro ac:macro-id="bcc29516-fa5c-46db-8a0a-4ff1248285e0" ac:name="confiform-table" ac:schema-version="1"> <ac:parameter ac:name="filter">a1:[entry._func.asEntryRef(entry.a2)]</ac:parameter> <ac:parameter ac:name="formName">f</ac:parameter> <ac:rich-text-body> <p> <br/> </p> </ac:rich-text-body> </ac:structured-macro> |
Improved "fix-storage" service (see below for parameters) to handle duplicate record ids (and fix them)
[YOUR_CONFLUENCE_SERVER_URL]/ajax/confiforms/rest/fix-storage.action?formName=<FORM_NAME>&pageId=<PAGE_ID> |
Support for wildcards (*) in navigation instructions when applying it on a JSON input. A wildcard means the first property in JSON will be taken
Why? Consider this JSON example. Property values can easily change here, but the structure itself is preserved
{ "return": [ { "somehostname01": { "file_|-/etc/ssh/sshd_config_|-/etc/ssh/sshd_config_|-managed": { "comment": "File /etc/ssh/sshd_config is in the correct state", "pchanges": { }, "name": "/etc/ssh/sshd_config", "start_time": "11:01:54.394381", "result": true, "duration": 21.685, "__run_num__": 0, "__sls__": "abb.sshd", "changes": { }, "__id__": "/etc/ssh/sshd_config" } } } ] } |
Here is how you can take the "comment" field value
j.asJSON.return.*.*.comment |
which reads to, take the value of a "j" field, transform it to JSON, then get the first property value, then get the first property of a returned value and then lookup for the "comment" property value
Additional service to help with autonumbers in forms after migration (if migrated from ConfiForms version 1.x to ConfiForms version 2.0.8 or lower)
[YOUR_CONFLUENCE_SERVER_URL]/ajax/confiforms/rest/fix-storage.action?formName=<FORM_NAME>&pageId=<PAGE_ID> |
The service makes sure there are no gaps in the records and all the missing / deleted "records" get also migrated carefully.
Fixed Persian Date field bug not showing correctly the date stored (when in edit mode)
Added support to ConfiForms IFTTT to send emails with field value changes. The following constructions (inside ConfiForms IFTTT macro body) show how to check for changes in fields "t1" and "t2". And only in case the value has been changed it will be printed (in this example together with it's previous value)
#if(("[entry.t1]" != "[entry._previousState.t1]")) [entry.t1] [entry._previousState.t1] #end #if(("[entry.t2]" != "[entry._previousState.t2]")) [entry.t2] [entry._previousState.t2] #end |
Experimental service to export ConfiForms data as RSS feed
https://<YOUR_SERVER>/ajax/confiforms/rest/export-to-rss.action? pageId=<PAGE_ID> &f=<FORM_NAME> &feedTitle=<FEED NAME> &feedDescription=<FEED DESCRIPTION> &feedLink=<FEED URL> &entryTitleField=<FORM FIELD TO USE AS TITLE> &entryDescriptionField=<FORM FIELD TO USE AS DESCRIPTION> &entryLinkField=<FORM FIELD TO USE AS URL> entryTitleField, entryDescriptionField, entryLinkField - could use virtual functions and access any field property your form's field may have Optional parameter: feedType Possible values: rss_2.0, rss_0.92, rss_0.94, rss_0.93, rss_1.0, atom_1.0, atom_0.3 |
Recovery API now physically deletes existing records and replaces the dataset contents with what's given (this also resets autonumber sequences in a form). You can also clean up the form completely by uploading empty dataset in a format
{"data":"<list></list>"} |
Enhanced service to check forms storage integrity (reporting non-compliant fieldnames)
[YOUR_CONFLUENCE_SERVER_URL]/ajax/confiforms/rest/storage-integrity.action?formName=<FORM_NAME>&pageId=<PAGE_ID> |
Introducing "_func" bridge function to enable access to virtual functions through the entry (without using any field). This is sometimes necessary when you want to create complex dynamic filters such as:
field1:[entry._func.asEntryRef(entry.field2.transform(id).join( OR field1:))] |
This filter, for example, tells to find records where "field1" values match values from "field2". And both fields are multi-value fields
Added support for "Apply filter" field definition rule to work on attachments picker
Assuming the field name for "Attachment picker" is "mypicker" and is set to show attachments from children pages, but you want to show only current page attachments (when you put FormView on a child page) mypicker.asAttachment.content.id:[entry._page.id] |
Data migration is done for your automatically when you access the form for the first time. This could take some time for the first load, depending your your dataset size
There are methods to help you to understand how you data looks like and force the migration via migration APIs if you want to do so (accessible only to Confluence system administrators)
Storage analysis
[YOUR_CONFLUENCE_SERVER_URL]/ajax/confiforms/rest/storage-analysis.action?spaceKey=<SPACE_KEY> |
Auto-migration
[YOUR_CONFLUENCE_SERVER_URL]/ajax/confiforms/rest/auto-migration.action?spaceKey=<SPACE_KEY> |
Storage integrity check
[YOUR_CONFLUENCE_SERVER_URL]/ajax/confiforms/rest/storage-integrity.action?formName=<FORM_NAME>&pageId=<PAGE_ID> |
(Force)Migrate form's storage via service
[YOUR_CONFLUENCE_SERVER_URL]/ajax/confiforms/rest/migrate-to-storage-v3.action?formName=<FORM_NAME>&pageId=<PAGE_ID> |
We advise you to take extra care with upgrading to version 2.x+ from 1.x branch and test your form configurations in your test environments first, before upgrading your live environments.
Your tables, rendered with CardView and TableView macros, will look different and use the cleaner styles as provided by AUI - https://docs.atlassian.com/aui/7.8.0/docs/tables.html
Your forms look cleaner as well, and also follow the guidelines and styles from AUI