@trismegisto/spine 3.3.4 → 3.3.6

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.
Files changed (70) hide show
  1. package/README.md +4 -2
  2. package/fesm2022/trismegisto-spine-audit.mjs +20 -2
  3. package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
  4. package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-D8HUpZtA.mjs → trismegisto-spine-auto-service-auto-service-audit.component-CszXNvSs.mjs} +2 -2
  5. package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-D8HUpZtA.mjs.map → trismegisto-spine-auto-service-auto-service-audit.component-CszXNvSs.mjs.map} +1 -1
  6. package/fesm2022/{trismegisto-spine-auto-service-auto-service-client-picker.component-NawbfdLW.mjs → trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs} +7 -3
  7. package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs.map +1 -0
  8. package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs → trismegisto-spine-auto-service-auto-service-client.component-Dg3mJrpz.mjs} +24 -5
  9. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-Dg3mJrpz.mjs.map +1 -0
  10. package/fesm2022/{trismegisto-spine-auto-service-auto-service-delete-CV_t9vxm.mjs → trismegisto-spine-auto-service-auto-service-delete-BWY5G-xe.mjs} +2 -2
  11. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-BWY5G-xe.mjs.map +1 -0
  12. package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs → trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs} +21 -5
  13. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs.map +1 -0
  14. package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-DoyhkSYc.mjs → trismegisto-spine-auto-service-auto-service-login-attempts.component-CjxKYv-y.mjs} +2 -2
  15. package/fesm2022/{trismegisto-spine-auto-service-auto-service-login-attempts.component-DoyhkSYc.mjs.map → trismegisto-spine-auto-service-auto-service-login-attempts.component-CjxKYv-y.mjs.map} +1 -1
  16. package/fesm2022/{trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs → trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs} +21 -5
  17. package/fesm2022/trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs.map +1 -0
  18. package/fesm2022/{trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs → trismegisto-spine-auto-service-auto-service-ratings-page.component-CJRIDWXi.mjs} +22 -4
  19. package/fesm2022/trismegisto-spine-auto-service-auto-service-ratings-page.component-CJRIDWXi.mjs.map +1 -0
  20. package/fesm2022/{trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs → trismegisto-spine-auto-service-auto-service-suggestions-page.component-Bu8YX554.mjs} +46 -4
  21. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-Bu8YX554.mjs.map +1 -0
  22. package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs → trismegisto-spine-auto-service-auto-service.component-BLkLHp6J.mjs} +23 -5
  23. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLkLHp6J.mjs.map +1 -0
  24. package/fesm2022/{trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs → trismegisto-spine-auto-service-home.component-BYMiTZp6.mjs} +6 -3
  25. package/fesm2022/trismegisto-spine-auto-service-home.component-BYMiTZp6.mjs.map +1 -0
  26. package/fesm2022/trismegisto-spine-auto-service.mjs +10 -10
  27. package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
  28. package/fesm2022/trismegisto-spine-layout-ai-agent-chat.component-C5JljPYD.mjs +294 -0
  29. package/fesm2022/trismegisto-spine-layout-ai-agent-chat.component-C5JljPYD.mjs.map +1 -0
  30. package/fesm2022/{trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs → trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs} +18 -4
  31. package/fesm2022/trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs.map +1 -0
  32. package/fesm2022/{trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs → trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs} +1012 -57
  33. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs.map +1 -0
  34. package/fesm2022/trismegisto-spine-layout.mjs +1 -1
  35. package/fesm2022/trismegisto-spine-modal.mjs +4 -1
  36. package/fesm2022/trismegisto-spine-modal.mjs.map +1 -1
  37. package/fesm2022/trismegisto-spine-notification.mjs +1 -1
  38. package/fesm2022/trismegisto-spine-notification.mjs.map +1 -1
  39. package/fesm2022/trismegisto-spine-routing.mjs +2 -2
  40. package/fesm2022/trismegisto-spine-routing.mjs.map +1 -1
  41. package/fesm2022/trismegisto-spine-shell.mjs +2 -1
  42. package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
  43. package/fesm2022/trismegisto-spine-side-panel.mjs +4 -1
  44. package/fesm2022/trismegisto-spine-side-panel.mjs.map +1 -1
  45. package/fesm2022/trismegisto-spine.mjs +200 -69
  46. package/fesm2022/trismegisto-spine.mjs.map +1 -1
  47. package/package.json +6 -6
  48. package/types/trismegisto-spine-audit.d.ts +11 -4
  49. package/types/trismegisto-spine-audit.d.ts.map +1 -1
  50. package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
  51. package/types/trismegisto-spine-layout.d.ts +124 -105
  52. package/types/trismegisto-spine-layout.d.ts.map +1 -1
  53. package/types/trismegisto-spine-modal.d.ts +2 -1
  54. package/types/trismegisto-spine-modal.d.ts.map +1 -1
  55. package/types/trismegisto-spine-shell.d.ts.map +1 -1
  56. package/types/trismegisto-spine-side-panel.d.ts +2 -1
  57. package/types/trismegisto-spine-side-panel.d.ts.map +1 -1
  58. package/types/trismegisto-spine.d.ts +104 -28
  59. package/types/trismegisto-spine.d.ts.map +1 -1
  60. package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-NawbfdLW.mjs.map +0 -1
  61. package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs.map +0 -1
  62. package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CV_t9vxm.mjs.map +0 -1
  63. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs.map +0 -1
  64. package/fesm2022/trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs.map +0 -1
  65. package/fesm2022/trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs.map +0 -1
  66. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs.map +0 -1
  67. package/fesm2022/trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs.map +0 -1
  68. package/fesm2022/trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs.map +0 -1
  69. package/fesm2022/trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs.map +0 -1
  70. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-auto-service-auto-service-ratings-page.component-CJRIDWXi.mjs","sources":["../../../projects/ui/auto-service/src/tabs/auto-service-ratings/auto-service-ratings.service.ts","../../../projects/ui/auto-service/src/tabs/auto-service-ratings/ratings-shared.ts","../../../projects/ui/auto-service/src/tabs/auto-service-ratings/ratings-table.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-ratings/ratings-table.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-ratings/ratings-trend.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-ratings/ratings-trend.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-ratings/auto-service-ratings.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-ratings/auto-service-ratings.component.html","../../../projects/ui/auto-service/src/pages/auto-service-ratings-page.component.ts"],"sourcesContent":["import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { urlPath } from '@trismegisto/primitives/html';\nimport { AUTO_SERVICE_CONFIG } from '../../auto-service.tokens';\n\n/** Média (0 a 10, uma casa), total, comentários e quantas de cada nota (`distribution[0]` = nota 0 ... `[10]` = 10). */\nexport interface RatingAggregate {\n average: number | null;\n total: number;\n comments: number;\n distribution: number[];\n}\n\n/** Uma semana da tendência: começo da semana (segunda, `YYYY-MM-DD`), média 0..10 (`null` sem nota) e o total. */\nexport interface RatingTrendPoint {\n week: string;\n average: number | null;\n total: number;\n}\n\n/**\n * Uma tela no resumo. Os campos opcionais vêm do servidor novo (ausentes num servidor antigo): o ícone e a área no menu\n * do client (`null` = a tela saiu do menu, ou o nível não tem nome) e a tendência semanal dentro do período.\n */\nexport interface ScreenRatingAggregate extends RatingAggregate {\n screen_path: string;\n screen_label: string | null;\n screen_icon?: string | null;\n /** Os níveis do menu acima da tela (\"Rede › Serviços\"). */\n screen_area?: string | null;\n screen_area_icon?: string | null;\n trend?: RatingTrendPoint[];\n}\n\n/** `GET /auto-service/:clientId/ratings/summary`. */\nexport interface RatingsSummary {\n app: RatingAggregate;\n screens: RatingAggregate;\n by_screen: ScreenRatingAggregate[];\n /** Média semana a semana da ferramenta e das telas juntas (servidor novo). */\n trend?: { app: RatingTrendPoint[]; screens: RatingTrendPoint[] };\n}\n\n/** Uma avaliação na lista (`GET /auto-service/:clientId/ratings`), com o autor e a foto. */\nexport interface RatingItem {\n id: string;\n scope: 'app' | 'screen';\n screen_path: string | null;\n screen_label: string | null;\n /** 0 a 10 (5 estrelas com meia). */\n score: number;\n comment: string | null;\n created_at: string;\n updated_at: string;\n user_id: string;\n user_username: string | null;\n user_name: string | null;\n user_email: string | null;\n user_picture: string | null;\n}\n\nexport interface RatingsPage { items: RatingItem[]; total: number; page: number; limit: number }\n\nexport interface RatingsQuery {\n from?: string;\n scope?: 'app' | 'screen';\n screen?: string;\n /** Só esta nota (0 a 10). */\n score?: number;\n comment?: boolean;\n page?: number;\n limit?: number;\n}\n\n/**\n * Leitura das avaliações do app no auto-serviço (`{adminApi}/auto-service/:clientId/ratings*`): o servidor recorta\n * pelo client da URL e exige o grupo de administração com o crachá Administrador. Próprio da aba (o\n * `AutoServiceService` é o das outras telas): fornecido pelo componente.\n */\n@Injectable()\nexport class AutoServiceRatingsService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n private readonly config = inject(AUTO_SERVICE_CONFIG);\n\n private url(clientId: string, rest: string): string {\n return `${this.config.adminApi}/auto-service${urlPath`/${clientId}`}${rest}`;\n }\n\n private get headers(): HttpHeaders {\n return new HttpHeaders({ 'x-access-token': this.auth.getToken() ?? '' });\n }\n\n summary(clientId: string, from?: string): Promise<RatingsSummary> {\n const params = from ? new HttpParams().set('from', from) : new HttpParams();\n return firstValueFrom(this.http.get<RatingsSummary>(this.url(clientId, '/ratings/summary'), { headers: this.headers, params }));\n }\n\n list(clientId: string, q: RatingsQuery): Promise<RatingsPage> {\n let params = new HttpParams();\n if (q.from) params = params.set('from', q.from);\n if (q.scope) params = params.set('scope', q.scope);\n if (q.screen) params = params.set('screen', q.screen);\n if (q.score != null) params = params.set('score', String(q.score));\n if (q.comment) params = params.set('comment', 'true');\n if (q.page) params = params.set('page', String(q.page));\n if (q.limit) params = params.set('limit', String(q.limit));\n return firstValueFrom(this.http.get<RatingsPage>(this.url(clientId, '/ratings'), { headers: this.headers, params }));\n }\n}\n","import { RatingAggregate, RatingTrendPoint, ScreenRatingAggregate } from './auto-service-ratings.service';\n\nexport type RatingSort = 'worst' | 'best' | 'most';\n/** Faixa da nota no filtro da tabela: ruim (< 5), média (5 a 6,9), boa (7 ou mais). */\nexport type RatingBand = 'bad' | 'mid' | 'good';\n\n/** Ícone de uma tela que não está mais no menu (ou de um servidor que ainda não manda `screen_icon`). */\nexport const RATINGS_SCREEN_FALLBACK_ICON = 'grid-layout';\n/** Ícone de uma área sem ícone no menu. */\nexport const RATINGS_AREA_FALLBACK_ICON = 'tree-view';\n/** Quantas cores categóricas o tema tem (`--hm-data-categorical-1..8`): o quadrado do ícone de cada tela. */\nconst HUES = 8;\n\n/** Faixa de cor de uma nota ou média de 0 a 10: abaixo de 5 ruim, abaixo de 7 regular, de 7 para cima boa. */\nexport function ratingTone(average: number | null): 'danger' | 'warning' | 'success' | 'neutral' {\n if (average === null) return 'neutral';\n if (average < 5) return 'danger';\n if (average < 7) return 'warning';\n return 'success';\n}\n\nexport function ratingBand(average: number | null): RatingBand | null {\n const tone = ratingTone(average);\n return tone === 'danger' ? 'bad' : tone === 'warning' ? 'mid' : tone === 'success' ? 'good' : null;\n}\n\n/** Algo ordenável pela média e pela contagem, com uma chave de desempate (caminho da tela, nome da área). */\nexport interface RankedRow { key: string; agg: RatingAggregate }\n\n/** Na ordem pedida; empate pela contagem (mais avaliada primeiro) e pela chave. */\nexport function sortRows<T extends RankedRow>(rows: readonly T[], sort: RatingSort): T[] {\n const avg = (r: T) => r.agg.average ?? 0;\n const tie = (a: T, b: T) => b.agg.total - a.agg.total || a.key.localeCompare(b.key);\n return [...rows].sort((a, b) => {\n if (sort === 'worst') return avg(a) - avg(b) || tie(a, b);\n if (sort === 'best') return avg(b) - avg(a) || tie(a, b);\n return tie(a, b);\n });\n}\n\n/** Telas na ordem pedida (mesma regra de `sortRows`, pela rota). */\nexport function sortScreens(screens: readonly ScreenRatingAggregate[], sort: RatingSort): ScreenRatingAggregate[] {\n return sortRows(screens.map((s) => ({ key: s.screen_path, agg: s, s })), sort).map((r) => r.s);\n}\n\n/**\n * Cor do quadrado do ícone (1..8, a paleta categórica do tema): sai da chave (caminho da tela, nome da área), então a\n * mesma tela tem a mesma cor em qualquer ordem e filtro -- a cor segue a tela, nunca a posição na lista.\n */\nexport function screenHue(key: string | null | undefined): number {\n let h = 0;\n for (const ch of key ?? '') h = (h * 31 + ch.charCodeAt(0)) >>> 0;\n return (h % HUES) + 1;\n}\n\n/** Área da tela: a do menu (servidor) ou, sem ela, a trilha guardada com a avaliação menos o último degrau. */\nexport function areaOf(s: Pick<ScreenRatingAggregate, 'screen_area' | 'screen_label'>): string | null {\n if (s.screen_area) return s.screen_area;\n const parts = (s.screen_label ?? '').split('›').map((p) => p.trim()).filter(Boolean);\n return parts.length > 1 ? parts.slice(0, -1).join(' › ') : null;\n}\n\n/** Soma agregados (a média sai das contagens somadas, ponderada; uma casa). */\nexport function combineAggregates(parts: readonly RatingAggregate[]): RatingAggregate {\n const distribution = Array.from({ length: 11 }, () => 0);\n for (const p of parts) p.distribution.forEach((n, i) => { distribution[i] = (distribution[i] ?? 0) + n; });\n const total = distribution.reduce((a, n) => a + n, 0);\n const sum = distribution.reduce((a, n, score) => a + n * score, 0);\n return {\n average: total ? Math.round((sum / total) * 10) / 10 : null,\n total,\n comments: parts.reduce((a, p) => a + p.comments, 0),\n distribution,\n };\n}\n\n/** Soma séries semanais (mesmas semanas): média ponderada pelo total de cada semana. */\nexport function combineTrends(series: readonly (readonly RatingTrendPoint[] | undefined)[]): RatingTrendPoint[] {\n const by = new Map<string, { sum: number; total: number }>();\n for (const s of series) {\n for (const p of s ?? []) {\n const cur = by.get(p.week) ?? { sum: 0, total: 0 };\n by.set(p.week, { sum: cur.sum + (p.average ?? 0) * p.total, total: cur.total + p.total });\n }\n }\n return [...by.keys()].sort().map((week) => {\n const v = by.get(week)!;\n return { week, total: v.total, average: v.total ? Math.round((v.sum / v.total) * 10) / 10 : null };\n });\n}\n\n/** Centro da semana `i` de `n` numa largura `width` (cada semana é uma coluna do mesmo tamanho). */\nexport const weekX = (i: number, n: number, width: number) => ((i + 0.5) * width) / n;\n\n/**\n * A linha (0..10 na vertical) num quadro `width` x `height`, ligando as semanas que têm nota. Semana sem avaliação não\n * quebra a linha: com poucas avaliações por semana quase toda semana tem buraco, e a linha picotada não dizia nada. Só\n * uma semana com nota vira um traço curto (`dot`), para não sumir. Devolve lista (vazia sem nota) para o template.\n */\nexport function linePaths(points: readonly RatingTrendPoint[], width: number, height: number, dot = 1.5): string[] {\n const n = points.length;\n const y = (v: number) => height - (v / 10) * height;\n let line: [number, number][] = points.flatMap((p, i) => (p.average == null ? [] : [[weekX(i, n, width), y(p.average)] as [number, number]]));\n if (!line.length) return [];\n if (line.length === 1) line = [[line[0][0] - dot, line[0][1]], [line[0][0] + dot, line[0][1]]];\n return [line.map(([x, yy]) => `${round(x)},${round(yy)}`).join(' ')];\n}\n\nconst round = (v: number) => Math.round(v * 100) / 100;\n\n/** Primeira e última média com nota de uma série (a tendência resumida em texto); `null` sem nenhuma. */\nexport function trendEnds(points: readonly RatingTrendPoint[] | undefined): { first: number; last: number } | null {\n const valued = (points ?? []).filter((p) => p.average != null);\n return valued.length ? { first: valued[0].average!, last: valued.at(-1)!.average! } : null;\n}\n\n/** Quanto tempo atrás, para a lista curta: minutos/horas no mesmo dia, \"ontem\", ou a data. */\nexport type RelativeWhen =\n | { kind: 'now' }\n | { kind: 'minutes' | 'hours'; value: number }\n | { kind: 'yesterday' }\n | { kind: 'date' };\n\nexport function relativeWhen(date: Date, now = new Date()): RelativeWhen {\n const diff = now.getTime() - date.getTime();\n const sameDay = date.toDateString() === now.toDateString();\n if (diff < 60_000) return { kind: 'now' };\n if (sameDay && diff < 3_600_000) return { kind: 'minutes', value: Math.floor(diff / 60_000) };\n if (sameDay) return { kind: 'hours', value: Math.floor(diff / 3_600_000) };\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n if (date.toDateString() === yesterday.toDateString()) return { kind: 'yesterday' };\n return { kind: 'date' };\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, model, output, signal } from '@angular/core';\nimport { ComboboxComponent } from '@trismegisto/angular/combobox';\nimport { IconComponent } from '@trismegisto/angular/icon';\nimport { PaginatorComponent } from '@trismegisto/angular/paginator';\nimport { SearchFieldComponent } from '@trismegisto/angular/search-field';\nimport { SegmentedControlComponent, SegmentedOption } from '@trismegisto/angular/segmented-control';\nimport { ComboboxOption } from '@trismegisto/primitives/combobox';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';\nimport { PaginationState } from '@trismegisto/primitives/pagination';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SpineRatingStarsComponent } from '@trismegisto/spine/layout';\nimport { RatingAggregate, RatingTrendPoint } from './auto-service-ratings.service';\nimport {\n RATINGS_AREA_FALLBACK_ICON, RatingBand, RatingSort, linePaths, ratingBand, ratingTone, screenHue, sortRows, trendEnds,\n} from './ratings-shared';\n\n/** Uma linha da tabela: uma tela (modo `screens`) ou uma área com as telas dela somadas (modo `areas`). */\nexport interface RatingsTableRow {\n /** Caminho da tela ou nome da área (chave, desempate e cor do ícone). */\n key: string;\n name: string;\n /** Embaixo do nome, em muted: a rota da tela. */\n sub: string | null;\n icon: string;\n area: string | null;\n areaIcon: string | null;\n agg: RatingAggregate;\n trend: RatingTrendPoint[] | undefined;\n /** Modo `areas`: quantas telas avaliadas a área tem. */\n screens?: number;\n}\n\nexport const RATINGS_TABLE_PAGE_SIZE = 10;\n/** Valor do filtro de área para as telas sem área (o vazio já é \"todas\"). */\nconst NO_AREA = '__none__';\nconst SPARK_W = 64;\nconst SPARK_H = 20;\n\n/**\n * Tabela compacta das telas (ou das áreas) na aba do resumo: busca, filtro de área (telas) e de faixa da nota,\n * ordenação (piores primeiro por padrão: é onde agir) e paginação no navegador -- o resumo já traz todas as telas.\n * Clicar numa linha emite `picked` (quem usa decide: abrir as avaliações da tela, filtrar pela área).\n */\n@Component({\n selector: 'spine-ratings-table',\n imports: [ComboboxComponent, IconComponent, PaginatorComponent, SearchFieldComponent, SegmentedControlComponent, SpineRatingStarsComponent],\n templateUrl: './ratings-table.component.html',\n styleUrl: './ratings-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RatingsTableComponent {\n readonly mode = input<'screens' | 'areas'>('screens');\n readonly rows = input.required<readonly RatingsTableRow[]>();\n /** Filtro de área (modo `screens`); quem usa pode preencher (clicar numa área). */\n readonly area = model('');\n /** Linha marcada (a tela cujas avaliações estão abertas). */\n readonly selected = input<string | null>(null);\n readonly picked = output<RatingsTableRow>();\n\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.ratings;\n private readonly locale = this.messages.meta.locale;\n protected readonly areaFallback = RATINGS_AREA_FALLBACK_ICON;\n\n protected readonly search = signal('');\n protected readonly band = signal<'' | RatingBand>('');\n protected readonly sort = signal<RatingSort>('worst');\n protected readonly pageState = signal<PaginationState>({ page: 1, size: RATINGS_TABLE_PAGE_SIZE });\n\n protected readonly sortOptions = computed<SegmentedOption<RatingSort>[]>(() =>\n (['worst', 'best', 'most'] as RatingSort[]).map((value) => ({ value, label: this.text.sortsShort[value] })));\n protected readonly bandOptions = computed<ComboboxOption[]>(() => [\n { value: '', label: this.text.bands.all },\n ...(['bad', 'mid', 'good'] as RatingBand[]).map((value) => ({ value, label: this.text.bands[value] })),\n ]);\n protected readonly areaOptions = computed<ComboboxOption[]>(() => {\n const names = [...new Set(this.rows().map((r) => r.area ?? ''))].sort((a, b) => a.localeCompare(b));\n return [\n { value: '', label: this.text.allAreas },\n ...names.map((n) => ({ value: n || NO_AREA, label: n || this.text.noArea })),\n ];\n });\n\n protected readonly filtered = computed(() => {\n const q = this.search().trim().toLocaleLowerCase(this.locale);\n const band = this.band();\n const area = this.mode() === 'screens' ? this.area() : '';\n const rows = this.rows().filter((r) =>\n (!q || `${r.name} ${r.sub ?? ''} ${r.area ?? ''}`.toLocaleLowerCase(this.locale).includes(q)) &&\n (!band || ratingBand(r.agg.average) === band) &&\n (!area || (area === NO_AREA ? !r.area : r.area === area)));\n return sortRows(rows, this.sort());\n });\n protected readonly page = computed(() => {\n const { page, size } = this.pageState();\n return this.filtered().slice((page - 1) * size, page * size);\n });\n\n private readonly averageFormat = new Intl.NumberFormat(this.locale, { minimumFractionDigits: 1, maximumFractionDigits: 1 });\n private readonly numberFormat = new Intl.NumberFormat(this.locale, { maximumFractionDigits: 1 });\n\n protected setSearch(v: string): void { this.search.set(v); this.toFirstPage(); }\n protected setBand(v: string): void { this.band.set(v as '' | RatingBand); this.toFirstPage(); }\n protected setArea(v: string): void { this.area.set(v); this.toFirstPage(); }\n protected setSort(v: string): void { this.sort.set(v as RatingSort); this.toFirstPage(); }\n protected onPage(state: PaginationState): void { this.pageState.set(state); }\n private toFirstPage(): void { this.pageState.update((s) => ({ ...s, page: 1 })); }\n\n protected pick(row: RatingsTableRow): void { this.picked.emit(row); }\n\n protected hue(row: RatingsTableRow): number { return screenHue(row.key); }\n protected tone(row: RatingsTableRow): string { return ratingTone(row.agg.average); }\n protected figure(a: RatingAggregate): string { return a.average == null ? '—' : this.averageFormat.format(a.average); }\n protected scoreOf(v: number): string { return formatMessage(this.text.scoreOf, { value: this.numberFormat.format(v) }); }\n\n protected rowLabel(row: RatingsTableRow): string {\n return formatMessage(this.mode() === 'screens' ? this.text.filterByScreen : this.text.filterByArea, { screen: row.name, area: row.name });\n }\n\n protected screensCount(n: number): string { return pluralMessage(this.text.screensCount, n, this.locale); }\n\n /** Sparkline: a média semana a semana, na cor da faixa da média do período. */\n protected spark(row: RatingsTableRow): string[] { return linePaths(row.trend ?? [], SPARK_W, SPARK_H); }\n\n /** O que a sparkline diz, para o leitor: \"Média por semana: de 6 para 7,5\". */\n protected sparkLabel(row: RatingsTableRow): string {\n const ends = trendEnds(row.trend);\n return ends\n ? formatMessage(this.text.trendOf, { first: this.numberFormat.format(ends.first), last: this.numberFormat.format(ends.last) })\n : this.text.trendNone;\n }\n}\n","<div class=\"rt\">\n <div class=\"rt__controls\">\n <hm-search-field\n class=\"rt__search\"\n size=\"small\"\n labelHidden\n [landmark]=\"false\"\n [label]=\"mode() === 'screens' ? text.searchScreensLabel : text.searchAreasLabel\"\n [placeholder]=\"mode() === 'screens' ? text.searchScreens : text.searchAreas\"\n [value]=\"search()\"\n (valueChange)=\"setSearch($event)\"\n />\n @if (mode() === 'screens') {\n <hm-combobox class=\"rt__filter\" size=\"small\" labelHidden [label]=\"text.filterArea\" [options]=\"areaOptions()\" [value]=\"area()\" (valueChange)=\"setArea($event)\" />\n }\n <hm-combobox class=\"rt__filter\" size=\"small\" labelHidden [label]=\"text.bandFilter\" [options]=\"bandOptions()\" [value]=\"band()\" (valueChange)=\"setBand($event)\" />\n <hm-segmented-control class=\"rt__sort\" size=\"small\" [label]=\"text.sort\" [options]=\"sortOptions()\" [value]=\"sort()\" (valueChange)=\"setSort($event)\" />\n </div>\n\n @if (!filtered().length) {\n <p class=\"rt__empty\">{{ rows().length ? (mode() === 'screens' ? text.tableEmpty : text.areasEmpty) : text.noScreens }}</p>\n } @else {\n <div class=\"rt__scroll\">\n <table class=\"rt__table\">\n <thead>\n <tr>\n <th scope=\"col\">{{ mode() === 'screens' ? text.colScreen : text.colArea }}</th>\n @if (mode() === 'screens') {\n <th scope=\"col\" class=\"rt__c-area\">{{ text.colArea }}</th>\n } @else {\n <th scope=\"col\" class=\"rt__num rt__c-area\">{{ text.colScreens }}</th>\n }\n <th scope=\"col\">{{ text.colScore }}</th>\n <th scope=\"col\" class=\"rt__num\">{{ text.colTotal }}</th>\n <th scope=\"col\" class=\"rt__num rt__c-comments\">{{ text.colComments }}</th>\n <th scope=\"col\" class=\"rt__c-trend\">{{ text.colTrend }}</th>\n <th scope=\"col\" class=\"rt__c-chev\"><span class=\"rt__sr\">{{ text.colOpen }}</span></th>\n </tr>\n </thead>\n <tbody>\n @for (row of page(); track row.key) {\n <tr class=\"rt__row\" [class.rt__row--on]=\"selected() === row.key\" (click)=\"pick(row)\">\n <td>\n <div class=\"rt__name\">\n <span class=\"rt__glyph rt__glyph--c{{ hue(row) }}\" aria-hidden=\"true\"><hm-icon [shape]=\"row.icon\" /></span>\n <span class=\"rt__titles\">\n <!-- O botão é o alvo do teclado; o clique em qualquer lugar da linha sobe até o (click) da linha. -->\n <button type=\"button\" class=\"rt__link\" [attr.aria-pressed]=\"selected() === row.key\" [attr.title]=\"rowLabel(row)\">{{ row.name }}</button>\n @if (row.sub) { <span class=\"rt__sub\">{{ row.sub }}</span> }\n </span>\n </div>\n </td>\n @if (mode() === 'screens') {\n <td class=\"rt__c-area\">\n @if (row.area) {\n <span class=\"rt__area\"><hm-icon class=\"rt__area-icon\" [shape]=\"row.areaIcon || areaFallback\" aria-hidden=\"true\" /><span class=\"rt__area-name\">{{ row.area }}</span></span>\n } @else {\n <span class=\"rt__muted\">{{ text.noArea }}</span>\n }\n </td>\n } @else {\n <td class=\"rt__num rt__c-area\">{{ row.screens }}</td>\n }\n <td>\n <span class=\"rt__score\">\n <span class=\"rt__figure\" aria-hidden=\"true\">{{ figure(row.agg) }}</span>\n <spine-rating-stars size=\"small\" [readonly]=\"true\" [showValue]=\"false\" [value]=\"row.agg.average\" />\n </span>\n </td>\n <td class=\"rt__num\">{{ row.agg.total }}</td>\n <td class=\"rt__num rt__c-comments\">{{ row.agg.comments }}</td>\n <td class=\"rt__c-trend\">\n <span class=\"rt__spark-wrap\" role=\"img\" [attr.aria-label]=\"sparkLabel(row)\">\n @if (spark(row).length) {\n <svg class=\"rt__spark rt__spark--{{ tone(row) }}\" viewBox=\"0 0 64 20\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n <line class=\"rt__spark-mid\" x1=\"0\" x2=\"64\" y1=\"10\" y2=\"10\" />\n @for (d of spark(row); track $index) {\n <polyline [attr.points]=\"d\" />\n }\n </svg>\n } @else {\n <span class=\"rt__muted\" aria-hidden=\"true\">—</span>\n }\n </span>\n </td>\n <td class=\"rt__c-chev\"><hm-icon shape=\"angle-right\" aria-hidden=\"true\" /></td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n <hm-paginator\n class=\"rt__pager\"\n [label]=\"mode() === 'screens' ? text.tablePagination : text.areasPagination\"\n [state]=\"pageState()\"\n [totalItems]=\"filtered().length\"\n [sizes]=\"[10, 25, 50]\"\n (stateChanged)=\"onPage($event)\"\n />\n }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { TooltipDirective } from '@trismegisto/angular/tooltip';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { RatingTrendPoint } from './auto-service-ratings.service';\nimport { linePaths, weekX } from './ratings-shared';\n\n/** Uma série do gráfico: a cor é a categórica `hue` do tema (1, 2…), fixa pela série, nunca pela posição. */\nexport interface RatingsTrendSeries {\n id: string;\n label: string;\n hue: 1 | 2;\n points: readonly RatingTrendPoint[];\n}\n\n/** Largura e altura do quadro do SVG (esticado na largura; o traço não escala). */\nconst W = 100;\nconst H = 100;\n\n/**\n * A média semana a semana (0 a 10) da ferramenta e das telas, em SVG próprio (o spine não depende do pacote de\n * gráficos): grade recessiva em 0, 5 e 10, uma linha por série (a segunda tracejada, para não depender só da cor) com\n * os pontos, legenda sempre visível e, em cada semana, uma coluna focável com a dica \"Semana de 19/10: A ferramenta\n * 8,5 · As telas 6,2\" (mouse e teclado; o mesmo texto vai para o leitor). Semana sem nota quebra a linha.\n */\n@Component({\n selector: 'spine-ratings-trend',\n imports: [TooltipDirective],\n templateUrl: './ratings-trend.component.html',\n styleUrl: './ratings-trend.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class RatingsTrendComponent {\n readonly series = input.required<readonly RatingsTrendSeries[]>();\n\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.ratings;\n private readonly locale = this.messages.meta.locale;\n\n private readonly numberFormat = new Intl.NumberFormat(this.locale, { maximumFractionDigits: 1 });\n private readonly weekFormat = new Intl.DateTimeFormat(this.locale, { day: '2-digit', month: '2-digit', timeZone: 'UTC' });\n\n /** As semanas (as da primeira série; o servidor manda as mesmas em todas). */\n protected readonly weeks = computed(() => this.series()[0]?.points.map((p) => p.week) ?? []);\n protected readonly hasData = computed(() => this.series().some((s) => s.points.some((p) => p.total > 0)));\n\n protected readonly lines = computed(() =>\n this.series().map((s) => ({ ...s, paths: linePaths(s.points, W, H, 0), dots: this.dots(s) })));\n\n /** Rótulos do eixo x: todas as semanas até 6; mais que isso, uma sim, uma não (sempre a última). */\n protected readonly ticks = computed(() => {\n const weeks = this.weeks();\n const step = weeks.length > 6 ? 2 : 1;\n return weeks.map((w, i) => ((weeks.length - 1 - i) % step === 0 ? this.weekLabel(w) : ''));\n });\n\n /** Uma coluna por semana: a dica e o nome para o leitor. */\n protected readonly columns = computed(() => {\n const series = this.series();\n return this.weeks().map((week, i) => {\n const values = series.map((s) => {\n const p = s.points[i];\n const value = p?.average == null ? this.text.noScore : this.numberFormat.format(p.average);\n return formatMessage(this.text.trendValue, { series: s.label, value });\n });\n const total = series.reduce((a, s) => a + (s.points[i]?.total ?? 0), 0);\n return formatMessage(this.text.trendWeek, {\n week: this.weekLabel(week), values: values.join(' · '), count: pluralMessage(this.text.total, total, this.locale),\n });\n });\n });\n\n private dots(s: RatingsTrendSeries): { x: number; y: number }[] {\n const n = s.points.length;\n return s.points.flatMap((p, i) => (p.average == null ? [] : [{ x: (weekX(i, n, W) / W) * 100, y: (p.average / 10) * 100 }]));\n }\n\n private weekLabel(week: string): string {\n const d = new Date(`${week}T00:00:00Z`);\n return Number.isNaN(d.getTime()) ? week : this.weekFormat.format(d);\n }\n}\n","@if (!hasData()) {\n <p class=\"tr__empty\">{{ text.trendEmpty }}</p>\n} @else {\n <figure class=\"tr\">\n <figcaption class=\"tr__caption\">{{ text.trendCaption }}</figcaption>\n <ul class=\"tr__legend\">\n @for (s of lines(); track s.id) {\n <li class=\"tr__legend-item\"><span class=\"tr__swatch tr__swatch--{{ s.hue }}\" aria-hidden=\"true\"></span>{{ s.label }}</li>\n }\n </ul>\n\n <div class=\"tr__plot\">\n <div class=\"tr__y\" aria-hidden=\"true\"><span>10</span><span>5</span><span>0</span></div>\n <div class=\"tr__area\">\n <svg class=\"tr__svg\" viewBox=\"0 0 100 100\" preserveAspectRatio=\"none\" aria-hidden=\"true\">\n <line class=\"tr__grid\" x1=\"0\" x2=\"100\" y1=\"0\" y2=\"0\" />\n <line class=\"tr__grid\" x1=\"0\" x2=\"100\" y1=\"50\" y2=\"50\" />\n <line class=\"tr__grid tr__grid--base\" x1=\"0\" x2=\"100\" y1=\"100\" y2=\"100\" />\n @for (s of lines(); track s.id) {\n @for (d of s.paths; track $index) {\n <polyline class=\"tr__line tr__line--{{ s.hue }}\" [attr.points]=\"d\" />\n }\n }\n </svg>\n <!-- Pontos em HTML (o SVG estica na largura e deixaria o círculo oval). -->\n @for (s of lines(); track s.id) {\n @for (p of s.dots; track $index) {\n <span class=\"tr__dot tr__dot--{{ s.hue }}\" [style.left.%]=\"p.x\" [style.bottom.%]=\"p.y\" aria-hidden=\"true\"></span>\n }\n }\n <ol class=\"tr__cols\" [attr.aria-label]=\"text.trendCaption\">\n @for (label of columns(); track $index) {\n <li class=\"tr__col\" tabindex=\"0\" [attr.aria-label]=\"label\" [hmTooltip]=\"label\"></li>\n }\n </ol>\n </div>\n </div>\n <div class=\"tr__x\" aria-hidden=\"true\">\n @for (t of ticks(); track $index) {\n <span class=\"tr__tick\">{{ t }}</span>\n }\n </div>\n </figure>\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { ChangeDetectionStrategy, Component, ElementRef, computed, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\nimport { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';\nimport { AlertComponent } from '@trismegisto/angular/alert';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { CardComponent } from '@trismegisto/angular/card';\nimport { ComboboxComponent } from '@trismegisto/angular/combobox';\nimport { DrawerComponent } from '@trismegisto/angular/drawer';\nimport { IconComponent } from '@trismegisto/angular/icon';\nimport { MenuButtonComponent } from '@trismegisto/angular/menu-button';\nimport { PaginatorComponent } from '@trismegisto/angular/paginator';\nimport { SegmentedControlComponent, SegmentedOption } from '@trismegisto/angular/segmented-control';\nimport { SkeletonComponent } from '@trismegisto/angular/skeleton';\nimport { StateScreenComponent } from '@trismegisto/angular/state-screen';\nimport { SwitchComponent } from '@trismegisto/angular/switch';\nimport { TabComponent, TabContentDirective, TabsComponent } from '@trismegisto/angular/tabs';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { HermesToastService } from '@trismegisto/angular/toast';\nimport { TooltipDirective } from '@trismegisto/angular/tooltip';\nimport { ComboboxOption } from '@trismegisto/primitives/combobox';\nimport { PluralMessage, formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';\nimport { PaginationState } from '@trismegisto/primitives/pagination';\nimport { MenuItem } from '@trismegisto/primitives/popover';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SPINE_RATING_SCORE_MAX, SpinePageActionsDirective, SpineRatingStarsComponent } from '@trismegisto/spine/layout';\nimport { AutoServiceRatingsService, RatingAggregate, RatingItem, RatingsSummary } from './auto-service-ratings.service';\nimport {\n RATINGS_AREA_FALLBACK_ICON, RATINGS_SCREEN_FALLBACK_ICON, areaOf, combineAggregates, combineTrends, ratingTone,\n relativeWhen,\n} from './ratings-shared';\nimport { RatingsTableComponent, RatingsTableRow } from './ratings-table.component';\nimport { RatingsTrendComponent, RatingsTrendSeries } from './ratings-trend.component';\n\n// Reexportados daqui (contrato dos specs e de quem já importava do componente).\nexport { RATINGS_SCREEN_FALLBACK_ICON, ratingTone, screenHue, sortScreens } from './ratings-shared';\n\ntype Period = 'all' | 'd7' | 'd30' | 'd90';\ntype ScopeFilter = '' | 'app' | 'screen';\ntype Tab = 'screens' | 'areas' | 'trends';\n\nconst PERIOD_DAYS: Record<Period, number> = { all: 0, d7: 7, d30: 30, d90: 90 };\n/** Página da lista completa (no drawer \"Todas as avaliações\"). */\nexport const RATINGS_PAGE_SIZE = 10;\n/** Quantas avaliações a coluna \"Avaliações recentes\" mostra. */\nexport const RATINGS_RECENT_SIZE = 6;\n/** Valor do filtro de área da tabela para as telas sem área (o mesmo do `spine-ratings-table`). */\nconst NO_AREA = '__none__';\n\n/** Uma coluna do histograma: a nota, quantas, a altura relativa à mais frequente, a faixa, a dica e o texto do leitor. */\ninterface HistogramColumn { score: number; count: number; height: number; tone: string; tip: string; label: string }\n\ninterface OverviewCard {\n id: 'app' | 'screens';\n headingId: string;\n title: string;\n hint: string;\n icon: string;\n tone: 'accent' | 'info';\n data: RatingAggregate;\n columns: HistogramColumn[];\n}\n\n/** Uma avaliação da lista com o menu ⋮ já montado (não recria os itens a cada detecção de mudança). */\ninterface RatingRow { item: RatingItem; menu: MenuItem[] }\n\nlet sequence = 0;\n\n/**\n * Tela \"Avaliações\" do auto-serviço: o que as pessoas acharam da ferramenta e de cada tela (nota de 0 a 10, 5 estrelas\n * com meia, e comentário, dados por `SpineFeatures.ratings`). Feita para caber sem rolar muito:\n *\n * - **Barra da página** (`spinePageActions`): \"Atualizado em…\", o período e \"Atualizar\".\n * - **KPIs** baixos lado a lado: a ferramenta e as telas juntas, com a média em destaque, as estrelas, os totais, o\n * histograma das 11 notas (dica \"7 avaliações\" no hover) e \"Ver detalhes\".\n * - **Duas colunas** (2/3 e 1/3; empilham no estreito): à esquerda, abas **Telas** (tabela com busca, área, faixa,\n * ordem, sparkline e paginação), **Áreas** (as telas somadas por área do menu) e **Tendências** (média por semana);\n * à direita, as **avaliações recentes** em lista curta e \"Ver todas as avaliações\", que abre o drawer com a lista\n * completa, os filtros e a paginação no servidor. Clicar numa tela abre esse drawer com as avaliações dela.\n */\n@Component({\n selector: 'spine-auto-service-ratings',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, CardComponent, ComboboxComponent, DrawerComponent,\n IconComponent, MenuButtonComponent, PaginatorComponent, SegmentedControlComponent, SkeletonComponent,\n StateScreenComponent, SwitchComponent, TabComponent, TabContentDirective, TabsComponent, TagComponent,\n TooltipDirective, SpinePageActionsDirective, SpineRatingStarsComponent, RatingsTableComponent, RatingsTrendComponent,\n ],\n providers: [AutoServiceRatingsService],\n templateUrl: './auto-service-ratings.component.html',\n styleUrl: './auto-service-ratings.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceRatingsComponent {\n readonly clientId = input.required<string>();\n\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.ratings;\n private readonly api = inject(AutoServiceRatingsService);\n private readonly toast = inject(HermesToastService);\n private readonly locale = this.messages.meta.locale;\n\n /** Prefixo dos ids dos títulos (cada card é uma região nomeada pelo próprio título). */\n protected readonly uid = `spine-ratings-${++sequence}`;\n\n /** As notas possíveis, 0 a 10 (colunas da distribuição e o filtro de nota). */\n protected readonly scores = Array.from({ length: SPINE_RATING_SCORE_MAX + 1 }, (_, i) => i);\n\n protected readonly period = signal<Period>('all');\n protected readonly tab = signal<Tab>('screens');\n /** Filtro de área da aba Telas (clicar numa área preenche). */\n protected readonly tableArea = signal('');\n\n protected readonly summary = signal<RatingsSummary | null>(null);\n protected readonly summaryLoading = signal(false);\n protected readonly updatedAt = signal<Date | null>(null);\n protected readonly error = signal<string | null>(null);\n\n // ── Coluna \"Avaliações recentes\" (as últimas, sem filtro) ──\n protected readonly recent = signal<RatingItem[]>([]);\n protected readonly recentTotal = signal(0);\n protected readonly recentLoading = signal(false);\n\n // ── Drawer \"Todas as avaliações\": filtros e paginação no servidor ──\n protected readonly allOpen = signal(false);\n protected readonly scope = signal<ScopeFilter>('');\n protected readonly screen = signal('');\n protected readonly score = signal('');\n protected readonly withComment = signal(false);\n protected readonly pageState = signal<PaginationState>({ page: 1, size: RATINGS_PAGE_SIZE });\n protected readonly items = signal<RatingItem[]>([]);\n protected readonly total = signal(0);\n protected readonly listLoading = signal(false);\n\n private readonly tabsCard = viewChild<ElementRef<HTMLElement>>('tabsCard');\n\n protected readonly periodOptions = computed<SegmentedOption<Period>[]>(() =>\n (Object.keys(PERIOD_DAYS) as Period[]).map((value) => ({ value, label: this.text.periods[value] })));\n protected readonly scopeOptions = computed<ComboboxOption[]>(() => [\n { value: '', label: this.text.allScopes },\n { value: 'app', label: this.text.tool },\n { value: 'screen', label: this.text.screens },\n ]);\n protected readonly screenOptions = computed<ComboboxOption[]>(() => [\n { value: '', label: this.text.allScreens },\n ...(this.summary()?.by_screen ?? []).map((s) => ({ value: s.screen_path, label: this.screenName(s) })),\n ]);\n protected readonly scoreOptions = computed<ComboboxOption[]>(() => [\n { value: '', label: this.text.allScores },\n ...[...this.scores].reverse().map((n) => ({ value: String(n), label: this.scoreOf(n) })),\n ]);\n\n /** Os dois KPIs de cima: a ferramenta e as telas juntas, cada um com as 11 colunas já calculadas. */\n protected readonly overview = computed<OverviewCard[]>(() => {\n const s = this.summary();\n if (!s) return [];\n const card = (id: OverviewCard['id'], title: string, hint: string, icon: string, tone: OverviewCard['tone'], data: RatingAggregate) =>\n ({ id, headingId: `${this.uid}-${id}`, title, hint, icon, tone, data, columns: this.histogram(data) });\n return [\n card('app', this.text.appCard, this.text.appCardHint, 'application', 'accent', s.app),\n card('screens', this.text.screensCard, this.text.screensCardHint, 'applications', 'info', s.screens),\n ];\n });\n /** Sem avaliação nenhuma no período (nem da ferramenta, nem de tela). */\n protected readonly empty = computed(() => {\n const s = this.summary();\n return !!s && s.app.total === 0 && s.screens.total === 0;\n });\n protected readonly hasFilters = computed(() => !!(this.scope() || this.screen() || this.score() || this.withComment()));\n\n /** Linhas da aba Telas. */\n protected readonly screenRows = computed<RatingsTableRow[]>(() =>\n (this.summary()?.by_screen ?? []).map((s) => ({\n key: s.screen_path,\n name: this.screenName(s),\n sub: s.screen_label ? s.screen_path : null,\n icon: s.screen_icon || RATINGS_SCREEN_FALLBACK_ICON,\n area: areaOf(s),\n areaIcon: s.screen_area_icon ?? null,\n agg: s,\n trend: s.trend,\n })));\n\n /** Linhas da aba Áreas: as telas somadas por área (as sem área juntas em \"Sem área\"). */\n protected readonly areaRows = computed<RatingsTableRow[]>(() => {\n const groups = new Map<string, RatingsTableRow[]>();\n for (const r of this.screenRows()) groups.set(r.area ?? '', [...(groups.get(r.area ?? '') ?? []), r]);\n return [...groups].map(([area, rows]) => ({\n key: area || NO_AREA,\n name: area || this.text.noArea,\n sub: null,\n icon: rows.find((r) => r.areaIcon)?.areaIcon || RATINGS_AREA_FALLBACK_ICON,\n area: area || null,\n areaIcon: null,\n agg: combineAggregates(rows.map((r) => r.agg)),\n trend: rows.some((r) => r.trend) ? combineTrends(rows.map((r) => r.trend)) : undefined,\n screens: rows.length,\n }));\n });\n\n /** As duas séries da aba Tendências (servidor novo; sem `trend`, a aba avisa que não há dados). */\n protected readonly trendSeries = computed<RatingsTrendSeries[]>(() => {\n const t = this.summary()?.trend;\n return t\n ? [\n { id: 'app', label: this.text.appCard, hue: 1, points: t.app },\n { id: 'screens', label: this.text.screensCard, hue: 2, points: t.screens },\n ]\n : [];\n });\n\n protected readonly rows = computed<RatingRow[]>(() => this.items().map((item) => ({ item, menu: this.itemMenu(item) })));\n\n private readonly dateFormat = new Intl.DateTimeFormat(this.locale, { dateStyle: 'short', timeStyle: 'short' });\n private readonly dayFormat = new Intl.DateTimeFormat(this.locale, { dateStyle: 'short' });\n private readonly timeFormat = new Intl.DateTimeFormat(this.locale, { timeStyle: 'short' });\n private readonly relativeFormat = new Intl.RelativeTimeFormat(this.locale, { numeric: 'always' });\n private readonly numberFormat = new Intl.NumberFormat(this.locale, { maximumFractionDigits: 1 });\n private readonly averageFormat = new Intl.NumberFormat(this.locale, { minimumFractionDigits: 1, maximumFractionDigits: 1 });\n private readonly percentFormat = new Intl.NumberFormat(this.locale, { style: 'percent', maximumFractionDigits: 0 });\n\n /** Só a resposta mais recente vale (filtro trocado com outra consulta em andamento). */\n private summarySeq = 0;\n private recentSeq = 0;\n private listSeq = 0;\n\n constructor() {\n // Client ou período mudou: relê o resumo e as recentes (e a lista completa, se estiver aberta).\n effect(() => {\n this.clientId();\n this.period();\n untracked(() => this.reload());\n });\n }\n\n reload(): void {\n // O início do período é fixado aqui, uma vez: resumo, listas e as páginas seguintes contam a partir do mesmo\n // instante (calcular a cada chamada deixava os números do resumo e da lista de janelas diferentes).\n const days = PERIOD_DAYS[this.period()];\n this.periodFrom = days ? new Date(Date.now() - days * 86_400_000).toISOString() : undefined;\n void this.loadSummary();\n void this.loadRecent();\n if (this.allOpen()) void this.loadList(1);\n }\n\n /** Início do período escolhido, fixado no último `reload()`. */\n private periodFrom: string | undefined;\n\n private from(): string | undefined {\n return this.periodFrom;\n }\n\n async loadSummary(): Promise<void> {\n const seq = ++this.summarySeq;\n this.summaryLoading.set(true);\n try {\n const s = await this.api.summary(this.clientId(), this.from());\n if (seq !== this.summarySeq) return;\n this.summary.set(s);\n this.updatedAt.set(new Date());\n this.error.set(null);\n } catch (err) {\n if (seq !== this.summarySeq) return;\n this.summary.set(null);\n this.error.set(this.errorText(err));\n } finally {\n if (seq === this.summarySeq) this.summaryLoading.set(false);\n }\n }\n\n async loadRecent(): Promise<void> {\n const seq = ++this.recentSeq;\n this.recentLoading.set(true);\n try {\n const res = await this.api.list(this.clientId(), { from: this.from(), page: 1, limit: RATINGS_RECENT_SIZE });\n if (seq !== this.recentSeq) return;\n this.recent.set(res.items);\n this.recentTotal.set(res.total);\n } catch (err) {\n if (seq !== this.recentSeq) return;\n this.recent.set([]);\n this.recentTotal.set(0);\n this.error.set(this.errorText(err));\n } finally {\n if (seq === this.recentSeq) this.recentLoading.set(false);\n }\n }\n\n async loadList(page = 1, size = this.pageState().size): Promise<void> {\n const seq = ++this.listSeq;\n this.listLoading.set(true);\n try {\n const scope = this.scope();\n const res = await this.api.list(this.clientId(), {\n from: this.from(),\n scope: scope || undefined,\n screen: scope === 'app' ? undefined : this.screen() || undefined,\n score: this.score() ? Number(this.score()) : undefined,\n comment: this.withComment(),\n page,\n limit: size,\n });\n if (seq !== this.listSeq) return;\n this.items.set(res.items);\n this.total.set(res.total);\n this.pageState.set({ page, size });\n } catch (err) {\n if (seq !== this.listSeq) return;\n this.items.set([]);\n this.total.set(0);\n this.error.set(this.errorText(err));\n } finally {\n if (seq === this.listSeq) this.listLoading.set(false);\n }\n }\n\n protected setPeriod(value: string): void { this.period.set(value as Period); }\n protected setTab(value: string): void { this.tab.set(value as Tab); }\n\n /** Abre \"Todas as avaliações\" com os filtros pedidos (vazio = sem filtro) e lê a página 1. */\n protected openAll(filters: { scope?: ScopeFilter; screen?: string } = {}): void {\n this.scope.set(filters.scope ?? '');\n this.screen.set(filters.screen ?? '');\n this.score.set('');\n this.withComment.set(false);\n this.allOpen.set(true);\n void this.loadList(1);\n }\n\n /** \"Ver detalhes\" do KPI: a ferramenta abre as avaliações dela; as telas levam à aba Telas. */\n protected details(card: OverviewCard): void {\n if (card.id === 'app') {\n this.openAll({ scope: 'app' });\n return;\n }\n this.tab.set('screens');\n const el = this.tabsCard()?.nativeElement;\n el?.scrollIntoView?.({ block: 'start', behavior: 'smooth' });\n el?.querySelector<HTMLElement>('[role=\"tab\"][aria-selected=\"true\"]')?.focus();\n }\n\n /** Clique numa tela da tabela: o drawer com as avaliações dela. */\n protected pickScreen(row: RatingsTableRow): void { this.openAll({ scope: 'screen', screen: row.key }); }\n\n /** Clique numa área: a aba Telas filtrada por ela. */\n protected pickArea(row: RatingsTableRow): void {\n this.tableArea.set(row.area ?? NO_AREA);\n this.tab.set('screens');\n }\n\n protected setScope(value: string): void {\n this.scope.set(value as ScopeFilter);\n if (value === 'app') this.screen.set('');\n void this.loadList(1);\n }\n\n protected setScreen(value: string): void {\n this.screen.set(value);\n if (value) this.scope.set('screen');\n void this.loadList(1);\n }\n\n protected setScore(value: string): void { this.score.set(value); void this.loadList(1); }\n protected setWithComment(value: boolean): void { this.withComment.set(value); void this.loadList(1); }\n\n protected clearFilters(): void {\n this.scope.set('');\n this.screen.set('');\n this.score.set('');\n this.withComment.set(false);\n void this.loadList(1);\n }\n\n protected onPage(state: PaginationState): void { void this.loadList(state.page, state.size); }\n\n /** Menu ⋮ de uma avaliação: só o que existe de fato (copiar o comentário, ver as avaliações do mesmo alvo). */\n private itemMenu(i: RatingItem): MenuItem[] {\n const menu: MenuItem[] = [];\n if (i.comment?.trim()) menu.push({ id: 'copy', label: this.text.copyComment, icon: 'copy' });\n if (i.scope === 'app' && this.scope() !== 'app') {\n menu.push({ id: 'filter', label: this.text.showAppRatings, icon: 'filter' });\n } else if (i.scope === 'screen' && i.screen_path && this.screen() !== i.screen_path) {\n menu.push({ id: 'filter', label: this.text.showScreenRatings, icon: 'filter' });\n }\n return menu;\n }\n\n protected async onItemAction(i: RatingItem, action: string): Promise<void> {\n if (action === 'filter') {\n if (i.scope === 'app') this.setScope('app');\n else if (i.screen_path) this.setScreen(i.screen_path);\n return;\n }\n if (action === 'copy' && i.comment) {\n try {\n await navigator.clipboard.writeText(i.comment);\n this.toast.success(this.text.commentCopied);\n } catch {\n this.toast.error(this.text.copyFailed);\n }\n }\n }\n\n // ── formatação ──\n protected screenName(s: { screen_label: string | null; screen_path: string | null }): string {\n return s.screen_label || s.screen_path || '';\n }\n\n /** \"Atualizado em 23/10/2026 às 16:49\". */\n protected updatedText(d: Date): string {\n return formatMessage(this.text.updatedAt, { date: this.dayFormat.format(d), time: this.timeFormat.format(d) });\n }\n\n /** Uma nota como \"8/10\". */\n protected scoreShort(score: number): string {\n return formatMessage(this.text.scoreShort, { value: this.numberFormat.format(score) });\n }\n\n /** Só o número da média em destaque, sempre com uma casa (\"4,7\"; \"10,0\"); \"—\" sem avaliação. */\n protected averageFigure(a: RatingAggregate): string {\n return a.average == null ? '—' : this.averageFormat.format(a.average);\n }\n\n /** Nota ou média para o leitor: \"8,4 de 10\". */\n protected scoreOf(value: number): string {\n return formatMessage(this.text.scoreOf, { value: this.numberFormat.format(value) });\n }\n\n protected plural(message: PluralMessage, count: number): string {\n return pluralMessage(message, count, this.locale);\n }\n\n /** \"3 avaliações • 3 comentários\". */\n protected totals(a: RatingAggregate): string {\n return `${this.plural(this.text.total, a.total)} • ${this.plural(this.text.comments, a.comments)}`;\n }\n\n /** \"Ver todas as avaliações (117)\": o total do período, quando já se sabe. */\n protected viewAllLabel(): string {\n const n = this.recentTotal();\n return n ? `${this.text.viewAll} (${n})` : this.text.viewAll;\n }\n\n /** O nome do \"Ver detalhes\" para o leitor, distinto em cada KPI. */\n protected detailsLabel(card: OverviewCard): string {\n return formatMessage(this.text.detailsOf, { name: card.title });\n }\n\n /**\n * As 11 colunas de um agregado. A altura é relativa à nota mais frequente (a maior coluna enche o trilho), para as\n * colunas não ficarem rasas quando as notas se espalham; coluna com contagem tem um mínimo visível.\n */\n private histogram(a: RatingAggregate): HistogramColumn[] {\n const top = Math.max(0, ...a.distribution);\n return this.scores.map((score) => {\n const count = a.distribution[score] ?? 0;\n const tip = this.plural(this.text.total, count);\n return {\n score,\n count,\n height: top && count ? Math.max(8, Math.round((count / top) * 100)) : 0,\n tone: count ? ratingTone(score) : 'neutral',\n tip,\n label: formatMessage(this.text.distributionRow, {\n score, count: tip, share: this.percentFormat.format(a.total ? count / a.total : 0),\n }),\n };\n });\n }\n\n protected date(iso: string): string {\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? iso : this.dateFormat.format(d);\n }\n\n /** Quando, na lista curta: \"há 5 minutos\", \"há 1 hora\", \"Ontem às 14:21\" ou \"20/10/2026 às 14:21\". */\n protected when(iso: string, now = new Date()): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return iso;\n const w = relativeWhen(d, now);\n switch (w.kind) {\n case 'now': return this.text.justNow;\n case 'minutes': return this.relativeFormat.format(-w.value, 'minute');\n case 'hours': return this.relativeFormat.format(-w.value, 'hour');\n case 'yesterday': return formatMessage(this.text.yesterdayAt, { time: this.timeFormat.format(d) });\n default: return formatMessage(this.text.dateAt, { date: this.dayFormat.format(d), time: this.timeFormat.format(d) });\n }\n }\n\n protected author(i: RatingItem): string {\n return i.user_name || i.user_username || this.text.unknownUser;\n }\n\n /** O alvo como chip: \"A ferramenta\" ou o nome da tela. */\n protected target(i: RatingItem): string {\n return i.scope === 'app' ? this.text.tool : this.screenName(i);\n }\n\n private errorText(err: unknown): string {\n return err instanceof HttpErrorResponse && err.status === 403 ? this.text.forbidden : this.text.loadError;\n }\n}\n","<!-- Na barra da página do painel (fora de um painel, aqui mesmo): quando foi lido, o período e Atualizar. -->\n<ng-template spinePageActions>\n <div class=\"ratings__page-actions\">\n @if (updatedAt(); as at) {\n <span class=\"ratings__updated\">{{ updatedText(at) }}</span>\n }\n <hm-segmented-control\n [label]=\"text.period\"\n [options]=\"periodOptions()\"\n [value]=\"period()\"\n (valueChange)=\"setPeriod($event)\"\n size=\"small\"\n emphasis=\"action\"\n />\n <hm-button emphasis=\"medium\" size=\"small\" icon=\"refresh\" [loading]=\"summaryLoading() || recentLoading()\" (clicked)=\"reload()\">\n {{ text.refresh }}\n </hm-button>\n </div>\n</ng-template>\n\n<div class=\"ratings\" [attr.aria-busy]=\"summaryLoading() || recentLoading()\">\n @if (error(); as message) {\n <hm-alert variant=\"error\" [closable]=\"true\" (closed)=\"error.set(null)\">{{ message }}</hm-alert>\n }\n\n @if (!summary() && summaryLoading()) {\n <hm-skeleton shape=\"cards\" [count]=\"2\" [label]=\"text.refresh\" />\n } @else if (empty()) {\n <hm-state-screen situation=\"empty\" [heading]=\"text.noRatings\" />\n } @else if (summary()) {\n <!-- KPIs baixos: média em destaque, estrelas e totais à esquerda; o histograma das 11 notas à direita. -->\n <div class=\"ratings__kpis\">\n @for (card of overview(); track card.id) {\n <hm-card class=\"ratings__kpi\">\n <section class=\"ratings__kpi-body\" [attr.aria-labelledby]=\"card.headingId\">\n <header class=\"ratings__head\">\n <span class=\"ratings__badge ratings__badge--{{ card.tone }}\" aria-hidden=\"true\"><hm-icon [shape]=\"card.icon\" /></span>\n <span class=\"ratings__titles\">\n <h3 class=\"ratings__title\" [id]=\"card.headingId\">{{ card.title }}</h3>\n <span class=\"ratings__subtitle\">{{ card.hint }}</span>\n </span>\n <hm-button class=\"ratings__details\" emphasis=\"minimal\" size=\"small\" iconEnd=\"arrow-right\" (clicked)=\"details(card)\">\n {{ text.details }}<span class=\"ratings__sr\"> {{ detailsLabel(card) }}</span>\n </hm-button>\n </header>\n\n <div class=\"ratings__kpi-main\">\n <div class=\"ratings__figure\">\n <span class=\"ratings__average\" aria-hidden=\"true\">\n <span class=\"ratings__average-value\">{{ averageFigure(card.data) }}</span><span class=\"ratings__average-max\">{{ text.scoreMax }}</span>\n </span>\n @if (card.data.total) {\n <spine-rating-stars class=\"ratings__stars\" [readonly]=\"true\" [showValue]=\"false\" [value]=\"card.data.average\" />\n }\n <span class=\"ratings__totals\">{{ totals(card.data) }}</span>\n </div>\n\n <ul class=\"ratings__hist\" [attr.aria-label]=\"text.distribution\">\n @for (col of card.columns; track col.score) {\n <li class=\"ratings__hist-col\" [attr.aria-label]=\"col.label\" [hmTooltip]=\"col.tip\">\n <span class=\"ratings__hist-track\" aria-hidden=\"true\">\n <span class=\"ratings__hist-bar ratings__fill--{{ col.tone }}\" [style.height.%]=\"col.height\"></span>\n </span>\n <span class=\"ratings__hist-score\" aria-hidden=\"true\">{{ col.score }}</span>\n </li>\n }\n </ul>\n </div>\n </section>\n </hm-card>\n }\n </div>\n\n <!-- Duas colunas: as telas (abas) e as recentes, lado a lado. -->\n <div class=\"ratings__columns\">\n <div class=\"ratings__main\" #tabsCard>\n <hm-card class=\"ratings__tabs-card\">\n <hm-tabs [label]=\"text.ranking\" [active]=\"tab()\" (activeChange)=\"setTab($event)\">\n <hm-tab id=\"screens\" [label]=\"text.tabScreens\" [count]=\"screenRows().length\">\n <spine-ratings-table *hmTabContent mode=\"screens\" [rows]=\"screenRows()\" [(area)]=\"tableArea\" [selected]=\"allOpen() ? screen() : null\" (picked)=\"pickScreen($event)\" />\n </hm-tab>\n <hm-tab id=\"areas\" [label]=\"text.tabAreas\" [count]=\"areaRows().length\">\n <spine-ratings-table *hmTabContent mode=\"areas\" [rows]=\"areaRows()\" (picked)=\"pickArea($event)\" />\n </hm-tab>\n <hm-tab id=\"trends\" [label]=\"text.tabTrends\">\n <spine-ratings-trend *hmTabContent [series]=\"trendSeries()\" />\n </hm-tab>\n </hm-tabs>\n </hm-card>\n </div>\n\n <hm-card class=\"ratings__recent-card\">\n <section class=\"ratings__recent\" [attr.aria-labelledby]=\"uid + '-recent'\">\n <header class=\"ratings__head\">\n <span class=\"ratings__badge ratings__badge--warning\" aria-hidden=\"true\"><hm-icon shape=\"comment-message\" /></span>\n <span class=\"ratings__titles\">\n <h3 class=\"ratings__title\" [id]=\"uid + '-recent'\">{{ text.recent }}</h3>\n <span class=\"ratings__subtitle\">{{ text.recentHint }}</span>\n </span>\n </header>\n\n @if (!recent().length && recentLoading()) {\n <hm-skeleton shape=\"list\" [count]=\"3\" [label]=\"text.refresh\" />\n } @else if (!recent().length) {\n <p class=\"ratings__empty\">{{ text.emptyList }}</p>\n } @else {\n <ul class=\"ratings__feed\">\n @for (item of recent(); track item.id) {\n <li class=\"ratings__feed-item\">\n <hm-account-avatar class=\"ratings__feed-avatar\" size=\"small\" [name]=\"author(item)\" [imageUrl]=\"item.user_picture\" />\n <div class=\"ratings__feed-body\">\n <div class=\"ratings__feed-head\">\n <span class=\"ratings__author\">{{ author(item) }}</span>\n <span class=\"ratings__when\" [attr.title]=\"date(item.updated_at)\">{{ when(item.updated_at) }}</span>\n </div>\n <div class=\"ratings__feed-meta\">\n <spine-rating-stars class=\"ratings__stars\" size=\"small\" [readonly]=\"true\" [showValue]=\"false\" [value]=\"item.score\" />\n <span class=\"ratings__item-value\" aria-hidden=\"true\">{{ scoreShort(item.score) }}</span>\n <hm-tag class=\"ratings__chip\" [color]=\"item.scope === 'app' ? 'primary' : 'info'\" [name]=\"target(item)\" />\n </div>\n @if (item.comment) {\n <p class=\"ratings__feed-comment\">{{ item.comment }}</p>\n }\n </div>\n </li>\n }\n </ul>\n }\n <hm-button class=\"ratings__all\" emphasis=\"minimal\" size=\"small\" iconEnd=\"arrow-right\" (clicked)=\"openAll()\">\n {{ viewAllLabel() }}\n </hm-button>\n </section>\n </hm-card>\n </div>\n }\n</div>\n\n<!-- Todas as avaliações: a lista completa, com filtros e paginação no servidor. -->\n<hm-drawer [heading]=\"text.allHeading\" size=\"large\" [(open)]=\"allOpen\">\n @if (allOpen()) {\n <div class=\"ratings__all-body\" [attr.aria-busy]=\"listLoading()\">\n <div class=\"ratings__filters\">\n <hm-combobox class=\"ratings__filter\" size=\"small\" [label]=\"text.filterScope\" [options]=\"scopeOptions()\" [value]=\"scope()\" (valueChange)=\"setScope($event)\" />\n <hm-combobox class=\"ratings__filter ratings__filter--wide\" size=\"small\" [label]=\"text.filterScreen\" [options]=\"screenOptions()\" [value]=\"screen()\" (valueChange)=\"setScreen($event)\" />\n <hm-combobox class=\"ratings__filter\" size=\"small\" [label]=\"text.filterScore\" [options]=\"scoreOptions()\" [value]=\"score()\" (valueChange)=\"setScore($event)\" />\n <hm-switch class=\"ratings__switch\" [label]=\"text.withComment\" [value]=\"withComment()\" (valueChange)=\"setWithComment($event)\" />\n @if (hasFilters()) {\n <hm-button emphasis=\"minimal\" size=\"small\" (clicked)=\"clearFilters()\">{{ text.clearFilters }}</hm-button>\n }\n </div>\n\n @if (!items().length && listLoading()) {\n <hm-skeleton shape=\"list\" [count]=\"3\" [label]=\"text.refresh\" />\n } @else if (!items().length) {\n <p class=\"ratings__empty\">{{ text.emptyList }}</p>\n } @else {\n <ul class=\"ratings__list\" [class.ratings__list--busy]=\"listLoading()\">\n @for (row of rows(); track row.item.id) {\n <li class=\"ratings__item\">\n <hm-account-avatar class=\"ratings__item-avatar\" size=\"small\" [name]=\"author(row.item)\" [imageUrl]=\"row.item.user_picture\" />\n <span class=\"ratings__author ratings__item-who\">{{ author(row.item) }}</span>\n <span class=\"ratings__item-score\">\n <spine-rating-stars class=\"ratings__stars\" size=\"small\" [readonly]=\"true\" [showValue]=\"false\" [value]=\"row.item.score\" />\n <span class=\"ratings__item-value\" aria-hidden=\"true\">{{ scoreShort(row.item.score) }}</span>\n </span>\n <span class=\"ratings__target\">\n <hm-tag class=\"ratings__chip\" [color]=\"row.item.scope === 'app' ? 'primary' : 'info'\" [name]=\"target(row.item)\" />\n @if (row.item.scope === 'screen' && row.item.screen_label && row.item.screen_path) {\n <span class=\"ratings__route\">{{ row.item.screen_path }}</span>\n }\n </span>\n @if (row.item.comment) {\n <p class=\"ratings__comment\">{{ row.item.comment }}</p>\n } @else {\n <p class=\"ratings__comment ratings__comment--none\">{{ text.noComment }}</p>\n }\n <span class=\"ratings__date\">{{ date(row.item.updated_at) }}</span>\n <span class=\"ratings__item-menu\">\n @if (row.menu.length) {\n <hm-menu-button\n size=\"small\"\n icon=\"ellipsis-vertical\"\n align=\"end\"\n [showArrow]=\"false\"\n [label]=\"text.itemActions\"\n [items]=\"row.menu\"\n (chosen)=\"onItemAction(row.item, $event)\"\n />\n }\n </span>\n </li>\n }\n </ul>\n @if (total() > pageState().size) {\n <hm-paginator\n class=\"ratings__pager\"\n variant=\"simple\"\n [label]=\"text.pagination\"\n [state]=\"pageState()\"\n [totalItems]=\"total()\"\n [sizes]=\"[10, 25, 50]\"\n (stateChanged)=\"onPage($event)\"\n />\n }\n }\n </div>\n }\n</hm-drawer>\n","import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from '../client-picker/auto-service-client-picker.component';\nimport { AutoServiceRatingsComponent } from '../tabs/auto-service-ratings/auto-service-ratings.component';\n\n/**\n * Tela \"Avaliações\" do auto-serviço (router `AUTO_SERVICE_RATINGS_TEMPLATE_ROUTER_ID`, na raiz do menu; migration 0036\n * do argos): o seletor de client + o painel de avaliações que era a aba Cliente › Avaliações. Carregada só por\n * `AUTO_SERVICE_SCREENS.ratings` -- nunca exportada pelo ponto de entrada (ver `public-api.ts`).\n */\n@Component({\n selector: 'spine-auto-service-ratings-page',\n imports: [AutoServiceClientPickerComponent, AutoServiceRatingsComponent],\n // Sem título/descrição internos: vêm da barra da página do spine (nome da rota + descrição do router AD100008).\n template: `\n <div class=\"as-stack\">\n <spine-auto-service-client-picker (clientChange)=\"client.set($event)\" />\n @if (client(); as c) {\n <spine-auto-service-ratings [clientId]=\"c.id\" />\n }\n </div>\n `,\n styleUrl: './auto-service-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceRatingsPageComponent {\n protected readonly client = signal<AutoServiceClient | null>(null);\n}\n"],"names":["NO_AREA"],"mappings":"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"}
@@ -1,16 +1,58 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, Injectable, input, output, signal, computed, effect, untracked, ChangeDetectionStrategy, Component, model, linkedSignal, viewChild } from '@angular/core';
3
- import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-NawbfdLW.mjs';
3
+ import { A as AutoServiceClientPickerComponent } from './trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs';
4
4
  import { Location } from '@angular/common';
5
5
  import { Router } from '@angular/router';
6
6
  import { AuthorizationService, AUTH_CONFIG } from '@orfeu/angular/core';
7
- import { AccountAvatarComponent, SearchFieldComponent, ButtonComponent, CheckboxComponent, HermesToastService, AssigneeSelectComponent, ComboboxComponent, InputComponent, LevelSelectComponent, ModalComponent, PopconfirmComponent, PopconfirmTriggerDirective, SelectComponent, TextareaComponent, HermesDialogService, AlertComponent, ComboboxMultiComponent, DatePickerComponent, IconButtonComponent, IconComponent, LevelBadgeComponent, PopoverComponent, PopoverTriggerDirective, RichTextComponent, SwitchComponent, TabComponent, TabsComponent, TagComponent, BacklogComponent, ProgressComponent, RiskRegisterComponent, GanttComponent, WorkloadComponent, DeadlineComponent, TaskListComponent, DataGridComponent, EmptyComponent, SegmentedControlComponent, WorkflowDiagramComponent, KanbanCardDirective, KanbanColumnActionsDirective, KanbanColumnEmptyDirective, KanbanColumnFooterDirective, KanbanColumnSummaryDirective, KanbanComponent, MenuButtonComponent, PaginatorComponent, SkeletonComponent } from '@trismegisto/angular';
8
- import { urlPath, formatMessage, pluralMessage, LEVEL_SCALE_PRESETS, riskLevel, riskScore, burndownSeries, taskBurndownInput, taskGanttItems, taskWorkloadAllocations, sumEstimates } from '@trismegisto/primitives';
7
+ import { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';
8
+ import { AlertComponent } from '@trismegisto/angular/alert';
9
+ import { ButtonComponent } from '@trismegisto/angular/button';
10
+ import { HermesDialogService } from '@trismegisto/angular/dialog';
11
+ import { EmptyComponent } from '@trismegisto/angular/empty';
12
+ import { IconComponent } from '@trismegisto/angular/icon';
13
+ import { IconButtonComponent } from '@trismegisto/angular/icon-button';
14
+ import { KanbanCardDirective, KanbanColumnActionsDirective, KanbanColumnEmptyDirective, KanbanColumnFooterDirective, KanbanColumnSummaryDirective, KanbanComponent } from '@trismegisto/angular/kanban';
15
+ import { LevelSelectComponent, LevelBadgeComponent } from '@trismegisto/angular/level-badge';
16
+ import { MenuButtonComponent } from '@trismegisto/angular/menu-button';
17
+ import { PaginatorComponent } from '@trismegisto/angular/paginator';
18
+ import { SearchFieldComponent } from '@trismegisto/angular/search-field';
19
+ import { SegmentedControlComponent } from '@trismegisto/angular/segmented-control';
20
+ import { SelectComponent } from '@trismegisto/angular/select';
21
+ import { SkeletonComponent } from '@trismegisto/angular/skeleton';
22
+ import { TagComponent } from '@trismegisto/angular/tag';
23
+ import { HermesToastService } from '@trismegisto/angular/toast';
24
+ import { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';
25
+ import { LEVEL_SCALE_PRESETS, riskLevel, riskScore } from '@trismegisto/primitives/workflow';
9
26
  import { SPINE_MESSAGES, SpinePreferencesService, SpineUserStorage } from '@trismegisto/spine';
10
27
  import { SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_STATUS_COLORS, SPINE_SUGGESTION_WAITING, SPINE_SUGGESTION_WAITING_COLORS, SPINE_SUGGESTION_KINDS, SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_LIMITS, SpineSuggestionChatComponent, SpineTagRowComponent, SPINE_SUGGESTION_STATUS_ICONS, NEW_SCREEN_VALUE, SPINE_SUGGESTION_KIND_ICONS, screenName } from '@trismegisto/spine/layout';
11
28
  import { HttpClient, HttpHeaders, HttpParams, HttpErrorResponse } from '@angular/common/http';
12
29
  import { firstValueFrom } from 'rxjs';
30
+ import { urlPath } from '@trismegisto/primitives/html';
13
31
  import { AUTO_SERVICE_CONFIG } from './trismegisto-spine-auto-service.mjs';
32
+ import { CheckboxComponent } from '@trismegisto/angular/checkbox';
33
+ import { ComboboxMultiComponent } from '@trismegisto/angular/combobox-multi';
34
+ import { DatePickerComponent } from '@trismegisto/angular/date-picker';
35
+ import { InputComponent } from '@trismegisto/angular/input';
36
+ import { ModalComponent } from '@trismegisto/angular/modal';
37
+ import { PopoverComponent, PopoverTriggerDirective } from '@trismegisto/angular/popover';
38
+ import { RichTextComponent } from '@trismegisto/angular/rich-text';
39
+ import { SwitchComponent } from '@trismegisto/angular/switch';
40
+ import { TabComponent, TabsComponent } from '@trismegisto/angular/tabs';
41
+ import { TextareaComponent } from '@trismegisto/angular/textarea';
42
+ import { AssigneeSelectComponent } from '@trismegisto/angular/assignee';
43
+ import { ComboboxComponent } from '@trismegisto/angular/combobox';
44
+ import { PopconfirmComponent, PopconfirmTriggerDirective } from '@trismegisto/angular/popconfirm';
45
+ import { BacklogComponent } from '@trismegisto/angular/backlog';
46
+ import { ProgressComponent } from '@trismegisto/angular/progress';
47
+ import { taskBurndownInput, taskGanttItems, taskWorkloadAllocations } from '@trismegisto/primitives/project-planning';
48
+ import { burndownSeries, sumEstimates } from '@trismegisto/primitives/tasks';
49
+ import { RiskRegisterComponent } from '@trismegisto/angular/risk-register';
50
+ import { GanttComponent } from '@trismegisto/angular/gantt';
51
+ import { WorkloadComponent } from '@trismegisto/angular/workload';
52
+ import { DeadlineComponent } from '@trismegisto/angular/deadline';
53
+ import { TaskListComponent } from '@trismegisto/angular/task-card';
54
+ import { DataGridComponent } from '@trismegisto/angular/data-grid';
55
+ import { WorkflowDiagramComponent } from '@trismegisto/angular/workflow-diagram';
14
56
 
15
57
  /** Janelas quando o servidor não diz (as mesmas constantes do argos-admin). */
16
58
  const AUTO_SERVICE_SUGGESTION_DONE_DAYS = 7;
@@ -3730,4 +3772,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.24", ngImpo
3730
3772
  }] });
3731
3773
 
3732
3774
  export { AutoServiceSuggestionsPageComponent };
3733
- //# sourceMappingURL=trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs.map
3775
+ //# sourceMappingURL=trismegisto-spine-auto-service-auto-service-suggestions-page.component-Bu8YX554.mjs.map