### Install Project Dependencies
Source: https://github.com/6pac/slickgrid/blob/master/CONTRIBUTING.md
Run this command to install all necessary dependencies for the project.
```sh
npm install
```
--------------------------------
### Install and Run Vite Dev Server
Source: https://github.com/6pac/slickgrid/blob/master/vite-demo/README.md
Installs project dependencies and starts the Vite development server. Use this to run the demo locally.
```sh
npm install
```
```sh
npm run dev # run Vite dev
```
--------------------------------
### Install Slickgrid using NPM
Source: https://github.com/6pac/slickgrid/wiki/Package-Managers
Use this command to install Slickgrid via NPM. The NPM package is currently under development.
```bash
npm install slickgrid
```
--------------------------------
### Install Dependencies and Run Cypress Tests
Source: https://github.com/6pac/slickgrid/blob/master/README.md
Commands to set up the project and run Cypress E2E tests. This is useful for verifying project stability and contributing.
```bash
npm install
npm run dev
npm run cypress
```
--------------------------------
### Initialize SlickGrid with Options
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-frozen-columns-large.html
Initializes a SlickGrid instance with specified columns, data view, and options. Includes setup for row selection, pagination, and column picking.
```javascript
dataView = new Slick.Data.DataView();
grid = new Slick.Grid("#myGrid", dataView, columns, options);
grid.setSelectionModel(new Slick.RowSelectionModel());
var pager = new Slick.Controls.Pager(dataView, grid, "#pager");
var columnpicker = new Slick.Controls.ColumnPicker(columns, grid, options);
```
--------------------------------
### Install SlickGrid with Alpine Theme from CDN
Source: https://github.com/6pac/slickgrid/blob/master/README.md
Use this snippet to include the SlickGrid CSS for the Alpine theme when using CDN.
```html
```
--------------------------------
### Initialize SlickGrid with Data and Plugins
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-trading-esm.html
Sets up the SlickGrid instance, including data view, selection model, and plugins like column picker and grid menu. It also starts the data simulation.
```javascript
document.addEventListener("DOMContentLoaded", () => {
data = getData(200);
window.setTimeout(() => {
startSimulation();
}, refreshRate);
const groupItemMetadataProvider = new SlickGroupItemMetadataProvider();
dataView = new SlickDataView({ groupItemMetadataProvider: groupItemMetadataProvider, inlineFilters: true });
grid = new SlickGrid("#myGrid", dataView, columns, options);
grid.registerPlugin(groupItemMetadataProvider);
grid.setSelectionModel(new SlickRowSelectionModel());
const columnpicker = new SlickColumnPicker(columns, grid, options);
const gridMenuControl = new SlickGridMenu(columns, grid, options);
const contextMenuOptions = {
commandTitle: "Commands",
commandItems: [
{ command: "group-collapse", iconCssClass: "sgi sgi-arrow-collapse", title: "Collapse all Groups", action: () => tog
]
};
});
```
--------------------------------
### SlickGrid Column Definitions
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-plugin-hybridselectionmodel-esm.html
Defines the columns for the SlickGrid, including properties like id, name, field, width, and formatters. This setup includes columns for task ID, title, completion percentage, start and finish dates, priority, and effort-driven status.
```javascript
let columns = [
{ id: "id", name: "#", field: "id", width: 32 },
{ id: "title", name: "Title", field: "title", width: 90, cssClass: "cell-title", editor: Editors.Text },
{ id: "complete", name: "% Complete", field: "percentComplete", sortable: true, width: 90 },
{ id: "start", name: "Start", field: "start", sortable: true },
{ id: "finish", name: "Finish", field: "finish", sortable: true },
{ id: "priority", name: "Priority", field: "priority", width: 80, resizable: false, formatter: priorityFormatter },
{ id: "effortDriven", name: "Effort Driven", field: "effortDriven", width: 95, formatter: Formatters.Checkmark }
];
```
--------------------------------
### SlickGrid Initialization and Data Setup
Source: https://github.com/6pac/slickgrid/blob/master/tests/scrolling benchmarks.html
Sets up columns, options, and sample data for a SlickGrid instance. Includes a custom formatter and asyncPostRender function. Use this for initializing a grid with a large dataset and custom column configurations.
```javascript
var grid;
var data = [];
var extraColumns = 100;
function testPostRender(cellNode, row, dataContext, colDef) {
cellNode.style.backgroundColor = 'yellow';
}
var columns = [
{id:"title", name:"Title", field:"title", width:120, cssClass:"cell-title"},
{id:"duration", name:"Duration", field:"duration", selectable:false},
{id:"%", name:"% Complete", field:"percentComplete", width:80, resizable:false, formatter:Slick.Formatters.PercentCompleteBar},
{id:"start", name:"Start", field:"start", minWidth:60},
{id:"finish", name:"Finish", field:"finish", minWidth:60},
{id:"effort-driven", name:"Effort Driven", width:80, minWidth:20, maxWidth:80, cssClass:"cell-effort-driven", field:"effortDriven", formatter:Slick.Formatters.Checkmark, asyncPostRender:testPostRender}
];
for (var i=0; i y ? 1 : -1));
}
```
--------------------------------
### Install SlickGrid from NPM with ESM Import
Source: https://github.com/6pac/slickgrid/blob/master/README.md
Install SlickGrid via NPM and import its components using ES Modules. This is preferred for tree shaking.
```bash
npm install slickgrid
```
```javascript
import 'slickgrid/dist/styles/css/slick-alpine-theme.css';
import { SlickGrid, SlickDataView } from 'slickgrid';
const dataView = new SlickDataView({ inlineFilters: true });
const grid = new SlickGrid("#myGrid", dataView, columns, options);
```
--------------------------------
### Initialize SlickGrid with Data and Options
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-frozen-columns-and-rows.html
Prepares sample data and initializes a SlickGrid instance with specified columns and options. Includes event subscriptions for cell changes, adding new rows, keyboard navigation, mouse events, and sorting.
```javascript
function toggleFilterRow() {
grid.setTopPanelVisibility(!grid.getOptions().showTopPanel);
}
document.addEventListener("DOMContentLoaded", function() {
// prepare the data
for (var i = 0; i < 50000; i++) {
var d = (data[i] = {});
d["id"] = "id_" + i;
d["num"] = i;
d["title"] = "Task " + i;
d["duration"] = "5 days";
d["percentComplete"] = Math.round(Math.random() * 100);
d["start"] = "01/01/2009";
d["finish"] = "01/05/2009";
d["effortDriven"] = (i % 5 == 0);
d["title1"] = i;
d["title2"] = i;
d["title3"] = i;
d["title4"] = i;
}
dataView = new Slick.Data.DataView();
grid = new Slick.Grid("#myGrid", dataView, columns, options);
grid.setSelectionModel(new Slick.RowSelectionModel());
var pager = new Slick.Controls.Pager(dataView, grid, "#pager");
var columnpicker = new Slick.Controls.ColumnPicker(columns, grid, options);
// move the filter panel defined in a hidden div into an inline secondary grid header row
var topPanels = grid.getTopPanels();
const topPanelLeftElm = document.querySelector("#inlineFilterPanelL");
topPanels[0].appendChild(topPanelLeftElm);
topPanelLeftElm.style.display = 'block';
grid.onCellChange.subscribe(function (e, args) {
dataView.updateItem(args.item.id, args.item);
});
grid.onAddNewRow.subscribe(function (e, args) {
var item = {
"num": data.length,
"id": "new_" + (Math.round(Math.random() * 10000)),
"title": "New task",
"duration": "1 day",
"percentComplete": 0,
"start": "01/01/2009",
"finish": "01/01/2009",
"effortDriven": false
};
Slick.Utils.extend(item, args.item);
dataView.addItem(item);
});
grid.onKeyDown.subscribe(function (e) {
// select all rows on ctrl-a
if (e.which != 65 || !e.ctrlKey) return false;
var rows = [];
for (var i = 0; i < dataView.getLength(); i++) {
rows.push(i);
}
grid.setSelectedRows(rows);
e.preventDefault();
});
grid.onMouseEnter.subscribe(function (e) {
var cell = this.getCellFromEvent(e);
if (cell) {
this.setSelectedRows([cell.row]);
}
e.preventDefault();
});
grid.onMouseLeave.subscribe(function (e) {
this.setSelectedRows([]);
e.preventDefault();
});
grid.onSort.subscribe(function (e, args) {
sortdir = args.sortAsc ? 1 : -1;
sortcol = args.sortCol.field;
// using native sort with comparer
// preferred method but can be very slow in IE with huge datasets
dataView.sort(comparer, args.sortAsc);
});
// wire up model events to drive the grid
dataView.onRowCountChanged.subscribe(function (e, args) {
grid.updateRowCount();
grid.render();
});
dataView.onRowsChanged.subscribe(function (e, args) {
grid.invalidateRows(args.rows);
grid.render();
});
dataView.onPagingInfoChanged.subscribe(function (e, pagingInfo) {
var isLastPage = pagingInfo.pageSize * (pagingInfo.pageNum + 1) - 1 >= pagingInfo.totalRows;
var enableAddRow = isLastPage || pagingInfo.pageSize == 0;
var options = grid.getOptions();
if (options.enableAddRow != enableAddRow) {
grid.setOptions({ enableAddRow: enableAddRow });
}
});
function filterInputHandler(e) {
const inputFilter = e.target;
const columnId = inputFilter.dataset.columnid;
if (columnId != null) {
columnFilters[columnId] = (inputFilter.value || '').trim();
dataView.refresh();
}
};
const headerRowElms = grid.getHeaderRow();
headerRowElms.forEach(headerRowElm => headerRowElm.addEventListener('change', filterInputHandler));
headerRowElms.forEach(headerRowElm => headerRowElm.addEventListener('keyup', filterInputHandler));
grid.onColumnsReordered.subscribe(function (e, args) {
updateHeaderRow();
});
grid.onColumnsResized.subscribe(function (e, args) {
updateHeaderRow();
});
// wire up the search textbox to apply the filter to the model
document.querySelectorAll("#txtSearch,#txtSearch2").forEach(elm => {
elm.addEventListener('keyup', (e) => {
Slick.GlobalEditorLock.cancelCurrentEdit();
// clear on Esc
if (e.which == 27) {
e.target.value = '';
}
columnFilters['title'] = (e.target.value || '').trim();
updateFilter();
dataView.refresh();
});
});
function updateFilter() {
dataView.setFilterArgs({
percentCompleteThreshold: percentCompleteThreshold,
searchString: searchString
});
}
document.querySelector("#btnSelectRows").addEventListener('click', function () {
if (!Slick.GlobalEditorLock.commitCurrentEdit()) {
return;
}
var rows = [];
for (var i = 0; i < 10 && i < dataView.getLength(); i++) {
rows.push(i);
}
grid.setSelectedRows(rows);
});
// initialize the model after all the events have been hooked up
dataView.beginUpdate();
dataView.setItems(data);
dataView.setFilter(myFilter);
dataView.endUpdate();
// if you don't want the items that are not visible (due to being filtered out
// or being on a different page) to stay selected, pass 'false' to the second arg
dataView.syncGridSelection(grid, true);
updateHeaderRow();
document.querySelector('#setFrozenRow').addEventListener('click', () => {
// This is a placeholder for the actual implementation of freezing rows.
// The actual code for freezing rows would go here.
});
});
```
--------------------------------
### Install and Import SortableJS for SlickGrid
Source: https://github.com/6pac/slickgrid/wiki/TypeScript-Examples
If SortableJS is a dependency, you must install it and make it available globally, either by assigning it to `window.Sortable` or configuring your build tools.
```sh
npm install sortablejs @types/sortablejs
```
```typescript
import Sortable from 'sortablejs';
(window as any).Sortable = Sortable;
```
--------------------------------
### Handle Drag Start for Row Reordering
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-frozen-row-reordering.html
Customize the drag helper element when dragging starts. This includes setting its appearance and text, and potentially styling the elements that are available for dropping.
```javascript
grid.onDrag.subscribe(function (e, dd) {
if (dd.mode != "recycle") {
return;
}
e.stopImmediatePropagation();
var targetEvent = e.touches ? e.touches[0] : e;
dd.helper.css({top: targetEvent.pageY + 5, left: targetEvent.pageX + 5});
});
```
--------------------------------
### Initialize SlickGrid and Resizer Plugin
Source: https://github.com/6pac/slickgrid/blob/master/examples/example15-auto-resize.html
Sets up the SlickGrid with columns and options, then initializes the Resizer plugin. The plugin requires a container selector and can be configured with padding, minimum dimensions, and maximum dimensions.
```javascript
var resizer;
var grid;
var columns = [ { id: "title", name: "Title", field: "title", minWidth: 100 }, { id: "duration", name: "Duration", field: "duration", minWidth: 100 }, { id: "%", name: "% Complete", field: "percentComplete", minWidth: 100 }, { id: "start", name: "Start", field: "start", minWidth: 100 }, { id: "finish", name: "Finish", field: "finish", minWidth: 100 }, { id: "effort-driven", name: "Effort Driven", field: "effortDriven", minWidth: 100 } ];
var options = {
enableCellNavigation: true,
enableColumnReorder: false,
enableAutoSizeColumns: true,
};
document.addEventListener("DOMContentLoaded", function() {
var data = [];
for (var i = 0; i < 500; i++) {
data[i] = {
title: "Task " + i,
duration: "5 days",
percentComplete: Math.round(Math.random() * 100),
start: "01/01/2009",
finish: "01/05/2009",
effortDriven: (i % 5 == 0)
};
}
grid = new Slick.Grid("#myGrid", data, columns, options);
resizer = new Slick.Plugins.Resizer({
container: '.container',
rightPadding: 5,
bottomPadding: 10,
minHeight: 150,
minWidth: 250,
});
grid.registerPlugin(resizer);
});
```
--------------------------------
### Initialize SlickGrid with Data and Options
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-frozen-rows.html
Prepares a large dataset and initializes a SlickGrid instance with custom columns and options. Includes setup for selection models, pagers, and column pickers.
```javascript
for (var i = 0; i < 50000; i++) {
var d = (data[i] = {});
d["id"] = "id_" + i;
d["num"] = i;
d["title"] = "Task " + i;
d["duration"] = "5 days";
d["percentComplete"] = Math.round(Math.random() * 100);
d["start"] = "01/01/2009";
d["finish"] = "01/05/2009";
d["effortDriven"] = (i % 5 == 0);
d["title1"] = i;
d["title2"] = i;
d["title3"] = i;
d["title4"] = i;
}
dataView = new Slick.Data.DataView();
grid = new Slick.Grid("#myGrid", dataView, columns, options);
grid.setSelectionModel(new Slick.RowSelectionModel());
var pager = new Slick.Controls.Pager(dataView, grid, "#pager");
var columnpicker = new Slick.Controls.ColumnPicker(columns, grid, options);
```
--------------------------------
### Group by Duration
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-row-detail-grouping.html
Applies grouping to the DataView based on the 'duration' field. This is a basic grouping example.
```javascript
document.querySelector('\\[data-test=\"group-duration-sort-value-btn\"]\").addEventListener('click', () => groupByDuration());
```
--------------------------------
### Initialize DataView and Grid
Source: https://github.com/6pac/slickgrid/wiki/DataView
Demonstrates how to create a DataView instance, define columns, initialize SlickGrid with the DataView as a data provider, and subscribe to DataView change events to update the grid.
```javascript
var dataView = new Slick.Data.DataView();
var columns = [
{id: "column1", name: "ID", field: "id"},
{id: "column2", name: "Language", field: "lang"},
{id: "column3", name: "Year", field: "year"}
];
var grid = new Slick.Grid(containerEl, dataView, columns, options);
dataView.onRowCountChanged.subscribe(function (e, args) {
grid.updateRowCount();
grid.render();
});
dataView.onRowsChanged.subscribe(function (e, args) {
grid.invalidateRows(args.rows);
grid.render();
});
```
--------------------------------
### Group by Duration
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-grouping.html
Applies grouping to the grid based on the 'duration' field. This is a basic example of data aggregation.
```javascript
function groupByDuration() { grid.setSortColumns([]); dataView.setGrouping([ { getter: "duration", formatter: function (g) { return "Duration: " + g.value + " (" + g.count + " items)"; }, aggregators: [ new Slick.Data.Aggregators.Sum("duration"), new Slick.Data.Aggregators.Sum("cost") ], aggregateCollapsed: true, lazyTotalsCalculation: true } ]); grid.invalidate(); }
```
--------------------------------
### Get Active Cell Coordinates
Source: https://github.com/6pac/slickgrid/wiki/Slick.Grid
Returns an object containing the row and cell index of the currently active cell.
```javascript
{
row: activeRow,
cell: activeCell
}
```
--------------------------------
### Initialize SlickGrid with Data and Columns
Source: https://github.com/6pac/slickgrid/blob/master/examples/example2-formatters-event.html
Sets up the grid with data, column definitions, and options. Ensure explicitInitialization is true to wire up events before the first render.
```javascript
var grid;
var data = [];
var columns = [
{id: "title", name: "Title", field: "title", width: 120, cssClass: "cell-title"},
{id: "duration", name: "Duration", field: "duration"},
{id: "%", name: "% Complete", field: "percentComplete", width: 95, resizable: false, formatter: Slick.Formatters.PercentCompleteBar},
{id: "status", name: "Status", field: "percentComplete", width: 50, resizable: false},
{id: "start", name: "Start", field: "start", minWidth: 60},
{id: "finish", name: "Finish", field: "finish", minWidth: 60},
{id: "effort-driven", name: "Effort Driven", sortable: false, width: 90, minWidth: 20, maxWidth: 90, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Slick.Formatters.Checkmark}
];
var options = {
editable: false,
enableAddRow: false,
enableCellNavigation: true,
explicitInitialization: true
};
document.addEventListener("DOMContentLoaded", function() {
for (var i = 0; i < 5; i++) {
var d = (data[i] = {});
d["title"] = "Task " + i;
d["duration"] = "5 days";
d["percentComplete"] = Math.min(100, Math.round(Math.random() * 110));
d["start"] = "01/01/2009";
d["finish"] = "01/05/2009";
d["effortDriven"] = (i % 5 == 0);
}
grid = new Slick.Grid("#myGrid", data, columns, options);
// The onBeforeAppendCell event returns text corresponding to the css class to add to the cell.
// It is called when first rendering the cell or when redrawing invalidated rows, so it can't respond to cell updates like a formatter.
// It was intended to be a general formatting tool rather then being tied to a particular column, for example to allow validation formatting
// of cells. The idea was that formatting should remain in place until a subsequent validation.
// Note that onBeforeAppendCell requires explicitInitialization: true so that the event can be wired up before the first render.
grid.onBeforeAppendCell.subscribe(function (e, args) {
if (grid.getColumns()[args.cell].id !== 'status') return null;
if (args.value == null || args.value === "") {
return null;
} else if (args.value < 33) {
return "red";
} else if (args.value < 66) {
return "orange";
} else {
return "green";
}
return null;
});
grid.init();
});
```
--------------------------------
### Get All Columns - JavaScript
Source: https://github.com/6pac/slickgrid/wiki/Slick.Grid
Retrieves an array of all column definitions. Useful for inspecting column properties like sortability.
```javascript
// Log to console whether the first column is sortable
var cols = grid.getColumns();
var sortable = cols[0].sortable;
sortable ? console.log("It's sortable!") : console.log("It's not sortable!");
```
--------------------------------
### Initialize SlickGrid with DataView and Plugins
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-grouping-groupcolumn.html
Sets up the SlickGrid instance, including registering the GroupItemMetadataProvider for expandable groups, a Pager, and a ColumnPicker. Also subscribes to grid events for sorting and data updates.
```javascript
document.addEventListener("DOMContentLoaded", function() {
var groupItemMetadataProvider = new Slick.Data.GroupItemMetadataProvider();
dataView = new Slick.Data.DataView({ groupItemMetadataProvider: groupItemMetadataProvider, inlineFilters: true });
grid = new Slick.Grid("#myGrid", dataView, columns, options);
// register the group item metadata provider to add expand/collapse group handlers
grid.registerPlugin(groupItemMetadataProvider);
grid.setSelectionModel(new Slick.CellSelectionModel());
var pager = new Slick.Controls.Pager(dataView, grid, "#pager");
var columnpicker = new Slick.Controls.ColumnPicker(columns, grid, options);
grid.onSort.subscribe(function (e, args) {
sortdir = args.sortAsc ? 1 : -1;
sortcol = args.sortCol.field;
// using native sort with comparer
// preferred method but can be very slow in IE with huge datasets
dataView.sort(comparer, args.sortAsc);
});
// wire up model events to drive the grid
dataView.onRowCountChanged.subscribe(function (e, args) {
grid.updateRowCount();
grid.render();
});
dataView.onRowsChanged.subscribe(function (e, args) {
grid.invalidateRows(args.rows);
grid.render();
setGroupCols();
});
var h_runfilters = null;
// wire up the slider to apply the filter to the model
var slider = document.getElementById("pcSlider");
var sliderCallback = function() {
Slick.GlobalEditorLock.cancelCurrentEdit();
if (percentCompleteThreshold != this.value) {
window.clearTimeout(h_runfilters);
h_runfilters = window.setTimeout(filterAndUpdate, 10);
percentCompleteThreshold = this.value;
}
}
slider.oninput = sliderCallback;
function filterAndUpdate() {
var isNarrowing = percentCompleteThreshold > prevPercentCompleteThreshold;
var isExpanding = percentCompleteThreshold < prevPercentCompleteThreshold;
var renderedRange = grid.getRenderedRange();
dataView.setFilterArgs({ percentComplete: percentCompleteThreshold });
dataView.setRefreshHints({
ignoreDiffsBefore: renderedRange.top,
ignoreDiffsAfter: renderedRange.bottom + 1,
isFilterNarrowing: isNarrowing,
isFilterExpanding: isExpanding
});
dataView.refresh();
prevPercentCompleteThreshold = percentCompleteThreshold;
}
// initialize the model after all the events have been hooked up
dataView.beginUpdate();
dataView.setFilter(myFilter);
dataView.setFilterArgs({ percentComplete: percentCompleteThreshold });
loadData(50);
groupByDuration();
dataView.endUpdate();
});
```
--------------------------------
### SlickGrid Initialization and Data View Setup
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-frozen-columns-tabs.html
Initializes the SlickGrid with specified options and sets up a DataView for handling data. Includes helper functions for validation, filtering, sorting, and adding new items.
```javascript
var dataView;
var grid;
var data = [];
var selectedRowIds = [];
function requiredFieldValidator(value) {
if (value == null || value == undefined || !value.length) return {valid: false, msg: "This is a required field"};
else return {valid: true, msg: null};
}
function myFilter(item) {
if (item["percentComplete"] < percentCompleteThreshold) return false;
if (searchString != "" && item["title"].indexOf(searchString) == -1) return false;
return true;
}
function percentCompleteSort(a, b) {
return a["percentComplete"] - b["percentComplete"];
}
function comparer(a, b) {
var x = a[sortcol], y = b[sortcol];
return (x == y ? 0 : (x > y ? 1 : -1));
}
function addItem(newItem, columnDef) {
var item = {"num": data.length, "id": "new_" + (Math.round(Math.random() * 10000)), "title": "New task", "duration": "1 day", "percentComplete": 0, "start": "01/01/2009", "finish": "01/01/2009", "effortDriven": false};
$.extend(item, newItem);
dataView.addItem(item);
}
function toggleFilterRow() {
grid.setTopPanelVisibility(!grid.getOptions().showTopPanel);
}
$(".grid-header .ui-icon")
.addClass("ui-state-default ui-corner-all")
.mouseover(function (e) {
$(e.target).addClass("ui-state-hover")
})
.mouseout(function (e) {
$(e.target).removeClass("ui-state-hover")
});
$(function () {
// prepare the data
for (var i = 0; i < 50000; i++) {
data[i] = {
"id": i,
"num": i,
"title": "Task " + i,
"duration": Math.round(Math.random() * 100) + " days",
"percentComplete": Math.round(Math.random() * 100),
"start": "01/01/2009",
"finish": "01/01/2009",
"effortDriven": (i % 5 == 0)
};
}
var options = {
editable: true,
enableAddRow: true,
enableCellNavigation: true,
asyncEditorLoading: true,
forceFitColumns: false,
autoEdit: false,
topPanelHeight: 25,
frozenColumn: 2,
frozenRow: 2
};
var columnpicker = new Slick.Controls.ColumnPicker(columns, grid, options);
dataView = new Slick.Data.DataView();
grid = new Slick.Grid($("#grid"), dataView, columns, options);
grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
var sb = new Slick.Controls.StatusBar(dataView, grid, $("#grid"));
// Initialize the editors
var columnbrushes = {};
grid.onCellChange.subscribe(function (e, args) {
dataView.updateItem(args.item.id, args.item);
});
grid.onKeyDown.subscribe(function (e, args) {
if (e.which == 27) {
if ($(".slick-edit-cell" !) {
grid.getEditController().cancelCurrentEdit();
}
e.stopImmediatePropagation();
}
});
dataView.onRowsChanged.subscribe(function (e, args) {
grid.invalidateRows(args.rows);
grid.render();
});
dataView.onRowCountChanged.subscribe(function (e, args) {
grid.updateRowCount();
grid.render();
});
$("#frozenColumn").val(options.frozenColumn);
$("#frozenRow").val(options.frozenRow);
$("#frozenColumn").change(function (e) {
var newFrozenColumn = parseInt($(e.target).val());
grid.setOptions({frozenColumn: newFrozenColumn});
});
$("#frozenRow").change(function (e) {
var newFrozenRow = parseInt($(e.target).val());
grid.setOptions({frozenRow: newFrozenRow});
});
// wire up the checkboxes
$("#chk-allow-edit").prop('checked', options.editable);
$("#chk-allow-edit").change(function (e) {
grid.setOptions({editable: e.target.checked});
});
$("#chk-enable-add-row").prop('checked', options.enableAddRow);
$("#chk-enable-add-row").change(function (e) {
grid.setOptions({enableAddRow: e.target.checked});
});
$("#chk-enable-cell-nav").prop('checked', options.enableCellNavigation);
$("#chk-enable-cell-nav").change(function (e) {
grid.setOptions({enableCellNavigation: e.target.checked});
});
$("#chk-async-editor-loading").prop('checked', options.asyncEditorLoading);
$("#chk-async-editor-loading").change(function (e) {
grid.setOptions({asyncEditorLoading: e.target.checked});
});
$("#chk-force-fit-columns").prop('checked', options.forceFitColumns);
$("#chk-force-fit-columns").change(function (e) {
grid.setOptions({forceFitColumns: e.target.checked});
});
$("#chk-auto-edit").prop('checked', options.autoEdit);
$("#chk-auto-edit").change(function (e) {
grid.setOptions({autoEdit: e.target.checked});
});
$("#chk-show-top-panel").prop('checked', options.showTopPanel);
$("#chk-show-top-panel").change(function (e) {
grid.setOptions({showTopPanel: e.target.checked});
});
$("#chk-show-status-bar").prop('checked', true);
$("#chk-show-status-bar").change(function (e) {
$(".slick-status-bar").toggle(e.target.checked);
});
$("#chk-show-column-picker").prop('checked', true);
$("#chk-show-column-picker").change(function (e) {
columnpicker.setVisible(e.target.checked);
});
$("#search-string").keyup(function (e) {
searchString = $("#search-string").val();
dataView.refresh();
});
$("#percentCompleteThreshold").val(percentCompleteThreshold);
$("#percentCompleteThreshold").change(function (e) {
percentCompleteThreshold = parseInt($(e.target).val());
dataView.refresh();
});
$("#custom-formatter-type").change(function (e) {
if (e.target.value == "date") {
grid.setColumns(columns);
}
else if (e.target.value == "percent") {
var newCols = columns.slice();
newCols[3] = {"id": "%", "name": "% Complete", "field": "percentComplete", "width": 100, "resizable": false, "formatter": Slick.Formatters.PercentCompleteBar, "editor": Slick.Editors.PercentComplete, "cannotTriggerInsert": true, "sortable": true};
grid.setColumns(newCols);
}
else if (e.target.value == "yesno") {
var newCols = columns.slice();
newCols[6] = {"id": "effort-driven", "name": "Effort Driven", "width": 100, "minWidth": 20, "maxWidth": 100, "cssClass": "cell-effort-driven", "field": "effortDriven", "formatter": Slick.Formatters.YesNo, "editor": Slick.Editors.YesNoSelect, "cannotTriggerInsert": true, "sortable": true};
grid.setColumns(newCols);
}
});
// initialize the model
dataView.beginUpdate();
dataView.setItems(data);
dataView.setFilterArgs({percentCompleteThreshold: percentCompleteThreshold, searchString: searchString});
dataView.setFilter(myFilter);
dataView.endUpdate();
});
```
--------------------------------
### Get Cell Node by Row and Column
Source: https://github.com/6pac/slickgrid/wiki/Slick.Grid
Retrieves the DOM element for a specific cell identified by its row and column index.
```javascript
grid.getCellNode(row, cell);
```
--------------------------------
### Initialize SlickGrid with Columns and Options
Source: https://github.com/6pac/slickgrid/blob/master/examples/example-row-detail-grouping.html
Sets up the SlickGrid instance with predefined columns and general options. Ensure explicitInitialization is true if you plan to call `init()` manually.
```javascript
var dataView;
var detailView;
var grid;
var data = [];
var columnFilters = {};
var sortcol = "title";
var sortdir = 1;
var fakeNames = ['John Doe', 'Jane Doe', 'Chuck Norris', 'Bumblebee', 'Jackie Chan', 'Elvis Presley', 'Bob Marley', 'Mohammed Ali', 'Bruce Lee', 'Rocky Balboa'];
var columns = [
{ id: "sel", name: "#", field: "num", behavior: "select", cssClass: "cell-selection", width: 40, resizable: false, selectable: false },
{ id: "title", name: "Title", field: "title", width: 85, minWidth: 85, cssClass: "cell-title", sortable: true },
{ id: "duration", name: "Duration", field: "duration", sortable: true, groupTotalsFormatter: sumTotalsFormatter },
{ id: "%", name: "% Complete", field: "percentComplete", width: 95, resizable: false, formatter: Formatters.PercentCompleteBar, groupTotalsFormatter: avgTotalsFormatter, sortable: true },
{ id: "start", name: "Start", field: "start", minWidth: 60 },
{ id: "finish", name: "Finish", field: "finish", minWidth: 60 },
{ id: "effort-driven", name: "Effort Driven", width: 90, minWidth: 20, maxWidth: 90, cssClass: "cell-effort-driven", field: "effortDriven", formatter: Formatters.Checkmark }
];
var options = {
editable: false,
enableAddRow: false,
enableCellNavigation: true,
enableColumnReorder: true,
explicitInitialization: true,
};
```