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.
- checksums.yaml +4 -4
- data/app/assets/javascripts/mumuki_laboratory/application/bridge.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/button.js +4 -4
- data/app/assets/javascripts/mumuki_laboratory/application/codemirror-builder.js +3 -3
- data/app/assets/javascripts/mumuki_laboratory/application/codemirror.js +6 -6
- data/app/assets/javascripts/mumuki_laboratory/application/console.js +2 -2
- data/app/assets/javascripts/mumuki_laboratory/application/discussions.js +7 -7
- data/app/assets/javascripts/mumuki_laboratory/application/editors.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/elipsis.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/events.js +2 -2
- data/app/assets/javascripts/mumuki_laboratory/application/exercise.js +2 -2
- data/app/assets/javascripts/mumuki_laboratory/application/gamification.js +13 -3
- data/app/assets/javascripts/mumuki_laboratory/application/inputs.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/kids.js +4 -4
- data/app/assets/javascripts/mumuki_laboratory/application/kindergarten.js +7 -7
- data/app/assets/javascripts/mumuki_laboratory/application/messages.js +6 -6
- data/app/assets/javascripts/mumuki_laboratory/application/mu-modal-carrousel.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/multiple-choice.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/multiple-files.js +3 -3
- data/app/assets/javascripts/mumuki_laboratory/application/multiple-scenarios.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/pin.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/primary.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/progress.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/results-renderer.js +1 -1
- data/app/assets/javascripts/mumuki_laboratory/application/speech-bubble-renderer.js +4 -4
- data/app/assets/javascripts/mumuki_laboratory/application/submission.js +2 -2
- data/app/assets/javascripts/mumuki_laboratory/application/submissions-store.js +3 -3
- data/app/assets/javascripts/mumuki_laboratory/application/sync-mode.js +2 -2
- data/app/assets/javascripts/mumuki_laboratory/application/timer.js +1 -1
- data/app/assets/stylesheets/mumuki_laboratory/application/_layout.scss +7 -7
- data/app/assets/stylesheets/mumuki_laboratory/application/modules/_overlap.scss +0 -4
- data/app/controllers/application_controller.rb +1 -0
- data/app/controllers/concerns/with_user_discussion_validation.rb +6 -0
- data/app/controllers/discussions_controller.rb +0 -6
- data/app/controllers/users_controller.rb +2 -1
- data/app/helpers/assignment_result_helper.rb +1 -1
- data/app/helpers/discussions_helper.rb +4 -4
- data/app/helpers/editor_tabs_helper.rb +1 -1
- data/app/helpers/icons_helper.rb +1 -1
- data/app/helpers/links_helper.rb +3 -3
- data/app/helpers/menu_bar_helper.rb +5 -1
- data/app/helpers/overlapped_buttons_helper.rb +6 -2
- data/app/views/book/show.html.erb +2 -2
- data/app/views/discussions/_message.html.erb +2 -2
- data/app/views/exercise_solutions/_kids_level_up.html.erb +1 -1
- data/app/views/exercises/_exercise_assignment.html.erb +1 -1
- data/app/views/exercises/_read_only.html.erb +1 -1
- data/app/views/exercises/show.html.erb +1 -1
- data/app/views/layouts/_copyright.html.erb +1 -1
- data/app/views/layouts/_guide.html.erb +8 -6
- data/app/views/layouts/_kids.html.erb +4 -4
- data/app/views/layouts/_kindergarten.html.erb +5 -5
- data/app/views/layouts/_social_media.html.erb +4 -4
- data/app/views/layouts/_timer.html.erb +1 -1
- data/app/views/layouts/application.html.erb +28 -26
- data/app/views/layouts/embedded.html.erb +14 -11
- data/app/views/layouts/exercise_inputs/editors/_code.html.erb +1 -6
- data/app/views/layouts/exercise_inputs/editors/_multiple_files.html.erb +4 -9
- data/app/views/layouts/exercise_inputs/forms/_problem_form.html.erb +1 -1
- data/app/views/layouts/modals/_guide_corollary.html.erb +13 -3
- data/app/views/layouts/modals/_kids_results.html.erb +2 -2
- data/app/views/layouts/modals/_kindergarten_context.html.erb +3 -3
- data/app/views/layouts/modals/_kindergarten_results.html.erb +3 -3
- data/app/views/layouts/modals/_kindergarten_results_aborted.html.erb +1 -1
- data/app/views/layouts/modals/_level_up.html.erb +1 -1
- data/app/views/users/_edit_user_form.html.erb +1 -1
- data/app/views/users/_user_form.html.erb +1 -1
- data/lib/mumuki/laboratory.rb +1 -1
- data/lib/mumuki/laboratory/engine.rb +1 -1
- data/lib/mumuki/laboratory/locales/en.yml +3 -1
- data/lib/mumuki/laboratory/locales/es-CL.yml +4 -2
- data/lib/mumuki/laboratory/locales/es.yml +6 -3
- data/lib/mumuki/laboratory/locales/pt.yml +4 -2
- data/lib/mumuki/laboratory/version.rb +1 -1
- data/spec/controllers/discussions_controller_spec.rb +19 -0
- data/spec/dummy/db/schema.rb +2 -1
- data/spec/features/terms_flow_spec.rb +14 -8
- data/spec/helpers/icons_helper_spec.rb +3 -3
- data/spec/helpers/test_results_rendering_spec.rb +8 -8
- data/spec/helpers/with_navigation_spec.rb +14 -14
- data/spec/javascripts/gamification-spec.js +2 -2
- metadata +109 -104
- data/spec/dummy/config/database.travis.yml +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bf871725a11b2dd65249bd5e4901440641bd3d70bc5f6410bc6a4a3044d17f9a
|
4
|
+
data.tar.gz: 4950d01c150d8f6a1c76b8581891fec28446518b47c28abd6406b9b3cc043c4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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="
|
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="
|
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 .
|
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 .
|
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');
|
@@ -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
|
+
};
|
@@ -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
|
}
|
@@ -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() {
|
@@ -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
|
|