Page MenuHomeSoftware Heritage

No OneTemporary

diff --git a/swh/web/templates/includes/origins-search.html b/swh/web/templates/includes/origins-search.html
index 2004d542..50f9903b 100644
--- a/swh/web/templates/includes/origins-search.html
+++ b/swh/web/templates/includes/origins-search.html
@@ -1,180 +1,190 @@
{% load static %}
<div class="panel panel-default" style="overflow-x: auto;">
<div class="panel-heading">
<h2>Search Software Heritage origins to browse</h2>
</div>
<div class="panel-body">
<form class="form-horizontal" id="search_origins">
<div class="input-group add-on">
<input class="form-control" placeholder="Enter string pattern(s) to search for in origin urls" type="text" id="origins-url-patterns"/>
<div class="input-group-btn">
<button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button>
</div>
</div>
</form>
<div class="swh-loading">
<img src="{% static 'img/swh-spinner.gif' %}"></img>
<p>Searching origins ...</p>
</div>
<div class="table-responsive">
<table class="table" id="origin-search-results">
<thead>
<tr>
<th>Origin type</th>
<th>Origin browse url</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
<ul class="pager">
<li class="disabled" id="origins-prev-results-button" style="cursor:pointer"><a>Previous</a></li>
<li class="disabled" id="origins-next-results-button" style="cursor:pointer"><a>Next</a></li>
</ul>
</div>
</div>
<script>
var origin_patterns;
var per_page = 15;
var limit = per_page * 10;
var offset = 0;
var origins_search_url = "{% url 'browse-origin-search' 'url_regexp' %}?limit=limit_val&offset=offset_val&regexp=true";
var origin_browse_url = "{% url 'browse-origin' 'type' 'origin_url' %}";
var search_request = null;
var current_data = null;
function populateOriginSearchResultsTable(data, offset) {
var local_offset = offset % limit;
- $("#origin-search-results tbody tr").remove();
- var table = $("#origin-search-results tbody");
- for (var i = local_offset ; i < local_offset + per_page && i < data.length ; ++i) {
- var elem = data[i];
- var tableRow = '<tr>';
- tableRow += '<td style="width: 100px;">' + elem.type + '</td>';
- var browse_url = origin_browse_url.replace('type', elem.type).replace('origin_url', elem.url);
- tableRow += '<td style="white-space: nowrap;"><a href="' + browse_url + '">' + browse_url + '</a></td>';
- tableRow += '</tr>';
- table.append(tableRow);
+ if (data.length > 0) {
+ $("#origin-search-results tbody tr").remove();
+ var table = $("#origin-search-results tbody");
+ for (var i = local_offset ; i < local_offset + per_page && i < data.length ; ++i) {
+ var elem = data[i];
+ var tableRow = '<tr>';
+ tableRow += '<td style="width: 100px;">' + elem.type + '</td>';
+ var browse_url = origin_browse_url.replace('type', elem.type).replace('origin_url', elem.url);
+ tableRow += '<td style="white-space: nowrap;"><a href="' + browse_url + '">' + browse_url + '</a></td>';
+ tableRow += '</tr>';
+ table.append(tableRow);
+ }
}
- if (data.length - local_offset < per_page) {
+ if (data.length - local_offset < per_page ||
+ (data.length < limit && (local_offset + per_page) == data.length)) {
$('#origins-next-results-button').addClass('disabled');
} else {
$('#origins-next-results-button').removeClass('disabled');
}
if (offset > 0) {
$('#origins-prev-results-button').removeClass('disabled');
} else {
$('#origins-prev-results-button').addClass('disabled');
}
+ in_search = false;
}
$(document).ready(function() {
if (typeof(Storage) !== "undefined") {
origin_patterns = sessionStorage.getItem("last-swh-origin-url-patterns");
var data = sessionStorage.getItem("last-swh-origin-search-results");
offset = sessionStorage.getItem("last-swh-origin-search-offset");
if (data) {
$("#origins-url-patterns").val(origin_patterns);
offset = parseInt(offset);
populateOriginSearchResultsTable(JSON.parse(data), offset);
}
}
});
// http://dsernst.com/2014/12/14/heaps-permutation-algorithm-in-javascript/
function swap(array, pos1, pos2) {
var temp = array[pos1];
array[pos1] = array[pos2];
array[pos2] = temp;
}
function heapsPermute(array, output, n) {
n = n || array.length; // set n default to array.length
if (n === 1) {
output(array);
} else {
for (var i = 1; i <= n; i += 1) {
heapsPermute(array, output, n - 1);
if (n % 2) {
var j = 1;
} else {
var j = i;
}
swap(array, j - 1, n - 1); // -1 to account for javascript zero-indexing
}
}
};
function searchOrigins(patterns, limit, search_offset, offset) {
origin_patterns = patterns;
var patterns_array = patterns.trim().replace(/\s+/g,' ').split(' ');
var patterns_permut = []
heapsPermute(patterns_array, function(p) {patterns_permut.push(p.join('.*'));})
var regex = patterns_permut.join('|');
var search_url = origins_search_url.replace('url_regexp', regex)
.replace('limit_val', limit)
.replace('offset_val', search_offset);
if (search_request) {
search_request.abort();
}
$(".swh-loading").addClass('show');
search_request = $.ajax({
url: search_url,
dataType: 'json',
error: function() {
search_request = null;
$(".swh-loading").removeClass('show');
+ in_search = false;
},
success: function (data) {
search_request = null;
current_data = data;
if (typeof(Storage) !== "undefined") {
sessionStorage.setItem("last-swh-origin-url-patterns", patterns);
sessionStorage.setItem("last-swh-origin-search-results", JSON.stringify(data));
sessionStorage.setItem("last-swh-origin-search-offset", offset);
}
- populateOriginSearchResultsTable(data, offset);
$(".swh-loading").removeClass('show');
+ populateOriginSearchResultsTable(data, offset);
}
});
}
$("#search_origins").submit(function (event) {
var patterns = $("#origins-url-patterns").val();
offset = 0;
+ in_search = true;
searchOrigins(patterns, limit, offset, offset);
event.preventDefault();
});
+ var in_search = false;
+
$("#origins-next-results-button").click(function (event) {
- if ($("#origins-next-results-button").hasClass('disabled')) {
+ if ($("#origins-next-results-button").hasClass('disabled') || in_search) {
return;
}
+ in_search = true;
offset += per_page;
if (!current_data || offset % limit == 0) {
searchOrigins(origin_patterns, limit, offset, offset);
} else {
populateOriginSearchResultsTable(current_data, offset);
}
event.preventDefault();
});
$("#origins-prev-results-button").click(function (event) {
- if ($("#origins-prev-results-button").hasClass('disabled')) {
+ if ($("#origins-prev-results-button").hasClass('disabled') || in_search) {
return;
}
+ in_search = true;
offset -= per_page;
if (!current_data || (offset > 0 && (offset + per_page) % limit == 0)) {
searchOrigins(origin_patterns, limit, (offset + per_page) - limit, offset);
} else {
populateOriginSearchResultsTable(current_data, offset);
}
event.preventDefault();
});
</script>
\ No newline at end of file

File Metadata

Mime Type
text/x-diff
Expires
Sat, Jun 21, 5:40 PM (1 w, 6 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3447351

Event Timeline