26 lines
1.6 KiB
JavaScript
26 lines
1.6 KiB
JavaScript
/* Saved-file rows share one accessible action area in both layouts. */
|
|
(function(root) {
|
|
'use strict';
|
|
const matches = (video, query) => !query || `${video.title || video.id} ${video.channel || ''}`.toLowerCase().includes(query.toLowerCase());
|
|
const paths = {
|
|
export: '<path d="M12 3v12m-5-5 5 5 5-5M4 17v4h16v-4"/>',
|
|
delete: '<path d="M4 7h16M9 7V4h6v3M6 7l1 13h10l1-13M10 11v6M14 11v6"/>'
|
|
};
|
|
function button(doc, kind, label, action) {
|
|
const b = doc.createElement('button'); b.type = 'button';
|
|
b.className = `saved-file-action${kind === 'delete' ? ' danger' : ''}`;
|
|
b.setAttribute('aria-label', label); b.title = label;
|
|
b.innerHTML = `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${paths[kind]}</svg>`;
|
|
b.onclick = e => { e.stopPropagation(); action(); }; return b;
|
|
}
|
|
function actions(row, video, exportFile, deleteFile) {
|
|
const doc = row.ownerDocument, group = doc.createElement('div');
|
|
group.className = 'saved-file-actions'; group.setAttribute('role', 'group');
|
|
group.setAttribute('aria-label', `File actions for ${video.title || video.id}`);
|
|
group.append(button(doc, 'export', `Save to this device: ${video.title || video.id}`, exportFile), button(doc, 'delete', `Delete saved file: ${video.title || video.id}`, deleteFile));
|
|
row.append(group);
|
|
}
|
|
const api = { matches, actions };
|
|
if (typeof module !== 'undefined') module.exports = api; else root.SavedPage = api;
|
|
})(typeof window !== 'undefined' ? window : globalThis);
|