devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
154 lines (153 loc) • 6.67 kB
JavaScript
/**
* DevExtreme (esm/ui/grid_core/ui.grid_core.error_handling.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import $ from "../../core/renderer";
import eventsEngine from "../../events/core/events_engine";
import {
name as clickEventName
} from "../../events/click";
import {
each
} from "../../core/utils/iterator";
import modules from "./ui.grid_core.modules";
var ERROR_ROW_CLASS = "dx-error-row";
var ERROR_MESSAGE_CLASS = "dx-error-message";
var ERROR_CLOSEBUTTON_CLASS = "dx-closebutton";
var ACTION_CLASS = "action";
var ErrorHandlingController = modules.ViewController.inherit({
init: function() {
this._columnHeadersView = this.getView("columnHeadersView");
this._rowsView = this.getView("rowsView")
},
_createErrorRow: function(error, $tableElements) {
var that = this;
var $errorRow;
var $closeButton;
var $errorMessage = this._renderErrorMessage(error);
if ($tableElements) {
$errorRow = $("<tr>").addClass(ERROR_ROW_CLASS);
$closeButton = $("<div>").addClass(ERROR_CLOSEBUTTON_CLASS).addClass(that.addWidgetPrefix(ACTION_CLASS));
eventsEngine.on($closeButton, clickEventName, that.createAction((function(args) {
var e = args.event;
var $errorRow;
var errorRowIndex = $(e.currentTarget).closest("." + ERROR_ROW_CLASS).index();
e.stopPropagation();
each($tableElements, (function(_, tableElement) {
$errorRow = $(tableElement).children("tbody").children("tr").eq(errorRowIndex);
that.removeErrorRow($errorRow)
}));
that.getController("resizing") && that.getController("resizing").fireContentReadyAction()
})));
$("<td>").attr({
colSpan: that.getController("columns").getVisibleColumns().length,
role: "presentation"
}).prepend($closeButton).append($errorMessage).appendTo($errorRow);
return $errorRow
}
return $errorMessage
},
_renderErrorMessage: function(error) {
var message = error.url ? error.message.replace(error.url, "") : error.message || error;
var $message = $("<div>").addClass(ERROR_MESSAGE_CLASS).text(message);
if (error.url) {
$("<a>").attr("href", error.url).text(error.url).appendTo($message)
}
return $message
},
renderErrorRow: function(error, rowIndex, $popupContent) {
var that = this;
var $errorMessageElement;
var $firstErrorRow;
if ($popupContent) {
$popupContent.find("." + ERROR_MESSAGE_CLASS).remove();
$errorMessageElement = that._createErrorRow(error);
$popupContent.prepend($errorMessageElement);
return $errorMessageElement
}
var viewElement = rowIndex >= 0 || !that._columnHeadersView.isVisible() ? that._rowsView : that._columnHeadersView;
var $tableElements = viewElement.getTableElements();
each($tableElements, (function(_, tableElement) {
$errorMessageElement = that._createErrorRow(error, $tableElements);
$firstErrorRow = $firstErrorRow || $errorMessageElement;
if (rowIndex >= 0) {
var $row = viewElement._getRowElements($(tableElement)).eq(rowIndex);
that.removeErrorRow($row.next());
$errorMessageElement.insertAfter($row)
} else {
var $tbody = $(tableElement).children("tbody");
var rowElements = $tbody.children("tr");
if (that._columnHeadersView.isVisible()) {
that.removeErrorRow(rowElements.last());
$(tableElement).append($errorMessageElement)
} else {
that.removeErrorRow(rowElements.first());
$tbody.first().prepend($errorMessageElement)
}
}
}));
var resizingController = that.getController("resizing");
resizingController && resizingController.fireContentReadyAction();
return $firstErrorRow
},
removeErrorRow: function($row) {
if (!$row) {
var $columnHeaders = this._columnHeadersView && this._columnHeadersView.element();
$row = $columnHeaders && $columnHeaders.find("." + ERROR_ROW_CLASS);
if (!$row || !$row.length) {
var $rowsViewElement = this._rowsView.element();
$row = $rowsViewElement && $rowsViewElement.find("." + ERROR_ROW_CLASS)
}
}
$row && $row.hasClass(ERROR_ROW_CLASS) && $row.remove()
},
optionChanged: function(args) {
switch (args.name) {
case "errorRowEnabled":
args.handled = true;
break;
default:
this.callBase(args)
}
}
});
export var errorHandlingModule = {
defaultOptions: function() {
return {
errorRowEnabled: true
}
},
controllers: {
errorHandling: ErrorHandlingController
},
extenders: {
controllers: {
data: {
init: function() {
var that = this;
var errorHandlingController = that.getController("errorHandling");
that.callBase();
that.dataErrorOccurred.add((function(error, $popupContent) {
if (that.option("errorRowEnabled")) {
errorHandlingController.renderErrorRow(error, void 0, $popupContent)
}
}));
that.changed.add((function(e) {
if (e && "loadError" === e.changeType) {
return
}
var errorHandlingController = that.getController("errorHandling");
var editingController = that.getController("editing");
if (editingController && !editingController.hasChanges()) {
errorHandlingController && errorHandlingController.removeErrorRow()
}
}))
}
}
}
}
};