mumuki-laboratory 5.8.1 → 5.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/application/kids.js +80 -64
- data/app/helpers/breadcrumbs_helper.rb +9 -8
- data/app/views/appendixes/show.html.erb +1 -1
- data/app/views/discussions/show.html.erb +1 -1
- data/lib/mumuki/laboratory/version.rb +1 -1
- data/spec/helpers/breadcrumbs_helper_spec.rb +52 -0
- metadata +4 -4
- data/spec/helpers/with_breadcrumbs_spec.rb +0 -38
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 625ae660ff8299245d10e105830ddcf35e14a1700f36ecad6d338cbd0bee64bd
|
|
4
|
+
data.tar.gz: 43691be79aa7d382429e9443ed0727c19ded873284baab6c1ad8f8c9232d09b7
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ca3b02948675b7bf146dac98f74ba891ecfb6feb979853b52d7bbce804a34b350278677beac6a782d79b8399a737e9243bfcca8cb0dde1128e7f966811ad1abe
|
|
7
|
+
data.tar.gz: bcb56b9bbac91d7600e69502432d6d176ffff4783a7c80c809a54606d8faceb56a49e232765fdd29fb18f9c52d6a1425ba73a64cf329210b2b188b0c029fc7f0
|
|
@@ -1,58 +1,47 @@
|
|
|
1
1
|
mumuki.load(function () {
|
|
2
|
+
var $bubble = $('.mu-kids-character-speech-bubble').children('.mu-kids-character-speech-bubble-normal');
|
|
3
|
+
if(!$bubble.length) return;
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
var fullMargin = margin * 2;
|
|
6
|
-
|
|
7
|
-
var gbsBoard = $('.mu-kids-state');
|
|
8
|
-
|
|
9
|
-
var dimension = gbsBoard.height() * 1.25 - fullMargin;
|
|
10
|
-
gbsBoard.width(dimension);
|
|
11
|
-
|
|
12
|
-
var $muKidsExercise = $('.mu-kids-exercise');
|
|
13
|
-
var $muKidsExerciseDescription = $('.mu-kids-exercise-description');
|
|
14
|
-
|
|
15
|
-
$muKidsExerciseDescription.width($muKidsExercise.width() - gbsBoard.width() - margin);
|
|
16
|
-
|
|
17
|
-
gbsBoard.each(function (i) {
|
|
18
|
-
gsBoardScale($(gbsBoard[i]));
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
var $muKidsBlocks = $('.mu-kids-blocks');
|
|
22
|
-
var $blockArea = $muKidsBlocks.find('#blocklyDiv');
|
|
23
|
-
var $blockSvg = $muKidsBlocks.find('.blocklySvg');
|
|
24
|
-
|
|
25
|
-
$blockArea.width($muKidsBlocks.width());
|
|
26
|
-
$blockArea.height($muKidsBlocks.height());
|
|
27
|
-
|
|
28
|
-
$blockSvg.width($muKidsBlocks.width());
|
|
29
|
-
$blockSvg.height($muKidsBlocks.height());
|
|
30
|
-
|
|
31
|
-
function gsBoardScale($element) {
|
|
32
|
-
var $table = $element.find('gs-board > table');
|
|
33
|
-
$table.css('transform', 'scale(1)');
|
|
34
|
-
var scaleX = ($element.width() - fullMargin * 2) / $table.width();
|
|
35
|
-
var scaleY = ($element.height() - fullMargin * 2) / $table.height();
|
|
36
|
-
$table.css('transform', 'scale(' + Math.min(scaleX, scaleY) + ')');
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
var $speechParagraphs;
|
|
5
|
+
var availableTabs = ['.description', '.hint'];
|
|
6
|
+
var $speechParagraphs, paragraphHeight, scrollHeight;
|
|
42
7
|
var currentParagraphIndex = 0;
|
|
8
|
+
var paragraphCount = 1;
|
|
9
|
+
var paragraphsLines = 2;
|
|
43
10
|
var $prevSpeech = $('.mu-kids-character-speech-bubble-normal > .mu-kids-prev-speech').hide();
|
|
44
11
|
var $nextSpeech = $('.mu-kids-character-speech-bubble-normal > .mu-kids-next-speech');
|
|
45
12
|
var $speechTabs = $('.mu-kids-character-speech-bubble-tabs > li:not(.separator)');
|
|
46
13
|
var $defaultSpeechTabName = 'description';
|
|
47
|
-
var $
|
|
48
|
-
|
|
14
|
+
var $texts = $bubble.children(availableTabs.join(", "));
|
|
15
|
+
|
|
16
|
+
function floatFromPx(value) {
|
|
17
|
+
return parseFloat(value.substring(0, value.length - 2));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function resizeSpeechParagraphs(paragraphIndex) {
|
|
21
|
+
var previousParagraphCount = paragraphCount;
|
|
22
|
+
scrollHeight = $bubble[0].scrollHeight;
|
|
23
|
+
paragraphHeight = floatFromPx($speechParagraphs.css('line-height')) * paragraphsLines;
|
|
24
|
+
paragraphCount = Math.ceil(scrollHeight / paragraphHeight);
|
|
25
|
+
var newParagraphIndex = Math.floor((paragraphCount / previousParagraphCount) * currentParagraphIndex);
|
|
26
|
+
showParagraph(paragraphIndex || newParagraphIndex);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
availableTabs.forEach(function (tabSelector) {
|
|
30
|
+
tabParagraphs(tabSelector).contents().unwrap().wrapAll('<p>');
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
function tabParagraphs(selector) {
|
|
34
|
+
return $('.mu-kids-character-speech-bubble > .mu-kids-character-speech-bubble-normal > div' + selector + ' > p');
|
|
35
|
+
}
|
|
49
36
|
|
|
50
37
|
updateSpeechParagraphs();
|
|
51
38
|
function updateSpeechParagraphs() {
|
|
52
|
-
$speechParagraphs =
|
|
53
|
-
|
|
39
|
+
$speechParagraphs = tabParagraphs('.' + getSelectedTabName());
|
|
40
|
+
resizeSpeechParagraphs(0);
|
|
54
41
|
}
|
|
55
42
|
|
|
43
|
+
resizeSpeechParagraphs();
|
|
44
|
+
|
|
56
45
|
$speechTabs.each(function (i) {
|
|
57
46
|
var $tab = $($speechTabs[i]);
|
|
58
47
|
$tab.click(function () {
|
|
@@ -60,48 +49,75 @@ mumuki.load(function () {
|
|
|
60
49
|
$tab.addClass('active');
|
|
61
50
|
$texts.hide();
|
|
62
51
|
$bubble.children('.' + $tab.data('target')).show();
|
|
63
|
-
$bubble.scroll(0);
|
|
64
|
-
hideCurrentParagraph();
|
|
65
52
|
updateSpeechParagraphs();
|
|
66
53
|
})
|
|
67
54
|
});
|
|
68
55
|
|
|
69
56
|
$nextSpeech.click(function () {
|
|
70
|
-
|
|
71
|
-
showNextParagraph();
|
|
57
|
+
showParagraph(currentParagraphIndex + 1);
|
|
72
58
|
});
|
|
59
|
+
|
|
73
60
|
$prevSpeech.click(function () {
|
|
74
|
-
|
|
75
|
-
showPrevParagraph();
|
|
61
|
+
showParagraph(currentParagraphIndex - 1);
|
|
76
62
|
});
|
|
77
63
|
|
|
78
64
|
function getSelectedTabName() {
|
|
79
65
|
return $speechTabs.filter(".active").data('target') || $defaultSpeechTabName;
|
|
80
66
|
}
|
|
81
67
|
|
|
82
|
-
function
|
|
83
|
-
$
|
|
68
|
+
function showParagraph(index) {
|
|
69
|
+
$bubble[0].scrollTop = index * paragraphHeight;
|
|
70
|
+
currentParagraphIndex = index;
|
|
71
|
+
checkArrowsSpeechVisibility();
|
|
84
72
|
}
|
|
85
73
|
|
|
86
|
-
function
|
|
87
|
-
|
|
74
|
+
function checkArrowsSpeechVisibility() {
|
|
75
|
+
setVisibility($prevSpeech, currentParagraphIndex !== 0);
|
|
76
|
+
setVisibility($nextSpeech, currentParagraphIndex !== paragraphCount - 1);
|
|
88
77
|
}
|
|
89
78
|
|
|
90
|
-
function
|
|
91
|
-
|
|
79
|
+
function setVisibility(element, isVisible) {
|
|
80
|
+
isVisible ? element.show() : element.hide();
|
|
92
81
|
}
|
|
93
82
|
|
|
94
|
-
function
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
setVisibility($nextSpeech, index !== $speechParagraphs.length - 1);
|
|
83
|
+
mumuki.resize(function () {
|
|
84
|
+
var margin = 15;
|
|
85
|
+
var fullMargin = margin * 2;
|
|
98
86
|
|
|
99
|
-
|
|
100
|
-
}
|
|
87
|
+
var gbsBoard = $('.mu-kids-state');
|
|
101
88
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
89
|
+
var dimension = gbsBoard.height() * 1.25 - fullMargin;
|
|
90
|
+
gbsBoard.width(dimension);
|
|
91
|
+
|
|
92
|
+
var $muKidsExercise = $('.mu-kids-exercise');
|
|
93
|
+
var $muKidsExerciseDescription = $('.mu-kids-exercise-description');
|
|
94
|
+
|
|
95
|
+
$muKidsExerciseDescription.width($muKidsExercise.width() - gbsBoard.width() - margin);
|
|
96
|
+
|
|
97
|
+
gbsBoard.each(function (i) {
|
|
98
|
+
gsBoardScale($(gbsBoard[i]));
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
var $muKidsBlocks = $('.mu-kids-blocks');
|
|
102
|
+
var $blockArea = $muKidsBlocks.find('#blocklyDiv');
|
|
103
|
+
var $blockSvg = $muKidsBlocks.find('.blocklySvg');
|
|
104
|
+
|
|
105
|
+
$blockArea.width($muKidsBlocks.width());
|
|
106
|
+
$blockArea.height($muKidsBlocks.height());
|
|
107
|
+
|
|
108
|
+
$blockSvg.width($muKidsBlocks.width());
|
|
109
|
+
$blockSvg.height($muKidsBlocks.height());
|
|
110
|
+
|
|
111
|
+
function gsBoardScale($element) {
|
|
112
|
+
var $table = $element.find('gs-board > table');
|
|
113
|
+
$table.css('transform', 'scale(1)');
|
|
114
|
+
var scaleX = ($element.width() - fullMargin * 2) / $table.width();
|
|
115
|
+
var scaleY = ($element.height() - fullMargin * 2) / $table.height();
|
|
116
|
+
$table.css('transform', 'scale(' + Math.min(scaleX, scaleY) + ')');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
resizeSpeechParagraphs();
|
|
120
|
+
});
|
|
105
121
|
|
|
106
122
|
mumuki.kids = {
|
|
107
123
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module BreadcrumbsHelper
|
|
2
2
|
|
|
3
3
|
def breadcrumbs(e, extra=nil)
|
|
4
|
-
breadcrumbs0(e, extra, 'last')
|
|
4
|
+
breadcrumbs0(e.navigable_name, e, extra, 'last')
|
|
5
5
|
end
|
|
6
6
|
|
|
7
7
|
def home_breadcrumb
|
|
@@ -17,9 +17,7 @@ module BreadcrumbsHelper
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def breadcrumb_item_class(last)
|
|
20
|
-
|
|
21
|
-
class='mu-breadcrumb-list-item #{last}'
|
|
22
|
-
HTML
|
|
20
|
+
"class='mu-breadcrumb-list-item #{last}'"
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
def breadcrumb_list_item(last, item)
|
|
@@ -28,14 +26,17 @@ HTML
|
|
|
28
26
|
|
|
29
27
|
private
|
|
30
28
|
|
|
31
|
-
def
|
|
32
|
-
|
|
29
|
+
def breadcrumbs_for_linkable(e, extra=nil, last='')
|
|
30
|
+
breadcrumbs0(link_to_path_element(e), e, extra, last)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def breadcrumbs0(base, e, extra, last)
|
|
34
|
+
return "#{breadcrumbs_for_linkable(e)} #{breadcrumb_list_item(last, extra)}".html_safe if extra
|
|
33
35
|
|
|
34
|
-
base = link_to_path_element e
|
|
35
36
|
if e.navigation_end?
|
|
36
37
|
"#{home_breadcrumb} #{breadcrumb_list_item(last, base)}".html_safe
|
|
37
38
|
else
|
|
38
|
-
"#{
|
|
39
|
+
"#{breadcrumbs_for_linkable(e.navigable_parent)} #{breadcrumb_list_item(last, base)}".html_safe
|
|
39
40
|
end
|
|
40
41
|
end
|
|
41
42
|
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<%= content_for :breadcrumbs do %>
|
|
2
|
-
<%=
|
|
2
|
+
<%= breadcrumbs_for_linkable @debatable, link_to(t(:discussions), item_discussions_path(@debatable))%>
|
|
3
3
|
<%= breadcrumb_list_item('last', @discussion.friendly.truncate_words(4)) %>
|
|
4
4
|
<% end %>
|
|
5
5
|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe BreadcrumbsHelper, organization_workspace: :test do
|
|
4
|
+
|
|
5
|
+
helper BreadcrumbsHelper
|
|
6
|
+
helper LinksHelper
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
context 'user' do
|
|
10
|
+
let(:user) { create(:user) }
|
|
11
|
+
let(:breadcrumb) { breadcrumbs(user) }
|
|
12
|
+
|
|
13
|
+
it { expect(breadcrumb).to include "<li class='mu-breadcrumb-list-item last'>#{user.name}</li>" }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context 'exercise' do
|
|
17
|
+
let(:breadcrumb) { breadcrumbs(exercise) }
|
|
18
|
+
|
|
19
|
+
context 'exercise in complement' do
|
|
20
|
+
let!(:complement) { create(:complement, name: 'my guide', exercises: [
|
|
21
|
+
create(:exercise, name: 'my exercise')
|
|
22
|
+
]) }
|
|
23
|
+
let(:exercise) { complement.exercises.first }
|
|
24
|
+
|
|
25
|
+
before { reindex_current_organization! }
|
|
26
|
+
|
|
27
|
+
it { expect(breadcrumb).to include('my exercise') }
|
|
28
|
+
it { expect(breadcrumb).to include('my guide') }
|
|
29
|
+
it { expect(breadcrumb).to be_html_safe }
|
|
30
|
+
|
|
31
|
+
it { expect(breadcrumb).to include "<a href=\"/complements/#{complement.id}-my-guide\">my guide</a>" }
|
|
32
|
+
it { expect(breadcrumb).to include "<li class='mu-breadcrumb-list-item last'>1. my exercise</li>" }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context 'exercise in chapter' do
|
|
36
|
+
let!(:chapter) { create(:chapter, name: 'my chapter', lessons: [lesson]) }
|
|
37
|
+
let(:lesson) { create(:lesson, name: 'my lesson', exercises: [exercise]) }
|
|
38
|
+
let(:exercise) { create(:exercise, name: 'my exercise') }
|
|
39
|
+
|
|
40
|
+
before { reindex_current_organization! }
|
|
41
|
+
|
|
42
|
+
it { expect(breadcrumb).to include('my exercise') }
|
|
43
|
+
it { expect(breadcrumb).to include('my lesson') }
|
|
44
|
+
it { expect(breadcrumb).to include('my chapter') }
|
|
45
|
+
it { expect(breadcrumb).to be_html_safe }
|
|
46
|
+
|
|
47
|
+
it { expect(breadcrumb).to include "<a href=\"/chapters/#{chapter.id}-my-chapter\">my chapter</a>" }
|
|
48
|
+
it { expect(breadcrumb).to include "<a href=\"/lessons/#{lesson.id}-my-chapter-my-lesson\">1. my lesson</a>" }
|
|
49
|
+
it { expect(breadcrumb).to include "<li class='mu-breadcrumb-list-item last'>1. my exercise</li>" }
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: mumuki-laboratory
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 5.8.
|
|
4
|
+
version: 5.8.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Franco Bulgarelli
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-08-
|
|
11
|
+
date: 2018-08-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -962,11 +962,11 @@ files:
|
|
|
962
962
|
- spec/features/progressive_tips_spec.rb
|
|
963
963
|
- spec/features/standard_flow_spec.rb
|
|
964
964
|
- spec/helpers/application_helper_spec.rb
|
|
965
|
+
- spec/helpers/breadcrumbs_helper_spec.rb
|
|
965
966
|
- spec/helpers/email_helper_spec.rb
|
|
966
967
|
- spec/helpers/exercise_input_helper_spec.rb
|
|
967
968
|
- spec/helpers/icons_helper_spec.rb
|
|
968
969
|
- spec/helpers/test_results_rendering_spec.rb
|
|
969
|
-
- spec/helpers/with_breadcrumbs_spec.rb
|
|
970
970
|
- spec/helpers/with_choices_spec.rb
|
|
971
971
|
- spec/helpers/with_navigation_spec.rb
|
|
972
972
|
- spec/mailers/previews/user_mailer_preview.rb
|
|
@@ -1147,11 +1147,11 @@ test_files:
|
|
|
1147
1147
|
- spec/features/progressive_tips_spec.rb
|
|
1148
1148
|
- spec/features/standard_flow_spec.rb
|
|
1149
1149
|
- spec/helpers/application_helper_spec.rb
|
|
1150
|
+
- spec/helpers/breadcrumbs_helper_spec.rb
|
|
1150
1151
|
- spec/helpers/email_helper_spec.rb
|
|
1151
1152
|
- spec/helpers/exercise_input_helper_spec.rb
|
|
1152
1153
|
- spec/helpers/icons_helper_spec.rb
|
|
1153
1154
|
- spec/helpers/test_results_rendering_spec.rb
|
|
1154
|
-
- spec/helpers/with_breadcrumbs_spec.rb
|
|
1155
1155
|
- spec/helpers/with_choices_spec.rb
|
|
1156
1156
|
- spec/helpers/with_navigation_spec.rb
|
|
1157
1157
|
- spec/mailers/previews/user_mailer_preview.rb
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
describe BreadcrumbsHelper, organization_workspace: :test do
|
|
4
|
-
|
|
5
|
-
helper BreadcrumbsHelper
|
|
6
|
-
helper LinksHelper
|
|
7
|
-
|
|
8
|
-
let(:breadcrumb) { breadcrumbs(exercise) }
|
|
9
|
-
|
|
10
|
-
context 'exercise in complement' do
|
|
11
|
-
let!(:complement) { create(:complement, name: 'my guide', exercises: [
|
|
12
|
-
create(:exercise, name: 'my exercise')
|
|
13
|
-
]) }
|
|
14
|
-
let(:exercise) { complement.exercises.first }
|
|
15
|
-
|
|
16
|
-
before { reindex_current_organization! }
|
|
17
|
-
|
|
18
|
-
it { expect(breadcrumb).to include('my exercise') }
|
|
19
|
-
it { expect(breadcrumb).to include('my guide') }
|
|
20
|
-
it { expect(breadcrumb).to be_html_safe }
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
context 'exercise in chapter' do
|
|
24
|
-
let!(:chapter) { create(:chapter, name: 'my chapter', lessons: [
|
|
25
|
-
create(:lesson, name: 'my lesson', exercises: [
|
|
26
|
-
create(:exercise, name: 'my exercise')
|
|
27
|
-
])
|
|
28
|
-
]) }
|
|
29
|
-
let(:exercise) { chapter.first_lesson.exercises.first }
|
|
30
|
-
|
|
31
|
-
before { reindex_current_organization! }
|
|
32
|
-
|
|
33
|
-
it { expect(breadcrumb).to include('my exercise') }
|
|
34
|
-
it { expect(breadcrumb).to include('my lesson') }
|
|
35
|
-
it { expect(breadcrumb).to include('my chapter') }
|
|
36
|
-
it { expect(breadcrumb).to be_html_safe }
|
|
37
|
-
end
|
|
38
|
-
end
|