bak
This commit is contained in:
1 parent
03f57cbaee
commit
a9603aa0e8
11 files changed
+1010
-93
No files matched your search
+29
-6
@@ -7,9 +7,9 @@ import { state, getGroupCards } from './modules/state.js';
|
||||
import { showDialog, isDialogOpen } from './modules/dialog.js';
|
||||
import './modules/theme.js';
|
||||
import { loadBuckets } from './modules/buckets.js';
|
||||
import { renderBoard, updateSortUI } from './modules/board.js';
|
||||
import { renderBoard, updateSortUI, getSelectedIds, clearSelection } from './modules/board.js';
|
||||
import { openDetail, closeDetail, showDetailCard, ungroupCard } from './modules/detail.js';
|
||||
import { openModal, closeModal, saveCard } from './modules/editor.js';
|
||||
import { openModal, closeModal, saveCard, saveOnly } from './modules/editor.js';
|
||||
import { openSearch, closeSearch } from './modules/search.js';
|
||||
import { showContextMenu } from './modules/context-menu.js';
|
||||
import { undo, canUndo } from './modules/undo.js';
|
||||
@@ -26,8 +26,24 @@ window._closeTasks = closeTasks;
|
||||
window._renderBoard = renderBoard;
|
||||
window._showContextMenu = showContextMenu;
|
||||
window._ungroupCard = ungroupCard;
|
||||
window._getSelectedIds = getSelectedIds;
|
||||
window._clearSelection = clearSelection;
|
||||
window._refreshTasks = refreshTasksView;
|
||||
window._reloadAll = async () => { state.cards = await api('api/cards'); renderBoard(); };
|
||||
window._extractToCard = async (text) => {
|
||||
if (!text?.trim()) return;
|
||||
const lines = text.trim().split('\n');
|
||||
const title = lines[0].replace(/^#+\s*/, '').replace(/^\*+/, '').replace(/^-\s*/, '').trim() || 'Extracted';
|
||||
const body = text.trim();
|
||||
// Inherit context from the source card (viewing or editing)
|
||||
const source = state.viewingCard || (state.editingId ? state.cards.find(c => c.id == state.editingId) : null);
|
||||
const data = { title, body, color: source?.color || '#38bdf8', position: -1 };
|
||||
if (source?.bucket_id) data.bucket_id = source.bucket_id;
|
||||
if (source?.parent_id) data.parent_id = source.parent_id;
|
||||
else if (source && state.cards.some(c => c.parent_id == source.id)) data.parent_id = source.id;
|
||||
await api('api/cards', { method: 'POST', body: data });
|
||||
await window._reloadAll();
|
||||
};
|
||||
|
||||
// ── Data loading ──
|
||||
|
||||
@@ -46,11 +62,18 @@ document.getElementById('import-btn')?.addEventListener('click', () => importFil
|
||||
importFile?.addEventListener('change', async e => {
|
||||
const file = e.target.files?.[0];
|
||||
if (!file) return;
|
||||
const ok = await showDialog({ title: 'import_data', message: 'Alle bestehenden Daten werden ersetzt. Fortfahren?', danger: true, okLabel: 'import' });
|
||||
if (!ok) { e.target.value = ''; return; }
|
||||
|
||||
// Check if it's a selective export (merge) or ask for full replace
|
||||
const form = new FormData(); form.append('file', file);
|
||||
const mode = await showDialog({ title: 'import_data', message: 'Wie importieren?', okLabel: 'merge (hinzufuegen)', cancelLabel: 'replace (alles ersetzen)' });
|
||||
// mode: true = merge, null = replace
|
||||
if (mode === null) {
|
||||
const sure = await showDialog({ title: 'replace_all', message: 'Alle bestehenden Daten werden ersetzt!', danger: true, okLabel: 'replace' });
|
||||
if (!sure) { e.target.value = ''; return; }
|
||||
}
|
||||
try {
|
||||
const res = await fetch('api/import', { method: 'POST', body: form, headers: { 'X-CSRF-Token': getCsrf() } });
|
||||
const url = mode ? 'api/import?merge=1' : 'api/import';
|
||||
const res = await fetch(url, { method: 'POST', body: form, headers: { 'X-CSRF-Token': getCsrf() } });
|
||||
const data = JSON.parse(await res.text());
|
||||
if (data.error) throw new Error(data.error);
|
||||
await loadBuckets(); state.cards = await api('api/cards'); renderBoard();
|
||||
@@ -115,7 +138,7 @@ document.addEventListener('keydown', e => {
|
||||
else if (document.getElementById('gallery')?.classList.contains('open')) closeGallery();
|
||||
return;
|
||||
}
|
||||
if (e.key === 's' && (e.ctrlKey || e.metaKey) && modal.classList.contains('open')) { e.preventDefault(); saveCard(); return; }
|
||||
if (e.key === 's' && (e.ctrlKey || e.metaKey) && modal.classList.contains('open')) { e.preventDefault(); e.shiftKey ? saveCard() : saveOnly(); return; }
|
||||
if (e.key === 'z' && (e.ctrlKey || e.metaKey) && !modal.classList.contains('open') && canUndo()) { e.preventDefault(); undo(); return; }
|
||||
if (e.key === '/' && ![modal, detail, search, tasks].some(el => el?.classList.contains('open')) && document.activeElement === document.body) { e.preventDefault(); openSearch(); }
|
||||
|
||||
|
||||
Reference in new issue
Block a user