75 lines
2.8 KiB
JavaScript
75 lines
2.8 KiB
JavaScript
// Logseq Import Plugin — frontend.
|
|
//
|
|
// Injects a footer button + hidden file input, posts the selected ZIP to
|
|
// /api/import-logseq, and refreshes the board when the import completes.
|
|
|
|
const hyprcrd = window.hyprcrd;
|
|
if (!hyprcrd) throw new Error('[logseq-import] window.hyprcrd not found');
|
|
|
|
function injectFooterButton() {
|
|
const footer = document.querySelector('footer');
|
|
if (!footer) return;
|
|
if (footer.querySelector('#logseq-import-btn')) return;
|
|
|
|
// Anchor before the settings button so the order matches the previous core layout.
|
|
const settingsBtn = footer.querySelector('#settings-btn');
|
|
const group = settingsBtn?.parentElement || footer.querySelector('.flex.items-center.gap-2');
|
|
if (!group) return;
|
|
|
|
const fileInput = document.createElement('input');
|
|
fileInput.type = 'file';
|
|
fileInput.id = 'logseq-import-file';
|
|
fileInput.accept = '.zip,application/zip';
|
|
fileInput.className = 'hidden';
|
|
group.insertBefore(fileInput, settingsBtn || null);
|
|
|
|
const btn = document.createElement('button');
|
|
btn.id = 'logseq-import-btn';
|
|
btn.className = 'flex items-center gap-1.5 px-2.5 py-1 text-xs border border-t-border text-t-muted hover:border-t-accent hover:text-t-accent transition-colors';
|
|
btn.innerHTML = '<i class="ph ph-graph text-sm"></i><span class="font-pixel text-[10px]">Logseq import</span>';
|
|
group.insertBefore(btn, settingsBtn || null);
|
|
|
|
btn.addEventListener('click', () => fileInput.click());
|
|
fileInput.addEventListener('change', async (e) => {
|
|
const file = e.target.files?.[0];
|
|
if (!file) return;
|
|
const form = new FormData();
|
|
form.append('file', file);
|
|
try {
|
|
const res = await fetch('api/import-logseq', {
|
|
method: 'POST',
|
|
body: form,
|
|
headers: { 'X-CSRF-Token': hyprcrd.util.csrf() },
|
|
});
|
|
const data = await res.json();
|
|
if (data.error) throw new Error(data.error);
|
|
await window._reloadAll?.();
|
|
await hyprcrd.dialog.show({
|
|
title: 'logseq import',
|
|
message: `${data.imported} cards, ${data.assets} images imported`,
|
|
okLabel: 'Ok',
|
|
});
|
|
} catch (err) {
|
|
await hyprcrd.dialog.show({
|
|
title: 'logseq import failed',
|
|
message: String(err?.message || err) || 'unknown error',
|
|
danger: true,
|
|
okLabel: 'Ok',
|
|
});
|
|
}
|
|
e.target.value = '';
|
|
});
|
|
}
|
|
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', injectFooterButton);
|
|
} else {
|
|
injectFooterButton();
|
|
}
|
|
|
|
hyprcrd.registerPlugin({
|
|
name: 'logseq-import',
|
|
version: '1.0.0',
|
|
description: 'Import a Logseq vault ZIP as dated journal cards and pages.',
|
|
});
|