mumuki-laboratory 7.4.2 → 7.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +34 -18
  3. data/app/assets/javascripts/mumuki_laboratory/application/codemirror.js +19 -2
  4. data/app/assets/javascripts/mumuki_laboratory/application/elipsis.js +31 -0
  5. data/app/assets/javascripts/mumuki_laboratory/application/kids.js +5 -16
  6. data/app/assets/javascripts/mumuki_laboratory/application/speech-bubble-renderer.js +99 -0
  7. data/app/assets/stylesheets/mumuki_laboratory/application.scss +1 -0
  8. data/app/assets/stylesheets/mumuki_laboratory/application/_layout.scss +0 -4
  9. data/app/assets/stylesheets/mumuki_laboratory/application/_locked.scss +29 -0
  10. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_editor.scss +0 -23
  11. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_exercise_results.scss +11 -0
  12. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_kids.scss +1 -1
  13. data/app/assets/stylesheets/mumuki_laboratory/application/modules/_overlap.scss +21 -2
  14. data/app/assets/stylesheets/mumuki_laboratory/application/modules/popover.scss +1 -1
  15. data/app/controllers/application_controller.rb +25 -2
  16. data/app/controllers/concerns/users_controller_template.rb +6 -1
  17. data/app/controllers/invitations_controller.rb +1 -0
  18. data/app/controllers/login_controller.rb +1 -0
  19. data/app/helpers/application_helper.rb +1 -5
  20. data/app/helpers/contextualization_result_helper.rb +7 -7
  21. data/app/helpers/discussions_helper.rb +1 -1
  22. data/app/helpers/exercise_input_helper.rb +1 -1
  23. data/app/helpers/links_helper.rb +1 -1
  24. data/app/helpers/overlapped_buttons_helper.rb +17 -0
  25. data/app/views/book/show.html.erb +14 -6
  26. data/app/views/errors/gone.html.erb +4 -1
  27. data/app/views/exercise_solutions/_expectations.html.erb +2 -2
  28. data/app/views/exercise_solutions/_kids_results_button.html.erb +1 -1
  29. data/app/views/exercises/_read_only.html.erb +1 -1
  30. data/app/views/exercises/show.html.erb +19 -15
  31. data/app/views/layouts/_exercise_skipped.html.erb +28 -0
  32. data/app/views/layouts/_kids.html.erb +1 -1
  33. data/app/views/layouts/_test_results.html.erb +11 -8
  34. data/app/views/layouts/exercise_inputs/editors/_code.html.erb +8 -7
  35. data/app/views/layouts/exercise_inputs/editors/_multiple_files.html.erb +8 -9
  36. data/app/views/layouts/exercise_inputs/forms/_interactive_form.html.erb +2 -2
  37. data/app/views/layouts/exercise_inputs/forms/_playground_form.html.erb +1 -1
  38. data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +1 -1
  39. data/app/views/layouts/modals/_kids_results.html.erb +1 -1
  40. data/app/views/user_mailer/1st_reminder.html.erb +1 -1
  41. data/app/views/user_mailer/1st_reminder.text.erb +1 -1
  42. data/app/views/user_mailer/2nd_reminder.html.erb +1 -1
  43. data/app/views/user_mailer/2nd_reminder.text.erb +1 -1
  44. data/app/views/user_mailer/3rd_reminder.html.erb +1 -1
  45. data/app/views/user_mailer/3rd_reminder.text.erb +1 -1
  46. data/app/views/user_mailer/no_submissions_reminder.html.erb +1 -1
  47. data/app/views/user_mailer/no_submissions_reminder.text.erb +1 -1
  48. data/app/views/users/_user_form.html.erb +1 -1
  49. data/config/initializers/session_store.rb +1 -1
  50. data/lib/mumuki/laboratory/controllers.rb +1 -0
  51. data/lib/mumuki/laboratory/controllers/authorization.rb +0 -4
  52. data/lib/mumuki/laboratory/controllers/disabling.rb +5 -0
  53. data/lib/mumuki/laboratory/controllers/dynamic_errors.rb +16 -1
  54. data/lib/mumuki/laboratory/controllers/results_rendering.rb +15 -17
  55. data/lib/mumuki/laboratory/locales/en.yml +12 -2
  56. data/lib/mumuki/laboratory/locales/es.yml +13 -2
  57. data/lib/mumuki/laboratory/locales/pt.yml +13 -2
  58. data/lib/mumuki/laboratory/version.rb +1 -1
  59. data/spec/controllers/exercise_solutions_controller_spec.rb +29 -14
  60. data/spec/controllers/users_api_controller_spec.rb +1 -0
  61. data/spec/controllers/users_controller_spec.rb +21 -0
  62. data/spec/dummy/db/schema.rb +10 -1
  63. data/spec/dummy/db/seeds.rb +8 -0
  64. data/spec/features/disable_user_flow_spec.rb +34 -0
  65. data/spec/features/disabled_organization_flow_spec.rb +69 -0
  66. data/spec/features/exercise_flow_spec.rb +20 -11
  67. data/spec/features/home_public_flow_spec.rb +34 -2
  68. data/spec/helpers/test_results_rendering_spec.rb +50 -28
  69. data/spec/login_helper.rb +1 -1
  70. data/spec/spec_helper.rb +2 -0
  71. metadata +32 -7
  72. data/app/helpers/reset_button_helper.rb +0 -10
@@ -5,5 +5,5 @@
5
5
  }
6
6
 
7
7
  .popover {
8
- max-width: 30%;
8
+ max-width: 50%;
9
9
  }
@@ -7,20 +7,29 @@ class ApplicationController < ActionController::Base
7
7
  include Mumukit::Login::AuthenticationHelpers
8
8
 
9
9
  include Mumuki::Laboratory::Controllers::Authorization
10
+ include Mumuki::Laboratory::Controllers::Disabling
10
11
  include Mumuki::Laboratory::Controllers::Notifications
11
12
  include Mumuki::Laboratory::Controllers::DynamicErrors
12
13
  include Mumuki::Laboratory::Controllers::EmbeddedMode
13
14
 
14
15
  before_action :set_current_organization!
15
16
  before_action :set_locale!
17
+
18
+ before_action :ensure_user_enabled!, if: :current_user?
19
+ before_action :validate_active_organization!
20
+
16
21
  before_action :redirect_to_main_organization!, if: :should_redirect_to_main_organization?
22
+
17
23
  before_action :authorize_if_private!
24
+ before_action :validate_active_organization!
18
25
  before_action :validate_user_profile!, if: :current_user?
26
+
19
27
  before_action :visit_organization!, if: :current_user?
20
28
 
21
29
  after_action :leave_organization!
22
30
 
23
- helper_method :login_button,
31
+ helper_method :current_workspace,
32
+ :login_button,
24
33
  :notifications_count,
25
34
  :user_notifications_path,
26
35
  :has_notifications?,
@@ -49,8 +58,14 @@ class ApplicationController < ActionController::Base
49
58
  accessible_subject.validate_accessible_for! current_user
50
59
  end
51
60
 
61
+ def validate_active_organization!
62
+ return if current_user&.teacher_here?
63
+ Organization.current.validate_active!
64
+ end
65
+
66
+
52
67
  # required by Mumukit::Login
53
- def login_button(options={})
68
+ def login_button(options = {})
54
69
  login_form.button_html I18n.t(:sign_in), options[:class]
55
70
  end
56
71
 
@@ -60,8 +75,16 @@ class ApplicationController < ActionController::Base
60
75
  raise Mumuki::Domain::NotFoundError unless content.usage_in_organization.try { |usage| redirect_to usage }
61
76
  end
62
77
 
78
+ def current_workspace
79
+ Mumuki::Domain::Workspace.new(current_user, Organization.current)
80
+ end
81
+
63
82
  private
64
83
 
84
+ def from_sessions?
85
+ params['controller'] == 'login'
86
+ end
87
+
65
88
  def login_settings
66
89
  Organization.current.login_settings
67
90
  end
@@ -6,16 +6,21 @@ module UsersControllerTemplate
6
6
  before_action :set_user!, only: [:show, :update]
7
7
  before_action :set_new_user!, only: :create
8
8
  before_action :protect_permissions_assignment!, only: [:create, :update]
9
+ after_action :verify_user_name!, only: :create
9
10
  end
10
11
 
11
12
  private
12
13
 
14
+ def verify_user_name!
15
+ @user.verify_name!
16
+ end
17
+
13
18
  def protect_permissions_assignment!
14
19
  current_user.protect_permissions_assignment! user_params[:permissions], @user.permissions_was
15
20
  end
16
21
 
17
22
  def permissible_params
18
- super + [:email, :image_url, permissions: Mumukit::Auth::Roles::ROLES]
23
+ super + [:email, :image_url, :verified_first_name, :verified_last_name, permissions: Mumukit::Auth::Roles::ROLES]
19
24
  end
20
25
 
21
26
  def set_user!
@@ -7,6 +7,7 @@ class InvitationsController < ApplicationController
7
7
 
8
8
  skip_before_action :validate_user_profile!
9
9
  skip_before_action :authorize_if_private!
10
+ skip_before_action :validate_active_organization!
10
11
 
11
12
  def show
12
13
  redirect_to_organization! if current_user.student_of? @invitation.course
@@ -3,6 +3,7 @@ class LoginController < ApplicationController
3
3
 
4
4
  skip_before_action :verify_authenticity_token, if: lambda { Rails.env.development? }
5
5
  skip_before_action :validate_user_profile!
6
+ skip_before_action :validate_active_organization!
6
7
 
7
8
  private
8
9
 
@@ -7,7 +7,7 @@ module ApplicationHelper
7
7
  end
8
8
 
9
9
  def profile_picture
10
- image_tag(current_user.image_url, height: 40, class: 'img-circle', onError: "this.onerror = null; this.src = '#{image_url('user_shape.png')}'")
10
+ image_tag(current_user.profile_picture, height: 40, class: 'img-circle', onError: "this.onerror = null; this.src = '#{image_url('user_shape.png')}'")
11
11
  end
12
12
 
13
13
  def paginate(object, options={})
@@ -39,7 +39,3 @@ module ApplicationHelper
39
39
  }.html_safe
40
40
  end
41
41
  end
42
-
43
- def sanitized(html)
44
- Mumukit::ContentType::Sanitizer.sanitize html
45
- end
@@ -1,10 +1,6 @@
1
1
  module ContextualizationResultHelper
2
- def humanized_expectation_result_item(expectation_result)
3
- %Q{<li>#{status_icon(expectation_result[:result])} #{humanized_expectation_explanation expectation_result}</li>}.html_safe
4
- end
5
-
6
- def humanized_expectation_explanation(expectation_result)
7
- sanitized Mumukit::ContentType::Markdown.to_html(expectation_result[:explanation], one_liner: true)
2
+ def render_affable_expectation_result(affable_expectation_result)
3
+ %Q{#{status_icon(affable_expectation_result[:result])} #{affable_expectation_result[:explanation]}}.html_safe
8
4
  end
9
5
 
10
6
  def render_feedback?(contextualization)
@@ -19,12 +15,16 @@ module ContextualizationResultHelper
19
15
  if contextualization.exercise.hidden?
20
16
  :hidden_done
21
17
  elsif contextualization.exercise.choice?
22
- contextualization.passed? ? :correct_answer : :wrong_answer
18
+ contextualization.solved? ? :correct_answer : :wrong_answer
23
19
  else
24
20
  contextualization.submission_status
25
21
  end
26
22
  end
27
23
 
24
+ def render_test_result_header(test_result)
25
+ [test_result[:title].presence, test_result[:summary]].compact.join(': ').html_safe
26
+ end
27
+
28
28
  def render_test_results(contextualization)
29
29
  if contextualization.test_results.present?
30
30
  template = contextualization.result.present? ? 'layouts/mixed_results' : 'layouts/test_results'
@@ -48,7 +48,7 @@ module DiscussionsHelper
48
48
  end
49
49
 
50
50
  def user_avatar(user, image_class='')
51
- image_tag user.image_url, height: 40, class: "img-circle #{image_class}"
51
+ image_tag user.profile_picture, height: 40, class: "img-circle #{image_class}"
52
52
  end
53
53
 
54
54
  def discussions_link_with_teaser(item)
@@ -44,7 +44,7 @@ module ExerciseInputHelper
44
44
  end
45
45
 
46
46
  def should_render_need_help_dropdown?(assignment, organization = Organization.current)
47
- !assignment.passed? && organization.ask_for_help_enabled?(assignment.submitter)
47
+ !assignment.solved? && organization.ask_for_help_enabled?(assignment.submitter)
48
48
  end
49
49
 
50
50
  def render_submit_button(assignment)
@@ -14,7 +14,7 @@ module LinksHelper
14
14
  end
15
15
 
16
16
  def link_to_status_codes(code)
17
- "<a href='https://es.wikipedia.org/wiki/Anexo:C%C3%B3digos_de_estado_HTTP'> #{I18n.t("error_#{code}")} </a>"
17
+ "<a href='https://es.wikipedia.org/wiki/Anexo:C%C3%B3digos_de_estado_HTTP' target='_blank'> #{I18n.t("error_#{code}")} </a>"
18
18
  end
19
19
 
20
20
  def url_for_application(app_name)
@@ -0,0 +1,17 @@
1
+ module OverlappedButtonsHelper
2
+ def restart_icon
3
+ overlapped_button_icon :restart, :undo
4
+ end
5
+
6
+ def format_icon
7
+ overlapped_button_icon :format, :indent
8
+ end
9
+
10
+ def restart_guide_link(guide)
11
+ link_to restart_icon, guide_progress_path(guide), class: 'mu-content-toolbar-item', data: {confirm: t(:confirm_restart)}, method: :delete
12
+ end
13
+
14
+ def overlapped_button_icon(key, icon)
15
+ fa_icon(icon, title: t(key), class: 'fa-fw', role: 'button', 'aria-label': t(key))
16
+ end
17
+ end
@@ -32,13 +32,21 @@
32
32
 
33
33
  <h2><%= t(:chapters) %></h2>
34
34
 
35
- <% @book.chapters.each do |it| %>
36
- <div class="chapter">
37
- <h3><%= it.number %>. <%= link_to_path_element it, mode: :plain %></h3>
38
-
39
- <div class="text-box">
40
- <%= it.description_teaser_html %>
35
+ <% @book.chapter_visibilities_in(current_workspace).each do |it, enabled| %>
36
+ <div class="chapter-container">
37
+ <div class="chapter <%= enabled ? '' : 'mu-locked' %>">
38
+ <h3><%= it.number %>. <%= link_to_path_element it, mode: :plain %></h3>
39
+ <div class="text-box" <%= 'aria-label=""' unless enabled %>%>
40
+ <%= it.description_teaser_html %>
41
+ </div>
41
42
  </div>
43
+
44
+ <% unless enabled %>
45
+ <div class="text-center mu-lock">
46
+ <i class="fa fa-lock fa-5x"></i>
47
+ <p><%= t :locked_content %></p>
48
+ </div>
49
+ <% end %>
42
50
  </div>
43
51
  <% end %>
44
52
  <% if current_user? && @exams.present? %>
@@ -4,7 +4,10 @@
4
4
  </div>
5
5
  <div class="body">
6
6
  <p>
7
- <%= t(:gone_explanation, error: link_to_status_codes(410)).html_safe %>
7
+ <%= t(:error_description, error: link_to_status_codes(410)).html_safe %>
8
+ </p>
9
+ <p>
10
+ <%= Organization.current.explain_error(410, explanation).html_safe %>
8
11
  </p>
9
12
  <p>
10
13
  <a class="btn btn-success" href="/"> <%= t(:back_to_mumuki) %> </a>
@@ -5,8 +5,8 @@
5
5
  <% end %>
6
6
 
7
7
  <ul class="results-list">
8
- <% assignment.humanized_expectation_results.each do |it| %>
9
- <%= humanized_expectation_result_item it %>
8
+ <% assignment.affable_expectation_results.each do |it| %>
9
+ <li><%= render_affable_expectation_result it %></li>
10
10
  <% end %>
11
11
  </ul>
12
12
  </div>
@@ -1,7 +1,7 @@
1
1
  <div class="row">
2
2
  <div class="col-md-12">
3
3
  <div class="actions">
4
- <% if assignment.passed? %>
4
+ <% if assignment.solved? %>
5
5
  <%= next_exercise_button(@exercise) || close_modal_button %>
6
6
  <% else %>
7
7
  <button class="btn btn-success btn-block submission-control" id="kids-btn-retry" data-dismiss="modal" aria-label="<%= t :retry_exercise %>"> <%= t :retry_exercise %> </button>
@@ -94,7 +94,7 @@
94
94
  </div>
95
95
  </div>
96
96
 
97
- <div role="tabpanel" class="tab-pane mu-input-panel fade" id="visible-extra">
97
+ <div role="tabpanel" class="tab-pane mu-input-panel fade mu-elipsis" id="visible-extra">
98
98
  <%= @discussion.extra_preview_html %>
99
99
  </div>
100
100
  </div>
@@ -9,23 +9,23 @@
9
9
  <% @stats = @exercise.guide.stats_for(current_user) if current_user && @exercise.guide %>
10
10
 
11
11
  <% if @exercise.navigable_parent.timed? && !current_user.teacher? %>
12
- <%= render partial: 'layouts/timer', locals: {end_time: @exercise.navigable_parent.real_end_time(current_user)} %>
12
+ <%= render partial: 'layouts/timer', locals: {end_time: @exercise.navigable_parent.real_end_time(current_user)} %>
13
13
  <% end %>
14
14
 
15
15
  <% unless @exercise.input_kids? %>
16
- <div class="row">
17
- <div class="mu-inline-block-right hidden-xs">
18
- <h1><%= language_icon @exercise.language %></h1>
19
- </div>
20
- <div class="mu-inline-block-left">
21
- <h1>
22
- <span class="hidden-xs"><%= t(:exercise_number, number: @exercise.number) %>:&nbsp;</span>
23
- <span><%= @exercise.name %></span>
24
- <%= teacher_info_button @exercise %>
25
- <%= link_to_bibliotheca_exercise @exercise %>
26
- </h1>
27
- </div>
16
+ <div class="row">
17
+ <div class="mu-inline-block-right hidden-xs">
18
+ <h1><%= language_icon @exercise.language %></h1>
28
19
  </div>
20
+ <div class="mu-inline-block-left">
21
+ <h1>
22
+ <span class="hidden-xs"><%= t(:exercise_number, number: @exercise.number) %>:&nbsp;</span>
23
+ <span><%= @exercise.name %></span>
24
+ <%= teacher_info_button @exercise %>
25
+ <%= link_to_bibliotheca_exercise @exercise %>
26
+ </h1>
27
+ </div>
28
+ </div>
29
29
  <% end %>
30
30
 
31
31
  <div>
@@ -54,6 +54,10 @@
54
54
  </div>
55
55
 
56
56
  <%= content_for :no_container do %>
57
- <%= render partial: 'layouts/modals/guide_corollary', locals: {guide: @guide} %>
58
- <%= render partial: 'layouts/modals/new_message', locals: {exercise: @exercise} if should_render_message_input?(@exercise) %>
57
+ <% if @assignment.skipped? %>
58
+ <%= render partial: 'layouts/exercise_skipped' %>
59
+ <% end %>
60
+
61
+ <%= render partial: 'layouts/modals/guide_corollary', locals: {guide: @guide} %>
62
+ <%= render partial: 'layouts/modals/new_message', locals: {exercise: @exercise} if should_render_message_input?(@exercise) %>
59
63
  <% end if current_user? %>
@@ -0,0 +1,28 @@
1
+ <div class="modal fade mu-exercise-skipped" id="exercise-skipped" tabindex="-1" role="dialog" aria-hidden="true">
2
+ <div class="modal-dialog">
3
+ <div class="modal-content">
4
+ <div class="modal-header">
5
+ <p class="modal-title text-center title-font"><%= t :skipped_congratulations %></p>
6
+ </div>
7
+ <div class="modal-body">
8
+ <div class="container-fluid">
9
+ <%= t :skipped_description %>
10
+ <%= link_to (t :skipped_solve_anyway), "", "data-dismiss" => "modal" %>
11
+ </div>
12
+ </div>
13
+ <div class="modal-footer">
14
+ <div class="row">
15
+ <div class="col-md-12">
16
+ <%= next_exercise_button(@exercise) %>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ <script>
24
+ $("#exercise-skipped").modal({
25
+ backdrop: 'static',
26
+ keyboard: false
27
+ });
28
+ </script>
@@ -17,7 +17,7 @@
17
17
  <div class="description"><%= exercise.description_task %></div>
18
18
  <div class="hint" style="display: none"><%= exercise.hint_html %></div>
19
19
  </div>
20
- <div class="mu-kids-character-speech-bubble-failed <%= @assignment&.status %>" style="display: none"></div>
20
+ <div class="mu-kids-character-speech-bubble-failed <%= current_user? && @assignment.status %>" style="display: none"></div>
21
21
  </div>
22
22
  <div id="mu-kids-discussion-link-html" class="hidden">
23
23
  <%= kids_read_discussions_link(exercise) %>
@@ -1,27 +1,30 @@
1
- <% if contextualization.single_visual_result? %>
2
- <%= contextualization.single_visual_result_html %>
1
+ <% if contextualization.single_visible_test_result? %>
2
+ <div class="mu-single-test-result">
3
+ <h5 class="text-danger mu-test-result-header"><%= render_test_result_header contextualization.affable_test_results.first %></h5>
4
+ <%= contextualization.first_test_result_html %>
5
+ </div>
3
6
  <% else %>
4
7
  <strong><%= t :test_results %>:</strong>
5
- <ul class="results-list">
6
- <% contextualization.test_results.each_with_index do |test_result, index| %>
8
+ <ul class="results-list mu-multiple-test-results">
9
+ <% contextualization.affable_test_results.each_with_index do |test_result, index| %>
7
10
  <li>
8
11
  <% if test_result[:status].failed? %>
9
- <span class="text-danger">
12
+ <span class="text-danger mu-test-result-header">
10
13
  <%= status_icon(test_result[:status]) %>
11
- <strong class="example-title"><%= test_result[:title] %></strong>
14
+ <%= render_test_result_header test_result %>
12
15
  <% unless contextualization.visible_success_output? %>
13
16
  <a data-toggle="collapse" href="#example-result-<%= index %>" class="example-see-more"><%= t :view_details %></a>
14
17
  <% end %>
15
18
  </span>
16
19
  <% else %>
17
- <span class="text-success example-title">
20
+ <span class="text-success mu-test-result-header">
18
21
  <%= status_icon(test_result[:status]) %>
19
22
  <%= test_result[:title] %>
20
23
  </span>
21
24
  <% end %>
22
25
 
23
26
  <div class="example-result collapse <%= 'in' if contextualization.visible_success_output? %>" id="example-result-<%= index %>">
24
- <%= contextualization.output_content_type.to_html test_result[:result] %>
27
+ <%= contextualization.test_result_html test_result %>
25
28
  </div>
26
29
  </li>
27
30
  <% end %>
@@ -4,13 +4,14 @@
4
4
  class: 'form-control editor',
5
5
  value: @current_content,
6
6
  data: {lines: 17} %>
7
- <a class="editor-resize" title="<%= t(:fullscreen) %> (F11)">
8
- <span class="fa-stack fa-lg">
9
- <i class="fa fa-square-o fa-stack-2x"></i>
10
- <i class="fa fa-expand fa-stack-1x"></i>
11
- </span>
12
- </a>
13
7
  <div class="mu-overlapped">
14
- <a class="editor-reset submission-reset"><%= restart_icon %></a>
8
+ <a class="editor-resize" title="<%= t(:fullscreen) %> (F11)">
9
+ <span class="fa-stack fa-lg">
10
+ <i class="fa fa-square-o fa-stack-2x"></i>
11
+ <i class="fa fa-expand fa-stack-1x"></i>
12
+ </span>
13
+ </a>
14
+ <a class="editor-format"><%= format_icon %></a>
15
+ <a class="editor-reset submission-reset" data-confirm="<%= t(:confirm_reset) %>"><%= restart_icon %></a>
15
16
  </div>
16
17
  </div>
@@ -26,15 +26,14 @@
26
26
  <% end %>
27
27
  </div>
28
28
 
29
- <a class="editor-resize multiple-files" title="<%= t(:fullscreen) %> (F11)">
30
- <span class="fa-stack fa-lg">
31
- <i class="fa fa-square-o fa-stack-2x"></i>
32
- <i class="fa fa-expand fa-stack-1x"></i>
33
- </span>
34
- </a>
35
-
36
- <div class="mu-overlapped">
37
- <a class="editor-reset submission-reset"><%= restart_icon %></a>
29
+ <div class="mu-overlapped multiple-files">
30
+ <a class="editor-resize" title="<%= t(:fullscreen) %> (F11)">
31
+ <span class="fa-stack fa-lg">
32
+ <i class="fa fa-square-o fa-stack-2x"></i>
33
+ <i class="fa fa-expand fa-stack-1x"></i>
34
+ </span>
35
+ </a>
36
+ <!--<a class="editor-reset submission-reset" data-confirm="<%= t(:confirm_reset) %>"><%= restart_icon %></a> -->
38
37
  </div>
39
38
 
40
39
  </div>