@trismegisto/spine 3.3.2 → 3.3.3

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 (31) hide show
  1. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs +2179 -0
  2. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-mMjE3JOL.mjs.map +1 -0
  3. package/fesm2022/{trismegisto-spine-auto-service-home.component-rQ3dIGIE.mjs → trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs} +7 -4
  4. package/fesm2022/trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs.map +1 -0
  5. package/fesm2022/trismegisto-spine-auto-service.mjs +2 -2
  6. package/fesm2022/trismegisto-spine-graphql.mjs +3 -1
  7. package/fesm2022/trismegisto-spine-graphql.mjs.map +1 -1
  8. package/fesm2022/trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs +532 -0
  9. package/fesm2022/trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs.map +1 -0
  10. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs +8429 -0
  11. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-Clphrsgc.mjs.map +1 -0
  12. package/fesm2022/trismegisto-spine-layout.mjs +1 -7662
  13. package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
  14. package/fesm2022/trismegisto-spine-notification.mjs +1 -1
  15. package/fesm2022/trismegisto-spine-notification.mjs.map +1 -1
  16. package/fesm2022/trismegisto-spine-routing.mjs +16 -3
  17. package/fesm2022/trismegisto-spine-routing.mjs.map +1 -1
  18. package/fesm2022/trismegisto-spine-shell.mjs +4 -2
  19. package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
  20. package/fesm2022/trismegisto-spine.mjs +286 -29
  21. package/fesm2022/trismegisto-spine.mjs.map +1 -1
  22. package/package.json +6 -6
  23. package/types/trismegisto-spine-layout.d.ts +879 -17
  24. package/types/trismegisto-spine-layout.d.ts.map +1 -1
  25. package/types/trismegisto-spine-routing.d.ts.map +1 -1
  26. package/types/trismegisto-spine-shell.d.ts.map +1 -1
  27. package/types/trismegisto-spine.d.ts +130 -12
  28. package/types/trismegisto-spine.d.ts.map +1 -1
  29. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-DIeunpQ9.mjs +0 -2123
  30. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-DIeunpQ9.mjs.map +0 -1
  31. package/fesm2022/trismegisto-spine-auto-service-home.component-rQ3dIGIE.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trismegisto-spine-layout-suggestions-page.component-xI2gDMok.mjs","sources":["../../../projects/ui/layout/src/suggestions/suggestions-page.component.ts","../../../projects/ui/layout/src/suggestions/suggestions-page.component.html"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, effect, inject, signal, untracked, viewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { ViewService } from '@orfeu/angular/core';\nimport {\n AccountAvatarComponent, AlertComponent, ButtonComponent, DrawerComponent, EmptyComponent, FilterBarComponent,\n FilterBarField, FilterBarValue, HermesToastService, IconComponent, MenuButtonComponent, PaginatorComponent,\n RichTextComponent, SearchFieldComponent, SegmentedControlComponent, SegmentedOption, TabComponent, TabsComponent,\n TagComponent,\n} from '@trismegisto/angular';\nimport { MenuItem, PaginationState, formatMessage, pluralMessage } from '@trismegisto/primitives';\nimport { SPINE_MESSAGES, SpinePreferencesService, SpineUserStorage, spineRoutesOf } from '@trismegisto/spine';\nimport { SpineChatMessage, SpineSuggestionChatComponent } from './suggestion-chat.component';\nimport { SpineTagRowComponent } from './tag-row.component';\nimport { NEW_SCREEN_VALUE, screenModule, screenName, suggestionScreens } from './suggestion-screens';\nimport { SpineSuggestionsDialogComponent, SpineSuggestionsView } from './suggestions-dialog.component';\nimport {\n SPINE_SUGGESTION_PAGE_PARAM, SPINE_SUGGESTION_TAB_CONVERSATION, SPINE_SUGGESTION_TAB_PARAM, SPINE_SUGGESTIONS_PAGE_PATH,\n} from './suggestions-page';\nimport { SpineInboxService } from '../inbox/inbox.service';\nimport { SPINE_TAB } from '../workspace/spine-tab';\nimport {\n SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_KIND_ICONS, SPINE_SUGGESTION_KINDS, SPINE_SUGGESTION_REASONS,\n SPINE_SUGGESTION_STATUS_COLORS, SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_VISIBLE_SORTS, SPINE_SUGGESTION_WAITING,\n SPINE_SUGGESTION_WAITING_COLORS, SpineSuggestion, SpineSuggestionKind, SpineSuggestionMessage, SpineSuggestionPerson,\n SpineSuggestionReason, SpineSuggestionStatus, SpineSuggestionVisibleSort, SpineSuggestionWaiting, SpineSuggestionsService,\n SpineVisibleCounts, SpineVisibleSuggestion,\n} from './suggestions.service';\n\nconst PAGE = 20;\n/** O recorte \"Precisam da sua resposta\" no seletor (não é um motivo: é a vez de quem pede). */\nconst NEEDS_YOU = 'precisam-de-voce';\nconst MESSAGES_PAGE = 20;\nconst CLOSED: readonly SpineSuggestionStatus[] = ['concluida', 'recusada'];\n\n/** Intervalos do \"há 3 dias\" (segundos por unidade), do maior para o menor. */\nconst AGES: ReadonlyArray<[Intl.RelativeTimeFormatUnit, number]> = [\n ['year', 31_536_000], ['month', 2_592_000], ['week', 604_800], ['day', 86_400], ['hour', 3_600], ['minute', 60],\n];\n\n/** A conversa da sugestão aberta: as mensagens do mais ANTIGO ao mais novo (o servidor pagina do mais novo). */\ninterface Conversation { id: string; messages: SpineSuggestionMessage[]; total: number; loading: boolean; error: boolean }\n\n/**\n * A página \"Sugestões do app\" de quem pede (página do próprio spine, em `/sugestoes` — ver `provideSpineSuggestionsPage`).\n *\n * - **O que aparece** é o que o servidor deixa a pessoa ver: as dela, as agrupadas (um pedido dela virou outro), as em\n * que ela está envolvida (mesmo de outro grupo) e as pedidas por alguém do grupo dela. Um grupo não vê o do outro,\n * a não ser por agrupamento. Cada item diz POR QUE aparece (os filtros rápidos no topo, com as contagens do servidor).\n * - **Filtros**: busca (título, descrição, tela, \"SUG-12\"), o recorte (`hm-segmented-control`: Todas, os motivos e\n * \"Precisam da sua resposta\"), e no `hm-filter-bar` status, tipo, tela (as do menu e \"Nova tela\") e com quem está a\n * vez; mais a ordem. Tudo no servidor, paginado.\n * - Apoiar direto no cartão, sem abrir a gaveta (a própria só mostra a contagem).\n * - **Gaveta** (`hm-drawer`): clicar abre a sugestão em **Detalhes** (descrição, tela, quem pediu, os grupos em selos,\n * os responsáveis), com a aba **Conversa** ao lado (o chat: o que a equipe escreveu de público e o que quem pede\n * respondeu; quem pediu e os envolvidos escrevem, a vez passa para os responsáveis; quem só é do grupo não tem a aba).\n * O apoio fica no topo, fora das abas. Abrir a Conversa marca como lida.\n * - \"Sugerir melhoria\" abre o mesmo modal da barra (sem tela escolhida); a nova entra na lista e abre no painel.\n * - \"?sugestao=SUG-12\" abre direto na sugestão (o link do aviso de envio).\n */\n@Component({\n selector: 'spine-suggestions-page',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, DrawerComponent, EmptyComponent, FilterBarComponent,\n IconComponent, MenuButtonComponent, PaginatorComponent, RichTextComponent, SearchFieldComponent,\n SegmentedControlComponent, SpineSuggestionChatComponent, SpineSuggestionsDialogComponent, SpineTagRowComponent, TabComponent, TabsComponent,\n TagComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './suggestions-page.component.html',\n styleUrl: './suggestions-page.component.scss',\n})\nexport class SpineSuggestionsPageComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.suggestions;\n protected readonly page = this.text.page;\n private readonly service = inject(SpineSuggestionsService);\n private readonly inbox = inject(SpineInboxService);\n private readonly toast = inject(HermesToastService);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly userStorage = inject(SpineUserStorage, { optional: true });\n private readonly views = inject(ViewService, { optional: true });\n private readonly router = inject(Router, { optional: true });\n\n private readonly chat = viewChild(SpineSuggestionChatComponent);\n\n protected readonly statusColors = SPINE_SUGGESTION_STATUS_COLORS;\n protected readonly kindColors = SPINE_SUGGESTION_KIND_COLORS;\n protected readonly kindIcons = SPINE_SUGGESTION_KIND_ICONS;\n /** O \"⋯\" de cada cartão: copiar o link (abre a página já na sugestão) e a chave. */\n protected readonly itemMenu: readonly MenuItem[] = [\n { id: 'copy-link', label: this.text.menuCopyLink, icon: 'link' },\n { id: 'copy-key', label: this.text.menuCopyKey, icon: 'copy' },\n ];\n protected readonly waitingColors = SPINE_SUGGESTION_WAITING_COLORS;\n protected readonly newScreenValue = NEW_SCREEN_VALUE;\n protected readonly sortOptions: readonly SegmentedOption[] = SPINE_SUGGESTION_VISIBLE_SORTS.map((s) => ({ value: s, label: this.page.sorts[s] }));\n /** As telas do menu (o filtro de tela), da árvore que a pessoa já recebe. */\n protected readonly screens = suggestionScreens(spineRoutesOf(this.views?.currentView));\n protected readonly me = computed(() => this.userStorage?.userId() ?? '');\n\n // --- filtros ---\n protected readonly search = signal('');\n protected readonly reason = signal<SpineSuggestionReason | ''>('');\n protected readonly status = signal<string>('');\n protected readonly kind = signal<string>('');\n /** Uma rota, `NEW_SCREEN_VALUE` ou ''. */\n protected readonly screen = signal<string>('');\n protected readonly waiting = signal<string>('');\n protected readonly sort = signal<string>('activity');\n protected readonly filtered = computed(() => !!(this.search().trim() || this.reason() || this.status() || this.kind()\n || this.screen() || this.waiting()));\n\n /** O recorte no seletor: um motivo, \"Precisam da sua resposta\" (a vez de quem pede, sem motivo) ou '' (Todas). */\n protected readonly scope = computed(() => this.reason() || (this.waiting() === 'solicitante' ? NEEDS_YOU : ''));\n /** As opções do recorte com a contagem (\"Minhas · 2\"); motivo sem nenhuma sugestão fica de fora (a não ser o escolhido). */\n protected readonly scopeOptions = computed<SegmentedOption[]>(() => {\n const counted = (label: string, count: number | null | undefined) => (count === null || count === undefined ? label : `${label} · ${count}`);\n const counts = this.counts();\n const options: SegmentedOption[] = [{ value: '', label: counted(this.page.allReasons, this.allTotal()) }];\n for (const r of SPINE_SUGGESTION_REASONS) {\n if (counts?.[r] !== 0 || this.reason() === r) options.push({ value: r, label: counted(this.page.reasons[r], counts?.[r]) });\n }\n if (counts?.waiting_me || this.scope() === NEEDS_YOU) {\n options.push({ value: NEEDS_YOU, label: counted(this.page.needsYou, counts?.waiting_me), icon: 'chat-bubble' });\n }\n return options;\n });\n\n /** Os campos do `hm-filter-bar` (o servidor filtra): status, tipo, tela (as do menu e \"Nova tela\") e com quem está a vez. */\n protected readonly filterFields = computed<FilterBarField[]>(() => [\n { key: 'status', label: this.text.statusFilter, type: 'select', options: SPINE_SUGGESTION_STATUSES.map((v) => ({ value: v, label: this.text.statuses[v] })) },\n { key: 'kind', label: this.text.kindFilter, type: 'select', options: SPINE_SUGGESTION_KINDS.map((v) => ({ value: v, label: this.text.kinds[v] })) },\n {\n key: 'screen', label: this.text.screenFilter, type: 'select',\n options: [...this.screens.map((sc) => ({ value: sc.path, label: sc.label })), { value: NEW_SCREEN_VALUE, label: this.text.newScreenTag }],\n },\n { key: 'waiting', label: this.text.waitingFilter, type: 'select', options: SPINE_SUGGESTION_WAITING.map((v) => ({ value: v, label: this.text.waiting[v] })) },\n ]);\n protected readonly filterValue = computed<FilterBarValue>(() => {\n const value: Record<string, string> = {};\n for (const key of ['status', 'kind', 'screen', 'waiting'] as const) if (this[key]()) value[key] = this[key]();\n return value;\n });\n\n // --- lista ---\n protected readonly list = signal<SpineVisibleSuggestion[]>([]);\n protected readonly total = signal(0);\n protected readonly counts = signal<SpineVisibleCounts | null>(null);\n protected readonly pagination = signal<PaginationState>({ page: 1, size: PAGE });\n protected readonly loading = signal(false);\n protected readonly error = signal('');\n private request = 0;\n protected readonly countText = computed(() => pluralMessage(this.page.count, this.total(), this.messages.meta.locale));\n /** \"Todas\": o total da última consulta sem motivo escolhido (null antes dela). */\n protected readonly allTotal = signal<number | null>(null);\n /** O título do cabeçalho: o recorte escolhido (\"Todas as sugestões\", \"Minhas\"...). */\n protected readonly heading = computed(() => {\n const r = this.reason();\n if (this.waiting() === 'solicitante' && !r) return this.page.needsYou;\n return r ? this.page.reasons[r] : this.page.allTitle;\n });\n /** \"1 em desenvolvimento · 1 planejada\": quantas em cada status, do que está na tela. */\n protected readonly statusParts = computed(() => {\n const locale = this.messages.meta.locale;\n return SPINE_SUGGESTION_STATUSES.map((status) => ({ status, count: this.list().filter((x) => x.status === status).length }))\n .filter((p) => p.count)\n .map((p) => ({ status: p.status, text: formatMessage(this.page.statusPart, { count: p.count, status: this.text.statuses[p.status].toLocaleLowerCase(locale) }) }));\n });\n\n // --- gaveta ---\n protected readonly selected = signal<SpineVisibleSuggestion | null>(null);\n /** A gaveta abre em Detalhes; a conversa é lida (e marcada como lida) quando a pessoa vai até ela. */\n protected readonly tab = signal<'conversation' | 'details'>('details');\n protected readonly drawerHeading = computed(() => {\n const s = this.selected();\n return s ? `${s.key} · ${s.title}` : this.page.details;\n });\n protected readonly detailLoading = signal(false);\n protected readonly detailError = signal('');\n protected readonly conversation = signal<Conversation | null>(null);\n protected readonly reply = signal('');\n /** A conversa no formato do chat (do mais antigo ao mais novo). */\n protected readonly chatItems = computed<SpineChatMessage[]>(() => (this.conversation()?.messages ?? []).map((m) => ({\n id: m.id, text: m.comment, created_at: m.created_at, author: m.author, from_requester: !!m.from_requester, status: m.status,\n })));\n protected readonly sending = signal(false);\n /** As sugestões com o apoio indo para o servidor (cada uma trava só o próprio botão). */\n private readonly voting = signal<ReadonlySet<string>>(new Set());\n protected readonly panelOpen = computed(() => !!this.selected() || this.detailLoading() || !!this.detailError());\n /** A vez é de quem pede e a pessoa pode responder: o destaque no topo do painel. */\n protected readonly waitingOnMe = computed(() => {\n const s = this.selected();\n return !!s && s.can_comment && s.waiting_on === 'solicitante' && !CLOSED.includes(s.status);\n });\n\n protected readonly dialog = signal<SpineSuggestionsView>(null);\n\n constructor() {\n void this.load(1);\n const tab = inject(SPINE_TAB, { optional: true });\n if (!tab) {\n const params = this.router?.parseUrl(this.router.url).queryParams ?? {};\n const key = params[SPINE_SUGGESTION_PAGE_PARAM];\n if (typeof key === 'string' && key) void this.openByKey(key, params[SPINE_SUGGESTION_TAB_PARAM] === SPINE_SUGGESTION_TAB_CONVERSATION);\n return;\n }\n // No workspace, a página fica viva na aba: \"?sugestao=SUG-12\" (um link, a central de notificações) pode chegar com\n // ela já aberta. Abre a gaveta e tira o parâmetro da aba, para o mesmo link funcionar de novo.\n effect(() => {\n const params = tab.params();\n const key = params[SPINE_SUGGESTION_PAGE_PARAM];\n if (!key) return;\n const conversation = params[SPINE_SUGGESTION_TAB_PARAM] === SPINE_SUGGESTION_TAB_CONVERSATION;\n untracked(() => {\n void this.openByKey(key, conversation);\n tab.navigate({ queryParams: { [SPINE_SUGGESTION_PAGE_PARAM]: null, [SPINE_SUGGESTION_TAB_PARAM]: null } });\n });\n });\n }\n\n // --- filtros ---\n\n protected onSearch(term: string): void {\n this.search.set(term);\n void this.load(1);\n }\n\n /**\n * O recorte: um motivo, \"Precisam da sua resposta\" (a vez de quem pede, sem motivo) ou Todas. Sair de \"Precisam da\n * sua resposta\" tira o \"Aguardando solicitante\" que ele tinha posto.\n */\n protected pickScope(value: string): void {\n if (value === this.scope()) return;\n const leavingNeedsYou = this.scope() === NEEDS_YOU;\n if (value === NEEDS_YOU) {\n this.reason.set('');\n this.waiting.set('solicitante');\n } else {\n this.reason.set(value as SpineSuggestionReason | '');\n if (leavingNeedsYou) this.waiting.set('');\n }\n void this.load(1);\n }\n\n /** O `hm-filter-bar` aplicou, limpou um campo ou limpou tudo. */\n protected onFilters(value: FilterBarValue): void {\n const read = (key: string) => (typeof value[key] === 'string' ? (value[key] as string) : '');\n this.status.set(read('status'));\n this.kind.set(read('kind'));\n this.screen.set(read('screen'));\n this.waiting.set(read('waiting'));\n void this.load(1);\n }\n\n protected pickTab(tab: string): void {\n const s = this.selected();\n const conversation = tab === 'conversation' && !!s?.can_comment;\n this.tab.set(conversation ? 'conversation' : 'details');\n if (conversation && this.conversation()?.id !== s.id) void this.loadConversation(s.id, true);\n }\n\n protected onSort(sort: string): void {\n if (sort === this.sort()) return;\n this.sort.set(sort);\n void this.load(1);\n }\n\n protected onPage(state: PaginationState): void {\n this.pagination.set({ page: state.page, size: state.size });\n void this.load(state.page);\n }\n\n protected async load(page: number): Promise<void> {\n const request = ++this.request;\n const size = this.pagination().size;\n this.loading.set(true);\n this.error.set('');\n const screen = this.screen();\n try {\n const res = await this.service.visible({\n limit: size, offset: (page - 1) * size,\n reason: this.reason(),\n status: this.status() as SpineSuggestionStatus | '',\n kind: this.kind() as SpineSuggestionKind | '',\n waiting: this.waiting() as SpineSuggestionWaiting | '',\n screen: screen && screen !== NEW_SCREEN_VALUE ? screen : undefined,\n newScreen: screen === NEW_SCREEN_VALUE,\n q: this.search(),\n sort: this.sort() as SpineSuggestionVisibleSort,\n });\n if (request !== this.request) return;\n this.list.set(res.suggestions);\n this.total.set(res.total);\n if (!this.reason()) this.allTotal.set(res.total);\n if (res.counts) this.counts.set(res.counts);\n this.pagination.set({ page, size });\n } catch {\n if (request === this.request) this.error.set(this.page.error);\n } finally {\n if (request === this.request) this.loading.set(false);\n }\n }\n\n // --- painel ---\n\n protected open(s: SpineVisibleSuggestion): void {\n if (this.selected()?.id === s.id) return;\n this.selected.set(s);\n // Abre em Detalhes; a conversa vem ao abrir a aba (quem só vê pelo grupo nem tem a aba: o servidor recusa).\n this.tab.set('details');\n this.detailError.set('');\n this.reply.set('');\n this.conversation.set(null);\n void this.refreshSelected(s.id);\n }\n\n /** Abre pela chave (link): `conversation` = já na aba Conversa. */\n private async openByKey(key: string, conversation = false): Promise<void> {\n this.detailLoading.set(true);\n try {\n const s = await this.service.lookup(key);\n this.detailLoading.set(false);\n this.open(s);\n if (conversation) this.pickTab('conversation');\n } catch {\n this.detailLoading.set(false);\n this.detailError.set(this.page.notFound);\n }\n }\n\n protected close(): void {\n this.selected.set(null);\n this.conversation.set(null);\n this.detailError.set('');\n }\n\n /** Relê a sugestão aberta (status, a vez e os apoios mudam do outro lado) e a deixa igual na lista. */\n private async refreshSelected(id: string): Promise<void> {\n try {\n const fresh = await this.service.get(id);\n if (this.selected()?.id !== id) return;\n this.selected.set(fresh);\n this.patch(id, fresh);\n } catch {\n /* fica o que veio da lista */\n }\n }\n\n private patch(id: string, change: Partial<SpineVisibleSuggestion>): void {\n this.list.update((list) => list.map((x) => (x.id === id ? { ...x, ...change } : x)));\n const current = this.selected();\n if (current?.id === id) this.selected.set({ ...current, ...change });\n }\n\n protected loadOlder(): void {\n const c = this.conversation();\n if (c && !c.loading && c.messages.length < c.total) void this.loadConversation(c.id, false);\n }\n\n private async loadConversation(id: string, reset: boolean): Promise<void> {\n const current = this.conversation();\n const offset = reset || current?.id !== id ? 0 : current.messages.length;\n this.conversation.set(reset || current?.id !== id\n ? { id, messages: [], total: 0, loading: true, error: false }\n : { ...current, loading: true, error: false });\n try {\n const res = await this.service.comments(id, { limit: MESSAGES_PAGE, offset });\n const older = [...res.comments].reverse();\n this.conversation.update((c) => (c?.id === id\n ? { ...c, messages: reset ? older : [...older, ...c.messages], total: res.total, loading: false } : c));\n if (reset) this.markRead(id);\n } catch {\n this.conversation.update((c) => (c?.id === id ? { ...c, loading: false, error: true } : c));\n }\n }\n\n /**\n * Abrir a conversa a marca como lida (o número some da lista na hora; falha não atrapalha a leitura). Vai sempre ao\n * servidor: a central de notificações também conta a mudança de status, que o `unread` (só comentários) não vê.\n */\n private markRead(id: string): void {\n const s = this.list().find((x) => x.id === id) ?? this.selected();\n if (s?.unread) {\n this.patch(id, { unread: 0 });\n this.counts.update((c) => (c ? { ...c, unread: Math.max(0, c.unread - 1) } : c));\n }\n this.service.markRead(id).then(() => this.inbox.refresh(), () => undefined);\n }\n\n protected async send(text?: string): Promise<void> {\n const s = this.selected();\n const comment = (text ?? this.reply()).trim();\n if (!s || !comment || this.sending()) return;\n this.sending.set(true);\n try {\n const message = await this.service.reply(s.id, comment);\n this.reply.set('');\n void this.inbox.refresh();\n this.conversation.update((c) => (c?.id === s.id\n ? { ...c, messages: [...c.messages, { ...message, from_requester: true }], total: c.total + 1 } : c));\n const now = new Date().toISOString();\n const wasWaitingOnMe = s.waiting_on === 'solicitante';\n this.patch(s.id, {\n comments_count: s.comments_count + 1,\n last_comment: { comment, created_at: message.created_at ?? now },\n ...(CLOSED.includes(s.status) ? {} : { waiting_on: 'responsaveis' as const, waiting_since: now }),\n last_activity_at: now,\n });\n if (wasWaitingOnMe) this.counts.update((c) => (c ? { ...c, waiting_me: Math.max(0, c.waiting_me - 1) } : c));\n this.chat()?.scrollToEnd();\n } catch {\n this.toast.error(this.page.replyError);\n } finally {\n this.sending.set(false);\n }\n }\n\n /** Apoiar (quem não pediu): muda na hora e volta se o servidor falhar. */\n protected isVoting(id: string): boolean {\n return this.voting().has(id);\n }\n\n /** Apoia ou tira o apoio (do cartão ou da gaveta): já na tela, e desfaz se o servidor recusar. */\n protected async toggleSupport(s: SpineVisibleSuggestion): Promise<void> {\n if (s.mine || this.isVoting(s.id)) return;\n const voted = !s.voted;\n this.patch(s.id, { voted, votes: Math.max(0, s.votes + (voted ? 1 : -1)) });\n this.voting.update((ids) => new Set(ids).add(s.id));\n try {\n if (voted) await this.service.vote(s.id);\n else await this.service.unvote(s.id);\n } catch {\n this.patch(s.id, { voted: s.voted, votes: s.votes });\n this.toast.error(this.text.voteError);\n } finally {\n this.voting.update((ids) => {\n const next = new Set(ids);\n next.delete(s.id);\n return next;\n });\n }\n }\n\n protected suggest(): void {\n this.dialog.set('new');\n }\n\n /** A nova entra no topo (relendo a lista) e abre no painel. */\n protected async onCreated(created: SpineSuggestion): Promise<void> {\n await this.load(1);\n const fresh = this.list().find((s) => s.id === created.id);\n if (fresh) this.open(fresh);\n else if (created.key) void this.openByKey(created.key);\n }\n\n // --- texto ---\n\n protected reasonCount(r: SpineSuggestionReason): number | null {\n return this.counts()?.[r] ?? null;\n }\n\n protected screenText(s: SpineVisibleSuggestion): string {\n if (s.screen.new) return s.screen.label || this.text.newScreenTag;\n return s.screen.label || this.text.noScreen;\n }\n\n protected screenShort(s: SpineVisibleSuggestion): string {\n return s.screen.new ? (s.screen.label || this.text.newScreenTag) : (screenName(s.screen.label) || this.text.noScreen);\n }\n\n /** O módulo da tela (\"Vendas\" de \"Vendas › Pedidos\"); vazio na nova, sem tela ou quando o módulo é a própria tela. */\n protected screenModule(s: SpineVisibleSuggestion): string {\n if (s.screen.new) return '';\n const module = screenModule(s.screen.label);\n return module && module !== screenName(s.screen.label) ? module : '';\n }\n\n /** O trecho do cartão: a última mensagem pública (a conversa anda) ou, sem ela, a descrição. */\n protected excerptOf(s: SpineVisibleSuggestion): string {\n return (s.last_comment?.comment || s.description || '').replace(/\\s+/g, ' ').trim();\n }\n\n protected commentsText(count: number): string {\n return pluralMessage(this.text.comments, count, this.messages.meta.locale);\n }\n\n protected menuLabel(s: SpineVisibleSuggestion): string {\n return formatMessage(this.text.cardMenu, { key: s.key });\n }\n\n protected async onMenu(s: SpineVisibleSuggestion, id: string): Promise<void> {\n const value = id === 'copy-key' ? s.key : this.linkOf(s);\n try {\n await navigator.clipboard.writeText(value);\n this.toast.success(id === 'copy-key' ? this.text.keyCopied : this.text.linkCopied);\n } catch {\n this.toast.error(this.text.copyError);\n }\n }\n\n /** O link que abre a página já na sugestão (\"…/sugestoes?sugestao=SUG-12\"), respeitando o `<base href>` do app. */\n private linkOf(s: SpineVisibleSuggestion): string {\n const path = `${SPINE_SUGGESTIONS_PAGE_PATH.slice(1)}?${SPINE_SUGGESTION_PAGE_PARAM}=${encodeURIComponent(s.key)}`;\n try {\n return new URL(path, document.baseURI).toString();\n } catch {\n return `/${path}`;\n }\n }\n\n\n protected personName(p: SpineSuggestionPerson | null | undefined): string {\n return p?.name || p?.username || this.text.removedAuthor;\n }\n\n protected votesText(count: number): string {\n return pluralMessage(this.text.votes, count, this.messages.meta.locale);\n }\n\n protected unreadText(count: number): string {\n return pluralMessage(this.text.unread, count, this.messages.meta.locale);\n }\n\n protected supportText(s: SpineVisibleSuggestion): string {\n if (s.mine) return this.votesText(s.votes);\n return formatMessage(s.voted ? this.text.supported : this.text.support, { count: s.votes });\n }\n\n protected mergedFromText(key: string, target: string): string {\n return formatMessage(this.text.mergedFrom, { key, target });\n }\n\n /** \"há 3 dias\", \"ontem\", \"há 2 horas\" (Intl.RelativeTimeFormat no idioma do catálogo). */\n protected age(iso: string | null | undefined): string {\n if (!iso) return '';\n const seconds = Math.round((Date.now() - new Date(iso).getTime()) / 1000);\n try {\n const rtf = new Intl.RelativeTimeFormat(this.messages.meta.locale, { numeric: 'auto' });\n for (const [unit, size] of AGES) if (Math.abs(seconds) >= size) return rtf.format(-Math.floor(seconds / size), unit);\n return rtf.format(0, 'minute');\n } catch {\n return this.date(iso);\n }\n }\n\n protected date(iso: string): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, {\n dateStyle: 'short', timeStyle: 'short', timeZone: this.preferences.effectiveTimeZone(),\n }).format(new Date(iso));\n } catch {\n return iso.slice(0, 16).replace('T', ' ');\n }\n }\n}\n","<section class=\"ssp\" [attr.aria-label]=\"page.listLabel\">\n <!-- Cabeçalho numa linha: o recorte, quantas (e quantas em cada status), a ordem e o \"Sugerir melhoria\". -->\n <header class=\"ssp__head\">\n <h2 class=\"ssp__heading\">{{ heading() }}</h2>\n <span class=\"ssp__count\" aria-live=\"polite\">{{ countText() }}</span>\n @for (part of statusParts(); track part.status) {\n <span class=\"ssp__status-part\" [attr.data-status]=\"part.status\"><span class=\"ssp__dot\" aria-hidden=\"true\"></span>{{ part.text }}</span>\n }\n <span class=\"ssp__spacer\"></span>\n <hm-segmented-control class=\"ssp__sort\" size=\"small\" [label]=\"text.sort\" [options]=\"sortOptions\" [value]=\"sort()\"\n (valueChange)=\"onSort($event)\" />\n <hm-button size=\"small\" icon=\"plus\" (clicked)=\"suggest()\">{{ text.button }}</hm-button>\n </header>\n\n <!-- Busca e o recorte (por que a pessoa vê, com as contagens do servidor) na mesma linha. -->\n <div class=\"ssp__bar\">\n <hm-search-field class=\"ssp__search\" [label]=\"text.appSearch\" labelHidden [placeholder]=\"text.appSearch\"\n [landmark]=\"false\" [debounce]=\"300\" [value]=\"search()\" (search)=\"onSearch($event)\" />\n <hm-segmented-control class=\"ssp__scope\" size=\"small\" emphasis=\"action\" [label]=\"page.reasonFilter\"\n [options]=\"scopeOptions()\" [value]=\"scope()\" (valueChange)=\"pickScope($event)\" />\n </div>\n\n <!-- Filtros do Trismegisto: um botão por campo e, aplicados, as fichas removíveis com \"Limpar tudo\". -->\n <hm-filter-bar class=\"ssp__filters\" [label]=\"page.filtersLabel\" [filters]=\"filterFields()\" [value]=\"filterValue()\"\n (valueChange)=\"onFilters($event)\" />\n\n @if (error()) {\n <hm-alert variant=\"error\">{{ error() }}</hm-alert>\n } @else if (!loading() && list().length === 0) {\n @if (filtered()) {\n <hm-empty icon=\"filter\" [heading]=\"page.emptyFiltered\" />\n } @else {\n <hm-empty icon=\"lightbulb\" [heading]=\"page.empty\" [description]=\"page.emptyHint\" />\n }\n }\n\n <ul class=\"ssp__list\" [attr.aria-busy]=\"loading() ? 'true' : null\">\n @for (s of list(); track s.id) {\n <li class=\"ssp__item\" [class.ssp__item--open]=\"selected()?.id === s.id\" [class.ssp__item--unread]=\"s.unread > 0\">\n <div class=\"ssp__item-meta\">\n <span class=\"ssp__key\">{{ s.key }}</span>\n <span class=\"ssp__status\" [attr.data-status]=\"s.status\"><span class=\"ssp__dot\" aria-hidden=\"true\"></span>{{ text.statuses[s.status] }}</span>\n <span class=\"ssp__kind\" [attr.data-kind]=\"s.kind\"><hm-icon [shape]=\"kindIcons[s.kind]\" />{{ text.kinds[s.kind] }}</span>\n @if (s.unread) { <span class=\"ssp__unread\">{{ unreadText(s.unread) }}</span> }\n <span class=\"ssp__menu\">\n <hm-menu-button size=\"small\" icon=\"ellipsis-vertical\" [showArrow]=\"false\" align=\"end\" [label]=\"menuLabel(s)\"\n [items]=\"itemMenu\" (chosen)=\"onMenu(s, $event)\" />\n </span>\n </div>\n <!-- O título é o botão que abre a sugestão na gaveta. -->\n <button type=\"button\" class=\"ssp__item-title\" aria-haspopup=\"dialog\" (click)=\"open(s)\">{{ s.title }}</button>\n <div class=\"ssp__item-screen\">\n <hm-icon [shape]=\"s.screen.new ? 'plus' : 'application'\" />\n @if (screenModule(s); as module) {\n <span class=\"ssp__screen-module\">{{ module }}</span><hm-icon class=\"ssp__screen-sep\" shape=\"angle-right\" />\n }\n <strong class=\"ssp__screen-name\">{{ screenShort(s) }}</strong>\n @if (s.screen.new) { <span class=\"ssp__new-screen\">{{ text.newScreenTag }}</span> }\n @if (s.waiting_on && s.status !== 'concluida' && s.status !== 'recusada') {\n <hm-tag [name]=\"text.waiting[s.waiting_on]\" [color]=\"waitingColors[s.waiting_on]\" />\n }\n </div>\n @if (excerptOf(s); as ex) {\n <p class=\"ssp__excerpt\">{{ ex }}</p>\n }\n <div class=\"ssp__item-foot\">\n <hm-account-avatar size=\"small\" [name]=\"personName(s.author)\" [imageUrl]=\"s.author?.picture\" />\n <span class=\"ssp__byline\">\n <span class=\"ssp__byline-name\">{{ personName(s.author) }}</span>\n <time [attr.datetime]=\"s.last_activity_at || s.updated_at\">{{ age(s.last_activity_at || s.updated_at) }}</time>\n </span>\n <span class=\"ssp__counts\">\n @if (s.can_comment) {\n <span class=\"ssp__count-item\" [attr.title]=\"commentsText(s.comments_count)\">\n <hm-icon shape=\"comment-message\" /><span aria-hidden=\"true\">{{ s.comments_count }}</span><span class=\"ssp__sr\">{{ commentsText(s.comments_count) }}</span>\n </span>\n }\n <!-- Apoiar direto no cartão (a própria só mostra a contagem: ninguém apoia o que pediu). -->\n @if (s.mine) {\n <span class=\"ssp__count-item\" [attr.title]=\"votesText(s.votes)\">\n <hm-icon shape=\"thumbs-up\" /><span aria-hidden=\"true\">{{ s.votes }}</span><span class=\"ssp__sr\">{{ votesText(s.votes) }}</span>\n </span>\n } @else {\n <hm-button class=\"ssp__support\" size=\"small\" emphasis=\"minimal\" icon=\"thumbs-up\" toggle [pressed]=\"s.voted\"\n [disabled]=\"isVoting(s.id)\" [attr.title]=\"supportText(s)\" (clicked)=\"toggleSupport(s)\">\n <span aria-hidden=\"true\">{{ s.votes }}</span><span class=\"ssp__sr\">{{ supportText(s) }}</span>\n </hm-button>\n }\n </span>\n </div>\n </li>\n }\n </ul>\n\n @if (total() > pagination().size) {\n <hm-paginator variant=\"simple\" [label]=\"text.appPagination\" [state]=\"pagination()\" [totalItems]=\"total()\"\n [sizes]=\"[20, 50]\" (stateChanged)=\"onPage($event)\" />\n }\n</section>\n\n<!-- A sugestão aberta: gaveta com as abas Conversa (o chat) e Detalhes. -->\n<hm-drawer [heading]=\"drawerHeading()\" size=\"large\" [open]=\"panelOpen()\" (openChange)=\"$event || close()\">\n @if (detailError()) {\n <hm-alert variant=\"error\">{{ detailError() }}</hm-alert>\n } @else if (selected(); as s) {\n <div class=\"ssp-detail\" [class.ssp-detail--alert]=\"waitingOnMe()\">\n <div class=\"ssp__item-meta\">\n <span class=\"ssp__key\">{{ s.key }}</span>\n <span class=\"ssp__status\" [attr.data-status]=\"s.status\"><span class=\"ssp__dot\" aria-hidden=\"true\"></span>{{ text.statuses[s.status] }}</span>\n <span class=\"ssp__kind\" [attr.data-kind]=\"s.kind\"><hm-icon [shape]=\"kindIcons[s.kind]\" />{{ text.kinds[s.kind] }}</span>\n @if (s.archived) { <hm-tag [name]=\"text.archivedTag\" /> }\n @if (s.waiting_on && s.status !== 'concluida' && s.status !== 'recusada') {\n <hm-tag [name]=\"text.waiting[s.waiting_on]\" [color]=\"waitingColors[s.waiting_on]\" />\n }\n <!-- O apoio fica fora das abas: vale para as duas. -->\n <hm-button class=\"ssp-detail__support\" size=\"small\" emphasis=\"medium\" icon=\"thumbs-up\" toggle [pressed]=\"s.voted\"\n [disabled]=\"s.mine || isVoting(s.id)\" (clicked)=\"toggleSupport(s)\">{{ supportText(s) }}</hm-button>\n </div>\n @if (waitingOnMe()) {\n <hm-alert variant=\"warning\">{{ page.waitingYou }}</hm-alert>\n }\n\n <hm-tabs [label]=\"page.details\" [active]=\"tab()\" (activeChange)=\"pickTab($event)\">\n <hm-tab id=\"details\" [label]=\"page.details\">\n <div class=\"ssp-detail__body\">\n @if (!s.can_comment) {\n <hm-alert variant=\"info\">{{ page.readOnly }}</hm-alert>\n }\n @if (s.description_html) {\n <hm-rich-text class=\"ssp-detail__description\" [label]=\"text.description\" labelHidden readonly hideToolbar [value]=\"s.description_html\" />\n } @else if (s.description) {\n <p class=\"ssp-detail__description\">{{ s.description }}</p>\n } @else {\n <p class=\"ssp__hint\">{{ text.noDescription }}</p>\n }\n\n <dl class=\"ssp-detail__facts\">\n <dt>{{ text.screenOrigin }}</dt>\n <dd>\n @if (s.screen.new) { <span class=\"ssp__new-screen\">{{ text.newScreenTag }}</span> }\n {{ screenText(s) }}\n </dd>\n <dt>{{ text.requestedBy }}</dt>\n <dd>\n <hm-account-avatar size=\"small\" [name]=\"personName(s.author)\" [imageUrl]=\"s.author?.picture\" />\n {{ personName(s.author) }} · {{ age(s.created_at) }}\n </dd>\n <!-- Os grupos em linha, no modelo dos rótulos (o que não cabe vira \"+N\"), como no quadro da equipe. -->\n <dt>{{ page.groups }}</dt>\n <dd class=\"ssp-detail__groups\"><spine-tag-row [label]=\"page.groups\" [items]=\"s.groups\" [empty]=\"text.noGroups\" /></dd>\n <dt>{{ text.assignees }}</dt>\n <dd>\n @for (p of s.assignees; track p.user_id) {\n <hm-account-avatar size=\"small\" [name]=\"personName(p)\" [imageUrl]=\"p.picture\" />\n <span>{{ personName(p) }}</span>\n } @empty { <span class=\"ssp__hint\">{{ text.nobody }}</span> }\n </dd>\n <dt>{{ text.createdAt }}</dt>\n <dd>{{ date(s.created_at) }}</dd>\n </dl>\n\n @for (r of s.reasons; track r) {\n <p class=\"ssp__hint\">{{ page.reasonHints[r] }}</p>\n }\n @for (m of s.merged_from; track m.id) {\n <p class=\"ssp-detail__merged\">{{ mergedFromText(m.key, s.key) }}</p>\n }\n\n </div>\n </hm-tab>\n <!-- A conversa é de quem pediu, foi agrupado ou participa (can_comment); quem só vê pelo grupo fica com os Detalhes. -->\n @if (s.can_comment) {\n <hm-tab id=\"conversation\" [label]=\"page.conversation\" [count]=\"s.comments_count || null\">\n @if (conversation()?.error) {\n <hm-alert variant=\"error\">{{ page.conversationError }}</hm-alert>\n }\n <!-- A conversa em chat: à direita o que a pessoa escreveu como quem pede; o resto (inclusive ela mesma como\n equipe) à esquerda, com o papel no cabeçalho. -->\n <spine-suggestion-chat class=\"ssp-detail__chat\" side=\"solicitante\" [me]=\"me()\" [items]=\"chatItems()\"\n [label]=\"page.conversation\" [empty]=\"page.conversationEmpty\"\n [hasMore]=\"(conversation()?.messages?.length ?? 0) < (conversation()?.total ?? 0)\"\n [loading]=\"!!conversation()?.loading\"\n [composerLabel]=\"page.reply\" [placeholder]=\"page.replyPlaceholder\" [sendLabel]=\"page.replySend\"\n [sending]=\"sending()\" [(draft)]=\"reply\" (loadHistory)=\"loadOlder()\" (send)=\"send($event)\" />\n </hm-tab>\n }\n\n </hm-tabs>\n </div>\n } @else {\n <p class=\"ssp__hint\">{{ page.pickOne }}</p>\n }\n</hm-drawer>\n\n<spine-suggestions-dialog [(view)]=\"dialog\" [onPage]=\"true\" (created)=\"onCreated($event)\" />\n"],"names":[],"mappings":"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"}