Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion www/addons/mod_folder/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

angular.module('mm.addons.mod_folder', ['mm.core'])

.constant('mmaModFolderComponent', 'mmaModFolder')

.config(function($stateProvider) {

$stateProvider
Expand All @@ -36,6 +38,7 @@ angular.module('mm.addons.mod_folder', ['mm.core'])

})

.config(function($mmCourseDelegateProvider) {
.config(function($mmCourseDelegateProvider, $mmCoursePrefetchDelegateProvider) {
$mmCourseDelegateProvider.registerContentHandler('mmaModFolder', 'folder', '$mmaModFolderCourseContentHandler');
$mmCoursePrefetchDelegateProvider.registerPrefetchHandler('mmaModFolder', 'folder', '$mmaModFolderPrefetchHandler');
});
60 changes: 59 additions & 1 deletion www/addons/mod_folder/services/course_content_handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ angular.module('mm.addons.mod_folder')
* @ngdoc service
* @name $mmaModFolderCourseContentHandler
*/
.factory('$mmaModFolderCourseContentHandler', function($mmCourse, $mmaModFolder, $state) {
.factory('$mmaModFolderCourseContentHandler', function($mmCourse, $mmaModFolder, $mmEvents, $state, $mmSite, $mmUtil, $mmFilepool,
$mmCoursePrefetchDelegate, mmCoreDownloading, mmCoreNotDownloaded, mmCoreOutdated, mmCoreEventPackageStatusChanged,
mmaModFolderComponent) {
var self = {};

/**
Expand Down Expand Up @@ -49,11 +51,67 @@ angular.module('mm.addons.mod_folder')
*/
self.getController = function(module, courseid, sectionid) {
return function($scope) {
var downloadBtn,
refreshBtn,
revision = $mmFilepool.getRevisionFromFileList(module.contents),
timemodified = $mmFilepool.getTimemodifiedFromFileList(module.contents);

// Prefetch folder contents.
function prefetchFolder(e) {
e.preventDefault();
e.stopPropagation();
$mmaModFolder.prefetchContent(module).catch(function() {
$mmUtil.showErrorModal('mm.core.errordownloading', true);
});
}

downloadBtn = {
hidden: true,
icon: 'ion-ios-cloud-download',
label: 'mm.core.download',
action: prefetchFolder
};

refreshBtn = {
hidden: true,
icon: 'ion-android-refresh',
label: 'mm.core.refresh',
action: prefetchFolder
};

$scope.icon = $mmCourse.getModuleIconSrc('folder');
$scope.title = module.name;
$scope.buttons = [downloadBtn, refreshBtn];
$scope.spinner = false;

$scope.action = function(e) {
e.preventDefault();
e.stopPropagation();
$state.go('site.mod_folder', {module: module, courseid: courseid, sectionid: sectionid});
};

// Show buttons according to module status.
function showStatus(status) {
if (status) {
$scope.spinner = status === mmCoreDownloading;
downloadBtn.hidden = status !== mmCoreNotDownloaded;
refreshBtn.hidden = status !== mmCoreOutdated;
}
}

// Listen for changes on this module status.
var statusObserver = $mmEvents.on(mmCoreEventPackageStatusChanged, function(data) {
if (data.siteid === $mmSite.getId() && data.componentId === module.id && data.component === mmaModFolderComponent) {
showStatus(data.status);
}
});

// Get current status to decide which icon should be shown.
$mmCoursePrefetchDelegate.getModuleStatus(module, revision, timemodified).then(showStatus);

$scope.$on('$destroy', function() {
statusObserver && statusObserver.off && statusObserver.off();
});
};
};

Expand Down
72 changes: 70 additions & 2 deletions www/addons/mod_folder/services/folder.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,32 @@ angular.module('mm.addons.mod_folder')
* @module mm.addons.mod_folder
* @ngdoc service
* @name $mmaModFolder
* @todo Adding a new file in a folder updates the revision of all the files, so they're all shown as outdated.
* To ignore revision in folders we'll have to modify $mmCoursePrefetchDelegate, mm-file and $mmFilepool.
*/
.factory('$mmaModFolder', function($mmSite, $mmUtil, $mmCourse, $q) {
.factory('$mmaModFolder', function($mmSite, $mmCourse, $q, $mmFilepool, mmaModFolderComponent) {
var self = {};

/**
* Download all the content.
*
* @module mm.addons.mod_folder
* @ngdoc method
* @name $mmaModFolder#downloadAllContent
* @param {Object} module The module object.
* @return {Promise} Promise resolved when all content is downloaded. Data returned is not reliable.
*/
self.downloadAllContent = function(module) {
var files = self.getDownloadableFiles(module),
revision = $mmFilepool.getRevisionFromFileList(module.contents),
timemod = $mmFilepool.getTimemodifiedFromFileList(module.contents);
return $mmFilepool.downloadPackage($mmSite.getId(), files, mmaModFolderComponent, module.id, revision, timemod);
};

/**
* Format folder contents, creating directory structure.
*
* @module mm.addons.mod_url
* @module mm.addons.mod_folder
* @ngdoc method
* @name $mmaModFolder#formatContents
* @param {Object[]} contents Folder contents.
Expand Down Expand Up @@ -94,6 +112,40 @@ angular.module('mm.addons.mod_folder')
return folders.concat(files);
};

/**
* Returns a list of files that can be downloaded.
*
* @module mm.addons.mod_folder
* @ngdoc method
* @name $mmaModFolder#getDownloadableFiles
* @param {Object} module The module object returned by WS.
* @return {Object[]} List of files.
*/
self.getDownloadableFiles = function(module) {
var files = [];

angular.forEach(module.contents, function(content) {
if (self.isFileDownloadable(content)) {
files.push(content);
}
});

return files;
};

/**
* Check if a file is downloadable. The file param must have a 'type' attribute like in core_course_get_contents response.
*
* @module mm.addons.mod_folder
* @ngdoc method
* @name $mmaModFolder#isFileDownloadable
* @param {Object} file File to check.
* @return {Boolean} True if downloadable, false otherwise.
*/
self.isFileDownloadable = function(file) {
return file.type === 'file';
};

/**
* Report a folder as being viewed.
*
Expand All @@ -113,5 +165,21 @@ angular.module('mm.addons.mod_folder')
return $q.reject();
};

/**
* Prefetch the content.
*
* @module mm.addons.mod_folder
* @ngdoc method
* @name $mmaModFolder#prefetchContent
* @param {Object} module The module object.
* @return {Promise} Promise resolved when all content is downloaded. Data returned is not reliable.
*/
self.prefetchContent = function(module) {
var files = self.getDownloadableFiles(module),
revision = $mmFilepool.getRevisionFromFileList(module.contents),
timemod = $mmFilepool.getTimemodifiedFromFileList(module.contents);
return $mmFilepool.prefetchPackage($mmSite.getId(), files, mmaModFolderComponent, module.id, revision, timemod);
};

return self;
});
75 changes: 75 additions & 0 deletions www/addons/mod_folder/services/prefetch_handler.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// (C) Copyright 2015 Martin Dougiamas
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

angular.module('mm.addons.mod_folder')

/**
* Mod folder prefetch handler.
*
* @module mm.addons.mod_folder
* @ngdoc service
* @name $mmaModFolderPrefetchHandler
*/
.factory('$mmaModFolderPrefetchHandler', function($mmaModFolder, $mmSite, mmaModFolderComponent) {

var self = {};

self.component = mmaModFolderComponent;

/**
* Get the download size of a module.
*
* @module mm.addons.mod_folder
* @ngdoc method
* @name $mmaModFolderPrefetchHandler#getDownloadSize
* @param {Object} module Module to get the size.
* @return {Number} Size.
*/
self.getDownloadSize = function(module) {
var size = 0;
angular.forEach(module.contents, function(content) {
if ($mmaModFolder.isFileDownloadable(content) && content.filesize) {
size = size + content.filesize;
}
});
return size;
};

/**
* Whether or not the module is enabled for the site.
*
* @module mm.addons.mod_folder
* @ngdoc method
* @name $mmaModFolderPrefetchHandler#isEnabled
* @return {Boolean}
*/
self.isEnabled = function() {
return true;
};

/**
* Prefetch the module.
*
* @module mm.addons.mod_folder
* @ngdoc method
* @name $mmaModFolderPrefetchHandler#prefetch
* @param {Object} module The module object returned by WS.
* @return {Promise} Promise resolved when all files have been downloaded. Data returned is not reliable.
*/
self.prefetch = function(module) {
return $mmaModFolder.prefetchContent(module);
};

return self;
});
5 changes: 5 additions & 0 deletions www/core/components/course/services/prefetchdelegate.js
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,11 @@ angular.module('mm.core')
if (handler.getFiles) { // If the handler defines its own function to determine the files, use it.
files = handler.getFiles(module);
}

if (files.length === 0) { // No files, treat is as downloaded.
return $q.when(mmCoreDownloaded);
}

revision = revision || $mmFilepool.getRevisionFromFileList(files);
timemodified = timemodified || $mmFilepool.getTimemodifiedFromFileList(files);

Expand Down