### 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, }; ```