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
  • To access the more specific chapters, employees must first have read the three chapters containing the "main principles", in any order.

  • Certain chapters are dedicated to specific professions and are optional for certain participants, but mandatory for others.
Needs
  • Ensure that employees can access the specific chapters after going through the "main principles ", without any restriction as to order.

  • Enable participants to access the chapters dedicated to their business, according to their specific 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 et ProgressByChapResult ;
      • GlobalProgressTracking et GlobalProgressResult ;
    • create the triggers that will manipulate these 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!