Current Path : C:/xampp/htdocs/moodle/course/yui/src/management/js/ |
Current File : C:/xampp/htdocs/moodle/course/yui/src/management/js/console.js |
/** * 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); };