tmpl/ui/search.tmpl
{{$rin := RandTen}}
<div class="tabview" id="{{$rin}}" style="background-color:#fff;padding:10px;">
<div style="height:100%;overflow-y: auto;background:#fff;" class="over-flow-fix">
<div style="margin-bottom:1em;">
<p class="search-text" style="color:#333">Search for files in {{.Link}}/{{.Misc}}</p>
<textarea class="form-control search-field" placeholder="Search for" required></textarea>
<hr>
<button class="btn btn-primary search-confirm">Search</button>
<input type="checkbox" class="sens"><label style="color:#333;margin-left:5px;"> Case sensitive</label>
<input type="checkbox" class="top"><label style="color:#333;margin-left:5px;"> Search only this folder</label><br/>
<p class="search-count label label-primary"> </p>
</div>
<div class="list-group search-results">
</div>
</div>
<script type="text/javascript">
setTimeout(function() {
// $("#{{$rin}}
function BindSearch() {
let pkg = "{{.Link}}"
function search(text){
return new Promise((resolve, reject) => {
let path = "{{.Misc}}"
let caseS = $("#{{$rin}} .sens").is(":checked") + ""
let top = $("#{{$rin}} .top").is(":checked") + ""
$.ajax({url:"/api/search_project",type:"POST",data:{
pkg,path,text,top,caseS
}, success:function(html){
console.log(html)
resolve(html)
}, error:function(e){
reject(e)
}
});
})
}
function process(records){
let results = []
for (var i = records.length - 1; i >= 0; i--) {
let r = records[i]
let plStr = r.Snippet.split("")
for(var j = 0; j < r.Matches.length;j++){
let pair = r.Matches[j]
plStr[pair[0]] = "<span class='label label-primary'>" + plStr[pair[0]]
plStr[pair[1]] = plStr[pair[1]] + "</span>"
let sliceStart = pair[0] > 36 ? pair[0] - 35 : 0
let sliceEnd = plStr.length - pair[1] > 36 ? pair[1] + 35 : plStr.length
let slice = plStr.slice(sliceStart, sliceEnd)
let ent = {
text : slice.join(""),
path : r.File,
pair
}
results.push(ent)
}
}
return results
}
function addToView(data){
$("#{{$rin}} .search-results").html("")
$("#{{$rin}} .search-count").html("Found " + data.length + " matche(s)")
for (var i = data.length - 1; i >= 0; i--) {
let r = data[i]
r.text = r.text.split("\n").join("<br />")
let item = $("<div class='list-group-item'/>")
item.append("<small>" + r.path + "<small>")
item.append("<p>...<br/>" + r.text + "<br />...</p>")
let btn = $("<button class='btn btn-block btn-primary'>Open</button>")
btn.click( (e) => {
if(working) return;
working = true;
$(".loader-prog").css("display","block");
let parts = r.path.split(pkg)
let oPath = parts[1] ? parts[1] : r.path
let fp = pkg + "@pkg:"+ oPath
window.$goToPos = r.pair[0]
$.ajax({url:"/api/get",type:"POST",data:{space:pkg,type:"60",id:fp}, error:function(e){
working = false;
$(".loader-prog").css("display","none");
$(".ready-three").append($(e.responseText) );
}
});
})
item.append(btn)
$("#{{$rin}} .search-results").append(item)
}
}
$("#{{$rin}} .search-confirm").click(async function(){
let val = $("#{{$rin}} .search-field").val()
if(!val || val == ""){
swal("", "Please enter a search value.", "error");
return
}
try {
let result = await search(val)
let data = process(result)
addToView(data)
} catch (e) {
swal("Internal server error", "Please verify your search query. " + e.responseText, "error");
}
})
}
BindSearch();
}, 300);
addTab("{{.Link}} - Search in {{.Misc}}", "{{$rin}}");
</script>
</div>