@hed-hog/core 0.0.400 → 0.0.401
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/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.service.d.ts +15 -1
- package/dist/file/file.service.d.ts.map +1 -1
- package/dist/file/file.service.js +52 -24
- 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/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.secrets.d.ts.map +1 -1
- package/dist/integration-profile/integration-profile.secrets.js +21 -0
- package/dist/integration-profile/integration-profile.secrets.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/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 +239 -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 +153 -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 +108 -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 +69 -1
- package/dist/pdf/pdf.service.d.ts.map +1 -1
- package/dist/pdf/pdf.service.js +164 -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/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
- package/dist/whatsapp-sender/whatsapp-sender.service.js +25 -2
- 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/messages/en.json +54 -1
- package/hedhog/frontend/messages/pt.json +54 -1
- package/package.json +4 -4
- 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.service.spec.ts +168 -1
- package/src/file/file.service.ts +72 -34
- package/src/file/mcp-file-source.schema.ts +8 -5
- package/src/index.ts +5 -0
- package/src/integration-profile/integration-profile.secrets.ts +21 -0
- package/src/integration-profile/testers/ai.testers.ts +70 -5
- package/src/integration-profile/testers/remaining.testers.spec.ts +65 -1
- package/src/integration-profile/testers/tester-coverage.spec.ts +10 -0
- 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 +238 -0
- package/src/pdf/document/pdf-document.renderer.spec.ts +129 -0
- package/src/pdf/document/pdf-document.renderer.ts +215 -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 +97 -0
- package/src/pdf/pdf.module.ts +3 -2
- package/src/pdf/pdf.service.spec.ts +131 -0
- package/src/pdf/pdf.service.ts +245 -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/whatsapp-sender/whatsapp-sender.service.spec.ts +73 -0
- package/src/whatsapp-sender/whatsapp-sender.service.ts +32 -2
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.escapeHtml = escapeHtml;
|
|
4
|
+
exports.renderBlock = renderBlock;
|
|
5
|
+
exports.renderDocumentHtml = renderDocumentHtml;
|
|
6
|
+
const pdf_document_css_1 = require("./pdf-document.css");
|
|
7
|
+
/**
|
|
8
|
+
* Único ponto por onde texto entra no HTML. Nome de aluno, título de curso e
|
|
9
|
+
* rótulo de tarefa são dados de usuário indo para um Chromium headless.
|
|
10
|
+
*/
|
|
11
|
+
function escapeHtml(value) {
|
|
12
|
+
if (value === null || value === undefined)
|
|
13
|
+
return '';
|
|
14
|
+
return String(value)
|
|
15
|
+
.replace(/&/g, '&')
|
|
16
|
+
.replace(/</g, '<')
|
|
17
|
+
.replace(/>/g, '>')
|
|
18
|
+
.replace(/"/g, '"')
|
|
19
|
+
.replace(/'/g, ''');
|
|
20
|
+
}
|
|
21
|
+
const formatGeneratedAt = (date, locale) => new Intl.DateTimeFormat(locale, {
|
|
22
|
+
day: '2-digit',
|
|
23
|
+
month: 'long',
|
|
24
|
+
year: 'numeric',
|
|
25
|
+
hour: '2-digit',
|
|
26
|
+
minute: '2-digit',
|
|
27
|
+
}).format(date);
|
|
28
|
+
const toCell = (value) => {
|
|
29
|
+
if (value === null || value === undefined)
|
|
30
|
+
return { text: '—', tone: 'muted' };
|
|
31
|
+
if (typeof value === 'object')
|
|
32
|
+
return value;
|
|
33
|
+
return { text: String(value) };
|
|
34
|
+
};
|
|
35
|
+
const alignClass = (column) => column.align === 'right'
|
|
36
|
+
? ' class="align-right"'
|
|
37
|
+
: column.align === 'center'
|
|
38
|
+
? ' class="align-center"'
|
|
39
|
+
: '';
|
|
40
|
+
function renderCards(items, columns, variant) {
|
|
41
|
+
const cards = items
|
|
42
|
+
.map((item) => `<div class="card"><div class="card-label">${escapeHtml(item.label)}</div>` +
|
|
43
|
+
`<div class="card-value">${escapeHtml(item.value)}</div>` +
|
|
44
|
+
(item.hint ? `<div class="card-hint">${escapeHtml(item.hint)}</div>` : '') +
|
|
45
|
+
'</div>')
|
|
46
|
+
.join('');
|
|
47
|
+
return `<div class="cards cards-${columns} cards-${variant}">${cards}</div>`;
|
|
48
|
+
}
|
|
49
|
+
function renderTable(block) {
|
|
50
|
+
const { columns, rows, numbered = false, numberHeader = '#', zebra = true, compact = false, emptyText = 'Nenhum registro no recorte selecionado.', truncatedNote, } = block;
|
|
51
|
+
if (rows.length === 0) {
|
|
52
|
+
return `<div class="table-empty">${escapeHtml(emptyText)}</div>`;
|
|
53
|
+
}
|
|
54
|
+
const head = (numbered ? `<th class="idx">${escapeHtml(numberHeader)}</th>` : '') +
|
|
55
|
+
columns
|
|
56
|
+
.map((column) => `<th${alignClass(column)}${column.width ? ` style="width:${escapeHtml(column.width)}"` : ''}>` +
|
|
57
|
+
`${escapeHtml(column.header)}</th>`)
|
|
58
|
+
.join('');
|
|
59
|
+
// `push` + `join` em vez de concatenar em laço: uma conta grande gera milhares
|
|
60
|
+
// de linhas, e a string intermediária de cada passo é o que faz o render
|
|
61
|
+
// arrastar.
|
|
62
|
+
const body = [];
|
|
63
|
+
rows.forEach((row, index) => {
|
|
64
|
+
const cells = [];
|
|
65
|
+
if (numbered)
|
|
66
|
+
cells.push(`<td class="idx">${index + 1}</td>`);
|
|
67
|
+
columns.forEach((column, columnIndex) => {
|
|
68
|
+
const cell = toCell(row[columnIndex]);
|
|
69
|
+
const tone = cell.tone && cell.tone !== 'default' ? ` tone-${cell.tone}` : '';
|
|
70
|
+
const align = column.align === 'right' ? ' align-right' : column.align === 'center' ? ' align-center' : '';
|
|
71
|
+
cells.push(`<td class="${(tone + align).trim()}">${escapeHtml(cell.text)}` +
|
|
72
|
+
(cell.sub ? `<div class="cell-sub">${escapeHtml(cell.sub)}</div>` : '') +
|
|
73
|
+
'</td>');
|
|
74
|
+
});
|
|
75
|
+
body.push(`<tr>${cells.join('')}</tr>`);
|
|
76
|
+
});
|
|
77
|
+
const table = `<table class="doc-table${zebra ? ' zebra' : ''}${compact ? ' compact' : ''}">` +
|
|
78
|
+
`<thead><tr>${head}</tr></thead><tbody>${body.join('')}</tbody></table>`;
|
|
79
|
+
return truncatedNote ? `${table}<div class="note">${escapeHtml(truncatedNote)}</div>` : table;
|
|
80
|
+
}
|
|
81
|
+
function renderBlock(block) {
|
|
82
|
+
var _a, _b;
|
|
83
|
+
switch (block.kind) {
|
|
84
|
+
case 'section':
|
|
85
|
+
return (`<h2>${escapeHtml(block.title)}` +
|
|
86
|
+
(block.hint ? `<span class="section-hint">${escapeHtml(block.hint)}</span>` : '') +
|
|
87
|
+
'</h2>');
|
|
88
|
+
case 'cards':
|
|
89
|
+
return renderCards(block.items, (_a = block.columns) !== null && _a !== void 0 ? _a : 4, (_b = block.variant) !== null && _b !== void 0 ? _b : 'metric');
|
|
90
|
+
case 'table':
|
|
91
|
+
return renderTable(block);
|
|
92
|
+
case 'chart':
|
|
93
|
+
return ('<div class="chart">' +
|
|
94
|
+
(block.title ? `<div class="chart-title">${escapeHtml(block.title)}</div>` : '') +
|
|
95
|
+
block.svg +
|
|
96
|
+
(block.caption ? `<div class="chart-caption">${escapeHtml(block.caption)}</div>` : '') +
|
|
97
|
+
'</div>');
|
|
98
|
+
case 'chartGrid':
|
|
99
|
+
return ('<div class="chart-grid">' +
|
|
100
|
+
block.items
|
|
101
|
+
.map((item) => '<div class="chart">' +
|
|
102
|
+
(item.title ? `<div class="chart-title">${escapeHtml(item.title)}</div>` : '') +
|
|
103
|
+
item.svg +
|
|
104
|
+
(item.caption ? `<div class="chart-caption">${escapeHtml(item.caption)}</div>` : '') +
|
|
105
|
+
'</div>')
|
|
106
|
+
.join('') +
|
|
107
|
+
'</div>');
|
|
108
|
+
case 'note':
|
|
109
|
+
return `<div class="note${block.tone === 'accent' ? ' note-accent' : ''}">${escapeHtml(block.text)}</div>`;
|
|
110
|
+
case 'legend':
|
|
111
|
+
return `<div class="legend">${block.lines.map((l) => `<p>${escapeHtml(l)}</p>`).join('')}</div>`;
|
|
112
|
+
case 'pageBreak':
|
|
113
|
+
return '<div class="page-break"></div>';
|
|
114
|
+
default:
|
|
115
|
+
return '';
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function renderDocumentHtml(input, theme) {
|
|
119
|
+
var _a, _b, _c, _d;
|
|
120
|
+
const locale = (_a = input.locale) !== null && _a !== void 0 ? _a : 'pt-BR';
|
|
121
|
+
const generatedAt = (_b = input.generatedAt) !== null && _b !== void 0 ? _b : new Date();
|
|
122
|
+
const logo = input.logoDataUri || theme.logoUrl;
|
|
123
|
+
const meta = ((_c = input.meta) !== null && _c !== void 0 ? _c : [])
|
|
124
|
+
.map((item) => `<div>${escapeHtml(item.label)}: <span class="meta-value">${escapeHtml(item.value)}</span></div>`)
|
|
125
|
+
.join('');
|
|
126
|
+
const body = input.blocks.map((block) => renderBlock(block)).join('\n');
|
|
127
|
+
return `<!DOCTYPE html>
|
|
128
|
+
<html lang="${escapeHtml(locale)}">
|
|
129
|
+
<head>
|
|
130
|
+
<meta charset="utf-8" />
|
|
131
|
+
<title>${escapeHtml(input.title)}</title>
|
|
132
|
+
<style>${(0, pdf_document_css_1.buildDocumentCss)(theme, (_d = input.landscape) !== null && _d !== void 0 ? _d : false)}</style>
|
|
133
|
+
</head>
|
|
134
|
+
<body>
|
|
135
|
+
<header>
|
|
136
|
+
<div class="brand">
|
|
137
|
+
<img src="${escapeHtml(logo)}" alt="${escapeHtml(theme.companyName)}" />
|
|
138
|
+
<div class="brand-text">
|
|
139
|
+
${input.eyebrow ? `<div class="eyebrow">${escapeHtml(input.eyebrow)}</div>` : ''}
|
|
140
|
+
<h1>${escapeHtml(input.title)}</h1>
|
|
141
|
+
${input.subtitle ? `<div class="company-name">${escapeHtml(input.subtitle)}</div>` : ''}
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
<div class="meta-block">
|
|
145
|
+
<div>Gerado em: <span class="meta-value">${escapeHtml(formatGeneratedAt(generatedAt, locale))}</span></div>
|
|
146
|
+
${meta}
|
|
147
|
+
</div>
|
|
148
|
+
</header>
|
|
149
|
+
${body}
|
|
150
|
+
</body>
|
|
151
|
+
</html>`;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=pdf-document.renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.renderer.js","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { BrandAssetService } from '../../setting/brand-asset.service';
|
|
2
|
+
import { SettingService } from '../../setting/setting.service';
|
|
3
|
+
import { PdfService } from '../pdf.service';
|
|
4
|
+
import { PdfDocumentTheme, PdfDocumentThemeOverrides } from './pdf-document.theme';
|
|
5
|
+
import { PdfDocumentInput } from './pdf-document.types';
|
|
6
|
+
/**
|
|
7
|
+
* Gera o documento PDF padrão do sistema: letterhead com logo, cards, tabelas,
|
|
8
|
+
* gráficos, barra de destaque no topo de toda página e paginação "X / N".
|
|
9
|
+
*
|
|
10
|
+
* Quem chama entrega blocos de dados ({@link PdfDocumentInput}); o HTML e o
|
|
11
|
+
* Chromium são responsabilidade daqui.
|
|
12
|
+
*/
|
|
13
|
+
export declare class PdfDocumentService {
|
|
14
|
+
private readonly pdf;
|
|
15
|
+
private readonly settingService;
|
|
16
|
+
private readonly brandAsset;
|
|
17
|
+
constructor(pdf: PdfService, settingService: SettingService, brandAsset: BrandAssetService);
|
|
18
|
+
loadTheme(overrides?: PdfDocumentThemeOverrides): Promise<PdfDocumentTheme>;
|
|
19
|
+
/** HTML puro, sem Chromium — serve aos testes e a quem quiser inspecionar. */
|
|
20
|
+
buildHtml(input: PdfDocumentInput, theme?: PdfDocumentTheme): Promise<string>;
|
|
21
|
+
render(input: PdfDocumentInput, options?: {
|
|
22
|
+
theme?: PdfDocumentTheme;
|
|
23
|
+
label?: string;
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
}): Promise<Buffer>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=pdf-document.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdf-document.service.d.ts","sourceRoot":"","sources":["../../../src/pdf/document/pdf-document.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAO5C,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EAE1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;GAMG;AACH,qBACa,kBAAkB;IAG3B,OAAO,CAAC,QAAQ,CAAC,GAAG;IAEpB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAJV,GAAG,EAAE,UAAU,EAEf,cAAc,EAAE,cAAc,EAE9B,UAAU,EAAE,iBAAiB;IAGhD,SAAS,CAAC,SAAS,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI3E,8EAA8E;IACxE,SAAS,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7E,MAAM,CACV,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,gBAAgB,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC7E,OAAO,CAAC,MAAM,CAAC;CA4BnB"}
|
|
@@ -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,108 @@
|
|
|
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
|
+
export type PdfDocumentBlock = {
|
|
45
|
+
kind: 'section';
|
|
46
|
+
title: string;
|
|
47
|
+
hint?: string;
|
|
48
|
+
} | {
|
|
49
|
+
kind: 'cards';
|
|
50
|
+
items: PdfDocumentCard[];
|
|
51
|
+
/** Padrão: 4. */
|
|
52
|
+
columns?: 2 | 3 | 4 | 5;
|
|
53
|
+
/** 'metric' destaca o valor (indicador); 'filter' é o carimbo do recorte. */
|
|
54
|
+
variant?: 'metric' | 'filter';
|
|
55
|
+
} | {
|
|
56
|
+
kind: 'table';
|
|
57
|
+
columns: PdfDocumentTableColumn[];
|
|
58
|
+
rows: PdfDocumentRow[];
|
|
59
|
+
/** Coluna "#" à esquerda, 1..N contínua entre páginas. */
|
|
60
|
+
numbered?: boolean;
|
|
61
|
+
numberHeader?: string;
|
|
62
|
+
zebra?: boolean;
|
|
63
|
+
/** Fonte menor, para tabela com muitas colunas. */
|
|
64
|
+
compact?: boolean;
|
|
65
|
+
emptyText?: string;
|
|
66
|
+
/** Aviso de corte quando a origem truncou as linhas. */
|
|
67
|
+
truncatedNote?: string;
|
|
68
|
+
} | {
|
|
69
|
+
kind: 'chart';
|
|
70
|
+
title?: string;
|
|
71
|
+
svg: SafeSvg;
|
|
72
|
+
caption?: string;
|
|
73
|
+
} | {
|
|
74
|
+
kind: 'chartGrid';
|
|
75
|
+
items: Array<{
|
|
76
|
+
title?: string;
|
|
77
|
+
svg: SafeSvg;
|
|
78
|
+
caption?: string;
|
|
79
|
+
}>;
|
|
80
|
+
} | {
|
|
81
|
+
kind: 'note';
|
|
82
|
+
text: string;
|
|
83
|
+
tone?: 'muted' | 'accent';
|
|
84
|
+
} | {
|
|
85
|
+
kind: 'legend';
|
|
86
|
+
lines: string[];
|
|
87
|
+
} | {
|
|
88
|
+
kind: 'pageBreak';
|
|
89
|
+
};
|
|
90
|
+
export interface PdfDocumentInput {
|
|
91
|
+
/** O `h1` do letterhead. */
|
|
92
|
+
title: string;
|
|
93
|
+
/** Sobretítulo laranja, em caixa alta (ex.: "Relatório de Alunos"). */
|
|
94
|
+
eyebrow?: string;
|
|
95
|
+
/** Linha cinza abaixo do título — normalmente o nome da empresa. */
|
|
96
|
+
subtitle?: string;
|
|
97
|
+
/** Bloco alinhado à direita do letterhead. */
|
|
98
|
+
meta?: PdfDocumentMeta[];
|
|
99
|
+
blocks: PdfDocumentBlock[];
|
|
100
|
+
/** Data URI do logo; sem ele o kit usa o logo do sistema. */
|
|
101
|
+
logoDataUri?: string | null;
|
|
102
|
+
generatedAt?: Date;
|
|
103
|
+
locale?: string;
|
|
104
|
+
landscape?: boolean;
|
|
105
|
+
/** Padrão: 'Documento Confidencial'. */
|
|
106
|
+
footerLeft?: string;
|
|
107
|
+
}
|
|
108
|
+
//# 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"}
|