Slides visited, completed
Creating a lively and intuitive UX user experience
Managing the visit and the completion of slides
Making slides accessible under certain complex conditions? You can do it!
Track the progress of the screens or chapters you have visited? Absolutely possible!
Don't restrict yourself in your ideas or in the path (educational or playful) you envisage!
With Nuggets, nothing is out of reach!
Customer Case
Let's talk straight away about the case study we had to carry out in 2023!
Situation | A regional authority wishes to train its employees in various aspects of the regulations in application. |
Staging | A city map in isometric view allows you to go to each chapter by selecting a building. As long as the main principles are not consulted in their entirety, only the building to access them remains clickable. |
Conditions |
|
Needs |
|
Interests | Make it possible for learning to be both individualised and guided. |
Are you throwing in the towel? We don't!
Before Nuggets
All developers will tell you: Storyline does not (yet) allow you to have a "viewed/not viewed" status per slide. It is therefore necessary to use JavaScript to keep a browsing history in a variable of type Text
.
Furthermore, in the case we are interested in here, we need to check, again using JavaScript, whether this or that slide has been visited, consulted, or even validated if it is a quiz, in order to unlock this or that section.
Added to this is the notion of compulsory, normal and optional, not on a single section but on a case-by-case basis on all chapters.
It's a real gas factory in terms of JavaScript, Storyline variables and triggers...
And yet, it's perfectly feasible within Storyline, and with great elegance!
Featuring Nuggets
Prerequisites
- Master the use of operating expressions provided by the LocalTrack feature;
- Set your `.STORY' file to use LocalTrack :
- create two process variables and two result variables. ;
For the article, we will use the binomial variables :ProgressByChapTracking
etProgressByChapResult
;GlobalProgressTracking
etGlobalProgressResult
;
- create the triggers that will manipulate these variables.
- create two process variables and two result variables. ;
Storyline trigger
When 'ProgressByChapTracking' changes
- Execute 'JavaScript'
If 'ProgressByChapTracking' ≠ value '(empty)'
When 'GlobalProgressTracking' changes
- Execute 'JavaScript'
If 'GlobalProgressTracking' ≠ value '(empty)'
and for each JavaScript :
JavaScript
LocalTrack.parse('ProgressByChapTracking','ProgressByChapResult');
JavaScript
LocalTrack.parse('GlobalProgressTracking','GlobalResult');
For more information, refer to the "LocalTrack" page.
We will not include the conditions If 'nuggetsLoad' = value 'True'
and If 'isOnline' = value 'True'
in the triggers that illustrate the article.
For your development, think about implementing them.
How it works
1. Preparation
Let's put it in table form:
Binary | Index | Professions A and B | Profession A | Profession B |
---|---|---|---|---|
21 = 2 | 1 | Chapter 1.1 | Chapter 2.1 | Chapter 3.1 |
22 = 4 | 2 | Chapter 1.2 | Chapter 2.2 | Chapter 3.2 |
23 = 8 | 3 | Chapter 1.3 | Chapter 2.3 | Chapter 3.3 |
24 = 16 | 4 | Chapter 1.4 | Chapter 2.4 | Chapter 3.4 |
25 = 32 | 5 | Chapter 1.5 | Chapter 2.5 | Chapter 3.5 |
Mandatory chapters are in bold:
- All Professions must follow chapter 1 ;
- Chapter 2 is mandatory for profession A, optional for profession B;
- Chapter 3 is mandatory for profession B, optional for profession A.
From there, let's calculate the sum of the binary expressions of the mandatory sections for each trade.
Professions | Chapter 1 | Chapter 2 | Chapter 3 |
---|---|---|---|
Profession A | 62 | 14 | 0 |
Profession B | 62 | 0 | 30 |
These sums will be used as filtering parameters for the operating expressions later on.
2. Initialisation
To start on a branch, trade A or trade B, let's create a slide which will offer us the choice via 2 buttons on which we'll create triggers.
Storyline triggers
When the user clicks 'Profession A button'
- Set 'Filter_Chap_1' to value '62'
- Set 'Filter_Chap_2' to value '14'
- Set 'Filter_Chap_3' to value '0'
When the user clicks 'Profession B button'
- Set 'Filter_Chap_1' to value '62'
- Set 'Filter_Chap_2' to value '0'
- Set 'Filter_Chap_3' to value '30'
You'll see that we've just created 3 variables of type Number
: Filter_Chap_1
, Filter_Chap_2
and Filter_Chap_3
.
At the same time, we create 3 other variables, of type Number
, which will enable us to track the progress of the chapters: Progress_Chap_1
, Progress_Chap_2
and Progress_Chap_3
.
3. Progress
Let's continue on our chosen branch. For each of the slides we're going to visit, we'll need to keep a record of our visit.
To do this, let's create triggers in each of the project slides.
Storyline triggers
// Scene 'Chap 1' > Slide 1.1
When the timeline starts on 'this slide'
- Set 'ProgressByChapTracking' to value 'Progress_Chap_1+1'
// Scene 'Chap 1' > Slide 1.2
When the timeline starts on 'this slide'
- Set 'ProgressByChapTracking' to value 'Progress_Chap_1+2'
// ...
// Scene 'Chap 2' > Slide 2.1
When the timeline starts on 'this slide'
- Set 'ProgressByChapTracking' to value 'Progress_Chap_2+1'
// Etc.
4. Unlocking
Every time the learner comes back into town, we have to make sure that chapter 1 has been completed.
Because we've tracked their progress in real time and know exactly what they've consulted, we can check quickly thanks to binary operational expressions!
Storyline triggers
// Introduction scene > City map
When the timeline starts on 'this slide'
- Set 'ProgressByChapTracking' to value 'Progress_Chap_1&Filter_Chap_1'
- Set state of 'Button - Chap 2 building' to 'Normal'
If 'ProgressByChapResult' = variable 'Filter_Chap_1'
- Set state of 'Button - Chap 2 building' to 'Disabled'
If 'ProgressByChapResult' ≠ variable 'Filter_Chap_1'
- Set state of 'Button - Chap 3 building' to 'Normal'
If 'ProgressByChapResult' = variable 'Filter_Chap_1'
- Set state of 'Button - Chap 3 building' to 'Disabled'
If 'ProgressByChapResult' ≠ variable 'Filter_Chap_1'
5. Completion
By default, the parameters in the .STORY
file consider that the module is terminated when all the slides have been viewed. But what about the optional parts which should not be taken into account in the completion?
To remedy this, let's create a layer in the Main Slide Master which we'll call _check completion
and whose chronology duration will be reduced to the minimum: 0.13s. Let's also uncheck everything in the layer properties and select Restore initial state
on a new visit.
On the Slide Master, place these triggers:
Storyline triggers
When the timeline starts on 'this slide'
- Show the layer '_check completion'
When 'Progress_Chap_1' change
- Show the layer '_check completion'
When 'Progress_Chap_2' change
- Show the layer '_check completion'
When 'Progress_Chap_3' change
- Show the layer '_check completion'
Then in the layer _completion check
:
Storyline triggers
// Main Slide Master > '_check completion' layer
When the timeline starts on 'this slide'
- Set 'ProgressByChapTracking' to value 'Progress_Chap_1&Filtre_Chap_1'
- Set 'GlobalProgressTracking' to value 'ProgressGlobal+1'
If 'ProgressByChapResult' = variable 'Filter_Chap_1'
- Set 'ProgressByChapTracking' to value 'Progress_Chap_2&Filter_Chap_2'
- Set 'GlobalProgressTracking' to value 'ProgressGlobal+2'
If 'ProgressByChapResult' = variable 'Filter_Chap_2'
- Set 'ProgressByChapTracking' to value 'Progress_Chap_3&Filter_Chap_3'
- Set 'GlobalProgressTracking' to value 'ProgressGlobal+3'
If 'ProgressByChapResult' = variable 'Filter_Chap_3'
- Complete course as 'Completed/Passed'
If 'ProgressGlobal' = valeur '14'
When the timeline ends on 'this slide'
- Hide layer 'this layer' // chronology reduced to 0.13s (the shortest)
The module is complete, even if the optional parts are not consulted!