Files

64 lines
2.1 KiB
JavaScript

'use strict';
'require baseclass';
return baseclass.extend({
__init__: function() {
var view = document.querySelector('#view');
if (!view)
return;
var frame = null;
var update = function() {
frame = null;
view.querySelectorAll('.cbi-dynlist > .item[data-key]').forEach(function(item) {
if (item.querySelector('.argon-key-details'))
return;
var name = item.querySelector(':scope > strong');
var metadata = item.querySelector(':scope > small');
if (!name || !metadata)
return;
// The native preview is abbreviated base64, not a key fingerprint.
var preview = metadata.lastElementChild;
if (preview && preview.tagName === 'CODE') {
if (preview.previousSibling && preview.previousSibling.nodeName === 'BR')
preview.previousSibling.remove();
preview.remove();
}
var remove = document.createElement('button');
remove.type = 'button';
remove.className = 'cbi-button cbi-button-remove argon-key-delete';
remove.textContent = _('Delete');
remove.setAttribute('aria-label', _('Delete key') + ': ' + name.textContent);
remove.disabled = !L.hasViewPermission();
remove.addEventListener('click', function(ev) {
ev.stopPropagation();
// Dispatch on the original item so its native confirmation keeps
// the exact data-key and the original authorization checks.
item.click();
});
var details = document.createElement('details');
var summary = document.createElement('summary');
var key = document.createElement('pre');
details.className = 'argon-key-details';
summary.textContent = _('Public key');
key.textContent = item.getAttribute('data-key');
details.append(summary, key);
// Expanding or selecting the key must not open Delete confirmation.
details.addEventListener('click', function(ev) { ev.stopPropagation(); });
item.append(remove, details);
item.classList.add('argon-key-item');
});
};
var schedule = function() {
if (frame === null)
frame = requestAnimationFrame(update);
};
new MutationObserver(schedule).observe(view, { childList: true, subtree: true });
schedule();
}
});