This is the documentation for ConfiForms Server/Data Center app
However, this might also work for ConfiForms cloud and in most cases it does. But please see this page to understand the differences between server and cloud versions of the ConfiForms app.
In this tutorial you will learn how to configure ConfiForms to provide sequential approvals workflow using actions defined by IFTTT macro rules.
This tutorial is not very simple, and you have to pay attention to details. And it is an alternative to the tutorial: Creating form with sequential approvals workflow in Confluence with ConfiForms
To learn the basics about ConfiForms see Creating a simple form in Confluence with ConfiForms
Same setup as in Creating form with sequential approvals workflow in Confluence with ConfiForms , but instead of Field Definition Rule for "statelabel" with a formula field we will have a number of IFTTT macros (macro updates the original record based on the condition we set)
We will have 3 user groups who should be able to approve a proposal in a sequential way, one by one and only when a proposal is in a certain state.
3 user groups (security groups in Confluence) are as follows:
The form is very simple and has 2 common fields to capture the proposal text in a plaintext format and to set a readonly field to show the proposal approval state as a text.
For each user group we will setup own field control of type "checkbox" to change current approval state to next state. Fields are restricted to be editable by certain user group only
So in total we will have 5 fields here:
And we will have 4 IFTTT rules which handle the approval state for us
3 IFTTTs are set on modify event and 1 is on created
The whole storage format for the form is listed below:
<ac:structured-macro ac:macro-id="81b6f18d-2cd2-4604-b9f3-7a3ea40d77fd" ac:name="confiform" ac:schema-version="1"> <ac:parameter ac:name="additionalFormAdmins">devs,pm,fin</ac:parameter> <ac:parameter ac:name="formName">proposals</ac:parameter> <ac:parameter ac:name="saveButtonLabel">Register proposal</ac:parameter> <ac:parameter ac:name="registrationFormTitle">Register</ac:parameter> <ac:rich-text-body> <p> <ac:structured-macro ac:macro-id="5e9e1e46-2d3d-4847-b4c4-01e7345b2a6c" ac:name="confiform-field-definition" ac:schema-version="1"> <ac:parameter ac:name="fieldName">proposaltext</ac:parameter> <ac:parameter ac:name="fieldLabel">Proposal text</ac:parameter> <ac:parameter ac:name="type">textarea</ac:parameter> </ac:structured-macro> </p> <p> <ac:structured-macro ac:macro-id="e4ddb043-92a7-4608-81f3-1e5b2138c58c" ac:name="confiform-field-definition" ac:schema-version="1"> <ac:parameter ac:name="fieldName">statelabel</ac:parameter> <ac:parameter ac:name="fieldLabel">State</ac:parameter> <ac:parameter ac:name="type">text</ac:parameter> </ac:structured-macro> </p> <p> <ac:structured-macro ac:macro-id="2e4eeef9-293e-4054-9e94-4297ea87ee17" ac:name="confiform-field-definition" ac:schema-version="1"> <ac:parameter ac:name="editRestrictions">devs</ac:parameter> <ac:parameter ac:name="fieldName">approvedByDevs</ac:parameter> <ac:parameter ac:name="fieldLabel">Approved (Devs)</ac:parameter> <ac:parameter ac:name="type">checkbox</ac:parameter> </ac:structured-macro> </p> <ac:structured-macro ac:macro-id="cad189f1-b3b6-4f33-8b79-95bd09898572" ac:name="confiform-field-definition" ac:schema-version="1"> <ac:parameter ac:name="editRestrictions">pm</ac:parameter> <ac:parameter ac:name="fieldName">approvedByPM</ac:parameter> <ac:parameter ac:name="fieldLabel">Approved By (PMs)</ac:parameter> <ac:parameter ac:name="type">checkbox</ac:parameter> </ac:structured-macro> <p> <ac:structured-macro ac:macro-id="15424339-b023-4f46-8924-5798fa2246bb" ac:name="confiform-field-definition" ac:schema-version="1"> <ac:parameter ac:name="editRestrictions">fin</ac:parameter> <ac:parameter ac:name="fieldName">approvedByFin</ac:parameter> <ac:parameter ac:name="fieldLabel">Approved By (Finance)</ac:parameter> <ac:parameter ac:name="type">checkbox</ac:parameter> </ac:structured-macro> <ac:structured-macro ac:macro-id="bace5ca5-6709-4915-ab2a-d460871e892d" ac:name="confiform-entry-register" ac:schema-version="1"> <ac:parameter ac:name="atlassian-macro-output-type">INLINE</ac:parameter> <ac:rich-text-body> <p> </p> </ac:rich-text-body> </ac:structured-macro> <ac:structured-macro ac:macro-id="4cf642af-0a9e-41ab-817c-53dbf575db48" ac:name="confiform-field-definition-rules" ac:schema-version="1"> <ac:parameter ac:name="condition">id:[empty]</ac:parameter> <ac:parameter ac:name="fieldName">approvedByDevs,approvedByPM,approvedByFin</ac:parameter> <ac:parameter ac:name="action">Hide field</ac:parameter> <ac:parameter ac:name="actionFieldName">statelabel</ac:parameter> </ac:structured-macro> </p> <p> <ac:structured-macro ac:macro-id="dc49fcc8-7dd0-4ebe-b062-da5f88970cea" ac:name="confiform-field-definition-rules" ac:schema-version="1"> <ac:parameter ac:name="condition">id:[empty]</ac:parameter> <ac:parameter ac:name="fieldName">statelabel</ac:parameter> <ac:parameter ac:name="action">Hide field</ac:parameter> <ac:parameter ac:name="actionFieldName">statelabel</ac:parameter> </ac:structured-macro> </p> <ac:structured-macro ac:macro-id="e0764127-8f55-4ff0-bbc8-d942186acae6" ac:name="confiform-ifttt" ac:schema-version="1"> <ac:parameter ac:name="action">Create ConfiForms Entry</ac:parameter> <ac:parameter ac:name="event">onCreated</ac:parameter> <ac:parameter ac:name="title">entryId=[entry.id]&statelabel=Created</ac:parameter> <ac:rich-text-body> <p> </p> </ac:rich-text-body> </ac:structured-macro> <ac:structured-macro ac:macro-id="a6829260-ae72-47a8-8ab6-10e2052f3e3a" ac:name="confiform-ifttt" ac:schema-version="1"> <ac:parameter ac:name="condition">approvedByDevs:true</ac:parameter> <ac:parameter ac:name="action">Create ConfiForms Entry</ac:parameter> <ac:parameter ac:name="event">onModified</ac:parameter> <ac:parameter ac:name="title">entryId=[entry.id]&statelabel=Approved By Devs</ac:parameter> <ac:rich-text-body> <p> </p> </ac:rich-text-body> </ac:structured-macro> <ac:structured-macro ac:macro-id="d7732e21-cc32-4e70-97f2-a2af333ff262" ac:name="confiform-ifttt" ac:schema-version="1"> <ac:parameter ac:name="condition">approvedByPM:true</ac:parameter> <ac:parameter ac:name="action">Create ConfiForms Entry</ac:parameter> <ac:parameter ac:name="event">onModified</ac:parameter> <ac:parameter ac:name="title">entryId=[entry.id]&statelabel=Approved By PMs</ac:parameter> <ac:rich-text-body> <p> </p> </ac:rich-text-body> </ac:structured-macro> <ac:structured-macro ac:macro-id="d635786d-7a00-478f-a308-7cb7dfb6f030" ac:name="confiform-ifttt" ac:schema-version="1"> <ac:parameter ac:name="condition">approvedByFin:true</ac:parameter> <ac:parameter ac:name="action">Create ConfiForms Entry</ac:parameter> <ac:parameter ac:name="event">onModified</ac:parameter> <ac:parameter ac:name="title">entryId=[entry.id]&statelabel=Approved By Finance</ac:parameter> <ac:rich-text-body> <p> </p> </ac:rich-text-body> </ac:structured-macro> </ac:rich-text-body> </ac:structured-macro>
This is about everything about form configuration, let's proceed with an actual approvals workflow.
We use ListView macro to show the data and have setup multiple edit buttons what are visible to certain user groups. Here is how it looks in the editor
So, we reference the form by name ("proposals") and put references to field definitions using ConfiForms Field macros. So far, so good. Simple and straightforward. The trick though is with configuration of ConfiForms Edit Controls. We want it to appear only for certain user groups and only when a record is in certain condition. Let's see it in details:
Second edit button, we call it "ApprovePM" has the following settings
Visible to only "pm" group and hidden when the following condition is met:
approvedByFin:true OR approvedByPM:true OR approvedByDevs:false
Explanation: Button will be hidden when it already approved by PMs, or not approved yet by DEVs, or already approved by FINANCE
Third edit button, we call it "ApproveFIN" has the following settings
Visible to only users in "fin" user group and hidden when the following condition is met:
approvedByFin:true OR approvedByPM:false OR approvedByDevs:false
Explanation: Button will be hidden when it already approved by FINANCE, or not approved yet by PMs or not yet approved by DEVs
Full storage format for this list view is listed below
<ac:structured-macro ac:macro-id="96b70748-706b-4115-aaf2-5b9ae013b151" ac:name="confiform-list" ac:schema-version="1"> <ac:parameter ac:name="formName">proposals</ac:parameter> <ac:rich-text-body> <h3>Proposal:</h3> <p> <ac:structured-macro ac:macro-id="ab7fd363-7416-40c7-b9fa-58d253f49c81" ac:name="confiform-field" ac:schema-version="1"> <ac:parameter ac:name="fieldName">proposaltext</ac:parameter> </ac:structured-macro> </p> <p> <strong> <ac:structured-macro ac:macro-id="cf8c064e-18f4-48ea-922c-18b9b348f13d" ac:name="confiform-field" ac:schema-version="1"> <ac:parameter ac:name="fieldName">statelabel</ac:parameter> </ac:structured-macro> </strong> <ac:structured-macro ac:macro-id="f04196d7-d5fe-49ed-a347-7a7234fe1b96" ac:name="confiform-entry-edit" ac:schema-version="1"> <ac:parameter ac:name="restrictions">devs</ac:parameter> <ac:parameter ac:name="showBoth">false</ac:parameter> <ac:parameter ac:name="hideIfMatches">approvedByDevs:true</ac:parameter> <ac:parameter ac:name="updateMessage">Approved</ac:parameter> <ac:parameter ac:name="editButtonLabel">ApproveDEV</ac:parameter> </ac:structured-macro> <ac:structured-macro ac:macro-id="c69b2a2c-b742-448d-be62-118d36680eb3" ac:name="confiform-entry-edit" ac:schema-version="1"> <ac:parameter ac:name="restrictions">pm</ac:parameter> <ac:parameter ac:name="showBoth">false</ac:parameter> <ac:parameter ac:name="hideIfMatches">approvedByFin:true OR approvedByPM:true OR approvedByDevs:false </ac:parameter> <ac:parameter ac:name="updateMessage">Approved</ac:parameter> <ac:parameter ac:name="editButtonLabel">ApprovePM</ac:parameter> </ac:structured-macro> <ac:structured-macro ac:macro-id="4ae8ce8d-066b-40b4-a74a-a564f58dc03a" ac:name="confiform-entry-edit" ac:schema-version="1"> <ac:parameter ac:name="restrictions">fin</ac:parameter> <ac:parameter ac:name="showBoth">false</ac:parameter> <ac:parameter ac:name="hideIfMatches">approvedByFin:true OR approvedByPM:false OR approvedByDevs:false </ac:parameter> <ac:parameter ac:name="updateMessage">Approved</ac:parameter> <ac:parameter ac:name="editButtonLabel">ApproveFIN</ac:parameter> </ac:structured-macro> </p> <p> </p> </ac:rich-text-body> </ac:structured-macro>
And this is how the form looks like in Confluence view mode:
This is how it is seeing by FINANCE team