@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
@@ -1 +0,0 @@
1
- {"version":3,"file":"trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs","sources":["../../../projects/ui/auto-service/src/tabs/auto-service-news/auto-service-news.service.ts","../../../projects/ui/auto-service/src/tabs/auto-service-news/auto-service-news.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-news/auto-service-news.component.html","../../../projects/ui/auto-service/src/pages/auto-service-news-page.component.ts"],"sourcesContent":["import { HttpClient, HttpHeaders } 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';\nimport { AUTO_SERVICE_CONFIG } from '../../auto-service.tokens';\n\n/** Situação calculada pelo servidor (com o relógio do banco). */\nexport type AutoServiceNewsStatus = 'scheduled' | 'published' | 'expired';\n\n/**\n * Tipo de publicação: só texto (`informativo`); introdução + lista de mudanças (`implementacao`); ou introdução + antes\n * e agora (`alteracao`).\n */\nexport type AutoServiceNewsKind = 'informativo' | 'implementacao' | 'alteracao';\n\n/** Uma novidade do app (`GET /auto-service/:clientId/news`); o conteúdo (`body_html`, `items`, antes e agora) só no detalhe. */\nexport interface AutoServiceNews {\n id: string;\n /** Servidor antigo não manda: vale `informativo`. */\n kind?: AutoServiceNewsKind;\n title: string;\n summary: string;\n published_at: string;\n /** Último dia em que aparece (AAAA-MM-DD); null = não vence. */\n until: string | null;\n status: AutoServiceNewsStatus;\n /** Público restrito; vazio = todos que entram no app. */\n groups: { id: string; name: string }[];\n author: { id: string; username: string; name: string | null; picture: string | null } | null;\n created_at: string;\n updated_at: string;\n body_html?: string;\n items?: string[];\n before_html?: string;\n after_html?: string;\n}\n\nexport interface AutoServiceNewsPage { news: AutoServiceNews[]; total: number; page: number; limit: number }\n\n/**\n * Corpo de criar/editar. `published_at` null = agora; `group_ids` vazio = todos. `body_html` é o texto (informativo) ou\n * a introdução; `items` só na implementação e `before_html`/`after_html` só na alteração (nos outros tipos, vazios).\n */\nexport interface AutoServiceNewsWrite {\n kind: AutoServiceNewsKind;\n title: string;\n summary: string;\n body_html: string;\n items: string[];\n before_html: string;\n after_html: string;\n published_at: string | null;\n until: string | null;\n group_ids: string[];\n}\n\n/** Grupo que pode ser público (`GET .../news/audience`): os com acesso ao app, sem o de administração. */\nexport interface AutoServiceNewsAudienceGroup { id: string; name: string; description: string | null; enabled: boolean; member_count: number }\n\n/**\n * Novidades do app no auto-serviço (`{adminApi}/auto-service/:clientId/news*`): o servidor recorta pelo client da URL\n * e exige o grupo de administração com o crachá Administrador. Próprio da aba (o `AutoServiceService` é o das outras\n * telas).\n */\n@Injectable({ providedIn: 'root' })\nexport class AutoServiceNewsService {\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 {\n return `${this.config.adminApi}/auto-service${urlPath`/${clientId}`}/news${rest}`;\n }\n\n private get headers(): HttpHeaders {\n return new HttpHeaders({ 'x-access-token': this.auth.getToken() ?? '' });\n }\n\n list(clientId: string, page: number, limit: number): Promise<AutoServiceNewsPage> {\n return firstValueFrom(this.http.get<AutoServiceNewsPage>(this.url(clientId), { headers: this.headers, params: { page, limit } }));\n }\n\n get(clientId: string, newsId: string): Promise<AutoServiceNews> {\n return firstValueFrom(this.http.get<AutoServiceNews>(this.url(clientId, urlPath`/${newsId}`), { headers: this.headers }));\n }\n\n audience(clientId: string): Promise<{ groups: AutoServiceNewsAudienceGroup[] }> {\n return firstValueFrom(this.http.get<{ groups: AutoServiceNewsAudienceGroup[] }>(this.url(clientId, '/audience'), { headers: this.headers }));\n }\n\n create(clientId: string, body: AutoServiceNewsWrite): Promise<AutoServiceNews> {\n return firstValueFrom(this.http.post<AutoServiceNews>(this.url(clientId), body, { headers: this.headers }));\n }\n\n update(clientId: string, newsId: string, body: AutoServiceNewsWrite): Promise<AutoServiceNews> {\n return firstValueFrom(this.http.put<AutoServiceNews>(this.url(clientId, urlPath`/${newsId}`), body, { headers: this.headers }));\n }\n\n remove(clientId: string, newsId: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(this.url(clientId, urlPath`/${newsId}`), { headers: this.headers }));\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, effect, signal, untracked } from '@angular/core';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n AccountAvatarComponent, AlertComponent, ButtonComponent, ComboboxMultiComponent, ComboboxOption, DataGridActionTriggered,\n DataGridCellDirective, DataGridComponent, DataGridRowAction, DatePickerComponent, GridColumn, HermesDialogService, IconComponent,\n InputComponent, ListEditorComponent, type ListEditorValidator, ModalComponent, RichTextComponent, SegmentedControlComponent,\n type SegmentedOption, TagComponent, TextareaComponent, TimePickerComponent,\n} from '@trismegisto/angular';\nimport { formatMessage, type PaginationState } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES, type SpineMessages } from '@trismegisto/spine';\nimport { AutoServiceDeleteFeedback } from '../../auto-service-delete';\nimport {\n AutoServiceNews, AutoServiceNewsKind, AutoServiceNewsService, AutoServiceNewsStatus, AutoServiceNewsWrite,\n} from './auto-service-news.service';\n\ntype NewsText = SpineMessages['autoServiceNews'];\n\nconst PAGE_SIZE = 20;\nconst TITLE_MAX = 140;\nconst SUMMARY_MAX = 300;\n\nlet sequence = 0;\n\n/** Teto da lista de mudanças (implementação) e de cada item -- os mesmos do servidor. */\nconst ITEMS_MAX = 30;\nconst ITEM_MAX = 300;\n\n/** Ícone de cada tipo (seletor do topo e prévia). */\nconst KIND_ICONS: Record<AutoServiceNewsKind, string> = {\n informativo: 'file-text',\n implementacao: 'rocket-diagonal',\n alteracao: 'two-way-arrows',\n};\n\n/** HTML de rich text com texto de verdade (não só tags vazias). */\nexport function newsHtmlHasText(html: string | null | undefined): boolean {\n return !!html && html.replace(/<[^>]*>/g, '').replace(/&nbsp;|&#160;/g, ' ').trim() !== '';\n}\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\n/** Data e hora LOCAIS (do navegador) de um instante ISO, no formato dos campos (`AAAA-MM-DD`, `HH:mm`). */\nexport function newsLocalParts(iso: string): { date: string | null; time: string | null } {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return { date: null, time: null };\n return { date: `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`, time: `${pad(d.getHours())}:${pad(d.getMinutes())}` };\n}\n\n/** Instante ISO (UTC) da data e hora locais dos campos; sem data = null (o servidor publica ao salvar); sem hora = 00:00. */\nexport function newsPublishedAt(date: string | null, time: string | null): string | null {\n if (!date) return null;\n const d = new Date(`${date}T${time || '00:00'}:00`);\n return Number.isNaN(d.getTime()) ? null : d.toISOString();\n}\n\n/** Código do argos-admin (`{ error }`) → texto no idioma ativo; desconhecido, o `detail` do servidor ou `fallback`. */\nexport function newsErrorText(err: unknown, text: NewsText, fallback: string): string {\n if (!(err instanceof HttpErrorResponse)) return fallback;\n const body = err.error as { error?: unknown; detail?: unknown } | null;\n const known: Record<string, string> = {\n invalid_title: text.errors.invalidTitle,\n invalid_summary: text.errors.invalidSummary,\n body_too_large: text.errors.bodyTooLarge,\n invalid_published_at: text.errors.invalidPublishedAt,\n invalid_until: text.errors.invalidUntil,\n invalid_group_ids: text.errors.invalidGroupIds,\n invalid_kind: text.errors.invalidKind,\n invalid_items: text.errors.invalidItems,\n invalid_compare: text.errors.invalidCompare,\n compare_too_large: text.errors.compareTooLarge,\n };\n const code = typeof body?.error === 'string' ? body.error : '';\n if (Object.prototype.hasOwnProperty.call(known, code)) return known[code];\n return typeof body?.detail === 'string' && body.detail ? body.detail : fallback;\n}\n\n/**\n * O editor. `body` é o texto (informativo) ou a introdução (implementação, alteração). Trocar de tipo guarda o que já\n * foi escrito nos campos dos outros tipos; só o do tipo escolhido vai para o servidor.\n */\ninterface NewsForm {\n kind: AutoServiceNewsKind;\n title: string;\n summary: string;\n body: string;\n items: string[];\n before: string;\n after: string;\n publishDate: string | null;\n publishTime: string | null;\n until: string | null;\n groupIds: string[];\n}\n\nconst emptyForm = (): NewsForm => ({\n kind: 'informativo', title: '', summary: '', body: '', items: [], before: '', after: '', publishDate: null, publishTime: null,\n until: null, groupIds: [],\n});\n\n/**\n * Aba Novidades do Cliente: o que o spine mostra em \"Novidades\" (menu do perfil, aviso da entrada, card do Início)\n * para quem entra no app. Grade paginada no servidor (agendadas e vencidas também), criar/editar num modal e excluir\n * com confirmação (no menu da linha ou no rodapé do modal, ao editar). O modal é um editor em seções numeradas\n * (título e resumo, texto em rich text, publicação, validade e público) com a prévia ao vivo do card do Início ao\n * lado. Sem rascunho: a novidade não tem esse estado (sem data, sai ao salvar). O texto é saneado pelo argos-admin ao\n * gravar; o público vazio é todo mundo que entra no app.\n */\n@Component({\n selector: 'spine-auto-service-news',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, ComboboxMultiComponent, DataGridComponent, DataGridCellDirective,\n DatePickerComponent, IconComponent, InputComponent, ListEditorComponent, ModalComponent, RichTextComponent, SegmentedControlComponent,\n TagComponent, TextareaComponent, TimePickerComponent,\n ],\n templateUrl: './auto-service-news.component.html',\n styleUrls: ['./auto-service-news.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceNewsComponent {\n private readonly service = inject(AutoServiceNewsService);\n private readonly deletion = inject(AutoServiceDeleteFeedback);\n private readonly dialogs = inject(HermesDialogService);\n protected readonly text = inject(SPINE_MESSAGES).autoServiceNews;\n protected readonly common = inject(SPINE_MESSAGES).autoService;\n /** Rótulos do card Novidades do Início, repetidos na prévia. */\n protected readonly home = inject(SPINE_MESSAGES).home;\n protected readonly uid = `spine-as-news-${++sequence}`;\n private readonly dateFormat = new Intl.DateTimeFormat(inject(SPINE_MESSAGES).meta.locale, { dateStyle: 'short', timeStyle: 'short' });\n private readonly dayFormat = new Intl.DateTimeFormat(inject(SPINE_MESSAGES).meta.locale, { dateStyle: 'short', timeZone: 'UTC' });\n protected readonly TITLE_MAX = TITLE_MAX;\n protected readonly SUMMARY_MAX = SUMMARY_MAX;\n protected readonly ITEMS_MAX = ITEMS_MAX;\n /** Tipos do seletor do topo, com ícone. */\n protected readonly kindOptions: readonly SegmentedOption<AutoServiceNewsKind>[] = [\n { value: 'informativo', label: this.text.kindInformativo, icon: KIND_ICONS.informativo },\n { value: 'implementacao', label: this.text.kindImplementacao, icon: KIND_ICONS.implementacao },\n { value: 'alteracao', label: this.text.kindAlteracao, icon: KIND_ICONS.alteracao },\n ];\n /** Cada mudança até 300 caracteres (o vazio e o repetido o próprio hm-list-editor recusa). */\n protected readonly itemRule: ListEditorValidator<string> = (item) =>\n item.length > ITEM_MAX ? this.text.errors.invalidItems : null;\n\n readonly clientId = input('');\n\n protected readonly rows = signal<AutoServiceNews[]>([]);\n protected readonly total = signal(0);\n protected readonly pageState = signal<PaginationState>({ page: 1, size: PAGE_SIZE });\n protected readonly loading = signal(false);\n protected readonly loadError = signal('');\n protected readonly audienceOptions = signal<ComboboxOption[]>([]);\n\n protected readonly modalOpen = signal(false);\n protected readonly editingId = signal('');\n protected form: NewsForm = emptyForm();\n protected readonly saving = signal(false);\n protected readonly saveError = signal<string | null>(null);\n /** O texto da novidade em edição ainda está vindo (o editor espera). */\n protected readonly loadingBody = signal(false);\n /** Excluindo pelo rodapé do modal. */\n protected readonly removing = signal(false);\n\n readonly rowId = (n: AutoServiceNews) => n.id;\n readonly columns = computed<GridColumn<AutoServiceNews>[]>(() => [\n { key: 'title', title: this.text.colTitle, value: (n) => n.title },\n { key: 'status', title: this.text.colStatus, value: (n) => this.statusLabel(n.status) },\n { key: 'published_at', title: this.text.colPublishedAt, value: (n) => this.formatDate(n.published_at) },\n { key: 'until', title: this.text.colUntil, value: (n) => this.formatDay(n.until) },\n { key: 'groups', title: this.text.colAudience, value: (n) => n.groups.map((g) => g.name).join(', ') || this.text.audienceAll },\n { key: 'author', title: this.text.colAuthor, value: (n) => n.author?.name || n.author?.username || '' },\n ]);\n readonly rowActions = computed<DataGridRowAction<AutoServiceNews>[]>(() => [\n { id: 'edit', icon: 'pencil', label: this.common.edit },\n {\n id: 'delete', icon: 'trash', label: this.common.delete, danger: true, separatorAbove: true,\n confirm: (n) => ({ heading: this.text.confirmDeleteHeading, message: formatMessage(this.text.confirmDelete, { title: n.title }) }),\n },\n ]);\n\n /** Validade antes do dia da publicação: a novidade nunca apareceria. */\n protected get untilBeforePublish(): boolean {\n const publishDay = this.form.publishDate ?? newsLocalParts(new Date().toISOString()).date;\n return !!this.form.until && !!publishDay && this.form.until < publishDay;\n }\n\n /** Data e hora da prévia: as dos campos; sem data, \"ao salvar\". */\n protected get previewDate(): string {\n const at = newsPublishedAt(this.form.publishDate, this.form.publishTime);\n return at ? this.formatDate(at) : this.text.previewNow;\n }\n\n /** Publicação no futuro: a prévia marca \"Agendada\". */\n protected get previewScheduled(): boolean {\n const at = newsPublishedAt(this.form.publishDate, this.form.publishTime);\n return !!at && new Date(at).getTime() > Date.now();\n }\n\n protected get canSave(): boolean {\n const title = this.form.title.trim();\n return !!title && title.length <= TITLE_MAX && this.form.summary.trim().length <= SUMMARY_MAX && !this.untilBeforePublish\n && this.kindReady;\n }\n\n /** O conteúdo do tipo está completo: a implementação com ao menos uma mudança; a alteração com o antes e o agora. */\n protected get kindReady(): boolean {\n if (this.form.kind === 'implementacao') return this.form.items.length > 0 && this.form.items.length <= ITEMS_MAX;\n if (this.form.kind === 'alteracao') return newsHtmlHasText(this.form.before) && newsHtmlHasText(this.form.after);\n return true;\n }\n\n protected get kindIcon(): string {\n return KIND_ICONS[this.form.kind];\n }\n\n protected get kindLabel(): string {\n return this.kindOptions.find((o) => o.value === this.form.kind)?.label ?? '';\n }\n\n protected setKind(kind: string): void {\n if (kind === 'informativo' || kind === 'implementacao' || kind === 'alteracao') this.form = { ...this.form, kind };\n this.saveError.set(null);\n }\n\n constructor() {\n effect(() => {\n const id = this.clientId();\n untracked(() => {\n this.pageState.set({ page: 1, size: this.pageState().size });\n void this.load();\n void this.loadAudience(id);\n });\n });\n }\n\n protected statusLabel(status: AutoServiceNewsStatus): string {\n return status === 'scheduled' ? this.text.statusScheduled : status === 'expired' ? this.text.statusExpired : this.text.statusPublished;\n }\n\n protected statusColor(status: AutoServiceNewsStatus): 'info' | 'success' | 'neutral' {\n return status === 'scheduled' ? 'info' : status === 'expired' ? 'neutral' : 'success';\n }\n\n protected formatDate(iso: string): string {\n const d = new Date(iso);\n return Number.isNaN(d.getTime()) ? '' : this.dateFormat.format(d);\n }\n\n /** `until` é um dia (AAAA-MM-DD), sem fuso: formatado em UTC para não mudar de dia. */\n protected formatDay(day: string | null): string {\n if (!day) return this.text.noUntil;\n const d = new Date(`${day}T00:00:00Z`);\n return Number.isNaN(d.getTime()) ? day : this.dayFormat.format(d);\n }\n\n async load(page = this.pageState().page, size = this.pageState().size): Promise<void> {\n const clientId = this.clientId();\n if (!clientId) { this.rows.set([]); this.total.set(0); return; }\n this.loading.set(true);\n this.loadError.set('');\n try {\n const res = await this.service.list(clientId, page, size);\n this.rows.set(res.news ?? []);\n this.total.set(res.total ?? 0);\n this.pageState.set({ page, size });\n } catch (err) {\n this.rows.set([]);\n this.total.set(0);\n this.loadError.set(newsErrorText(err, this.text, this.text.loadError));\n } finally {\n this.loading.set(false);\n }\n }\n\n /** Sem a lista de público o campo fica sem opção (a novidade sai para todos). */\n private async loadAudience(clientId: string): Promise<void> {\n if (!clientId) { this.audienceOptions.set([]); return; }\n try {\n const res = await this.service.audience(clientId);\n this.audienceOptions.set((res.groups ?? []).map((g) => ({ value: g.id, label: g.name })));\n } catch {\n this.audienceOptions.set([]);\n }\n }\n\n protected onPageStateChange(state: PaginationState): void {\n void this.load(state.page, state.size);\n }\n\n protected openCreate(): void {\n this.editingId.set('');\n this.form = emptyForm();\n this.saveError.set(null);\n this.loadingBody.set(false);\n this.removing.set(false);\n this.modalOpen.set(true);\n }\n\n /** O corpo não vem na lista: busca o detalhe antes de liberar o editor. */\n protected async openEdit(row: AutoServiceNews): Promise<void> {\n const parts = newsLocalParts(row.published_at);\n this.editingId.set(row.id);\n this.form = {\n kind: row.kind ?? 'informativo', title: row.title, summary: row.summary, body: '', items: [], before: '', after: '',\n publishDate: parts.date, publishTime: parts.time, until: row.until, groupIds: row.groups.map((g) => g.id),\n };\n this.saveError.set(null);\n this.loadingBody.set(true);\n this.removing.set(false);\n this.modalOpen.set(true);\n try {\n const full = await this.service.get(this.clientId(), row.id);\n if (this.editingId() === row.id) {\n this.form = {\n ...this.form, kind: full.kind ?? this.form.kind, body: full.body_html ?? '', items: [...(full.items ?? [])],\n before: full.before_html ?? '', after: full.after_html ?? '',\n };\n }\n } catch (err) {\n this.saveError.set(newsErrorText(err, this.text, this.text.loadError));\n } finally {\n this.loadingBody.set(false);\n }\n }\n\n protected async save(): Promise<void> {\n if (!this.canSave || this.saving() || this.loadingBody()) return;\n const body: AutoServiceNewsWrite = {\n kind: this.form.kind,\n title: this.form.title.trim(),\n summary: this.form.summary.trim(),\n body_html: this.form.body,\n // Só o conteúdo do tipo escolhido; o resto vai vazio (o servidor zera também).\n items: this.form.kind === 'implementacao' ? [...this.form.items] : [],\n before_html: this.form.kind === 'alteracao' ? this.form.before : '',\n after_html: this.form.kind === 'alteracao' ? this.form.after : '',\n published_at: newsPublishedAt(this.form.publishDate, this.form.publishTime),\n until: this.form.until || null,\n group_ids: [...this.form.groupIds],\n };\n this.saving.set(true);\n this.saveError.set(null);\n try {\n if (this.editingId()) await this.service.update(this.clientId(), this.editingId(), body);\n else await this.service.create(this.clientId(), body);\n } catch (err) {\n // O modal fica aberto com o motivo no idioma ativo.\n this.saveError.set(newsErrorText(err, this.text, this.text.saveError));\n return;\n } finally {\n this.saving.set(false);\n }\n this.modalOpen.set(false);\n await this.load(this.editingId() ? this.pageState().page : 1);\n }\n\n /** \"Excluir\" no rodapé do modal (só ao editar): confirma, exclui, fecha e recarrega; falha deixa o modal aberto. */\n protected async removeFromModal(): Promise<void> {\n const id = this.editingId();\n if (!id || this.saving() || this.removing()) return;\n const title = this.form.title.trim();\n const ok = await this.dialogs.confirm({\n heading: this.text.confirmDeleteHeading, message: formatMessage(this.text.confirmDelete, { title }),\n confirmLabel: this.common.delete, danger: true,\n });\n if (!ok || this.editingId() !== id || !this.modalOpen()) return;\n this.removing.set(true);\n try {\n if (!(await this.deletion.run(() => this.service.remove(this.clientId(), id)))) return;\n } finally {\n this.removing.set(false);\n }\n this.modalOpen.set(false);\n await this.load();\n }\n\n /** Já confirmado pelo `confirm` da ação na grade. */\n private async remove(row: AutoServiceNews): Promise<void> {\n if (await this.deletion.run(() => this.service.remove(this.clientId(), row.id))) await this.load();\n }\n\n protected onAction(e: DataGridActionTriggered<AutoServiceNews>): void {\n if (e.action === 'edit') void this.openEdit(e.row);\n if (e.action === 'delete') void this.remove(e.row);\n }\n}\n","<!-- Paginação no servidor (agendadas e vencidas também); a busca/filtro local da grade fica desligada. -->\n<hm-data-grid\n [columns]=\"columns()\"\n [rows]=\"rows()\"\n [rowId]=\"rowId\"\n [caption]=\"text.caption\"\n [loading]=\"loading()\"\n [error]=\"loadError()\"\n [emptyMessage]=\"text.empty\"\n [rowActions]=\"rowActions()\"\n [filterable]=\"false\"\n [paginated]=\"false\"\n [totalItems]=\"total()\"\n [pageState]=\"pageState()\"\n (pageStateChange)=\"onPageStateChange($event)\"\n [pageSizes]=\"[10, 20, 50, 100]\"\n (actionTriggered)=\"onAction($event)\"\n>\n <hm-button dataGridActions icon=\"plus\" (clicked)=\"openCreate()\">{{ text.newNews }}</hm-button>\n <ng-template hmCell=\"title\" let-n>\n <span class=\"news-title\">\n <span>{{ n.title }}</span>\n @if (n.summary) { <span class=\"news-title__summary\">{{ n.summary }}</span> }\n </span>\n </ng-template>\n <ng-template hmCell=\"status\" let-n>\n <hm-tag [name]=\"statusLabel(n.status)\" [color]=\"statusColor(n.status)\" />\n </ng-template>\n <ng-template hmCell=\"groups\" let-n>\n @if (n.groups.length) {\n <span class=\"news-tags\">\n @for (g of n.groups; track g.id) { <hm-tag [name]=\"g.name\" color=\"info\" /> }\n </span>\n } @else {\n <span class=\"muted\">{{ text.audienceAll }}</span>\n }\n </ng-template>\n <ng-template hmCell=\"author\" let-n>\n @if (n.author; as a) {\n <span class=\"news-author\">\n <hm-account-avatar size=\"small\" [name]=\"a.name || a.username\" [imageUrl]=\"a.picture\" />\n <span>{{ a.name || a.username }}</span>\n </span>\n }\n </ng-template>\n</hm-data-grid>\n\n<!-- Modal: criar/editar novidade. O cabeçalho do hm-modal some da vista (o título segue como nome do diálogo, ver o\n .scss) e o editor desenha o seu: ícone, título e subtítulo. Pensado para caber sem rolagem num notebook: em cima,\n \"1. Informações principais\" (título) com o resumo ao lado; embaixo, o conteúdo do tipo escolhido no topo (texto;\n introdução + lista; ou introdução + antes e agora), que estica e rola por dentro, ao lado do painel com publicação,\n validade, público, dica e a prévia do Início no fim. O modal não rola; em tela estreita, tudo empilha. -->\n<hm-modal [open]=\"modalOpen()\" (openChange)=\"modalOpen.set($event)\" [heading]=\"editingId() ? text.editNews : text.newNews\" size=\"xlarge\"\n (closed)=\"modalOpen.set(false)\">\n <div class=\"ne\">\n <header class=\"ne-head\">\n <span class=\"ne-head__icon\" aria-hidden=\"true\"><hm-icon shape=\"announcement\" size=\"md\" /></span>\n <span class=\"ne-head__text\">\n <!-- O h2 do hm-modal já dá o nome ao diálogo: este é só o visual. -->\n <span class=\"ne-head__title\" aria-hidden=\"true\">{{ editingId() ? text.editNews : text.newNews }}</span>\n <span class=\"ne-head__intro\">{{ editingId() ? text.editNewsIntro : text.newNewsIntro }}</span>\n </span>\n <!-- Tipo de publicação: muda os campos do conteúdo e a prévia. -->\n <hm-segmented-control class=\"ne-kind\" [label]=\"text.kind\" [options]=\"kindOptions\" [value]=\"form.kind\" (valueChange)=\"setKind($event)\" />\n </header>\n\n <div class=\"ne-scroll\">\n @if (saveError()) { <hm-alert variant=\"error\">{{ saveError() }}</hm-alert> }\n\n <div class=\"ne-grid\">\n <!-- Linha de cima: a seção 1 ocupa as duas colunas (subgrid): título à esquerda, resumo à direita. -->\n <section class=\"ne-section ne-intro\" [attr.aria-labelledby]=\"uid + '-main'\">\n <div class=\"ne-intro__lead\">\n <div class=\"ne-section__head\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-main'\"><span class=\"ne-step\" aria-hidden=\"true\">1</span>{{ text.sectionMain }}</h3>\n <p class=\"ne-section__hint\">{{ text.sectionMainHint }}</p>\n </div>\n <hm-input [label]=\"text.title\" required [maxLength]=\"TITLE_MAX\" [(value)]=\"form.title\" (valueChange)=\"saveError.set(null)\" />\n </div>\n <hm-textarea class=\"ne-intro__summary\" [label]=\"text.summary\" [hint]=\"text.summaryHint\" [rows]=\"3\" [maxLength]=\"SUMMARY_MAX\"\n [(value)]=\"form.summary\" />\n </section>\n\n <section class=\"ne-section ne-content\" [attr.aria-labelledby]=\"uid + '-body'\">\n <div class=\"ne-section__head\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-body'\"><span class=\"ne-step\" aria-hidden=\"true\">2</span>{{ text.sectionBody }}</h3>\n <p class=\"ne-section__hint\">\n {{ form.kind === 'implementacao' ? text.sectionBodyHintImpl : form.kind === 'alteracao' ? text.sectionBodyHintAlt : text.sectionBodyHint }}\n </p>\n </div>\n <!-- Estica até o fim da linha; quem rola é o texto (ou a lista), não o modal. -->\n @switch (form.kind) {\n @case ('implementacao') {\n <hm-rich-text class=\"ne-content__intro\" [label]=\"text.intro\" [rows]=\"2\" [maxRows]=\"4\" [loading]=\"loadingBody()\"\n [(value)]=\"form.body\" />\n <div class=\"ne-content__items\">\n <hm-list-editor [label]=\"text.items\" [hint]=\"text.itemsHint\" [placeholder]=\"text.itemPlaceholder\" [emptyText]=\"text.itemsEmpty\"\n [max]=\"ITEMS_MAX\" [validate]=\"itemRule\" editable [items]=\"form.items\" (itemsChange)=\"form.items = [...$event]\" />\n </div>\n }\n @case ('alteracao') {\n <hm-rich-text class=\"ne-content__intro\" [label]=\"text.intro\" [rows]=\"2\" [maxRows]=\"4\" [loading]=\"loadingBody()\"\n [(value)]=\"form.body\" />\n <div class=\"ne-content__compare\">\n <hm-rich-text class=\"ne-content__editor ne-content__editor--labelled\" [label]=\"text.before\" required [rows]=\"4\" [maxRows]=\"16\" [loading]=\"loadingBody()\"\n [(value)]=\"form.before\" />\n <hm-rich-text class=\"ne-content__editor ne-content__editor--labelled\" [label]=\"text.after\" required [rows]=\"4\" [maxRows]=\"16\" [loading]=\"loadingBody()\"\n [(value)]=\"form.after\" />\n </div>\n }\n @default {\n <hm-rich-text class=\"ne-content__editor\" [label]=\"text.sectionBody\" labelHidden [hint]=\"text.bodyHint\" [rows]=\"6\" [maxRows]=\"24\"\n showCounter [loading]=\"loadingBody()\" [(value)]=\"form.body\" />\n }\n }\n </section>\n\n <aside class=\"ne-side\">\n <section class=\"ne-section ne-side__publish\" [attr.aria-labelledby]=\"uid + '-publish'\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-publish'\"><span class=\"ne-step\" aria-hidden=\"true\">3</span>{{ text.sectionPublish }}</h3>\n <div class=\"ne-row\">\n <hm-date-picker [label]=\"text.publishDate\" [(value)]=\"form.publishDate\" />\n <hm-time-picker [label]=\"text.publishTime\" [(value)]=\"form.publishTime\" />\n </div>\n <p class=\"ne-note\">{{ text.publishHint }}</p>\n </section>\n\n <section class=\"ne-section ne-side__until\" [attr.aria-labelledby]=\"uid + '-until'\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-until'\"><span class=\"ne-step\" aria-hidden=\"true\">4</span>{{ text.sectionUntil }}</h3>\n <hm-date-picker [label]=\"text.untilDate\" [hint]=\"text.untilHint\" [min]=\"form.publishDate\" [(value)]=\"form.until\" />\n @if (untilBeforePublish) { <hm-alert variant=\"warning\">{{ text.errors.untilBeforePublish }}</hm-alert> }\n </section>\n\n <section class=\"ne-section ne-side__audience\" [attr.aria-labelledby]=\"uid + '-audience'\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-audience'\"><span class=\"ne-step\" aria-hidden=\"true\">5</span>{{ text.sectionAudience }}</h3>\n <!-- Vazio = todos que entram no app. -->\n <hm-combobox-multi [label]=\"text.audienceGroups\" [hint]=\"text.audienceHint\" [placeholder]=\"text.audienceAll\" [options]=\"audienceOptions()\"\n [visibleChipsLimit]=\"null\" [selected]=\"form.groupIds\" (selectedChange)=\"form.groupIds = [...$event]\" />\n </section>\n\n <p class=\"ne-tip\"><hm-icon class=\"ne-tip__icon\" shape=\"lightbulb\" size=\"sm\" /><span><strong>{{ text.tipTitle }}</strong> {{ text.tipText }}</span></p>\n\n <section class=\"ne-section ne-side__preview\" [attr.aria-labelledby]=\"uid + '-preview'\">\n <h3 class=\"ne-section__title\" [id]=\"uid + '-preview'\"><hm-icon class=\"ne-section__icon\" shape=\"eye\" size=\"sm\" />{{ text.preview }}</h3>\n <!-- Mesmo desenho do card Novidades do Início; repete o que está nos campos, então fica fora da leitura. -->\n <div class=\"ne-preview\" aria-hidden=\"true\">\n <div class=\"ne-preview__head\">\n <span class=\"ne-preview__heading\">{{ home.news }}</span>\n <span class=\"ne-preview__badge\">{{ home.newsBadge }}</span>\n </div>\n <div class=\"ne-preview__item\">\n <span class=\"ne-preview__icon\"><hm-icon [shape]=\"kindIcon\" size=\"sm\" /></span>\n <span class=\"ne-preview__text\">\n <span class=\"ne-preview__title\" [class.ne-preview__placeholder]=\"!form.title.trim()\">{{ form.title.trim() || text.previewTitle }}</span>\n <span class=\"ne-preview__summary\" [class.ne-preview__placeholder]=\"!form.summary.trim()\">{{ form.summary.trim() || text.previewSummary }}</span>\n <span class=\"ne-preview__date\">\n <hm-icon shape=\"calendar\" size=\"xs\" />{{ previewDate }}\n @if (previewScheduled) { <span class=\"ne-preview__status\">{{ text.statusScheduled }}</span> }\n <span class=\"ne-preview__kind\">{{ kindLabel }}</span>\n </span>\n </span>\n <hm-icon class=\"ne-preview__chevron\" shape=\"angle-right\" size=\"sm\" />\n </div>\n </div>\n </section>\n </aside>\n </div>\n </div>\n </div>\n\n <ng-container footer>\n <!-- Sem rascunho: a novidade não tem esse estado (sem data = publica ao salvar). -->\n @if (editingId()) {\n <hm-button class=\"ne-delete\" emphasis=\"medium\" intent=\"danger\" icon=\"trash\" [disabled]=\"saving() || removing()\" [loading]=\"removing()\"\n (clicked)=\"removeFromModal()\">{{ common.delete }}</hm-button>\n }\n <hm-button emphasis=\"medium\" (clicked)=\"modalOpen.set(false)\">{{ common.cancel }}</hm-button>\n <hm-button [disabled]=\"!canSave || loadingBody() || removing()\" [loading]=\"saving()\" (clicked)=\"save()\">\n {{ editingId() ? common.save : common.create }}\n </hm-button>\n </ng-container>\n</hm-modal>\n","import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from '../client-picker/auto-service-client-picker.component';\nimport { AutoServiceNewsComponent } from '../tabs/auto-service-news/auto-service-news.component';\n\n/**\n * Tela \"Novidades\" do auto-serviço (router `AUTO_SERVICE_NEWS_TEMPLATE_ROUTER_ID`, na raiz do menu; migration 0036 do\n * argos): o seletor de client + o painel de novidades que era a aba Cliente › Novidades. Carregada só por\n * `AUTO_SERVICE_SCREENS.news` -- nunca exportada pelo ponto de entrada (ver `public-api.ts`).\n */\n@Component({\n selector: 'spine-auto-service-news-page',\n imports: [AutoServiceClientPickerComponent, AutoServiceNewsComponent],\n // Sem título/descrição internos: vêm da barra da página do spine (nome da rota + descrição do router AD100006).\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-news [clientId]=\"c.id\" />\n }\n </div>\n `,\n styleUrl: './auto-service-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceNewsPageComponent {\n protected readonly client = signal<AutoServiceClient | null>(null);\n}\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.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';\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 {\n ComboboxComponent, IconComponent, PaginatorComponent, SearchFieldComponent, SegmentedControlComponent, SegmentedOption,\n} from '@trismegisto/angular';\nimport { ComboboxOption, PaginationState, formatMessage, pluralMessage } from '@trismegisto/primitives';\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';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives';\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 {\n AccountAvatarComponent, AlertComponent, ButtonComponent, CardComponent, ComboboxComponent, DrawerComponent,\n HermesToastService, IconComponent, MenuButtonComponent, PaginatorComponent, SegmentedControlComponent, SegmentedOption,\n SkeletonComponent, StateScreenComponent, SwitchComponent, TabComponent, TabContentDirective, TabsComponent, TagComponent,\n TooltipDirective,\n} from '@trismegisto/angular';\nimport { ComboboxOption, MenuItem, PaginationState, PluralMessage, formatMessage, pluralMessage } from '@trismegisto/primitives';\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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"}