Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • SSO
  • adding-tests
  • config-migration
  • fixing-fullstack-build
  • interaction-tool
  • legacy
  • link-refinement
  • main
  • minify-docker-images
  • minor_qol_fixes
  • p10
  • p10_old
  • pointer-tool
  • python-package
  • remotePointer
  • run106
  • stampy
  • toolbar-refresh
  • undo_and_redo
  • v1.12.5
  • 1.6.4
  • v1.10.0
  • v1.11.0
  • v1.11.1
  • v1.11.3
  • v1.11.4
  • v1.12.0
  • v1.12.1
  • v1.12.2
  • v1.12.3
  • v1.12.4
  • v1.3.1
  • v1.3.2
  • v1.3.3
  • v1.3.4
  • v1.4.0
  • v1.4.1
  • v1.4.3
  • v1.5.1
  • v1.5.2
  • v1.5.3
  • v1.6.0
  • v1.6.1
  • v1.7.0
  • v1.7.1
  • v1.7.2
  • v1.8.0
  • v1.8.1
  • v1.8.2
  • v1.8.3
  • v1.8.4
  • v1.8.5
  • v1.9.0
  • v1.9.1
  • v1.9.2
  • v1.9.3
56 results

Target

Select target project
  • alexander.clausen/snip
  • irp/snip
2 results
Select Git revision
  • SSO
  • adding-tests
  • config-migration
  • fixing-fullstack-build
  • interaction-tool
  • legacy
  • link-refinement
  • main
  • minify-docker-images
  • minor_qol_fixes
  • p10
  • p10_old
  • pointer-tool
  • python-package
  • remotePointer
  • run106
  • stampy
  • toolbar-refresh
  • undo_and_redo
  • v1.12.5
  • 1.6.4
  • v1.10.0
  • v1.11.0
  • v1.11.1
  • v1.11.3
  • v1.11.4
  • v1.12.0
  • v1.12.1
  • v1.12.2
  • v1.12.3
  • v1.12.4
  • v1.3.1
  • v1.3.2
  • v1.3.3
  • v1.3.4
  • v1.4.0
  • v1.4.1
  • v1.4.3
  • v1.5.1
  • v1.5.2
  • v1.5.3
  • v1.6.0
  • v1.6.1
  • v1.7.0
  • v1.7.1
  • v1.7.2
  • v1.8.0
  • v1.8.1
  • v1.8.2
  • v1.8.3
  • v1.8.4
  • v1.8.5
  • v1.9.0
  • v1.9.1
  • v1.9.2
  • v1.9.3
56 results
Show changes
Commits on Source (3)
...@@ -8,6 +8,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ...@@ -8,6 +8,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## 1.12.1
### Fixed
- Hotfix: Fixed a small bug in the render backend which should prevent heavy cpu usage for pdf rendering
- Removed user error.message component for invitation problems as errors are stripped in production
- Collaborator remove modal now closes after removing a collaborator
## 1.12.0 ## 1.12.0
### Fixed ### Fixed
......
...@@ -320,7 +320,10 @@ function RemoveCollaboratorModal({ ...@@ -320,7 +320,10 @@ function RemoveCollaboratorModal({
</Button> </Button>
<Button <Button
variant="danger" variant="danger"
onClick={() => removeCollaborator(collaborator)} onClick={() => {
removeCollaborator(collaborator);
handleClose();
}}
> >
Remove Remove
</Button> </Button>
......
...@@ -17,11 +17,6 @@ export default function Error({ ...@@ -17,11 +17,6 @@ export default function Error({
<> <>
<h1 className="text-center">Invitation error</h1> <h1 className="text-center">Invitation error</h1>
<hr /> <hr />
{error.message && (
<div className="text-center p-1">
<code>{error.message}</code>
</div>
)}
<p className="text-center text-dark"> <p className="text-center text-dark">
The token provided is invalid or has already been used. Make The token provided is invalid or has already been used. Make
sure you are using the correct link we have sent you via email. sure you are using the correct link we have sent you via email.
......
import { NextFunction, Request, Response } from "express"; import { NextFunction, Request, Response } from "express";
import { NotFoundError } from "@snip/database/errors";
import { import {
DataValidationError, DataValidationError,
DataValidationErrorArray, DataValidationErrorArray,
} from "@snip/snips/errors"; } from "@snip/snips/errors";
import { NotFoundError } from "@snip/database/errors";
export const errorHandler = ( export const errorHandler = (
err: Error, err: Error,
...@@ -56,8 +56,8 @@ export const asyncHandler = ...@@ -56,8 +56,8 @@ export const asyncHandler =
next: NextFunction, next: NextFunction,
) => Promise<unknown>, ) => Promise<unknown>,
) => ) =>
(req: Request, res: Response, next: NextFunction) => (req: Request, res: Response, next: NextFunction) =>
Promise.resolve(fn(req, res, next)).catch(next); Promise.resolve(fn(req, res, next)).catch(next);
/** Extend the error class to create an auth failed error */ /** Extend the error class to create an auth failed error */
export class AuthFailedError extends Error { export class AuthFailedError extends Error {
......
...@@ -47,8 +47,11 @@ const get_bitmap = async function (this: any) { ...@@ -47,8 +47,11 @@ const get_bitmap = async function (this: any) {
ImageSnipLegacy.prototype.get_bitmap = get_bitmap; ImageSnipLegacy.prototype.get_bitmap = get_bitmap;
ImageSnip.prototype.get_bitmap = get_bitmap; ImageSnip.prototype.get_bitmap = get_bitmap;
import path from "path"; import path from "path";
async function readFromAssetsAsResponse(p: string, ...args: unknown[]) { async function readFromAssetsAsResponse(
const buffer = await readFile(path.join("/assets", p)); p: string | URL | Request,
..._args: unknown[]
) {
const buffer = await readFile(path.join("/assets", String(p)));
return new Response(buffer); return new Response(buffer);
} }
......
...@@ -2,14 +2,14 @@ import { PDFDocument } from "pdf-lib"; ...@@ -2,14 +2,14 @@ import { PDFDocument } from "pdf-lib";
import { Readable } from "stream"; import { Readable } from "stream";
import stream2buffer from "@snip/common/stream2buffer"; import stream2buffer from "@snip/common/stream2buffer";
import { BookDataRet, PageData } from "@snip/database/types"; import { BookDataRet, PageDataRet } from "@snip/database/types";
import renderPage from "."; import renderPage from ".";
import { PageNumberLocation, SelectedPage } from "./renderParams"; import { PageNumberLocation, SelectedPage } from "./renderParams";
export async function render_book_pdf( export async function render_book_pdf(
bookData: BookDataRet, bookData: BookDataRet,
pages: PageData[], pages: PageDataRet[],
selectedPages?: SelectedPage[], selectedPages?: SelectedPage[],
pageNumberLocation?: PageNumberLocation, pageNumberLocation?: PageNumberLocation,
): Promise<[Readable, number]> { ): Promise<[Readable, number]> {
...@@ -41,20 +41,16 @@ export async function render_book_pdf( ...@@ -41,20 +41,16 @@ export async function render_book_pdf(
}); });
} }
const pdfsToMerge = await Promise.all(
pages.map((page) => {
return renderPage(page.id, {
width: 720,
format: "pdf",
force_render: false,
encoding: "gzip",
return_stream: true,
}) as Promise<Readable>;
}),
);
const mergedPdf = await PDFDocument.create(); const mergedPdf = await PDFDocument.create();
for (const pdfBytes of pdfsToMerge) { for (const page of pages) {
const pdfBytes = (await renderPage(page.id, {
width: 720,
format: "pdf",
force_render: false,
encoding: "gzip",
return_stream: true,
})) as Readable;
const pdf = await PDFDocument.load(await stream2buffer(pdfBytes)); const pdf = await PDFDocument.load(await stream2buffer(pdfBytes));
// Get the form containing all the fields // Get the form containing all the fields
const form = pdf.getForm(); const form = pdf.getForm();
......
import express, { Response } from "express"; import express, { Response } from "express";
import { createServer } from "http"; import { createServer } from "http";
import { AddressInfo } from "net";
import sharp from "sharp";
import { Readable } from "stream";
import { createGzip } from "zlib";
import { z } from "zod";
import { config } from "@snip/config/server";
import service from "@snip/database"; import service from "@snip/database";
import { NotFoundError } from "@snip/database/errors"; import { NotFoundError } from "@snip/database/errors";
import { LocalPage } from "@snip/render/page";
import { get_snip_from_data } from "@snip/snips";
import { import {
adminMiddleWare, adminMiddleWare,
...@@ -17,27 +25,17 @@ import { ...@@ -17,27 +25,17 @@ import {
BadUsage, BadUsage,
errorHandler, errorHandler,
} from "./common/errorHandler"; } from "./common/errorHandler";
import renderPage, { render } from "./render";
import { render_book_pdf } from "./render/pdf";
import { import {
parseSelectedPages, parseSelectedPages,
RenderParams, RenderParams,
validateRenderParams, validateRenderParams,
} from "./render/renderParams"; } from "./render/renderParams";
import { renderSnip } from "./render/snip";
const app = express(); const app = express();
export const server = createServer(app); export const server = createServer(app);
import { AddressInfo } from "net";
import sharp from "sharp";
import { Readable } from "stream";
import { createGzip } from "zlib";
import { z } from "zod";
import { config } from "@snip/config/server";
import { LocalPage } from "@snip/render/page";
import { get_snip_from_data } from "@snip/snips";
import renderPage, { render } from "./render";
import { render_book_pdf } from "./render/pdf";
import { renderSnip } from "./render/snip";
const renderSchema = z.object({ const renderSchema = z.object({
page_id: z.coerce.number(), page_id: z.coerce.number(),
......
{ {
"name": "snip", "name": "snip",
"version": "1.12.0", "version": "1.12.1",
"description": "our digital lab book", "description": "our digital lab book",
"author": "Sebastian B. Mohr, Markus Osterhoff", "author": "Sebastian B. Mohr, Markus Osterhoff",
"repository": { "repository": {
......