@@ -95,7 +112,7 @@ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); - + - @@ -298,6 +315,7 @@ + @@ -346,5 +364,11 @@ else self.location = "ie.html" } - + if(self == top) { + document.getElementsByTagName("body")[0].style.display = 'block'; + } + else{ + top.location = self.location; + } + diff --git a/app/locals/translation_en.js b/app/locals/translation_en.js index 1efe67a87..e569a631c 100755 --- a/app/locals/translation_en.js +++ b/app/locals/translation_en.js @@ -93,6 +93,8 @@ var translation_en={ change_password_confirmation: "You have successfully changed your password.", confirm_change_email: "You have successfully changed your email.", export_course: "Your anonymized course data will be emailed to you shortly." , + export_course_cc:"Your course material will be emailed to you shortly as canvas common cartridge package", + export_course_text:"Your course material will be emailed to you shortly as text file", export_student:"Your student list will be emailed to you shortly.", export_school_administration: "Statistics will be exported to CSV and sent to your Email.", another_marker: "There is another marker at the same time", @@ -635,6 +637,7 @@ var translation_en={ student_cancelled:'{{name}} cancelled the invitation', }, editor:{ + export_video: "Export video to FeedbackFruits", explanation: "Explanation", quiz_question: "Quiz Question", quiz_time: "Quiz Time", @@ -674,6 +677,7 @@ var translation_en={ title:"@:global.title", annotation:"Annotation", tooltip:{ + export_video:"Click on this button to create a copy of this lecture on feedbackFuit on your account", invisible: "Not currently visible to students.", visible_quiz: "Published: visible to students.", invisible_quiz:"Unpublished: not visible to students.", @@ -1005,7 +1009,10 @@ var translation_en={ button:{ add_teacher: "Add Teacher", remove_teacher: "Remove Teacher", - export_as: "Export anonymized course data", + export_as: "Export Anonymized Course Data", + export_as_canvas: "Export Course to Canvas Package", + export_as_canvas_fbf: "Export Course to Canvas Package with FeedbackFruits lectures", + export_as_text: "Export Course Text", invite: "Invite to Join", send_email_reminder: "Send email reminders", }, diff --git a/app/locals/translation_sv.js b/app/locals/translation_sv.js index 0ca3a3419..a5de52156 100755 --- a/app/locals/translation_sv.js +++ b/app/locals/translation_sv.js @@ -630,6 +630,7 @@ var translation_sv={ student_cancelled:'{{name}} avbrutit inbjudan.', }, editor:{ + export_video: "Exportera videon FeedbackFruits", explanation: "Förklaring", quiz_question: "Quiz-fråga", quiz_time: "Quiz-tidpunkt", @@ -1000,7 +1001,8 @@ var translation_sv={ button:{ add_teacher: "Lägg till lärare", remove_teacher: "Ta bort lärare", - export_as: "Exportera anonymiserade kursdata", + export_as: "Exportera Anonymiserade Kursdata", + export_as_canvas: "Exporterar kurs till Canvas Package", invite: "Bjud in", send_email_reminder: "Skicka ett mail påminnelser", }, diff --git a/app/scripts/app.js b/app/scripts/app.js index 5a1ae7259..0a327511c 100755 --- a/app/scripts/app.js +++ b/app/scripts/app.js @@ -378,6 +378,11 @@ angular.module('scalearAngularApp') templateUrl: '/views/teacher/help/teacher_getting_started.html', controller: 'TeacherGettingStartedCtrl' }) + .state('future', { + url: '/future', + templateUrl: '/views/future.html', + controller: 'FutureCtrl' + }) .state('preview', { url: '/preview', params : { course_id: null, module_id: null, lecture_id: null,quiz_id:null,time:null, prevState:null }, diff --git a/app/scripts/controllers/index_ctrl.js b/app/scripts/controllers/index_ctrl.js index a919a6783..e40176be9 100755 --- a/app/scripts/controllers/index_ctrl.js +++ b/app/scripts/controllers/index_ctrl.js @@ -63,6 +63,9 @@ angular.module('scalearAngularApp') $scope.changeLanguage($translate.use()); + $scope.closeBanner = function(){ + angular.element('#banner_container').remove() + } //Google Analytics ga('create', scalear_api.ga_token); ga('send', 'pageview'); diff --git a/app/scripts/controllers/teacher/course/course_information_ctrl.js b/app/scripts/controllers/teacher/course/course_information_ctrl.js index 6a8186c9a..3c4737aca 100755 --- a/app/scripts/controllers/teacher/course/course_information_ctrl.js +++ b/app/scripts/controllers/teacher/course/course_information_ctrl.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('scalearAngularApp') - .controller('teacherCourseInformationCtrl', ['$scope', '$state', '$translate', '$log', '$window', 'Page', 'ScalearUtils', 'ContentNavigator', 'ErrorHandler', '$location', 'CourseModel', 'TeacherModel', '$modal', function($scope, $state, $translate, $log, $window, Page, ScalearUtils, ContentNavigator, ErrorHandler, $location, CourseModel, TeacherModel, $modal) { + .controller('teacherCourseInformationCtrl', ['$scope', '$state', '$translate', '$log', '$window', 'Page', 'ScalearUtils', 'ContentNavigator', 'ErrorHandler', '$location', 'CourseModel', 'TeacherModel', '$modal','Course', function($scope, $state, $translate, $log, $window, Page, ScalearUtils, ContentNavigator, ErrorHandler, $location, CourseModel, TeacherModel, $modal,Course) { $window.scrollTo(0, 0); $scope.in_delete = false; @@ -69,7 +69,43 @@ angular.module('scalearAngularApp') } }) } - + $scope.sendCourseToTeacherMail = function(fbf) { + checkToExport(fbf, $scope.course.id) + } + function checkToExport(fbf, course_id) { + $modal.open({ + templateUrl: '/views/teacher/course_editor/export_modal.html', + controller: ['$scope', '$rootScope', '$modalInstance', function ($scope, $rootScope, $modalInstance) { + $scope.course_export_dialogue = fbf.with_fbf == true? true:false + $scope.canvas = fbf.with_fbf == false? true:false + console.log(' $scope.course_export_dialogue', $scope.course_export_dialogue) + console.log('$scope.canvas',$scope.canvas) + $scope.cancelExport = function () { + $modalInstance.close(); + } + $scope.beginExport = function () { + $modalInstance.close(); + Course.sendCourseToTeacherMail({ + course_id: course_id, + export_lec_2_fbf: fbf.with_fbf, + }, function (response) { + if (response.notice) { + ErrorHandler.showMessage($translate.instant("error_message.export_course_cc"), 'errorMessage', 4000, 'success'); + } + }) + } + }] + }); + } + $scope.sendCourseTextToTeacherMail = function () { + Course.sendCourseTextToTeacherMail({ + course_id: $scope.course.id + },function(response){ + if(response.notice) { + ErrorHandler.showMessage($translate.instant("error_message.export_course_text"), 'errorMessage', 4000, 'success'); + } + }) + } //teachers part function getTeachers() { TeacherModel.getTeachers().then(function(value) { diff --git a/app/scripts/controllers/teacher/course_editor/lecture_details_ctrl.js b/app/scripts/controllers/teacher/course_editor/lecture_details_ctrl.js index a65968b03..9aab3e07c 100755 --- a/app/scripts/controllers/teacher/course_editor/lecture_details_ctrl.js +++ b/app/scripts/controllers/teacher/course_editor/lecture_details_ctrl.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('scalearAngularApp') - .controller('lectureDetailsCtrl', ['$stateParams', '$scope', '$state', '$log', '$rootScope', '$modal', '$filter', 'ItemsModel', 'DetailsNavigator', 'CourseEditor', 'LectureModel','VideoQuizModel', 'MarkerModel', 'ScalearUtils','VimeoModel','VideoInformation',function($stateParams, $scope, $state, $log, $rootScope, $modal, $filter, ItemsModel, DetailsNavigator, CourseEditor, LectureModel, VideoQuizModel, MarkerModel, ScalearUtils, VimeoModel, VideoInformation) { + .controller('lectureDetailsCtrl', ['$stateParams', '$scope', '$state', '$log', '$rootScope', '$modal', '$filter', 'ItemsModel', 'DetailsNavigator', 'CourseEditor', 'LectureModel','VideoQuizModel', 'MarkerModel', 'ScalearUtils','VimeoModel','VideoInformation','Lecture','ErrorHandler',function($stateParams, $scope, $state, $log, $rootScope, $modal, $filter, ItemsModel, DetailsNavigator, CourseEditor, LectureModel, VideoQuizModel, MarkerModel, ScalearUtils, VimeoModel, VideoInformation, Lecture, ErrorHandler) { $scope.lecture = ItemsModel.getLecture($stateParams.lecture_id) $scope.url_old = $scope.lecture.url @@ -117,11 +117,43 @@ angular.module('scalearAngularApp') $rootScope.$broadcast("delete_online_marker", marker) } + + + function checkToExportVideo (course_id,lecture_id) { + console.log("here======>") + $modal.open({ + templateUrl: '/views/teacher/course_editor/export_modal.html', + controller: ['$scope', '$modalInstance', function ($scope, $modalInstance) { + $scope.video_export_dialogue = true + $scope.course_export_dialogue = false + $scope.exportVideo = function (course_id,lecture_id) { + Lecture.exportLectureToFeedbackFruit({ + course_id: course_id, + lecture_id: lecture_id + },{} + ,function(response){ + angular.element('#export_button_2_fbf')[0].disabled = false + if (response.notice){ + ErrorHandler.showMessage("video export to feedbackFruit accomplished", 'errorMessage', 4000, 'success'); + } else { + ErrorHandler.showMessage("video export failed", 'errorMessage', 4000, 'error'); + } + }) + }; + $scope.confirmExport = function(){ + $modalInstance.close(); + $scope.exportVideo(course_id,lecture_id) + } + }] + }); + } + $scope.checkToExportVideo = function() { + checkToExportVideo($scope.lecture.course_id,$scope.lecture.id) + } function checkToTrim(url,lecture) { $modal.open({ templateUrl: '/views/teacher/course_editor/trim_modal.html', controller: ['$scope', '$rootScope', '$modalInstance', function ($scope, $rootScope, $modalInstance) { - console.log('url:', url) $scope.hideKeepTrimBtn = url == 'none' ? true : false $scope.trim = function () { var isVimeo = VideoInformation.isVimeo(lecture.url) @@ -130,7 +162,6 @@ angular.module('scalearAngularApp') lecture.duration = duration lecture.start_time = 0 lecture.end_time = lecture.duration - console.log(duration) lecture.update().then(function () { $rootScope.$broadcast("update_module_time", lecture.group_id) $rootScope.$broadcast("start_trim_video") diff --git a/app/scripts/controllers/teacher/course_editor/lecture_middle_ctrl.js b/app/scripts/controllers/teacher/course_editor/lecture_middle_ctrl.js index add5b1adc..ed14e24b1 100644 --- a/app/scripts/controllers/teacher/course_editor/lecture_middle_ctrl.js +++ b/app/scripts/controllers/teacher/course_editor/lecture_middle_ctrl.js @@ -1,7 +1,7 @@ 'use strict'; angular.module('scalearAngularApp') - .controller('lectureMiddleCtrl', ['$state', '$stateParams', '$scope', '$translate', '$log', '$rootScope', '$timeout', '$q', 'DetailsNavigator', 'ngDialog', 'ItemsModel', 'VideoQuizModel', 'ScalearUtils', 'MarkerModel', '$urlRouter', 'VideoInformation', 'VimeoModel', 'MobileDetector', function ($state, $stateParams, $scope, $translate, $log, $rootScope, $timeout, $q, DetailsNavigator, ngDialog, ItemsModel, VideoQuizModel, ScalearUtils, MarkerModel, $urlRouter, VideoInformation, VimeoModel, MobileDetector) { + .controller('lectureMiddleCtrl', ['$state', '$stateParams', '$scope', '$translate', '$log', '$rootScope', '$timeout', '$q', 'DetailsNavigator', 'ngDialog', 'ItemsModel', 'VideoQuizModel', 'ScalearUtils', 'MarkerModel', '$urlRouter', 'VideoInformation', 'VimeoModel', 'MobileDetector', 'Lecture', 'ErrorHandler',function ($state, $stateParams, $scope, $translate, $log, $rootScope, $timeout, $q, DetailsNavigator, ngDialog, ItemsModel, VideoQuizModel, ScalearUtils, MarkerModel, $urlRouter, VideoInformation, VimeoModel, MobileDetector,Lecture,ErrorHandler) { $scope.lecture = ItemsModel.getLecture($stateParams.lecture_id) ItemsModel.setSelectedItem($scope.lecture) @@ -60,10 +60,10 @@ angular.module('scalearAngularApp') msg: "error_message.got_some_errors" } $scope.hide_alerts = true; - + setUpShortcuts() setUpEventsListeners() - + $scope.lecture_player.events.onMeta = function() { // update duration for all video types. var total_duration = $scope.lecture_player.controls.getDuration() @@ -690,5 +690,5 @@ angular.module('scalearAngularApp') removeShortcuts() listnerDeleteVideo() }) - + }]); diff --git a/app/scripts/controllers/teacher/help/future_ctrl.js b/app/scripts/controllers/teacher/help/future_ctrl.js new file mode 100644 index 000000000..b1b04a181 --- /dev/null +++ b/app/scripts/controllers/teacher/help/future_ctrl.js @@ -0,0 +1,7 @@ +/* istanbul ignore next */ +'use strict'; + +angular.module('scalearAngularApp') + .controller('FutureCtrl', ['$scope', '$location', '$anchorScroll','$rootScope','Page', 'scalear_api','$translate', function ($scope, $location, $anchorScroll, $rootScope,Page, scalear_api, $translate) { + $rootScope.subheader_message = $translate.instant('ScalableLearning Future') + }]); diff --git a/app/scripts/directives/teacher/course_editor/details_directives.js b/app/scripts/directives/teacher/course_editor/details_directives.js index 66b78082a..fa9f79457 100755 --- a/app/scripts/directives/teacher/course_editor/details_directives.js +++ b/app/scripts/directives/teacher/course_editor/details_directives.js @@ -43,10 +43,9 @@ angular.module('scalearAngularApp') }; }]).directive('detailsUrl', ['$timeout', '$translate','$filter','ScalearUtils','$rootScope' ,'$modal',function($timeout, $translate, $filter,ScalearUtils,$modal,$rootScope) { return { - template: '{{ text || "http://" }} '+ - "
or
"+ - "
Drag video here to upload.
", - + template: '{{ text || "http://" }} ', + // "
or
"+ + // "
Drag video here to upload.
", restrict: 'E', scope: { showUploadModal:"&", diff --git a/app/scripts/directives/youtube_directives.js b/app/scripts/directives/youtube_directives.js index 3a175b187..70714b0bc 100755 --- a/app/scripts/directives/youtube_directives.js +++ b/app/scripts/directives/youtube_directives.js @@ -342,7 +342,8 @@ angular.module('scalearAngularApp') if (player_controls.getSpeeds().indexOf(speed) != -1) { player.media.setSpeed(speed) } - } else { + } + else { player.video.playbackRate = speed } diff --git a/app/scripts/externals/popcorn.HTMLVimeoVideoElement.js b/app/scripts/externals/popcorn.HTMLVimeoVideoElement.js index 7cd732b5d..ef58302fd 100644 --- a/app/scripts/externals/popcorn.HTMLVimeoVideoElement.js +++ b/app/scripts/externals/popcorn.HTMLVimeoVideoElement.js @@ -197,7 +197,7 @@ self.dispatchEvent( "canplay" ); self.dispatchEvent( "canplaythrough" ); } - + self.pause = function() { impl.paused = true; if( !playerReady ) { @@ -317,7 +317,7 @@ } } - function onStateChange( event ) { + function onStateChange( event ) { if( event.origin !== VIMEO_HOST ) { return; } @@ -332,9 +332,10 @@ if ( data.player_id != playerUID ) { return; } - + // Methods switch ( data.method ) { + case "getCurrentTime": onCurrentTime( parseFloat( data.value ) ); break; @@ -347,7 +348,8 @@ } // Events - switch ( data.event ) { + switch ( data.event ) { + case "loadProgress": self.dispatchEvent( "progress" ); updateDuration( parseFloat( data.data.duration ) ); diff --git a/app/scripts/init.app.js b/app/scripts/init.app.js index aa70cebee..35fa41cac 100644 --- a/app/scripts/init.app.js +++ b/app/scripts/init.app.js @@ -38,7 +38,7 @@ angular.module('scalearAngularApp') } $log.debug("lang is " + $rootScope.current_lang); - var statesThatDontRequireAuth = ['login', 'teacher_signup', 'student_signup', 'thanks_for_registering', 'forgot_password', 'change_password', 'show_confirmation', 'new_confirmation', 'home', 'privacy', 'faq', 'about', 'ie', 'student_getting_started', 'teacher_getting_started', 'landing', 'signup','lti_course_list'] + var statesThatDontRequireAuth = ['login', 'teacher_signup', 'student_signup', 'thanks_for_registering', 'forgot_password', 'change_password', 'show_confirmation', 'new_confirmation', 'home', 'privacy', 'faq', 'about', 'ie', 'student_getting_started', 'teacher_getting_started', 'landing', 'signup','lti_course_list','future'] var statesThatForStudents = ['course.student_calendar', 'course.course_information', 'course.module.courseware' , 'lti_course_list'] var statesThatForTeachers = ['new_course', 'course.course_editor', 'course.calendar', 'course.enrolled_students', 'send_email', 'send_emails', 'course.announcements', 'course.edit_course_information', 'course.teachers', 'course.progress', 'course.progress.main', 'course.progress.module', 'statistics', 'course.module.course_editor','lti_course_list'] var statesThatRequireNoAuth = ['login', 'student_signup', 'teacher_signup', 'thanks_for_registering', 'new_confirmation', 'forgot_password', 'change_password'] diff --git a/app/scripts/services/course.js b/app/scripts/services/course.js index 552f302e1..646fc19cd 100755 --- a/app/scripts/services/course.js +++ b/app/scripts/services/course.js @@ -33,9 +33,12 @@ angular.module('scalearAngularApp') 'getCourseware': { method: 'GET', params: { action: 'courseware_angular' }, headers: headers }, 'getEnrolledStudents': { method: 'GET', params: { action: 'enrolled_students' }, headers: headers, isArray: true }, 'exportCsv': { method: 'GET', params: { action: 'export_csv' }, headers: headers }, + 'exportStudentCsv': { method: 'GET', params: { action: 'export_student_csv' }, headers: headers }, 'currentCourses': { method: 'GET',isArray: false, headers: headers, params: { action: 'current_courses' } }, - 'exportModuleProgress': { method: 'GET', headers: headers, params: { action: 'export_modules_progress' } }, + 'exportModuleProgress': { method: 'GET', headers: headers, params: { action: 'export_modules_progress' } }, // + 'sendCourseToTeacherMail': { method: 'GET', headers: headers, params: { action: 'send_course_to_mail' } }, // + 'sendCourseTextToTeacherMail': { method: 'GET', headers: headers, params: { action: 'send_course_txt_to_mail' } }, // 'systemWideEmail': { method: 'POST', params: { action: 'send_system_announcement' }, headers: headers }, 'getRole': { method: 'GET', headers: headers, params: { action: 'get_role' } }, }); @@ -254,7 +257,7 @@ angular.module('scalearAngularApp') getAnnouncements: getAnnouncements, getStudentDueDateEmail: getStudentDueDateEmail, updateStudentDueDateEmail: updateStudentDueDateEmail, - updateTeacherDiscussionEmail: updateTeacherDiscussionEmail + updateTeacherDiscussionEmail: updateTeacherDiscussionEmail, }) } diff --git a/app/scripts/services/lecture.js b/app/scripts/services/lecture.js index 0c1b37714..8dd3bfb18 100755 --- a/app/scripts/services/lecture.js +++ b/app/scripts/services/lecture.js @@ -36,7 +36,8 @@ angular.module('scalearAngularApp') "checkIfInDistancePeerSession": { method: 'GET', ignoreLoadingBar: true, params: { action: 'check_if_in_distance_peer_session' }, headers: headers }, "changeStatusDistancePeer": { method: 'GET', ignoreLoadingBar: true, params: { action: 'change_status_distance_peer' }, headers: headers }, "checkIfDistancePeerStatusIsSync": { method: 'GET', ignoreLoadingBar: true, params: { action: 'check_if_distance_peer_status_is_sync' }, headers: headers }, - "checkIfDistancePeerIsAlive": { method: 'GET', ignoreLoadingBar: true, params: { action: 'check_if_distance_peer_is_alive' }, headers: headers } + "checkIfDistancePeerIsAlive": { method: 'GET', ignoreLoadingBar: true, params: { action: 'check_if_distance_peer_is_alive' }, headers: headers }, + "exportLectureToFeedbackFruit":{ method: 'POST', ignoreLoadingBar: true, params: { action: 'export_lecture_to_feedbackfruit' }, headers: headers } }); }]).factory("LectureModel", ['Lecture', '$rootScope', 'VideoInformation', '$translate', 'Timeline', 'ScalearUtils', '$q', 'ModuleModel', function (Lecture, $rootScope, VideoInformation, $translate, Timeline, ScalearUtils, $q, ModuleModel) { @@ -345,7 +346,17 @@ angular.module('scalearAngularApp') destroy: destroy }) } - + // function exportLectureFBF(){ + // return Lecture.exportLectureToFeedbackFruit({ + // course_id:1, + // lecture_id:2 + // }) + // .$promise + // .then(function (data) { + // console.log(data) + // return true + // }) + // } return { createInstance: createInstance, isInstance: isInstance, @@ -354,6 +365,7 @@ angular.module('scalearAngularApp') setSelectedLecture: setSelectedLecture, create: create, paste: paste + // exportLectureFBF:exportLectureFBF } }]) diff --git a/app/styles/foundation.css b/app/styles/foundation.css index 8801fef39..18d3f0aea 100755 --- a/app/styles/foundation.css +++ b/app/styles/foundation.css @@ -6219,4 +6219,46 @@ th.hide-for-touch { th.show-for-print { display: table-cell !important; } } - + @media only screen and (max-width: 40.063em) { + #banner_content{ + background-color: #d7270a; + color: white; + font-size: 11px; + padding: 0.5%; + padding-right: 1%; + padding-left: 1%; + padding-right: 7%!important; + text-align: justify; + position: relative; + margin-top: 2%; + z-index: 10; + } + #close_banner{ + color: white; + position: absolute; + right: 1%; + top: 0%!important; + z-index: 10; + } + } +#banner_container{ +position: relative; +} +#banner_content{ + background-color: #d7270a; + color: white; + font-weight: normal; + font-size: 14px; + padding: 0.5%; + padding-right: 1%; + padding-left: 1%; + padding-right: 4%; + text-align: center; + position: relative; +} +#close_banner{ + color: white; + position: absolute; + right: 1%; + top: 12%; +} \ No newline at end of file diff --git a/app/styles/main-foundation.css b/app/styles/main-foundation.css index 1c9429323..3f3eea146 100755 --- a/app/styles/main-foundation.css +++ b/app/styles/main-foundation.css @@ -3148,4 +3148,8 @@ dd#second_accordion > a:hover{ margin: 0 auto; position: absolute; pointer-events: none; -} \ No newline at end of file +} +#export_button_2_fbf{ + margin: auto; + /* width: -webkit-fill-available; */ +} diff --git a/app/views/future.html b/app/views/future.html new file mode 100644 index 000000000..f5af496f7 --- /dev/null +++ b/app/views/future.html @@ -0,0 +1,58 @@ +
+

ScalableLearning Shutting Down in 2020

+

While we continue to look for ways to keep ScalableLearning going for the future, our current plans are to + shut down ScalableLearning at the end of 2020. To help our users, we are building + two paths for you to export your courses from ScalableLearning: migrating your videos to the FeedbackFruits + Interactive Video Tool or exporting your whole course to Canvas or Blackboard.

+ +

No course data or student data will be migrated or exported without your explicit action.

+ +

Option 1: Export to FeedbackFruits Interactive Video Tool +
+ FeedbackFruits is an international + company based in the Netherlands whose mission is to support teachers to create engaging learning activities + that spark active thinking. FeedbackFruits provides a suite of pedagogical tools to over 35 institutions around the + world. FeedbackFruits will provide free use of their Interactive Video Tool for ScalableLearning Teachers and an + automatic migration tool. This will allow you to continue using quizzes and student discussions in your videos. + The Interactive Video Tool can be used either as a stand-alone tool or embedded in your institution’s LMS. +

+ +

+ →To export individual videos to FeedbackFruits Interactive Video Tool simply click on the “Export Video to + FeedbackFruits” under “Details” for each video and you will receive an email with further instructions. +

+

If you would like to learn more about Interactive Videos in Canvas or Blackboard please watch the videos below. + You + can also contact FeedbackFruits directly at +
helpme@feedbackfruits.com for assistance. +
Exporting from ScalableLearning to FeedbackFruits: +
For Canvas:https://youtu.be/6kgwXf_V3hw?t=318 +
For Blackboard:https://youtu.be/pk3pl-QdNjc?t=292 +

+

Option 2: Export to Canvas or Blackboard +
+ We will also provide the option to export your course to the Canvas or Blackboard LMSs. This will allow you to + import your course structure (modules and videos) into either a free Canvas instance or your institution’s own + Canvas/Blackboard LMS. However, as neither natively support quizzes in videos, the export tool will split up + your videos at each quiz. This will require that students click the “next” button to take the quizzes and continue + the video (We are working on a version that will export embedded FeedbackFruits videos to overcome this limitation and will provide it as soon as it is ready). +

+

+ → To export your course, simply click on “Export Course to Canvas” on the “Administration” page for your + course. You will then receive an email with the exported course and instructions for how to import it into + Canvas. Currently exporting directly to Blackboard is not supported, and you will need to first export to + Canvas, then import your course into a free Canvas instance, and finally export it from Canvas to Blackboard. We + hope to simplify this in the future. +

+
+

We understand that neither of these paths provide the full online/in-class experience that ScalableLearning + provides, but we are confident that they will allow you to continue teaching with the material you have + built up in ScalableLearning. +

+ +

If you have any questions or concerns please get in touch through the Support link in the Help menu.

+

Sincerely,

+

-The ScalableLearning Team

+ +

+
\ No newline at end of file diff --git a/app/views/main.html b/app/views/main.html index f8a93b5aa..cf87b5d2e 100755 --- a/app/views/main.html +++ b/app/views/main.html @@ -49,6 +49,18 @@
+
diff --git a/app/views/teacher/course/course_information.html b/app/views/teacher/course/course_information.html index 992d0f69b..821e37b01 100755 --- a/app/views/teacher/course/course_information.html +++ b/app/views/teacher/course/course_information.html @@ -155,6 +155,9 @@

+ + +