Event Timeline
Comment Actions
deposit.js:
/**
* Copyright (C) 2018-2020 The Software Heritage developers
* See the AUTHORS file at the top-level directory of this distribution
* License: GNU Affero General Public License version 3, or any later version
* See top-level LICENSE file for more information
*/
function genSwhLink(data, type) {
if (type === 'display') {
if (data && data.startsWith('swh')) {
let browseUrl = Urls.browse_swh_id(data);
return `<a href="${browseUrl}">${data}</a>`;
}
}
return data;
}
function swhPatternMatch(string, pattern) {
// Check if a string match a given pattern
return (typeof string === 'string' || string instanceof String) &&
string.search(pattern) !== -1;
}
function swhUpdateDataWithoutExcludedPattern(settings, data, dataIndex) {
// expect data to be a dict
console.log('swh update - settings', settings);
console.log('swh update - data index', dataIndex);
console.log('swh update - data', data);
let excludePattern = $('#swh-admin-deposit-list-exclude-filter').val();
console.log('swh update - exclude pattern', excludePattern);
if (swhPatternMatch(data["external_id"], excludePattern)) {
return false;
}
return true;
// for (const key in data) {
// console.log('swh update - key: ', key);
// let value = data[key];
// console.log('swh update - value: ', value);
// if (swhPatternMatch(value, excludePattern)) {
// return false; // exclude the data from filtering
// }
// }
// return true;
}
export function initDepositAdmin() {
let depositsTable;
$(document).ready(() => {
$.fn.dataTable.ext.errMode = 'none'; // none (prod), alert (default), throw
// including the custom exclude filtering
$.fn.dataTable.ext.search.push(swhUpdateDataWithoutExcludedPattern);
depositsTable = $('#swh-admin-deposit-list')
.on('error.dt', (e, settings, techNote, message) => {
$('#swh-admin-deposit-list-error').text(message);
})
.DataTable({
serverSide: true,
processing: true,
// let's define the order of table options display
// f: (f)ilter
// l: (l)ength changing
// r: p(r)ocessing
// t: (t)able
// i: (i)nfo
// p: (p)agination
// see https://datatables.net/examples/basic_init/dom.html
dom: '<<f<"#list-exclude">l>rt<"bottom"ip>>',
// list-exclude is a custom filter
// see https://datatables.net/examples/advanced_init/dom_toolbar.html
ajax: Urls.admin_deposit_list(),
// rowCallback: function(row, data) {
// const api = this.api();
// let excludePattern = $('#swh-admin-deposit-list-exclude-filter').val();
// // console.log('row-callback - ', row);
// // console.log('row-callback - ', data);
// for (const key in data) {
// // console.log('row callback - key: ', key);
// let value = data[key];
// // console.log('row callback - value: ', value);
// if (swhPatternMatch(value, excludePattern)) {
// console.log('row callback, should be removed', key, value);
// api.rows(row).remove().draw();
// break;
// }
// }
// },
columns: [
{
data: 'id',
name: 'id'
},
{
data: 'swh_id_context',
name: 'swh_id_context',
render: (data, type, row) => {
if (data && type === 'display') {
let originPattern = ';origin=';
let originPatternIdx = data.indexOf(originPattern);
if (originPatternIdx !== -1) {
let originUrl = data.slice(originPatternIdx + originPattern.length);
let nextSepPattern = ';';
let nextSepPatternIdx = originUrl.indexOf(nextSepPattern);
if (nextSepPatternIdx !== -1) { /* Remove extra context */
originUrl = originUrl.slice(0, nextSepPatternIdx);
}
return `<a href="${originUrl}">${originUrl}</a>`;
}
}
return data;
}
},
{
data: 'reception_date',
name: 'reception_date',
render: (data, type, row) => {
if (type === 'display') {
let date = new Date(data);
return date.toLocaleString();
}
return data;
}
},
{
data: 'status',
name: 'status'
},
{
data: 'status_detail',
name: 'status_detail',
render: (data, type, row) => {
if (type === 'display' && data) {
let text = data;
if (typeof data === 'object') {
text = JSON.stringify(data, null, 4);
}
return `<div style="width: 200px; white-space: pre; overflow-x: auto;">${text}</div>`;
}
return data;
},
orderable: false,
visible: false
},
{
data: 'swh_id',
name: 'swh_id',
render: (data, type, row) => {
return genSwhLink(data, type);
},
orderable: false,
visible: false
},
{
data: 'swh_id_context',
name: 'swh_id_context',
render: (data, type, row) => {
return genSwhLink(data, type);
},
orderable: false,
visible: false
}
],
scrollX: true,
scrollY: '50vh',
scrollCollapse: true,
order: [[0, 'desc']]
});
// Some more customization is needed on the table
$('div#list-exclude').html(`<div id="swh-admin-deposit-list-exclude-wrapper">
<div id="swh-admin-deposit-list-exclude-div-wrapper" class="dataTables_filter">
<label>
Exclude:<input id="swh-admin-deposit-list-exclude-filter"
type="search"
value="check-deposit"
class="form-control form-control-sm"
placeholder="exclude-pattern" aria-controls="swh-admin-deposit-list">
</input>
</label>
</div>
</div>
`);
// Adding exclusion pattern update behavior
$('#swh-admin-deposit-list-exclude-filter').keyup(function() {
depositsTable.draw();
});
// search with current default search so that it uses the excluding pattern
// and then draw
depositsTable.search(".*", true);
depositsTable.draw();
});
$('a.toggle-col').on('click', function(e) {
e.preventDefault();
var column = depositsTable.column($(this).attr('data-column'));
column.visible(!column.visible());
if (column.visible()) {
$(this).removeClass('col-hidden');
} else {
$(this).addClass('col-hidden');
}
});
}