od-database/templates/search.html
2018-06-26 20:21:24 -04:00

179 lines
8.8 KiB
HTML

{% extends "layout.html" %}
{% set current_page = "search" %}
{% set title = "OD-Database - Search" %}
{% block body %}
<div class="container">
<div class="card">
<div class="card-header">Search</div>
<div class="card-body">
<form action="/search">
<div class="form-row">
{# Query #}
<div class="form-group col-md-7">
<input class="form-control" name="q" id="q" placeholder="Query" value="{{ q }}">
</div>
{# Sort order #}
<div class="form-group col-md-3">
<select class="form-control" name="sort_order" title="Sort order">
<option disabled>Select sort order</option>
<option value="score" {{ "selected" if sort_order == "score" else "" }}>Relevance </option>
<option value="size_asc" {{ "selected" if sort_order == "size_asc" else "" }}>Size ascending </option>
<option value="size_dsc" {{ "selected" if sort_order == "size_dsc" else "" }}>Size descending</option>
<option value="date_asc" {{ "selected" if sort_order == "date_asc" else "" }}>Date ascending</option>
<option value="date_dsc" {{ "selected" if sort_order == "date_dsc" else "" }}>Date descending</option>
<option value="none" {{ "selected" if sort_order == "none" else "" }}>No order (faster)</option>
</select>
</div>
{# Results per page #}
<div class="form-group col-md-2">
<select class="form-control" name="per_page" title="Results per page">
<option disabled>Results per page</option>
{% for results in results_set %}
<option{{ " selected" if per_page == results }}>{{ results }}</option>
{% endfor %}
</select>
</div>
</div>
{# Filters #}
<span class="text-muted">Filters</span>
<div class="form-row">
{# File extension #}
<div class="form-group col-md-6">
<div class="input-group">
<div class="input-group-prepend">
<div class="input-group-text">.</div>
</div>
<input name="ext" placeholder="Extensions, comma-separated" class="form-control" value="{{ extensions }}">
</div>
</div>
</div>
{# Size #}
<input title="File size" id="sizeSlider">
<input type="hidden" name="size_min" id="sizeMin" value="{{ size_min }}">
<input type="hidden" name="size_max" id="sizeMax" value="{{ size_max }}">
<input class="btn btn-primary btn-shadow" type="submit" value="Search">
</form>
</div>
</div>
{% if results and results["hits"]["total"] > 0 %}
<div class="card">
<div class="card-body">
<span class="text-muted">{{ results["hits"]["total"] }} result(s) in {{ results["took"] }}ms</span>
<div class="table-responsive">
<table class="table">
<tbody>
{% for hit in results["hits"]["hits"] %}
{% set src = hit["_source"] %}
{% set hl_name = hit["highlight"]["name"][0] if "name" in hit["highlight"] else src["name"] %}
{% set hl_path = hit["highlight"]["path"][0] if "path" in hit["highlight"] else src["path"] %}
<tr>
<td>
{% set category = get_mime(src["ext"]) %}
{% set url = src["website_url"] + src["path"] + "/" + src["name"] + ("." if src["ext"] != "" else "") + src["ext"] %}
{# Preview #}
{% if category == "image" %}
<i class="fas fa-eye prev-icon" data-toggle="popover" tabindex="-1"
data-content='<img class="prev-img" src="{{ url }}">'></i>
{% endif %}
{# File name & link #}
<a href="{{ url }}"><span>{{ hl_name |safe }}{{ ("." if src["ext"] != "" else "") + src["ext"] }}</span></a>
{# File type badge #}
{% if category %}
<span class="badge badge-pill {{ get_color(category ) }}">
{{ src["ext"] }}
</span>
{% endif %}
{# File path #}
<div class="text-muted" title="{{ path }}" style="font-size: 10px;">
<a title="See files from this website" href="/website/{{ src["website_id"] }}">{{ src["website_url"] }}</a>{{ hl_path|safe }}
</div>
</td>
{# File size & date #}
<td style="white-space: nowrap; vertical-align: top; text-align: right; font-size: 14px">
<div>{{ src["size"] | filesizeformat if src["size"] >= 0 else "?" }}</div>
<code>{{ src["mtime"] | date_format }}</code>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if results["hits"]["total"] > (p + 1) * per_page %}
<a href="/search?q={{ q }}&p={{ p + 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}&ext={{ extensions }}&size_min={{ size_min }}&size_max={{ size_max }}"
class="btn btn-primary" style="float: right">Next</a>
{% endif %}
{% if p > 0 %}
<a href="/search?q={{ q }}&p={{ p - 1 }}&sort_order={{ sort_order }}&per_page={{ per_page }}&ext={{ extensions }}&size_min={{ size_min }}&size_max={{ size_max }}"
class="btn btn-primary">Previous</a>
{% endif %}
</div>
</div>
{% else %}
<div class="card">
<div class="card-body">No results</div>
</div>
{% endif %}
<script src="/static/js/report.js"></script>
<script>
$('[data-toggle="popover"]').popover({
trigger: "focus",
delay: {"show": 0, "hide": 100},
placement: "right",
html: true
});
//Size slider
var slider = $("#sizeSlider").ionRangeSlider({
type: "double",
grid: false,
force_edges: true,
min: 0,
max: 3684.03149864,
from: {{ size_min ** (1 / 3) if size_min else 0 }},
to: {{ (size_max ** (1 / 3)) if size_max else 3684.03149864}},
min_interval: 5,
drag_interval: true,
prettify: function (num) {
if(num === 0) {
return "0 B"
} else if (num >= 3684) {
return humanFileSize(num * num * num) + "+";
}
return humanFileSize(num * num * num)
},
onFinish: function(e) {
let size_min = (e.from * e.from * e.from);
let size_max = (e.to * e.to * e.to);
if (e.to >= 3684) {
size_max = null;
}
document.getElementById("sizeMin").value = size_min;
document.getElementById("sizeMax").value = size_max;
}
});
</script>
</div>
{% endblock body %}