mumuki-laboratory 8.1.0 → 8.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +1 -1
  3. data/app/assets/javascripts/mumuki_laboratory/application/button.js +4 -4
  4. data/app/assets/javascripts/mumuki_laboratory/application/codemirror-builder.js +3 -3
  5. data/app/assets/javascripts/mumuki_laboratory/application/codemirror.js +6 -6
  6. data/app/assets/javascripts/mumuki_laboratory/application/console.js +2 -2
  7. data/app/assets/javascripts/mumuki_laboratory/application/discussions.js +7 -7
  8. data/app/assets/javascripts/mumuki_laboratory/application/editors.js +1 -1
  9. data/app/assets/javascripts/mumuki_laboratory/application/elipsis.js +1 -1
  10. data/app/assets/javascripts/mumuki_laboratory/application/events.js +2 -2
  11. data/app/assets/javascripts/mumuki_laboratory/application/exercise.js +2 -2
  12. data/app/assets/javascripts/mumuki_laboratory/application/gamification.js +13 -3
  13. data/app/assets/javascripts/mumuki_laboratory/application/inputs.js +1 -1
  14. data/app/assets/javascripts/mumuki_laboratory/application/kids.js +4 -4
  15. data/app/assets/javascripts/mumuki_laboratory/application/kindergarten.js +7 -7
  16. data/app/assets/javascripts/mumuki_laboratory/application/messages.js +6 -6
  17. data/app/assets/javascripts/mumuki_laboratory/application/mu-modal-carrousel.js +1 -1
  18. data/app/assets/javascripts/mumuki_laboratory/application/multiple-choice.js +1 -1
  19. data/app/assets/javascripts/mumuki_laboratory/application/multiple-files.js +3 -3
  20. data/app/assets/javascripts/mumuki_laboratory/application/multiple-scenarios.js +1 -1
  21. data/app/assets/javascripts/mumuki_laboratory/application/pin.js +1 -1
  22. data/app/assets/javascripts/mumuki_laboratory/application/primary.js +1 -1
  23. data/app/assets/javascripts/mumuki_laboratory/application/progress.js +1 -1
  24. data/app/assets/javascripts/mumuki_laboratory/application/results-renderer.js +1 -1
  25. data/app/assets/javascripts/mumuki_laboratory/application/speech-bubble-renderer.js +4 -4
  26. data/app/assets/javascripts/mumuki_laboratory/application/submission.js +2 -2
  27. data/app/assets/javascripts/mumuki_laboratory/application/submissions-store.js +3 -3
  28. data/app/assets/javascripts/mumuki_laboratory/application/sync-mode.js +2 -2
  29. data/app/assets/javascripts/mumuki_laboratory/application/timer.js +1 -1
  30. data/app/assets/stylesheets/mumuki_laboratory/application/_layout.scss +7 -7
  31. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_overlap.scss +0 -4
  32. data/app/controllers/application_controller.rb +1 -0
  33. data/app/controllers/concerns/with_user_discussion_validation.rb +6 -0
  34. data/app/controllers/discussions_controller.rb +0 -6
  35. data/app/controllers/users_controller.rb +2 -1
  36. data/app/helpers/assignment_result_helper.rb +1 -1
  37. data/app/helpers/discussions_helper.rb +4 -4
  38. data/app/helpers/editor_tabs_helper.rb +1 -1
  39. data/app/helpers/icons_helper.rb +1 -1
  40. data/app/helpers/links_helper.rb +3 -3
  41. data/app/helpers/menu_bar_helper.rb +5 -1
  42. data/app/helpers/overlapped_buttons_helper.rb +6 -2
  43. data/app/views/book/show.html.erb +2 -2
  44. data/app/views/discussions/_message.html.erb +2 -2
  45. data/app/views/exercise_solutions/_kids_level_up.html.erb +1 -1
  46. data/app/views/exercises/_exercise_assignment.html.erb +1 -1
  47. data/app/views/exercises/_read_only.html.erb +1 -1
  48. data/app/views/exercises/show.html.erb +1 -1
  49. data/app/views/layouts/_copyright.html.erb +1 -1
  50. data/app/views/layouts/_guide.html.erb +8 -6
  51. data/app/views/layouts/_kids.html.erb +4 -4
  52. data/app/views/layouts/_kindergarten.html.erb +5 -5
  53. data/app/views/layouts/_social_media.html.erb +4 -4
  54. data/app/views/layouts/_timer.html.erb +1 -1
  55. data/app/views/layouts/application.html.erb +28 -26
  56. data/app/views/layouts/embedded.html.erb +14 -11
  57. data/app/views/layouts/exercise_inputs/editors/_code.html.erb +1 -6
  58. data/app/views/layouts/exercise_inputs/editors/_multiple_files.html.erb +4 -9
  59. data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +1 -1
  60. data/app/views/layouts/modals/_guide_corollary.html.erb +13 -3
  61. data/app/views/layouts/modals/_kids_results.html.erb +2 -2
  62. data/app/views/layouts/modals/_kindergarten_context.html.erb +3 -3
  63. data/app/views/layouts/modals/_kindergarten_results.html.erb +3 -3
  64. data/app/views/layouts/modals/_kindergarten_results_aborted.html.erb +1 -1
  65. data/app/views/layouts/modals/_level_up.html.erb +1 -1
  66. data/app/views/users/_edit_user_form.html.erb +1 -1
  67. data/app/views/users/_user_form.html.erb +1 -1
  68. data/lib/mumuki/laboratory.rb +1 -1
  69. data/lib/mumuki/laboratory/engine.rb +1 -1
  70. data/lib/mumuki/laboratory/locales/en.yml +3 -1
  71. data/lib/mumuki/laboratory/locales/es-CL.yml +4 -2
  72. data/lib/mumuki/laboratory/locales/es.yml +6 -3
  73. data/lib/mumuki/laboratory/locales/pt.yml +4 -2
  74. data/lib/mumuki/laboratory/version.rb +1 -1
  75. data/spec/controllers/discussions_controller_spec.rb +19 -0
  76. data/spec/dummy/db/schema.rb +2 -1
  77. data/spec/features/terms_flow_spec.rb +14 -8
  78. data/spec/helpers/icons_helper_spec.rb +3 -3
  79. data/spec/helpers/test_results_rendering_spec.rb +8 -8
  80. data/spec/helpers/with_navigation_spec.rb +14 -14
  81. data/spec/javascripts/gamification-spec.js +2 -2
  82. metadata +109 -104
  83. data/spec/dummy/config/database.travis.yml +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '09a264d9715c09e4cae736ed4e03396ce77befb1a1cd6c4f78834288ec8c1e3a'
4
- data.tar.gz: d03d848615882618547802ebb1904b706e730007e9ba13e0633aa13e789dd562
3
+ metadata.gz: bf871725a11b2dd65249bd5e4901440641bd3d70bc5f6410bc6a4a3044d17f9a
4
+ data.tar.gz: 4950d01c150d8f6a1c76b8581891fec28446518b47c28abd6406b9b3cc043c4a
5
5
  SHA512:
6
- metadata.gz: f6bf1f52891c8714f6d1176dbfe11a603620d6d6fd1b4bbd772c90f0c31054e7159354f83c1bc6aa04703892d04c66d019d0158f5da070b65ac27c0705086e68
7
- data.tar.gz: 3076de824027e2950c5be6604901cc2e09193ee9959b16791047454c9ee06ca978f8da8fce9eb31d95d0c2a9fedac3b92ae7532dccc4c809982b500d2d986977
6
+ metadata.gz: 858c02536ad1f128f413d24c0121ff8281598f20bcf7526d641caf91273fd7e9aeeb380bfc16f7c5ac64d0c2befd184b8e2d52c216f64e957c32c5661f8002dd
7
+ data.tar.gz: 3c5a33de2e57716d439b093c33cfb839786faf5679896fb646fcfdcf08e1adfee0163757dd5e16f268840a38bd6a85eca0f0f80a3588bd601673ed59dfd65f5e
@@ -113,7 +113,7 @@ mumuki.bridge = (() => {
113
113
  * @returns {SubmissionResult}
114
114
  */
115
115
  _preRenderResult(result) {
116
- result.class_for_progress_list_item = mumuki.renderers.progressListItemClassForStatus(result.status, true)
116
+ result.class_for_progress_list_item = mumuki.renderers.progressListItemClassForStatus(result.status, true);
117
117
  return result;
118
118
  }
119
119
  }
@@ -36,7 +36,7 @@ mumuki.Button = class {
36
36
  e.preventDefault();
37
37
  main();
38
38
  };
39
- this.$button.on('click', this.main)
39
+ this.$button.on('click', this.main);
40
40
  }
41
41
 
42
42
  // ==============
@@ -80,7 +80,7 @@ mumuki.Button = class {
80
80
 
81
81
  this.enable();
82
82
 
83
- this.$button.on('click', this.main)
83
+ this.$button.on('click', this.main);
84
84
  }
85
85
 
86
86
  // =============
@@ -106,11 +106,11 @@ mumuki.Button = class {
106
106
  }
107
107
 
108
108
  setWaitingText () {
109
- this.$button.html('<i class="fa fa-refresh fa-spin"></i> ' + this.$button.attr('data-waiting'));
109
+ this.$button.html('<i class="fas fa-sync-alt fa-spin"></i> ' + this.$button.attr('data-waiting'));
110
110
  }
111
111
 
112
112
  setRetryText() {
113
- this.$button.html('<i class="fa fa-undo"></i>');
113
+ this.$button.html('<i class="fas fa-undo"></i>');
114
114
  }
115
115
 
116
116
  setOriginalContent () {
@@ -1,7 +1,7 @@
1
1
  (() => {
2
2
  function submit() {
3
3
  $('body').removeClass('fullscreen');
4
- $('.editor-resize .fa-stack-1x').removeClass('fa-compress').addClass('fa-expand');
4
+ $('.editor-resize .fas').toggleClass('fa-expand fa-compress');
5
5
  $('.btn-submit').click();
6
6
  }
7
7
 
@@ -38,7 +38,7 @@
38
38
  mumuki.editor.toggleFullscreen();
39
39
  },
40
40
  'Tab': function (cm) {
41
- mumuki.editor.indentWithSpaces(cm)
41
+ mumuki.editor.indentWithSpaces(cm);
42
42
  }
43
43
  }
44
44
  });
@@ -53,7 +53,7 @@
53
53
  'Cmd-Enter': submitMessage,
54
54
  'Ctrl-Enter': submitMessage,
55
55
  'Tab': function (cm) {
56
- mumuki.editor.indentWithSpaces(cm)
56
+ mumuki.editor.indentWithSpaces(cm);
57
57
  }
58
58
  }
59
59
  });
@@ -23,20 +23,20 @@ mumuki.page.editors = [];
23
23
  function resetEditor() {
24
24
  mumuki.page.dynamicEditors.forEach(function (e) {
25
25
  setDefaultContent(e, $('#default_content').val());
26
- })
26
+ });
27
27
  }
28
28
 
29
29
  function formatContent() {
30
30
  mumuki.page.editors.each(function (_, editor) {
31
- editor.setSelection({line: 0, ch: 0}, {line: editor.lineCount()})
32
- editor.indentSelection("smart")
33
- editor.setSelection({line: 0})
31
+ editor.setSelection({line: 0, ch: 0}, {line: editor.lineCount()});
32
+ editor.indentSelection("smart");
33
+ editor.setSelection({line: 0});
34
34
  });
35
35
  }
36
36
 
37
37
  function toggleFullscreen() {
38
38
  $('body').toggleClass('fullscreen');
39
- $('.editor-resize .fa-stack-1x').toggleClass('fa-expand').toggleClass('fa-compress');
39
+ $('.editor-resize .fas').toggleClass('fa-expand fa-compress');
40
40
  }
41
41
 
42
42
  function indentWithSpaces(cm) {
@@ -56,7 +56,7 @@ mumuki.page.editors = [];
56
56
  if (language !== undefined) {
57
57
  mumuki.page.dynamicEditors.forEach(function (e) {
58
58
  setEditorLanguage(e, language);
59
- })
59
+ });
60
60
  }
61
61
  }
62
62
 
@@ -32,7 +32,7 @@
32
32
  function clearConsole() {
33
33
  $('.jquery-console-message-error').remove();
34
34
  $('.jquery-console-message-value').remove();
35
- $('.jquery-console-prompt-box:not(:last)').remove()
35
+ $('.jquery-console-prompt-box:not(:last)').remove();
36
36
  }
37
37
 
38
38
  class QueryConsole {
@@ -134,7 +134,7 @@
134
134
  url: self._requestUrl,
135
135
  type: 'POST',
136
136
  data: self._requestData
137
- })
137
+ });
138
138
  }
139
139
  get _requestUrl() {
140
140
  return this.console.endpoint;
@@ -34,33 +34,33 @@ mumuki.load(() => {
34
34
  },
35
35
  token: new mumuki.CsrfToken(),
36
36
  tokenRequest: function (data) {
37
- return $.ajax(Forum.token.newRequest(data))
37
+ return $.ajax(Forum.token.newRequest(data));
38
38
  },
39
39
  discussionPost: function (url) {
40
40
  return Forum.tokenRequest({
41
41
  url: url,
42
42
  method: 'POST',
43
43
  xhrFields: {withCredentials: true}
44
- })
44
+ });
45
45
  },
46
46
  discussionSubscription: function (url) {
47
- Forum.discussionPostAndToggle(url, $subscriptionSpans)
47
+ Forum.discussionPostAndToggle(url, $subscriptionSpans);
48
48
  },
49
49
  discussionUpvote: function (url) {
50
- Forum.discussionPostAndToggle(url, $upvoteSpans)
50
+ Forum.discussionPostAndToggle(url, $upvoteSpans);
51
51
  },
52
52
  discussionPostAndToggle: function (url, elem) {
53
- Forum.discussionPost(url).done(Forum.toggleButton(elem))
53
+ Forum.discussionPost(url).done(Forum.toggleButton(elem));
54
54
  },
55
55
  discussionMessageToggleApprove: function (url, elem) {
56
56
  Forum.discussionPost(url).done(function () {
57
57
  elem.toggleClass("selected");
58
- })
58
+ });
59
59
  },
60
60
  discussionMessageToggleNotActuallyAQuestion: function (url, elem) {
61
61
  Forum.discussionPost(url).done(function () {
62
62
  elem.toggleClass("selected");
63
- })
63
+ });
64
64
  },
65
65
  discussionsToggleCheckbox: function (elem) {
66
66
  const key = elem.attr('name');
@@ -99,6 +99,6 @@ mumuki.editors = {
99
99
  * @param {CustomEditorSource} source
100
100
  */
101
101
  addCustomSource(source) {
102
- mumuki.CustomEditor.addSource(source)
102
+ mumuki.CustomEditor.addSource(source);
103
103
  }
104
104
  };
@@ -21,7 +21,7 @@ mumuki.elipsis = (() => {
21
21
  $elipsis.each((it, e) => {
22
22
  let $e = $(e);
23
23
  $e.html(mumuki.elipsis($e.html()));
24
- })
24
+ });
25
25
  };
26
26
 
27
27
  mumuki.load(() => {
@@ -34,7 +34,7 @@ mumuki.events = {
34
34
  */
35
35
  fire(eventName, value = null) {
36
36
  if (this._handlers[eventName]) {
37
- this._handlers[eventName].forEach(it => it(value))
37
+ this._handlers[eventName].forEach(it => it(value));
38
38
  }
39
39
  },
40
40
 
@@ -48,4 +48,4 @@ mumuki.events = {
48
48
  this._handlers[eventName] = [];
49
49
  }
50
50
  }
51
- }
51
+ };
@@ -63,6 +63,6 @@ mumuki.exercise = {
63
63
  this._current = null;
64
64
  }
65
65
  }
66
- }
66
+ };
67
67
 
68
- mumuki.load(() => mumuki.exercise.load())
68
+ mumuki.load(() => mumuki.exercise.load());
@@ -108,12 +108,22 @@ mumuki.gamification = (() => {
108
108
  }
109
109
 
110
110
  updateLevel() {
111
- const $muLevelProgress = $('#mu-level-progress');
112
-
113
111
  $('#mu-solve-more-exercises span').text(this.exercisesToNextLevel());
114
112
  $('.mu-level-number').html(this.currentLevel());
115
- $('.mu-level-tooltip').attr("title", (_, value) => `${value} ${this.currentLevel()}`);
116
113
 
114
+ this.updateTooltip();
115
+ this.animateProgressIfAny();
116
+ }
117
+
118
+ updateTooltip() {
119
+ const $muLevelTooltip = $('.mu-level-tooltip');
120
+
121
+ $muLevelTooltip.attr("data-original-title", `${$muLevelTooltip.attr("level")} ${this.currentLevel()}`);
122
+ $muLevelTooltip.attr("title", "");
123
+ }
124
+
125
+ animateProgressIfAny() {
126
+ const $muLevelProgress = $('#mu-level-progress');
117
127
  if (this.currentLevelProgress() === 0) {
118
128
  $muLevelProgress.attr("display", "none");
119
129
  }
@@ -7,7 +7,7 @@ mumuki.onInputsReady = (() => {
7
7
  if ($(inputsSelector).length === 0) return;
8
8
 
9
9
  callback(event);
10
- })
10
+ });
11
11
  }
12
12
 
13
13
  return onInputsReady;
@@ -61,11 +61,11 @@ mumuki.Kids = class {
61
61
  // ==================
62
62
 
63
63
  _showSuccessPopup() {
64
- this._mustImplementThisMethod()
64
+ this._mustImplementThisMethod();
65
65
  }
66
66
 
67
67
  _showFailurePopup() {
68
- this._mustImplementThisMethod()
68
+ this._mustImplementThisMethod();
69
69
  }
70
70
 
71
71
  // ====================
@@ -141,7 +141,7 @@ mumuki.Kids = class {
141
141
  // ============
142
142
 
143
143
  _mustImplementThisMethod() {
144
- throw new Error('TODO: implement method')
144
+ throw new Error('TODO: implement method');
145
145
  }
146
146
 
147
147
  // ============
@@ -214,4 +214,4 @@ mumuki.Kids = class {
214
214
  $blockSvg.height($blocks.height());
215
215
  }
216
216
 
217
- }
217
+ };
@@ -103,27 +103,27 @@ mumuki.load(() => {
103
103
  this._action('play', 'stop', true, (speech) => {
104
104
  mumuki.presenterCharacter.playAnimation('talk', mumuki.kids.$bubbleCharacterAnimation);
105
105
  speech.speak(msg);
106
- })
106
+ });
107
107
  },
108
108
  stop() {
109
- this._action('stop', 'play', false, (speech) => speech.cancel())
109
+ this._action('stop', 'play', false, (speech) => speech.cancel());
110
110
  },
111
111
  _action(add, remove, isPlaying, callback) {
112
112
  callback(window.speechSynthesis);
113
- const $button = $('.mu-kindergarten-play-description')
113
+ const $button = $('.mu-kindergarten-play-description');
114
114
  $button.find(`.mu-kindergarten-${add}`).addClass('hidden');
115
115
  $button.find(`.mu-kindergarten-${remove}`).removeClass('hidden');
116
116
  this._isPlaying = isPlaying;
117
117
  },
118
118
  verifyBrowserSupport() {
119
119
  if (!window.speechSynthesis) {
120
- const $button = $('.mu-kindergarten-play-description')
120
+ const $button = $('.mu-kindergarten-play-description');
121
121
  $button.prop('disabled', true);
122
122
  $button.css('cursor', 'not-allowed');
123
- this._action('play', 'stop', false)
123
+ this._action('play', 'stop', false);
124
124
  }
125
125
  }
126
- }
126
+ };
127
127
 
128
128
  }
129
129
 
@@ -143,7 +143,7 @@ mumuki.load(() => {
143
143
  const $hintMedia = $('.mu-kindergarten-hint-media');
144
144
  if (!$hintMedia.get(0)) $button.addClass('hidden');
145
145
  },
146
- }
146
+ };
147
147
  }
148
148
 
149
149
  get context() {
@@ -1,7 +1,7 @@
1
1
  mumuki.load(() => {
2
2
  var Chat = {
3
3
  $body: function () {
4
- return $('body')
4
+ return $('body');
5
5
  },
6
6
  $newMessageModal: function () {
7
7
  return $('.new-message-modal');
@@ -18,7 +18,7 @@ mumuki.load(() => {
18
18
  $('.notifications-box').toggleClass('notifications-box-empty', !data.has_messages);
19
19
  $('.pending-messages-filter').removeClass('pending-messages-filter');
20
20
  $('button.btn-submit').removeClass('disabled');
21
- $('.pending-messages-text').remove()
21
+ $('.pending-messages-text').remove();
22
22
  },
23
23
  readMessages: function (url) {
24
24
  Chat.tokenRequest({
@@ -26,10 +26,10 @@ mumuki.load(() => {
26
26
  method: 'POST',
27
27
  success: Chat.setMessages,
28
28
  xhrFields: {withCredentials: true}
29
- })
29
+ });
30
30
  },
31
31
  tokenRequest: function (data) {
32
- $.ajax(Chat.token.newRequest(data))
32
+ $.ajax(Chat.token.newRequest(data));
33
33
  },
34
34
  getMessages: function () {
35
35
  if ($('.badge-messages').length == 0) {
@@ -74,7 +74,7 @@ mumuki.load(() => {
74
74
  success: success,
75
75
  error: error,
76
76
  xhrFields: {withCredentials: true}
77
- })
77
+ });
78
78
  },
79
79
  openNewMessageModal: function () {
80
80
  Chat.$newMessageModal().modal({backdrop: false, keyboard: false});
@@ -89,5 +89,5 @@ mumuki.load(() => {
89
89
  Chat.setMessagesInterval();
90
90
  mumuki.Chat = Chat;
91
91
 
92
- })
92
+ });
93
93
 
@@ -41,7 +41,7 @@ mumuki.ModalCarrousel = (() => {
41
41
 
42
42
  _hidePreviousButtonIfFirstSlide() {
43
43
  const $prev = $('.mu-kids-modal-button.mu-previous');
44
- this._addClassIf($prev, 'hidden', () => this._activeSlide().is(':first-child'))
44
+ this._addClassIf($prev, 'hidden', () => this._activeSlide().is(':first-child'));
45
45
  }
46
46
 
47
47
  _showFirstSlide() {
@@ -1,7 +1,7 @@
1
1
  mumuki.load(() => {
2
2
  function dumpChoices(_evt) {
3
3
  var indexes = $('.solution-choice:checked').map(function () {
4
- return $(this).data('index')
4
+ return $(this).data('index');
5
5
  }).get().join(':');
6
6
  $('#solution_content').attr('value', indexes);
7
7
  }
@@ -103,11 +103,11 @@ mumuki.load(() => {
103
103
  }
104
104
 
105
105
  get highlightModes() {
106
- return this._getDataFromHiddenInput('#highlight-modes')
106
+ return this._getDataFromHiddenInput('#highlight-modes');
107
107
  }
108
108
 
109
109
  get locales() {
110
- return this._getDataFromHiddenInput('#multifile-locales')
110
+ return this._getDataFromHiddenInput('#multifile-locales');
111
111
  }
112
112
 
113
113
  setUpAddFile() {
@@ -131,7 +131,7 @@ mumuki.load(() => {
131
131
 
132
132
  this._setVisibility(this._addFileButton, filesCount < this.MAX_TABS);
133
133
  this.files.toArray().forEach(file => {
134
- this._setVisibility(file.deleteButton, file.name !== this.mainFile && filesCount > 1)
134
+ this._setVisibility(file.deleteButton, file.name !== this.mainFile && filesCount > 1);
135
135
  });
136
136
  }
137
137
 
@@ -73,7 +73,7 @@ mumuki.MultipleScenarios = (() => {
73
73
  if (this.validScenarioIndex(newScenarioIndex)) {
74
74
  this.setActiveIndex(newScenarioIndex);
75
75
  }
76
- })
76
+ });
77
77
  }
78
78
 
79
79
  createControls () {
@@ -11,5 +11,5 @@ mumuki.pin = (() => {
11
11
  smoothScrollToElement(scrollPin);
12
12
  }
13
13
  }
14
- }
14
+ };
15
15
  })();
@@ -83,7 +83,7 @@ mumuki.load(() => {
83
83
  this._$texts.hide();
84
84
  this.$characterSpeechBubbleNormal.children('.' + $tab.data('target')).show();
85
85
  this._updateSpeechParagraphs();
86
- })
86
+ });
87
87
  }
88
88
  });
89
89
 
@@ -17,7 +17,7 @@ mumuki.progress = (() => {
17
17
  function updateWholeProgressBar(f) {
18
18
  $('.progress-list-item').each((_, it) => {
19
19
  const $anchor = $(it);
20
- $anchor.attr('class', f($anchor))
20
+ $anchor.attr('class', f($anchor));
21
21
  });
22
22
  }
23
23