AutorÃa | Ultima modificación | Ver Log |
/**
* Provides drop down menus for list of action links.
*
* @module moodle-course-management
*/
/**
* Management JS console.
*
* Provides the organisation for course and category management JS.
*
* @namespace M.course.management
* @class Console
* @constructor
* @extends Base
*/
Console = function() {
Console.superclass.constructor.apply(this, arguments);
};
Console.NAME = 'moodle-course-management';
Console.CSS_PREFIX = 'management';
Console.ATTRS = {
/**
* The HTML element containing the management interface.
* @attribute element
* @type Node
*/
element: {
setter: function(node) {
if (typeof node === 'string') {
node = Y.one('#' + node);
}
return node;
}
},
/**
* The category listing container node.
* @attribute categorylisting
* @type Node
* @default null
*/
categorylisting: {
value: null
},
/**
* The course listing container node.
* @attribute courselisting
* @type Node
* @default null
*/
courselisting: {
value: null
},
/**
* The course details container node.
* @attribute coursedetails
* @type Node|null
* @default null
*/
coursedetails: {
value: null
},
/**
* The id of the currently active category.
* @attribute activecategoryid
* @type Number
* @default null
*/
activecategoryid: {
value: null
},
/**
* The id of the currently active course.
* @attribute activecourseid
* @type Number
* @default Null
*/
activecourseid: {
value: null
},
/**
* The categories that are currently available through the management interface.
* @attribute categories
* @type Array
* @default []
*/
categories: {
setter: function(item, name) {
if (Y.Lang.isArray(item)) {
return item;
}
var items = this.get(name);
items.push(item);
return items;
},
value: []
},
/**
* The courses that are currently available through the management interface.
* @attribute courses
* @type Course[]
* @default Array
*/
courses: {
validator: function(val) {
return Y.Lang.isArray(val);
},
value: []
},
/**
* The currently displayed page of courses.
* @attribute page
* @type Number
* @default null
*/
page: {
getter: function(value, name) {
if (value === null) {
value = this.get('element').getData(name);
this.set(name, value);
}
return value;
},
value: null
},
/**
* The total pages of courses that can be shown for this category.
* @attribute totalpages
* @type Number
* @default null
*/
totalpages: {
getter: function(value, name) {
if (value === null) {
value = this.get('element').getData(name);
this.set(name, value);
}
return value;
},
value: null
},
/**
* The total number of courses belonging to this category.
* @attribute totalcourses
* @type Number
* @default null
*/
totalcourses: {
getter: function(value, name) {
if (value === null) {
value = this.get('element').getData(name);
this.set(name, value);
}
return value;
},
value: null
},
/**
* The URL to use for AJAX actions/requests.
* @attribute ajaxurl
* @type String
* @default /course/ajax/management.php
*/
ajaxurl: {
getter: function(value) {
if (value === null) {
value = M.cfg.wwwroot + '/course/ajax/management.php';
}
return value;
},
value: null
},
/**
* The drag drop handler
* @attribute dragdrop
* @type DragDrop
* @default null
*/
dragdrop: {
value: null
}
};
Console.prototype = {
/**
* Gets set to true once the first categories have been initialised.
* @property categoriesinit
* @private
* @type {boolean}
*/
categoriesinit: false,
/**
* Initialises a new instance of the Console.
* @method initializer
*/
initializer: function() {
Y.log('Initialising course category management console', 'info', 'moodle-course-management');
this.set('element', 'coursecat-management');
var element = this.get('element'),
categorylisting = element.one('#category-listing'),
courselisting = element.one('#course-listing'),
selectedcategory = null,
selectedcourse = null;
if (categorylisting) {
selectedcategory = categorylisting.one('.listitem[data-selected="1"]');
}
if (courselisting) {
selectedcourse = courselisting.one('.listitem[data-selected="1"]');
}
this.set('categorylisting', categorylisting);
this.set('courselisting', courselisting);
this.set('coursedetails', element.one('#course-detail'));
if (selectedcategory) {
this.set('activecategoryid', selectedcategory.getData('id'));
}
if (selectedcourse) {
this.set('activecourseid', selectedcourse.getData('id'));
}
this.initialiseCategories(categorylisting);
this.initialiseCourses();
if (courselisting) {
// No need for dragdrop if we don't have a course listing.
this.set('dragdrop', new DragDrop({console: this}));
}
},
/**
* Initialises all the categories being shown.
* @method initialiseCategories
* @private
* @return {boolean}
*/
initialiseCategories: function(listing) {
var count = 0;
if (!listing) {
return false;
}
// Disable category bulk actions as nothing will be selected on initialise.
var menumovecatto = listing.one('#menumovecategoriesto');
if (menumovecatto) {
menumovecatto.setAttribute('disabled', true);
}
var menuresortcategoriesby = listing.one('#menuresortcategoriesby');
if (menuresortcategoriesby) {
menuresortcategoriesby.setAttribute('disabled', true);
}
var menuresortcoursesby = listing.one('#menuresortcoursesby');
if (menuresortcoursesby) {
menuresortcoursesby.setAttribute('disabled', true);
}
listing.all('.listitem[data-id]').each(function(node) {
this.set('categories', new Category({
node: node,
console: this
}));
count++;
}, this);
if (!this.categoriesinit) {
this.get('categorylisting').delegate('click', this.handleCategoryDelegation, 'a[data-action]', this);
this.get('categorylisting').delegate('click', this.handleCategoryDelegation, 'input[name="bcat[]"]', this);
this.get('categorylisting').delegate('change', this.handleBulkSortByaction, '#menuselectsortby', this);
this.categoriesinit = true;
Y.log(count + ' categories being managed', 'info', 'moodle-course-management');
} else {
Y.log(count + ' new categories being managed', 'info', 'moodle-course-management');
}
},
/**
* Initialises all the categories being shown.
* @method initialiseCourses
* @private
* @return {boolean}
*/
initialiseCourses: function() {
var category = this.getCategoryById(this.get('activecategoryid')),
listing = this.get('courselisting'),
count = 0;
if (!listing) {
return false;
}
// Disable course move to bulk action as nothing will be selected on initialise.
var menumovecoursesto = listing.one('#menumovecoursesto');
if (menumovecoursesto) {
menumovecoursesto.setAttribute('disabled', true);
}
listing.all('.listitem[data-id]').each(function(node) {
this.registerCourse(new Course({
node: node,
console: this,
category: category
}));
count++;
}, this);
listing.delegate('click', this.handleCourseDelegation, 'a[data-action]', this);
listing.delegate('click', this.handleCourseDelegation, 'input[name="bc[]"]', this);
Y.log(count + ' courses being managed', 'info', 'moodle-course-management');
},
/**
* Registers a course within the management display.
* @method registerCourse
* @param {Course} course
*/
registerCourse: function(course) {
var courses = this.get('courses');
courses.push(course);
this.set('courses', courses);
},
/**
* Handles the event fired by a delegated course listener.
*
* @method handleCourseDelegation
* @protected
* @param {EventFacade} e
*/
handleCourseDelegation: function(e) {
var target = e.currentTarget,
action = target.getData('action'),
courseid = target.ancestor('.listitem').getData('id'),
course = this.getCourseById(courseid);
if (course) {
course.handle(action, e);
} else {
Y.log('Course with ID ' + courseid + ' could not be found for delegation', 'error', 'moodle-course-management');
}
},
/**
* Handles the event fired by a delegated course listener.
*
* @method handleCategoryDelegation
* @protected
* @param {EventFacade} e
*/
handleCategoryDelegation: function(e) {
var target = e.currentTarget,
action = target.getData('action'),
categoryid = target.ancestor('.listitem').getData('id'),
category = this.getCategoryById(categoryid);
if (category) {
category.handle(action, e);
} else {
Y.log('Could not find category to delegate to.', 'error', 'moodle-course-management');
}
},
/**
* Check if any course is selected.
*
* @method isCourseSelected
* @param {Node} checkboxnode Checkbox node on which action happened.
* @return bool
*/
isCourseSelected: function(checkboxnode) {
var selected = false;
// If any course selected then show move to category select box.
if (checkboxnode && checkboxnode.get('checked')) {
selected = true;
} else {
var i,
course,
courses = this.get('courses'),
length = courses.length;
for (i = 0; i < length; i++) {
if (courses.hasOwnProperty(i)) {
course = courses[i];
if (course.get('node').one('input[name="bc[]"]').get('checked')) {
selected = true;
break;
}
}
}
}
return selected;
},
/**
* Check if any category is selected.
*
* @method isCategorySelected
* @param {Node} checkboxnode Checkbox node on which action happened.
* @return bool
*/
isCategorySelected: function(checkboxnode) {
var selected = false;
// If any category selected then show move to category select box.
if (checkboxnode && checkboxnode.get('checked')) {
selected = true;
} else {
var i,
category,
categories = this.get('categories'),
length = categories.length;
for (i = 0; i < length; i++) {
if (categories.hasOwnProperty(i)) {
category = categories[i];
if (category.get('node').one('input[name="bcat[]"]').get('checked')) {
selected = true;
break;
}
}
}
}
return selected;
},
/**
* Handle bulk sort action.
*
* @method handleBulkSortByaction
* @protected
* @param {EventFacade} e
*/
handleBulkSortByaction: function(e) {
var sortcategoryby = this.get('categorylisting').one('#menuresortcategoriesby'),
sortcourseby = this.get('categorylisting').one('#menuresortcoursesby'),
sortbybutton = this.get('categorylisting').one('input[name="bulksort"]'),
sortby = e;
if (!sortby) {
sortby = this.get('categorylisting').one('#menuselectsortby');
} else {
if (e && e.currentTarget) {
sortby = e.currentTarget;
}
}
// If no sortby select found then return as we can't do anything.
if (!sortby) {
return;
}
if ((this.get('categories').length <= 1) || (!this.isCategorySelected() &&
(sortby.get("options").item(sortby.get('selectedIndex')).getAttribute('value') === 'selectedcategories'))) {
if (sortcategoryby) {
sortcategoryby.setAttribute('disabled', true);
}
if (sortcourseby) {
sortcourseby.setAttribute('disabled', true);
}
if (sortbybutton) {
sortbybutton.setAttribute('disabled', true);
}
} else {
if (sortcategoryby) {
sortcategoryby.removeAttribute('disabled');
}
if (sortcourseby) {
sortcourseby.removeAttribute('disabled');
}
if (sortbybutton) {
sortbybutton.removeAttribute('disabled');
}
}
},
/**
* Returns the category with the given ID.
* @method getCategoryById
* @param {Number} id
* @return {Category|Boolean} The category or false if it can't be found.
*/
getCategoryById: function(id) {
var i,
category,
categories = this.get('categories'),
length = categories.length;
for (i = 0; i < length; i++) {
if (categories.hasOwnProperty(i)) {
category = categories[i];
if (category.get('categoryid') === id) {
return category;
}
}
}
return false;
},
/**
* Returns the course with the given id.
* @method getCourseById
* @param {Number} id
* @return {Course|Boolean} The course or false if not found/
*/
getCourseById: function(id) {
var i,
course,
courses = this.get('courses'),
length = courses.length;
for (i = 0; i < length; i++) {
if (courses.hasOwnProperty(i)) {
course = courses[i];
if (course.get('courseid') === id) {
return course;
}
}
}
return false;
},
/**
* Removes the course with the given ID.
* @method removeCourseById
* @param {Number} id
*/
removeCourseById: function(id) {
var courses = this.get('courses'),
length = courses.length,
course,
i;
for (i = 0; i < length; i++) {
course = courses[i];
if (course.get('courseid') === id) {
courses.splice(i, 1);
break;
}
}
},
/**
* Performs an AJAX action.
*
* @method performAjaxAction
* @param {String} action The action to perform.
* @param {Object} args The arguments to pass through with teh request.
* @param {Function} callback The function to call when all is done.
* @param {Object} context The object to use as the context for the callback.
*/
performAjaxAction: function(action, args, callback, context) {
var io = new Y.IO();
args.action = action;
args.ajax = '1';
args.sesskey = M.cfg.sesskey;
if (callback === null) {
callback = function() {
Y.log("'Action '" + action + "' completed", 'debug', 'moodle-course-management');
};
}
io.send(this.get('ajaxurl'), {
method: 'POST',
on: {
complete: callback
},
context: context,
data: args,
'arguments': args
});
}
};
Y.extend(Console, Y.Base, Console.prototype);
M.course = M.course || {};
M.course.management = M.course.management || {};
M.course.management.console = null;
/**
* Initalises the course management console.
*
* @method M.course.management.init
* @static
* @param {Object} config
*/
M.course.management.init = function(config) {
M.course.management.console = new Console(config);
};