@trismegisto/spine 3.3.6 → 3.3.7

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-layout-ai-agent-transcript-BNcgbrV_.mjs","sources":["../../../projects/ui/layout/src/ai-agent/ai-agent-transcript.ts"],"sourcesContent":["import { Marked, Token, Tokens } from 'marked';\n\n/**\n * Transcrição da conversa em PDF, gerada no navegador e carregada só no clique. Um gerador pequeno em vez de uma\n * biblioteca: a conversa é texto e tabela, e as fontes padrão do PDF cobrem o português sem embutir arquivo nenhum.\n * O que não existe nessas fontes (WinAnsi) vira um equivalente em texto ou `?`, nunca erro.\n */\nexport interface SpineTranscriptStep {\n title: string;\n detail?: string;\n failed?: boolean;\n}\n\nexport interface SpineTranscriptEntry {\n role: 'person' | 'agent';\n text: string;\n steps: readonly SpineTranscriptStep[];\n error: boolean;\n}\n\nexport interface SpineTranscript {\n title: string;\n /** Linha abaixo do título: aplicação, pessoa e data. */\n subtitle: string;\n personLabel: string;\n agentLabel: string;\n queriesLabel: string;\n failedLabel: string;\n pageLabel: string;\n entries: readonly SpineTranscriptEntry[];\n}\n\ntype Font = 'F1' | 'F2' | 'F3';\n\ninterface Run {\n text: string;\n font: Font;\n}\n\ntype Line = Run[];\n\nconst PAGE_WIDTH = 595;\nconst PAGE_HEIGHT = 842;\nconst MARGIN = 48;\nconst CONTENT_WIDTH = PAGE_WIDTH - 2 * MARGIN;\nconst BOTTOM = PAGE_HEIGHT - MARGIN - 14;\nconst BODY_SIZE = 10;\nconst BODY_LEADING = 14;\nconst TABLE_SIZE = 8.5;\nconst TABLE_LEADING = 11;\nconst TABLE_PADDING = 4;\nconst INK = 0.13;\nconst MUTED = 0.42;\nconst RULE = 0.8;\nconst SHADE = 0.95;\n\n// Larguras das fontes padrão (AFM da Adobe), de 32 a 126, em milésimos do corpo.\nconst REGULAR = [\n 278, 278, 355, 556, 556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556,\n 556, 556, 278, 278, 584, 584, 584, 556, 1015, 667, 667, 722, 722, 667, 611, 778, 722, 278, 500, 667, 556, 833, 722, 778,\n 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556,\n 556, 222, 222, 500, 222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334, 584,\n];\nconst BOLD = [\n 278, 333, 474, 556, 556, 889, 722, 238, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556, 556, 556,\n 556, 556, 333, 333, 584, 584, 584, 611, 975, 722, 722, 722, 722, 667, 611, 778, 722, 278, 556, 722, 611, 833, 722, 778,\n 667, 778, 722, 667, 611, 722, 667, 944, 667, 667, 611, 333, 278, 333, 584, 556, 333, 556, 611, 556, 611, 556, 333, 611,\n 611, 278, 278, 556, 278, 889, 611, 611, 611, 611, 389, 556, 333, 611, 556, 778, 556, 556, 500, 389, 280, 389, 584,\n];\nconst COURIER_WIDTH = 600;\n\n// O trecho de 0x80 a 0x9F do WinAnsi; o resto até 0xFF coincide com o Unicode.\nconst WIN_ANSI: Readonly<Record<string, number>> = {\n '€': 0x80, '‚': 0x82, 'ƒ': 0x83, '„': 0x84, '…': 0x85, '†': 0x86, '‡': 0x87, 'ˆ': 0x88, '‰': 0x89, 'Š': 0x8a, '‹': 0x8b,\n 'Œ': 0x8c, 'Ž': 0x8e, '‘': 0x91, '’': 0x92, '“': 0x93, '”': 0x94, '•': 0x95, '–': 0x96, '—': 0x97, '˜': 0x98, '™': 0x99,\n 'š': 0x9a, '›': 0x9b, 'œ': 0x9c, 'ž': 0x9e, 'Ÿ': 0x9f,\n};\nconst REPLACEMENTS: Readonly<Record<string, string>> = {\n '→': '->', '←': '<-', '⇒': '=>', '≥': '>=', '≤': '<=', '≠': '!=', '✓': 'OK', '✔': 'OK', '✅': 'OK', '✗': 'X', '✘': 'X', '❌': 'X', '⚠': '!',\n '\\u00a0': ' ', '\\u2009': ' ', '\\u202f': ' ', '\\u200b': '',\n};\nconst WIDE_PUNCTUATION: Readonly<Record<string, number>> = { '—': 1000, '…': 1000, '•': 350, '‰': 1000, '™': 1000, '‘': 222, '’': 222, '“': 333, '”': 333 };\nconst ENTITIES: Readonly<Record<string, string>> = { '&amp;': '&', '&lt;': '<', '&gt;': '>', '&quot;': '\"', '&#39;': \"'\" };\n\n/** Só o que as fontes padrão desenham: troca o que tem equivalente, tira emoji e marca o resto com `?`. */\nfunction printable(raw: string): string {\n let result = '';\n for (const char of raw.normalize('NFC')) {\n const code = char.codePointAt(0)!;\n if (REPLACEMENTS[char] !== undefined) result += REPLACEMENTS[char];\n else if (char === '\\t') result += ' ';\n else if (code < 32 || code === 127) continue;\n else if (code <= 255 && !(code >= 0x80 && code <= 0x9f)) result += char;\n else if (WIN_ANSI[char]) result += char;\n // Modificadores e seletores de variação de emoji somem junto com ele.\n else if (code >= 0x1f000 || (code >= 0x2600 && code <= 0x27bf) || code === 0xfe0f || code === 0x200d) continue;\n else result += '?';\n }\n return result;\n}\n\nfunction charWidth(char: string, font: Font): number {\n if (font === 'F3') return COURIER_WIDTH;\n const table = font === 'F2' ? BOLD : REGULAR;\n const direct = table[char.charCodeAt(0) - 32];\n if (direct !== undefined) return direct;\n if (WIDE_PUNCTUATION[char]) return WIDE_PUNCTUATION[char];\n // Acentuada: a largura é a da letra base.\n return table[char.normalize('NFD').charCodeAt(0) - 32] ?? 556;\n}\n\nfunction textWidth(text: string, font: Font, size: number): number {\n let total = 0;\n for (const char of text) total += charWidth(char, font);\n return (total * size) / 1000;\n}\n\n/** Quebra em linhas no espaço disponível. Palavra maior que a linha é cortada, para nunca passar da borda. */\nfunction wrap(runs: readonly Run[], width: number, size: number): Line[] {\n const lines: Line[] = [];\n let line: Line = [];\n let used = 0;\n const flush = () => {\n lines.push(line);\n line = [];\n used = 0;\n };\n const push = (text: string, font: Font) => {\n const last = line[line.length - 1];\n if (last && last.font === font) last.text += text;\n else line.push({ text, font });\n used += textWidth(text, font, size);\n };\n for (const run of runs) {\n for (const piece of run.text.split(/(\\n|\\s+)/)) {\n if (!piece) continue;\n if (piece === '\\n') {\n flush();\n } else if (!piece.trim()) {\n if (used > 0) push(' ', run.font);\n } else {\n let word = piece;\n if (used + textWidth(word, run.font, size) > width && used > 0) flush();\n while (textWidth(word, run.font, size) > width) {\n let end = 1;\n while (end < word.length && textWidth(word.slice(0, end + 1), run.font, size) <= width) end += 1;\n push(word.slice(0, end), run.font);\n flush();\n word = word.slice(end);\n }\n push(word, run.font);\n }\n }\n }\n flush();\n return lines.map((current) => {\n // O espaço que sobrou no fim da linha não conta.\n const last = current[current.length - 1];\n if (last) last.text = last.text.replace(/ +$/, '');\n return current.filter((run) => run.text);\n });\n}\n\nfunction escapePdfText(text: string): string {\n let result = '';\n for (const char of text) {\n const code = WIN_ANSI[char] ?? char.charCodeAt(0);\n if (char === '(' || char === ')' || char === '\\\\') result += `\\\\${char}`;\n else if (code < 32 || code > 126) result += `\\\\${code.toString(8).padStart(3, '0')}`;\n else result += char;\n }\n return result;\n}\n\nfunction inlineRuns(tokens: readonly Token[] | undefined, font: Font = 'F1'): Run[] {\n const runs: Run[] = [];\n for (const token of tokens ?? []) {\n const item = token as Tokens.Generic;\n switch (token.type) {\n case 'strong':\n runs.push(...inlineRuns(item.tokens, 'F2'));\n break;\n case 'em':\n case 'del':\n runs.push(...inlineRuns(item.tokens, font));\n break;\n case 'codespan':\n runs.push({ text: printable(decodeEntities(item['text'])), font: 'F3' });\n break;\n case 'br':\n runs.push({ text: '\\n', font });\n break;\n case 'link': {\n const label = inlineRuns(item.tokens, font);\n runs.push(...label);\n if (label.map((run) => run.text).join('') !== item['href']) runs.push({ text: ` (${printable(item['href'])})`, font });\n break;\n }\n case 'image':\n runs.push({ text: printable(item['text'] || item['href']), font });\n break;\n default:\n if (item.tokens?.length) runs.push(...inlineRuns(item.tokens, font));\n else runs.push({ text: printable(decodeEntities(String(item['text'] ?? item.raw ?? ''))), font });\n }\n }\n return runs;\n}\n\nfunction decodeEntities(text: string): string {\n return text.replace(/&(amp|lt|gt|quot|#39);/g, (entity) => ENTITIES[entity] ?? entity);\n}\n\nclass PdfDocument {\n readonly pages: string[][] = [[]];\n y = MARGIN;\n\n private get page(): string[] {\n return this.pages[this.pages.length - 1];\n }\n\n newPage(): void {\n this.pages.push([]);\n this.y = MARGIN;\n }\n\n /** Garante espaço para o que vem a seguir, ou passa para a próxima página. */\n reserve(height: number): void {\n if (this.y + height > BOTTOM) this.newPage();\n }\n\n rect(x: number, top: number, width: number, height: number, gray: number): void {\n this.page.push(`${gray} g ${x.toFixed(2)} ${(PAGE_HEIGHT - top - height).toFixed(2)} ${width.toFixed(2)} ${height.toFixed(2)} re f`);\n }\n\n rule(x1: number, top1: number, x2: number, top2: number): void {\n this.page.push(`${RULE} G 0.5 w ${x1.toFixed(2)} ${(PAGE_HEIGHT - top1).toFixed(2)} m ${x2.toFixed(2)} ${(PAGE_HEIGHT - top2).toFixed(2)} l S`);\n }\n\n /** `baseline` conta do alto da página. */\n write(line: readonly Run[], x: number, baseline: number, size: number, gray = INK): void {\n let cursor = x;\n for (const run of line) {\n this.page.push(`BT /${run.font} ${size} Tf ${gray} g 1 0 0 1 ${cursor.toFixed(2)} ${(PAGE_HEIGHT - baseline).toFixed(2)} Tm (${escapePdfText(run.text)}) Tj ET`);\n cursor += textWidth(run.text, run.font, size);\n }\n }\n\n paragraph(runs: readonly Run[], x: number, options: { size?: number; leading?: number; gray?: number; shade?: boolean } = {}): void {\n const size = options.size ?? BODY_SIZE;\n const leading = options.leading ?? BODY_LEADING;\n const width = PAGE_WIDTH - MARGIN - x;\n for (const line of wrap(runs, width - (options.shade ? 2 * TABLE_PADDING : 0), size)) {\n this.reserve(leading);\n if (options.shade) this.rect(MARGIN, this.y, CONTENT_WIDTH, leading, SHADE);\n this.write(line, options.shade ? x + TABLE_PADDING : x, this.y + leading - 3.5, size, options.gray);\n this.y += leading;\n }\n }\n\n blocks(tokens: readonly Token[], x: number): void {\n for (const token of tokens) {\n const item = token as Tokens.Generic;\n switch (token.type) {\n case 'space':\n break;\n case 'heading': {\n const size = (item['depth'] as number) <= 2 ? 12 : 11;\n this.reserve(size + BODY_LEADING * 2);\n this.y += 4;\n this.paragraph(inlineRuns(item.tokens, 'F2'), x, { size, leading: size + 4 });\n this.y += 2;\n break;\n }\n case 'paragraph':\n case 'text':\n this.paragraph(item.tokens?.length ? inlineRuns(item.tokens) : [{ text: printable(decodeEntities(String(item['text'] ?? ''))), font: 'F1' }], x);\n this.y += token.type === 'paragraph' ? 5 : 0;\n break;\n case 'list':\n this.list(token as Tokens.List, x);\n this.y += 5;\n break;\n case 'code':\n this.code(String(item['text'] ?? ''), x);\n break;\n case 'table':\n this.table(token as Tokens.Table);\n break;\n case 'blockquote':\n this.blocks(item.tokens ?? [], x + 12);\n break;\n case 'hr':\n this.reserve(10);\n this.rule(x, this.y + 4, PAGE_WIDTH - MARGIN, this.y + 4);\n this.y += 10;\n break;\n default:\n this.paragraph([{ text: printable(String(item.raw ?? '')), font: 'F1' }], x);\n }\n }\n }\n\n private list(list: Tokens.List, x: number): void {\n list.items.forEach((item, index) => {\n const marker = list.ordered ? `${Number(list.start || 1) + index}.` : '•';\n this.reserve(BODY_LEADING);\n this.write([{ text: marker, font: 'F1' }], x + 2, this.y + BODY_LEADING - 3.5, BODY_SIZE);\n this.blocks(item.tokens, x + 16);\n });\n }\n\n private code(text: string, x: number): void {\n const size = 8.5;\n this.y += 2;\n for (const source of text.split('\\n')) {\n for (const line of wrap([{ text: printable(source) || ' ', font: 'F3' }], PAGE_WIDTH - MARGIN - x - 2 * TABLE_PADDING, size)) {\n this.reserve(TABLE_LEADING);\n this.rect(x, this.y, PAGE_WIDTH - MARGIN - x, TABLE_LEADING, SHADE);\n this.write(line, x + TABLE_PADDING, this.y + TABLE_LEADING - 2.5, size);\n this.y += TABLE_LEADING;\n }\n }\n this.y += 6;\n }\n\n private table(table: Tokens.Table): void {\n const header = table.header.map((cell) => inlineRuns(cell.tokens, 'F2'));\n const rows = table.rows.map((row) => row.map((cell) => inlineRuns(cell.tokens)));\n const columns = Math.max(header.length, ...rows.map((row) => row.length));\n const widths = this.columnWidths([header, ...rows], columns);\n const inner = (column: number) => Math.max(widths[column] - 2 * TABLE_PADDING, 8);\n const wrapRow = (row: readonly Run[][]) => widths.map((_, column) => wrap(row[column] ?? [], inner(column), TABLE_SIZE));\n const headerLines = wrapRow(header);\n\n const drawRow = (cells: readonly Line[][], from: number, count: number, shaded: boolean) => {\n const height = count * TABLE_LEADING + 2 * TABLE_PADDING - 2;\n if (shaded) this.rect(MARGIN, this.y, CONTENT_WIDTH, height, SHADE);\n let x = MARGIN;\n cells.forEach((lines, column) => {\n lines.slice(from, from + count).forEach((line, index) => {\n this.write(line, x + TABLE_PADDING, this.y + TABLE_PADDING + (index + 1) * TABLE_LEADING - 4, TABLE_SIZE);\n });\n x += widths[column];\n });\n this.y += height;\n this.rule(MARGIN, this.y, PAGE_WIDTH - MARGIN, this.y);\n };\n const lineCount = (cells: readonly Line[][]) => Math.max(1, ...cells.map((lines) => lines.length));\n const drawHeader = () => drawRow(headerLines, 0, lineCount(headerLines), true);\n const headerHeight = lineCount(headerLines) * TABLE_LEADING + 2 * TABLE_PADDING;\n\n this.y += 2;\n this.reserve(headerHeight + 2 * TABLE_LEADING + 2 * TABLE_PADDING);\n drawHeader();\n for (const row of rows) {\n const cells = wrapRow(row);\n const total = lineCount(cells);\n let done = 0;\n while (done < total) {\n const fits = Math.floor((BOTTOM - this.y - 2 * TABLE_PADDING) / TABLE_LEADING);\n // Linha que cabe inteira na página seguinte não é partida; só a que é maior que uma página.\n if (fits < 1 || (done === 0 && fits < total && total * TABLE_LEADING < BOTTOM - MARGIN - headerHeight * 2)) {\n this.newPage();\n drawHeader();\n continue;\n }\n const count = Math.min(fits, total - done);\n drawRow(cells, done, count, false);\n done += count;\n }\n }\n this.y += 8;\n }\n\n /** Proporcional ao conteúdo, com um mínimo por coluna, para coluna curta não roubar nem sobrar demais. */\n private columnWidths(rows: readonly (readonly Run[][])[], columns: number): number[] {\n const natural = Array.from({ length: columns }, (_, column) => Math.max(\n 24,\n ...rows.map((row) => (row[column] ?? []).reduce((sum, run) => sum + textWidth(run.text, run.font, TABLE_SIZE), 0) + 2 * TABLE_PADDING),\n ));\n const total = natural.reduce((sum, width) => sum + width, 0);\n if (total <= CONTENT_WIDTH) {\n const spare = (CONTENT_WIDTH - total) / columns;\n return natural.map((width) => width + spare);\n }\n const floor = Math.min(36, CONTENT_WIDTH / columns);\n const capped = natural.map((width) => Math.max(floor, (width / total) * CONTENT_WIDTH));\n const scale = CONTENT_WIDTH / capped.reduce((sum, width) => sum + width, 0);\n return capped.map((width) => width * scale);\n }\n\n serialize(title: string, pageLabel: string): Uint8Array {\n const total = this.pages.length;\n this.pages.forEach((content, index) => {\n const text = printable(`${pageLabel} ${index + 1} / ${total}`);\n const x = PAGE_WIDTH - MARGIN - textWidth(text, 'F1', 8);\n content.push(`BT /F1 8 Tf ${MUTED} g 1 0 0 1 ${x.toFixed(2)} 28.00 Tm (${escapePdfText(text)}) Tj ET`);\n });\n\n // 1 catálogo, 2 árvore, 3 a 5 fontes, 6 metadados; depois, página e conteúdo de cada uma.\n const firstPage = 7;\n const objects: string[] = [\n '<< /Type /Catalog /Pages 2 0 R >>',\n `<< /Type /Pages /Count ${total} /Kids [${this.pages.map((_, index) => `${firstPage + index * 2} 0 R`).join(' ')}] >>`,\n '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>',\n '<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>',\n '<< /Type /Font /Subtype /Type1 /BaseFont /Courier /Encoding /WinAnsiEncoding >>',\n `<< /Title (${escapePdfText(printable(title))}) >>`,\n ];\n this.pages.forEach((content, index) => {\n const stream = content.join('\\n');\n objects.push(\n `<< /Type /Page /Parent 2 0 R /MediaBox [0 0 ${PAGE_WIDTH} ${PAGE_HEIGHT}] /Resources << /Font << /F1 3 0 R /F2 4 0 R /F3 5 0 R >> >> /Contents ${firstPage + index * 2 + 1} 0 R >>`,\n `<< /Length ${stream.length} >>\\nstream\\n${stream}\\nendstream`,\n );\n });\n\n // O texto já saiu escapado: o arquivo é todo ASCII, então a posição em caracteres é a posição em bytes.\n let body = '%PDF-1.4\\n';\n const offsets: number[] = [];\n objects.forEach((object, index) => {\n offsets.push(body.length);\n body += `${index + 1} 0 obj\\n${object}\\nendobj\\n`;\n });\n const xref = body.length;\n const count = objects.length + 1;\n body += `xref\\n0 ${count}\\n0000000000 65535 f \\n${offsets.map((offset) => `${String(offset).padStart(10, '0')} 00000 n \\n`).join('')}`;\n body += `trailer\\n<< /Size ${count} /Root 1 0 R /Info 6 0 R >>\\nstartxref\\n${xref}\\n%%EOF\\n`;\n return new TextEncoder().encode(body);\n }\n}\n\nexport function buildTranscriptPdf(transcript: SpineTranscript): Uint8Array {\n const parser = new Marked({ gfm: true, breaks: false });\n const pdf = new PdfDocument();\n\n pdf.paragraph([{ text: printable(transcript.title), font: 'F2' }], MARGIN, { size: 16, leading: 22 });\n pdf.paragraph([{ text: printable(transcript.subtitle), font: 'F1' }], MARGIN, { size: 9, leading: 13, gray: MUTED });\n pdf.y += 6;\n pdf.rule(MARGIN, pdf.y, PAGE_WIDTH - MARGIN, pdf.y);\n pdf.y += 10;\n\n for (const entry of transcript.entries) {\n const label = entry.role === 'person' ? transcript.personLabel : transcript.agentLabel;\n // O rótulo não fica sozinho no pé da página.\n pdf.reserve(BODY_LEADING * 3);\n pdf.paragraph([{ text: printable(label), font: 'F2' }], MARGIN, { size: 9, leading: 13, gray: MUTED });\n if (entry.role === 'person') {\n // A pergunta é o que a pessoa escreveu, sem interpretar como Markdown.\n pdf.paragraph([{ text: entry.text.split(/\\r?\\n/).map(printable).join('\\n'), font: 'F1' }], MARGIN, { shade: true });\n pdf.y += 8;\n } else {\n if (entry.error) pdf.paragraph([{ text: printable(entry.text), font: 'F1' }], MARGIN, { gray: MUTED });\n else pdf.blocks(parser.lexer(entry.text), MARGIN);\n if (entry.steps.length) {\n pdf.y += 2;\n pdf.reserve(13 * 2);\n pdf.paragraph([{ text: printable(transcript.queriesLabel), font: 'F2' }], MARGIN, { size: 8.5, leading: 12, gray: MUTED });\n for (const step of entry.steps) {\n const failed = step.failed ? ` (${transcript.failedLabel})` : '';\n const detail = step.detail ? `: ${step.detail}` : '';\n pdf.paragraph([{ text: printable(`• ${step.title}${failed}${detail}`), font: 'F1' }], MARGIN, { size: 8.5, leading: 12, gray: MUTED });\n }\n }\n pdf.y += 12;\n }\n }\n return pdf.serialize(transcript.title, transcript.pageLabel);\n}\n\n/** `dudu-conversa-2026-11-05.pdf`: sem acento nem espaço, para qualquer sistema aceitar. */\nexport function transcriptFileName(title: string, word: string, now: Date): string {\n const slug = (value: string) => value.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n const day = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;\n return `${[slug(title), slug(word)].filter(Boolean).join('-')}-${day}.pdf`;\n}\n"],"names":[],"mappings":"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"}
@@ -19,7 +19,7 @@ import { TagComponent } from '@trismegisto/angular/tag';
19
19
  import { HermesToastService } from '@trismegisto/angular/toast';
20
20
  import { pluralMessage, formatMessage } from '@trismegisto/primitives/i18n';
21
21
  import { SPINE_MESSAGES, SpinePreferencesService, SpineUserStorage, spineRoutesOf } from '@trismegisto/spine';
22
- import { S as SpineSuggestionsService, a as SpineInboxService, b as SpineSuggestionChatComponent, c as SPINE_SUGGESTION_STATUS_COLORS, d as SPINE_SUGGESTION_KIND_COLORS, e as SPINE_SUGGESTION_KIND_ICONS, f as SPINE_SUGGESTION_WAITING_COLORS, N as NEW_SCREEN_VALUE, g as SPINE_SUGGESTION_VISIBLE_SORTS, s as suggestionScreens, h as SPINE_SUGGESTION_REASONS, i as SPINE_SUGGESTION_STATUSES, j as SPINE_SUGGESTION_KINDS, k as SPINE_SUGGESTION_WAITING, l as SPINE_TAB, m as SPINE_SUGGESTION_PAGE_PARAM, n as SPINE_SUGGESTION_TAB_PARAM, o as SPINE_SUGGESTION_TAB_CONVERSATION, p as screenName, q as screenModule, r as SPINE_SUGGESTIONS_PAGE_PATH, t as SpineSuggestionsDialogComponent, u as SpineTagRowComponent } from './trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs';
22
+ import { S as SpineSuggestionsService, a as SpineInboxService, b as SpineSuggestionChatComponent, c as SPINE_SUGGESTION_STATUS_COLORS, d as SPINE_SUGGESTION_KIND_COLORS, e as SPINE_SUGGESTION_KIND_ICONS, f as SPINE_SUGGESTION_WAITING_COLORS, N as NEW_SCREEN_VALUE, g as SPINE_SUGGESTION_VISIBLE_SORTS, s as suggestionScreens, h as SPINE_SUGGESTION_REASONS, i as SPINE_SUGGESTION_STATUSES, j as SPINE_SUGGESTION_KINDS, k as SPINE_SUGGESTION_WAITING, l as SPINE_TAB, m as SPINE_SUGGESTION_PAGE_PARAM, n as SPINE_SUGGESTION_TAB_PARAM, o as SPINE_SUGGESTION_TAB_CONVERSATION, p as screenName, q as screenModule, r as SPINE_SUGGESTIONS_PAGE_PATH, t as SpineSuggestionsDialogComponent, u as SpineTagRowComponent } from './trismegisto-spine-layout-trismegisto-spine-layout-D3vetDC_.mjs';
23
23
 
24
24
  const PAGE = 20;
25
25
  /** O recorte "Precisam da sua resposta" no seletor (não é um motivo: é a vez de quem pede). */
@@ -543,4 +543,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
543
543
  }], ctorParameters: () => [], propDecorators: { chat: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SpineSuggestionChatComponent), { isSignal: true }] }] } });
544
544
 
545
545
  export { SpineSuggestionsPageComponent };
546
- //# sourceMappingURL=trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs.map
546
+ //# sourceMappingURL=trismegisto-spine-layout-suggestions-page.component-BEGFNlvw.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs","sources":["../../../projects/ui/layout/src/suggestions/suggestions-page.component.ts","../../../projects/ui/layout/src/suggestions/suggestions-page.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked, viewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { ViewService } from '@orfeu/angular/core';\nimport { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';\nimport { AlertComponent } from '@trismegisto/angular/alert';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { DrawerComponent } from '@trismegisto/angular/drawer';\nimport { EmptyComponent } from '@trismegisto/angular/empty';\nimport { FilterBarComponent, FilterBarField, FilterBarValue } from '@trismegisto/angular/filter-bar';\nimport { IconComponent } from '@trismegisto/angular/icon';\nimport { MenuButtonComponent } from '@trismegisto/angular/menu-button';\nimport { PaginatorComponent } from '@trismegisto/angular/paginator';\nimport { RichTextComponent } from '@trismegisto/angular/rich-text';\nimport { SearchFieldComponent } from '@trismegisto/angular/search-field';\nimport { SegmentedControlComponent, SegmentedOption } from '@trismegisto/angular/segmented-control';\nimport { TabComponent, TabsComponent } from '@trismegisto/angular/tabs';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { HermesToastService } from '@trismegisto/angular/toast';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';\nimport { PaginationState } from '@trismegisto/primitives/pagination';\nimport { MenuItem } from '@trismegisto/primitives/popover';\nimport { SPINE_MESSAGES, SpinePreferencesService, SpineUserStorage, spineRoutesOf } from '@trismegisto/spine';\nimport { SpineChatMessage, SpineSuggestionChatComponent } from './suggestion-chat.component';\nimport { SpineTagRowComponent } from './tag-row.component';\nimport { NEW_SCREEN_VALUE, screenModule, screenName, suggestionScreens } from './suggestion-screens';\nimport { SpineSuggestionsDialogComponent, SpineSuggestionsView } from './suggestions-dialog.component';\nimport {\n SPINE_SUGGESTION_PAGE_PARAM, SPINE_SUGGESTION_TAB_CONVERSATION, SPINE_SUGGESTION_TAB_PARAM, SPINE_SUGGESTIONS_PAGE_PATH,\n} from './suggestions-page';\nimport { SpineInboxService } from '../inbox/inbox.service';\nimport { SPINE_TAB } from '../workspace/spine-tab';\nimport {\n SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_KIND_ICONS, SPINE_SUGGESTION_KINDS, SPINE_SUGGESTION_REASONS,\n SPINE_SUGGESTION_STATUS_COLORS, SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_VISIBLE_SORTS, SPINE_SUGGESTION_WAITING,\n SPINE_SUGGESTION_WAITING_COLORS, SpineSuggestion, SpineSuggestionKind, SpineSuggestionMessage, SpineSuggestionPerson,\n SpineSuggestionReason, SpineSuggestionStatus, SpineSuggestionVisibleSort, SpineSuggestionWaiting, SpineSuggestionsService,\n SpineVisibleCounts, SpineVisibleSuggestion,\n} from './suggestions.service';\n\nconst PAGE = 20;\n/** O recorte \"Precisam da sua resposta\" no seletor (não é um motivo: é a vez de quem pede). */\nconst NEEDS_YOU = 'precisam-de-voce';\nconst MESSAGES_PAGE = 20;\nconst CLOSED: readonly SpineSuggestionStatus[] = ['concluida', 'recusada'];\n\n/** Intervalos do \"há 3 dias\" (segundos por unidade), do maior para o menor. */\nconst AGES: ReadonlyArray<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31_536_000], ['month', 2_592_000], ['week', 604_800], ['day', 86_400], ['hour', 3_600], ['minute', 60],\n];\n\n/** A conversa da sugestão aberta: as mensagens do mais ANTIGO ao mais novo (o servidor pagina do mais novo). */\ninterface Conversation { id: string; messages: SpineSuggestionMessage[]; total: number; loading: boolean; error: boolean }\n\n/**\n * A página \"Sugestões do app\" de quem pede (página do próprio spine, em `/sugestoes` — ver `provideSpineSuggestionsPage`).\n *\n * - **O que aparece** é o que o servidor deixa a pessoa ver: as dela, as agrupadas (um pedido dela virou outro), as em\n * que ela está envolvida (mesmo de outro grupo) e as pedidas por alguém do grupo dela. Um grupo não vê o do outro,\n * a não ser por agrupamento. Cada item diz POR QUE aparece (os filtros rápidos no topo, com as contagens do servidor).\n * - **Filtros**: busca (título, descrição, tela, \"SUG-12\"), o recorte (`hm-segmented-control`: Todas, os motivos e\n * \"Precisam da sua resposta\"), e no `hm-filter-bar` status, tipo, tela (as do menu e \"Nova tela\") e com quem está a\n * vez; mais a ordem. Tudo no servidor, paginado.\n * - Apoiar direto no cartão, sem abrir a gaveta (a própria só mostra a contagem).\n * - **Gaveta** (`hm-drawer`): clicar abre a sugestão em **Detalhes** (descrição, tela, quem pediu, os grupos em selos,\n * os responsáveis), com a aba **Conversa** ao lado (o chat: o que a equipe escreveu de público e o que quem pede\n * respondeu; quem pediu e os envolvidos escrevem, a vez passa para os responsáveis; quem só é do grupo não tem a aba).\n * O apoio fica no topo, fora das abas. Abrir a Conversa marca como lida.\n * - \"Sugerir melhoria\" abre o mesmo modal da barra (sem tela escolhida); a nova entra na lista e abre no painel.\n * - \"?sugestao=SUG-12\" abre direto na sugestão (o link do aviso de envio).\n */\n@Component({\n selector: 'spine-suggestions-page',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, DrawerComponent, EmptyComponent, FilterBarComponent,\n IconComponent, MenuButtonComponent, PaginatorComponent, RichTextComponent, SearchFieldComponent,\n SegmentedControlComponent, SpineSuggestionChatComponent, SpineSuggestionsDialogComponent, SpineTagRowComponent, TabComponent, TabsComponent,\n TagComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './suggestions-page.component.html',\n styleUrl: './suggestions-page.component.scss',\n})\nexport class SpineSuggestionsPageComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.suggestions;\n protected readonly page = this.text.page;\n private readonly service = inject(SpineSuggestionsService);\n private readonly inbox = inject(SpineInboxService);\n private readonly toast = inject(HermesToastService);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly userStorage = inject(SpineUserStorage, { optional: true });\n private readonly views = inject(ViewService, { optional: true });\n private readonly router = inject(Router, { optional: true });\n\n private readonly chat = viewChild(SpineSuggestionChatComponent);\n\n protected readonly statusColors = SPINE_SUGGESTION_STATUS_COLORS;\n protected readonly kindColors = SPINE_SUGGESTION_KIND_COLORS;\n protected readonly kindIcons = SPINE_SUGGESTION_KIND_ICONS;\n /** O \"⋯\" de cada cartão: copiar o link (abre a página já na sugestão) e a chave. */\n protected readonly itemMenu: readonly MenuItem[] = [\n { id: 'copy-link', label: this.text.menuCopyLink, icon: 'link' },\n { id: 'copy-key', label: this.text.menuCopyKey, icon: 'copy' },\n ];\n protected readonly waitingColors = SPINE_SUGGESTION_WAITING_COLORS;\n protected readonly newScreenValue = NEW_SCREEN_VALUE;\n protected readonly sortOptions: readonly SegmentedOption[] = SPINE_SUGGESTION_VISIBLE_SORTS.map((s) => ({ value: s, label: this.page.sorts[s] }));\n /** As telas do menu (o filtro de tela), da árvore que a pessoa já recebe. */\n protected readonly screens = suggestionScreens(spineRoutesOf(this.views?.currentView));\n protected readonly me = computed(() => this.userStorage?.userId() ?? '');\n\n // --- filtros ---\n protected readonly search = signal('');\n protected readonly reason = signal<SpineSuggestionReason | ''>('');\n protected readonly status = signal<string>('');\n protected readonly kind = signal<string>('');\n /** Uma rota, `NEW_SCREEN_VALUE` ou ''. */\n protected readonly screen = signal<string>('');\n protected readonly waiting = signal<string>('');\n protected readonly sort = signal<string>('activity');\n protected readonly filtered = computed(() => !!(this.search().trim() || this.reason() || this.status() || this.kind()\n || this.screen() || this.waiting()));\n\n /** O recorte no seletor: um motivo, \"Precisam da sua resposta\" (a vez de quem pede, sem motivo) ou '' (Todas). */\n protected readonly scope = computed(() => this.reason() || (this.waiting() === 'solicitante' ? NEEDS_YOU : ''));\n /** As opções do recorte com a contagem (\"Minhas · 2\"); motivo sem nenhuma sugestão fica de fora (a não ser o escolhido). */\n protected readonly scopeOptions = computed<SegmentedOption[]>(() => {\n const counted = (label: string, count: number | null | undefined) => (count === null || count === undefined ? label : `${label} · ${count}`);\n const counts = this.counts();\n const options: SegmentedOption[] = [{ value: '', label: counted(this.page.allReasons, this.allTotal()) }];\n for (const r of SPINE_SUGGESTION_REASONS) {\n if (counts?.[r] !== 0 || this.reason() === r) options.push({ value: r, label: counted(this.page.reasons[r], counts?.[r]) });\n }\n if (counts?.waiting_me || this.scope() === NEEDS_YOU) {\n options.push({ value: NEEDS_YOU, label: counted(this.page.needsYou, counts?.waiting_me), icon: 'chat-bubble' });\n }\n return options;\n });\n\n /** Os campos do `hm-filter-bar` (o servidor filtra): status, tipo, tela (as do menu e \"Nova tela\") e com quem está a vez. */\n protected readonly filterFields = computed<FilterBarField[]>(() => [\n { key: 'status', label: this.text.statusFilter, type: 'select', options: SPINE_SUGGESTION_STATUSES.map((v) => ({ value: v, label: this.text.statuses[v] })) },\n { key: 'kind', label: this.text.kindFilter, type: 'select', options: SPINE_SUGGESTION_KINDS.map((v) => ({ value: v, label: this.text.kinds[v] })) },\n {\n key: 'screen', label: this.text.screenFilter, type: 'select',\n options: [...this.screens.map((sc) => ({ value: sc.path, label: sc.label })), { value: NEW_SCREEN_VALUE, label: this.text.newScreenTag }],\n },\n { key: 'waiting', label: this.text.waitingFilter, type: 'select', options: SPINE_SUGGESTION_WAITING.map((v) => ({ value: v, label: this.text.waiting[v] })) },\n ]);\n protected readonly filterValue = computed<FilterBarValue>(() => {\n const value: Record<string, string> = {};\n for (const key of ['status', 'kind', 'screen', 'waiting'] as const) if (this[key]()) value[key] = this[key]();\n return value;\n });\n\n // --- lista ---\n protected readonly list = signal<SpineVisibleSuggestion[]>([]);\n protected readonly total = signal(0);\n protected readonly counts = signal<SpineVisibleCounts | null>(null);\n protected readonly pagination = signal<PaginationState>({ page: 1, size: PAGE });\n protected readonly loading = signal(false);\n protected readonly error = signal('');\n private request = 0;\n protected readonly countText = computed(() => pluralMessage(this.page.count, this.total(), this.messages.meta.locale));\n /** \"Todas\": o total da última consulta sem motivo escolhido (null antes dela). */\n protected readonly allTotal = signal<number | null>(null);\n /** O título do cabeçalho: o recorte escolhido (\"Todas as sugestões\", \"Minhas\"...). */\n protected readonly heading = computed(() => {\n const r = this.reason();\n if (this.waiting() === 'solicitante' && !r) return this.page.needsYou;\n return r ? this.page.reasons[r] : this.page.allTitle;\n });\n /** \"1 em desenvolvimento · 1 planejada\": quantas em cada status, do que está na tela. */\n protected readonly statusParts = computed(() => {\n const locale = this.messages.meta.locale;\n return SPINE_SUGGESTION_STATUSES.map((status) => ({ status, count: this.list().filter((x) => x.status === status).length }))\n .filter((p) => p.count)\n .map((p) => ({ status: p.status, text: formatMessage(this.page.statusPart, { count: p.count, status: this.text.statuses[p.status].toLocaleLowerCase(locale) }) }));\n });\n\n // --- gaveta ---\n protected readonly selected = signal<SpineVisibleSuggestion | null>(null);\n /** A gaveta abre em Detalhes; a conversa é lida (e marcada como lida) quando a pessoa vai até ela. */\n protected readonly tab = signal<'conversation' | 'details'>('details');\n protected readonly drawerHeading = computed(() => {\n const s = this.selected();\n return s ? `${s.key} · ${s.title}` : this.page.details;\n });\n protected readonly detailLoading = signal(false);\n protected readonly detailError = signal('');\n protected readonly conversation = signal<Conversation | null>(null);\n protected readonly reply = signal('');\n /** A conversa no formato do chat (do mais antigo ao mais novo). */\n protected readonly chatItems = computed<SpineChatMessage[]>(() => (this.conversation()?.messages ?? []).map((m) => ({\n id: m.id, text: m.comment, created_at: m.created_at, author: m.author, from_requester: !!m.from_requester, status: m.status,\n })));\n protected readonly sending = signal(false);\n /** As sugestões com o apoio indo para o servidor (cada uma trava só o próprio botão). */\n private readonly voting = signal<ReadonlySet<string>>(new Set());\n protected readonly panelOpen = computed(() => !!this.selected() || this.detailLoading() || !!this.detailError());\n /** A vez é de quem pede e a pessoa pode responder: o destaque no topo do painel. */\n protected readonly waitingOnMe = computed(() => {\n const s = this.selected();\n return !!s && s.can_comment && s.waiting_on === 'solicitante' && !CLOSED.includes(s.status);\n });\n\n protected readonly dialog = signal<SpineSuggestionsView>(null);\n\n constructor() {\n void this.load(1);\n const tab = inject(SPINE_TAB, { optional: true });\n if (!tab) {\n const params = this.router?.parseUrl(this.router.url).queryParams ?? {};\n const key = params[SPINE_SUGGESTION_PAGE_PARAM];\n if (typeof key === 'string' && key) void this.openByKey(key, params[SPINE_SUGGESTION_TAB_PARAM] === SPINE_SUGGESTION_TAB_CONVERSATION);\n return;\n }\n // No workspace, a página fica viva na aba: \"?sugestao=SUG-12\" (um link, a central de notificações) pode chegar com\n // ela já aberta. Abre a gaveta e tira o parâmetro da aba, para o mesmo link funcionar de novo.\n effect(() => {\n const params = tab.params();\n const key = params[SPINE_SUGGESTION_PAGE_PARAM];\n if (!key) return;\n const conversation = params[SPINE_SUGGESTION_TAB_PARAM] === SPINE_SUGGESTION_TAB_CONVERSATION;\n untracked(() => {\n void this.openByKey(key, conversation);\n tab.navigate({ queryParams: { [SPINE_SUGGESTION_PAGE_PARAM]: null, [SPINE_SUGGESTION_TAB_PARAM]: null } });\n });\n });\n }\n\n // --- filtros ---\n\n protected onSearch(term: string): void {\n this.search.set(term);\n void this.load(1);\n }\n\n /**\n * O recorte: um motivo, \"Precisam da sua resposta\" (a vez de quem pede, sem motivo) ou Todas. Sair de \"Precisam da\n * sua resposta\" tira o \"Aguardando solicitante\" que ele tinha posto.\n */\n protected pickScope(value: string): void {\n if (value === this.scope()) return;\n const leavingNeedsYou = this.scope() === NEEDS_YOU;\n if (value === NEEDS_YOU) {\n this.reason.set('');\n this.waiting.set('solicitante');\n } else {\n this.reason.set(value as SpineSuggestionReason | '');\n if (leavingNeedsYou) this.waiting.set('');\n }\n void this.load(1);\n }\n\n /** O `hm-filter-bar` aplicou, limpou um campo ou limpou tudo. */\n protected onFilters(value: FilterBarValue): void {\n const read = (key: string) => (typeof value[key] === 'string' ? (value[key] as string) : '');\n this.status.set(read('status'));\n this.kind.set(read('kind'));\n this.screen.set(read('screen'));\n this.waiting.set(read('waiting'));\n void this.load(1);\n }\n\n protected pickTab(tab: string): void {\n const s = this.selected();\n const conversation = tab === 'conversation' && !!s?.can_comment;\n this.tab.set(conversation ? 'conversation' : 'details');\n if (conversation && this.conversation()?.id !== s.id) void this.loadConversation(s.id, true);\n }\n\n protected onSort(sort: string): void {\n if (sort === this.sort()) return;\n this.sort.set(sort);\n void this.load(1);\n }\n\n protected onPage(state: PaginationState): void {\n this.pagination.set({ page: state.page, size: state.size });\n void this.load(state.page);\n }\n\n protected async load(page: number): Promise<void> {\n const request = ++this.request;\n const size = this.pagination().size;\n this.loading.set(true);\n this.error.set('');\n const screen = this.screen();\n try {\n const res = await this.service.visible({\n limit: size, offset: (page - 1) * size,\n reason: this.reason(),\n status: this.status() as SpineSuggestionStatus | '',\n kind: this.kind() as SpineSuggestionKind | '',\n waiting: this.waiting() as SpineSuggestionWaiting | '',\n screen: screen && screen !== NEW_SCREEN_VALUE ? screen : undefined,\n newScreen: screen === NEW_SCREEN_VALUE,\n q: this.search(),\n sort: this.sort() as SpineSuggestionVisibleSort,\n });\n if (request !== this.request) return;\n this.list.set(res.suggestions);\n this.total.set(res.total);\n if (!this.reason()) this.allTotal.set(res.total);\n if (res.counts) this.counts.set(res.counts);\n this.pagination.set({ page, size });\n } catch {\n if (request === this.request) this.error.set(this.page.error);\n } finally {\n if (request === this.request) this.loading.set(false);\n }\n }\n\n // --- painel ---\n\n protected open(s: SpineVisibleSuggestion): void {\n if (this.selected()?.id === s.id) return;\n this.selected.set(s);\n // Abre em Detalhes; a conversa vem ao abrir a aba (quem só vê pelo grupo nem tem a aba: o servidor recusa).\n this.tab.set('details');\n this.detailError.set('');\n this.reply.set('');\n this.conversation.set(null);\n void this.refreshSelected(s.id);\n }\n\n /** Abre pela chave (link): `conversation` = já na aba Conversa. */\n private async openByKey(key: string, conversation = false): Promise<void> {\n this.detailLoading.set(true);\n try {\n const s = await this.service.lookup(key);\n this.detailLoading.set(false);\n this.open(s);\n if (conversation) this.pickTab('conversation');\n } catch {\n this.detailLoading.set(false);\n this.detailError.set(this.page.notFound);\n }\n }\n\n protected close(): void {\n this.selected.set(null);\n this.conversation.set(null);\n this.detailError.set('');\n }\n\n /** Relê a sugestão aberta (status, a vez e os apoios mudam do outro lado) e a deixa igual na lista. */\n private async refreshSelected(id: string): Promise<void> {\n try {\n const fresh = await this.service.get(id);\n if (this.selected()?.id !== id) return;\n this.selected.set(fresh);\n this.patch(id, fresh);\n } catch {\n /* fica o que veio da lista */\n }\n }\n\n private patch(id: string, change: Partial<SpineVisibleSuggestion>): void {\n this.list.update((list) => list.map((x) => (x.id === id ? { ...x, ...change } : x)));\n const current = this.selected();\n if (current?.id === id) this.selected.set({ ...current, ...change });\n }\n\n protected loadOlder(): void {\n const c = this.conversation();\n if (c && !c.loading && c.messages.length < c.total) void this.loadConversation(c.id, false);\n }\n\n private async loadConversation(id: string, reset: boolean): Promise<void> {\n const current = this.conversation();\n const offset = reset || current?.id !== id ? 0 : current.messages.length;\n this.conversation.set(reset || current?.id !== id\n ? { id, messages: [], total: 0, loading: true, error: false }\n : { ...current, loading: true, error: false });\n try {\n const res = await this.service.comments(id, { limit: MESSAGES_PAGE, offset });\n const older = [...res.comments].reverse();\n this.conversation.update((c) => (c?.id === id\n ? { ...c, messages: reset ? older : [...older, ...c.messages], total: res.total, loading: false } : c));\n if (reset) this.markRead(id);\n } catch {\n this.conversation.update((c) => (c?.id === id ? { ...c, loading: false, error: true } : c));\n }\n }\n\n /**\n * Abrir a conversa a marca como lida (o número some da lista na hora; falha não atrapalha a leitura). Vai sempre ao\n * servidor: a central de notificações também conta a mudança de status, que o `unread` (só comentários) não vê.\n */\n private markRead(id: string): void {\n const s = this.list().find((x) => x.id === id) ?? this.selected();\n if (s?.unread) {\n this.patch(id, { unread: 0 });\n this.counts.update((c) => (c ? { ...c, unread: Math.max(0, c.unread - 1) } : c));\n }\n this.service.markRead(id).then(() => this.inbox.refresh(), () => undefined);\n }\n\n protected async send(text?: string): Promise<void> {\n const s = this.selected();\n const comment = (text ?? this.reply()).trim();\n if (!s || !comment || this.sending()) return;\n this.sending.set(true);\n try {\n const message = await this.service.reply(s.id, comment);\n this.reply.set('');\n void this.inbox.refresh();\n this.conversation.update((c) => (c?.id === s.id\n ? { ...c, messages: [...c.messages, { ...message, from_requester: true }], total: c.total + 1 } : c));\n const now = new Date().toISOString();\n const wasWaitingOnMe = s.waiting_on === 'solicitante';\n this.patch(s.id, {\n comments_count: s.comments_count + 1,\n last_comment: { comment, created_at: message.created_at ?? now },\n ...(CLOSED.includes(s.status) ? {} : { waiting_on: 'responsaveis' as const, waiting_since: now }),\n last_activity_at: now,\n });\n if (wasWaitingOnMe) this.counts.update((c) => (c ? { ...c, waiting_me: Math.max(0, c.waiting_me - 1) } : c));\n this.chat()?.scrollToEnd();\n } catch {\n this.toast.error(this.page.replyError);\n } finally {\n this.sending.set(false);\n }\n }\n\n /** Apoiar (quem não pediu): muda na hora e volta se o servidor falhar. */\n protected isVoting(id: string): boolean {\n return this.voting().has(id);\n }\n\n /** Apoia ou tira o apoio (do cartão ou da gaveta): já na tela, e desfaz se o servidor recusar. */\n protected async toggleSupport(s: SpineVisibleSuggestion): Promise<void> {\n if (s.mine || this.isVoting(s.id)) return;\n const voted = !s.voted;\n this.patch(s.id, { voted, votes: Math.max(0, s.votes + (voted ? 1 : -1)) });\n this.voting.update((ids) => new Set(ids).add(s.id));\n try {\n if (voted) await this.service.vote(s.id);\n else await this.service.unvote(s.id);\n } catch {\n this.patch(s.id, { voted: s.voted, votes: s.votes });\n this.toast.error(this.text.voteError);\n } finally {\n this.voting.update((ids) => {\n const next = new Set(ids);\n next.delete(s.id);\n return next;\n });\n }\n }\n\n protected suggest(): void {\n this.dialog.set('new');\n }\n\n /** A nova entra no topo (relendo a lista) e abre no painel. */\n protected async onCreated(created: SpineSuggestion): Promise<void> {\n await this.load(1);\n const fresh = this.list().find((s) => s.id === created.id);\n if (fresh) this.open(fresh);\n else if (created.key) void this.openByKey(created.key);\n }\n\n // --- texto ---\n\n protected reasonCount(r: SpineSuggestionReason): number | null {\n return this.counts()?.[r] ?? null;\n }\n\n protected screenText(s: SpineVisibleSuggestion): string {\n if (s.screen.new) return s.screen.label || this.text.newScreenTag;\n return s.screen.label || this.text.noScreen;\n }\n\n protected screenShort(s: SpineVisibleSuggestion): string {\n return s.screen.new ? (s.screen.label || this.text.newScreenTag) : (screenName(s.screen.label) || this.text.noScreen);\n }\n\n /** O módulo da tela (\"Vendas\" de \"Vendas › Pedidos\"); vazio na nova, sem tela ou quando o módulo é a própria tela. */\n protected screenModule(s: SpineVisibleSuggestion): string {\n if (s.screen.new) return '';\n const module = screenModule(s.screen.label);\n return module && module !== screenName(s.screen.label) ? module : '';\n }\n\n /** O trecho do cartão: a última mensagem pública (a conversa anda) ou, sem ela, a descrição. */\n protected excerptOf(s: SpineVisibleSuggestion): string {\n return (s.last_comment?.comment || s.description || '').replace(/\\s+/g, ' ').trim();\n }\n\n protected commentsText(count: number): string {\n return pluralMessage(this.text.comments, count, this.messages.meta.locale);\n }\n\n protected menuLabel(s: SpineVisibleSuggestion): string {\n return formatMessage(this.text.cardMenu, { key: s.key });\n }\n\n protected async onMenu(s: SpineVisibleSuggestion, id: string): Promise<void> {\n const value = id === 'copy-key' ? s.key : this.linkOf(s);\n try {\n await navigator.clipboard.writeText(value);\n this.toast.success(id === 'copy-key' ? this.text.keyCopied : this.text.linkCopied);\n } catch {\n this.toast.error(this.text.copyError);\n }\n }\n\n /** O link que abre a página já na sugestão (\"…/sugestoes?sugestao=SUG-12\"), respeitando o `<base href>` do app. */\n private linkOf(s: SpineVisibleSuggestion): string {\n const path = `${SPINE_SUGGESTIONS_PAGE_PATH.slice(1)}?${SPINE_SUGGESTION_PAGE_PARAM}=${encodeURIComponent(s.key)}`;\n try {\n return new URL(path, document.baseURI).toString();\n } catch {\n return `/${path}`;\n }\n }\n\n\n protected personName(p: SpineSuggestionPerson | null | undefined): string {\n return p?.name || p?.username || this.text.removedAuthor;\n }\n\n protected votesText(count: number): string {\n return pluralMessage(this.text.votes, count, this.messages.meta.locale);\n }\n\n protected unreadText(count: number): string {\n return pluralMessage(this.text.unread, count, this.messages.meta.locale);\n }\n\n protected supportText(s: SpineVisibleSuggestion): string {\n if (s.mine) return this.votesText(s.votes);\n return formatMessage(s.voted ? this.text.supported : this.text.support, { count: s.votes });\n }\n\n protected mergedFromText(key: string, target: string): string {\n return formatMessage(this.text.mergedFrom, { key, target });\n }\n\n /** \"há 3 dias\", \"ontem\", \"há 2 horas\" (Intl.RelativeTimeFormat no idioma do catálogo). */\n protected age(iso: string | null | undefined): string {\n if (!iso) return '';\n const seconds = Math.round((Date.now() - new Date(iso).getTime()) / 1000);\n try {\n const rtf = new Intl.RelativeTimeFormat(this.messages.meta.locale, { numeric: 'auto' });\n for (const [unit, size] of AGES) if (Math.abs(seconds) >= size) return rtf.format(-Math.floor(seconds / size), unit);\n return rtf.format(0, 'minute');\n } catch {\n return this.date(iso);\n }\n }\n\n protected date(iso: string): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, {\n dateStyle: 'short', timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone(),\n }).format(new Date(iso));\n } catch {\n return iso.slice(0, 16).replace('T', ' ');\n }\n }\n}\n","<section class=\"ssp\" [attr.aria-label]=\"page.listLabel\">\n <!-- Cabeçalho numa linha: o recorte, quantas (e quantas em cada status), a ordem e o \"Sugerir melhoria\". -->\n <header class=\"ssp__head\">\n <h2 class=\"ssp__heading\">{{ heading() }}</h2>\n <span class=\"ssp__count\" aria-live=\"polite\">{{ countText() }}</span>\n @for (part of statusParts(); track part.status) {\n <span class=\"ssp__status-part\" [attr.data-status]=\"part.status\"><span class=\"ssp__dot\" aria-hidden=\"true\"></span>{{ part.text }}</span>\n }\n <span class=\"ssp__spacer\"></span>\n <hm-segmented-control class=\"ssp__sort\" size=\"small\" [label]=\"text.sort\" [options]=\"sortOptions\" [value]=\"sort()\"\n (valueChange)=\"onSort($event)\" />\n <hm-button size=\"small\" icon=\"plus\" (clicked)=\"suggest()\">{{ text.button }}</hm-button>\n </header>\n\n <!-- Busca e o recorte (por que a pessoa vê, com as contagens do servidor) na mesma linha. -->\n <div class=\"ssp__bar\">\n <hm-search-field class=\"ssp__search\" [label]=\"text.appSearch\" labelHidden [placeholder]=\"text.appSearch\"\n [landmark]=\"false\" [debounce]=\"300\" [value]=\"search()\" (search)=\"onSearch($event)\" />\n <hm-segmented-control class=\"ssp__scope\" size=\"small\" emphasis=\"action\" [label]=\"page.reasonFilter\"\n [options]=\"scopeOptions()\" [value]=\"scope()\" (valueChange)=\"pickScope($event)\" />\n </div>\n\n <!-- Filtros do Trismegisto: um botão por campo e, aplicados, as fichas removíveis com \"Limpar tudo\". -->\n <hm-filter-bar class=\"ssp__filters\" [label]=\"page.filtersLabel\" [filters]=\"filterFields()\" [value]=\"filterValue()\"\n (valueChange)=\"onFilters($event)\" />\n\n @if (error()) {\n <hm-alert variant=\"error\">{{ error() }}</hm-alert>\n } @else if (!loading() && list().length === 0) {\n @if (filtered()) {\n <hm-empty icon=\"filter\" [heading]=\"page.emptyFiltered\" />\n } @else {\n <hm-empty icon=\"lightbulb\" [heading]=\"page.empty\" [description]=\"page.emptyHint\" />\n }\n }\n\n <ul class=\"ssp__list\" [attr.aria-busy]=\"loading() ? 'true' : null\">\n @for (s of list(); track s.id) {\n <li class=\"ssp__item\" [class.ssp__item--open]=\"selected()?.id === s.id\" [class.ssp__item--unread]=\"s.unread > 0\">\n <div class=\"ssp__item-meta\">\n <span class=\"ssp__key\">{{ s.key }}</span>\n <span class=\"ssp__status\" [attr.data-status]=\"s.status\"><span class=\"ssp__dot\" aria-hidden=\"true\"></span>{{ text.statuses[s.status] }}</span>\n <span class=\"ssp__kind\" [attr.data-kind]=\"s.kind\"><hm-icon [shape]=\"kindIcons[s.kind]\" />{{ text.kinds[s.kind] }}</span>\n @if (s.unread) { <span class=\"ssp__unread\">{{ unreadText(s.unread) }}</span> }\n <span class=\"ssp__menu\">\n <hm-menu-button size=\"small\" icon=\"ellipsis-vertical\" [showArrow]=\"false\" align=\"end\" [label]=\"menuLabel(s)\"\n [items]=\"itemMenu\" (chosen)=\"onMenu(s, $event)\" />\n </span>\n </div>\n <!-- O título é o botão que abre a sugestão na gaveta. -->\n <button type=\"button\" class=\"ssp__item-title\" aria-haspopup=\"dialog\" (click)=\"open(s)\">{{ s.title }}</button>\n <div class=\"ssp__item-screen\">\n <hm-icon [shape]=\"s.screen.new ? 'plus' : 'application'\" />\n @if (screenModule(s); as module) {\n <span class=\"ssp__screen-module\">{{ module }}</span><hm-icon class=\"ssp__screen-sep\" shape=\"angle-right\" />\n }\n <strong class=\"ssp__screen-name\">{{ screenShort(s) }}</strong>\n @if (s.screen.new) { <span class=\"ssp__new-screen\">{{ text.newScreenTag }}</span> }\n @if (s.waiting_on && s.status !== 'concluida' && s.status !== 'recusada') {\n <hm-tag [name]=\"text.waiting[s.waiting_on]\" [color]=\"waitingColors[s.waiting_on]\" />\n }\n </div>\n @if (excerptOf(s); as ex) {\n <p class=\"ssp__excerpt\">{{ ex }}</p>\n }\n <div class=\"ssp__item-foot\">\n <hm-account-avatar size=\"small\" [name]=\"personName(s.author)\" [imageUrl]=\"s.author?.picture\" />\n <span class=\"ssp__byline\">\n <span class=\"ssp__byline-name\">{{ personName(s.author) }}</span>\n <time [attr.datetime]=\"s.last_activity_at || s.updated_at\">{{ age(s.last_activity_at || s.updated_at) }}</time>\n </span>\n <span class=\"ssp__counts\">\n @if (s.can_comment) {\n <span class=\"ssp__count-item\" [attr.title]=\"commentsText(s.comments_count)\">\n <hm-icon shape=\"comment-message\" /><span aria-hidden=\"true\">{{ s.comments_count }}</span><span class=\"ssp__sr\">{{ commentsText(s.comments_count) }}</span>\n </span>\n }\n <!-- Apoiar direto no cartão (a própria só mostra a contagem: ninguém apoia o que pediu). -->\n @if (s.mine) {\n <span class=\"ssp__count-item\" [attr.title]=\"votesText(s.votes)\">\n <hm-icon shape=\"thumbs-up\" /><span aria-hidden=\"true\">{{ s.votes }}</span><span class=\"ssp__sr\">{{ votesText(s.votes) }}</span>\n </span>\n } @else {\n <hm-button class=\"ssp__support\" size=\"small\" emphasis=\"minimal\" icon=\"thumbs-up\" toggle [pressed]=\"s.voted\"\n [disabled]=\"isVoting(s.id)\" [attr.title]=\"supportText(s)\" (clicked)=\"toggleSupport(s)\">\n <span aria-hidden=\"true\">{{ s.votes }}</span><span class=\"ssp__sr\">{{ supportText(s) }}</span>\n </hm-button>\n }\n </span>\n </div>\n </li>\n }\n </ul>\n\n @if (total() > pagination().size) {\n <hm-paginator variant=\"simple\" [label]=\"text.appPagination\" [state]=\"pagination()\" [totalItems]=\"total()\"\n [sizes]=\"[20, 50]\" (stateChanged)=\"onPage($event)\" />\n }\n</section>\n\n<!-- A sugestão aberta: gaveta com as abas Conversa (o chat) e Detalhes. -->\n<hm-drawer [heading]=\"drawerHeading()\" size=\"large\" [open]=\"panelOpen()\" (openChange)=\"$event || close()\">\n @if (detailError()) {\n <hm-alert variant=\"error\">{{ detailError() }}</hm-alert>\n } @else if (selected(); as s) {\n <div class=\"ssp-detail\" [class.ssp-detail--alert]=\"waitingOnMe()\">\n <div class=\"ssp__item-meta\">\n <span class=\"ssp__key\">{{ s.key }}</span>\n <span class=\"ssp__status\" [attr.data-status]=\"s.status\"><span class=\"ssp__dot\" aria-hidden=\"true\"></span>{{ text.statuses[s.status] }}</span>\n <span class=\"ssp__kind\" [attr.data-kind]=\"s.kind\"><hm-icon [shape]=\"kindIcons[s.kind]\" />{{ text.kinds[s.kind] }}</span>\n @if (s.archived) { <hm-tag [name]=\"text.archivedTag\" /> }\n @if (s.waiting_on && s.status !== 'concluida' && s.status !== 'recusada') {\n <hm-tag [name]=\"text.waiting[s.waiting_on]\" [color]=\"waitingColors[s.waiting_on]\" />\n }\n <!-- O apoio fica fora das abas: vale para as duas. -->\n <hm-button class=\"ssp-detail__support\" size=\"small\" emphasis=\"medium\" icon=\"thumbs-up\" toggle [pressed]=\"s.voted\"\n [disabled]=\"s.mine || isVoting(s.id)\" (clicked)=\"toggleSupport(s)\">{{ supportText(s) }}</hm-button>\n </div>\n @if (waitingOnMe()) {\n <hm-alert variant=\"warning\">{{ page.waitingYou }}</hm-alert>\n }\n\n <hm-tabs [label]=\"page.details\" [active]=\"tab()\" (activeChange)=\"pickTab($event)\">\n <hm-tab id=\"details\" [label]=\"page.details\">\n <div class=\"ssp-detail__body\">\n @if (!s.can_comment) {\n <hm-alert variant=\"info\">{{ page.readOnly }}</hm-alert>\n }\n @if (s.description_html) {\n <hm-rich-text class=\"ssp-detail__description\" [label]=\"text.description\" labelHidden readonly hideToolbar [value]=\"s.description_html\" />\n } @else if (s.description) {\n <p class=\"ssp-detail__description\">{{ s.description }}</p>\n } @else {\n <p class=\"ssp__hint\">{{ text.noDescription }}</p>\n }\n\n <dl class=\"ssp-detail__facts\">\n <dt>{{ text.screenOrigin }}</dt>\n <dd>\n @if (s.screen.new) { <span class=\"ssp__new-screen\">{{ text.newScreenTag }}</span> }\n {{ screenText(s) }}\n </dd>\n <dt>{{ text.requestedBy }}</dt>\n <dd>\n <hm-account-avatar size=\"small\" [name]=\"personName(s.author)\" [imageUrl]=\"s.author?.picture\" />\n {{ personName(s.author) }} · {{ age(s.created_at) }}\n </dd>\n <!-- Os grupos em linha, no modelo dos rótulos (o que não cabe vira \"+N\"), como no quadro da equipe. -->\n <dt>{{ page.groups }}</dt>\n <dd class=\"ssp-detail__groups\"><spine-tag-row [label]=\"page.groups\" [items]=\"s.groups\" [empty]=\"text.noGroups\" /></dd>\n <dt>{{ text.assignees }}</dt>\n <dd>\n @for (p of s.assignees; track p.user_id) {\n <hm-account-avatar size=\"small\" [name]=\"personName(p)\" [imageUrl]=\"p.picture\" />\n <span>{{ personName(p) }}</span>\n } @empty { <span class=\"ssp__hint\">{{ text.nobody }}</span> }\n </dd>\n <dt>{{ text.createdAt }}</dt>\n <dd>{{ date(s.created_at) }}</dd>\n </dl>\n\n @for (r of s.reasons; track r) {\n <p class=\"ssp__hint\">{{ page.reasonHints[r] }}</p>\n }\n @for (m of s.merged_from; track m.id) {\n <p class=\"ssp-detail__merged\">{{ mergedFromText(m.key, s.key) }}</p>\n }\n\n </div>\n </hm-tab>\n <!-- A conversa é de quem pediu, foi agrupado ou participa (can_comment); quem só vê pelo grupo fica com os Detalhes. -->\n @if (s.can_comment) {\n <hm-tab id=\"conversation\" [label]=\"page.conversation\" [count]=\"s.comments_count || null\">\n @if (conversation()?.error) {\n <hm-alert variant=\"error\">{{ page.conversationError }}</hm-alert>\n }\n <!-- A conversa em chat: à direita o que a pessoa escreveu como quem pede; o resto (inclusive ela mesma como\n equipe) à esquerda, com o papel no cabeçalho. -->\n <spine-suggestion-chat class=\"ssp-detail__chat\" side=\"solicitante\" [me]=\"me()\" [items]=\"chatItems()\"\n [label]=\"page.conversation\" [empty]=\"page.conversationEmpty\"\n [hasMore]=\"(conversation()?.messages?.length ?? 0) < (conversation()?.total ?? 0)\"\n [loading]=\"!!conversation()?.loading\"\n [composerLabel]=\"page.reply\" [placeholder]=\"page.replyPlaceholder\" [sendLabel]=\"page.replySend\"\n [sending]=\"sending()\" [(draft)]=\"reply\" (loadHistory)=\"loadOlder()\" (send)=\"send($event)\" />\n </hm-tab>\n }\n\n </hm-tabs>\n </div>\n } @else {\n <p class=\"ssp__hint\">{{ page.pickOne }}</p>\n }\n</hm-drawer>\n\n<spine-suggestions-dialog [(view)]=\"dialog\" [onPage]=\"true\" (created)=\"onCreated($event)\" />\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trismegisto-spine-layout-suggestions-page.component-BEGFNlvw.mjs","sources":["../../../projects/ui/layout/src/suggestions/suggestions-page.component.ts","../../../projects/ui/layout/src/suggestions/suggestions-page.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked, viewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { ViewService } from '@orfeu/angular/core';\nimport { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';\nimport { AlertComponent } from '@trismegisto/angular/alert';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { DrawerComponent } from '@trismegisto/angular/drawer';\nimport { EmptyComponent } from '@trismegisto/angular/empty';\nimport { FilterBarComponent, FilterBarField, FilterBarValue } from '@trismegisto/angular/filter-bar';\nimport { IconComponent } from '@trismegisto/angular/icon';\nimport { MenuButtonComponent } from '@trismegisto/angular/menu-button';\nimport { PaginatorComponent } from '@trismegisto/angular/paginator';\nimport { RichTextComponent } from '@trismegisto/angular/rich-text';\nimport { SearchFieldComponent } from '@trismegisto/angular/search-field';\nimport { SegmentedControlComponent, SegmentedOption } from '@trismegisto/angular/segmented-control';\nimport { TabComponent, TabsComponent } from '@trismegisto/angular/tabs';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { HermesToastService } from '@trismegisto/angular/toast';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';\nimport { PaginationState } from '@trismegisto/primitives/pagination';\nimport { MenuItem } from '@trismegisto/primitives/popover';\nimport { SPINE_MESSAGES, SpinePreferencesService, SpineUserStorage, spineRoutesOf } from '@trismegisto/spine';\nimport { SpineChatMessage, SpineSuggestionChatComponent } from './suggestion-chat.component';\nimport { SpineTagRowComponent } from './tag-row.component';\nimport { NEW_SCREEN_VALUE, screenModule, screenName, suggestionScreens } from './suggestion-screens';\nimport { SpineSuggestionsDialogComponent, SpineSuggestionsView } from './suggestions-dialog.component';\nimport {\n SPINE_SUGGESTION_PAGE_PARAM, SPINE_SUGGESTION_TAB_CONVERSATION, SPINE_SUGGESTION_TAB_PARAM, SPINE_SUGGESTIONS_PAGE_PATH,\n} from './suggestions-page';\nimport { SpineInboxService } from '../inbox/inbox.service';\nimport { SPINE_TAB } from '../workspace/spine-tab';\nimport {\n SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_KIND_ICONS, SPINE_SUGGESTION_KINDS, SPINE_SUGGESTION_REASONS,\n SPINE_SUGGESTION_STATUS_COLORS, SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_VISIBLE_SORTS, SPINE_SUGGESTION_WAITING,\n SPINE_SUGGESTION_WAITING_COLORS, SpineSuggestion, SpineSuggestionKind, SpineSuggestionMessage, SpineSuggestionPerson,\n SpineSuggestionReason, SpineSuggestionStatus, SpineSuggestionVisibleSort, SpineSuggestionWaiting, SpineSuggestionsService,\n SpineVisibleCounts, SpineVisibleSuggestion,\n} from './suggestions.service';\n\nconst PAGE = 20;\n/** O recorte \"Precisam da sua resposta\" no seletor (não é um motivo: é a vez de quem pede). */\nconst NEEDS_YOU = 'precisam-de-voce';\nconst MESSAGES_PAGE = 20;\nconst CLOSED: readonly SpineSuggestionStatus[] = ['concluida', 'recusada'];\n\n/** Intervalos do \"há 3 dias\" (segundos por unidade), do maior para o menor. */\nconst AGES: ReadonlyArray<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31_536_000], ['month', 2_592_000], ['week', 604_800], ['day', 86_400], ['hour', 3_600], ['minute', 60],\n];\n\n/** A conversa da sugestão aberta: as mensagens do mais ANTIGO ao mais novo (o servidor pagina do mais novo). */\ninterface Conversation { id: string; messages: SpineSuggestionMessage[]; total: number; loading: boolean; error: boolean }\n\n/**\n * A página \"Sugestões do app\" de quem pede (página do próprio spine, em `/sugestoes` — ver `provideSpineSuggestionsPage`).\n *\n * - **O que aparece** é o que o servidor deixa a pessoa ver: as dela, as agrupadas (um pedido dela virou outro), as em\n * que ela está envolvida (mesmo de outro grupo) e as pedidas por alguém do grupo dela. Um grupo não vê o do outro,\n * a não ser por agrupamento. Cada item diz POR QUE aparece (os filtros rápidos no topo, com as contagens do servidor).\n * - **Filtros**: busca (título, descrição, tela, \"SUG-12\"), o recorte (`hm-segmented-control`: Todas, os motivos e\n * \"Precisam da sua resposta\"), e no `hm-filter-bar` status, tipo, tela (as do menu e \"Nova tela\") e com quem está a\n * vez; mais a ordem. Tudo no servidor, paginado.\n * - Apoiar direto no cartão, sem abrir a gaveta (a própria só mostra a contagem).\n * - **Gaveta** (`hm-drawer`): clicar abre a sugestão em **Detalhes** (descrição, tela, quem pediu, os grupos em selos,\n * os responsáveis), com a aba **Conversa** ao lado (o chat: o que a equipe escreveu de público e o que quem pede\n * respondeu; quem pediu e os envolvidos escrevem, a vez passa para os responsáveis; quem só é do grupo não tem a aba).\n * O apoio fica no topo, fora das abas. Abrir a Conversa marca como lida.\n * - \"Sugerir melhoria\" abre o mesmo modal da barra (sem tela escolhida); a nova entra na lista e abre no painel.\n * - \"?sugestao=SUG-12\" abre direto na sugestão (o link do aviso de envio).\n */\n@Component({\n selector: 'spine-suggestions-page',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, DrawerComponent, EmptyComponent, FilterBarComponent,\n IconComponent, MenuButtonComponent, PaginatorComponent, RichTextComponent, SearchFieldComponent,\n SegmentedControlComponent, SpineSuggestionChatComponent, SpineSuggestionsDialogComponent, SpineTagRowComponent, TabComponent, TabsComponent,\n TagComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './suggestions-page.component.html',\n styleUrl: './suggestions-page.component.scss',\n})\nexport class SpineSuggestionsPageComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.suggestions;\n protected readonly page = this.text.page;\n private readonly service = inject(SpineSuggestionsService);\n private readonly inbox = inject(SpineInboxService);\n private readonly toast = inject(HermesToastService);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly userStorage = inject(SpineUserStorage, { optional: true });\n private readonly views = inject(ViewService, { optional: true });\n private readonly router = inject(Router, { optional: true });\n\n private readonly chat = viewChild(SpineSuggestionChatComponent);\n\n protected readonly statusColors = SPINE_SUGGESTION_STATUS_COLORS;\n protected readonly kindColors = SPINE_SUGGESTION_KIND_COLORS;\n protected readonly kindIcons = SPINE_SUGGESTION_KIND_ICONS;\n /** O \"⋯\" de cada cartão: copiar o link (abre a página já na sugestão) e a chave. */\n protected readonly itemMenu: readonly MenuItem[] = [\n { id: 'copy-link', label: this.text.menuCopyLink, icon: 'link' },\n { id: 'copy-key', label: this.text.menuCopyKey, icon: 'copy' },\n ];\n protected readonly waitingColors = SPINE_SUGGESTION_WAITING_COLORS;\n protected readonly newScreenValue = NEW_SCREEN_VALUE;\n protected readonly sortOptions: readonly SegmentedOption[] = SPINE_SUGGESTION_VISIBLE_SORTS.map((s) => ({ value: s, label: this.page.sorts[s] }));\n /** As telas do menu (o filtro de tela), da árvore que a pessoa já recebe. */\n protected readonly screens = suggestionScreens(spineRoutesOf(this.views?.currentView));\n protected readonly me = computed(() => this.userStorage?.userId() ?? '');\n\n // --- filtros ---\n protected readonly search = signal('');\n protected readonly reason = signal<SpineSuggestionReason | ''>('');\n protected readonly status = signal<string>('');\n protected readonly kind = signal<string>('');\n /** Uma rota, `NEW_SCREEN_VALUE` ou ''. */\n protected readonly screen = signal<string>('');\n protected readonly waiting = signal<string>('');\n protected readonly sort = signal<string>('activity');\n protected readonly filtered = computed(() => !!(this.search().trim() || this.reason() || this.status() || this.kind()\n || this.screen() || this.waiting()));\n\n /** O recorte no seletor: um motivo, \"Precisam da sua resposta\" (a vez de quem pede, sem motivo) ou '' (Todas). */\n protected readonly scope = computed(() => this.reason() || (this.waiting() === 'solicitante' ? NEEDS_YOU : ''));\n /** As opções do recorte com a contagem (\"Minhas · 2\"); motivo sem nenhuma sugestão fica de fora (a não ser o escolhido). */\n protected readonly scopeOptions = computed<SegmentedOption[]>(() => {\n const counted = (label: string, count: number | null | undefined) => (count === null || count === undefined ? label : `${label} · ${count}`);\n const counts = this.counts();\n const options: SegmentedOption[] = [{ value: '', label: counted(this.page.allReasons, this.allTotal()) }];\n for (const r of SPINE_SUGGESTION_REASONS) {\n if (counts?.[r] !== 0 || this.reason() === r) options.push({ value: r, label: counted(this.page.reasons[r], counts?.[r]) });\n }\n if (counts?.waiting_me || this.scope() === NEEDS_YOU) {\n options.push({ value: NEEDS_YOU, label: counted(this.page.needsYou, counts?.waiting_me), icon: 'chat-bubble' });\n }\n return options;\n });\n\n /** Os campos do `hm-filter-bar` (o servidor filtra): status, tipo, tela (as do menu e \"Nova tela\") e com quem está a vez. */\n protected readonly filterFields = computed<FilterBarField[]>(() => [\n { key: 'status', label: this.text.statusFilter, type: 'select', options: SPINE_SUGGESTION_STATUSES.map((v) => ({ value: v, label: this.text.statuses[v] })) },\n { key: 'kind', label: this.text.kindFilter, type: 'select', options: SPINE_SUGGESTION_KINDS.map((v) => ({ value: v, label: this.text.kinds[v] })) },\n {\n key: 'screen', label: this.text.screenFilter, type: 'select',\n options: [...this.screens.map((sc) => ({ value: sc.path, label: sc.label })), { value: NEW_SCREEN_VALUE, label: this.text.newScreenTag }],\n },\n { key: 'waiting', label: this.text.waitingFilter, type: 'select', options: SPINE_SUGGESTION_WAITING.map((v) => ({ value: v, label: this.text.waiting[v] })) },\n ]);\n protected readonly filterValue = computed<FilterBarValue>(() => {\n const value: Record<string, string> = {};\n for (const key of ['status', 'kind', 'screen', 'waiting'] as const) if (this[key]()) value[key] = this[key]();\n return value;\n });\n\n // --- lista ---\n protected readonly list = signal<SpineVisibleSuggestion[]>([]);\n protected readonly total = signal(0);\n protected readonly counts = signal<SpineVisibleCounts | null>(null);\n protected readonly pagination = signal<PaginationState>({ page: 1, size: PAGE });\n protected readonly loading = signal(false);\n protected readonly error = signal('');\n private request = 0;\n protected readonly countText = computed(() => pluralMessage(this.page.count, this.total(), this.messages.meta.locale));\n /** \"Todas\": o total da última consulta sem motivo escolhido (null antes dela). */\n protected readonly allTotal = signal<number | null>(null);\n /** O título do cabeçalho: o recorte escolhido (\"Todas as sugestões\", \"Minhas\"...). */\n protected readonly heading = computed(() => {\n const r = this.reason();\n if (this.waiting() === 'solicitante' && !r) return this.page.needsYou;\n return r ? this.page.reasons[r] : this.page.allTitle;\n });\n /** \"1 em desenvolvimento · 1 planejada\": quantas em cada status, do que está na tela. */\n protected readonly statusParts = computed(() => {\n const locale = this.messages.meta.locale;\n return SPINE_SUGGESTION_STATUSES.map((status) => ({ status, count: this.list().filter((x) => x.status === status).length }))\n .filter((p) => p.count)\n .map((p) => ({ status: p.status, text: formatMessage(this.page.statusPart, { count: p.count, status: this.text.statuses[p.status].toLocaleLowerCase(locale) }) }));\n });\n\n // --- gaveta ---\n protected readonly selected = signal<SpineVisibleSuggestion | null>(null);\n /** A gaveta abre em Detalhes; a conversa é lida (e marcada como lida) quando a pessoa vai até ela. */\n protected readonly tab = signal<'conversation' | 'details'>('details');\n protected readonly drawerHeading = computed(() => {\n const s = this.selected();\n return s ? `${s.key} · ${s.title}` : this.page.details;\n });\n protected readonly detailLoading = signal(false);\n protected readonly detailError = signal('');\n protected readonly conversation = signal<Conversation | null>(null);\n protected readonly reply = signal('');\n /** A conversa no formato do chat (do mais antigo ao mais novo). */\n protected readonly chatItems = computed<SpineChatMessage[]>(() => (this.conversation()?.messages ?? []).map((m) => ({\n id: m.id, text: m.comment, created_at: m.created_at, author: m.author, from_requester: !!m.from_requester, status: m.status,\n })));\n protected readonly sending = signal(false);\n /** As sugestões com o apoio indo para o servidor (cada uma trava só o próprio botão). */\n private readonly voting = signal<ReadonlySet<string>>(new Set());\n protected readonly panelOpen = computed(() => !!this.selected() || this.detailLoading() || !!this.detailError());\n /** A vez é de quem pede e a pessoa pode responder: o destaque no topo do painel. */\n protected readonly waitingOnMe = computed(() => {\n const s = this.selected();\n return !!s && s.can_comment && s.waiting_on === 'solicitante' && !CLOSED.includes(s.status);\n });\n\n protected readonly dialog = signal<SpineSuggestionsView>(null);\n\n constructor() {\n void this.load(1);\n const tab = inject(SPINE_TAB, { optional: true });\n if (!tab) {\n const params = this.router?.parseUrl(this.router.url).queryParams ?? {};\n const key = params[SPINE_SUGGESTION_PAGE_PARAM];\n if (typeof key === 'string' && key) void this.openByKey(key, params[SPINE_SUGGESTION_TAB_PARAM] === SPINE_SUGGESTION_TAB_CONVERSATION);\n return;\n }\n // No workspace, a página fica viva na aba: \"?sugestao=SUG-12\" (um link, a central de notificações) pode chegar com\n // ela já aberta. Abre a gaveta e tira o parâmetro da aba, para o mesmo link funcionar de novo.\n effect(() => {\n const params = tab.params();\n const key = params[SPINE_SUGGESTION_PAGE_PARAM];\n if (!key) return;\n const conversation = params[SPINE_SUGGESTION_TAB_PARAM] === SPINE_SUGGESTION_TAB_CONVERSATION;\n untracked(() => {\n void this.openByKey(key, conversation);\n tab.navigate({ queryParams: { [SPINE_SUGGESTION_PAGE_PARAM]: null, [SPINE_SUGGESTION_TAB_PARAM]: null } });\n });\n });\n }\n\n // --- filtros ---\n\n protected onSearch(term: string): void {\n this.search.set(term);\n void this.load(1);\n }\n\n /**\n * O recorte: um motivo, \"Precisam da sua resposta\" (a vez de quem pede, sem motivo) ou Todas. Sair de \"Precisam da\n * sua resposta\" tira o \"Aguardando solicitante\" que ele tinha posto.\n */\n protected pickScope(value: string): void {\n if (value === this.scope()) return;\n const leavingNeedsYou = this.scope() === NEEDS_YOU;\n if (value === NEEDS_YOU) {\n this.reason.set('');\n this.waiting.set('solicitante');\n } else {\n this.reason.set(value as SpineSuggestionReason | '');\n if (leavingNeedsYou) this.waiting.set('');\n }\n void this.load(1);\n }\n\n /** O `hm-filter-bar` aplicou, limpou um campo ou limpou tudo. */\n protected onFilters(value: FilterBarValue): void {\n const read = (key: string) => (typeof value[key] === 'string' ? (value[key] as string) : '');\n this.status.set(read('status'));\n this.kind.set(read('kind'));\n this.screen.set(read('screen'));\n this.waiting.set(read('waiting'));\n void this.load(1);\n }\n\n protected pickTab(tab: string): void {\n const s = this.selected();\n const conversation = tab === 'conversation' && !!s?.can_comment;\n this.tab.set(conversation ? 'conversation' : 'details');\n if (conversation && this.conversation()?.id !== s.id) void this.loadConversation(s.id, true);\n }\n\n protected onSort(sort: string): void {\n if (sort === this.sort()) return;\n this.sort.set(sort);\n void this.load(1);\n }\n\n protected onPage(state: PaginationState): void {\n this.pagination.set({ page: state.page, size: state.size });\n void this.load(state.page);\n }\n\n protected async load(page: number): Promise<void> {\n const request = ++this.request;\n const size = this.pagination().size;\n this.loading.set(true);\n this.error.set('');\n const screen = this.screen();\n try {\n const res = await this.service.visible({\n limit: size, offset: (page - 1) * size,\n reason: this.reason(),\n status: this.status() as SpineSuggestionStatus | '',\n kind: this.kind() as SpineSuggestionKind | '',\n waiting: this.waiting() as SpineSuggestionWaiting | '',\n screen: screen && screen !== NEW_SCREEN_VALUE ? screen : undefined,\n newScreen: screen === NEW_SCREEN_VALUE,\n q: this.search(),\n sort: this.sort() as SpineSuggestionVisibleSort,\n });\n if (request !== this.request) return;\n this.list.set(res.suggestions);\n this.total.set(res.total);\n if (!this.reason()) this.allTotal.set(res.total);\n if (res.counts) this.counts.set(res.counts);\n this.pagination.set({ page, size });\n } catch {\n if (request === this.request) this.error.set(this.page.error);\n } finally {\n if (request === this.request) this.loading.set(false);\n }\n }\n\n // --- painel ---\n\n protected open(s: SpineVisibleSuggestion): void {\n if (this.selected()?.id === s.id) return;\n this.selected.set(s);\n // Abre em Detalhes; a conversa vem ao abrir a aba (quem só vê pelo grupo nem tem a aba: o servidor recusa).\n this.tab.set('details');\n this.detailError.set('');\n this.reply.set('');\n this.conversation.set(null);\n void this.refreshSelected(s.id);\n }\n\n /** Abre pela chave (link): `conversation` = já na aba Conversa. */\n private async openByKey(key: string, conversation = false): Promise<void> {\n this.detailLoading.set(true);\n try {\n const s = await this.service.lookup(key);\n this.detailLoading.set(false);\n this.open(s);\n if (conversation) this.pickTab('conversation');\n } catch {\n this.detailLoading.set(false);\n this.detailError.set(this.page.notFound);\n }\n }\n\n protected close(): void {\n this.selected.set(null);\n this.conversation.set(null);\n this.detailError.set('');\n }\n\n /** Relê a sugestão aberta (status, a vez e os apoios mudam do outro lado) e a deixa igual na lista. */\n private async refreshSelected(id: string): Promise<void> {\n try {\n const fresh = await this.service.get(id);\n if (this.selected()?.id !== id) return;\n this.selected.set(fresh);\n this.patch(id, fresh);\n } catch {\n /* fica o que veio da lista */\n }\n }\n\n private patch(id: string, change: Partial<SpineVisibleSuggestion>): void {\n this.list.update((list) => list.map((x) => (x.id === id ? { ...x, ...change } : x)));\n const current = this.selected();\n if (current?.id === id) this.selected.set({ ...current, ...change });\n }\n\n protected loadOlder(): void {\n const c = this.conversation();\n if (c && !c.loading && c.messages.length < c.total) void this.loadConversation(c.id, false);\n }\n\n private async loadConversation(id: string, reset: boolean): Promise<void> {\n const current = this.conversation();\n const offset = reset || current?.id !== id ? 0 : current.messages.length;\n this.conversation.set(reset || current?.id !== id\n ? { id, messages: [], total: 0, loading: true, error: false }\n : { ...current, loading: true, error: false });\n try {\n const res = await this.service.comments(id, { limit: MESSAGES_PAGE, offset });\n const older = [...res.comments].reverse();\n this.conversation.update((c) => (c?.id === id\n ? { ...c, messages: reset ? older : [...older, ...c.messages], total: res.total, loading: false } : c));\n if (reset) this.markRead(id);\n } catch {\n this.conversation.update((c) => (c?.id === id ? { ...c, loading: false, error: true } : c));\n }\n }\n\n /**\n * Abrir a conversa a marca como lida (o número some da lista na hora; falha não atrapalha a leitura). Vai sempre ao\n * servidor: a central de notificações também conta a mudança de status, que o `unread` (só comentários) não vê.\n */\n private markRead(id: string): void {\n const s = this.list().find((x) => x.id === id) ?? this.selected();\n if (s?.unread) {\n this.patch(id, { unread: 0 });\n this.counts.update((c) => (c ? { ...c, unread: Math.max(0, c.unread - 1) } : c));\n }\n this.service.markRead(id).then(() => this.inbox.refresh(), () => undefined);\n }\n\n protected async send(text?: string): Promise<void> {\n const s = this.selected();\n const comment = (text ?? this.reply()).trim();\n if (!s || !comment || this.sending()) return;\n this.sending.set(true);\n try {\n const message = await this.service.reply(s.id, comment);\n this.reply.set('');\n void this.inbox.refresh();\n this.conversation.update((c) => (c?.id === s.id\n ? { ...c, messages: [...c.messages, { ...message, from_requester: true }], total: c.total + 1 } : c));\n const now = new Date().toISOString();\n const wasWaitingOnMe = s.waiting_on === 'solicitante';\n this.patch(s.id, {\n comments_count: s.comments_count + 1,\n last_comment: { comment, created_at: message.created_at ?? now },\n ...(CLOSED.includes(s.status) ? {} : { waiting_on: 'responsaveis' as const, waiting_since: now }),\n last_activity_at: now,\n });\n if (wasWaitingOnMe) this.counts.update((c) => (c ? { ...c, waiting_me: Math.max(0, c.waiting_me - 1) } : c));\n this.chat()?.scrollToEnd();\n } catch {\n this.toast.error(this.page.replyError);\n } finally {\n this.sending.set(false);\n }\n }\n\n /** Apoiar (quem não pediu): muda na hora e volta se o servidor falhar. */\n protected isVoting(id: string): boolean {\n return this.voting().has(id);\n }\n\n /** Apoia ou tira o apoio (do cartão ou da gaveta): já na tela, e desfaz se o servidor recusar. */\n protected async toggleSupport(s: SpineVisibleSuggestion): Promise<void> {\n if (s.mine || this.isVoting(s.id)) return;\n const voted = !s.voted;\n this.patch(s.id, { voted, votes: Math.max(0, s.votes + (voted ? 1 : -1)) });\n this.voting.update((ids) => new Set(ids).add(s.id));\n try {\n if (voted) await this.service.vote(s.id);\n else await this.service.unvote(s.id);\n } catch {\n this.patch(s.id, { voted: s.voted, votes: s.votes });\n this.toast.error(this.text.voteError);\n } finally {\n this.voting.update((ids) => {\n const next = new Set(ids);\n next.delete(s.id);\n return next;\n });\n }\n }\n\n protected suggest(): void {\n this.dialog.set('new');\n }\n\n /** A nova entra no topo (relendo a lista) e abre no painel. */\n protected async onCreated(created: SpineSuggestion): Promise<void> {\n await this.load(1);\n const fresh = this.list().find((s) => s.id === created.id);\n if (fresh) this.open(fresh);\n else if (created.key) void this.openByKey(created.key);\n }\n\n // --- texto ---\n\n protected reasonCount(r: SpineSuggestionReason): number | null {\n return this.counts()?.[r] ?? null;\n }\n\n protected screenText(s: SpineVisibleSuggestion): string {\n if (s.screen.new) return s.screen.label || this.text.newScreenTag;\n return s.screen.label || this.text.noScreen;\n }\n\n protected screenShort(s: SpineVisibleSuggestion): string {\n return s.screen.new ? (s.screen.label || this.text.newScreenTag) : (screenName(s.screen.label) || this.text.noScreen);\n }\n\n /** O módulo da tela (\"Vendas\" de \"Vendas › Pedidos\"); vazio na nova, sem tela ou quando o módulo é a própria tela. */\n protected screenModule(s: SpineVisibleSuggestion): string {\n if (s.screen.new) return '';\n const module = screenModule(s.screen.label);\n return module && module !== screenName(s.screen.label) ? module : '';\n }\n\n /** O trecho do cartão: a última mensagem pública (a conversa anda) ou, sem ela, a descrição. */\n protected excerptOf(s: SpineVisibleSuggestion): string {\n return (s.last_comment?.comment || s.description || '').replace(/\\s+/g, ' ').trim();\n }\n\n protected commentsText(count: number): string {\n return pluralMessage(this.text.comments, count, this.messages.meta.locale);\n }\n\n protected menuLabel(s: SpineVisibleSuggestion): string {\n return formatMessage(this.text.cardMenu, { key: s.key });\n }\n\n protected async onMenu(s: SpineVisibleSuggestion, id: string): Promise<void> {\n const value = id === 'copy-key' ? s.key : this.linkOf(s);\n try {\n await navigator.clipboard.writeText(value);\n this.toast.success(id === 'copy-key' ? this.text.keyCopied : this.text.linkCopied);\n } catch {\n this.toast.error(this.text.copyError);\n }\n }\n\n /** O link que abre a página já na sugestão (\"…/sugestoes?sugestao=SUG-12\"), respeitando o `<base href>` do app. */\n private linkOf(s: SpineVisibleSuggestion): string {\n const path = `${SPINE_SUGGESTIONS_PAGE_PATH.slice(1)}?${SPINE_SUGGESTION_PAGE_PARAM}=${encodeURIComponent(s.key)}`;\n try {\n return new URL(path, document.baseURI).toString();\n } catch {\n return `/${path}`;\n }\n }\n\n\n protected personName(p: SpineSuggestionPerson | null | undefined): string {\n return p?.name || p?.username || this.text.removedAuthor;\n }\n\n protected votesText(count: number): string {\n return pluralMessage(this.text.votes, count, this.messages.meta.locale);\n }\n\n protected unreadText(count: number): string {\n return pluralMessage(this.text.unread, count, this.messages.meta.locale);\n }\n\n protected supportText(s: SpineVisibleSuggestion): string {\n if (s.mine) return this.votesText(s.votes);\n return formatMessage(s.voted ? this.text.supported : this.text.support, { count: s.votes });\n }\n\n protected mergedFromText(key: string, target: string): string {\n return formatMessage(this.text.mergedFrom, { key, target });\n }\n\n /** \"há 3 dias\", \"ontem\", \"há 2 horas\" (Intl.RelativeTimeFormat no idioma do catálogo). */\n protected age(iso: string | null | undefined): string {\n if (!iso) return '';\n const seconds = Math.round((Date.now() - new Date(iso).getTime()) / 1000);\n try {\n const rtf = new Intl.RelativeTimeFormat(this.messages.meta.locale, { numeric: 'auto' });\n for (const [unit, size] of AGES) if (Math.abs(seconds) >= size) return rtf.format(-Math.floor(seconds / size), unit);\n return rtf.format(0, 'minute');\n } catch {\n return this.date(iso);\n }\n }\n\n protected date(iso: string): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, {\n dateStyle: 'short', timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone(),\n }).format(new Date(iso));\n } catch {\n return iso.slice(0, 16).replace('T', ' ');\n }\n }\n}\n","<section class=\"ssp\" [attr.aria-label]=\"page.listLabel\">\n <!-- Cabeçalho numa linha: o recorte, quantas (e quantas em cada status), a ordem e o \"Sugerir melhoria\". -->\n <header class=\"ssp__head\">\n <h2 class=\"ssp__heading\">{{ heading() }}</h2>\n <span class=\"ssp__count\" aria-live=\"polite\">{{ countText() }}</span>\n @for (part of statusParts(); track part.status) {\n <span class=\"ssp__status-part\" [attr.data-status]=\"part.status\"><span class=\"ssp__dot\" aria-hidden=\"true\"></span>{{ part.text }}</span>\n }\n <span class=\"ssp__spacer\"></span>\n <hm-segmented-control class=\"ssp__sort\" size=\"small\" [label]=\"text.sort\" [options]=\"sortOptions\" [value]=\"sort()\"\n (valueChange)=\"onSort($event)\" />\n <hm-button size=\"small\" icon=\"plus\" (clicked)=\"suggest()\">{{ text.button }}</hm-button>\n </header>\n\n <!-- Busca e o recorte (por que a pessoa vê, com as contagens do servidor) na mesma linha. -->\n <div class=\"ssp__bar\">\n <hm-search-field class=\"ssp__search\" [label]=\"text.appSearch\" labelHidden [placeholder]=\"text.appSearch\"\n [landmark]=\"false\" [debounce]=\"300\" [value]=\"search()\" (search)=\"onSearch($event)\" />\n <hm-segmented-control class=\"ssp__scope\" size=\"small\" emphasis=\"action\" [label]=\"page.reasonFilter\"\n [options]=\"scopeOptions()\" [value]=\"scope()\" (valueChange)=\"pickScope($event)\" />\n </div>\n\n <!-- Filtros do Trismegisto: um botão por campo e, aplicados, as fichas removíveis com \"Limpar tudo\". -->\n <hm-filter-bar class=\"ssp__filters\" [label]=\"page.filtersLabel\" [filters]=\"filterFields()\" [value]=\"filterValue()\"\n (valueChange)=\"onFilters($event)\" />\n\n @if (error()) {\n <hm-alert variant=\"error\">{{ error() }}</hm-alert>\n } @else if (!loading() && list().length === 0) {\n @if (filtered()) {\n <hm-empty icon=\"filter\" [heading]=\"page.emptyFiltered\" />\n } @else {\n <hm-empty icon=\"lightbulb\" [heading]=\"page.empty\" [description]=\"page.emptyHint\" />\n }\n }\n\n <ul class=\"ssp__list\" [attr.aria-busy]=\"loading() ? 'true' : null\">\n @for (s of list(); track s.id) {\n <li class=\"ssp__item\" [class.ssp__item--open]=\"selected()?.id === s.id\" [class.ssp__item--unread]=\"s.unread > 0\">\n <div class=\"ssp__item-meta\">\n <span class=\"ssp__key\">{{ s.key }}</span>\n <span class=\"ssp__status\" [attr.data-status]=\"s.status\"><span class=\"ssp__dot\" aria-hidden=\"true\"></span>{{ text.statuses[s.status] }}</span>\n <span class=\"ssp__kind\" [attr.data-kind]=\"s.kind\"><hm-icon [shape]=\"kindIcons[s.kind]\" />{{ text.kinds[s.kind] }}</span>\n @if (s.unread) { <span class=\"ssp__unread\">{{ unreadText(s.unread) }}</span> }\n <span class=\"ssp__menu\">\n <hm-menu-button size=\"small\" icon=\"ellipsis-vertical\" [showArrow]=\"false\" align=\"end\" [label]=\"menuLabel(s)\"\n [items]=\"itemMenu\" (chosen)=\"onMenu(s, $event)\" />\n </span>\n </div>\n <!-- O título é o botão que abre a sugestão na gaveta. -->\n <button type=\"button\" class=\"ssp__item-title\" aria-haspopup=\"dialog\" (click)=\"open(s)\">{{ s.title }}</button>\n <div class=\"ssp__item-screen\">\n <hm-icon [shape]=\"s.screen.new ? 'plus' : 'application'\" />\n @if (screenModule(s); as module) {\n <span class=\"ssp__screen-module\">{{ module }}</span><hm-icon class=\"ssp__screen-sep\" shape=\"angle-right\" />\n }\n <strong class=\"ssp__screen-name\">{{ screenShort(s) }}</strong>\n @if (s.screen.new) { <span class=\"ssp__new-screen\">{{ text.newScreenTag }}</span> }\n @if (s.waiting_on && s.status !== 'concluida' && s.status !== 'recusada') {\n <hm-tag [name]=\"text.waiting[s.waiting_on]\" [color]=\"waitingColors[s.waiting_on]\" />\n }\n </div>\n @if (excerptOf(s); as ex) {\n <p class=\"ssp__excerpt\">{{ ex }}</p>\n }\n <div class=\"ssp__item-foot\">\n <hm-account-avatar size=\"small\" [name]=\"personName(s.author)\" [imageUrl]=\"s.author?.picture\" />\n <span class=\"ssp__byline\">\n <span class=\"ssp__byline-name\">{{ personName(s.author) }}</span>\n <time [attr.datetime]=\"s.last_activity_at || s.updated_at\">{{ age(s.last_activity_at || s.updated_at) }}</time>\n </span>\n <span class=\"ssp__counts\">\n @if (s.can_comment) {\n <span class=\"ssp__count-item\" [attr.title]=\"commentsText(s.comments_count)\">\n <hm-icon shape=\"comment-message\" /><span aria-hidden=\"true\">{{ s.comments_count }}</span><span class=\"ssp__sr\">{{ commentsText(s.comments_count) }}</span>\n </span>\n }\n <!-- Apoiar direto no cartão (a própria só mostra a contagem: ninguém apoia o que pediu). -->\n @if (s.mine) {\n <span class=\"ssp__count-item\" [attr.title]=\"votesText(s.votes)\">\n <hm-icon shape=\"thumbs-up\" /><span aria-hidden=\"true\">{{ s.votes }}</span><span class=\"ssp__sr\">{{ votesText(s.votes) }}</span>\n </span>\n } @else {\n <hm-button class=\"ssp__support\" size=\"small\" emphasis=\"minimal\" icon=\"thumbs-up\" toggle [pressed]=\"s.voted\"\n [disabled]=\"isVoting(s.id)\" [attr.title]=\"supportText(s)\" (clicked)=\"toggleSupport(s)\">\n <span aria-hidden=\"true\">{{ s.votes }}</span><span class=\"ssp__sr\">{{ supportText(s) }}</span>\n </hm-button>\n }\n </span>\n </div>\n </li>\n }\n </ul>\n\n @if (total() > pagination().size) {\n <hm-paginator variant=\"simple\" [label]=\"text.appPagination\" [state]=\"pagination()\" [totalItems]=\"total()\"\n [sizes]=\"[20, 50]\" (stateChanged)=\"onPage($event)\" />\n }\n</section>\n\n<!-- A sugestão aberta: gaveta com as abas Conversa (o chat) e Detalhes. -->\n<hm-drawer [heading]=\"drawerHeading()\" size=\"large\" [open]=\"panelOpen()\" (openChange)=\"$event || close()\">\n @if (detailError()) {\n <hm-alert variant=\"error\">{{ detailError() }}</hm-alert>\n } @else if (selected(); as s) {\n <div class=\"ssp-detail\" [class.ssp-detail--alert]=\"waitingOnMe()\">\n <div class=\"ssp__item-meta\">\n <span class=\"ssp__key\">{{ s.key }}</span>\n <span class=\"ssp__status\" [attr.data-status]=\"s.status\"><span class=\"ssp__dot\" aria-hidden=\"true\"></span>{{ text.statuses[s.status] }}</span>\n <span class=\"ssp__kind\" [attr.data-kind]=\"s.kind\"><hm-icon [shape]=\"kindIcons[s.kind]\" />{{ text.kinds[s.kind] }}</span>\n @if (s.archived) { <hm-tag [name]=\"text.archivedTag\" /> }\n @if (s.waiting_on && s.status !== 'concluida' && s.status !== 'recusada') {\n <hm-tag [name]=\"text.waiting[s.waiting_on]\" [color]=\"waitingColors[s.waiting_on]\" />\n }\n <!-- O apoio fica fora das abas: vale para as duas. -->\n <hm-button class=\"ssp-detail__support\" size=\"small\" emphasis=\"medium\" icon=\"thumbs-up\" toggle [pressed]=\"s.voted\"\n [disabled]=\"s.mine || isVoting(s.id)\" (clicked)=\"toggleSupport(s)\">{{ supportText(s) }}</hm-button>\n </div>\n @if (waitingOnMe()) {\n <hm-alert variant=\"warning\">{{ page.waitingYou }}</hm-alert>\n }\n\n <hm-tabs [label]=\"page.details\" [active]=\"tab()\" (activeChange)=\"pickTab($event)\">\n <hm-tab id=\"details\" [label]=\"page.details\">\n <div class=\"ssp-detail__body\">\n @if (!s.can_comment) {\n <hm-alert variant=\"info\">{{ page.readOnly }}</hm-alert>\n }\n @if (s.description_html) {\n <hm-rich-text class=\"ssp-detail__description\" [label]=\"text.description\" labelHidden readonly hideToolbar [value]=\"s.description_html\" />\n } @else if (s.description) {\n <p class=\"ssp-detail__description\">{{ s.description }}</p>\n } @else {\n <p class=\"ssp__hint\">{{ text.noDescription }}</p>\n }\n\n <dl class=\"ssp-detail__facts\">\n <dt>{{ text.screenOrigin }}</dt>\n <dd>\n @if (s.screen.new) { <span class=\"ssp__new-screen\">{{ text.newScreenTag }}</span> }\n {{ screenText(s) }}\n </dd>\n <dt>{{ text.requestedBy }}</dt>\n <dd>\n <hm-account-avatar size=\"small\" [name]=\"personName(s.author)\" [imageUrl]=\"s.author?.picture\" />\n {{ personName(s.author) }} · {{ age(s.created_at) }}\n </dd>\n <!-- Os grupos em linha, no modelo dos rótulos (o que não cabe vira \"+N\"), como no quadro da equipe. -->\n <dt>{{ page.groups }}</dt>\n <dd class=\"ssp-detail__groups\"><spine-tag-row [label]=\"page.groups\" [items]=\"s.groups\" [empty]=\"text.noGroups\" /></dd>\n <dt>{{ text.assignees }}</dt>\n <dd>\n @for (p of s.assignees; track p.user_id) {\n <hm-account-avatar size=\"small\" [name]=\"personName(p)\" [imageUrl]=\"p.picture\" />\n <span>{{ personName(p) }}</span>\n } @empty { <span class=\"ssp__hint\">{{ text.nobody }}</span> }\n </dd>\n <dt>{{ text.createdAt }}</dt>\n <dd>{{ date(s.created_at) }}</dd>\n </dl>\n\n @for (r of s.reasons; track r) {\n <p class=\"ssp__hint\">{{ page.reasonHints[r] }}</p>\n }\n @for (m of s.merged_from; track m.id) {\n <p class=\"ssp-detail__merged\">{{ mergedFromText(m.key, s.key) }}</p>\n }\n\n </div>\n </hm-tab>\n <!-- A conversa é de quem pediu, foi agrupado ou participa (can_comment); quem só vê pelo grupo fica com os Detalhes. -->\n @if (s.can_comment) {\n <hm-tab id=\"conversation\" [label]=\"page.conversation\" [count]=\"s.comments_count || null\">\n @if (conversation()?.error) {\n <hm-alert variant=\"error\">{{ page.conversationError }}</hm-alert>\n }\n <!-- A conversa em chat: à direita o que a pessoa escreveu como quem pede; o resto (inclusive ela mesma como\n equipe) à esquerda, com o papel no cabeçalho. -->\n <spine-suggestion-chat class=\"ssp-detail__chat\" side=\"solicitante\" [me]=\"me()\" [items]=\"chatItems()\"\n [label]=\"page.conversation\" [empty]=\"page.conversationEmpty\"\n [hasMore]=\"(conversation()?.messages?.length ?? 0) < (conversation()?.total ?? 0)\"\n [loading]=\"!!conversation()?.loading\"\n [composerLabel]=\"page.reply\" [placeholder]=\"page.replyPlaceholder\" [sendLabel]=\"page.replySend\"\n [sending]=\"sending()\" [(draft)]=\"reply\" (loadHistory)=\"loadOlder()\" (send)=\"send($event)\" />\n </hm-tab>\n }\n\n </hm-tabs>\n </div>\n } @else {\n <p class=\"ssp__hint\">{{ page.pickOne }}</p>\n }\n</hm-drawer>\n\n<spine-suggestions-dialog [(view)]=\"dialog\" [onPage]=\"true\" (created)=\"onCreated($event)\" />\n"],"names":[],"mappings":"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"}