OverviewFilesCommitsIssuesDocsReleasesPeers

pear-git-v3 / lib / web / pages / search.js

47 lines · javascript ref:
/**
 * GET /repos/:name/search?q=... — search files in a repo
 */

import { layout, escapeHtml } from '../helpers.js'

export async function renderRepoSearch (svc, ctx, repoName, query) {
  const prefix = (ctx && ctx.prefix) || ''
  const sync = svc._sync
  if (!sync) return errorPage('Sync service not running', ctx)

  let results = []
  if (query) {
    try {
      results = await sync.searchFiles(repoName, query)
    } catch (err) {
      return errorPage('Search error: ' + err.message, ctx)
    }
  }

  const body = `
<div class="card">
  <h2><a href="${prefix}/repos/${encodeURIComponent(repoName)}">${escapeHtml(repoName)}</a> / search</h2>
  <form method="GET" action="${prefix}/repos/${encodeURIComponent(repoName)}/search" style="margin-top:0.5rem">
    <div class="hstack">
      <input name="q" value="${escapeHtml(query || '')}" placeholder="Search file names..." style="flex:1">
      <button type="submit">Search</button>
    </div>
  </form>
</div>
${query ? `
<div class="card">
  <h2>${results.length} result${results.length === 1 ? '' : 's'} for "${escapeHtml(query)}"</h2>
  ${results.length === 0 ? '<div class="empty">(no matching files)</div>' : results.map(f => `
  <div class="item">
    <a href="${prefix}/repos/${encodeURIComponent(repoName)}/blob/${encodeURIComponent(f)}">${escapeHtml(f)}</a>
  </div>`).join('')}
</div>` : ''}
`
  return layout('search · ' + repoName, '/repos', body, ctx)
}

function errorPage (msg, ctx) {
  const body = `<div class="card"><h2>Error</h2><div class="empty">${escapeHtml(msg)}</div></div>`
  return layout('Error', '/repos', body, ctx)
}