living-documentation 7.10.0 → 7.12.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/README.md +31 -2
- package/dist/src/frontend/accuracy-gauge.js +4 -1
- 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 +26 -2
- package/dist/src/frontend/i18n/fr.json +25 -1
- package/dist/src/frontend/index.html +72 -4
- 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
package/README.md
CHANGED
|
@@ -10,6 +10,18 @@ No cloud, no database, no build step — just point it at a folder where you add
|
|
|
10
10
|
|
|
11
11
|
## Features
|
|
12
12
|
|
|
13
|
+
### Reliability gauge — keep your docs honest
|
|
14
|
+
|
|
15
|
+
Living Documentation's flagship feature: each document can be **bound to the source files it describes**, so you can see at a glance whether it has drifted from the code.
|
|
16
|
+
|
|
17
|
+
- **Bind source files** to any doc via the `🗂 Metadata` button in the doc header — pick any file under `sourceRoot` (your project root, configurable in Admin). Each binding stores the file's SHA-256 hash.
|
|
18
|
+
- **Reliability gauge** in the sticky doc header — a red → orange → yellow → green gradient bar that fills up as `reliability = unchanged / total`. If every bound file still matches its hash, the bar is full and green; as soon as one file is modified or deleted, the gauge drops and the colour shifts. Hidden when the doc has no bindings. Click it to open the metadata modal.
|
|
19
|
+
- **Metadata Files popup** (top bar `📁 Metadata Files`) — central place to list, **replace** or **delete** every file uploaded under `DOCS_FOLDER/files/` (PDFs, specs, mockups attached to docs). After a replace/delete, the popup closes and the search bar is auto-filled with `metadata://<filename>` so you immediately see which documents still reference it.
|
|
20
|
+
- **`metadata://<filename>` search prefix** — reverse-lookup documents by the source files they're bound to. Useful to answer "which docs am I supposed to update now that I've changed this PDF/class/module?".
|
|
21
|
+
- **MCP tools** (`list_metadata`, `get_accuracy`, `add_metadata`, `refresh_metadata`) — AI agents can detect drift, read the source & the doc, rewrite the doc and re-baseline the hashes autonomously.
|
|
22
|
+
|
|
23
|
+
### Other features
|
|
24
|
+
|
|
13
25
|
- **Sidebar** grouped by folder → category, sorted alphabetically; **General** always first
|
|
14
26
|
[](/diagram?id=d1775399110713)
|
|
15
27
|
|
|
@@ -224,16 +236,21 @@ living-documentation/
|
|
|
224
236
|
│ │ ├── wordcloud.ts Word cloud raw text reader
|
|
225
237
|
│ │ ├── diagrams.ts Diagrams CRUD API (vis-network JSON)
|
|
226
238
|
│ │ ├── annotations.ts Per-document highlight markers API
|
|
239
|
+
│ │ ├── metadata.ts Source-file bindings + reliability report
|
|
240
|
+
│ │ ├── browse-source.ts Source tree navigator (rooted at sourceRoot)
|
|
227
241
|
│ │ └── export.ts HTML export (PDF, Notion, Confluence zip)
|
|
228
242
|
│ ├── mcp/
|
|
229
243
|
│ │ ├── server.ts Model Context Protocol server (Streamable HTTP)
|
|
230
244
|
│ │ └── tools/
|
|
231
245
|
│ │ ├── documents.ts MCP tools: list/read/create document
|
|
232
246
|
│ │ ├── diagrams.ts MCP tools: list/read/create diagram
|
|
233
|
-
│ │
|
|
247
|
+
│ │ ├── source.ts MCP tools: list/read/search source files
|
|
248
|
+
│ │ └── metadata.ts MCP tools: list_metadata, get_accuracy, add_metadata, refresh_metadata
|
|
234
249
|
│ ├── lib/
|
|
235
250
|
│ │ ├── parser.ts Filename parser
|
|
236
|
-
│ │
|
|
251
|
+
│ │ ├── config.ts Config management (.living-doc.json)
|
|
252
|
+
│ │ ├── metadata.ts .metadata.json store + reliability formula
|
|
253
|
+
│ │ └── hash.ts sha256File helper
|
|
237
254
|
│ └── frontend/
|
|
238
255
|
│ ├── index.html Main viewer shell
|
|
239
256
|
│ ├── admin.html Admin panel
|
|
@@ -271,6 +288,14 @@ living-documentation/
|
|
|
271
288
|
| `POST` | `/api/browse/mkdir` | Create a new folder under the docs root |
|
|
272
289
|
| `POST` | `/api/images/upload` | Upload a base64 image; saved to `DOCS_FOLDER/images/` |
|
|
273
290
|
| `POST` | `/api/files/upload` | Upload a base64 file attachment; saved to `DOCS_FOLDER/files/` |
|
|
291
|
+
| `GET` | `/api/files` | List every file under `DOCS_FOLDER/files/` (chronological) |
|
|
292
|
+
| `PUT` | `/api/files/:filename` | Replace an existing attachment with a new base64 payload |
|
|
293
|
+
| `DELETE` | `/api/files/:filename` | Delete an attachment |
|
|
294
|
+
| `GET` | `/api/metadata/:docId` | Reliability report for one doc (per-entry status + score) |
|
|
295
|
+
| `POST` | `/api/metadata/:docId` | Add or replace a source-file binding for a doc |
|
|
296
|
+
| `DELETE` | `/api/metadata/:docId` | Remove a binding |
|
|
297
|
+
| `POST` | `/api/metadata/:docId/refresh` | Re-hash all bindings (re-baseline after the doc has been updated) |
|
|
298
|
+
| `GET` | `/api/browse-source?path=` | Navigate the source tree rooted at `sourceRoot` |
|
|
274
299
|
| `GET` | `/api/diagrams` | List saved diagrams |
|
|
275
300
|
| `GET` | `/api/diagrams/:id` | Read a single diagram (nodes + edges) |
|
|
276
301
|
| `PUT` | `/api/diagrams/:id` | Create or update a diagram |
|
|
@@ -317,6 +342,10 @@ A `GET http://localhost:4321/mcp` returns a JSON summary of available tools for
|
|
|
317
342
|
| `list_source_files` | List project source files under `sourceRoot` (fallback only) |
|
|
318
343
|
| `read_source_file` | Read a source file under `sourceRoot` (fallback only) |
|
|
319
344
|
| `search_source` | Grep-like text search across files under `sourceRoot` |
|
|
345
|
+
| `list_metadata` | List the source-file bindings of every doc |
|
|
346
|
+
| `get_accuracy` | Get the reliability report of a doc (per-entry status + ratio) — detect drift |
|
|
347
|
+
| `add_metadata` | Bind a source file to a doc (stores the SHA-256 hash) |
|
|
348
|
+
| `refresh_metadata` | Re-hash all bindings for a doc — re-baseline after the doc has been rewritten |
|
|
320
349
|
|
|
321
350
|
Prompts (`generate-context-diagram`, `generate-container-diagram`, `generate-uml-diagram`, `update-diagram-from-docs`, `generate-screen-guide`, `flow`, `erd`) are exposed alongside the tools for clients that surface MCP prompts to the user.
|
|
322
351
|
|
|
@@ -29,7 +29,10 @@ function renderAccuracyGauge(report) {
|
|
|
29
29
|
if (label) label.textContent = window.t("accuracy.label");
|
|
30
30
|
if (bar) {
|
|
31
31
|
bar.style.width = pct + "%";
|
|
32
|
-
|
|
32
|
+
// The gradient spans the full track width, so we stretch the background
|
|
33
|
+
// to (100/pct)× the bar width — this way the bar only shows the left
|
|
34
|
+
// portion of the red→green gradient corresponding to its percentage.
|
|
35
|
+
bar.style.backgroundSize = pct > 0 ? `${10000 / pct}% 100%` : "100% 100%";
|
|
33
36
|
}
|
|
34
37
|
if (value) {
|
|
35
38
|
value.textContent = pct + "%";
|
|
@@ -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",
|
|
@@ -76,11 +100,11 @@
|
|
|
76
100
|
"metadata.add": "Add source file",
|
|
77
101
|
"metadata.refresh": "Refresh hashes",
|
|
78
102
|
"metadata.remove": "Remove",
|
|
79
|
-
"metadata.empty": "No metadata yet — add a source file to start tracking
|
|
103
|
+
"metadata.empty": "No metadata yet — add a source file to start tracking reliability.",
|
|
80
104
|
"metadata.status.unchanged": "Unchanged",
|
|
81
105
|
"metadata.status.modified": "Modified",
|
|
82
106
|
"metadata.status.missing": "Missing",
|
|
83
|
-
"accuracy.label": "
|
|
107
|
+
"accuracy.label": "Reliability",
|
|
84
108
|
"accuracy.tooltip": "Unchanged: {unchanged} · Modified: {modified} · Missing: {missing} · Total: {total}",
|
|
85
109
|
|
|
86
110
|
"modal.new_folder.title": "New folder",
|
|
@@ -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",
|
|
@@ -80,7 +104,7 @@
|
|
|
80
104
|
"metadata.status.unchanged": "Inchangé",
|
|
81
105
|
"metadata.status.modified": "Modifié",
|
|
82
106
|
"metadata.status.missing": "Manquant",
|
|
83
|
-
"accuracy.label": "
|
|
107
|
+
"accuracy.label": "Fiabilité",
|
|
84
108
|
"accuracy.tooltip": "Inchangés : {unchanged} · Modifiés : {modified} · Manquants : {missing} · Total : {total}",
|
|
85
109
|
|
|
86
110
|
"modal.new_folder.title": "Nouveau dossier",
|
|
@@ -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"
|
|
@@ -636,20 +647,20 @@
|
|
|
636
647
|
<div
|
|
637
648
|
id="accuracy-gauge"
|
|
638
649
|
onclick="openMetadataModal()"
|
|
639
|
-
class="hidden no-print mt-
|
|
650
|
+
class="hidden no-print mt-5 flex items-center gap-3 mr-auto w-full sm:w-80 cursor-pointer select-none"
|
|
640
651
|
>
|
|
641
652
|
<span
|
|
642
653
|
id="accuracy-gauge-label"
|
|
643
654
|
data-i18n="accuracy.label"
|
|
644
655
|
class="text-xs text-gray-500 dark:text-gray-400 shrink-0"
|
|
645
|
-
>
|
|
656
|
+
>Reliability</span>
|
|
646
657
|
<div
|
|
647
|
-
class="flex-1 h-
|
|
658
|
+
class="flex-1 h-4 rounded-full bg-gray-200 dark:bg-gray-700 overflow-hidden"
|
|
648
659
|
>
|
|
649
660
|
<div
|
|
650
661
|
id="accuracy-gauge-bar"
|
|
651
662
|
class="h-full transition-all"
|
|
652
|
-
style="width: 0%; background-
|
|
663
|
+
style="width: 0%; background: linear-gradient(to right, #dc2626, #f97316, #eab308, #16a34a); background-size: 100% 100%; background-repeat: no-repeat;"
|
|
653
664
|
></div>
|
|
654
665
|
</div>
|
|
655
666
|
<span
|
|
@@ -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":";;;;;AAiCA,kCAoKC;AArMD,qCAAoD;AACpD,4CAAoB;AACpB,gDAAwB;AACxB,0CAA2C;AAE3C,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,qCAAqC;AAE9E,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,OAAO,QAAQ,KAAK,QAAQ;WAC9B,QAAQ,CAAC,MAAM,GAAG,CAAC;WACnB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;WACxB,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;WACzB,QAAQ,KAAK,IAAI,CAAC;AACzB,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAgB,EAAE,QAAgB;IAC7D,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,IAAI,QAAQ,KAAK,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,WAAW,CAAC,QAAgB;IAC1C,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;IAExB,gFAAgF;IAChF,gDAAgD;IAChD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,OAAO,GAAG,YAAE;aACf,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;aAC9C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,YAAE,CAAC,QAAQ,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC5D,IAAI,UAAU,GAAkB,IAAI,CAAC;YACrC,IAAI,WAAW,GAAG,QAAQ,CAAC;YAC3B,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpB,MAAM,CAAC,GAAG,IAAI,IAAI,CAChB,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAChC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAC5B,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAC7B,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAC9B,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAC/B,CAAC;gBACF,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBACzD,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,CAAC;YACD,OAAO;gBACL,QAAQ;gBACR,WAAW;gBACX,UAAU;gBACV,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,EAAE,UAAU,QAAQ,EAAE;aAC1B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,kFAAkF;IAClF,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QACvD,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAChC,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAyB,CAAC;QAE/C,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YACnC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBACrI,QAAQ,EAAE,cAAc;aACzB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC;YACH,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QAC1D,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAChC,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC;YACH,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qFAAqF;IACrF,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;QACrD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,IAAwC,CAAC;QAEpE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,CAAC,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACnF,IAAI,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gDAAgD,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACjF,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,eAAe,MAAM,sCAAsC;gBAClE,gBAAgB,EAAE,MAAM;aACzB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;YACnC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBACrI,QAAQ,EAAE,cAAc;aACzB,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,cAAc,GAAG,OAAO,CAAC,cAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,cAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;QAClG,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtD,MAAM,SAAS,GACb,GAAG,GAAG,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE;YACrE,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,GAAG,SAAS,IAAI,MAAM,IAAI,cAAc,IAAI,MAAM,EAAE,CAAC;QACtE,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE/C,IAAI,CAAC;YACH,YAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC;gBACP,QAAQ;gBACR,GAAG,EAAE,UAAU,QAAQ,EAAE;gBACzB,YAAY;gBACZ,IAAI,EAAE,MAAM,CAAC,MAAM;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC"}
|