summaryrefslogtreecommitdiffstats
path: root/vaadin-grid/demo.html
diff options
context:
space:
mode:
Diffstat (limited to 'vaadin-grid/demo.html')
-rw-r--r--vaadin-grid/demo.html661
1 files changed, 661 insertions, 0 deletions
diff --git a/vaadin-grid/demo.html b/vaadin-grid/demo.html
new file mode 100644
index 0000000..daa637e
--- /dev/null
+++ b/vaadin-grid/demo.html
@@ -0,0 +1,661 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1" />
+<script src="../../webcomponentsjs/webcomponents-lite.js"></script>
+
+
+<link href="vaadin-grid.html" rel="import">
+<script src="demodata.js"></script>
+<style>
+td.red, th.red, .red th, .red td, td.foot1, .foot1 td {
+ background: mistyrose !important;
+}
+td.blue, th.blue, .blue th, .blue td, td.foot2, .foot2 td {
+ background: aliceblue !important;
+}
+.foot1, .foot2 {
+ font-weight: bold !important;
+ text-align: center;
+}
+</style>
+</head>
+<body>
+ <script>
+ function waitUntilGridReady(id, cb) {
+ if (window.vaadin && vaadin._v_grid_ready) {
+ cb(document.getElementById(id));
+ } else {
+ document.addEventListener("v-grid-ready", function(){
+ cb(document.getElementById(id));
+ });
+ }
+ }
+ </script>
+
+<ol>
+ <li>
+ <h3>Simplest possible with inline data</h3>
+ <v-grid rows=1>
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <col header-text="Progress">
+ <tbody>
+ <tr>
+ <td>Grid</td>
+ <td>10000</td>
+ <td>0.8</td>
+ </tr>
+ <tr>
+ <td>Vaadin X</td>
+ <td>999999</td>
+ <td>0.8</td>
+ </tr>
+ </tbody>
+ </table>
+ </v-grid>
+ </li>
+
+ <li>
+ <h3>Simplest possible with explicitly formatted inline data (i.e. children in cells)</h3>
+ <v-grid id="childrenInCells">
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <col header-text="Progress">
+ <tbody>
+ <tr>
+ <td>Grid</td>
+ <td>10 000€</td>
+ <td><progress value="0.8" /></td>
+ </tr>
+ <tr>
+ <td>Vaadin X</td>
+ <td>999 999€</td>
+ <td><progress value="0.01" /></td>
+ </tr>
+ </tbody>
+ </table>
+ </v-grid>
+
+ </li>
+
+ <li>
+ <h3>Simplest possible with data source (all data available, no formatting)</h3>
+ <v-grid id='myGrid'>
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <col header-text="Progress">
+ </table>
+ </v-grid>
+
+ <script>
+ // We need to wait until the WC has been initialized
+ // It could take a long if we are compiling SDM
+ waitUntilGridReady("myGrid", function(grid) {
+ var data = [ [ "Grid", 10000, 0.8 ], [ "Vaadin X", 999999, 0.01 ],
+ [ "designer", 999999, 0.01 ] ];
+
+ grid.data.source = function(req) {
+ var array = data.slice(req.index, req.index + req.count);
+ req.success(array, data.length);
+ };
+ });
+ </script>
+ </li>
+
+ <li>
+ <h3>Simplest possible with lazy data source (no formatting)</h3>
+ <v-grid id='myBigGrid'>
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <col header-text="Progress">
+ </table>
+ </v-grid>
+
+ <script>
+ waitUntilGridReady("myBigGrid", function(grid) {
+
+ grid.data.source = function(req) {
+ setTimeout(function() {
+ req.success(myBigData.slice(req.index, req.index + req.count), myBigData.length);
+ }, req.index ? 800 : 0);
+ };
+ });
+ // Note: myBigData is defined at the end of the page
+ </script>
+ </li>
+
+ <li>
+ <h3>Simplest possible with data source and formatting</h3>
+
+ <v-grid id="myFormatGrid">
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <col header-text="Progress">
+ </table>
+ </v-grid>
+ <script>
+ waitUntilGridReady("myFormatGrid", function(grid) {
+ var data = [ [ "Grid", 10000, 0.8 ], [ "Vaadin X", 999999, 0.01 ], ];
+
+ grid.data.source = function(req) {
+ req.success(data.slice(req.index, req.index + req.count), data.length);
+ };
+
+ var valueRenderer = function(cell) {
+ cell.element.innerHTML = '$' + cell.data;
+ };
+
+ var progressRenderer = function(cell) {
+ var child = document.createElement("progress");
+ child.setAttribute('value', cell.data);
+ cell.element.appendChild(child);
+ };
+ grid.columns[1].renderer = valueRenderer;
+ grid.columns[2].renderer = progressRenderer;
+ });
+ </script>
+ </li>
+
+ <li>
+ <h3>Mapping data from a JS object into columns</h3>
+
+ <v-grid id="myMapGrid">
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <col header-text="Progress">
+ </table>
+ </v-grid>
+ <button id="updateButton">update</button>
+ <button id="addButton">add</button>
+ <button id="removeButton">remove</button>
+ <script>
+ var data = [{ name: "Grid", value: 10000, progress: 0.8 },
+ { name: "Vaadin X", value: 999999, progress: 0.01 }];
+
+ waitUntilGridReady("myMapGrid", function(grid) {
+ grid.data.source = function(req) {
+ req.success(data.slice(req.index, req.index + req.count), data.length);
+ };
+
+ grid.columns[0].valueGenerator = function(rowObject, columnIndex) {
+ return "> " + rowObject.name;
+ };
+
+ grid.columns[1].name = "value";
+ grid.columns[2].name = "progress";
+ });
+
+ document.querySelector('#updateButton').addEventListener('click', function(e) {
+ var grid = document.querySelector('#myMapGrid');
+
+ var updatedItem = {name: "Button X", value: Math.round(Math.random() * 1000), progress: Math.random()};
+ data[0] = updatedItem;
+ grid.data.clearCache();
+ });
+
+ document.querySelector('#addButton').addEventListener('click', function(e) {
+ var grid = document.querySelector('#myMapGrid');
+
+ data.splice(0, 0, {name: "Button " + data.length, value: 111, progress: 0.01});
+ grid.data.clearCache(data.length);
+ });
+
+ document.querySelector('#removeButton').addEventListener('click', function(e) {
+ var grid = document.querySelector('#myMapGrid');
+
+ data.splice(0, 1);
+ grid.data.clearCache(data.length);
+ });
+ </script>
+ </li>
+
+ <li>
+ <h3>Mapping data from a array into single column</h3>
+ <v-grid id="with-single-column">
+
+ <table>
+ <col header-text="Name">
+ </table>
+ </v-grid>
+ <script>
+ waitUntilGridReady("with-single-column", function(grid) {
+ var data = [
+ "Grid",
+ "Vaadin X"
+ ];
+
+ grid.data.source = function(req) {
+ req.success(data.slice(req.index, req.index + req.count), data.length);
+ };
+ });
+ </script>
+ </li>
+
+ <li>
+ <h3>Complex headers</h3>
+ <v-grid>
+ <table>
+ <col>
+ <col>
+ <col>
+ <thead>
+ <tr class="blue">
+ <th><button>I'm a button</button></th>
+ <th colspan="2">Status</th>
+ </tr>
+ <tr default class="red">
+ <th>Name</th>
+ <th class="blue">Value</th>
+ <th>Progress</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>Grid</td>
+ <td>10000</td>
+ <td>0.8</td>
+ </tr>
+ <tr>
+ <td>Vaadin X</td>
+ <td>999999</td>
+ <td>0.8</td>
+ </tr>
+ </tbody>
+ <tfoot>
+ <tr class="foot1">
+ <th colspan=3>This is a footer line in a cell</th>
+ </tr>
+ <tr class="foot2">
+ <th colspan=3><span>Some widgets in a footer</span> <input type=text/> <button>Click</button></th>
+ </tr>
+ </tfoot>
+ </table>
+ </v-grid>
+ </li>
+
+ <li>
+ <h3>Selection</h3>
+
+ <v-grid id="myMultiSelGrid" selection-mode="multi">
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <col header-text="Progress">
+ </table>
+ </v-grid>
+ <div id="smbuttons">
+ <input type="radio" name="selectionmode" value="single">single</input>
+ <input type="radio" name="selectionmode" value="multi" checked="checked">multi</input>
+ <input type="radio" name="selectionmode" value="all">all</input>
+ <input type="radio" name="selectionmode" value="disabled">disabled</input>
+ </div>
+ <div id="sizelabel"></div>
+ <div id="deselectedlabel" style="overflow: hidden; text-overflow: ellipsis;"></div>
+ <div id="selectedlabel" style="overflow: hidden; text-overflow: ellipsis;"></div>
+ <script>
+ waitUntilGridReady("myMultiSelGrid", function(grid) {
+ grid.data.source = myBigData;
+
+ var updateFields = function(event) {
+ document.getElementById("sizelabel").innerText = "selection.size: " + grid.selection.size;
+
+ var selectedLabel = document.getElementById("selectedlabel");
+ if (grid.selection.mode === "all"){
+ selectedLabel.style.color = "#f00";
+ selectedLabel.innerText = "selection.selected() PREFER deselected() WITH SELECTION MODE \"all\"): " + grid.selection.selected();
+ } else {
+ selectedLabel.style.color = "#000";
+ selectedLabel.innerText = "selection.selected(): " + grid.selection.selected();
+ }
+ document.getElementById("deselectedlabel").innerText = "selection.deselected(): " + grid.selection.deselected();
+
+ document.querySelector("input[name='selectionmode'][checked='checked']").removeAttribute("checked");
+ document.querySelector("input[name='selectionmode'][value='"+ grid.selection.mode +"']").setAttribute("checked", "checked");
+ };
+
+ var modeListener = function(e) {
+ grid.selection.mode = e.target.value;
+ updateFields();
+ };
+ var radios = document.querySelectorAll("input[name='selectionmode']");
+ for (var i = 0; i< radios.length; i++) {
+ radios[i].addEventListener("click", modeListener);
+ }
+
+ grid.addEventListener("select", updateFields);
+ });
+ </script>
+ </li>
+
+ <li>
+ <h3>Simplest possible polymer dom-repeat from array of objects</h3>
+ <dom-module id="my-grid-with-template">
+ <template>
+ <v-grid selectionMode='multi'>
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <col header-text="Progress">
+ <tbody>
+ <template is="dom-repeat" items="{{mydata}}">
+ <tr>
+ <td>{{item.name}}</td>
+ <td>{{item.value}}</td>
+ <td>{{item.progress}}</td>
+ </tr>
+ </template>
+ </tbody>
+ </table>
+ </v-grid>
+ </template>
+ </dom-module>
+ <script>
+ Polymer({
+ is: 'my-grid-with-template',
+ ready: function() {
+ this.mydata = [
+ {"name": "Grid", "value": "10000", "progress": 0.8},
+ {"name": "Vaadin X", "value": "999999", "progress": 0.8}
+ ];
+ }
+ }) ;
+ </script>
+ <my-grid-with-template></my-grid-with-template>
+ </li>
+
+ <li>
+ <h3>Simplest possible polymer dom-repeat from simple array</h3>
+ <dom-module id="my-grid-with-template2">
+ <template>
+ <v-grid selectionMode='multi'>
+ <table>
+ <col header-text="Name">
+ <tbody>
+ <template is="dom-repeat" items="{{mydata}}">
+ <tr>
+ <td>{{item}}</td>
+ </tr>
+ </template>
+ </tbody>
+ </table>
+ </v-grid>
+ </template>
+ </dom-module>
+ <script>
+ Polymer({
+ is: 'my-grid-with-template2',
+ ready: function() {
+ this.mydata = [
+ "Grid",
+ "Vaadin X"
+ ];
+ }
+ }) ;
+ </script>
+ <my-grid-with-template2></my-grid-with-template2>
+ </li>
+
+ <li>
+ <h3>Simplest possible polymer dom-repeat from array of objects and selection multiple</h3>
+ <dom-module id="my-grid-with-template-multi">
+ <template>
+ <v-grid selectionMode='multi'>
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <col header-text="Progress">
+ <tbody>
+ <template is="dom-repeat" items="{{mydata}}">
+ <tr>
+ <td>{{item.name}}</td>
+ <td>{{item.value}}</td>
+ <td>{{item.progress}}</td>
+ </tr>
+ </template>
+ </tbody>
+ </table>
+ </v-grid>
+ </template>
+ </dom-module>
+ <script>
+ Polymer({
+ is: 'my-grid-with-template-multi',
+ ready: function() {
+ this.mydata = [
+ {"name": "Grid", "value": "10000", "progress": 0.8},
+ {"name": "Vaadin X", "value": "999999", "progress": 0.8}
+ ];
+ }
+ }) ;
+ </script>
+ <my-grid-with-template-multi></my-grid-with-template-multi>
+ </li>
+
+ <li>
+ <h3>Sort example</h3>
+ <v-grid id='mySortGrid'>
+ <table>
+ <col header-text="Name" sortable>
+ <col header-text="Value" sortable>
+ <col header-text="Progress" sortable>
+ </table>
+ </v-grid>
+ <button id="mySortButton">Sort by column 1</button>
+ Sort: <span id="mySortLabel"></span>
+
+ <script>
+ waitUntilGridReady("mySortGrid", function(grid) {
+ var data = [ [ "Gridddd", 10000, 0.8 ], [ "Vaadin X", 999999, 0.01 ],
+ [ "designer", 43256, 0.01 ], [ "TK", 1967, 0.05 ] ];
+
+ var button = document.getElementById("mySortButton");
+ var label = document.getElementById("mySortLabel");
+
+ var dir = 'desc';
+ button.addEventListener("click", function(event) {
+ dir = dir == 'desc' ? "asc" : "desc";
+ grid.data.sortOrder = [{
+ column: 1,
+ direction: dir
+ }];
+ });
+
+ grid.addEventListener("sort", function() {
+ var idx = grid.data.sortOrder[0].column;
+ var asc = grid.data.sortOrder[0].direction == 'asc';
+ data.sort(function(a, b){
+ return a[idx] < b[idx] && asc ? -1 : 1;
+ });
+ label.textContent = JSON.stringify(grid.sortOrder);
+ })
+ grid.data.source = function(req) {
+ req.success(data.slice(req.index, req.index + req.count), data.length);
+ };
+ });
+ </script>
+ </li>
+
+ <li>
+ <h3>Row editor</h3>
+ <v-grid id='editableGrid' style='width: 200px'>
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <tbody>
+ <tr>
+ <td>Grid</td>
+ <td>10000</td>
+ </tr>
+ <tr>
+ <td>VaadinX</td>
+ <td>1000</td>
+ </tr>
+ </tbody>
+ </table>
+ </v-grid>
+
+ <script>
+ waitUntilGridReady("editableGrid", function(grid) {
+ grid.columns[0].name = "name";
+ grid.columns[1].name = "value";
+ grid.editor.enabled = true;
+ grid.editor.saveButtonText = "Ok";
+ grid.editor.cancelButtonText = "Nope";
+ grid.editor.handler = {
+ getCellEditor: function(columnObject) {
+ return document.createElement("input");
+ },
+ bind: function(req) {
+ for (var i = 0; i < req.grid.columns.length; i++) {
+ var col = req.grid.columns[i];
+ var el = req.getCellEditor(col);
+ el.value = req.dataItem[i];
+ }
+ req.success();
+ },
+ save: function(req) {
+ for (var i = 0; i < req.grid.columns.length; i++) {
+ var col = req.grid.columns[i];
+ var el = req.getCellEditor(col);
+ var cell = grid.lightDom.querySelectorAll("tbody tr")[req.rowIndex].querySelectorAll("td")[i];
+ cell.innerHTML = el.value;
+ }
+ req.success();
+ }
+ };
+ });
+ </script>
+ </li>
+
+ <li>
+ <h3>DOM API</h3>
+ <v-grid
+ selection-mode='disabled'
+ selected-rows='0,2,3'
+ rows=3
+ frozen-columns= '-1'
+ style='width: 100%'
+ editable
+ >
+ <table >
+ <colgroup>
+ <col sortable sort-direction="desc" header-text="Name">
+ <col sortable sort-direction="asc" header-text="Value">
+ <col width=40 header-text="Progress">
+ <col min-width=200 header-text="foo">
+ <col header-text="bar">
+ <col flex=100 header-text="foo">
+ <col flex=0 header-text="bar">
+ </colgroup>
+ <tbody>
+ <tr>
+ <td>Grid</td>
+ <td>10000</td>
+ <td>0.8</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ </tr>
+ <tr>
+ <td>Vaadin X</td>
+ <td>999999</td>
+ <td>0.8</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ </tr>
+ <tr>
+ <td>Designer</td>
+ <td>10000</td>
+ <td>0.5</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ </tr>
+ <tr>
+ <td>Spreadsheet</td>
+ <td>10000</td>
+ <td>0.5</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ </tr>
+ <tr>
+ <td>TK</td>
+ <td>10000</td>
+ <td>0.5</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ <td>lorem ipsum</td>
+ <td>dolor sit amet</td>
+ </tr>
+ </tbody>
+ </table>
+ </v-grid>
+ </li>
+
+ <li>
+ <h3>Header and Footer</h3>
+ <v-grid id='staticsections'>
+ <table>
+ <col header-text="Name">
+ <col header-text="Value">
+ <tbody>
+ <tr>
+ <td>Grid</td>
+ <td>10000</td>
+ </tr>
+ <tr>
+ <td>VaadinX</td>
+ <td>1000</td>
+ </tr>
+ </tbody>
+ </table>
+ </v-grid>
+ <br/>
+ <button id="headervisibility">Toggle header visibility</button>
+ <button id="footervisibility">Toggle footer visibility</button>
+ <script>
+ waitUntilGridReady("staticsections", function(grid) {
+ // Remove the header row
+ grid.header.removeRow(0);
+
+ // Add a header row
+ var colspanToggle = document.createElement("button");
+ colspanToggle.innerHTML = "Toggle colspan";
+ colspanToggle.addEventListener("click", function(){
+ var cell = grid.header.getCell(0, 0);
+ cell.colspan = cell.colspan == 1 ? 2 : 1;
+ });
+ grid.header.addRow(0, [colspanToggle, "Value"]);
+
+ // Add a footer row
+ grid.footer.addRow(0, ["sum", 11000]);
+
+ // Toggle header / footer visibility
+ document.getElementById("headervisibility").addEventListener("click", function(){
+ grid.header.hidden = !grid.header.hidden;
+ });
+ document.getElementById("footervisibility").addEventListener("click", function(){
+ grid.footer.hidden = !grid.footer.hidden;
+ });
+
+ });
+ </script>
+ </li>
+
+</ol>
+</body>
+</html>