Mobile-responsive personal website, generated using Hugo.
				https://kevin-mok.com/
			
			
		
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							104 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							104 lines
						
					
					
						
							2.8 KiB
						
					
					
				
								const log = console.log
							 | 
						|
								
							 | 
						|
								const headerKeys = {
							 | 
						|
								  "status": "Status",
							 | 
						|
								  "url": "URL",
							 | 
						|
								  "description": "Description",
							 | 
						|
								  "repo": "Repository"
							 | 
						|
								}
							 | 
						|
								const keyOrder = ["status", "url", "description", "repo"]
							 | 
						|
								
							 | 
						|
								const generateTableHead = table => {
							 | 
						|
								  let thead = table.createTHead();
							 | 
						|
								  let row = thead.insertRow();
							 | 
						|
								  keyOrder.forEach(key => {
							 | 
						|
								    let th = document.createElement("th");
							 | 
						|
								    th.textContent = headerKeys[key];
							 | 
						|
								    row.appendChild(th);
							 | 
						|
								  })
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								const generateTable = (table, data) => {
							 | 
						|
								  data.forEach(elem => {
							 | 
						|
								    let row = table.insertRow();
							 | 
						|
								    keyOrder.forEach(key => {
							 | 
						|
								      const cell = row.insertCell();
							 | 
						|
								      cell.className = key;
							 | 
						|
								      const aElem = document.createElement('a')
							 | 
						|
								      aElem.target = '_blank'
							 | 
						|
								      switch (key) {
							 | 
						|
								        case 'status':
							 | 
						|
								          // cell.textContent = ((elem[key] == 'up') ? '🗸' : '✗')
							 | 
						|
								          const statusIcon = document.createElement('img')
							 | 
						|
								          statusIcon.src = '/img/server/' + ((elem[key] == 'up') ? 'check' : 'x') + '.svg'
							 | 
						|
								          cell.appendChild(statusIcon)
							 | 
						|
								          break
							 | 
						|
								        case 'url':
							 | 
						|
								          aElem.href = elem[key]
							 | 
						|
								          aElem.textContent = elem['shortUrl']
							 | 
						|
								          cell.appendChild(aElem)
							 | 
						|
								          break
							 | 
						|
								        case 'description':
							 | 
						|
								          cell.innerHTML = elem[key]
							 | 
						|
								          break
							 | 
						|
								        case 'repo':
							 | 
						|
								          aElem.href = elem['repoUrl']
							 | 
						|
								          aElem.textContent = elem[key]
							 | 
						|
								          cell.appendChild(aElem)
							 | 
						|
								          break
							 | 
						|
								        default:
							 | 
						|
								          cell.textContent = elem[key]
							 | 
						|
								      }
							 | 
						|
								    })
							 | 
						|
								  })
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								const getDurationSince = (date, verbose) => { 
							 | 
						|
								  const milli = Math.abs(Date.now() - date)
							 | 
						|
								  let mins = Math.floor(milli/1000/60)
							 | 
						|
								  const days = Math.floor(mins/60/24)
							 | 
						|
								  mins %= 60*24
							 | 
						|
								  const hours = Math.floor(mins/60)
							 | 
						|
								  mins %= 60
							 | 
						|
								
							 | 
						|
								  let dayString = ''
							 | 
						|
								  let hourString = ''
							 | 
						|
								  let minString = ''
							 | 
						|
								  if (days > 0) {
							 | 
						|
								    dayString += days
							 | 
						|
								    if (!verbose) {
							 | 
						|
								      dayString += 'd '
							 | 
						|
								    } else {
							 | 
						|
								      dayString += (days == 1) ? ' day' : ' days'
							 | 
						|
								      dayString += ', '
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								  if (hours > 0) {
							 | 
						|
								    hourString += hours
							 | 
						|
								    if (!verbose) {
							 | 
						|
								      hourString += 'h '
							 | 
						|
								    } else {
							 | 
						|
								      hourString += (hours == 1) ? ' hour' : ' hours'
							 | 
						|
								      hourString += ', '
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								  minString += (mins > 0) ? mins: '0' 
							 | 
						|
								  if (!verbose) {
							 | 
						|
								    minString += 'm'
							 | 
						|
								  } else {
							 | 
						|
								    minString += (mins == 1) ? ' minute' : ' minutes'
							 | 
						|
								  }
							 | 
						|
								  return dayString + hourString + minString
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								fetch("/server-apps.json")
							 | 
						|
								  .then(response => response.json())
							 | 
						|
								  .then(json => {
							 | 
						|
								    let table = document.querySelector("table");
							 | 
						|
								    generateTable(table, json['sites']);
							 | 
						|
								    generateTableHead(table);
							 | 
						|
								    document.querySelector('#last-updated-time').textContent =
							 | 
						|
								      getDurationSince(new Date(json['updateTime']), false) + ' ago.'
							 | 
						|
								    document.querySelector('#server-uptime-time').textContent = 
							 | 
						|
								      getDurationSince(new Date(json['upSince']), true) + '.'
							 | 
						|
								  });
							 |