feat(files): add save-as-new vs overwrite choice for library file edits (#564)

Editing a file from the library used to silently supersede it: the worker auto-saved every result as a new version and the leaf-only listing hid the original, which read as a destructive overwrite. Tool pages now show a per-edit choice for library-sourced files. The default saves the result as an independent new file and keeps the original; picking overwrite keeps the old superseding-version behavior.

The client sends a saveMode multipart field next to fileId, validated with a 400 on unknown values, and autoSaveToLibrary branches on it. Every hand-written route that honors fileId parses the field the same way as the factory. The review panel shows where an auto-saved result went instead of offering a second, duplicate save. Tools whose route or submitter ignores fileId keep the selector hidden via a shared unsupported-tools set, and the choice resets to the non-destructive default whenever a new file is staged.

Closes #495
This commit is contained in:
SnapOtter
2026-07-18 11:36:08 +08:00
committed by GitHub
parent e113684ddb
commit a23158d968
63 changed files with 1721 additions and 19 deletions
@@ -186,8 +186,12 @@ export function SignPdfSettings({ signProps }: { signProps?: SignProps }) {
form.append("placements", JSON.stringify(placements));
form.append("clientJobId", clientJobId);
// Forward the library file id (when the PDF came from the library) so the
// worker auto-saves the signed result as a new version.
if (currentEntry?.serverFileId) form.append("fileId", currentEntry.serverFileId);
// worker auto-saves the signed result, honoring the chosen save mode
// (new file by default, overwrite on request).
if (currentEntry?.serverFileId) {
form.append("fileId", currentEntry.serverFileId);
form.append("saveMode", useFileStore.getState().librarySaveMode);
}
pngs.forEach((png, i) => {
form.append(`sig${i}`, new File([png], `sig${i}.png`, { type: "image/png" }));
});