Conditions
Conditions allow you to choose with granularity when to execute actions or display information.
They can be used inside components or monitors, but also in actions.
Conditions mainly work with variables, which can be input variables that are retrieved when the user entered some data,
or general variables that you defined yourself.
A condition is a String that is evaluated at runtime by the application. This enables you to chain conditions.
Below is an exhaustive list of the available operators & operands.
In the tutorial An Octory Pro tour, you can learn how to deal with simple conditions.
Operators
Comparison operators
==
for equal!=
for different>
for greater than>=
for greater than equal<
for lesser than<=
for lesser than or equal<:
for contains. The result is true if the left operand contains the right one. The left operand has to be filled with values separated by commas. For example: if the variableDucks
has "Huey, Dewey, Louie" for value, the comparisonDucks <: "Dewey"
is evaluated as true.=~
for has Suffix. For example:Hello =~ He
isfalse
butHello =~ llo
is true.
Logic operators
&&
for and||
for or
Operands
You can compare a variable and an operand with a comparison operator. There are four types of operands.
String
which are quoted with double quotes onlyNumber
which groups all numeric values, including floating onesBoolean
which are written as true or falsevariables
which have to begin by a letter (lower or upper case) and can contain hyphens - and underscores _
Two variables can be compared. Note that boolean variables can be written without the ==
to evaluate if their state is true
.
Examples
Given the following variables, here are some examples:
Variables
- “isUserAWizard”: “true”
- “userName”: “Gandalf”
- “userAge”: “400”
- “fellowship”: “Gandalf, Frodo, Sam, Aragorn, Gimli, Legolas, Boromir, Merry, Pippin”
- “hobbit”: “Bilbo”
- “passphrase”: “You shall not pass!”
Expressions
isUserAWizard == true && hobbit == "Bilbo"
→ trueuserAge >= 400 || userName != "Saruman"
→ truefellowship <: hobbit
→ falseuserAge < 400 && userName == "Gandalf"
→ false(userAge < 400 && userName == "Gandalf) || fellowship <: "Aragorn"
→ trueisUserAWizard && passphrase == "You shall not pass!"
→ true
Conditionally insert or remove components or monitors
You can add a condition to any component. Octory will smoothly animate the insertion or removal of the component,
depending on the result of the condition evaluation.
For example, if you define a ListInputComponent
to ask the user their role in the company.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- ... -->
<key>Slides</key>
<array>
<dict>
<key>Containers</key>
<array>
<dict>
<key>Components</key>
<array>
<dict>
<key>Type</key>
<string>Input</string>
<key>InputType</key>
<string>List</string>
<key>Variable</key>
<string>UserRole</string>
<key>Items</key>
<array>
<string>Consultant</string>
<string>Manager</string>
<string>Department Manager</string>
<string>Director</string>
</array>
</dict>
</array>
</dict>
</array>
</dict>
</array>
<!-- ... -->
</dict>
You can then display a TextComponent
only for the director role, like this.
<dict>
<key>Type</key>
<string>Text</string>
<key>Text</key>
<string>I want a raise!</string>
<key>Condition</key>
<string>UserRole == "Director"</string>
</dict>
Or you can display an input component only for the Consultant and Manager roles with the contains operator <:
<dict>
<key>Type</key>
<string>Input</string>
<key>InputType</key>
<string>Text</string>
<key>Condition</key>
<string>"Consultant, Manager" <: UserRole</string>
<key>Label</key>
<string>Who is your manager?</string>
<key>Variable</key>
<string>UserManager</string>
</dict>
If you define a variable in General → Variables like NonDirectorRoles
: “Consultant, Manager”, you could simply write the last component this way.
<dict>
<key>Type</key>
<string>Input</string>
<key>InputType</key>
<string>Text</string>
<key>Condition</key>
<string>NonDirectorRoles <: UserRole</string>
<key>Label</key>
<string>Who is your manager?</string>
<key>Variable</key>
<string>UserManager</string>
</dict>
It is a good practice to store all your variables in the Variables array to avoid to repeat yourself, which is error prone. That said, you can even store conditions in the Conditions array to avoid to repeat this condition in several components.
<array>
<key>IsUserNotADirector</key>
<string>NonDirectorRoles <: UserRole</string>
</array>
Finally, your component would appear even clearer.
<dict>
<key>Type</key>
<string>Input</string>
<key>InputType</key>
<string>Text</string>
<key>Condition</key>
<string>IsUserNotADirector</string>
<key>Label</key>
<string>Who is your manager?</string>
<key>Variable</key>
<string>UserManager</string>
</dict>
Monitors
When adding a condition to monitors, you should keep in mind that the user can exit the application depending on the monitor installation states (unless you deactivated this behavior with the UserCanQuitIfInstallationIsIncomplete
key in the navigation section).
Thus, if all the monitors whose conditions are validated are installed, the user will be able to exit.
That said, conditionally inserting monitors to be installed lets the user being able to exit by changing an input which validates some monitors but not the ones they are supposed to wait the installation for.
Taking this into consideration, you might want to use the key HidePreviousButton
for a slide to prevent the user from changing their choice.