info.html 5.26 KB
Newer Older
1 2 3 4 5 6 7 8
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Info</title>
    <script>
Anne Blankert's avatar
Anne Blankert committed
9 10 11
    let layerInfo = allLayerInfo = null;
    let sortFieldName = '';
    let sortAscending = true;
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

    function sortBy(name) {
        let fieldname;
        switch(name) {
            case 'schema': 
              fieldname = 'f_table_schema';
              break;
            case 'name': 
              fieldname = 'f_table_name';
              break;
            case 'geom_column': 
              fieldname = 'f_geometry_column';
              break;
            case 'geom_type':
              fieldname = 'type';
              break;
            case 'dim': 
              fieldname = 'coord_dimension';
              break;
31 32 33
            case 'type':
              fieldname = 'table_type';
              break;
34 35 36 37 38 39
            case 'count':
              fieldname = 'estimated_rows'
              break;
            default:
              fieldname = name;
        }
Anne Blankert's avatar
Anne Blankert committed
40 41 42 43
        
        if (sortFieldName != fieldname) {
            sortFieldName = fieldname;
            sortAscending = true;
44
        } else {
Anne Blankert's avatar
Anne Blankert committed
45
            sortAscending = !sortAscending;
46
        }
Anne Blankert's avatar
Anne Blankert committed
47
        updateLayerInfo(fieldname, sortAscending);
48 49 50 51 52 53 54 55 56 57 58 59 60
    }

    function updateLayerInfo(field, ascending) {
        const table = document.querySelector('#layerinfo');
        switch (field) {
            case 'f_table_schema':
                layerInfo.sort((item1, item2) => ('' + item1.f_table_schema + item1.f_table_name).localeCompare(item2.f_table_schema + item2.f_table_name))
                break;
            case 'f_table_name':
                layerInfo.sort((item1, item2) => ('' + item1[field]).localeCompare(item2[field]));
                break;
            case 'f_geometry_column':
            case 'type':
61
            case 'table_type':
62 63 64 65 66 67 68 69 70 71 72 73
            case 'coord_dimension':
                layerInfo.sort((item1, item2) => ('' + item1[field] + '.' +  item1.f_table_schema + '.' + item1.f_table_name).localeCompare(item2[field] + '.' + item2.f_table_schema + '.' + item2.f_table_name));
                break;
            case 'srid':
            layerInfo.sort((item1, item2)=>item1.srid-item2.srid?item1.srid-item2.srid:('' + item1.f_table_schema + item1.f_table_name).localeCompare(item2.f_table_schema + item2.f_table_name));
                break;
            case 'estimated_rows':
                layerInfo.sort((item1, item2)=>item1.estimated_rows-item2.estimated_rows);
        }
        if (!ascending) {
            layerInfo.reverse();
        }            
74
        table.innerHTML = '<tr><th>schema</th><th>name</th><th>geom_column</th><th>srid</th><th>geom_type</th><th>dim</th><th>type</th><th>count</th></tr>' +
75 76
            layerInfo.map(item=>`<tr>
                <td>${item.f_table_schema}</td>
77
                <td><a href="tableinfo.html?table=${item.f_table_schema}.${item.f_table_name}&geom_column=${item.f_geometry_column}&srid=${item.srid}&geomtype=${item.type}&dimensions=${item.coord_dimension}&estimated_rows=${item.estimated_rows}">${item.f_table_name}</a></td>
78 79 80 81
                <td>${item.f_geometry_column}</td>
                <td>${item.srid}</td>
                <td>${item.type}</td>
                <td>${item.coord_dimension}D</td>
82
                <td>${item.table_type}</td>
83 84 85 86 87 88 89
                <td>${item.estimated_rows}</td></tr>`).join('\n');
        const tableHeaders = document.querySelectorAll('tr > th');
        for (let i = 0; i < tableHeaders.length; i++) {
            tableHeaders[i].innerHTML = `<a href="#" onclick="sortBy('${tableHeaders[i].textContent}')">${tableHeaders[i].textContent}</a>`
        }
    }

Anne Blankert's avatar
Anne Blankert committed
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
    function filterLayerInfo() {
        const filterWords = document.querySelector('#filter')
            .value.split(' ')
            .filter(word=>word !== '')
            .map(word=>word.toLocaleLowerCase());
        if (filterWords.length) {
            layerInfo = allLayerInfo.filter(layer=>{
                const layerText = Object.values(layer).join(' ').toLocaleLowerCase();
                return filterWords.filter(word=>layerText.indexOf(word)>-1).length == filterWords.length;
            })
        } else {
            layerInfo = allLayerInfo;
        }
        updateLayerInfo(sortFieldName, sortAscending);
    }

106 107 108 109
    function init() {
        fetch('data/list_layers').then(response=>{
            if (response.ok) {
                response.json().then(json=> {
Anne Blankert's avatar
Anne Blankert committed
110 111
                    layerInfo = allLayerInfo = json;
                    filterLayerInfo();
112
                    sortBy('schema');
113
                })
Anne Blankert's avatar
Anne Blankert committed
114 115 116 117 118 119 120
            } else {
                layerInfo = allLayerInfo = [];
                response.json().then(json =>{
                    document.querySelector('#layerinfo').innerHTML = `<tr><td>Error fetching layers: ${json.error}</td></tr>`
                }).catch(err => {
                    document.querySelector('#layerinfo').innerHTML = `<tr><td>Error fetching layers: ${err}</td></tr>`
                });
121 122 123
            }
        })
    }
Anne Blankert's avatar
Anne Blankert committed
124

125 126 127
    </script>
</head>
<body onload="init()">
Anne Blankert's avatar
Anne Blankert committed
128
    <h1>Layers in database</h1>
129
    <input id="filter" type="text" placeholder="Search..." size="20" oninput="filterLayerInfo()"><br>
130
    <table id="layerinfo"></table>
131 132
</body>
</html>