// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Javascript to initialise the Recently accessed items block.
*
* @module block_recentlyaccesseditems/main
* @copyright 2018 Victor Deniz <victor@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(
[
'jquery',
'block_recentlyaccesseditems/repository',
'core/templates',
'core/notification'
],
function(
$,
Repository,
Templates,
Notification
) {
var NUM_ITEMS = 9;
// Maximum number of elements to display in the block initially.
var NUM_ITEMS_INIT = 3;
var SELECTORS = {
CARDDECK_CONTAINER: '[data-region="recentlyaccesseditems-view"]',
CARDDECK: '[data-region="recentlyaccesseditems-view-content"]',
SHOWMORE_LINK: '[data-region="recentlyaccesseditems-view"] [data-action="more-items"]',
};
/**
* Register event listeners.
*/
const registerEventListeners = () => {
const showmoreLink = document.querySelector(SELECTORS.SHOWMORE_LINK);
// Hide "Show more" link and show additional items.
showmoreLink.addEventListener('click', () => {
showmoreLink.classList.add('d-none');
const hiddenItems = document.querySelector('[data-region="items-list"]').children;
for (const hiddenItem of hiddenItems) {
hiddenItem.style = "display: block";
}
});
};
/**
* Get recent items from backend.
*
* @method getRecentItems
* @param {int} limit Only return this many results
* @return {array} Items user most recently has accessed
*/
var getRecentItems = function(limit) {
return Repository.getRecentItems(limit);
};
/**
* Render the block content.
*
* @method renderItems
* @param {object} root The root element for the items view.
* @param {array} items containing array of returned items.
* @return {promise} Resolved with HTML and JS strings
*/
var renderItems = function(root, items) {
if (items.length > 0) {
let hasmoreitems = false;
if (items.length > NUM_ITEMS_INIT) {
hasmoreitems = true;
}
return Templates.render('block_recentlyaccesseditems/view-cards', {
items: items,
hasmoreitems: hasmoreitems
});
} else {
var noitemsimgurl = root.attr('data-noitemsimgurl');
return Templates.render('block_recentlyaccesseditems/no-items', {
noitemsimgurl: noitemsimgurl
});
}
};
/**
* Get and show the recent items into the block.
*
* @param {object} root The root element for the items block.
*/
var init = function(root) {
root = $(root);
var itemsContainer = root.find(SELECTORS.CARDDECK_CONTAINER);
var itemsContent = root.find(SELECTORS.CARDDECK);
var itemsPromise = getRecentItems(NUM_ITEMS);
itemsPromise.then(function(items) {
var pageContentPromise = renderItems(itemsContainer, items);
pageContentPromise.then(function(html, js) {
Templates.replaceNodeContents(itemsContent, html, js);
if (items.length > 3) {
registerEventListeners();
}
return null;
}).catch(Notification.exception);
}).catch(Notification.exception);
};
return {
init: init
};
});