Untitled

 avatar
unknown
plain_text
2 months ago
5.1 kB
2
Indexable
// First, let's modify your data to ensure we have good grouping fields
var data = [];
for (let i = 0; i < 100; i++) {
    data[i] = {
        id: i,
        Name: alp.charAt(Math.floor(Math.random() * 26)) + alp.charAt(Math.floor(Math.random() * 26)) + alp.charAt(Math.floor(Math.random() * 26)) + alp.charAt(Math.floor(Math.random() * 26)),
        Age: Math.round(Math.random() * 50),
        ClassName: Math.round(Math.random() * 12) + 'th',
        Percentage: Math.round(Math.random() * 100),
        Section: ['A', 'B', 'C'][Math.floor(Math.random() * 3)] // Adding section for nested grouping
    }
}

// Create grouping controls
var groupingControls = document.createElement('div');
groupingControls.style.margin = '10px';
groupingControls.innerHTML = `
    <div style="margin-bottom: 10px;">
        <label>Primary Group:</label>
        <select id="primaryGroup">
            <option value="ClassName">Class</option>
            <option value="Section">Section</option>
            <option value="PercentageRange">Percentage Range</option>
        </select>
        
        <label style="margin-left: 15px;">Secondary Group:</label>
        <select id="secondaryGroup">
            <option value="">None</option>
            <option value="ClassName">Class</option>
            <option value="Section">Section</option>
            <option value="PercentageRange">Percentage Range</option>
        </select>
        
        <button id="applyGrouping" style="margin-left: 10px;">Apply Grouping</button>
        <button id="expandAll" style="margin-left: 5px;">Expand All</button>
        <button id="collapseAll" style="margin-left: 5px;">Collapse All</button>
    </div>
`;
document.body.insertBefore(groupingControls, document.getElementById('myGrid'));

// Helper function to get percentage range
function getPercentageRange(item) {
    if (item.Percentage >= 0 && item.Percentage < 33) return "0-33%";
    if (item.Percentage >= 33 && item.Percentage < 66) return "33-66%";
    return "66-100%";
}

// Function to create grouping definition
function createGroupingDefinition(field) {
    let definition = {
        aggregators: [
            new Slick.Data.Aggregators.Avg("Percentage"),
            new Slick.Data.Aggregators.Sum("Percentage")
        ],
        aggregateCollapsed: true,
        lazyTotalsCalculation: true
    };

    switch(field) {
        case "ClassName":
            definition.getter = "ClassName";
            definition.formatter = function(g) {
                return `Class ${g.value} <span style='color:green'>(Count: ${g.count}, Avg: ${Math.round(g.avg.Percentage)}%)</span>`;
            };
            break;
        case "Section":
            definition.getter = "Section";
            definition.formatter = function(g) {
                return `Section ${g.value} <span style='color:blue'>(Count: ${g.count}, Avg: ${Math.round(g.avg.Percentage)}%)</span>`;
            };
            break;
        case "PercentageRange":
            definition.getter = getPercentageRange;
            definition.formatter = function(g) {
                return `Percentage ${g.value} <span style='color:purple'>(Count: ${g.count})</span>`;
            };
            break;
    }
    return definition;
}

// Function to apply grouping
function applyGrouping() {
    const primaryField = document.getElementById('primaryGroup').value;
    const secondaryField = document.getElementById('secondaryGroup').value;
    
    let groupingDefinitions = [];
    
    // Add primary grouping
    if (primaryField) {
        groupingDefinitions.push(createGroupingDefinition(primaryField));
    }
    
    // Add secondary grouping
    if (secondaryField) {
        groupingDefinitions.push(createGroupingDefinition(secondaryField));
    }
    
    dataView.setGrouping(groupingDefinitions);
}

// Add event listeners
document.getElementById('applyGrouping').addEventListener('click', applyGrouping);
document.getElementById('expandAll').addEventListener('click', function() {
    dataView.expandAllGroups();
});
document.getElementById('collapseAll').addEventListener('click', function() {
    dataView.collapseAllGroups();
});

// Initialize the grid
var groupItemMetadataProvider = new Slick.Data.GroupItemMetadataProvider();
var dataView = new Slick.Data.DataView({
    groupItemMetadataProvider: groupItemMetadataProvider
});

var options = {
    enableCellNavigation: true,
    editable: true,
    enableColumnReorder: false,
    createPreHeaderPanel: true,
    showPreHeaderPanel: true,
    preHeaderPanelHeight: 25
};

var grid = new Slick.Grid("#myGrid", dataView, columns, options);
grid.registerPlugin(groupItemMetadataProvider);

// Set up the data view
dataView.beginUpdate();
dataView.setItems(data);
applyGrouping(); // Apply initial grouping
dataView.endUpdate();

// 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();
});
Leave a Comment