github.com/justinjmoses/evergreen@v0.0.0-20170530173719-1d50e381ff0d/public/static/js/filters/filters.common.js (about)

     1  /**
     2   *  filters.common.js
     3   *
     4   *  Created on: September 12, 2013
     5   *      Author: Valeri Karpov
     6   *
     7   *  Common AngularJS filters that will be used on most pages
     8   *
     9   */
    10  
    11  var filters = filters || {};
    12  
    13  filters.common = angular.module('filters.common', []);
    14  
    15  var LINK_REGEXP =
    16    /(http|https):\/\/([\w\-_]+(?:(?:\.[\w\-_]+)+))([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?/ig;
    17  
    18  var JIRA_REGEXP = /[A-Z]{1,10}-\d{1,6}/ig;
    19  
    20  filters.common.filter('conditional', function() {
    21    return function(b, t, f) {
    22      return b ? t : f;
    23    }
    24  }).filter('min', function() {
    25    return function(v, m) {
    26      return Math.min(v, m);
    27    };
    28  }).filter('default', function() {
    29    return function(input, def) {
    30      return input ? input : def;
    31    };
    32  }).filter('undef', function() {
    33    return function(v) {
    34      return v == null || v == undefined;
    35    };
    36  }).filter('shortenString', function() {
    37    // shortenString shortens a long string with the following options.
    38    // wordwise (boolean) - if true, cut only by words bounds
    39    // max (integer) - max length of the text, cut to this number of chars
    40    // tail (string, default: ' …') - add this string to the input string if the string was cut
    41    return function(value, wordwise, max, tail) {
    42      if (!value) {
    43          return '';
    44      }
    45  
    46      max = parseInt(max, 10);
    47      if (!max) {
    48          return value;
    49      }
    50      if (value.length <= max) {
    51          return value;
    52      }
    53  
    54      value = value.substr(0, max);
    55      if (wordwise) {
    56          var lastspace = value.lastIndexOf(' ');
    57          if (lastspace !== -1) {
    58              value = value.substr(0, lastspace);
    59          }
    60      }
    61  
    62      return value + (tail || ' …');
    63    };
    64  }).filter('pluralize', function() {
    65    return function(v, noun) {
    66      if (isNaN(v)) {
    67        return noun + 's';
    68      } else if (v == 1) {
    69        return noun;
    70      } else {
    71        return noun + 's';
    72      }
    73    };
    74  }).filter('capitalize', function() {
    75    return function(input) {
    76      if (!input) {
    77        return input;
    78      }
    79  
    80      var ret = "";
    81      var sp = input.split(' ');
    82  
    83      for (var i = 0; i < sp.length; ++i) {
    84        if (sp[i].charAt(0).toUpperCase() >= 'A' && sp[i].charAt(0).toUpperCase() <= 'Z') {
    85          sp[i] = sp[i].substr(0, 1).toUpperCase() + sp[i].substr(1);
    86        }
    87        ret += (i == 0 ? '' : ' ') + sp[i];
    88      }
    89  
    90      return ret;
    91    }
    92  }).filter('dateFromNanoseconds', function() {
    93    return function(v) {
    94      return new Date(v / (1000 * 1000));
    95    }
    96  }).filter('nanoToSeconds', function() {
    97    return function(nanoseconds) {
    98      return nanoseconds * 1000 * 1000 * 1000;
    99    }
   100  }).filter('stringifyNanoseconds', function() {
   101    var NS_PER_MS = 1000 * 1000; // 10^6
   102    var NS_PER_SEC = NS_PER_MS * 1000
   103    var NS_PER_MINUTE = NS_PER_SEC * 60;
   104    var NS_PER_HOUR = NS_PER_MINUTE * 60;
   105  
   106    // stringifyNanoseconds takes an integer count of nanoseconds and
   107    // returns it formatted as a human readable string, like "1h32m40s"
   108    // If skipDayMax is true, then durations longer than 1 day will be represented
   109    // in hours. Otherwise, they will be displayed as '>=1 day'
   110    return function(input, skipDayMax, skipSecMax) {
   111      if (input == 0) {
   112        return "0 seconds";
   113      } else if (input < NS_PER_MS) {
   114        return "< 1 ms";
   115      } else if (input < NS_PER_SEC) {
   116        if (skipSecMax){
   117          return Math.floor(input / NS_PER_MS) + " ms";
   118        } else {
   119          return "< 1 second"
   120        }
   121      } else if (input < NS_PER_MINUTE) {
   122        return Math.floor(input / NS_PER_SEC) + " seconds";
   123      } else if (input < NS_PER_HOUR) {
   124        return Math.floor(input / NS_PER_MINUTE) + "m " + Math.floor((input % NS_PER_MINUTE) / NS_PER_SEC) + "s";
   125      } else if (input < NS_PER_HOUR * 24 || skipDayMax) {
   126        return Math.floor(input / NS_PER_HOUR) + "h " +
   127            Math.floor((input % NS_PER_HOUR) / NS_PER_MINUTE) + "m " +
   128            Math.floor((input % NS_PER_MINUTE) / NS_PER_SEC) + "s";
   129      } else if (input == "unknown") {
   130        return "unknown";
   131      }  else {
   132        return ">= 1 day";
   133      }
   134    };
   135  }).filter('linkify', function() {
   136    return function(input) {
   137      var ret = "";
   138      var index = 0;
   139  
   140      if (!input) {
   141        return input;
   142      }
   143  
   144      return input.replace(LINK_REGEXP, function(match) {
   145        return '<a href="' + match + '">' + match + '</a>';
   146      });
   147    };
   148  }).filter('jiraLinkify', function() {
   149    return function(input, jiraHost) {
   150      if (!input) {
   151        return input;
   152      }
   153      return input.replace(JIRA_REGEXP, function(match) {
   154        return '<a href="https://'+jiraHost +'/browse/' + match + '">' + match + '</a>';
   155      });
   156    }
   157  }).filter('convertDateToUserTimezone', function() {
   158    return function(input, timezone, format) {
   159      return moment(input).tz(timezone).format(format);
   160    }
   161  }).filter('encodeUri', function() {
   162    return function(url) {
   163      return encodeURIComponent(url);
   164    }
   165  }).filter('ansi', function($window) {
   166    return function(input) {
   167      /* AnsiUp does some unexpected things in a pre tag, so run AnsiUp on a
   168       * line-by-line basis */
   169      return _.map(input.split('\n'), $window.ansi_up.ansi_to_html).join('\n');
   170    };
   171  }).filter('trustAsHtml', function($sce) {
   172    return function(input) {
   173      return $sce.trustAsHtml(input);
   174    };
   175  }).filter('escapeHtml', function() {
   176    return function(str) {
   177      var div = document.createElement('div');
   178      div.appendChild(document.createTextNode(str));
   179      return div.innerHTML;
   180    };
   181  }).filter('pretty', function() {
   182    return function(obj) {
   183      return JSON.stringify(obj, null, 2);
   184    };
   185  }).filter('ordinalNum', function() {
   186    // converts 1, 2, 3, etc. to 1st, 2nd, 3rd, etc.
   187    return function(n) {
   188      var s = ["th","st","nd","rd"], v = n % 100;
   189      // Past the first twenty, the first four of every ten have the special endings
   190      // Within in the first twenty, the first four have special endings
   191      // All of the others have the default ending
   192      return n + ( s[(v-20)%10] || s[v] || s[0] );
   193    }
   194  }).filter('range', function() {
   195    // Returns an array of numbers which are >= low and < high. Useful for when
   196    // your use case doesn't quite fit into an `in` loop for ng-repeat
   197    return function(low, high) {
   198      var ret = [];
   199      for (var i = low; i < high; ++i) {
   200        ret.push(i);
   201      }
   202      return ret;
   203    };
   204  }).filter('sample', function() {
   205    // Given a potentially long array, returns an array which contains equally
   206    // spaced elements from the original array such that there are no more than
   207    // `maxNum` elements. Effectively, gives you `maxNum` samples from the source
   208    // array.
   209    return function(arr, maxNum) {
   210      if (arr.length === 0) {
   211        return [];
   212      }
   213      if (arr.length < maxNum) {
   214        return arr;
   215      }
   216  
   217      var ret = [];
   218      var every = Math.floor(arr.length / maxNum);
   219      for (var i = 0; i < maxNum; ++i) {
   220        ret.push(arr[i * every]);
   221      }
   222      return ret;
   223    };
   224  }).filter('fixedPrecisionTimeDiff', function() {
   225    var SECOND = 1000;
   226    var MINUTE = 60 * SECOND;
   227    var HOUR = 60 * MINUTE;
   228    var DAY = 24 * HOUR;
   229  
   230    return function(diff) {
   231      if (diff < SECOND) {
   232        // ex: 433ms
   233        return diff + 'ms';
   234      } else if (diff < MINUTE) {
   235        // ex: 17.2s
   236        return Math.floor(diff / SECOND) + '.' +
   237          Math.floor((diff % SECOND ) / 100) + 's'
   238      } else if (diff < HOUR) {
   239        // ex: 12m48s
   240        return Math.floor(diff / MINUTE) + 'm' +
   241          Math.floor((diff % MINUTE) / SECOND) + 's';
   242      } else if (diff < DAY) {
   243        // ex: 13h27m
   244        return Math.floor(diff / HOUR) + 'h' +
   245          Math.floor((diff % HOUR) / MINUTE) + 'm';
   246      } else {
   247        return '>=1d';
   248      }
   249    };
   250  });