base: add option to filter by repo

mostly useful to show only cygwin packages for example
This commit is contained in:
Christoph Reiter 2025-01-17 11:29:18 +01:00
parent bf40a8d007
commit b4dd495b8d
3 changed files with 51 additions and 14 deletions

View File

@ -8,6 +8,24 @@
<h6 class="card-subtitle mb-2 text-muted">{{ sources|length }} base packages</h6>
</div>
<div class="card-body overflow-auto">
<form class="row g-2 align-items-center" action="{{ url_for('baseindex') }}" method="get">
<div class="col-auto">
Repository:
</div>
<div class="col-auto">
<select name="repo" class="form-select form-select-sm" onchange="this.form.submit()">
<option {{ "selected" if not repo_filter or "" }} value="">All</option>
{% for r in repos %}
<option value="{{ r.name }}" {{ "selected" if repo_filter == r.name or "" }}>{{ r.name }}</option>
{% endfor %}
</select>
</div>
</form>
<br>
<table class="table table-hover table-sm" style="table-layout: fixed; width:100%;">
<colgroup>
<col style="width: 25%">

View File

@ -12,7 +12,7 @@
<a class="nav-link {{ 'active' if is_endpoint('repos') else '' }}" href="{{ url_for('repos') }}">Repos</a>
</li>
<li class="nav-item">
<a class="nav-link {{ 'active' if is_endpoint('base') else '' }}" href="{{ url_for('base') }}">Base Packages</a>
<a class="nav-link {{ 'active' if is_endpoint('base') else '' }}" href="{{ url_for('baseindex') }}">Base Packages</a>
</li>
<li class="nav-item">
<a class="nav-link {{ 'active' if is_endpoint('packages') else '' }}" href="{{ url_for('packages') }}">Packages</a>

View File

@ -237,22 +237,41 @@ async def index(request: Request, response: Response) -> Response:
@router.get('/base', dependencies=[Depends(Etag(get_etag))])
@router.get('/base/{base_name}', dependencies=[Depends(Etag(get_etag))])
async def base(request: Request, response: Response, base_name: str | None = None) -> Response:
async def baseindex(request: Request, response: Response, repo: str | None = None) -> Response:
global state
if base_name is not None:
if base_name in state.sources:
res = [state.sources[base_name]]
else:
res = []
return templates.TemplateResponse(request, "base.html", {
"sources": res,
}, status_code=200 if res else 404, headers=dict(response.headers))
repo_filter = repo or None
repos = get_repositories()
filtered: list[Source] = []
if repo_filter is None:
filtered = list(state.sources.values())
else:
return templates.TemplateResponse(request, "baseindex.html", {
"sources": state.sources.values(),
}, headers=dict(response.headers))
for s in state.sources.values():
for p in s.packages.values():
if p.repo == repo_filter:
filtered.append(s)
break
return templates.TemplateResponse(request, "baseindex.html", {
"sources": filtered,
"repos": repos,
"repo_filter": repo_filter,
}, headers=dict(response.headers))
@router.get('/base/{base_name}', dependencies=[Depends(Etag(get_etag))])
async def base(request: Request, response: Response, base_name: str) -> Response:
global state
if base_name in state.sources:
res = [state.sources[base_name]]
else:
res = []
return templates.TemplateResponse(request, "base.html", {
"sources": res,
}, status_code=200 if res else 404, headers=dict(response.headers))
@router.get('/security', dependencies=[Depends(Etag(get_etag))])