Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F9123553
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Subscribers
None
View Options
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®exp=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
Details
Attached
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
Attached To
rDWAPPS Web applications
Event Timeline
Log In to Comment