| // Functions used by more than one element. |
| import { diffDate } from 'common-sk/modules/human' |
| import { unsafeHTML } from 'lit-html/directives/unsafe-html' |
| import { html, render } from 'lit-html' |
| |
| const linkRe = /(http[s]?:\/\/[^\s]*)/gm; |
| |
| /** |
| * Formats the text for a silence header. |
| * |
| * silence - The silence being displayed. |
| */ |
| export function displaySilence(silence) { |
| let ret = []; |
| for (let key in silence.param_set) { |
| if (key.startsWith('__')) { |
| continue |
| } |
| ret.push(`${silence.param_set[key].join(', ')}`); |
| } |
| let s = ret.join(' '); |
| if (s.length > 33) { |
| s = s.slice(0, 30) + '...'; |
| } |
| if (!s.length) { |
| s = '(*)'; |
| } |
| return s; |
| } |
| |
| /** |
| * Returns the params.abbr to be appended to a string, if present. |
| */ |
| export function abbr(ele) { |
| let s = ele.params['abbr']; |
| if (s) { |
| return ` - ${s}`; |
| } else { |
| return `` |
| } |
| } |
| |
| /** |
| * Convert all URLs in a string into links in a lit-html TemplateResult. |
| */ |
| export function linkify(s) { |
| return unsafeHTML(s.replace(linkRe, '<a href="$&" rel=noopener target=_blank>$&</a>')); |
| } |
| |
| /** |
| * Templates notes to be displayed. |
| */ |
| export function notes(ele) { |
| if (!ele._state.notes) { |
| return []; |
| } |
| return ele._state.notes.map((note, index) => html`<section class=note> |
| <p>${linkify(note.text)}</p> |
| <div class=meta> |
| <span class=author>${note.author}</span> |
| <span class=date>${diffDate(note.ts*1000)}</span> |
| <delete-icon-sk title='Delete comment.' @click=${(e) => ele._deleteNote(e, index)}></delete-icon-sk> |
| </div> |
| </section>`); |
| } |
| |
| const TIME_DELTAS = [ |
| { units: "w", delta: 7*24*60*60 }, |
| { units: "d", delta: 24*60*60 }, |
| { units: "h", delta: 60*60 }, |
| { units: "m", delta: 60 }, |
| { units: "s", delta: 1 }, |
| ]; |
| |
| /** |
| * Returns the parsed duration in seconds. |
| * |
| * @param {string} d - The duration, e.g. "2h" or "4d". |
| * @returns {number} The duration in seconds. |
| * |
| * TODO(jcgregorio) Move into common-sk/modules/human.js with tests. |
| */ |
| export function parseDuration(d) { |
| let units = d.slice(-1); |
| let scalar = +d.slice(0, -1); |
| for (let i = 0; i < TIME_DELTAS.length; i++) { |
| let o = TIME_DELTAS[i]; |
| if (o.units === units) { |
| return o.delta * scalar; |
| } |
| } |
| return 0 |
| } |
| |
| export function expiresIn(silence) { |
| if (silence.active) { |
| return diffDate((silence.created + parseDuration(silence.duration))*1000) |
| } else { |
| return '' |
| } |
| } |