diff --git a/assets/src/bundles/admin/deposit.js b/assets/src/bundles/admin/deposit.js
index c3839ae9..ef7f773c 100644
--- a/assets/src/bundles/admin/deposit.js
+++ b/assets/src/bundles/admin/deposit.js
@@ -1,184 +1,206 @@
/**
* Copyright (C) 2018-2022 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
*/
import {getHumanReadableDate} from 'utils/functions';
-function genSwhLink(data, type) {
+function genSwhLink(data, type, linkText = '') {
if (type === 'display' && data && data.startsWith('swh')) {
const browseUrl = Urls.browse_swhid(data);
const formattedSWHID = data.replace(/;/g, ';
');
- return `${formattedSWHID}`;
+ if (!linkText) {
+ linkText = formattedSWHID;
+ }
+ return `${linkText}`;
}
return data;
}
-function genLink(data, type) {
+function genLink(data, type, openInNewTab = false, linkText = '') {
if (type === 'display' && data) {
const sData = encodeURI(data);
- return `${sData}`;
+ if (!linkText) {
+ linkText = sData;
+ }
+ let attrs = '';
+ if (openInNewTab) {
+ attrs = 'target="_blank" rel="noopener noreferrer"';
+ }
+ return `${linkText}`;
}
return data;
}
export function initDepositAdmin(username, isStaff) {
let depositsTable;
$(document).ready(() => {
$.fn.dataTable.ext.errMode = 'none';
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: '<<"d-flex justify-content-between align-items-center"f' +
'<"#list-exclude">l>rt<"bottom"ip>>',
// div#list-exclude is a custom filter added next to dataTable
// initialization below through js dom manipulation, see
// https://datatables.net/examples/advanced_init/dom_toolbar.html
ajax: {
url: Urls.admin_deposit_list(),
data: d => {
d.excludePattern = $('#swh-admin-deposit-list-exclude-filter').val();
if (!isStaff) {
d.username = username;
}
}
},
columns: [
{
data: 'id',
name: 'id'
},
{
data: 'type',
name: 'type'
},
{
data: 'uri',
name: 'uri',
render: (data, type, row) => {
- return genLink(data, type);
+ const sanitizedURL = $.fn.dataTable.render.text().display(data);
+ let swhLink = '';
+ let originLink = '';
+ if (row.swhid_context && data) {
+ swhLink = genSwhLink(row.swhid_context, type, sanitizedURL);
+ } else if (data) {
+ swhLink = sanitizedURL;
+ }
+ if (data) {
+ originLink = genLink(sanitizedURL, type, true,
+ '');
+ }
+ return swhLink + ' ' + originLink;
}
},
{
data: 'reception_date',
name: 'reception_date',
render: getHumanReadableDate
},
{
data: 'status',
name: 'status'
},
{
data: 'raw_metadata',
name: 'raw_metadata',
render: (data, type, row) => {
if (type === 'display') {
if (row.raw_metadata) {
- return ``;
+ return ``;
}
}
return data;
}
},
{
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 `
${escapedMetadata}
`,
'90%');
swh.webapp.highlightCode();
});
// Adding exclusion pattern update behavior, when typing, update search
$('#swh-admin-deposit-list-exclude-filter').keyup(function() {
depositsTable.draw();
});
// at last draw the table
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');
}
});
}
diff --git a/cypress/integration/deposit-admin.spec.js b/cypress/integration/deposit-admin.spec.js
index f3e18a49..a79daa4e 100644
--- a/cypress/integration/deposit-admin.spec.js
+++ b/cypress/integration/deposit-admin.spec.js
@@ -1,226 +1,239 @@
/**
* Copyright (C) 2020-2022 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
*/
// data to use as request query response
let responseDeposits;
let expectedOrigins;
let depositModerationUrl;
let depositListUrl;
+const $ = Cypress.$;
+
describe('Test moderation deposit Login/logout', function() {
before(function() {
depositModerationUrl = this.Urls.admin_deposit();
});
it('should not display deposit moderation link in sidebar when anonymous', function() {
cy.visit(depositModerationUrl);
cy.get(`.sidebar a[href="${depositModerationUrl}"]`)
.should('not.exist');
});
it('should not display deposit moderation link when connected as unprivileged user', function() {
cy.userLogin();
cy.visit(depositModerationUrl);
cy.get(`.sidebar a[href="${depositModerationUrl}"]`)
.should('not.exist');
});
it('should display deposit moderation link in sidebar when connected as privileged user', function() {
cy.depositLogin();
cy.visit(depositModerationUrl);
cy.get(`.sidebar a[href="${depositModerationUrl}"]`)
.should('exist');
});
it('should display deposit moderation link in sidebar when connected as staff member', function() {
cy.adminLogin();
cy.visit(depositModerationUrl);
cy.get(`.sidebar a[href="${depositModerationUrl}"]`)
.should('exist');
});
});
describe('Test admin deposit page', function() {
before(function() {
depositModerationUrl = this.Urls.admin_deposit();
depositListUrl = this.Urls.admin_deposit_list();
});
beforeEach(() => {
responseDeposits = [
{
'id': 614,
'type': 'code',
'external_id': 'ch-de-1',
'reception_date': '2020-05-18T13:48:27Z',
'status': 'done',
'status_detail': null,
'swhid': 'swh:1:dir:ef04a768',
'swhid_context': 'swh:1:dir:ef04a768;origin=https://w.s.o/c-d-1;visit=swh:1:snp:b234be1e;anchor=swh:1:rev:d24a75c9;path=/',
'raw_metadata': '