Bokeh Collapsing

Adapting 'SlickGrid example 5: Collapsing' to Bokeh

by Jan Burgy

HTML

<!DOCTYPE html>
<!--suppress HtmlUnknownTarget, SpellCheckingInspection, JSUnresolvedLibraryURL -->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Collapsing DataTable</title>
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/bokeh/0.12.16/bokeh.min.css" />
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/bokeh/0.12.16/bokeh-tables.min.css" />

    <style>
        .toggle {
            height: 9px;
            width: 9px;
            display: inline-block;
        }
        .toggle.expand {
            background: url(https://cdnjs.cloudflare.com/ajax/libs/6pac-slickgrid/2.4.0/images/expand.gif) no-repeat center center;
        }
        .toggle.collapse {
            background: url(https://cdnjs.cloudflare.com/ajax/libs/6pac-slickgrid/2.4.0/images/collapse.gif) no-repeat center center;
        }
    </style>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/bokeh/0.12.16/bokeh.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bokeh/0.12.16/bokeh-api.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/bokeh/0.12.16/bokeh-tables.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>

<div class="bk-root" id="bokeh-root"></div>

<script>
const DataTable = Bokeh.require('models/widgets/tables/data_table');

class TreeFormatter extends Bokeh.Tables.CellFormatter {
    constructor(provider) {
        super();
        this.data = provider;
    }

    doFormat(row, cell, value, columnDef, dataContext) {
        const
            spacer = `<span style='display:inline-block;height:1px;width:${15 * dataContext.indent}px'></span>`,
            esc = {'&': '&amp', '<': '&lt', '"': '&quot', "'": '&#039'},
            safe = (value + '').replace(/&<@'/g, c => esc[c]),
            next = this.data.getItem(dataContext[DataTable.DTINDEX_NAME] + 1),
            toggle...