BigW Consortium Gitlab

project_find_file.js 5.95 KB
Newer Older
1
/* eslint-disable func-names, space-before-function-paren, no-var, prefer-rest-params, wrap-iife, quotes, consistent-return, one-var, one-var-declaration-per-line, no-cond-assign, max-len, object-shorthand, no-param-reassign, comma-dangle, prefer-template, no-unused-vars, no-return-assign */
2 3
/* global fuzzaldrinPlus */

Fatih Acet committed
4
(function() {
5
  var bind = function(fn, me) { return function() { return fn.apply(me, arguments); }; };
Fatih Acet committed
6 7 8 9 10 11 12

  this.ProjectFindFile = (function() {
    var highlighter;

    function ProjectFindFile(element1, options) {
      this.element = element1;
      this.options = options;
13
      this.goToBlob = bind(this.goToBlob, this);
Fatih Acet committed
14 15 16 17 18
      this.goToTree = bind(this.goToTree, this);
      this.selectRowDown = bind(this.selectRowDown, this);
      this.selectRowUp = bind(this.selectRowUp, this);
      this.filePaths = {};
      this.inputElement = this.element.find(".file-finder-input");
19
      // init event
Fatih Acet committed
20
      this.initEvent();
21
      // focus text input box
Fatih Acet committed
22
      this.inputElement.focus();
23
      // load file list
Fatih Acet committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
      this.load(this.options.url);
    }

    ProjectFindFile.prototype.initEvent = function() {
      this.inputElement.off("keyup");
      this.inputElement.on("keyup", (function(_this) {
        return function(event) {
          var oldValue, ref, target, value;
          target = $(event.target);
          value = target.val();
          oldValue = (ref = target.data("oldValue")) != null ? ref : "";
          if (value !== oldValue) {
            target.data("oldValue", value);
            _this.findFile();
            return _this.element.find("tr.tree-item").eq(0).addClass("selected").focus();
          }
        };
      })(this));
    };

    ProjectFindFile.prototype.findFile = function() {
      var result, searchText;
      searchText = this.inputElement.val();
      result = searchText.length > 0 ? fuzzaldrinPlus.filter(this.filePaths, searchText) : this.filePaths;
      return this.renderList(result, searchText);
49
    // find file
Fatih Acet committed
50 51
    };

52
    // files pathes load
Fatih Acet committed
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
    ProjectFindFile.prototype.load = function(url) {
      return $.ajax({
        url: url,
        method: "get",
        dataType: "json",
        success: (function(_this) {
          return function(data) {
            _this.element.find(".loading").hide();
            _this.filePaths = data;
            _this.findFile();
            return _this.element.find(".files-slider tr.tree-item").eq(0).addClass("selected").focus();
          };
        })(this)
      });
    };

69
    // render result
Fatih Acet committed
70 71 72 73
    ProjectFindFile.prototype.renderList = function(filePaths, searchText) {
      var blobItemUrl, filePath, html, i, j, len, matches, results;
      this.element.find(".tree-table > tbody").empty();
      results = [];
74
      for (i = j = 0, len = filePaths.length; j < len; i = (j += 1)) {
Fatih Acet committed
75 76 77 78 79 80 81 82 83 84 85 86 87 88
        filePath = filePaths[i];
        if (i === 20) {
          break;
        }
        if (searchText) {
          matches = fuzzaldrinPlus.match(filePath, searchText);
        }
        blobItemUrl = this.options.blobUrlTemplate + "/" + filePath;
        html = this.makeHtml(filePath, matches, blobItemUrl);
        results.push(this.element.find(".tree-table > tbody").append(html));
      }
      return results;
    };

89
    // highlight text(awefwbwgtc -> <b>a</b>wefw<b>b</b>wgt<b>c</b> )
Fatih Acet committed
90 91 92 93 94
    highlighter = function(element, text, matches) {
      var highlightText, j, lastIndex, len, matchIndex, matchedChars, unmatched;
      lastIndex = 0;
      highlightText = "";
      matchedChars = [];
95
      for (j = 0, len = matches.length; j < len; j += 1) {
Fatih Acet committed
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
        matchIndex = matches[j];
        unmatched = text.substring(lastIndex, matchIndex);
        if (unmatched) {
          if (matchedChars.length) {
            element.append(matchedChars.join("").bold());
          }
          matchedChars = [];
          element.append(document.createTextNode(unmatched));
        }
        matchedChars.push(text[matchIndex]);
        lastIndex = matchIndex + 1;
      }
      if (matchedChars.length) {
        element.append(matchedChars.join("").bold());
      }
      return element.append(document.createTextNode(text.substring(lastIndex)));
    };

114
    // make tbody row html
Fatih Acet committed
115 116
    ProjectFindFile.prototype.makeHtml = function(filePath, matches, blobItemUrl) {
      var $tr;
117
      $tr = $("<tr class='tree-item'><td class='tree-item-file-name link-container'><a><i class='fa fa-file-text-o fa-fw'></i><span class='str-truncated'></span></a></td></tr>");
Fatih Acet committed
118 119 120
      if (matches) {
        $tr.find("a").replaceWith(highlighter($tr.find("a"), filePath, matches).attr("href", blobItemUrl));
      } else {
121 122
        $tr.find("a").attr("href", blobItemUrl);
        $tr.find(".str-truncated").text(filePath);
Fatih Acet committed
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
      }
      return $tr;
    };

    ProjectFindFile.prototype.selectRow = function(type) {
      var next, rows, selectedRow;
      rows = this.element.find(".files-slider tr.tree-item");
      selectedRow = this.element.find(".files-slider tr.tree-item.selected");
      if (rows && rows.length > 0) {
        if (selectedRow && selectedRow.length > 0) {
          if (type === "UP") {
            next = selectedRow.prev();
          } else if (type === "DOWN") {
            next = selectedRow.next();
          }
          if (next.length > 0) {
            selectedRow.removeClass("selected");
            selectedRow = next;
          }
        } else {
          selectedRow = rows.eq(0);
        }
        return selectedRow.addClass("selected").focus();
      }
    };

    ProjectFindFile.prototype.selectRowUp = function() {
      return this.selectRow("UP");
    };

    ProjectFindFile.prototype.selectRowDown = function() {
      return this.selectRow("DOWN");
    };

    ProjectFindFile.prototype.goToTree = function() {
      return location.href = this.options.treeUrl;
    };

161 162 163 164 165 166 167 168
    ProjectFindFile.prototype.goToBlob = function() {
      var $link = this.element.find(".tree-item.selected .tree-item-file-name a");

      if ($link.length) {
        $link.get(0).click();
      }
    };

Fatih Acet committed
169 170 171
    return ProjectFindFile;
  })();
}).call(this);