221 lines
5.0 KiB
JavaScript
221 lines
5.0 KiB
JavaScript
/**
|
|
* @file js/classes/features/OrderListbuilderItemsFeature.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 OrderListbuilderItemsFeature
|
|
* @ingroup js_classes_features
|
|
*
|
|
* @brief Feature for ordering grid items.
|
|
*/
|
|
(function($) {
|
|
|
|
|
|
/**
|
|
* @constructor
|
|
* @inheritDoc
|
|
* @extends $.pkp.classes.features.OrderItemsFeature
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature =
|
|
function(gridHandler, options) {
|
|
this.parent(gridHandler, options);
|
|
};
|
|
$.pkp.classes.Helper.inherits(
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature,
|
|
$.pkp.classes.features.OrderItemsFeature);
|
|
|
|
|
|
//
|
|
// Extended methods from OrderItemsFeature.
|
|
//
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.addFeatureHtml =
|
|
function($gridElement, options) {
|
|
|
|
var $itemSequenceInput, $gridRows, index, limit, $gridRow,
|
|
$itemSequenceInputClone;
|
|
|
|
this.parent('addFeatureHtml', $gridElement, options);
|
|
|
|
$itemSequenceInput = this.getSequenceInput_();
|
|
$gridRows = this.gridHandler.getRows();
|
|
for (index = 0, limit = $gridRows.length; index < limit; index++) {
|
|
$gridRow = $($gridRows[index]);
|
|
$itemSequenceInputClone = $itemSequenceInput.clone();
|
|
|
|
$('td.first_column', $gridRow).append($itemSequenceInputClone);
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Set up the sortable plugin.
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.
|
|
setupSortablePlugin = function() {
|
|
this.applySortPlgOnElements(
|
|
this.getGridHtmlElement(), 'tr.orderable', null);
|
|
};
|
|
|
|
|
|
//
|
|
// Extended methods from ToggleableOrderItemsFeature.
|
|
//
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.init =
|
|
function() {
|
|
this.parent('init');
|
|
this.toggleItemsDragMode();
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.toggleState =
|
|
function(isOrdering) {
|
|
this.parent('toggleState', isOrdering);
|
|
this.toggleContentHandlers_();
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.storeRowOrder =
|
|
function(index, $row) {
|
|
var seq = index + 1,
|
|
$orderableInput = $row.find('.itemSequence'),
|
|
$modifiedInput;
|
|
|
|
$orderableInput.attr('value', seq);
|
|
$modifiedInput = $row.find('.isModified');
|
|
$modifiedInput.attr('value', 1);
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.saveOrderHandler =
|
|
function() {
|
|
this.parent('saveOrderHandler');
|
|
this.toggleState(false);
|
|
|
|
return false;
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.
|
|
updateOrderCallback = function(contextElement, event, ui) {
|
|
|
|
var $rows;
|
|
this.parent('updateOrderCallback');
|
|
$rows = this.gridHandler.getRows();
|
|
this.storeOrder($rows);
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.
|
|
clickOrderHandler = function() {
|
|
var $selects = $('select:visible', this.getGridHtmlElement()),
|
|
index, limit;
|
|
if ($selects.length > 0) {
|
|
for (index = 0, limit = $selects.length; index < limit; index++) {
|
|
this.gridHandler.saveRow($($selects[index]).parents('.gridRow'));
|
|
}
|
|
}
|
|
|
|
return /** @type {boolean} */ (this.parent('clickOrderHandler'));
|
|
};
|
|
|
|
|
|
//
|
|
// Implemented Feature template hook methods.
|
|
//
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.addElement =
|
|
function($newElement) {
|
|
this.parent('addElement', $newElement);
|
|
this.formatAndStoreNewRow_($newElement);
|
|
return false;
|
|
};
|
|
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.replaceElement =
|
|
function($newContent) {
|
|
this.parent('replaceElement', $newContent);
|
|
this.formatAndStoreNewRow_($newContent);
|
|
return false;
|
|
};
|
|
|
|
|
|
//
|
|
// Private helper methods.
|
|
//
|
|
/**
|
|
* Get the sequence input html element.
|
|
* @private
|
|
* @return {jQueryObject} Sequence input.
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.
|
|
getSequenceInput_ = function() {
|
|
return $('<input type="hidden" name="newRowId[sequence]" ' +
|
|
'class="itemSequence" />');
|
|
};
|
|
|
|
|
|
/**
|
|
* Enable/disable row content handlers.
|
|
* @private
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.
|
|
toggleContentHandlers_ = function() {
|
|
var $rows = this.gridHandler.getRows(),
|
|
index, limit, $row;
|
|
for (index = 0, limit = $rows.length; index < limit; index++) {
|
|
$row = $($rows[index]);
|
|
if (this.isOrdering) {
|
|
$row.find('.gridCellDisplay').unbind('click');
|
|
} else {
|
|
this.gridHandler.attachContentHandlers_($row);
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Format and store new row.
|
|
* @private
|
|
* @param {jQueryObject} $row The new row element.
|
|
*/
|
|
$.pkp.classes.features.OrderListbuilderItemsFeature.prototype.
|
|
formatAndStoreNewRow_ = function($row) {
|
|
|
|
var $rows;
|
|
|
|
$row.children().after(this.getSequenceInput_());
|
|
$rows = this.gridHandler.getRows();
|
|
this.storeOrder($rows);
|
|
};
|
|
|
|
|
|
}(jQuery));
|