Mercurial > hg > NetworkVis
view query_builder/index.html @ 25:f82512502b31
Initial commit for query builder, still need to tailor for ISMI purposes
author | alistair |
---|---|
date | Mon, 23 Nov 2015 02:03:51 -0500 |
parents | |
children | 22be4ea663a7 |
line wrap: on
line source
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html" charset="UTF-8"> <title>Query Builder</title> <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="bootstrap/bootstrap-slider/css/bootstrap-slider.css"> <link rel="stylesheet" href="css/query-builder.default.min.css"> </head> <body style="background:none;"> <div role="navigation" class="navbar navbar-default navbar-static-top"> <div class="container"> <div class="row"> <div class="col-sm-6 col-md-6"> <ul class="nav navbar-nav"> </ul> </div> <div class="navbar-header col-sm-6 col-md-6"> <div class="logo-well"> <a href="//neo4j.com/developer-resources"> <img src="//neo4j-contrib.github.io/developer-resources/language-guides/assets/img/logo-white.svg" alt="Neo4j World's Leading Graph Database" id="logo"> </a> </div> <div class="navbar-brand"> <div class="brand">ISMI Query Builder</div> </div> </div> </div> </div> </div> <div class="container"> <div class="row" style="width: 95%"> <div class="col-md-12"> <div class="panel panel-default"> <div class="panel-heading" id="title">Query Builder</div> <div id="builder"></div> </div> </div> </div> </div> <script type="text/javascript" src="js/jquery-1.11.3.js"></script> <script type="text/javascript" src="js/d3.min.js"></script> <script type="text/javascript" src="bootstrap/bootstrap-datepicker/js/bootstrap-datepicker.js"></script> <script type="text/javascript" src="bootstrap/bootstrap-slider/js/bootstrap-slider.js"></script> <script type="text/javascript" src="js/query-builder.standalone.min.js"></script> <script> var rules_widgets = { condition: 'OR', rules: [{ id: 'date', operator: 'equal', value: '1991/11/17' }, { id: 'commentaries', operator: 'equal', value: 2 }, { id: 'author', operator: 'equal', value: 'Šaraf al-Dīn Maḥmūd ibn Muḥammad ibn ʿUmar al-Jaġmīnī al-Ḫwārizmī' }, { condition: 'AND', rules: [{ id: 'coord', operator: 'equal', value: 'B.3' }] }] }; $('#builder').queryBuilder({ filters: [{ id: 'date', label: 'Date', type: 'date', validation: { format: 'YYYY/MM/DD' }, plugin: 'datepicker', plugin_config: { format: 'yyyy/mm/dd', todayBtn: 'linked', todayHighlight: true, autoclose: true } }, { id: 'commentaries', label: 'Number of Commentaries', type: 'integer', validation: { min: 0, max: 15 }, plugin: 'slider', plugin_config: { min: 0, max: 15, value: 0 }, valueSetter: function(rule, value) { rule.$el.find('.rule-value-container input').slider('setValue', value); }, valueGetter: function(rule) { return rule.$el.find('.rule-value-container input').slider('getValue'); } }, { id: 'author', label: 'Author', alias: 'Witness', type: 'string', plugin: 'selectize', plugin_config: { valueField: 'id', labelField: 'name', searchField: 'name', sortField: 'name', create: true, maxItems: 1, plugins: ['remove_button'], onInitialize: function() { var that = this; if (localStorage.demoData === undefined) { $.getJSON(baseurl + '/assets/demo-data.json', function(data) { localStorage.demoData = JSON.stringify(data); data.forEach(function(item) { that.addOption(item); }); }); } else { JSON.parse(localStorage.demoData).forEach(function(item) { that.addOption(item); }); } } }, valueSetter: function(rule, value) { rule.$el.find('.rule-value-container input')[0].selectize.setValue(value); } }, { id: 'coord', label: 'Coordinates', type: 'string', validation: { format: /^[A-C]{1}.[1-6]{1}$/ }, input: function(rule, name) { var $container = rule.$el.find('.rule-value-container'); $container.on('change', '[name='+ name +'_1]', function(){ var h = ''; switch ($(this).val()) { case 'A': h = '<option value="-1">-</option> <option value="1">1</option> <option value="2">2</option>'; break; case 'B': h = '<option value="-1">-</option> <option value="3">3</option> <option value="4">4</option>'; break; case 'C': h = '<option value="-1">-</option> <option value="5">5</option> <option value="6">6</option>'; break; } $container.find('[name='+ name +'_2]').html(h).toggle(h!=''); }); return '\ <select name="'+ name +'_1"> \ <option value="-1">-</option> \ <option value="A">A</option> \ <option value="B">B</option> \ <option value="C">C</option> \ </select> \ <select name="'+ name +'_2" style="display:none;"></select>'; }, valueGetter: function(rule) { return rule.$el.find('.rule-value-container [name$=_1]').val() +'.'+ rule.$el.find('.rule-value-container [name$=_2]').val(); }, valueSetter: function(rule, value) { if (rule.operator.nb_inputs > 0) { var val = value.split('.'); rule.$el.find('.rule-value-container [name$=_1]').val(val[0]).trigger('change'); rule.$el.find('.rule-value-container [name$=_2]').val(val[1]).trigger('change'); } } }], rules: rules_widgets }); $('#btn-reset').on('click', function() { $('#builder-widgets').queryBuilder('reset'); }); $('#btn-set').on('click', function() { $('#builder-widgets').queryBuilder('setRules', rules_widgets); }); $('#btn-get').on('click', function() { var result = $('#builder-widgets').queryBuilder('getRules'); if (!$.isEmptyObject(result)) { alert(JSON.stringify(result, null, 2)); } }); </script> <!-- <script type="text/javascript"> 111 // make panels roll-up 112 $(".panel-heading").on("click", function() { 113 $(this).find(".clickhide").toggle(); 114 $(this).next().slideToggle(); 115 }); 116 // provide search and graph 117 backendApiPrefix = "/netvis-ismi"; 118 searchApi = {}; 119 $(function () { 120 function showText(text_id) { 121 $.get(backendApiPrefix+"/textandcommentaries/" + encodeURIComponent(text_id), 122 function (data) { 123 if (!data) return; 124 $("#title").text("Title: "+data.title); 125 var $list = $("#info").empty(); 126 $list.append($("<li>Author: " + data.author.label + " [" + data.author.ismi_id + "]</li>") 127 .click(function() { 128 search(data.author.ismi_id, true); 129 })); 130 for (var key in data.attrs) { 131 var val = data.attrs[key]; 132 if (key === "link") { 133 val = "<a href=\"" + val + "\" target=\"_blank\">" + val + "</a>"; 134 } 135 $list.append($("<li>" + key + ": " + val + "</li>")); 136 }; 137 // re-set selected 138 $("#graph .selected").each(function(){this.classList.remove("selected")}); 139 $("#graph .ismi-"+data.attrs.ismi_id).each(function(){this.classList.add("selected")}); 140 // add commentaries 141 var $commentaries = $("#commentaries").empty(); 142 for (var key in data.commentaries) { 143 var val = data.commentaries[key]; 144 $commentaries.append($("<li>" + val.title + " [<span class=\"text_id\">" + key + "</span>] by " + val.author + "</li>") 145 .click(function() { showText($(this).find("span.text_id").text());})); 146 } 147 var $commenting = $("#commenting").empty(); 148 for (var key in data.commenting) { 149 var val = data.commenting[key]; 150 $commenting.append($("<li>" + val.title + " [<span class=\"text_id\">" + key + "</span>] by " + val.author + "</li>") 151 .click(function() { showText($(this).find("span.text_id").text());})); 152 } 153 }, "json"); 154 return false; 155 } 156 function search(query, keep_detail_view) { 157 console.log("search query=", typeof query); 158 if (query == null || typeof query === "object") { 159 query=$("#search").find("input[name=search]").val(); 160 } 161 $.get(backendApiPrefix+"/search?q=" + encodeURIComponent(query), 162 function (data) { 163 var t = $("table#results tbody").empty(); 164 if (!data || data.length == 0) return; 165 // clear all marks 166 $("#graph .marked").each(function(){this.classList.remove("marked")}); 167 // fill table of titles 168 data.forEach(function (row) { 169 var text = row.text; 170 var author = row.author; 171 $("#author").text("Titles by Author: "+author.label+" ["+author.ismi_id+"]"); 172 var comm = row.is_commentary || row.has_commentaries; 173 var $row = $("<tr><td>" + text.label + "</td><td>" + text.full_title + "</td><td class='text_id'>" + text.ismi_id + "</td></tr>").appendTo(t) 174 .click(function() { showText($(this).find("td.text_id").text());}); 175 if (comm) { 176 $row.addClass("marked"); 177 } 178 // set mark 179 $("#graph .ismi-"+text.ismi_id).each(function(){this.classList.add("marked")}); 180 }); 181 if (!keep_detail_view) { 182 // show first title 183 showText(data[0].text.ismi_id); 184 } 185 }, "json"); 186 return false; 187 } 188 // export API 189 searchApi.showText = showText; 190 searchApi.search = search; 191 // start search 192 $("#search").submit(search); 193 search(); 194 }); 195 </script> --> <script type="text/javascript"> var width = 1400, height = 1400; var force = d3.layout.force() .charge(-100) // -200 .linkDistance(30) // 30 .size([width, height]); var svg = d3.select("#graph").append("svg") .attr("width", "1400px").attr("height", "1400px") .attr("pointer-events", "all"); // arrow head marker var defs = svg.append("defs").append("marker") .attr({ "id":"arrow", "markerUnits": "strokeWidth", "viewBox":"0 -5 10 10", "refX": 20, // 5 "refY":0, "markerWidth":4, "markerHeight":4, "orient":"auto" }) .append("path") .attr("d", "M0,-5 L10,0 L0,5") .attr("class","arrowHead"); </script> </body> </html>