cccc/static/sg/examples/example3a-compound-editors.html
2018-12-04 09:58:47 +01:00

150 lines
4.1 KiB
HTML

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>SlickGrid example 3a: Advanced Editing</title>
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.8.16.custom.css" type="text/css"/>
<link rel="stylesheet" href="examples.css" type="text/css"/>
<style>
.cell-title {
font-weight: bold;
}
</style>
</head>
<body>
<div style="position:relative">
<div style="width:600px;">
<div id="myGrid" style="width:100%;height:500px;"></div>
</div>
<div class="options-panel">
<h2>Demonstrates:</h2>
<ul>
<li>compound cell editors driving multiple fields from one cell</li>
<li>providing validation from the editor</li>
<li>hooking into validation events</li>
</ul>
<h2>View Source:</h2>
<ul>
<li><A href="https://github.com/mleibman/SlickGrid/blob/gh-pages/examples/example3a-compound-editors.html" target="_sourcewindow"> View the source for this example on Github</a></li>
</ul>
</div>
</div>
<script src="../lib/firebugx.js"></script>
<script src="../lib/jquery-1.7.min.js"></script>
<script src="../lib/jquery-ui-1.8.16.custom.min.js"></script>
<script src="../lib/jquery.event.drag-2.2.js"></script>
<script src="../slick.core.js"></script>
<script src="../slick.editors.js"></script>
<script src="../slick.grid.js"></script>
<script>
var grid;
var data = [];
var columns = [
{id: "title", name: "Title", field: "title", width: 120, cssClass: "cell-title", editor: Slick.Editors.Text},
{id: "range", name: "Range", width: 120, formatter: NumericRangeFormatter, editor: NumericRangeEditor}
];
var options = {
editable: true,
enableAddRow: false,
enableCellNavigation: true,
asyncEditorLoading: false
};
function NumericRangeFormatter(row, cell, value, columnDef, dataContext) {
return dataContext.from + " - " + dataContext.to;
}
function NumericRangeEditor(args) {
var $from, $to;
var scope = this;
this.init = function () {
$from = $("<INPUT type=text style='width:40px' />")
.appendTo(args.container)
.bind("keydown", scope.handleKeyDown);
$(args.container).append("&nbsp; to &nbsp;");
$to = $("<INPUT type=text style='width:40px' />")
.appendTo(args.container)
.bind("keydown", scope.handleKeyDown);
scope.focus();
};
this.handleKeyDown = function (e) {
if (e.keyCode == $.ui.keyCode.LEFT || e.keyCode == $.ui.keyCode.RIGHT || e.keyCode == $.ui.keyCode.TAB) {
e.stopImmediatePropagation();
}
};
this.destroy = function () {
$(args.container).empty();
};
this.focus = function () {
$from.focus();
};
this.serializeValue = function () {
return {from: parseInt($from.val(), 10), to: parseInt($to.val(), 10)};
};
this.applyValue = function (item, state) {
item.from = state.from;
item.to = state.to;
};
this.loadValue = function (item) {
$from.val(item.from);
$to.val(item.to);
};
this.isValueChanged = function () {
return args.item.from != parseInt($from.val(), 10) || args.item.to != parseInt($from.val(), 10);
};
this.validate = function () {
if (isNaN(parseInt($from.val(), 10)) || isNaN(parseInt($to.val(), 10))) {
return {valid: false, msg: "Please type in valid numbers."};
}
if (parseInt($from.val(), 10) > parseInt($to.val(), 10)) {
return {valid: false, msg: "'from' cannot be greater than 'to'"};
}
return {valid: true, msg: null};
};
this.init();
}
$(function () {
for (var i = 0; i < 500; i++) {
var d = (data[i] = {});
d["title"] = "Task " + i;
d["from"] = Math.round(Math.random() * 100);
d["to"] = d["from"] + Math.round(Math.random() * 100);
}
grid = new Slick.Grid("#myGrid", data, columns, options);
grid.onValidationError.subscribe(function (e, args) {
alert(args.validationResults.msg);
});
})
</script>
</body>
</html>