living-documentation 7.10.0 → 7.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/frontend/confirm-modal.js +73 -0
- package/dist/src/frontend/documents.js +88 -103
- package/dist/src/frontend/files-modal.js +243 -0
- package/dist/src/frontend/i18n/en.json +24 -0
- package/dist/src/frontend/i18n/fr.json +24 -0
- package/dist/src/frontend/index.html +68 -0
- package/dist/src/frontend/search.js +45 -8
- package/dist/src/lib/metadata.d.ts.map +1 -1
- package/dist/src/lib/metadata.js +5 -9
- package/dist/src/lib/metadata.js.map +1 -1
- package/dist/src/routes/documents.d.ts.map +1 -1
- package/dist/src/routes/documents.js +34 -3
- package/dist/src/routes/documents.js.map +1 -1
- package/dist/src/routes/files.d.ts.map +1 -1
- package/dist/src/routes/files.js +100 -0
- package/dist/src/routes/files.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// ── Generic confirmation modal ──────────────────────────────────────────────
|
|
2
|
+
// Promise-based replacement for window.confirm(). Any module can call:
|
|
3
|
+
// const ok = await showConfirm({ title, message, detail, confirmLabel, danger });
|
|
4
|
+
// The modal sits at z-[60] so it stacks above other app modals (z-50).
|
|
5
|
+
|
|
6
|
+
let _confirmResolve = null;
|
|
7
|
+
|
|
8
|
+
function _confirmT(key, fallback) {
|
|
9
|
+
return window.t ? window.t(key) : fallback;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function _confirmClose(result) {
|
|
13
|
+
const modal = document.getElementById("confirm-modal");
|
|
14
|
+
if (modal) modal.classList.add("hidden");
|
|
15
|
+
document.removeEventListener("keydown", _confirmKeyHandler);
|
|
16
|
+
const fn = _confirmResolve;
|
|
17
|
+
_confirmResolve = null;
|
|
18
|
+
if (fn) fn(result);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function _confirmKeyHandler(e) {
|
|
22
|
+
if (e.key === "Escape") {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
_confirmClose(false);
|
|
25
|
+
} else if (e.key === "Enter") {
|
|
26
|
+
e.preventDefault();
|
|
27
|
+
_confirmClose(true);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function _confirmModalBackdrop(e) {
|
|
32
|
+
if (e.target && e.target.id === "confirm-modal") _confirmClose(false);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function showConfirm(opts) {
|
|
36
|
+
const o = opts || {};
|
|
37
|
+
const modal = document.getElementById("confirm-modal");
|
|
38
|
+
if (!modal) return Promise.resolve(false);
|
|
39
|
+
|
|
40
|
+
const titleEl = document.getElementById("confirm-modal-title");
|
|
41
|
+
const messageEl = document.getElementById("confirm-modal-message");
|
|
42
|
+
const detailEl = document.getElementById("confirm-modal-detail");
|
|
43
|
+
const cancelBtn = document.getElementById("confirm-modal-cancel");
|
|
44
|
+
const okBtn = document.getElementById("confirm-modal-ok");
|
|
45
|
+
|
|
46
|
+
titleEl.textContent = o.title || "";
|
|
47
|
+
titleEl.style.display = o.title ? "" : "none";
|
|
48
|
+
messageEl.textContent = o.message || "";
|
|
49
|
+
messageEl.style.display = o.message ? "" : "none";
|
|
50
|
+
detailEl.textContent = o.detail || "";
|
|
51
|
+
detailEl.style.display = o.detail ? "" : "none";
|
|
52
|
+
|
|
53
|
+
cancelBtn.textContent = o.cancelLabel || _confirmT("common.cancel", "Cancel");
|
|
54
|
+
okBtn.textContent = o.confirmLabel || _confirmT("common.confirm", "Confirm");
|
|
55
|
+
const baseCls = "text-sm px-4 py-1.5 rounded-lg text-white font-semibold transition-colors";
|
|
56
|
+
okBtn.className = o.danger
|
|
57
|
+
? `${baseCls} bg-red-500 hover:bg-red-600`
|
|
58
|
+
: `${baseCls} bg-blue-600 hover:bg-blue-700`;
|
|
59
|
+
|
|
60
|
+
modal.classList.remove("hidden");
|
|
61
|
+
setTimeout(() => okBtn.focus(), 0);
|
|
62
|
+
|
|
63
|
+
return new Promise((resolve) => {
|
|
64
|
+
if (_confirmResolve) _confirmResolve(false); // resolve any pending
|
|
65
|
+
_confirmResolve = resolve;
|
|
66
|
+
cancelBtn.onclick = () => _confirmClose(false);
|
|
67
|
+
okBtn.onclick = () => _confirmClose(true);
|
|
68
|
+
document.addEventListener("keydown", _confirmKeyHandler);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
window.showConfirm = showConfirm;
|
|
73
|
+
window._confirmModalBackdrop = _confirmModalBackdrop;
|
|
@@ -3,6 +3,88 @@
|
|
|
3
3
|
// annotations (loadAnnotations, applyAnnotationHighlights, renderElevator),
|
|
4
4
|
// and image-paste.js (handleEditorPaste).
|
|
5
5
|
|
|
6
|
+
// Cache of the last rendered doc HTML so search input changes can re-wire
|
|
7
|
+
// the content without a round-trip to the server.
|
|
8
|
+
let _lastDocHtml = null;
|
|
9
|
+
let _lastDocIdRendered = null;
|
|
10
|
+
|
|
11
|
+
function _wireDocContent(html) {
|
|
12
|
+
const contentEl = document.getElementById("doc-content");
|
|
13
|
+
if (!contentEl) return;
|
|
14
|
+
contentEl.innerHTML = html;
|
|
15
|
+
|
|
16
|
+
contentEl.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach((h) => {
|
|
17
|
+
if (!h.id) {
|
|
18
|
+
h.id = h.textContent
|
|
19
|
+
.toLowerCase()
|
|
20
|
+
.replace(/[^\w\s-]/g, "")
|
|
21
|
+
.trim()
|
|
22
|
+
.replace(/\s+/g, "-");
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
contentEl.querySelectorAll("pre code").forEach((block) => {
|
|
27
|
+
hljs.highlightElement(block);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
contentEl.querySelectorAll("a[href]").forEach((a) => {
|
|
31
|
+
const href = a.getAttribute("href");
|
|
32
|
+
const m = href && href.match(/[?&]doc=([^&#]+)/);
|
|
33
|
+
if (!m) return;
|
|
34
|
+
const hashIdx = href.indexOf("#");
|
|
35
|
+
const anchorTarget = hashIdx !== -1 ? href.slice(hashIdx + 1) : null;
|
|
36
|
+
a.addEventListener("click", (e) => {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
openDocument(decodeURIComponent(m[1]), false, true, anchorTarget);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
contentEl.querySelectorAll('a[href^="#"]').forEach((a) => {
|
|
43
|
+
const href = a.getAttribute("href");
|
|
44
|
+
if (!href || href.length < 2) return;
|
|
45
|
+
a.addEventListener("click", (e) => {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
scrollToAnchor(href.slice(1));
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
contentEl.querySelectorAll("table").forEach((t) => {
|
|
52
|
+
const wrapper = document.createElement("div");
|
|
53
|
+
wrapper.className = "overflow-x-auto";
|
|
54
|
+
t.parentNode.insertBefore(wrapper, t);
|
|
55
|
+
wrapper.appendChild(t);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const notice = document.getElementById("search-notice");
|
|
59
|
+
const isMetaQuery =
|
|
60
|
+
typeof searchQuery === "string" &&
|
|
61
|
+
searchQuery.toLowerCase().startsWith("metadata://");
|
|
62
|
+
if (searchQuery && !isMetaQuery) {
|
|
63
|
+
const matches = highlightMatches(contentEl, searchQuery);
|
|
64
|
+
buildSearchNotice(matches, searchQuery);
|
|
65
|
+
notice.classList.remove("hidden");
|
|
66
|
+
} else {
|
|
67
|
+
notice.classList.add("hidden");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function refreshSearchInCurrentDoc() {
|
|
72
|
+
if (
|
|
73
|
+
!currentDocId ||
|
|
74
|
+
_lastDocHtml === null ||
|
|
75
|
+
currentDocId !== _lastDocIdRendered
|
|
76
|
+
) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const contentArea = document.getElementById("content-area");
|
|
80
|
+
const scrollTop = contentArea ? contentArea.scrollTop : 0;
|
|
81
|
+
_wireDocContent(_lastDocHtml);
|
|
82
|
+
if (typeof loadAnnotations === "function") loadAnnotations(currentDocId);
|
|
83
|
+
if (contentArea) contentArea.scrollTop = scrollTop;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
window.refreshSearchInCurrentDoc = refreshSearchInCurrentDoc;
|
|
87
|
+
|
|
6
88
|
async function loadDocuments() {
|
|
7
89
|
try {
|
|
8
90
|
[allDocs] = await Promise.all([
|
|
@@ -158,8 +240,9 @@ async function openDocument(id, skipHistory = false, fromLink = false, anchor =
|
|
|
158
240
|
document.getElementById("doc-date").textContent =
|
|
159
241
|
doc.formattedDate || "";
|
|
160
242
|
|
|
161
|
-
|
|
162
|
-
|
|
243
|
+
_lastDocHtml = doc.html;
|
|
244
|
+
_lastDocIdRendered = id;
|
|
245
|
+
_wireDocContent(doc.html);
|
|
163
246
|
|
|
164
247
|
// Load annotations for this document
|
|
165
248
|
loadAnnotations(id);
|
|
@@ -169,63 +252,6 @@ async function openDocument(id, skipHistory = false, fromLink = false, anchor =
|
|
|
169
252
|
loadMetadataReport(id);
|
|
170
253
|
}
|
|
171
254
|
|
|
172
|
-
// Add IDs to headings for anchor navigation
|
|
173
|
-
contentEl.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach((h) => {
|
|
174
|
-
if (!h.id) {
|
|
175
|
-
h.id = h.textContent
|
|
176
|
-
.toLowerCase()
|
|
177
|
-
.replace(/[^\w\s-]/g, "")
|
|
178
|
-
.trim()
|
|
179
|
-
.replace(/\s+/g, "-");
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
// Syntax highlighting
|
|
184
|
-
contentEl.querySelectorAll("pre code").forEach((block) => {
|
|
185
|
-
hljs.highlightElement(block);
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
// Intercept inter-doc links (?doc=X[#anchor]) to stay in SPA and track origin
|
|
189
|
-
contentEl.querySelectorAll("a[href]").forEach((a) => {
|
|
190
|
-
const href = a.getAttribute("href");
|
|
191
|
-
const m = href && href.match(/[?&]doc=([^&#]+)/);
|
|
192
|
-
if (!m) return;
|
|
193
|
-
const hashIdx = href.indexOf("#");
|
|
194
|
-
const anchor = hashIdx !== -1 ? href.slice(hashIdx + 1) : null;
|
|
195
|
-
a.addEventListener("click", (e) => {
|
|
196
|
-
e.preventDefault();
|
|
197
|
-
openDocument(decodeURIComponent(m[1]), false, true, anchor);
|
|
198
|
-
});
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
// Intercept pure-anchor links (#foo) to offset for the sticky header
|
|
202
|
-
contentEl.querySelectorAll('a[href^="#"]').forEach((a) => {
|
|
203
|
-
const href = a.getAttribute("href");
|
|
204
|
-
if (!href || href.length < 2) return;
|
|
205
|
-
a.addEventListener("click", (e) => {
|
|
206
|
-
e.preventDefault();
|
|
207
|
-
scrollToAnchor(href.slice(1));
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
// Make tables responsive
|
|
212
|
-
contentEl.querySelectorAll("table").forEach((t) => {
|
|
213
|
-
const wrapper = document.createElement("div");
|
|
214
|
-
wrapper.className = "overflow-x-auto";
|
|
215
|
-
t.parentNode.insertBefore(wrapper, t);
|
|
216
|
-
wrapper.appendChild(t);
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
// Highlight search matches in content
|
|
220
|
-
const notice = document.getElementById("search-notice");
|
|
221
|
-
if (searchQuery) {
|
|
222
|
-
const matches = highlightMatches(contentEl, searchQuery);
|
|
223
|
-
buildSearchNotice(matches, searchQuery);
|
|
224
|
-
notice.classList.remove("hidden");
|
|
225
|
-
} else {
|
|
226
|
-
notice.classList.add("hidden");
|
|
227
|
-
}
|
|
228
|
-
|
|
229
255
|
document.title = doc.title;
|
|
230
256
|
|
|
231
257
|
// Scroll to anchor if present (explicit param wins over URL hash)
|
|
@@ -342,50 +368,9 @@ async function saveDocument() {
|
|
|
342
368
|
const doc = await fetch("/api/documents/" + currentDocId).then((r) =>
|
|
343
369
|
r.json(),
|
|
344
370
|
);
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
.querySelectorAll("pre code")
|
|
349
|
-
.forEach((block) => hljs.highlightElement(block));
|
|
350
|
-
|
|
351
|
-
contentEl.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach((h) => {
|
|
352
|
-
if (!h.id) {
|
|
353
|
-
h.id = h.textContent
|
|
354
|
-
.toLowerCase()
|
|
355
|
-
.replace(/[^\w\s-]/g, "")
|
|
356
|
-
.trim()
|
|
357
|
-
.replace(/\s+/g, "-");
|
|
358
|
-
}
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
contentEl.querySelectorAll("a[href]").forEach((a) => {
|
|
362
|
-
const href = a.getAttribute("href");
|
|
363
|
-
const m = href && href.match(/[?&]doc=([^&#]+)/);
|
|
364
|
-
if (!m) return;
|
|
365
|
-
const hashIdx = href.indexOf("#");
|
|
366
|
-
const anchor = hashIdx !== -1 ? href.slice(hashIdx + 1) : null;
|
|
367
|
-
a.addEventListener("click", (e) => {
|
|
368
|
-
e.preventDefault();
|
|
369
|
-
openDocument(decodeURIComponent(m[1]), false, true, anchor);
|
|
370
|
-
});
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
contentEl.querySelectorAll('a[href^="#"]').forEach((a) => {
|
|
374
|
-
const href = a.getAttribute("href");
|
|
375
|
-
if (!href || href.length < 2) return;
|
|
376
|
-
a.addEventListener("click", (e) => {
|
|
377
|
-
e.preventDefault();
|
|
378
|
-
scrollToAnchor(href.slice(1));
|
|
379
|
-
});
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
contentEl.querySelectorAll("table").forEach((t) => {
|
|
383
|
-
if (t.parentNode.classList.contains("overflow-x-auto")) return;
|
|
384
|
-
const wrapper = document.createElement("div");
|
|
385
|
-
wrapper.className = "overflow-x-auto";
|
|
386
|
-
t.parentNode.insertBefore(wrapper, t);
|
|
387
|
-
wrapper.appendChild(t);
|
|
388
|
-
});
|
|
371
|
+
_lastDocHtml = doc.html;
|
|
372
|
+
_lastDocIdRendered = currentDocId;
|
|
373
|
+
_wireDocContent(doc.html);
|
|
389
374
|
|
|
390
375
|
applyAnnotationHighlights();
|
|
391
376
|
renderElevator();
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
// ── Files modal ─────────────────────────────────────────────────────────────
|
|
2
|
+
// Lists files stored under DOCS_FOLDER/files/, sorted by upload order (the
|
|
3
|
+
// server-assigned filename starts with a YYYYMMDDHHmmss timestamp, so a lex
|
|
4
|
+
// sort is chronological). Supports replacing a file with a new version
|
|
5
|
+
// (overwrites in place, no history kept) and deleting it.
|
|
6
|
+
|
|
7
|
+
const _filesMaxBytes = 19 * 1024 * 1024;
|
|
8
|
+
|
|
9
|
+
function _filesT(key) {
|
|
10
|
+
return window.t ? window.t(key) : key;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function _filesEscape(s) {
|
|
14
|
+
return String(s)
|
|
15
|
+
.replace(/&/g, "&")
|
|
16
|
+
.replace(/</g, "<")
|
|
17
|
+
.replace(/>/g, ">")
|
|
18
|
+
.replace(/"/g, """)
|
|
19
|
+
.replace(/'/g, "'");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function _filesFormatSize(bytes) {
|
|
23
|
+
if (bytes < 1024) {
|
|
24
|
+
return _filesT("files.size_bytes").replace("{n}", String(bytes));
|
|
25
|
+
}
|
|
26
|
+
if (bytes < 1024 * 1024) {
|
|
27
|
+
return _filesT("files.size_kb").replace("{n}", (bytes / 1024).toFixed(1));
|
|
28
|
+
}
|
|
29
|
+
return _filesT("files.size_mb").replace(
|
|
30
|
+
"{n}",
|
|
31
|
+
(bytes / 1024 / 1024).toFixed(2),
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function _filesFormatDate(iso) {
|
|
36
|
+
if (!iso) return "";
|
|
37
|
+
const d = new Date(iso);
|
|
38
|
+
if (isNaN(d.getTime())) return "";
|
|
39
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
40
|
+
return (
|
|
41
|
+
`${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ` +
|
|
42
|
+
`${pad(d.getHours())}:${pad(d.getMinutes())}`
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function _filesReadAsBase64(file) {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
const reader = new FileReader();
|
|
49
|
+
reader.onload = () => resolve(reader.result);
|
|
50
|
+
reader.onerror = reject;
|
|
51
|
+
reader.readAsDataURL(file);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function _filesRender() {
|
|
56
|
+
const body = document.getElementById("files-modal-body");
|
|
57
|
+
if (!body) return;
|
|
58
|
+
body.innerHTML = `<p class="text-sm text-gray-400">${_filesEscape(_filesT("common.loading"))}</p>`;
|
|
59
|
+
|
|
60
|
+
let list = [];
|
|
61
|
+
try {
|
|
62
|
+
const res = await fetch("/api/files");
|
|
63
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
64
|
+
const data = await res.json();
|
|
65
|
+
list = Array.isArray(data.files) ? data.files : [];
|
|
66
|
+
} catch (err) {
|
|
67
|
+
body.innerHTML = `<p class="text-sm text-red-500 dark:text-red-400">${_filesEscape(_filesT("files.error_load"))}${_filesEscape(err.message || String(err))}</p>`;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (list.length === 0) {
|
|
72
|
+
body.innerHTML = `<p class="text-sm text-gray-500 dark:text-gray-400">${_filesEscape(_filesT("files.empty"))}</p>`;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const rows = list
|
|
77
|
+
.map((f) => {
|
|
78
|
+
const name = _filesEscape(f.displayName || f.filename);
|
|
79
|
+
const date = _filesEscape(_filesFormatDate(f.uploadedAt));
|
|
80
|
+
const size = _filesEscape(_filesFormatSize(f.size || 0));
|
|
81
|
+
const url = _filesEscape(f.url);
|
|
82
|
+
const filenameAttr = _filesEscape(f.filename);
|
|
83
|
+
return `
|
|
84
|
+
<li class="py-3 flex items-center gap-3">
|
|
85
|
+
<i class="fa-solid fa-paperclip text-purple-500 shrink-0"></i>
|
|
86
|
+
<div class="flex-1 min-w-0">
|
|
87
|
+
<a href="${url}" target="_blank" rel="noopener"
|
|
88
|
+
class="block text-sm text-gray-900 dark:text-gray-100 hover:underline truncate">
|
|
89
|
+
${name}
|
|
90
|
+
</a>
|
|
91
|
+
<div class="text-xs text-gray-500 dark:text-gray-400">${date}${date ? " · " : ""}${size}</div>
|
|
92
|
+
</div>
|
|
93
|
+
<button
|
|
94
|
+
type="button"
|
|
95
|
+
data-files-replace="${filenameAttr}"
|
|
96
|
+
data-files-display="${name}"
|
|
97
|
+
class="text-xs px-2 py-1 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors shrink-0"
|
|
98
|
+
>${_filesEscape(_filesT("files.replace"))}</button>
|
|
99
|
+
<button
|
|
100
|
+
type="button"
|
|
101
|
+
data-files-delete="${filenameAttr}"
|
|
102
|
+
data-files-display="${name}"
|
|
103
|
+
class="text-xs px-2 py-1 rounded-lg border border-red-200 dark:border-red-900 text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors shrink-0"
|
|
104
|
+
>${_filesEscape(_filesT("files.delete"))}</button>
|
|
105
|
+
</li>`;
|
|
106
|
+
})
|
|
107
|
+
.join("");
|
|
108
|
+
|
|
109
|
+
body.innerHTML = `<ul class="divide-y divide-gray-100 dark:divide-gray-800">${rows}</ul>`;
|
|
110
|
+
|
|
111
|
+
body.querySelectorAll("[data-files-replace]").forEach((btn) => {
|
|
112
|
+
btn.addEventListener("click", () => {
|
|
113
|
+
const filename = btn.getAttribute("data-files-replace");
|
|
114
|
+
const display = btn.getAttribute("data-files-display") || filename;
|
|
115
|
+
_filesReplace(filename, display, btn);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
body.querySelectorAll("[data-files-delete]").forEach((btn) => {
|
|
119
|
+
btn.addEventListener("click", () => {
|
|
120
|
+
const filename = btn.getAttribute("data-files-delete");
|
|
121
|
+
const display = btn.getAttribute("data-files-display") || filename;
|
|
122
|
+
_filesDelete(filename, display, btn);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function _filesReplace(filename, displayName, triggerBtn) {
|
|
128
|
+
const input = document.createElement("input");
|
|
129
|
+
input.type = "file";
|
|
130
|
+
input.style.display = "none";
|
|
131
|
+
document.body.appendChild(input);
|
|
132
|
+
input.addEventListener("change", async () => {
|
|
133
|
+
const file = input.files && input.files[0];
|
|
134
|
+
input.remove();
|
|
135
|
+
if (!file) return;
|
|
136
|
+
|
|
137
|
+
const ok = await window.showConfirm({
|
|
138
|
+
title: _filesT("files.confirm_replace_title"),
|
|
139
|
+
message: _filesT("files.confirm_replace_message")
|
|
140
|
+
.replace("{name}", displayName)
|
|
141
|
+
.replace("{newName}", file.name),
|
|
142
|
+
detail: _filesT("files.confirm_replace_detail"),
|
|
143
|
+
confirmLabel: _filesT("files.replace"),
|
|
144
|
+
danger: true,
|
|
145
|
+
});
|
|
146
|
+
if (!ok) return;
|
|
147
|
+
|
|
148
|
+
if (file.size > _filesMaxBytes) {
|
|
149
|
+
const mb = (file.size / 1024 / 1024).toFixed(1);
|
|
150
|
+
window.alert(
|
|
151
|
+
_filesT("files.error_replace") + `${mb} MB (max 19 MB)`,
|
|
152
|
+
);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const originalLabel = triggerBtn.textContent;
|
|
157
|
+
triggerBtn.disabled = true;
|
|
158
|
+
triggerBtn.textContent = _filesT("files.replacing");
|
|
159
|
+
try {
|
|
160
|
+
const base64 = await _filesReadAsBase64(file);
|
|
161
|
+
const res = await fetch(
|
|
162
|
+
"/api/files/" + encodeURIComponent(filename),
|
|
163
|
+
{
|
|
164
|
+
method: "PUT",
|
|
165
|
+
headers: { "Content-Type": "application/json" },
|
|
166
|
+
body: JSON.stringify({ data: base64 }),
|
|
167
|
+
},
|
|
168
|
+
);
|
|
169
|
+
if (!res.ok) {
|
|
170
|
+
let msg = `HTTP ${res.status}`;
|
|
171
|
+
try {
|
|
172
|
+
const body = await res.json();
|
|
173
|
+
if (body.error) msg = body.error;
|
|
174
|
+
} catch { /* ignore */ }
|
|
175
|
+
throw new Error(msg);
|
|
176
|
+
}
|
|
177
|
+
closeFilesModal();
|
|
178
|
+
if (window.runSearchImmediate) {
|
|
179
|
+
window.runSearchImmediate("metadata://" + filename);
|
|
180
|
+
}
|
|
181
|
+
} catch (err) {
|
|
182
|
+
triggerBtn.disabled = false;
|
|
183
|
+
triggerBtn.textContent = originalLabel;
|
|
184
|
+
window.alert(_filesT("files.error_replace") + (err.message || String(err)));
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
input.click();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function _filesDelete(filename, displayName, triggerBtn) {
|
|
191
|
+
const ok = await window.showConfirm({
|
|
192
|
+
title: _filesT("files.confirm_delete_title"),
|
|
193
|
+
message: _filesT("files.confirm_delete_message").replace(
|
|
194
|
+
"{name}",
|
|
195
|
+
displayName,
|
|
196
|
+
),
|
|
197
|
+
detail: _filesT("files.confirm_delete_detail"),
|
|
198
|
+
confirmLabel: _filesT("files.delete"),
|
|
199
|
+
danger: true,
|
|
200
|
+
});
|
|
201
|
+
if (!ok) return;
|
|
202
|
+
|
|
203
|
+
const originalLabel = triggerBtn.textContent;
|
|
204
|
+
triggerBtn.disabled = true;
|
|
205
|
+
triggerBtn.textContent = _filesT("files.deleting");
|
|
206
|
+
try {
|
|
207
|
+
const res = await fetch("/api/files/" + encodeURIComponent(filename), {
|
|
208
|
+
method: "DELETE",
|
|
209
|
+
});
|
|
210
|
+
if (!res.ok) {
|
|
211
|
+
let msg = `HTTP ${res.status}`;
|
|
212
|
+
try {
|
|
213
|
+
const body = await res.json();
|
|
214
|
+
if (body.error) msg = body.error;
|
|
215
|
+
} catch { /* ignore */ }
|
|
216
|
+
throw new Error(msg);
|
|
217
|
+
}
|
|
218
|
+
closeFilesModal();
|
|
219
|
+
if (window.runSearchImmediate) {
|
|
220
|
+
window.runSearchImmediate("metadata://" + filename);
|
|
221
|
+
}
|
|
222
|
+
} catch (err) {
|
|
223
|
+
triggerBtn.disabled = false;
|
|
224
|
+
triggerBtn.textContent = originalLabel;
|
|
225
|
+
window.alert(_filesT("files.error_delete") + (err.message || String(err)));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function openFilesModal() {
|
|
230
|
+
const modal = document.getElementById("files-modal");
|
|
231
|
+
if (!modal) return;
|
|
232
|
+
modal.classList.remove("hidden");
|
|
233
|
+
_filesRender();
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function closeFilesModal() {
|
|
237
|
+
const modal = document.getElementById("files-modal");
|
|
238
|
+
if (!modal) return;
|
|
239
|
+
modal.classList.add("hidden");
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
window.openFilesModal = openFilesModal;
|
|
243
|
+
window.closeFilesModal = closeFilesModal;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common.save": "Save",
|
|
3
3
|
"common.cancel": "Cancel",
|
|
4
|
+
"common.confirm": "Confirm",
|
|
4
5
|
"common.reset": "Reset",
|
|
5
6
|
"common.loading": "Loading…",
|
|
6
7
|
"common.remove": "Remove",
|
|
@@ -28,8 +29,31 @@
|
|
|
28
29
|
"nav.new_document": "New document",
|
|
29
30
|
"nav.word_cloud": "☁ Word Cloud",
|
|
30
31
|
"nav.diagram": "◇ Diagram",
|
|
32
|
+
"nav.files": "📁 Metadata Files",
|
|
31
33
|
"nav.admin": "⚙ Admin",
|
|
32
34
|
|
|
35
|
+
"files.title": "📁 Attached files",
|
|
36
|
+
"files.empty": "No files yet — upload one from a document editor (paperclip, drag & drop, or paste).",
|
|
37
|
+
"files.replace": "Replace",
|
|
38
|
+
"files.delete": "Delete",
|
|
39
|
+
"files.open": "Open",
|
|
40
|
+
"files.confirm_replace": "Replace \"{name}\" with \"{newName}\"? The previous version will be lost.",
|
|
41
|
+
"files.confirm_replace_title": "Replace file",
|
|
42
|
+
"files.confirm_replace_message": "Replace \"{name}\" with \"{newName}\"?",
|
|
43
|
+
"files.confirm_replace_detail": "The previous version will be lost.",
|
|
44
|
+
"files.confirm_delete": "Permanently delete \"{name}\"?",
|
|
45
|
+
"files.confirm_delete_title": "Delete file",
|
|
46
|
+
"files.confirm_delete_message": "Permanently delete \"{name}\"?",
|
|
47
|
+
"files.confirm_delete_detail": "This action cannot be undone.",
|
|
48
|
+
"files.replacing": "Replacing…",
|
|
49
|
+
"files.deleting": "Deleting…",
|
|
50
|
+
"files.error_load": "Failed to load files: ",
|
|
51
|
+
"files.error_replace": "Replace failed: ",
|
|
52
|
+
"files.error_delete": "Delete failed: ",
|
|
53
|
+
"files.size_bytes": "{n} B",
|
|
54
|
+
"files.size_kb": "{n} KB",
|
|
55
|
+
"files.size_mb": "{n} MB",
|
|
56
|
+
|
|
33
57
|
"welcome.title": "Select a document",
|
|
34
58
|
"welcome.hint": "Choose a document from the sidebar to start reading.",
|
|
35
59
|
"welcome.pattern_hint": "Expected filename pattern",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common.save": "Enregistrer",
|
|
3
3
|
"common.cancel": "Annuler",
|
|
4
|
+
"common.confirm": "Confirmer",
|
|
4
5
|
"common.reset": "Réinitialiser",
|
|
5
6
|
"common.loading": "Chargement…",
|
|
6
7
|
"common.remove": "Supprimer",
|
|
@@ -28,8 +29,31 @@
|
|
|
28
29
|
"nav.new_document": "Nouveau document",
|
|
29
30
|
"nav.word_cloud": "☁ Nuage de mots",
|
|
30
31
|
"nav.diagram": "◇ Diagramme",
|
|
32
|
+
"nav.files": "📁 Fichiers Métadonnées",
|
|
31
33
|
"nav.admin": "⚙ Admin",
|
|
32
34
|
|
|
35
|
+
"files.title": "📁 Fichiers joints",
|
|
36
|
+
"files.empty": "Aucun fichier — téléversez-en un depuis un document (trombone, glisser-déposer ou coller).",
|
|
37
|
+
"files.replace": "Remplacer",
|
|
38
|
+
"files.delete": "Supprimer",
|
|
39
|
+
"files.open": "Ouvrir",
|
|
40
|
+
"files.confirm_replace": "Remplacer « {name} » par « {newName} » ? La version précédente sera perdue.",
|
|
41
|
+
"files.confirm_replace_title": "Remplacer le fichier",
|
|
42
|
+
"files.confirm_replace_message": "Remplacer « {name} » par « {newName} » ?",
|
|
43
|
+
"files.confirm_replace_detail": "La version précédente sera perdue.",
|
|
44
|
+
"files.confirm_delete": "Supprimer définitivement « {name} » ?",
|
|
45
|
+
"files.confirm_delete_title": "Supprimer le fichier",
|
|
46
|
+
"files.confirm_delete_message": "Supprimer définitivement « {name} » ?",
|
|
47
|
+
"files.confirm_delete_detail": "Cette action est irréversible.",
|
|
48
|
+
"files.replacing": "Remplacement…",
|
|
49
|
+
"files.deleting": "Suppression…",
|
|
50
|
+
"files.error_load": "Impossible de charger les fichiers : ",
|
|
51
|
+
"files.error_replace": "Échec du remplacement : ",
|
|
52
|
+
"files.error_delete": "Échec de la suppression : ",
|
|
53
|
+
"files.size_bytes": "{n} o",
|
|
54
|
+
"files.size_kb": "{n} Ko",
|
|
55
|
+
"files.size_mb": "{n} Mo",
|
|
56
|
+
|
|
33
57
|
"welcome.title": "Sélectionner un document",
|
|
34
58
|
"welcome.hint": "Choisissez un document dans la barre latérale pour commencer à lire.",
|
|
35
59
|
"welcome.pattern_hint": "Modèle de nom de fichier attendu",
|
|
@@ -54,6 +54,8 @@
|
|
|
54
54
|
<script defer src="/diagram-link-modal.js"></script>
|
|
55
55
|
<script defer src="/new-folder-modal.js"></script>
|
|
56
56
|
<script defer src="/new-doc-modal.js"></script>
|
|
57
|
+
<script defer src="/confirm-modal.js"></script>
|
|
58
|
+
<script defer src="/files-modal.js"></script>
|
|
57
59
|
<script defer src="/boot.js"></script>
|
|
58
60
|
|
|
59
61
|
<script>
|
|
@@ -309,6 +311,15 @@
|
|
|
309
311
|
◇ Diagram
|
|
310
312
|
</a>
|
|
311
313
|
|
|
314
|
+
<!-- Files -->
|
|
315
|
+
<button
|
|
316
|
+
onclick="openFilesModal()"
|
|
317
|
+
data-i18n="nav.files"
|
|
318
|
+
class="text-sm px-3 py-1.5 rounded-lg text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors font-medium"
|
|
319
|
+
>
|
|
320
|
+
📁 Files
|
|
321
|
+
</button>
|
|
322
|
+
|
|
312
323
|
<!-- Admin link -->
|
|
313
324
|
<a
|
|
314
325
|
href="/admin"
|
|
@@ -2559,5 +2570,62 @@
|
|
|
2559
2570
|
</div>
|
|
2560
2571
|
</div>
|
|
2561
2572
|
</div>
|
|
2573
|
+
|
|
2574
|
+
<!-- ── Generic confirmation modal (used by showConfirm) ── -->
|
|
2575
|
+
<div
|
|
2576
|
+
id="confirm-modal"
|
|
2577
|
+
class="hidden fixed inset-0 z-[60] bg-black/50 flex items-center justify-center p-4"
|
|
2578
|
+
onclick="_confirmModalBackdrop(event)"
|
|
2579
|
+
>
|
|
2580
|
+
<div
|
|
2581
|
+
class="w-full max-w-md bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-xl shadow-2xl p-5 flex flex-col gap-3"
|
|
2582
|
+
onclick="event.stopPropagation()"
|
|
2583
|
+
>
|
|
2584
|
+
<h3 id="confirm-modal-title" class="font-semibold text-gray-900 dark:text-gray-100"></h3>
|
|
2585
|
+
<p id="confirm-modal-message" class="text-sm text-gray-700 dark:text-gray-200"></p>
|
|
2586
|
+
<p id="confirm-modal-detail" class="text-xs text-gray-500 dark:text-gray-400 italic break-all"></p>
|
|
2587
|
+
<div class="flex justify-end gap-2 mt-2">
|
|
2588
|
+
<button
|
|
2589
|
+
id="confirm-modal-cancel"
|
|
2590
|
+
type="button"
|
|
2591
|
+
class="text-sm px-3 py-1.5 rounded-lg border border-gray-200 dark:border-gray-700 text-gray-600 dark:text-gray-400 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors"
|
|
2592
|
+
></button>
|
|
2593
|
+
<button
|
|
2594
|
+
id="confirm-modal-ok"
|
|
2595
|
+
type="button"
|
|
2596
|
+
class="text-sm px-4 py-1.5 rounded-lg text-white font-semibold transition-colors"
|
|
2597
|
+
></button>
|
|
2598
|
+
</div>
|
|
2599
|
+
</div>
|
|
2600
|
+
</div>
|
|
2601
|
+
|
|
2602
|
+
<!-- ── Files modal ── -->
|
|
2603
|
+
<div
|
|
2604
|
+
id="files-modal"
|
|
2605
|
+
class="hidden fixed inset-0 z-50 flex items-center justify-center bg-black/40"
|
|
2606
|
+
onclick="if(event.target===this)closeFilesModal()"
|
|
2607
|
+
>
|
|
2608
|
+
<div
|
|
2609
|
+
class="bg-white dark:bg-gray-900 rounded-xl shadow-xl w-[min(720px,92vw)] max-h-[85vh] flex flex-col border border-gray-200 dark:border-gray-800"
|
|
2610
|
+
>
|
|
2611
|
+
<div
|
|
2612
|
+
class="flex items-center justify-between px-5 py-3 border-b border-gray-200 dark:border-gray-800 shrink-0"
|
|
2613
|
+
>
|
|
2614
|
+
<h2 data-i18n="files.title" class="font-semibold text-base text-gray-900 dark:text-gray-100">
|
|
2615
|
+
📁 Files
|
|
2616
|
+
</h2>
|
|
2617
|
+
<button
|
|
2618
|
+
onclick="closeFilesModal()"
|
|
2619
|
+
data-i18n-title="common.close"
|
|
2620
|
+
class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-200 text-xl leading-none px-2"
|
|
2621
|
+
>
|
|
2622
|
+
×
|
|
2623
|
+
</button>
|
|
2624
|
+
</div>
|
|
2625
|
+
<div id="files-modal-body" class="flex-1 overflow-y-auto p-5">
|
|
2626
|
+
<p class="text-sm text-gray-400" data-i18n="common.loading">Loading…</p>
|
|
2627
|
+
</div>
|
|
2628
|
+
</div>
|
|
2629
|
+
</div>
|
|
2562
2630
|
</body>
|
|
2563
2631
|
</html>
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
// ── Search + result highlighting ─────────────────────────────────────────────
|
|
2
2
|
|
|
3
3
|
let searchTimer = null;
|
|
4
|
+
const METADATA_SEARCH_PREFIX = "metadata://";
|
|
5
|
+
|
|
6
|
+
function _isMetadataQuery(q) {
|
|
7
|
+
return typeof q === "string" && q.toLowerCase().startsWith(METADATA_SEARCH_PREFIX);
|
|
8
|
+
}
|
|
4
9
|
|
|
5
10
|
function setupSearch() {
|
|
6
11
|
["header-search", "sidebar-search"].forEach((id) => {
|
|
@@ -20,23 +25,55 @@ function setupSearch() {
|
|
|
20
25
|
searchQuery = "";
|
|
21
26
|
searchResults = null;
|
|
22
27
|
renderSidebar(allDocs);
|
|
28
|
+
if (window.refreshSearchInCurrentDoc) window.refreshSearchInCurrentDoc();
|
|
23
29
|
return;
|
|
24
30
|
}
|
|
25
31
|
searchQuery = q;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
if (_isMetadataQuery(q)) {
|
|
33
|
+
// Title/category can't match a metadata:// query — skip the local
|
|
34
|
+
// filter and wait for the server response.
|
|
35
|
+
searchResults = [];
|
|
36
|
+
renderSidebar([]);
|
|
37
|
+
} else {
|
|
38
|
+
// Immediate client-side filter for snappy UX
|
|
39
|
+
const local = allDocs.filter(
|
|
40
|
+
(d) =>
|
|
41
|
+
d.title.toLowerCase().includes(q.toLowerCase()) ||
|
|
42
|
+
d.category.toLowerCase().includes(q.toLowerCase()),
|
|
43
|
+
);
|
|
44
|
+
searchResults = local;
|
|
45
|
+
renderSidebar(local);
|
|
46
|
+
}
|
|
47
|
+
// Refresh highlights inside the currently open doc
|
|
48
|
+
if (window.refreshSearchInCurrentDoc) window.refreshSearchInCurrentDoc();
|
|
34
49
|
// Then full-text search from server
|
|
35
50
|
searchTimer = setTimeout(() => doSearch(q), 350);
|
|
36
51
|
});
|
|
37
52
|
});
|
|
38
53
|
}
|
|
39
54
|
|
|
55
|
+
// Programmatic trigger used by the Files modal after a replace/delete.
|
|
56
|
+
// Fills both search inputs and runs the server search immediately (no debounce).
|
|
57
|
+
function runSearchImmediate(q) {
|
|
58
|
+
const trimmed = (q || "").trim();
|
|
59
|
+
["header-search", "sidebar-search"].forEach((id) => {
|
|
60
|
+
const el = document.getElementById(id);
|
|
61
|
+
if (el) el.value = trimmed;
|
|
62
|
+
});
|
|
63
|
+
clearTimeout(searchTimer);
|
|
64
|
+
if (!trimmed) {
|
|
65
|
+
searchQuery = "";
|
|
66
|
+
searchResults = null;
|
|
67
|
+
renderSidebar(allDocs);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
searchQuery = trimmed;
|
|
71
|
+
searchResults = [];
|
|
72
|
+
renderSidebar([]);
|
|
73
|
+
doSearch(trimmed);
|
|
74
|
+
}
|
|
75
|
+
window.runSearchImmediate = runSearchImmediate;
|
|
76
|
+
|
|
40
77
|
async function doSearch(q) {
|
|
41
78
|
try {
|
|
42
79
|
const results = await fetch(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/lib/metadata.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAE5D,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAQjE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,GACnB,IAAI,CAMN;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,CAUR;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,GACjB,YAAY,CAmBd;
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/lib/metadata.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAE5D,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAQjE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,GACnB,IAAI,CAMN;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,CAUR;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,GACjB,YAAY,CAmBd;AAID,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,EAAE,EACxB,UAAU,EAAE,MAAM,GACjB,cAAc,CAahB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,aAAa,EAAE,CAGjB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,EAAE,GACvB,IAAI,CAKN"}
|
package/dist/src/lib/metadata.js
CHANGED
|
@@ -71,27 +71,23 @@ function classifyEntry(entry, sourceRoot) {
|
|
|
71
71
|
status,
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
|
-
//
|
|
74
|
+
// accuracy = unchanged / total. Each entry is an assertion that the doc is in
|
|
75
|
+
// sync with a source file; modified or missing both break that assertion.
|
|
75
76
|
function buildReport(entries, sourceRoot) {
|
|
76
77
|
const items = entries.map((e) => classifyEntry(e, sourceRoot));
|
|
77
78
|
const total = items.length;
|
|
78
79
|
let unchanged = 0;
|
|
79
80
|
let modified = 0;
|
|
80
81
|
let missing = 0;
|
|
81
|
-
let weight = 0;
|
|
82
82
|
for (const it of items) {
|
|
83
83
|
if (it.status === "unchanged")
|
|
84
84
|
unchanged++;
|
|
85
|
-
else if (it.status === "modified")
|
|
85
|
+
else if (it.status === "modified")
|
|
86
86
|
modified++;
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
87
|
+
else
|
|
90
88
|
missing++;
|
|
91
|
-
weight += 3;
|
|
92
|
-
}
|
|
93
89
|
}
|
|
94
|
-
const accuracy = total === 0 ? 1 :
|
|
90
|
+
const accuracy = total === 0 ? 1 : unchanged / total;
|
|
95
91
|
return { items, total, unchanged, modified, missing, accuracy };
|
|
96
92
|
}
|
|
97
93
|
function getDocEntries(docsPath, docId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/lib/metadata.ts"],"names":[],"mappings":";;;;;AAgCA,oCAEC;AAED,8CAQC;AAED,gDASC;AAED,8CAOC;AAED,sDAaC;AAED,sCAsBC;
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/lib/metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../src/routes/documents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAIpD,OAAO,EAAiB,WAAW,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../src/routes/documents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAIpD,OAAO,EAAiB,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ3D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAcrE;AAED,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAAM,EAAO,EACzB,eAAe,CAAC,EAAE,MAAM,GACvB,WAAW,EAAE,CA+Bf;AAwBD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI9E;AAeD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKxD;AAID,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAkBtD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA+TxD"}
|
|
@@ -15,6 +15,8 @@ const path_1 = __importDefault(require("path"));
|
|
|
15
15
|
const marked_1 = require("marked");
|
|
16
16
|
const parser_1 = require("../lib/parser");
|
|
17
17
|
const config_1 = require("../lib/config");
|
|
18
|
+
const metadata_1 = require("../lib/metadata");
|
|
19
|
+
const METADATA_SEARCH_PREFIX = "metadata://";
|
|
18
20
|
const RESERVED_DOCS_SUBFOLDERS = new Set(["files", "images"]);
|
|
19
21
|
function collectMdFiles(dir, baseDir) {
|
|
20
22
|
const results = [];
|
|
@@ -135,11 +137,40 @@ function documentsRouter(docsPath) {
|
|
|
135
137
|
res.status(500).json({ error: "Failed to list documents" });
|
|
136
138
|
}
|
|
137
139
|
});
|
|
138
|
-
// GET /api/documents/search?q=query — full-text search
|
|
140
|
+
// GET /api/documents/search?q=query — full-text search. When the query
|
|
141
|
+
// starts with `metadata://<basename>`, return docs whose metadata references
|
|
142
|
+
// a source file with that basename (e.g. a file in DOCS_FOLDER/files/).
|
|
139
143
|
router.get("/search", (req, res) => {
|
|
140
|
-
const
|
|
141
|
-
if (!
|
|
144
|
+
const rawQuery = (req.query.q ?? "").trim();
|
|
145
|
+
if (!rawQuery)
|
|
142
146
|
return res.json([]);
|
|
147
|
+
if (rawQuery.toLowerCase().startsWith(METADATA_SEARCH_PREFIX)) {
|
|
148
|
+
const needle = rawQuery.slice(METADATA_SEARCH_PREFIX.length).trim();
|
|
149
|
+
if (!needle)
|
|
150
|
+
return res.json([]);
|
|
151
|
+
try {
|
|
152
|
+
const { extraFiles = [], filenamePattern } = (0, config_1.readConfig)(docsPath);
|
|
153
|
+
const docs = listDocs(docsPath, extraFiles, filenamePattern);
|
|
154
|
+
const store = (0, metadata_1.readMetadataStore)(docsPath);
|
|
155
|
+
const matchingIds = new Set();
|
|
156
|
+
for (const [docId, entries] of Object.entries(store)) {
|
|
157
|
+
for (const entry of entries) {
|
|
158
|
+
if (path_1.default.basename(entry.path) === needle) {
|
|
159
|
+
matchingIds.add(docId);
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const results = docs
|
|
165
|
+
.filter((d) => matchingIds.has(decodeURIComponent(d.id)))
|
|
166
|
+
.map((d) => ({ ...d, excerpt: `↳ ${needle}` }));
|
|
167
|
+
return res.json(results);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return res.status(500).json({ error: "Metadata search failed" });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const query = rawQuery.toLowerCase();
|
|
143
174
|
try {
|
|
144
175
|
const { extraFiles = [], filenamePattern } = (0, config_1.readConfig)(docsPath);
|
|
145
176
|
const docs = listDocs(docsPath, extraFiles, filenamePattern);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/routes/documents.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/routes/documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/routes/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/routes/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AAiCpD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAoKpD"}
|
package/dist/src/routes/files.js
CHANGED
|
@@ -18,8 +18,108 @@ function slugify(name) {
|
|
|
18
18
|
.replace(/^_|_$/g, '')
|
|
19
19
|
.slice(0, 80);
|
|
20
20
|
}
|
|
21
|
+
function isSafeFilename(filename) {
|
|
22
|
+
return typeof filename === 'string'
|
|
23
|
+
&& filename.length > 0
|
|
24
|
+
&& !/[\\\/]/.test(filename)
|
|
25
|
+
&& !filename.startsWith('.')
|
|
26
|
+
&& filename !== '..';
|
|
27
|
+
}
|
|
28
|
+
function resolveFilePathSafe(filesDir, filename) {
|
|
29
|
+
if (!isSafeFilename(filename))
|
|
30
|
+
return null;
|
|
31
|
+
const resolvedDir = path_1.default.resolve(filesDir);
|
|
32
|
+
const resolved = path_1.default.resolve(filesDir, filename);
|
|
33
|
+
if (resolved !== path_1.default.join(resolvedDir, filename))
|
|
34
|
+
return null;
|
|
35
|
+
return resolved;
|
|
36
|
+
}
|
|
21
37
|
function filesRouter(docsPath) {
|
|
22
38
|
const router = (0, express_1.Router)();
|
|
39
|
+
// GET /api/files — list files in DOCS_FOLDER/files/ (sorted lex = chronological
|
|
40
|
+
// because filenames start with YYYYMMDDHHmmss).
|
|
41
|
+
router.get('/', (_req, res) => {
|
|
42
|
+
const filesDir = path_1.default.join(docsPath, 'files');
|
|
43
|
+
if (!fs_1.default.existsSync(filesDir)) {
|
|
44
|
+
return res.json({ files: [] });
|
|
45
|
+
}
|
|
46
|
+
const entries = fs_1.default
|
|
47
|
+
.readdirSync(filesDir, { withFileTypes: true })
|
|
48
|
+
.filter((e) => e.isFile())
|
|
49
|
+
.map((e) => e.name)
|
|
50
|
+
.sort((a, b) => a.localeCompare(b));
|
|
51
|
+
const files = entries.map((filename) => {
|
|
52
|
+
const stat = fs_1.default.statSync(path_1.default.join(filesDir, filename));
|
|
53
|
+
const match = filename.match(/^(\d{14})_[a-z0-9]{4}_(.+)$/);
|
|
54
|
+
let uploadedAt = null;
|
|
55
|
+
let displayName = filename;
|
|
56
|
+
if (match) {
|
|
57
|
+
const ts = match[1];
|
|
58
|
+
const d = new Date(parseInt(ts.slice(0, 4), 10), parseInt(ts.slice(4, 6), 10) - 1, parseInt(ts.slice(6, 8), 10), parseInt(ts.slice(8, 10), 10), parseInt(ts.slice(10, 12), 10), parseInt(ts.slice(12, 14), 10));
|
|
59
|
+
uploadedAt = isNaN(d.getTime()) ? null : d.toISOString();
|
|
60
|
+
displayName = match[2];
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
filename,
|
|
64
|
+
displayName,
|
|
65
|
+
uploadedAt,
|
|
66
|
+
size: stat.size,
|
|
67
|
+
url: `/files/${filename}`,
|
|
68
|
+
};
|
|
69
|
+
});
|
|
70
|
+
res.json({ files });
|
|
71
|
+
});
|
|
72
|
+
// PUT /api/files/:filename — overwrite existing file (same filename, no history).
|
|
73
|
+
router.put('/:filename', (req, res) => {
|
|
74
|
+
const { filename } = req.params;
|
|
75
|
+
const { data } = req.body;
|
|
76
|
+
const filesDir = path_1.default.join(docsPath, 'files');
|
|
77
|
+
const filePath = resolveFilePathSafe(filesDir, filename);
|
|
78
|
+
if (!filePath) {
|
|
79
|
+
return res.status(400).json({ error: 'Invalid filename' });
|
|
80
|
+
}
|
|
81
|
+
if (typeof data !== 'string' || !data) {
|
|
82
|
+
return res.status(400).json({ error: 'data is required' });
|
|
83
|
+
}
|
|
84
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
85
|
+
return res.status(404).json({ error: 'File not found' });
|
|
86
|
+
}
|
|
87
|
+
const base64 = data.replace(/^data:[^;]+;base64,/, '');
|
|
88
|
+
const buffer = Buffer.from(base64, 'base64');
|
|
89
|
+
if (buffer.length > MAX_FILE_BYTES) {
|
|
90
|
+
return res.status(413).json({
|
|
91
|
+
error: `File too large (${(buffer.length / 1024 / 1024).toFixed(1)} MB). Maximum is ${(MAX_FILE_BYTES / 1024 / 1024).toFixed(0)} MB.`,
|
|
92
|
+
maxBytes: MAX_FILE_BYTES,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
fs_1.default.writeFileSync(filePath, buffer);
|
|
97
|
+
const stat = fs_1.default.statSync(filePath);
|
|
98
|
+
res.json({ filename, size: stat.size, url: `/files/${filename}` });
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
res.status(500).json({ error: 'Failed to replace file' });
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// DELETE /api/files/:filename — remove a file from DOCS_FOLDER/files/.
|
|
105
|
+
router.delete('/:filename', (req, res) => {
|
|
106
|
+
const { filename } = req.params;
|
|
107
|
+
const filesDir = path_1.default.join(docsPath, 'files');
|
|
108
|
+
const filePath = resolveFilePathSafe(filesDir, filename);
|
|
109
|
+
if (!filePath) {
|
|
110
|
+
return res.status(400).json({ error: 'Invalid filename' });
|
|
111
|
+
}
|
|
112
|
+
if (!fs_1.default.existsSync(filePath)) {
|
|
113
|
+
return res.status(404).json({ error: 'File not found' });
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
fs_1.default.unlinkSync(filePath);
|
|
117
|
+
res.json({ ok: true });
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
res.status(500).json({ error: 'Failed to delete file' });
|
|
121
|
+
}
|
|
122
|
+
});
|
|
23
123
|
// POST /api/files/upload — base64-encoded arbitrary file saved to DOCS_FOLDER/files/
|
|
24
124
|
router.post('/upload', (req, res) => {
|
|
25
125
|
const { data, name } = req.body;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/routes/files.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../src/routes/files.ts"],"names":[],"mappings":"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"}
|