mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-30 14:38:12 +00:00
65 lines
2.6 KiB
TypeScript
65 lines
2.6 KiB
TypeScript
/**
|
|
* The single decision every EDR document makes about its round seal: draw the
|
|
* one uploaded company stamp when one is configured (StampSettingsService), or
|
|
* fall back to the plain text rings the document styles itself.
|
|
*
|
|
* Only the image-vs-text branch and the image overrides live here — each
|
|
* document keeps its own `.seal` geometry (the invoice's seal is absolutely
|
|
* positioned top-right, the warehouse papers' sit inline above the signature
|
|
* lines), so centralizing the source of the stamp does not relayout anything.
|
|
*
|
|
* These helpers are for the HTML/Chromium render path. The hand-built vector
|
|
* fallbacks in styled-pdf.util.ts cannot embed a raster image and continue to
|
|
* draw their vector seal — see InvoiceDocumentService for that caveat.
|
|
*/
|
|
|
|
/** Escape a value for interpolation into HTML text or a quoted attribute. */
|
|
function escapeHtml(value: unknown): string {
|
|
return String(value ?? "")
|
|
.replace(/&/g, "&")
|
|
.replace(/</g, "<")
|
|
.replace(/>/g, ">")
|
|
.replace(/"/g, """)
|
|
.replace(/'/g, "'");
|
|
}
|
|
|
|
/**
|
|
* CSS overrides that neutralize a document's own ring/rotation styling when the
|
|
* seal is a real stamp image. Append inside a document's <style> block, after
|
|
* its own `.seal` rules. `selector` is the document's seal class ("seal").
|
|
*/
|
|
export function sealImageCss(selector = "seal"): string {
|
|
return [
|
|
`.${selector}.${selector}-image { border: none; border-radius: 0; opacity: 1; transform: none; }`,
|
|
`.${selector}.${selector}-image::before { content: none; }`,
|
|
`.${selector} img { max-width: 100%; max-height: 100%; object-fit: contain; }`,
|
|
].join("\n ");
|
|
}
|
|
|
|
/**
|
|
* Inner markup for the seal element: the stamp image, or the given text lines
|
|
* wrapped in a <span> (matching the `.seal span { position: relative }` rule
|
|
* the ring-drawing documents rely on).
|
|
*
|
|
* `stampImageUrl` is expected to be a data URL from
|
|
* StampSettingsService.getStampImageUrl(); null renders the text fallback.
|
|
*/
|
|
export function sealMarkup(
|
|
stampImageUrl: string | null | undefined,
|
|
textLines: string | string[],
|
|
): string {
|
|
if (stampImageUrl) {
|
|
return `<img src="${escapeHtml(stampImageUrl)}" alt="Company stamp" />`;
|
|
}
|
|
const lines = Array.isArray(textLines) ? textLines : [textLines];
|
|
return `<span>${lines.map(escapeHtml).join("<br />")}</span>`;
|
|
}
|
|
|
|
/** Class attribute for the seal element — adds the image modifier when stamped. */
|
|
export function sealClass(
|
|
stampImageUrl: string | null | undefined,
|
|
selector = "seal",
|
|
): string {
|
|
return stampImageUrl ? `${selector} ${selector}-image` : selector;
|
|
}
|