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 });