202 lines
5.4 KiB
JavaScript
202 lines
5.4 KiB
JavaScript
/**
|
|
* @file js/classes/features/OrderCategoryGridItemsFeature.js
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class OrderCategoryGridItemsFeature
|
|
* @ingroup js_classes_features
|
|
*
|
|
* @brief Feature for ordering category grid items.
|
|
*/
|
|
(function($) {
|
|
|
|
|
|
/**
|
|
* @constructor
|
|
* @inheritDoc
|
|
* @extends $.pkp.classes.features.OrderGridItemsFeature
|
|
*/
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature =
|
|
function(gridHandler, options) {
|
|
this.parent(gridHandler, options);
|
|
};
|
|
$.pkp.classes.Helper.inherits(
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature,
|
|
$.pkp.classes.features.OrderGridItemsFeature);
|
|
|
|
|
|
//
|
|
// Extended methods from OrderItemsFeature.
|
|
//
|
|
/**
|
|
* Setup the sortable plugin.
|
|
*/
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature.prototype.
|
|
setupSortablePlugin = function() {
|
|
|
|
var $categories, index, limit, $category, userAgent;
|
|
|
|
this.applySortPlgOnElements(
|
|
this.getGridHtmlElement(), 'tbody.orderable', null);
|
|
|
|
// FIXME *7610*: IE8 can't handle well ordering in both categories and
|
|
// category rows.
|
|
userAgent = navigator.userAgent.toLowerCase();
|
|
if (/msie/.test(userAgent) &&
|
|
parseInt(userAgent.substr(userAgent.indexOf('msie') + 5, 1), 10) <= 8) {
|
|
return;
|
|
}
|
|
|
|
$categories = this.gridHandler.getCategories();
|
|
for (index = 0, limit = $categories.length; index < limit; index++) {
|
|
$category = $($categories[index]);
|
|
this.applySortPlgOnElements($category, 'tr.orderable', null);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature.prototype.
|
|
saveOrderHandler = function() {
|
|
this.gridHandler.updateEmptyPlaceholderPosition();
|
|
this.parent('saveOrderHandler');
|
|
|
|
return false;
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature.prototype.
|
|
cancelOrderHandler = function() {
|
|
|
|
var categorySequence = this.getCategorySequence_(this.itemsOrder);
|
|
this.parent('cancelOrderHandler');
|
|
this.gridHandler.resequenceCategories(categorySequence);
|
|
|
|
return false;
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature.prototype.
|
|
toggleItemsDragMode = function() {
|
|
this.parent('toggleItemsDragMode');
|
|
|
|
var isOrdering = this.isOrdering,
|
|
$categories = this.gridHandler.getCategories(),
|
|
index, limit, $category;
|
|
|
|
for (index = 0, limit = $categories.length; index < limit; index++) {
|
|
$category = $($categories[index]);
|
|
this.toggleCategoryDragMode_($category);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature.prototype.
|
|
addOrderingClassToRows = function() {
|
|
|
|
var options = this.getOptions(),
|
|
type = parseInt(options.type, 10), $categories;
|
|
|
|
if (type == $.pkp.cons.ORDER_CATEGORY_GRID_CATEGORIES_ONLY ||
|
|
type == $.pkp.cons.ORDER_CATEGORY_GRID_CATEGORIES_AND_ROWS) {
|
|
$categories = this.gridHandler.getCategories();
|
|
$categories.addClass('orderable');
|
|
}
|
|
|
|
if (type == $.pkp.cons.ORDER_CATEGORY_GRID_CATEGORIES_ROWS_ONLY ||
|
|
type == $.pkp.cons.ORDER_CATEGORY_GRID_CATEGORIES_AND_ROWS) {
|
|
this.parent('addOrderingClassToRows');
|
|
}
|
|
|
|
// We don't want to order category rows tr elements, so
|
|
// remove any style that might be added by calling parent.
|
|
this.gridHandler.getCategoryRow().removeClass('orderable');
|
|
};
|
|
|
|
|
|
//
|
|
// Overriden method from OrderGridItemsFeature
|
|
//
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature.prototype.getItemsDataId =
|
|
function() {
|
|
var categoriesSeq = this.getCategorySequence_(this.itemsOrder),
|
|
itemsDataId = [],
|
|
index, limit,
|
|
$category, categoryRowsDataId, categoryDataId;
|
|
|
|
for (index = 0, limit = categoriesSeq.length; index < limit; index++) {
|
|
$category = $('#' + categoriesSeq[index]);
|
|
categoryRowsDataId = this.getRowsDataId($category);
|
|
categoryDataId = this.gridHandler.getCategoryDataId($category);
|
|
itemsDataId.push(
|
|
{'categoryId': categoryDataId, 'rowsId': categoryRowsDataId });
|
|
}
|
|
|
|
return itemsDataId;
|
|
};
|
|
|
|
|
|
//
|
|
// Private helper methods.
|
|
//
|
|
/**
|
|
* Enable/disable category drag mode.
|
|
* @param {jQueryObject} $category Category to set mode on.
|
|
* @private
|
|
*/
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature.prototype.
|
|
toggleCategoryDragMode_ = function($category) {
|
|
var isOrdering = this.isOrdering,
|
|
$categoryRow = this.gridHandler.getCategoryRow($category),
|
|
$categoryRowColumn = $('td:first', $categoryRow),
|
|
moveClasses = this.getMoveItemClasses();
|
|
|
|
if (isOrdering) {
|
|
$categoryRowColumn.addClass(moveClasses);
|
|
} else {
|
|
$categoryRowColumn.removeClass(moveClasses);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Get the categories sequence, based on the passed items order.
|
|
* @param {Array} itemsOrder Items order.
|
|
* @return {Array} A sequence array with the category data id as values.
|
|
* @private
|
|
*/
|
|
$.pkp.classes.features.OrderCategoryGridItemsFeature.prototype.
|
|
getCategorySequence_ = function(itemsOrder) {
|
|
var index, limit, categorySequence = [], categoryDataId, categoryId;
|
|
for (index = 0, limit = itemsOrder.length; index < limit; index++) {
|
|
categoryDataId = this.gridHandler
|
|
.getCategoryDataIdByRowId(itemsOrder[index]);
|
|
categoryId = this.gridHandler.getCategoryIdPrefix() + categoryDataId;
|
|
if ($.inArray(categoryId, categorySequence) > -1) {
|
|
continue;
|
|
}
|
|
categorySequence.push(categoryId);
|
|
}
|
|
|
|
return categorySequence;
|
|
};
|
|
|
|
|
|
}(jQuery));
|