d3treetable.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import * as d3 from "https://cdn.jsdelivr.net/npm/d3@7/+esm";
  2. function transform(tableData, data){
  3. var transformed = {};
  4. var columns = data.head.vars;
  5. transformed.roots = [];
  6. transformed.columns = columns;
  7. var rootsMap = [];
  8. tableData.forEach(item => {
  9. var parentID = item[columns[0]].value;
  10. var parentName = item[columns[1]].value;
  11. var childID = item[columns[2]].value;
  12. var childName = item[columns[3]].value;
  13. var parent = rootsMap[parentID];
  14. if (!parent){
  15. parent = {}
  16. parent[columns[0]] = parentID;
  17. parent[columns[1]] = parentName;
  18. transformed.roots.push(parent);
  19. rootsMap[parentID] = parent;
  20. parent.children = [];
  21. }
  22. var child = {};
  23. child[columns[2]] = childID;
  24. child[columns[3]] = childName;
  25. parent.children.push(child);
  26. });
  27. return transformed;
  28. }
  29. function treeTable(data, containerID) {
  30. var treeData = transform(data.results.bindings, data);
  31. var container = d3.select(containerID);
  32. var mainDiv = container.append('div');
  33. var columns = treeData.columns;
  34. var sections = mainDiv
  35. .selectAll('details').data(treeData.roots).enter().append('details')
  36. .classed("collapsible", true)
  37. .attr("open", true);
  38. sections.append('summary').text(function (d) {
  39. return d[columns[1]];
  40. });
  41. groups = sections.selectAll('ul')
  42. .data(function (row) {
  43. return [row];
  44. }).enter().append('ul').classed("content",true);
  45. content = groups.selectAll('li')
  46. .data(function (row) {
  47. return row.children;
  48. }).enter().append('li').text(function (d) {
  49. return " " + d[columns[3]];
  50. }).classed("content",true);
  51. return table;
  52. }
  53. export { treeTable };
  54. export default treeTable;