@hed-hog/core 0.0.400 → 0.0.402
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/access-log/access-log.interceptor.d.ts +10 -0
- package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
- package/dist/access-log/access-log.interceptor.js +15 -1
- package/dist/access-log/access-log.interceptor.js.map +1 -1
- package/dist/ai/ai.controller.d.ts +2 -0
- package/dist/ai/ai.controller.d.ts.map +1 -1
- package/dist/ai/ai.service.d.ts +86 -2
- package/dist/ai/ai.service.d.ts.map +1 -1
- package/dist/ai/ai.service.js +304 -23
- package/dist/ai/ai.service.js.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts +12 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.d.ts.map +1 -1
- package/dist/ai-instruction/ai-prompt-resolver.service.js +26 -0
- package/dist/ai-instruction/ai-prompt-resolver.service.js.map +1 -1
- package/dist/core.module.d.ts.map +1 -1
- package/dist/core.module.js +3 -0
- package/dist/core.module.js.map +1 -1
- package/dist/document-kit/document-kit.module.d.ts +3 -0
- package/dist/document-kit/document-kit.module.d.ts.map +1 -0
- package/dist/document-kit/document-kit.module.js +24 -0
- package/dist/document-kit/document-kit.module.js.map +1 -0
- package/dist/document-kit/document-kit.registry.d.ts +55 -0
- package/dist/document-kit/document-kit.registry.d.ts.map +1 -0
- package/dist/document-kit/document-kit.registry.js +91 -0
- package/dist/document-kit/document-kit.registry.js.map +1 -0
- package/dist/document-kit/document-kit.service.d.ts +49 -0
- package/dist/document-kit/document-kit.service.d.ts.map +1 -0
- package/dist/document-kit/document-kit.service.js +135 -0
- package/dist/document-kit/document-kit.service.js.map +1 -0
- package/dist/file/file-upload-ticket.service.d.ts +1 -1
- package/dist/file/file.controller.d.ts +3 -3
- package/dist/file/file.service.d.ts +136 -13
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +297 -27
- package/dist/file/file.service.js.map +1 -1
- package/dist/file/mcp-file-source.schema.d.ts.map +1 -1
- package/dist/file/mcp-file-source.schema.js +8 -5
- package/dist/file/mcp-file-source.schema.js.map +1 -1
- package/dist/file/provider/abstract.provider.d.ts +33 -0
- package/dist/file/provider/abstract.provider.d.ts.map +1 -1
- package/dist/file/provider/abstract.provider.js +9 -0
- package/dist/file/provider/abstract.provider.js.map +1 -1
- package/dist/file/provider/s3-multipart.util.d.ts +17 -0
- package/dist/file/provider/s3-multipart.util.d.ts.map +1 -0
- package/dist/file/provider/s3-multipart.util.js +88 -0
- package/dist/file/provider/s3-multipart.util.js.map +1 -0
- package/dist/file/provider/s3.provider.d.ts +9 -1
- package/dist/file/provider/s3.provider.d.ts.map +1 -1
- package/dist/file/provider/s3.provider.js +16 -0
- package/dist/file/provider/s3.provider.js.map +1 -1
- package/dist/file/provider/spaces.provider.d.ts +10 -1
- package/dist/file/provider/spaces.provider.d.ts.map +1 -1
- package/dist/file/provider/spaces.provider.js +17 -0
- package/dist/file/provider/spaces.provider.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/integration-profile/integration-profile.controller.d.ts +1 -0
- package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +26 -0
- package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
- package/dist/integration-profile/integration-profile.service.d.ts +1 -0
- package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.service.js +3 -3
- package/dist/integration-profile/integration-profile.service.js.map +1 -1
- package/dist/integration-profile/testers/ai.testers.d.ts.map +1 -1
- package/dist/integration-profile/testers/ai.testers.js +46 -8
- package/dist/integration-profile/testers/ai.testers.js.map +1 -1
- package/dist/integration-profile/testers/http-probe.d.ts.map +1 -1
- package/dist/integration-profile/testers/http-probe.js +5 -3
- package/dist/integration-profile/testers/http-probe.js.map +1 -1
- package/dist/integration-profile/testers/integration-tester.types.d.ts +5 -0
- package/dist/integration-profile/testers/integration-tester.types.d.ts.map +1 -1
- package/dist/mail/mail.service.d.ts.map +1 -1
- package/dist/mail/mail.service.js +16 -1
- package/dist/mail/mail.service.js.map +1 -1
- package/dist/mcp/mcp-server.service.d.ts.map +1 -1
- package/dist/mcp/mcp-server.service.js +10 -1
- package/dist/mcp/mcp-server.service.js.map +1 -1
- package/dist/mcp/mcp.module.d.ts.map +1 -1
- package/dist/mcp/mcp.module.js +2 -0
- package/dist/mcp/mcp.module.js.map +1 -1
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts +17 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.d.ts.map +1 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js +74 -0
- package/dist/mcp/tools/core-access-log.mcp-tools.js.map +1 -0
- package/dist/mcp/tools/core-files.mcp-tools.js +4 -4
- package/dist/mcp/tools/core-files.mcp-tools.js.map +1 -1
- package/dist/meeting/meeting-provider.registry.d.ts +72 -0
- package/dist/meeting/meeting-provider.registry.d.ts.map +1 -1
- package/dist/meeting/meeting-provider.registry.js.map +1 -1
- package/dist/oauth/oauth-token-broker.service.d.ts +50 -1
- package/dist/oauth/oauth-token-broker.service.d.ts.map +1 -1
- package/dist/oauth/oauth-token-broker.service.js +105 -3
- package/dist/oauth/oauth-token-broker.service.js.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts +6 -0
- package/dist/oauth/providers/microsoft-entra-id.provider.d.ts.map +1 -1
- package/dist/oauth/providers/microsoft-entra-id.provider.js +30 -4
- package/dist/oauth/providers/microsoft-entra-id.provider.js.map +1 -1
- package/dist/pdf/document/charts/chart-bar.d.ts +24 -0
- package/dist/pdf/document/charts/chart-bar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-bar.js +117 -0
- package/dist/pdf/document/charts/chart-bar.js.map +1 -0
- package/dist/pdf/document/charts/chart-donut.d.ts +16 -0
- package/dist/pdf/document/charts/chart-donut.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-donut.js +89 -0
- package/dist/pdf/document/charts/chart-donut.js.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts +15 -0
- package/dist/pdf/document/charts/chart-gauge.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-gauge.js +60 -0
- package/dist/pdf/document/charts/chart-gauge.js.map +1 -0
- package/dist/pdf/document/charts/chart-line.d.ts +29 -0
- package/dist/pdf/document/charts/chart-line.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-line.js +89 -0
- package/dist/pdf/document/charts/chart-line.js.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts +64 -0
- package/dist/pdf/document/charts/chart-primitives.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-primitives.js +110 -0
- package/dist/pdf/document/charts/chart-primitives.js.map +1 -0
- package/dist/pdf/document/charts/chart-radar.d.ts +13 -0
- package/dist/pdf/document/charts/chart-radar.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-radar.js +83 -0
- package/dist/pdf/document/charts/chart-radar.js.map +1 -0
- package/dist/pdf/document/charts/chart-scale.d.ts +39 -0
- package/dist/pdf/document/charts/chart-scale.d.ts.map +1 -0
- package/dist/pdf/document/charts/chart-scale.js +118 -0
- package/dist/pdf/document/charts/chart-scale.js.map +1 -0
- package/dist/pdf/document/charts/index.d.ts +8 -0
- package/dist/pdf/document/charts/index.d.ts.map +1 -0
- package/dist/pdf/document/charts/index.js +24 -0
- package/dist/pdf/document/charts/index.js.map +1 -0
- package/dist/pdf/document/index.d.ts +8 -0
- package/dist/pdf/document/index.d.ts.map +1 -0
- package/dist/pdf/document/index.js +24 -0
- package/dist/pdf/document/index.js.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts +20 -0
- package/dist/pdf/document/pdf-document.chrome.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.chrome.js +36 -0
- package/dist/pdf/document/pdf-document.chrome.js.map +1 -0
- package/dist/pdf/document/pdf-document.css.d.ts +20 -0
- package/dist/pdf/document/pdf-document.css.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.css.js +327 -0
- package/dist/pdf/document/pdf-document.css.js.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts +10 -0
- package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.renderer.js +226 -0
- package/dist/pdf/document/pdf-document.renderer.js.map +1 -0
- package/dist/pdf/document/pdf-document.service.d.ts +27 -0
- package/dist/pdf/document/pdf-document.service.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.service.js +81 -0
- package/dist/pdf/document/pdf-document.service.js.map +1 -0
- package/dist/pdf/document/pdf-document.theme.d.ts +41 -0
- package/dist/pdf/document/pdf-document.theme.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.theme.js +105 -0
- package/dist/pdf/document/pdf-document.theme.js.map +1 -0
- package/dist/pdf/document/pdf-document.types.d.ts +164 -0
- package/dist/pdf/document/pdf-document.types.d.ts.map +1 -0
- package/dist/pdf/document/pdf-document.types.js +18 -0
- package/dist/pdf/document/pdf-document.types.js.map +1 -0
- package/dist/pdf/pdf.module.d.ts.map +1 -1
- package/dist/pdf/pdf.module.js +3 -2
- package/dist/pdf/pdf.module.js.map +1 -1
- package/dist/pdf/pdf.service.d.ts +75 -1
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +167 -63
- package/dist/pdf/pdf.service.js.map +1 -1
- package/dist/pdf/templates/commercial-proposal.template.d.ts +96 -0
- package/dist/pdf/templates/commercial-proposal.template.d.ts.map +1 -0
- package/dist/pdf/templates/commercial-proposal.template.js +276 -0
- package/dist/pdf/templates/commercial-proposal.template.js.map +1 -0
- package/dist/setting/favicon.controller.d.ts +26 -0
- package/dist/setting/favicon.controller.d.ts.map +1 -0
- package/dist/setting/favicon.controller.js +130 -0
- package/dist/setting/favicon.controller.js.map +1 -0
- package/dist/setting/setting.module.d.ts.map +1 -1
- package/dist/setting/setting.module.js +2 -1
- package/dist/setting/setting.module.js.map +1 -1
- package/dist/setting/setting.service.d.ts.map +1 -1
- package/dist/setting/setting.service.js +3 -0
- package/dist/setting/setting.service.js.map +1 -1
- package/dist/task/task.service.d.ts +6 -0
- package/dist/task/task.service.d.ts.map +1 -1
- package/dist/task/task.service.js +44 -13
- package/dist/task/task.service.js.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +35 -2
- package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +107 -22
- package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
- package/hedhog/data/integration_type.yaml +6 -0
- package/hedhog/data/route.yaml +8 -0
- package/hedhog/data/setting_group.yaml +52 -0
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +85 -2
- package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +576 -491
- package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +29 -50
- package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +146 -50
- package/hedhog/frontend/messages/en.json +81 -2
- package/hedhog/frontend/messages/pt.json +81 -2
- package/hedhog/table/file.yaml +3 -1
- package/package.json +5 -5
- package/src/access-log/access-log.interceptor.spec.ts +50 -0
- package/src/access-log/access-log.interceptor.ts +18 -0
- package/src/ai/ai-attachment.fragments.spec.ts +56 -3
- package/src/ai/ai.service.responses.spec.ts +429 -0
- package/src/ai/ai.service.ts +409 -27
- package/src/ai-instruction/ai-prompt-resolver.service.spec.ts +44 -0
- package/src/ai-instruction/ai-prompt-resolver.service.ts +29 -0
- package/src/core.module.ts +3 -0
- package/src/document-kit/document-kit.module.ts +12 -0
- package/src/document-kit/document-kit.registry.ts +125 -0
- package/src/document-kit/document-kit.service.spec.ts +156 -0
- package/src/document-kit/document-kit.service.ts +173 -0
- package/src/file/file-direct-upload.spec.ts +344 -0
- package/src/file/file.service.spec.ts +168 -1
- package/src/file/file.service.ts +435 -36
- package/src/file/mcp-file-source.schema.ts +8 -5
- package/src/file/provider/abstract.provider.ts +57 -0
- package/src/file/provider/s3-multipart.spec.ts +123 -0
- package/src/file/provider/s3-multipart.util.ts +126 -0
- package/src/file/provider/s3.provider.ts +65 -1
- package/src/file/provider/spaces.provider.ts +67 -1
- package/src/index.ts +5 -0
- package/src/integration-profile/integration-profile.secrets.ts +26 -0
- package/src/integration-profile/integration-profile.service.ts +1 -0
- package/src/integration-profile/testers/ai.testers.ts +70 -5
- package/src/integration-profile/testers/http-probe.ts +5 -3
- package/src/integration-profile/testers/integration-tester.types.ts +5 -0
- package/src/integration-profile/testers/oauth.testers.spec.ts +13 -0
- package/src/integration-profile/testers/remaining.testers.spec.ts +65 -1
- package/src/integration-profile/testers/tester-coverage.spec.ts +12 -0
- package/src/mail/mail.service.spec.ts +25 -0
- package/src/mail/mail.service.ts +18 -1
- package/src/mcp/mcp-server.service.spec.ts +16 -0
- package/src/mcp/mcp-server.service.ts +10 -1
- package/src/mcp/mcp.module.ts +2 -0
- package/src/mcp/tools/core-access-log.mcp-tools.ts +66 -0
- package/src/mcp/tools/core-files.mcp-tools.ts +4 -4
- package/src/meeting/meeting-provider.registry.ts +80 -0
- package/src/oauth/oauth-token-broker.service.spec.ts +108 -0
- package/src/oauth/oauth-token-broker.service.ts +129 -2
- package/src/oauth/providers/microsoft-entra-id.provider.spec.ts +133 -0
- package/src/oauth/providers/microsoft-entra-id.provider.ts +29 -2
- package/src/pdf/document/charts/chart-bar.ts +217 -0
- package/src/pdf/document/charts/chart-donut.ts +163 -0
- package/src/pdf/document/charts/chart-gauge.ts +94 -0
- package/src/pdf/document/charts/chart-line.ts +159 -0
- package/src/pdf/document/charts/chart-primitives.ts +188 -0
- package/src/pdf/document/charts/chart-radar.ts +136 -0
- package/src/pdf/document/charts/chart-scale.spec.ts +93 -0
- package/src/pdf/document/charts/chart-scale.ts +141 -0
- package/src/pdf/document/charts/charts.spec.ts +157 -0
- package/src/pdf/document/charts/index.ts +7 -0
- package/src/pdf/document/index.ts +7 -0
- package/src/pdf/document/pdf-document.chrome.ts +38 -0
- package/src/pdf/document/pdf-document.css.ts +326 -0
- package/src/pdf/document/pdf-document.renderer.spec.ts +172 -0
- package/src/pdf/document/pdf-document.renderer.ts +317 -0
- package/src/pdf/document/pdf-document.service.ts +77 -0
- package/src/pdf/document/pdf-document.theme.ts +146 -0
- package/src/pdf/document/pdf-document.types.ts +149 -0
- package/src/pdf/pdf.module.ts +3 -2
- package/src/pdf/pdf.service.spec.ts +131 -0
- package/src/pdf/pdf.service.ts +256 -82
- package/src/pdf/templates/commercial-proposal.template.spec.ts +177 -0
- package/src/pdf/templates/commercial-proposal.template.ts +400 -0
- package/src/setting/favicon.controller.spec.ts +92 -0
- package/src/setting/favicon.controller.ts +135 -0
- package/src/setting/setting.module.ts +2 -1
- package/src/setting/setting.service.ts +3 -0
- package/src/task/task.service.spec.ts +77 -1
- package/src/task/task.service.ts +58 -14
- package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +263 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +154 -16
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.PdfDocumentService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const brand_asset_service_1 = require("../../setting/brand-asset.service");
|
|
18
|
+
const setting_service_1 = require("../../setting/setting.service");
|
|
19
|
+
const pdf_service_1 = require("../pdf.service");
|
|
20
|
+
const pdf_document_chrome_1 = require("./pdf-document.chrome");
|
|
21
|
+
const pdf_document_renderer_1 = require("./pdf-document.renderer");
|
|
22
|
+
const pdf_document_theme_1 = require("./pdf-document.theme");
|
|
23
|
+
/**
|
|
24
|
+
* Gera o documento PDF padrão do sistema: letterhead com logo, cards, tabelas,
|
|
25
|
+
* gráficos, barra de destaque no topo de toda página e paginação "X / N".
|
|
26
|
+
*
|
|
27
|
+
* Quem chama entrega blocos de dados ({@link PdfDocumentInput}); o HTML e o
|
|
28
|
+
* Chromium são responsabilidade daqui.
|
|
29
|
+
*/
|
|
30
|
+
let PdfDocumentService = class PdfDocumentService {
|
|
31
|
+
constructor(pdf, settingService, brandAsset) {
|
|
32
|
+
this.pdf = pdf;
|
|
33
|
+
this.settingService = settingService;
|
|
34
|
+
this.brandAsset = brandAsset;
|
|
35
|
+
}
|
|
36
|
+
loadTheme(overrides) {
|
|
37
|
+
return (0, pdf_document_theme_1.resolveDocumentTheme)(this.settingService, this.brandAsset, overrides);
|
|
38
|
+
}
|
|
39
|
+
/** HTML puro, sem Chromium — serve aos testes e a quem quiser inspecionar. */
|
|
40
|
+
async buildHtml(input, theme) {
|
|
41
|
+
return (0, pdf_document_renderer_1.renderDocumentHtml)(input, theme !== null && theme !== void 0 ? theme : (await this.loadTheme()));
|
|
42
|
+
}
|
|
43
|
+
async render(input, options = {}) {
|
|
44
|
+
var _a, _b, _c, _d, _e, _f;
|
|
45
|
+
const theme = (_a = options.theme) !== null && _a !== void 0 ? _a : (await this.loadTheme());
|
|
46
|
+
const html = (0, pdf_document_renderer_1.renderDocumentHtml)(input, theme);
|
|
47
|
+
const generatedAt = (_b = input.generatedAt) !== null && _b !== void 0 ? _b : new Date();
|
|
48
|
+
const footerLeft = [
|
|
49
|
+
(_c = input.footerLeft) !== null && _c !== void 0 ? _c : 'Documento Confidencial',
|
|
50
|
+
`Gerado em ${new Intl.DateTimeFormat((_d = input.locale) !== null && _d !== void 0 ? _d : 'pt-BR').format(generatedAt)}`,
|
|
51
|
+
theme.companyName,
|
|
52
|
+
]
|
|
53
|
+
.filter(Boolean)
|
|
54
|
+
.join(' · ');
|
|
55
|
+
return this.pdf.generatePdfFromHtml(html, {
|
|
56
|
+
format: 'A4',
|
|
57
|
+
landscape: (_e = input.landscape) !== null && _e !== void 0 ? _e : false,
|
|
58
|
+
printBackground: true,
|
|
59
|
+
margin: pdf_document_chrome_1.PDF_DOCUMENT_MARGIN,
|
|
60
|
+
displayHeaderFooter: true,
|
|
61
|
+
headerTemplate: (0, pdf_document_chrome_1.buildAccentHeaderTemplate)(theme),
|
|
62
|
+
footerTemplate: (0, pdf_document_chrome_1.buildFooterTemplate)(theme, footerLeft),
|
|
63
|
+
// O logo já vem embutido como data URI e não há fonte web: esperar por
|
|
64
|
+
// rede ociosa só adicionaria o timeout do `networkidle` ao render.
|
|
65
|
+
waitUntil: 'load',
|
|
66
|
+
timeoutMs: (_f = options.timeoutMs) !== null && _f !== void 0 ? _f : 60000,
|
|
67
|
+
label: options.label,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
exports.PdfDocumentService = PdfDocumentService;
|
|
72
|
+
exports.PdfDocumentService = PdfDocumentService = __decorate([
|
|
73
|
+
(0, common_1.Injectable)(),
|
|
74
|
+
__param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => pdf_service_1.PdfService))),
|
|
75
|
+
__param(1, (0, common_1.Inject)((0, common_1.forwardRef)(() => setting_service_1.SettingService))),
|
|
76
|
+
__param(2, (0, common_1.Inject)((0, common_1.forwardRef)(() => brand_asset_service_1.BrandAssetService))),
|
|
77
|
+
__metadata("design:paramtypes", [pdf_service_1.PdfService,
|
|
78
|
+
setting_service_1.SettingService,
|
|
79
|
+
brand_asset_service_1.BrandAssetService])
|
|
80
|
+
], PdfDocumentService);
|
|
81
|
+
//# sourceMappingURL=pdf-document.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.service.js","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAgE;AAEhE,2EAAsE;AACtE,mEAA+D;AAC/D,gDAA4C;AAC5C,+DAI+B;AAC/B,mEAA6D;AAC7D,6DAI8B;AAG9B;;;;;;GAMG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,YAEmB,GAAe,EAEf,cAA8B,EAE9B,UAA6B;QAJ7B,QAAG,GAAH,GAAG,CAAY;QAEf,mBAAc,GAAd,cAAc,CAAgB;QAE9B,eAAU,GAAV,UAAU,CAAmB;IAC7C,CAAC;IAEJ,SAAS,CAAC,SAAqC;QAC7C,OAAO,IAAA,yCAAoB,EAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC/E,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,SAAS,CAAC,KAAuB,EAAE,KAAwB;QAC/D,OAAO,IAAA,0CAAkB,EAAC,KAAK,EAAE,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAuB,EACvB,UAA4E,EAAE;;QAE9E,MAAM,KAAK,GAAG,MAAA,OAAO,CAAC,KAAK,mCAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAA,0CAAkB,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAE9C,MAAM,WAAW,GAAG,MAAA,KAAK,CAAC,WAAW,mCAAI,IAAI,IAAI,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG;YACjB,MAAA,KAAK,CAAC,UAAU,mCAAI,wBAAwB;YAC5C,aAAa,IAAI,IAAI,CAAC,cAAc,CAAC,MAAA,KAAK,CAAC,MAAM,mCAAI,OAAO,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;YACnF,KAAK,CAAC,WAAW;SAClB;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,KAAK,CAAC,CAAC;QAEf,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE;YACxC,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,MAAA,KAAK,CAAC,SAAS,mCAAI,KAAK;YACnC,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,yCAAmB;YAC3B,mBAAmB,EAAE,IAAI;YACzB,cAAc,EAAE,IAAA,+CAAyB,EAAC,KAAK,CAAC;YAChD,cAAc,EAAE,IAAA,yCAAmB,EAAC,KAAK,EAAE,UAAU,CAAC;YACtD,uEAAuE;YACvE,mEAAmE;YACnE,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,MAAA,OAAO,CAAC,SAAS,mCAAI,KAAM;YACtC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAlDY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC,CAAC,CAAA;IAEpC,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,gCAAc,CAAC,CAAC,CAAA;IAExC,WAAA,IAAA,eAAM,EAAC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,uCAAiB,CAAC,CAAC,CAAA;qCAHtB,wBAAU;QAEC,gCAAc;QAElB,uCAAiB;GAPrC,kBAAkB,CAkD9B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { BrandAssetService } from '../../setting/brand-asset.service';
|
|
2
|
+
import { SettingService } from '../../setting/setting.service';
|
|
3
|
+
/**
|
|
4
|
+
* Tokens do documento padrão. São as mesmas settings que a proposta comercial
|
|
5
|
+
* do CRM lê, para que os dois PDFs saiam com a mesma identidade sem um copiar
|
|
6
|
+
* as cores do outro na mão.
|
|
7
|
+
*/
|
|
8
|
+
export interface PdfDocumentTheme {
|
|
9
|
+
primary: string;
|
|
10
|
+
/** Fundo suave dos cards e do cabeçalho da tabela. */
|
|
11
|
+
mutedBg: string;
|
|
12
|
+
/** Texto secundário: rótulos, legendas, rodapé. */
|
|
13
|
+
mutedFg: string;
|
|
14
|
+
/** Texto principal. */
|
|
15
|
+
ink: string;
|
|
16
|
+
/** Bordas. */
|
|
17
|
+
line: string;
|
|
18
|
+
companyName: string;
|
|
19
|
+
/** Data URI ou URL absoluta do logo do sistema. */
|
|
20
|
+
logoUrl: string;
|
|
21
|
+
fontFamily: string;
|
|
22
|
+
/** Cores categóricas dos gráficos, com a primária na frente. */
|
|
23
|
+
chartPalette: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Nenhuma fonte web: o container da API só tem `ttf-freefont`, e um `<link>`
|
|
27
|
+
* para o Google Fonts com `waitUntil: 'networkidle'` vira espera até o timeout
|
|
28
|
+
* quando o pod não tem saída para a internet.
|
|
29
|
+
*/
|
|
30
|
+
export declare const PDF_DOCUMENT_FONT = "Arial, Helvetica, sans-serif";
|
|
31
|
+
export interface PdfDocumentThemeOverrides {
|
|
32
|
+
companyName?: string;
|
|
33
|
+
primary?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Lê as settings de marca. Qualquer falha cai nos valores de fábrica — um
|
|
37
|
+
* relatório sem cor certa ainda é um relatório; um relatório que não sai não é.
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveDocumentTheme(settingService: SettingService, brandAsset: BrandAssetService, overrides?: PdfDocumentThemeOverrides): Promise<PdfDocumentTheme>;
|
|
40
|
+
export declare function inlineWordmark(primary: string): string;
|
|
41
|
+
//# sourceMappingURL=pdf-document.theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.theme.d.ts","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,gEAAgE;IAChE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAWD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,iCAAiC,CAAC;AAoBhE,MAAM,WAAW,yBAAyB;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,iBAAiB,EAC7B,SAAS,GAAE,yBAA8B,GACxC,OAAO,CAAC,gBAAgB,CAAC,CA8B3B;AA8BD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYtD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PDF_DOCUMENT_FONT = void 0;
|
|
4
|
+
exports.resolveDocumentTheme = resolveDocumentTheme;
|
|
5
|
+
exports.inlineWordmark = inlineWordmark;
|
|
6
|
+
const FALLBACK = {
|
|
7
|
+
primary: '#ff760c',
|
|
8
|
+
mutedBg: '#f4f4f5',
|
|
9
|
+
mutedFg: '#71717a',
|
|
10
|
+
ink: '#18181b',
|
|
11
|
+
line: '#e4e4e7',
|
|
12
|
+
companyName: 'HedHog',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Nenhuma fonte web: o container da API só tem `ttf-freefont`, e um `<link>`
|
|
16
|
+
* para o Google Fonts com `waitUntil: 'networkidle'` vira espera até o timeout
|
|
17
|
+
* quando o pod não tem saída para a internet.
|
|
18
|
+
*/
|
|
19
|
+
exports.PDF_DOCUMENT_FONT = 'Arial, Helvetica, sans-serif';
|
|
20
|
+
/** Paleta print-safe: sem amarelo puro nem cinza claro, que somem no papel. */
|
|
21
|
+
const CATEGORICAL = [
|
|
22
|
+
'#2563eb',
|
|
23
|
+
'#16a34a',
|
|
24
|
+
'#9333ea',
|
|
25
|
+
'#dc2626',
|
|
26
|
+
'#0891b2',
|
|
27
|
+
'#b45309',
|
|
28
|
+
'#4f46e5',
|
|
29
|
+
'#475569',
|
|
30
|
+
];
|
|
31
|
+
const text = (value) => {
|
|
32
|
+
if (typeof value !== 'string')
|
|
33
|
+
return null;
|
|
34
|
+
const trimmed = value.trim();
|
|
35
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Lê as settings de marca. Qualquer falha cai nos valores de fábrica — um
|
|
39
|
+
* relatório sem cor certa ainda é um relatório; um relatório que não sai não é.
|
|
40
|
+
*/
|
|
41
|
+
async function resolveDocumentTheme(settingService, brandAsset, overrides = {}) {
|
|
42
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
43
|
+
let values = {};
|
|
44
|
+
try {
|
|
45
|
+
values = await settingService.getSettingValues([
|
|
46
|
+
'theme-primary-light',
|
|
47
|
+
'theme-muted-light',
|
|
48
|
+
'theme-muted-foreground-light',
|
|
49
|
+
'theme-secondary-foreground-light',
|
|
50
|
+
'system-name',
|
|
51
|
+
'image-url',
|
|
52
|
+
'icon-url',
|
|
53
|
+
]);
|
|
54
|
+
}
|
|
55
|
+
catch (_h) {
|
|
56
|
+
values = {};
|
|
57
|
+
}
|
|
58
|
+
const primary = (_b = (_a = overrides.primary) !== null && _a !== void 0 ? _a : text(values['theme-primary-light'])) !== null && _b !== void 0 ? _b : FALLBACK.primary;
|
|
59
|
+
return {
|
|
60
|
+
primary,
|
|
61
|
+
mutedBg: (_c = text(values['theme-muted-light'])) !== null && _c !== void 0 ? _c : FALLBACK.mutedBg,
|
|
62
|
+
mutedFg: (_d = text(values['theme-muted-foreground-light'])) !== null && _d !== void 0 ? _d : FALLBACK.mutedFg,
|
|
63
|
+
ink: (_e = text(values['theme-secondary-foreground-light'])) !== null && _e !== void 0 ? _e : FALLBACK.ink,
|
|
64
|
+
line: FALLBACK.line,
|
|
65
|
+
companyName: (_g = (_f = overrides.companyName) !== null && _f !== void 0 ? _f : text(values['system-name'])) !== null && _g !== void 0 ? _g : FALLBACK.companyName,
|
|
66
|
+
logoUrl: await resolveSystemLogo(brandAsset, values, primary),
|
|
67
|
+
fontFamily: exports.PDF_DOCUMENT_FONT,
|
|
68
|
+
chartPalette: [primary, ...CATEGORICAL],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* O Chromium renderiza sem sessão e, dentro do cluster, pode não ter rota para
|
|
73
|
+
* o host público — por isso a imagem é baixada e embutida como data URI, com a
|
|
74
|
+
* URL absoluta como segundo recurso e um wordmark inline como último.
|
|
75
|
+
*/
|
|
76
|
+
async function resolveSystemLogo(brandAsset, values, primary) {
|
|
77
|
+
var _a;
|
|
78
|
+
const configured = (_a = text(values['image-url'])) !== null && _a !== void 0 ? _a : text(values['icon-url']);
|
|
79
|
+
if (configured) {
|
|
80
|
+
try {
|
|
81
|
+
const absolute = await brandAsset.resolveAssetUrl(configured);
|
|
82
|
+
if (absolute) {
|
|
83
|
+
const dataUri = await brandAsset.fetchAsDataUri(absolute);
|
|
84
|
+
if (dataUri)
|
|
85
|
+
return dataUri;
|
|
86
|
+
return absolute;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (_b) {
|
|
90
|
+
// Cai no wordmark abaixo.
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return inlineWordmark(primary);
|
|
94
|
+
}
|
|
95
|
+
function inlineWordmark(primary) {
|
|
96
|
+
const svg = encodeURIComponent([
|
|
97
|
+
'<svg xmlns="http://www.w3.org/2000/svg" width="240" height="72" viewBox="0 0 240 72">',
|
|
98
|
+
'<rect width="240" height="72" rx="18" fill="#0f172a"/>',
|
|
99
|
+
`<circle cx="38" cy="36" r="18" fill="${primary}"/>`,
|
|
100
|
+
'<text x="72" y="43" fill="#ffffff" font-size="26" font-family="Arial, sans-serif" font-weight="700">HedHog</text>',
|
|
101
|
+
'</svg>',
|
|
102
|
+
].join(''));
|
|
103
|
+
return `data:image/svg+xml;charset=UTF-8,${svg}`;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=pdf-document.theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.theme.js","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.theme.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modelo de um documento PDF padrão: o chamador descreve **dados**, nunca HTML.
|
|
3
|
+
*
|
|
4
|
+
* É o que sustenta a regra de escape do renderer — se um serviço pudesse passar
|
|
5
|
+
* markup, o nome de um aluno com `<` viraria tag dentro de um Chromium headless.
|
|
6
|
+
* A única exceção é o SVG dos gráficos, que carrega o tipo {@link SafeSvg} e só
|
|
7
|
+
* pode ser produzido pelos desenhistas do próprio kit.
|
|
8
|
+
*/
|
|
9
|
+
/** SVG montado pelos helpers de gráfico do kit — a única string injetada sem escape. */
|
|
10
|
+
export type SafeSvg = string & {
|
|
11
|
+
readonly __safeSvg: unique symbol;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Marca um SVG como seguro. Só os desenhistas de `./charts` devem chamar isto:
|
|
15
|
+
* quem passar conteúdo de usuário aqui reabre a porta que o modelo de blocos fecha.
|
|
16
|
+
*/
|
|
17
|
+
export declare const asSafeSvg: (svg: string) => SafeSvg;
|
|
18
|
+
export interface PdfDocumentMeta {
|
|
19
|
+
label: string;
|
|
20
|
+
value: string;
|
|
21
|
+
}
|
|
22
|
+
export interface PdfDocumentCard {
|
|
23
|
+
label: string;
|
|
24
|
+
value: string;
|
|
25
|
+
/** Linha pequena abaixo do valor, para a unidade ou a ressalva. */
|
|
26
|
+
hint?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface PdfDocumentTableColumn {
|
|
29
|
+
header: string;
|
|
30
|
+
align?: 'left' | 'center' | 'right';
|
|
31
|
+
/**
|
|
32
|
+
* Largura CSS (ex.: '18%'). Sem ela o Chromium reparte pelo conteúdo e a
|
|
33
|
+
* tabela muda de forma a cada página.
|
|
34
|
+
*/
|
|
35
|
+
width?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface PdfDocumentTableCell {
|
|
38
|
+
text: string;
|
|
39
|
+
/** Segunda linha menor: o e-mail sob o nome, o "Em risco" sob o status. */
|
|
40
|
+
sub?: string;
|
|
41
|
+
tone?: 'default' | 'muted' | 'bold' | 'accent' | 'warn';
|
|
42
|
+
}
|
|
43
|
+
export type PdfDocumentRow = Array<string | number | null | undefined | PdfDocumentTableCell>;
|
|
44
|
+
/**
|
|
45
|
+
* Paleta fechada das barras e marcadores — o chamador escolhe o papel, o tema
|
|
46
|
+
* decide a cor: 'ink' (feito), 'muted' e 'light' (dois cinzas), 'accent' (cor
|
|
47
|
+
* da marca) e 'danger' (atraso).
|
|
48
|
+
*/
|
|
49
|
+
export type PdfDocumentSegmentTone = 'ink' | 'muted' | 'light' | 'accent' | 'danger';
|
|
50
|
+
export interface PdfDocumentSegment {
|
|
51
|
+
value: number;
|
|
52
|
+
tone: PdfDocumentSegmentTone;
|
|
53
|
+
/** Só a barra avulsa (`segmentBar`) mostra rótulo, na legenda abaixo dela. */
|
|
54
|
+
label?: string;
|
|
55
|
+
}
|
|
56
|
+
export interface PdfDocumentProgressEntry {
|
|
57
|
+
text: string;
|
|
58
|
+
/** Linha pequena com marcador da cor de `tone` (ex.: "Em revisão"). */
|
|
59
|
+
status: string;
|
|
60
|
+
tone: PdfDocumentSegmentTone;
|
|
61
|
+
/** Texto à direita da linha de status (ex.: "há 3d 4h"). */
|
|
62
|
+
aside?: string;
|
|
63
|
+
/** Terceira linha opcional (ex.: o prazo). */
|
|
64
|
+
sub?: string;
|
|
65
|
+
subTone?: 'muted' | 'danger';
|
|
66
|
+
/** Fundo tingido com a cor do `tone` — o item que pede atenção. */
|
|
67
|
+
highlight?: boolean;
|
|
68
|
+
}
|
|
69
|
+
export interface PdfDocumentProgressCard {
|
|
70
|
+
title: string;
|
|
71
|
+
subtitle?: string;
|
|
72
|
+
/** O número grande à direita (ex.: "33%"). */
|
|
73
|
+
value: string;
|
|
74
|
+
valueHint?: string;
|
|
75
|
+
segments: PdfDocumentSegment[];
|
|
76
|
+
listTitle?: string;
|
|
77
|
+
entries: PdfDocumentProgressEntry[];
|
|
78
|
+
/** Mostrado no lugar da lista quando `entries` vem vazio. */
|
|
79
|
+
emptyText?: string;
|
|
80
|
+
}
|
|
81
|
+
export type PdfDocumentBlock = {
|
|
82
|
+
kind: 'section';
|
|
83
|
+
title: string;
|
|
84
|
+
hint?: string;
|
|
85
|
+
} | {
|
|
86
|
+
kind: 'cards';
|
|
87
|
+
items: PdfDocumentCard[];
|
|
88
|
+
/** Padrão: 4. */
|
|
89
|
+
columns?: 2 | 3 | 4 | 5;
|
|
90
|
+
/** 'metric' destaca o valor (indicador); 'filter' é o carimbo do recorte. */
|
|
91
|
+
variant?: 'metric' | 'filter';
|
|
92
|
+
} | {
|
|
93
|
+
kind: 'table';
|
|
94
|
+
columns: PdfDocumentTableColumn[];
|
|
95
|
+
rows: PdfDocumentRow[];
|
|
96
|
+
/** Coluna "#" à esquerda, 1..N contínua entre páginas. */
|
|
97
|
+
numbered?: boolean;
|
|
98
|
+
numberHeader?: string;
|
|
99
|
+
zebra?: boolean;
|
|
100
|
+
/** Fonte menor, para tabela com muitas colunas. */
|
|
101
|
+
compact?: boolean;
|
|
102
|
+
emptyText?: string;
|
|
103
|
+
/** Aviso de corte quando a origem truncou as linhas. */
|
|
104
|
+
truncatedNote?: string;
|
|
105
|
+
} | {
|
|
106
|
+
kind: 'chart';
|
|
107
|
+
title?: string;
|
|
108
|
+
svg: SafeSvg;
|
|
109
|
+
caption?: string;
|
|
110
|
+
} | {
|
|
111
|
+
kind: 'chartGrid';
|
|
112
|
+
items: Array<{
|
|
113
|
+
title?: string;
|
|
114
|
+
svg: SafeSvg;
|
|
115
|
+
caption?: string;
|
|
116
|
+
}>;
|
|
117
|
+
}
|
|
118
|
+
/** Barra empilhada com legenda "rótulo N (x%)" — a composição de um total. */
|
|
119
|
+
| {
|
|
120
|
+
kind: 'segmentBar';
|
|
121
|
+
title?: string;
|
|
122
|
+
segments: PdfDocumentSegment[];
|
|
123
|
+
caption?: string;
|
|
124
|
+
}
|
|
125
|
+
/** Grade de cartões com %, barra e lista de itens — um por pessoa, por exemplo. */
|
|
126
|
+
| {
|
|
127
|
+
kind: 'progressCards';
|
|
128
|
+
items: PdfDocumentProgressCard[];
|
|
129
|
+
/** Legenda dos marcadores, acima da grade. */
|
|
130
|
+
legend?: Array<{
|
|
131
|
+
label: string;
|
|
132
|
+
tone: PdfDocumentSegmentTone;
|
|
133
|
+
}>;
|
|
134
|
+
/** Padrão: 2. */
|
|
135
|
+
columns?: 1 | 2;
|
|
136
|
+
} | {
|
|
137
|
+
kind: 'note';
|
|
138
|
+
text: string;
|
|
139
|
+
tone?: 'muted' | 'accent';
|
|
140
|
+
} | {
|
|
141
|
+
kind: 'legend';
|
|
142
|
+
lines: string[];
|
|
143
|
+
} | {
|
|
144
|
+
kind: 'pageBreak';
|
|
145
|
+
};
|
|
146
|
+
export interface PdfDocumentInput {
|
|
147
|
+
/** O `h1` do letterhead. */
|
|
148
|
+
title: string;
|
|
149
|
+
/** Sobretítulo laranja, em caixa alta (ex.: "Relatório de Alunos"). */
|
|
150
|
+
eyebrow?: string;
|
|
151
|
+
/** Linha cinza abaixo do título — normalmente o nome da empresa. */
|
|
152
|
+
subtitle?: string;
|
|
153
|
+
/** Bloco alinhado à direita do letterhead. */
|
|
154
|
+
meta?: PdfDocumentMeta[];
|
|
155
|
+
blocks: PdfDocumentBlock[];
|
|
156
|
+
/** Data URI do logo; sem ele o kit usa o logo do sistema. */
|
|
157
|
+
logoDataUri?: string | null;
|
|
158
|
+
generatedAt?: Date;
|
|
159
|
+
locale?: string;
|
|
160
|
+
landscape?: boolean;
|
|
161
|
+
/** Padrão: 'Documento Confidencial'. */
|
|
162
|
+
footerLeft?: string;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=pdf-document.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.types.d.ts","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Modelo de um documento PDF padrão: o chamador descreve **dados**, nunca HTML.
|
|
4
|
+
*
|
|
5
|
+
* É o que sustenta a regra de escape do renderer — se um serviço pudesse passar
|
|
6
|
+
* markup, o nome de um aluno com `<` viraria tag dentro de um Chromium headless.
|
|
7
|
+
* A única exceção é o SVG dos gráficos, que carrega o tipo {@link SafeSvg} e só
|
|
8
|
+
* pode ser produzido pelos desenhistas do próprio kit.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.asSafeSvg = void 0;
|
|
12
|
+
/**
|
|
13
|
+
* Marca um SVG como seguro. Só os desenhistas de `./charts` devem chamar isto:
|
|
14
|
+
* quem passar conteúdo de usuário aqui reabre a porta que o modelo de blocos fecha.
|
|
15
|
+
*/
|
|
16
|
+
const asSafeSvg = (svg) => svg;
|
|
17
|
+
exports.asSafeSvg = asSafeSvg;
|
|
18
|
+
//# sourceMappingURL=pdf-document.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.types.js","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.types.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAKH;;;GAGG;AACI,MAAM,SAAS,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,GAAc,CAAC;AAArD,QAAA,SAAS,aAA4C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf.module.d.ts","sourceRoot":"","sources":["../../src/pdf/pdf.module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pdf.module.d.ts","sourceRoot":"","sources":["../../src/pdf/pdf.module.ts"],"names":[],"mappings":"AAQA,qBASa,SAAS;CAAG"}
|
package/dist/pdf/pdf.module.js
CHANGED
|
@@ -10,6 +10,7 @@ exports.PdfModule = void 0;
|
|
|
10
10
|
const common_1 = require("@nestjs/common");
|
|
11
11
|
const config_1 = require("@nestjs/config");
|
|
12
12
|
const setting_module_1 = require("../setting/setting.module");
|
|
13
|
+
const pdf_document_service_1 = require("./document/pdf-document.service");
|
|
13
14
|
const pdf_controller_1 = require("./pdf.controller");
|
|
14
15
|
const pdf_service_1 = require("./pdf.service");
|
|
15
16
|
let PdfModule = class PdfModule {
|
|
@@ -21,8 +22,8 @@ exports.PdfModule = PdfModule = __decorate([
|
|
|
21
22
|
config_1.ConfigModule,
|
|
22
23
|
(0, common_1.forwardRef)(() => setting_module_1.SettingModule),
|
|
23
24
|
],
|
|
24
|
-
providers: [pdf_service_1.PdfService],
|
|
25
|
-
exports: [pdf_service_1.PdfService],
|
|
25
|
+
providers: [pdf_service_1.PdfService, pdf_document_service_1.PdfDocumentService],
|
|
26
|
+
exports: [pdf_service_1.PdfService, pdf_document_service_1.PdfDocumentService],
|
|
26
27
|
controllers: [pdf_controller_1.PdfController],
|
|
27
28
|
})
|
|
28
29
|
], PdfModule);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf.module.js","sourceRoot":"","sources":["../../src/pdf/pdf.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAoD;AACpD,2CAA8C;AAE9C,8DAA0D;AAC1D,qDAAiD;AACjD,+CAA2C;AAWpC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IATrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAY;YACZ,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,8BAAa,CAAC;SAChC;QACD,SAAS,EAAE,CAAC,wBAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"pdf.module.js","sourceRoot":"","sources":["../../src/pdf/pdf.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAoD;AACpD,2CAA8C;AAE9C,8DAA0D;AAC1D,0EAAqE;AACrE,qDAAiD;AACjD,+CAA2C;AAWpC,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IATrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,qBAAY;YACZ,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,8BAAa,CAAC;SAChC;QACD,SAAS,EAAE,CAAC,wBAAU,EAAE,yCAAkB,CAAC;QAC3C,OAAO,EAAE,CAAC,wBAAU,EAAE,yCAAkB,CAAC;QACzC,WAAW,EAAE,CAAC,8BAAa,CAAC;KAC7B,CAAC;GACW,SAAS,CAAG"}
|
|
@@ -2,6 +2,7 @@ import { ConfigService } from '@nestjs/config';
|
|
|
2
2
|
import { BrandAssetService } from '../setting/brand-asset.service';
|
|
3
3
|
import { SettingService } from '../setting/setting.service';
|
|
4
4
|
import { PdfAreaType, PdfThemeConfig } from './interfaces/pdf-theme-config.interface';
|
|
5
|
+
import { CommercialDocumentTheme, CommercialProposalData } from './templates/commercial-proposal.template';
|
|
5
6
|
export interface PdfGenerateOptions {
|
|
6
7
|
format?: 'A4' | 'A3' | 'Letter';
|
|
7
8
|
margin?: {
|
|
@@ -16,12 +17,54 @@ export interface PdfGenerateOptions {
|
|
|
16
17
|
width?: string;
|
|
17
18
|
/** Explicit CSS page size (e.g. '1131px'). Takes precedence over `format`/`landscape` when set. */
|
|
18
19
|
height?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Turns on Chromium's own per-page header and footer. This is the only way to
|
|
22
|
+
* get a repeating accent bar and a real page number: `counter(page)` resolves
|
|
23
|
+
* to nothing outside `@page` margin boxes, so a footer rendered as flow
|
|
24
|
+
* content (like `pdfFooter()` in ./components) prints an empty page slot.
|
|
25
|
+
*
|
|
26
|
+
* The templates are mini-documents, not part of the page: they start at
|
|
27
|
+
* `font-size: 0`, need their own `print-color-adjust: exact` to keep
|
|
28
|
+
* backgrounds, and only `<span class="pageNumber">` / `<span class="totalPages">`
|
|
29
|
+
* get substituted. Keep `margin.top`/`margin.bottom` larger than the templates,
|
|
30
|
+
* or the page content prints over them.
|
|
31
|
+
*/
|
|
32
|
+
displayHeaderFooter?: boolean;
|
|
33
|
+
headerTemplate?: string;
|
|
34
|
+
footerTemplate?: string;
|
|
35
|
+
/** `page.setContent` wait condition. Defaults to 'networkidle'. */
|
|
36
|
+
waitUntil?: 'load' | 'domcontentloaded' | 'networkidle' | 'commit';
|
|
37
|
+
/** Ceiling for `page.setContent`, in ms. Defaults to Playwright's own (30s). */
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
/**
|
|
40
|
+
* JS expression evaluated in the page after `setContent`; the snapshot waits
|
|
41
|
+
* until it is truthy. For HTML whose layout settles asynchronously (webfonts
|
|
42
|
+
* loaded via `document.fonts`, measuring scripts that run after them).
|
|
43
|
+
*/
|
|
44
|
+
readyExpression?: string;
|
|
45
|
+
scale?: number;
|
|
46
|
+
pageRanges?: string;
|
|
47
|
+
/** Short identifier for the logs when a render fails or the queue saturates. */
|
|
48
|
+
label?: string;
|
|
19
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Builds the object handed to `page.pdf()`.
|
|
52
|
+
*
|
|
53
|
+
* Assembled key by key on purpose: a caller that passes none of the optional
|
|
54
|
+
* fields has to get exactly the object `page.pdf()` received before they
|
|
55
|
+
* existed — Chromium changes behaviour on the mere presence of some of them
|
|
56
|
+
* (`displayHeaderFooter` with a single template filled in brings back its own
|
|
57
|
+
* URL/date footer).
|
|
58
|
+
*/
|
|
59
|
+
export declare function buildPdfPageOptions(options: PdfGenerateOptions): Record<string, unknown>;
|
|
20
60
|
export declare class PdfService {
|
|
21
61
|
private readonly settingService;
|
|
22
62
|
private readonly brandAsset;
|
|
23
63
|
private readonly configService;
|
|
24
64
|
private readonly logger;
|
|
65
|
+
/** Renders holding a Chromium right now, and the ones waiting for a slot. */
|
|
66
|
+
private activeRenders;
|
|
67
|
+
private readonly renderQueue;
|
|
25
68
|
constructor(settingService: SettingService, brandAsset: BrandAssetService, configService: ConfigService);
|
|
26
69
|
/**
|
|
27
70
|
* Resolves the active PdfThemeConfig for the given area.
|
|
@@ -30,11 +73,42 @@ export declare class PdfService {
|
|
|
30
73
|
*/
|
|
31
74
|
loadThemeConfig(area?: PdfAreaType): Promise<PdfThemeConfig>;
|
|
32
75
|
/**
|
|
33
|
-
*
|
|
76
|
+
* Theme for commercial documents (proposals and the like): the area theme
|
|
77
|
+
* plus the legal footer, partner line and font stacks of the `pdf` group.
|
|
78
|
+
* The logo is embedded as a data URI so the render does not depend on the
|
|
79
|
+
* API reaching its own public URL.
|
|
80
|
+
*/
|
|
81
|
+
loadCommercialDocumentTheme(area?: PdfAreaType): Promise<CommercialDocumentTheme>;
|
|
82
|
+
/**
|
|
83
|
+
* Renders a commercial proposal with the installation's branding. Returns
|
|
84
|
+
* the HTML too, so the caller can keep the exact source of what was printed.
|
|
85
|
+
*/
|
|
86
|
+
renderCommercialProposal(data: CommercialProposalData, area?: PdfAreaType): Promise<{
|
|
87
|
+
html: string;
|
|
88
|
+
buffer: Buffer;
|
|
89
|
+
}>;
|
|
90
|
+
private get maxConcurrency();
|
|
91
|
+
private get queueWaitMs();
|
|
92
|
+
/**
|
|
93
|
+
* Every render launches a Chromium of its own, which costs a few hundred MB.
|
|
94
|
+
* The API pod is capped well below what a burst of simultaneous report
|
|
95
|
+
* downloads would ask for, and an OOM kill takes the whole API down — not
|
|
96
|
+
* just the PDF. So renders queue, and a queue that waits too long answers a
|
|
97
|
+
* retryable 503 instead of dragging the process down with it.
|
|
98
|
+
*/
|
|
99
|
+
private acquireRenderSlot;
|
|
100
|
+
private releaseRenderSlot;
|
|
101
|
+
/**
|
|
102
|
+
* Opens a Chromium page with the HTML loaded and hands it to `run`, taking
|
|
103
|
+
* care of the slot, the viewport and the teardown.
|
|
34
104
|
*
|
|
35
105
|
* Uses dynamic `import()` via `new Function` to remain compatible with
|
|
36
106
|
* CommonJS bundle output (same pattern as operations.service.ts).
|
|
37
107
|
*/
|
|
108
|
+
private renderWithChromium;
|
|
109
|
+
/**
|
|
110
|
+
* Renders an HTML string to a PDF buffer using Playwright/Chromium.
|
|
111
|
+
*/
|
|
38
112
|
generatePdfFromHtml(html: string, options?: PdfGenerateOptions): Promise<Buffer>;
|
|
39
113
|
/**
|
|
40
114
|
* Renders an HTML string to a PNG image buffer via a Playwright/Chromium
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf.service.d.ts","sourceRoot":"","sources":["../../src/pdf/pdf.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pdf.service.d.ts","sourceRoot":"","sources":["../../src/pdf/pdf.service.ts"],"names":[],"mappings":"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"}
|