logseq import plugin
This commit is contained in:
1 parent
3ae84ccdd7
commit
5af49655d6
11 files changed
+301
-193
No files matched your search
@@ -0,0 +1,74 @@
|
||||
// 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.',
|
||||
});
|
||||
Reference in new issue
Block a user