thestrukture/IDE

View on GitHub
tmpl/ui/search.tmpl

Summary

Maintainability
Test Coverage
{{$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>