JSFiddle - React, Tailwind, and code Playground
HTML
<link rel="stylesheet" href="https://raw.github.com/ericmbarnard/KoGrid/master/KoGrid.css">
<script src="http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.1.0.js"></script>
<script src="https://api.azaleos.com/Scripts/underscore-min.js"></script>
<script src="https://raw.github.com/kamranayub/UnderscoreKO/master/underscore-ko.js"></script>
<script src="https://raw.github.com/ericmbarnard/KoGrid/skogrid-merge/KoGrid.debug.js"></script>
<div>
<input data-bind="value: filter, valueUpdate: 'afterkeydown'" placeholder="Search..." />
<div style="width: 500px; height: 500px;" data-bind="koGrid: { data: filteredItems }"></div>
</div>
CSS
/******** Grid Global ********/
.kgLabel {
display: block;
float: left;
font-weight: bold;
padding-right: 5px;
}
/******** Grid ********/
.kgGrid {
background-color: rgb(253, 253, 253);
}
/******** Header ********/
.kgTopPanel {
background-color: rgb(241, 241, 241);
overflow: hidden;
}
.kgHeaderContainer {
position: relative;
overflow: hidden;
border-bottom: 1px solid rgb(229, 229, 229);
font-weight: bold;
}
.kgHeaderScroller {
position: absolute;
}
.kgHeaderCell {
position: absolute;
background-color: rgb(241, 241, 241);
padding: 0;
cursor: pointer;
border-right: 1px solid rgb(241, 241, 241);
}
/******** Viewport ********/
.kgViewport{
background-color: rgb(255, 255, 255);
overflow: auto;
}
.kgCanvas{
position: relative;
}
/******** Rows ********/
.kgRow {
border-bottom: 1px solid rgb(229, 229, 229);
cursor: pointer;
}
.kgRow.even {
background-color: rgb(253, 253, 253);
}
.kgRow.odd {
background-color: rgb(249, 249, 249);
}
.kgRow.kgSelected {
background-color: rgb(255, 255, 204);
}
.kgRow.kgCanSelect {
cursor: pointer;
}
/******** Cells ********/
.kgCell {
overflow: hidden;
position: absolute;
padding: 0;
display: inline;
}
.kgRowIndexCell{
text-align: center;
}
.kgSelectionCell {
}
.kgSelectionCell input[type="checkbox"] {
margin-left: auto;
margin-right: auto;
margin-top: 7px;
height: 15px;
width: 15px;
}
/******** Header Sorting ********/
.kgSortImg{
height: 9px;
width: 7px;
}
.kgNoSort {
cursor:default;
}
/******** Header Filtering ********/
.kgFilterBtn {
cursor: pointer;
height: 16px;
width: 16px;
position: absolute;
margin: auto;
top: 0; bottom: 0; left: 0; right: 0;
}
.kgFilterBtn.openBtn {
background-image:...
JavaScript
$(document).ready(function () {
function vm() {
var self = this;
self.myObsArray = ko.observableArray([
{ firstName: ko.observable("John"), lastName: ko.observable("Doe") },
{ firstName: ko.observable("Jane"), lastName: ko.observable("Doe") }
]);
self.filter = ko.observable("");
self.filteredItems = ko.computed(function() {
var filter = self.filter().toLowerCase();
if (!filter) {
return self.myObsArray();
} else {
return self.myObsArray.filter(function(item) {
return item.firstName().toLowerCase().indexOf(filter) != -1;
});
}
});
};
ko.applyBindings(new vm());
});