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
@@ -49,7 +49,7 @@ mumuki.renderers.results = (() => {
49
49
  classForStatus,
50
50
  iconForStatus,
51
51
  progressListItemClassForStatus
52
- }
52
+ };
53
53
  })();
54
54
 
55
55
  /** @deprecated use {@code mumuki.renderers.results.classForStatus} instead */
@@ -20,7 +20,7 @@ mumuki.renderers.speechBubble = (()=> {
20
20
 
21
21
  _chooseResultItem() {
22
22
  if (this._responseStatus() !== 'passed' && this._hasTips()) {
23
- this._appendFirstTip()
23
+ this._appendFirstTip();
24
24
  } else if (this._responseStatus() === 'failed') {
25
25
  this._appendFirstFailedTestResultSummary();
26
26
  } else if (this._responseStatus() === 'passed_with_warnings') {
@@ -29,7 +29,7 @@ mumuki.renderers.speechBubble = (()=> {
29
29
  }
30
30
 
31
31
  _appendFirstFailedTestResultSummary() {
32
- const failedTestResult = this._failedTestResults()[0]
32
+ const failedTestResult = this._failedTestResults()[0];
33
33
  if (failedTestResult && failedTestResult.summary) {
34
34
  this._appendResultItem(mumuki.renderers.renderSpeechBubbleResultItem(failedTestResult.summary));
35
35
  }
@@ -67,7 +67,7 @@ mumuki.renderers.speechBubble = (()=> {
67
67
  }
68
68
 
69
69
  _hasTips() {
70
- return this.responseData.tips && this.responseData.tips.length
70
+ return this.responseData.tips && this.responseData.tips.length;
71
71
  }
72
72
 
73
73
  _failedTestResults() {
@@ -97,7 +97,7 @@ mumuki.renderers.speechBubble = (()=> {
97
97
  return {
98
98
  SpeechBubbleRenderer,
99
99
  renderSpeechBubbleResultItem
100
- }
100
+ };
101
101
  })();
102
102
 
103
103
  /** @deprecated use {@code mumuki.renderers.speechBubble.SpeechBubbleRenderer} instead */
@@ -101,7 +101,7 @@ mumuki.submission = (() => {
101
101
  });
102
102
  mumuki.kids.showResult(data);
103
103
  });
104
- }
104
+ };
105
105
  }
106
106
 
107
107
  /** Processor for non-kids layouts */
@@ -118,7 +118,7 @@ mumuki.submission = (() => {
118
118
  $(document).renderMuComponents();
119
119
  resultsBox.done(data, submitButton);
120
120
  });
121
- }
121
+ };
122
122
  }
123
123
 
124
124
  /** Selects the most appropriate solution processor */
@@ -96,7 +96,7 @@ mumuki.SubmissionsStore = (() => {
96
96
  _keyFor(exerciseId) {
97
97
  return `/exercise/${exerciseId}/submission`;
98
98
  }
99
- };
99
+ }();
100
100
 
101
101
  return SubmissionsStore;
102
102
  })();
@@ -106,5 +106,5 @@ mumuki.load(() => {
106
106
  if (e.detail[0]) {
107
107
  mumuki.SubmissionsStore.clear();
108
108
  }
109
- })
110
- })
109
+ });
110
+ });
@@ -65,11 +65,11 @@ mumuki.syncMode = (() => {
65
65
 
66
66
  /** @type {ClientSyncMode|ServerSyncMode}*/
67
67
  _current: null
68
- }
68
+ };
69
69
  })();
70
70
 
71
71
  mumuki.load(() => {
72
72
  mumuki.syncMode._selectSyncMode();
73
73
  mumuki.syncMode._current.syncProgress();
74
74
  mumuki.syncMode._current.syncEditorContent();
75
- })
75
+ });
@@ -16,5 +16,5 @@ mumuki.startTimer = (() => {
16
16
  }
17
17
  }, intervalDuration);
18
18
  }
19
- return startTimer
19
+ return startTimer;
20
20
  })();
@@ -25,13 +25,13 @@ body {
25
25
  margin-bottom: 110px;
26
26
  }
27
27
 
28
- .footer {
29
- position: absolute;
30
- bottom: 0;
31
- width: 100%;
32
- height: 110px;
33
- .container {
34
- margin-top: 33px;
28
+ .mu-footer {
29
+ &.container {
30
+ margin-top: 45px;
31
+ }
32
+ .mu-footer-terms {
33
+ font-size: 15px;
34
+ text-align: center;
35
35
  }
36
36
  }
37
37
 
@@ -18,10 +18,6 @@
18
18
  }
19
19
  }
20
20
 
21
- .editor-resize {
22
- font-size: 0.5em;
23
- }
24
-
25
21
  body.fullscreen {
26
22
  .mu-overlapped a {
27
23
  margin-right: 15px;
@@ -131,6 +131,7 @@ class ApplicationController < ActionController::Base
131
131
 
132
132
  def validate_accepted_role_terms!
133
133
  if current_user&.has_role_terms_to_accept?
134
+ save_location_before! :terms_acceptance
134
135
  flash.notice = I18n.t :accept_terms_to_continue
135
136
  redirect_to terms_user_path
136
137
  end
@@ -2,12 +2,18 @@ module WithUserDiscussionValidation
2
2
  extend ActiveSupport::Concern
3
3
 
4
4
  included do
5
+ # users are not allowed to access discussions during exams
6
+ before_action :validate_not_blocked_in_forum!
5
7
  # discussions are not enabled for all organizations nor all users
6
8
  before_action :validate_user_can_discuss!
7
9
  end
8
10
 
9
11
  private
10
12
 
13
+ def validate_not_blocked_in_forum!
14
+ raise Mumuki::Domain::BlockedForumError if current_user&.currently_in_exam?
15
+ end
16
+
11
17
  def validate_user_can_discuss!
12
18
  raise Mumuki::Domain::NotFoundError unless current_user&.can_discuss_here?
13
19
  end
@@ -1,8 +1,6 @@
1
1
  class DiscussionsController < ApplicationController
2
2
  include Mumuki::Laboratory::Controllers::Content
3
3
  include WithUserDiscussionValidation
4
- # users are not allowed to access discussions during exams
5
- before_action :validate_not_in_exam!
6
4
 
7
5
  before_action :set_debatable, except: [:subscription]
8
6
  before_action :authenticate!, only: [:update, :create]
@@ -74,8 +72,4 @@ class DiscussionsController < ApplicationController
74
72
  def discussion_filter_params
75
73
  @filter_params ||= params.permit(Discussion.permitted_query_params)
76
74
  end
77
-
78
- def validate_not_in_exam!
79
- raise Mumuki::Domain::BlockedForumError if current_user&.currently_in_exam?
80
- end
81
75
  end
@@ -19,7 +19,8 @@ class UsersController < ApplicationController
19
19
 
20
20
  def accept_profile_terms
21
21
  current_user.accept_profile_terms!
22
- redirect_to root_path, notice: I18n.t(:terms_accepted)
22
+ flash.notice = I18n.t(:terms_accepted)
23
+ redirect_after! :terms_acceptance, fallback_location: root_path
23
24
  end
24
25
 
25
26
  def terms
@@ -15,7 +15,7 @@ module AssignmentResultHelper
15
15
 
16
16
  def render_community_link
17
17
  if community_link?
18
- link_to fa_icon(:facebook, text: I18n.t(:ask_community), class: 'fa-fw'), community_link, target: '_blank'
18
+ link_to fa_icon('facebook-f', type: :brand, text: I18n.t(:ask_community), class: 'fa-fw'), community_link, target: '_blank'
19
19
  end
20
20
  end
21
21
 
@@ -67,8 +67,8 @@ module DiscussionsHelper
67
67
  def discussion_messages_icon(discussion)
68
68
  %Q{
69
69
  <span class="discussion-icon fa-stack fa-xs">
70
- <i class="fa fa-comment-o fa-stack-2x"></i>
71
- <i class="fa fa-stack-1x">#{discussion.validated_messages_count}</i>
70
+ <i class="far fa-comment fa-stack-2x"></i>
71
+ <i class="fas fa-stack-1x">#{discussion.validated_messages_count}</i>
72
72
  </span>
73
73
  }.html_safe
74
74
  end
@@ -77,8 +77,8 @@ module DiscussionsHelper
77
77
  if discussion.upvotes_count > 0
78
78
  %Q{
79
79
  <span class="discussion-icon fa-stack fa-xs">
80
- <i class="fa fa-star-o fa-stack-2x"></i>
81
- <i class="fa fa-stack-1x">#{discussion.upvotes_count}</i>
80
+ <i class="far fa-star fa-stack-2x"></i>
81
+ <i class="fas fa-stack-1x">#{discussion.upvotes_count}</i>
82
82
  </span>
83
83
  }.html_safe
84
84
  end
@@ -14,7 +14,7 @@ module EditorTabsHelper
14
14
  def messages_tab(exercise, organization = Organization.current)
15
15
  "<li id='messages-tab' role='presentation'>
16
16
  <a data-target='#messages' tabindex='0' aria-controls='console' role='tab' data-toggle='tab' class='editor-tab'>
17
- #{fa_icon 'comments-o'} #{t :messages }
17
+ #{fa_icon 'comments', type: :regular} #{t :messages }
18
18
  </a>
19
19
  </li>".html_safe if organization.raise_hand_enabled? && exercise.has_messages_for?(current_user)
20
20
  end
@@ -58,6 +58,6 @@ module IconsHelper
58
58
  end
59
59
 
60
60
  def icon_for_read(read)
61
- tag('i', class: "fa fa-envelope#{read ? '-o' : ''}")
61
+ tag('i', class: "fa#{read ? 'r' : 's'} fa-envelope")
62
62
  end
63
63
  end
@@ -52,11 +52,11 @@ module LinksHelper
52
52
  end
53
53
 
54
54
  def link_to_profile_terms
55
- link_to t(:terms_and_conditions).downcase, terms_user_path, target: '_blank'
55
+ link_to t(:terms_and_conditions), terms_user_path, target: '_blank'
56
56
  end
57
57
 
58
58
  def link_to_forum_terms
59
- link_to t(:forum_terms).downcase, discussions_terms_path, target: '_blank'
59
+ link_to t(:forum_terms), discussions_terms_path, target: '_blank'
60
60
  end
61
61
 
62
62
  def turbolinks_enable_for(exercise)
@@ -80,7 +80,7 @@ module LinksHelper
80
80
  return unless current_user&.writer?
81
81
 
82
82
  url = yield
83
- link_to fixed_fa_icon(:pencil), url, class: "mu-content-toolbar-item", target: "_blank", title: t(:edit)
83
+ link_to fixed_fa_icon('pencil-alt'), url, class: "mu-content-toolbar-item", target: "_blank", title: t(:edit)
84
84
  end
85
85
 
86
86
  def url_for_bibliotheca_guide(guide)
@@ -18,7 +18,7 @@ module MenuBarHelper
18
18
  end
19
19
 
20
20
  def link_to_profile
21
- li_tag menu_item('user-o', :profile, user_path)
21
+ menu_item('user', :profile, user_path)
22
22
  end
23
23
 
24
24
  def link_to_classroom
@@ -35,6 +35,10 @@ module MenuBarHelper
35
35
  menu_item icon, app_name, url
36
36
  end
37
37
 
38
+ def logout_link
39
+ li_tag menu_item('sign-out-alt', :sign_out, logout_path(origin: url_for))
40
+ end
41
+
38
42
  def menu_item(icon, name, url)
39
43
  link_to fixed_fa_icon(icon, text: t(name)), url, role: 'menuitem', tabindex: '-1'
40
44
  end
@@ -1,4 +1,8 @@
1
1
  module OverlappedButtonsHelper
2
+ def expand_icon
3
+ overlapped_button_icon :fullscreen, :expand, " (F11)"
4
+ end
5
+
2
6
  def restart_icon
3
7
  overlapped_button_icon :restart, :undo
4
8
  end
@@ -11,7 +15,7 @@ module OverlappedButtonsHelper
11
15
  link_to restart_icon, guide_progress_path(guide), class: 'mu-content-toolbar-item mu-restart-guide', data: {confirm: t(:confirm_restart)}, method: :delete
12
16
  end
13
17
 
14
- def overlapped_button_icon(key, icon)
15
- fa_icon(icon, title: t(key), class: 'fa-fw', role: 'button', 'aria-label': t(key))
18
+ def overlapped_button_icon(key, icon, extra_title='')
19
+ fa_icon(icon, title: t(key) + extra_title, class: 'fa-fw', role: 'button', 'aria-label': t(key), 'data-placement': 'left')
16
20
  end
17
21
  end
@@ -26,7 +26,7 @@
26
26
 
27
27
  <% unless enabled %>
28
28
  <div class="text-center mu-lock">
29
- <i class="fa fa-lock fa-5x"></i>
29
+ <i class="fas fa-lock fa-5x"></i>
30
30
  <p><%= t :locked_content %></p>
31
31
  </div>
32
32
  <% end %>
@@ -36,7 +36,7 @@
36
36
  <h2><%= t(:exams) %></h2>
37
37
  <% @exams.each_with_index do |it, index| %>
38
38
  <div class="chapter">
39
- <h3> <%= t(:exam_number, number: index) %> <%= link_to_path_element it, mode: :plain %></h3>
39
+ <h3> <%= index + 1 %>. <%= link_to_path_element it, mode: :plain %></h3>
40
40
 
41
41
  <div class="text-box">
42
42
  <%= it.guide.description_teaser_html %>
@@ -17,11 +17,11 @@
17
17
  </a>
18
18
  <% if message.from_initiator? %>
19
19
  <a class="discussion-message-not-actually-a-question <%= 'selected' if message.not_actually_a_question? %>" onclick="mumuki.Forum.discussionMessageToggleNotActuallyAQuestion('<%= question_discussion_message_url(@discussion, message) %>', $(this))">
20
- <%= fa_icon('question-circle-o', class: 'fa-xs') %>
20
+ <%= fa_icon('question-circle', type: 'regular', class: 'fa-xs') %>
21
21
  </a>
22
22
  <% end %>
23
23
  <% end %>
24
- <%= link_to fa_icon('trash-o'), discussion_message_path(@discussion, message), method: :delete, data: { confirm: t(:are_you_sure, action: t(:destroy_message)) } %>
24
+ <%= link_to fa_icon('trash-alt', type: :regular), discussion_message_path(@discussion, message), method: :delete, data: { confirm: t(:are_you_sure, action: t(:destroy_message)) } %>
25
25
  <% end %>
26
26
  <% if should_show_approved_for?(current_user, message) %>
27
27
  <span class="discussion-message-approved selected">
@@ -3,7 +3,7 @@
3
3
  <%= t :level_up %>
4
4
  </h3>
5
5
  <div class="text-center mu-level">
6
- <i class="fa fa-star fa-fw fa-4x"></i>
6
+ <i class="fas fa-star fa-fw fa-4x"></i>
7
7
  <span class="mu-level-number"></span>
8
8
  <p></p>
9
9
  <p id="mu-solve-more-exercises"> <%= (t :solve_more_exercises_to_level_up).html_safe %></p>
@@ -6,7 +6,7 @@
6
6
  <div class="hint-box <%= 'hidden' if exercise.hint.blank? %>">
7
7
  <% if exercise.hint.present? %>
8
8
  <a data-toggle="collapse" href="#hint-section" class="text-info">
9
- <%= fa_icon 'lightbulb-o' %> <%= t :need_a_hint %>
9
+ <%= fa_icon 'lightbulb', type: :regular %> <%= t :need_a_hint %>
10
10
  </a>
11
11
 
12
12
  <div id="hint-section" class="collapse">
@@ -36,7 +36,7 @@
36
36
  <% end %>
37
37
  <% if @discussion.solved? %>
38
38
  <a class="discussion-upvote" onclick="mumuki.Forum.discussionUpvote('<%= upvote_discussion_url(@discussion) %>')">
39
- <%= fa_icon('thumbs-o-up', class: 'fa-xs') %>
39
+ <%= fa_icon('thumbs-up', type: :regular, class: 'fa-xs') %>
40
40
  <%= span_toggle t(:upvote), t(:undo_upvote), current_user.upvoted?(@discussion), class: 'hidden-sm hidden-xs' %>
41
41
  </a>
42
42
  <% end %>
@@ -51,7 +51,7 @@
51
51
 
52
52
  <div style="display: none" id="processing-template">
53
53
  <div class="bs-callout bs-callout-info">
54
- <h4><i class="fa fa-refresh fa-spin"></i> <strong><%= t :processing_your_solution %></strong></h4>
54
+ <h4><i class="fas fa-sync-alt fa-spin"></i> <strong><%= t :processing_your_solution %></strong></h4>
55
55
  <%= t :refresh_or_wait %>
56
56
  </div>
57
57
  </div>
@@ -1,2 +1,2 @@
1
- &copy; Copyright 2015-<%= DateTime.now.year %>
1
+ &copy; 2015-<%= DateTime.now.year %>
2
2
  <a href="http://mumuki.org/" class="mu-org-link"><span class="da da-mumuki-circle"></span> Mumuki</a>
@@ -33,12 +33,6 @@
33
33
  <div class="col-md-12">
34
34
  <div class="text-box">
35
35
  <%= @guide.description_html %>
36
-
37
- <div class="actions">
38
- <% if !@stats.try(:done?) && @next_exercise %>
39
- <%= link_to t(lesson_practice_key_for(@stats)), exercise_path(@next_exercise), class: 'btn btn-success' %>
40
- <% end %>
41
- </div>
42
36
  </div>
43
37
  </div>
44
38
  </div>
@@ -63,6 +57,14 @@
63
57
  </div>
64
58
  <% end %>
65
59
 
60
+ <% if !@stats.try(:done?) && @next_exercise %>
61
+ <div class="text-box">
62
+ <div class="actions">
63
+ <%= link_to t(lesson_practice_key_for(@stats)), exercise_path(@next_exercise), class: 'btn btn-success' %>
64
+ </div>
65
+ </div>
66
+ <% end %>
67
+
66
68
  <% if @stats&.done? %>
67
69
  <div class="text-box">
68
70
  <div class="actions">
@@ -3,17 +3,17 @@
3
3
  <% if exercise.hint? %>
4
4
  <ul class="mu-kids-character-speech-bubble-tabs">
5
5
  <li class="mu-kids-description active" data-target="description" title="<%= t :task %>">
6
- <i class="fa fa-fw fa-file-text-o"></i>
6
+ <i class="far fa-fw fa-file-alt"></i>
7
7
  </li>
8
8
  <li class="separator"></li>
9
9
  <li class="mu-kids-hint blink" data-target="hint" title="<%= t :need_a_hint %>">
10
- <i class="fa fa-fw fa-lightbulb-o"></i>
10
+ <i class="far fa-fw fa-lightbulb"></i>
11
11
  </li>
12
12
  </ul>
13
13
  <% end %>
14
14
  <div class="mu-kids-character-speech-bubble-normal">
15
- <i class="mu-kids-prev-speech fa fa-fw fa-caret-up"></i>
16
- <i class="mu-kids-next-speech fa fa-fw fa-caret-down"></i>
15
+ <i class="mu-kids-prev-speech fas fa-fw fa-caret-up"></i>
16
+ <i class="mu-kids-next-speech fas fa-fw fa-caret-down"></i>
17
17
  <div class="description"><%= exercise.description_task %></div>
18
18
  <div class="hint" style="display: none"><%= exercise.hint_html %></div>
19
19
  </div>
@@ -5,10 +5,10 @@
5
5
  <span class="mu-kindergarten-exercise-description"><%= exercise.description_task %></span>
6
6
  <div class="mu-kindergarten-buttons">
7
7
  <button class="mu-kindergarten-show-context" onclick="mumuki.kids.context.show()">
8
- <img class="mu-kindergarten-button-image" src="https://mumuki.io/static/show-context.svg" alt="">
8
+ <img class="mu-kindergarten-button-image" src="https://mumuki.io/static/show-context.svg" alt="" title="<%= t :see_context %>">
9
9
  </button>
10
10
  <button class="mu-kindergarten-play-description" onclick="mumuki.kids.speech.click('.mu-kindergarten-exercise-description', '<%= exercise.locale %>')">
11
- <img class="mu-kindergarten-button-image mu-kindergarten-play" src="https://mumuki.io/static/audio-play.svg" alt="">
11
+ <img class="mu-kindergarten-button-image mu-kindergarten-play" src="https://mumuki.io/static/audio-play.svg" alt="" title="<%= t :listen_statement %>">
12
12
  <img class="mu-kindergarten-button-image mu-kindergarten-stop hidden" src="https://mumuki.io/static/audio-stop.svg" alt="">
13
13
  </button>
14
14
  </div>
@@ -17,18 +17,18 @@
17
17
  <div class="mu-kindergarten-hint">
18
18
  <% if exercise.hint? %>
19
19
  <button class="mu-hint-light" onclick="mumuki.kids.hint.toggle()">
20
- <img class="mu-hint-light on" src="https://mumuki.io/static/lamparita_on.svg" alt="">
20
+ <img class="mu-hint-light on" src="https://mumuki.io/static/lamparita_on.svg" alt="" title="<%= t :need_a_hint %>">
21
21
  </button>
22
22
  <div class="mu-kindergarten-light-speech-bubble">
23
23
  <span class="mu-kindergarten-exercise-hint">
24
24
  <%= exercise.hint.markdownified %>
25
25
  </span>
26
26
  <button class="expand-or-collapse-hint-media" onclick="mumuki.kids.hint.toggleMedia()">
27
- <i class="fa fa-fw fa-2x fa-caret-up"></i>
27
+ <i class="fas fa-fw fa-2x fa-caret-up"></i>
28
28
  </button>
29
29
  </div>
30
30
  <% else %>
31
- <img class="mu-hint-light off" src="https://mumuki.io/static/lamparita_off.svg" alt="">
31
+ <img class="mu-hint-light off" src="https://mumuki.io/static/lamparita_off.svg" alt="" title="<%= t :no_need_hint %>">
32
32
  <% end %>
33
33
  </div>
34
34
  </div>