@trismegisto/spine 3.3.5 → 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.
- package/README.md +4 -2
- package/fesm2022/trismegisto-spine-audit.mjs +20 -2
- package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-audit.component-D8HUpZtA.mjs → trismegisto-spine-auto-service-auto-service-audit.component-CszXNvSs.mjs} +2 -2
- 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
- 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
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-CknHYd_P.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs → trismegisto-spine-auto-service-auto-service-client.component-Dg3mJrpz.mjs} +24 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-Dg3mJrpz.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-delete-CV_t9vxm.mjs → trismegisto-spine-auto-service-auto-service-delete-BWY5G-xe.mjs} +2 -2
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-BWY5G-xe.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs → trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs} +21 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DQqzfq0M.mjs.map +1 -0
- 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
- 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
- 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
- package/fesm2022/trismegisto-spine-auto-service-auto-service-news-page.component-Cbaszx4F.mjs.map +1 -0
- 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
- package/fesm2022/trismegisto-spine-auto-service-auto-service-ratings-page.component-CJRIDWXi.mjs.map +1 -0
- 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
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-Bu8YX554.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs → trismegisto-spine-auto-service-auto-service.component-BLkLHp6J.mjs} +23 -5
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-BLkLHp6J.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs → trismegisto-spine-auto-service-home.component-BYMiTZp6.mjs} +6 -3
- package/fesm2022/trismegisto-spine-auto-service-home.component-BYMiTZp6.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-auto-service.mjs +10 -10
- package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-layout-ai-agent-chat.component-C5JljPYD.mjs +294 -0
- package/fesm2022/trismegisto-spine-layout-ai-agent-chat.component-C5JljPYD.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs → trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs} +18 -4
- package/fesm2022/trismegisto-spine-layout-suggestions-page.component-Bh3VGlOR.mjs.map +1 -0
- package/fesm2022/{trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs → trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs} +1012 -57
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-B47sMo_4.mjs.map +1 -0
- package/fesm2022/trismegisto-spine-layout.mjs +1 -1
- package/fesm2022/trismegisto-spine-modal.mjs +4 -1
- package/fesm2022/trismegisto-spine-modal.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-notification.mjs +1 -1
- package/fesm2022/trismegisto-spine-notification.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-routing.mjs +2 -2
- package/fesm2022/trismegisto-spine-routing.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-shell.mjs +2 -1
- package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
- package/fesm2022/trismegisto-spine-side-panel.mjs +4 -1
- package/fesm2022/trismegisto-spine-side-panel.mjs.map +1 -1
- package/fesm2022/trismegisto-spine.mjs +200 -69
- package/fesm2022/trismegisto-spine.mjs.map +1 -1
- package/package.json +6 -6
- package/types/trismegisto-spine-audit.d.ts +11 -4
- package/types/trismegisto-spine-audit.d.ts.map +1 -1
- package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
- package/types/trismegisto-spine-layout.d.ts +124 -105
- package/types/trismegisto-spine-layout.d.ts.map +1 -1
- package/types/trismegisto-spine-modal.d.ts +2 -1
- package/types/trismegisto-spine-modal.d.ts.map +1 -1
- package/types/trismegisto-spine-shell.d.ts.map +1 -1
- package/types/trismegisto-spine-side-panel.d.ts +2 -1
- package/types/trismegisto-spine-side-panel.d.ts.map +1 -1
- package/types/trismegisto-spine.d.ts +104 -28
- package/types/trismegisto-spine.d.ts.map +1 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client-picker.component-NawbfdLW.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-delete-CV_t9vxm.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs.map +0 -1
- package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trismegisto-spine-auto-service-auto-service-suggestions-page.component-Bu8YX554.mjs","sources":["../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/auto-service-suggestions.service.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-task.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-pickers.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/planning/suggestion-planning.store.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/planning/suggestion-risk-form.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-task-detail.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-task-detail.component.html","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/suggestion-merge.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/planning/suggestion-planning-view.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/planning/suggestion-risks.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/planning/suggestion-schedule.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/planning/suggestion-summary.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/planning/suggestion-tasks.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/planning/suggestion-workflow.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/auto-service-suggestions.component.ts","../../../projects/ui/auto-service/src/tabs/auto-service-suggestions/auto-service-suggestions.component.html","../../../projects/ui/auto-service/src/pages/auto-service-suggestions-page.component.ts"],"sourcesContent":["import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport { AuthorizationService } from '@orfeu/angular/core';\nimport { urlPath } from '@trismegisto/primitives/html';\nimport type { SpineSuggestionKind, SpineSuggestionScreen, SpineSuggestionStatus, SpineSuggestionWaiting } from '@trismegisto/spine/layout';\nimport { AUTO_SERVICE_CONFIG } from '../../auto-service.tokens';\nimport {\n AutoServiceSuggestionEvent, AutoServiceTask, RiskStatus, SprintState, TaskCatalogLabel, TaskLabel, TaskMergePreview,\n TaskMilestone, TaskPersonOption, TaskPriority, TaskRisk, TaskRole, TaskSprint,\n} from './suggestion-task';\n\nexport type { AutoServiceSuggestionEvent } from './suggestion-task';\n\n/** O quadro: as tarefas, quantos dias a concluída fica nele e a janela do \"vencendo\" (o servidor decide; a tela diz). */\nexport interface AutoServiceSuggestionBoard {\n suggestions: AutoServiceTask[];\n doneDays: number;\n dueSoonDays: number;\n}\n\nexport interface AutoServiceSuggestionArchiveQuery {\n limit: number;\n offset: number;\n search?: string;\n kind?: SpineSuggestionKind | '';\n status?: 'concluida' | 'recusada' | '';\n}\n\n/** O que a equipe edita na tarefa (PATCH): só o que vier. */\nexport interface AutoServiceTaskEdit {\n title?: string;\n kind?: SpineSuggestionKind;\n description_html?: string;\n priority?: TaskPriority;\n start_date?: string | null;\n due_date?: string | null;\n checklist_on_card?: boolean;\n /** Com quem está a vez na conversa (null = em dia). O servidor também muda sozinho a cada comentário. */\n waiting_on?: SpineSuggestionWaiting | null;\n screen?: SpineSuggestionScreen;\n /** Pontos (0..999; null limpa) e a sprint (null = backlog). */\n estimate?: number | null;\n sprint_id?: string | null;\n}\n\n/** Criação ou edição de uma sprint (só o que vier, na edição). */\nexport interface AutoServiceSprintInput {\n name?: string;\n goal?: string;\n start_date?: string;\n end_date?: string;\n capacity?: number | null;\n state?: SprintState;\n}\n\n/** Criação ou edição de um risco; `owner_id: 'me'` = quem está agindo. */\nexport interface AutoServiceRiskInput {\n title?: string;\n likelihood?: number;\n impact?: number;\n owner_id?: string | null;\n status?: RiskStatus;\n mitigation?: string;\n /** A tarefa do risco (obrigatória na criação). */\n suggestion_id?: string;\n}\n\nexport interface AutoServiceTaskDraft extends AutoServiceTaskEdit {\n title: string;\n status?: SpineSuggestionStatus;\n people?: Array<{ user_id: string; role: TaskRole }>;\n label_ids?: string[];\n}\n\n/** Janelas quando o servidor não diz (as mesmas constantes do argos-admin). */\nexport const AUTO_SERVICE_SUGGESTION_DONE_DAYS = 7;\nexport const AUTO_SERVICE_SUGGESTION_DUE_SOON_DAYS = 1;\n\n/**\n * O quadro de trabalho das sugestões do client — `argos-admin /auto-service/:clientId/suggestions` (atrás do\n * clientAdminGuard, como o resto do auto-serviço). Serviço próprio da tela, para não engordar o `AutoServiceService`.\n * Toda mudança na tarefa responde a tarefa inteira (com o checklist completo); mover responde a tarefa leve.\n */\n@Injectable({ providedIn: 'root' })\nexport class AutoServiceSuggestionsService {\n private readonly http = inject(HttpClient);\n private readonly auth = inject(AuthorizationService);\n private readonly config = inject(AUTO_SERVICE_CONFIG);\n\n private url(strings: TemplateStringsArray, ...ids: readonly string[]): string {\n return `${this.config.adminApi}/auto-service${urlPath(strings, ...ids)}`;\n }\n\n private get headers(): HttpHeaders {\n return new HttpHeaders({ 'x-access-token': this.auth.getToken() ?? '' });\n }\n\n private read<T>(url: string, params?: HttpParams): Promise<T> {\n return firstValueFrom(this.http.get<T>(url, { headers: this.headers, params }));\n }\n\n /**\n * O quadro (`board=true`): sem arquivadas, recusadas e concluídas fora da janela — o corte é do servidor. A tela\n * filtra o resto sobre a lista inteira: a posição de cada cartão é a da coluna inteira.\n */\n async board(clientId: string): Promise<AutoServiceSuggestionBoard> {\n const res = await this.read<{ suggestions: AutoServiceTask[]; done_days?: number; due_soon_days?: number }>(\n this.url`/${clientId}/suggestions`, new HttpParams().set('board', 'true'));\n return {\n suggestions: res.suggestions ?? [],\n doneDays: res.done_days ?? AUTO_SERVICE_SUGGESTION_DONE_DAYS,\n dueSoonDays: res.due_soon_days ?? AUTO_SERVICE_SUGGESTION_DUE_SOON_DAYS,\n };\n }\n\n /** O arquivo (`archive=true`): arquivadas, recusadas e concluídas antigas, paginado e filtrado no servidor. */\n async archive(clientId: string, q: AutoServiceSuggestionArchiveQuery): Promise<{ suggestions: AutoServiceTask[]; total: number }> {\n let params = new HttpParams().set('archive', 'true').set('limit', q.limit).set('offset', q.offset);\n if (q.search) params = params.set('search', q.search);\n if (q.kind) params = params.set('kind', q.kind);\n if (q.status) params = params.set('status', q.status);\n const res = await this.read<{ suggestions: AutoServiceTask[]; total: number }>(this.url`/${clientId}/suggestions`, params);\n return { suggestions: res.suggestions ?? [], total: res.total ?? 0 };\n }\n\n /**\n * Todas as tarefas do app, sem o recorte do quadro (até o teto do servidor): o planejamento precisa das concluídas\n * antigas (burndown da sprint) e das que estão em sprint. Arquivadas e agrupadas são filtradas por quem usa.\n */\n async tasks(clientId: string): Promise<AutoServiceTask[]> {\n const res = await this.read<{ suggestions: AutoServiceTask[] }>(this.url`/${clientId}/suggestions`);\n return res.suggestions ?? [];\n }\n\n /** A tarefa inteira (checklist completo, pessoas, rótulos, última atividade). */\n task(clientId: string, id: string): Promise<AutoServiceTask> {\n return this.read<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}`);\n }\n\n /** Pela chave (\"SUG-12\"): o link copiado abre a tarefa. */\n lookup(clientId: string, key: string): Promise<AutoServiceTask> {\n return this.read<AutoServiceTask>(this.url`/${clientId}/suggestions/lookup`, new HttpParams().set('key', key));\n }\n\n create(clientId: string, draft: AutoServiceTaskDraft): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions`, draft, { headers: this.headers }));\n }\n\n update(clientId: string, id: string, edit: AutoServiceTaskEdit): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.patch<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}`, edit, { headers: this.headers }));\n }\n\n /**\n * Arrastar ou mudar pelo detalhe: status (coluna) e/ou posição (índice na coluna de destino, contando a coluna\n * inteira); `comment` vai junto com a mudança de status (`internal` = só a equipe vê).\n */\n move(clientId: string, id: string, change: { status?: SpineSuggestionStatus; position?: number; comment?: string; internal?: boolean }): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.patch<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}`, change, { headers: this.headers }));\n }\n\n remove(clientId: string, id: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(this.url`/${clientId}/suggestions/${id}`, { headers: this.headers }));\n }\n\n setArchived(clientId: string, id: string, archived: boolean): Promise<AutoServiceTask> {\n const url = archived ? this.url`/${clientId}/suggestions/${id}/archive` : this.url`/${clientId}/suggestions/${id}/restore`;\n return firstValueFrom(this.http.post<AutoServiceTask>(url, {}, { headers: this.headers }));\n }\n\n /** Prévia do agrupamento em `into`: quantos relatores e apoios passariam (nada é gravado). */\n mergePreview(clientId: string, id: string, into: string): Promise<TaskMergePreview> {\n return this.read<TaskMergePreview>(this.url`/${clientId}/suggestions/${id}/merge`, new HttpParams().set('into', into));\n }\n\n /** Agrupa esta em `into`: responde o destino inteiro (com os relatores e as agrupadas). */\n merge(clientId: string, id: string, into: string): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/merge`, { into }, { headers: this.headers }));\n }\n\n /** Desagrupa esta (a origem): ela volta ao quadro; responde ela inteira. */\n unmerge(clientId: string, id: string): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/unmerge`, {}, { headers: this.headers }));\n }\n\n /** Comentários ou atividades, do mais novo, paginado. */\n events(clientId: string, id: string, q: { type: 'comments' | 'activity'; limit: number; offset: number }): Promise<{ events: AutoServiceSuggestionEvent[]; total: number }> {\n const params = new HttpParams().set('type', q.type).set('limit', q.limit).set('offset', q.offset);\n return this.read(this.url`/${clientId}/suggestions/${id}/events`, params);\n }\n\n comment(clientId: string, id: string, comment: string, internal = false): Promise<AutoServiceSuggestionEvent> {\n return firstValueFrom(this.http.post<AutoServiceSuggestionEvent>(this.url`/${clientId}/suggestions/${id}/comments`, { comment, internal }, { headers: this.headers }));\n }\n\n /** Marca a conversa como lida por quem consulta (zera o `unread` da tarefa). */\n markRead(clientId: string, id: string): Promise<void> {\n return firstValueFrom(this.http.post<void>(this.url`/${clientId}/suggestions/${id}/read`, {}, { headers: this.headers }));\n }\n\n /** Responsável/envolvido: `userId` ou \"me\" (atribuir a mim). */\n addPerson(clientId: string, id: string, userId: string, role: TaskRole): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/people`, { user_id: userId, role }, { headers: this.headers }));\n }\n\n removePerson(clientId: string, id: string, userId: string, role: TaskRole): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.delete<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/people/${userId}`, {\n headers: this.headers, params: new HttpParams().set('role', role),\n }));\n }\n\n addChecklistItem(clientId: string, id: string, text: string): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.post<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/checklist`, { text }, { headers: this.headers }));\n }\n\n updateChecklistItem(clientId: string, id: string, itemId: string, change: { text?: string; done?: boolean; position?: number }): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.patch<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/checklist/${itemId}`, change, { headers: this.headers }));\n }\n\n removeChecklistItem(clientId: string, id: string, itemId: string): Promise<AutoServiceTask> {\n return firstValueFrom(this.http.delete<AutoServiceTask>(this.url`/${clientId}/suggestions/${id}/checklist/${itemId}`, { headers: this.headers }));\n }\n\n // --- rótulos ---\n\n async labels(clientId: string): Promise<TaskCatalogLabel[]> {\n const res = await this.read<{ labels: TaskCatalogLabel[] }>(this.url`/${clientId}/suggestions/labels`);\n return res.labels ?? [];\n }\n\n createLabel(clientId: string, name: string, color: string): Promise<TaskLabel> {\n return firstValueFrom(this.http.post<TaskLabel>(this.url`/${clientId}/suggestions/labels`, { name, color }, { headers: this.headers }));\n }\n\n setLabel(clientId: string, id: string, labelId: string, linked: boolean): Promise<AutoServiceTask> {\n const url = this.url`/${clientId}/suggestions/${id}/labels/${labelId}`;\n return firstValueFrom(linked\n ? this.http.put<AutoServiceTask>(url, {}, { headers: this.headers })\n : this.http.delete<AutoServiceTask>(url, { headers: this.headers }));\n }\n\n // --- planejamento: dependências, sprints, marcos e riscos ---\n\n /** \"Esta depende daquela\" (liga ou desliga); ciclo responde 409 `dependency_cycle`. Responde esta tarefa inteira. */\n setDependency(clientId: string, id: string, dependsOnId: string, linked: boolean): Promise<AutoServiceTask> {\n const url = this.url`/${clientId}/suggestions/${id}/dependencies/${dependsOnId}`;\n return firstValueFrom(linked\n ? this.http.put<AutoServiceTask>(url, {}, { headers: this.headers })\n : this.http.delete<AutoServiceTask>(url, { headers: this.headers }));\n }\n\n async sprints(clientId: string): Promise<TaskSprint[]> {\n const res = await this.read<{ sprints: TaskSprint[] }>(this.url`/${clientId}/suggestions/sprints`);\n return res.sprints ?? [];\n }\n\n createSprint(clientId: string, input: AutoServiceSprintInput): Promise<TaskSprint> {\n return firstValueFrom(this.http.post<TaskSprint>(this.url`/${clientId}/suggestions/sprints`, input, { headers: this.headers }));\n }\n\n /** Edita; `state: 'closed'` encerra e o servidor devolve ao backlog as tarefas não concluídas. */\n updateSprint(clientId: string, sprintId: string, input: AutoServiceSprintInput): Promise<TaskSprint> {\n return firstValueFrom(this.http.patch<TaskSprint>(this.url`/${clientId}/suggestions/sprints/${sprintId}`, input, { headers: this.headers }));\n }\n\n removeSprint(clientId: string, sprintId: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(this.url`/${clientId}/suggestions/sprints/${sprintId}`, { headers: this.headers }));\n }\n\n async milestones(clientId: string): Promise<TaskMilestone[]> {\n const res = await this.read<{ milestones: TaskMilestone[] }>(this.url`/${clientId}/suggestions/milestones`);\n return res.milestones ?? [];\n }\n\n createMilestone(clientId: string, title: string, date: string): Promise<TaskMilestone> {\n return firstValueFrom(this.http.post<TaskMilestone>(this.url`/${clientId}/suggestions/milestones`, { title, date }, { headers: this.headers }));\n }\n\n updateMilestone(clientId: string, milestoneId: string, change: { title?: string; date?: string }): Promise<TaskMilestone> {\n return firstValueFrom(this.http.patch<TaskMilestone>(this.url`/${clientId}/suggestions/milestones/${milestoneId}`, change, { headers: this.headers }));\n }\n\n removeMilestone(clientId: string, milestoneId: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(this.url`/${clientId}/suggestions/milestones/${milestoneId}`, { headers: this.headers }));\n }\n\n async risks(clientId: string): Promise<TaskRisk[]> {\n const res = await this.read<{ risks: TaskRisk[] }>(this.url`/${clientId}/suggestions/risks`);\n return res.risks ?? [];\n }\n\n createRisk(clientId: string, input: AutoServiceRiskInput & { title: string }): Promise<TaskRisk> {\n return firstValueFrom(this.http.post<TaskRisk>(this.url`/${clientId}/suggestions/risks`, input, { headers: this.headers }));\n }\n\n updateRisk(clientId: string, riskId: string, input: AutoServiceRiskInput): Promise<TaskRisk> {\n return firstValueFrom(this.http.patch<TaskRisk>(this.url`/${clientId}/suggestions/risks/${riskId}`, input, { headers: this.headers }));\n }\n\n removeRisk(clientId: string, riskId: string): Promise<void> {\n return firstValueFrom(this.http.delete<void>(this.url`/${clientId}/suggestions/risks/${riskId}`, { headers: this.headers }));\n }\n\n // --- pessoas do realm do app (a mesma busca da aba Grupos, com a foto) ---\n\n async searchPeople(clientId: string, search: string): Promise<TaskPersonOption[]> {\n let params = new HttpParams().set('limit', 10);\n if (search.trim()) params = params.set('search', search.trim());\n const res = await this.read<{ users: TaskPersonOption[] }>(this.url`/${clientId}/users`, params);\n return res.users ?? [];\n }\n}\n","import type { SpineSuggestion, SpineSuggestionPerson, SpineSuggestionStatus } from '@trismegisto/spine/layout';\n\n// O que a equipe vê de uma sugestão no quadro de trabalho (auto-serviço): a sugestão de quem pediu mais o que é da\n// tarefa -- chave, prioridade, datas, capa, descrição rica, pessoas, rótulos e checklist. Constantes e contas puras\n// (prazo, capa) ficam aqui, fora dos componentes, para o cartão, o detalhe e os testes usarem as mesmas.\n\nexport const TASK_PRIORITIES = ['urgente', 'alta', 'media', 'baixa'] as const;\nexport type TaskPriority = (typeof TASK_PRIORITIES)[number];\n\n/** Ícone e intenção de cada prioridade (o texto vem do catálogo; a cor nunca é a única pista). */\nexport const TASK_PRIORITY_ICONS: Record<TaskPriority, string> = {\n urgente: 'exclamation-triangle', alta: 'arrow-up', media: 'minus', baixa: 'arrow-bottom',\n};\n\n/** Cores de rótulo: tokens da paleta categórica do tema (o servidor só aceita estes). */\nexport const TASK_LABEL_COLORS = ['cat-1', 'cat-2', 'cat-3', 'cat-4', 'cat-5', 'cat-6', 'cat-7', 'cat-8'] as const;\n\nexport type TaskRole = 'responsavel' | 'envolvido';\n\nexport interface TaskLabel { id: string; name: string; color: string }\nexport interface TaskCatalogLabel extends TaskLabel { uses: number }\nexport interface TaskChecklistItem { id: string; text: string; done: boolean; position: number; done_by: string | null; done_at: string | null }\n\n/** Uma sugestão citada por outra (o destino de uma agrupada, as agrupadas de um destino). */\nexport interface TaskRef { id: string; key: string; title: string }\n/** Quem pediu: o autor (`role: author`) ou um relator que veio de uma agrupada (`from_suggestion_id`). */\nexport interface TaskReporter extends SpineSuggestionPerson { role: 'author' | 'reporter'; from_suggestion_id: string | null }\n/** Uma agrupada no detalhe do destino. */\nexport interface TaskMergedOrigin extends TaskRef { status: SpineSuggestionStatus; author: SpineSuggestionPerson | null }\n\nexport interface AutoServiceTask extends SpineSuggestion {\n key: string;\n key_number: number;\n description_html: string;\n priority: TaskPriority;\n start_date: string | null;\n due_date: string | null;\n checklist_on_card: boolean;\n origin: 'usuario' | 'equipe';\n archived_at: string | null;\n assignees: SpineSuggestionPerson[];\n watchers: SpineSuggestionPerson[];\n labels: TaskLabel[];\n checklist: { total: number; done: number; items: TaskChecklistItem[] | null };\n last_activity: { at: string; actor: SpineSuggestionPerson | null } | null;\n /** Agrupada em outra: o destino (sai do quadro e fica no arquivo). */\n merged_into?: TaskRef | null;\n /** Quantas foram agrupadas nesta. */\n merged_count?: number;\n /** Relatores além do autor (vindos das agrupadas). */\n reporters_count?: number;\n /** Só no detalhe: o autor e os relatores extras, com foto. */\n reporters?: TaskReporter[];\n /** Só no detalhe: as agrupadas nesta. */\n merged?: TaskMergedOrigin[];\n /** Os grupos de quem pediu (o escopo de quem vê a sugestão); vazio = criada pela equipe. */\n groups?: Array<{ id: string; name: string }>;\n /** Mensagens de quem pede que quem consulta ainda não leu. */\n unread?: number;\n /** Planejamento: pontos, a sprint (null = backlog) e os ids das tarefas que precisam terminar antes desta. */\n estimate?: number | null;\n sprint_id?: string | null;\n depends_on?: string[];\n /** Nota de risco: a maior probabilidade x impacto (1..25) entre os riscos abertos da tarefa; null = nenhum. */\n risk_score?: number | null;\n}\n\nexport type SprintState = 'planned' | 'active' | 'closed';\n\n/** Uma sprint do app, com as contas do servidor (tarefas e pontos fora das arquivadas e agrupadas). */\nexport interface TaskSprint {\n id: string;\n name: string;\n goal: string;\n start_date: string;\n end_date: string;\n /** Pontos que a equipe entrega na sprint (null = sem capacidade definida). */\n capacity: number | null;\n state: SprintState;\n tasks: number;\n points: number;\n done_points: number;\n}\n\n/** Um marco do cronograma (losango no Gantt). */\nexport interface TaskMilestone { id: string; title: string; date: string }\n\nexport const RISK_STATUSES = ['identified', 'mitigating', 'closed'] as const;\nexport type RiskStatus = (typeof RISK_STATUSES)[number];\n\n/** Um risco de uma tarefa: probabilidade e impacto de 1 a 5. */\nexport interface TaskRisk {\n id: string;\n title: string;\n likelihood: number;\n impact: number;\n status: RiskStatus;\n mitigation: string;\n owner: SpineSuggestionPerson | null;\n created_at: string;\n updated_at: string;\n /** A tarefa ameaçada; null só nos riscos criados antes de o risco ser de uma tarefa. */\n suggestion_id: string | null;\n suggestion_title: string | null;\n}\n\n/** O que um agrupamento passaria para o destino (a prévia do servidor). */\nexport interface TaskMergePreview { reporters: number; votes: number; target: TaskRef }\n\n/** Um passo do histórico: status, comentário (interno = só a equipe) ou mudança de um campo (field + antes/depois). */\nexport interface AutoServiceSuggestionEvent {\n id: string;\n kind: 'status' | 'comment' | 'change';\n from_status: SpineSuggestionStatus | 'nova' | null;\n to_status: SpineSuggestionStatus | 'nova' | null;\n comment: string | null;\n internal?: boolean;\n /** Escrito por quem pediu (ou um envolvido) pela página de quem pede. */\n from_requester?: boolean;\n field?: string | null;\n from_value?: string | null;\n to_value?: string | null;\n created_at: string;\n actor: SpineSuggestionPerson | null;\n}\n\n/** Pessoa da busca do auto-serviço (`GET /auto-service/:clientId/users`), com a foto. */\nexport interface TaskPersonOption { id: string; username: string | null; name: string | null; email?: string | null; picture: string | null }\n\n/** Situação do prazo: vencida (antes de hoje, aberta), hoje, amanhã, futura, ou sem prazo / encerrada. */\nexport type DueState = 'overdue' | 'today' | 'tomorrow' | 'later' | null;\n\n/** Hoje como AAAA-MM-DD no fuso dado (o do perfil da pessoa). */\nexport function todayIso(timeZone?: string, now = new Date()): string {\n try {\n return new Intl.DateTimeFormat('en-CA', { timeZone, year: 'numeric', month: '2-digit', day: '2-digit' }).format(now);\n } catch {\n return now.toISOString().slice(0, 10);\n }\n}\n\n/** AAAA-MM-DD mais `days` dias (negativo volta). */\nexport function addDays(iso: string, days: number): string {\n const d = new Date(`${iso}T00:00:00Z`);\n d.setUTCDate(d.getUTCDate() + days);\n return d.toISOString().slice(0, 10);\n}\n\n/** O prazo da tarefa contra hoje. Concluída/recusada não vence. */\nexport function dueState(task: Pick<AutoServiceTask, 'due_date' | 'status'>, today: string): DueState {\n if (!task.due_date || task.status === 'concluida' || task.status === 'recusada') return null;\n if (task.due_date < today) return 'overdue';\n if (task.due_date === today) return 'today';\n if (task.due_date === addDays(today, 1)) return 'tomorrow';\n return 'later';\n}\n\n/** Dias inteiros entre duas datas AAAA-MM-DD (`to` - `from`). */\nexport function daysBetween(from: string, to: string): number {\n return Math.round((Date.parse(`${to}T00:00:00Z`) - Date.parse(`${from}T00:00:00Z`)) / 86_400_000);\n}\n\n/** Duração em dias, horas e minutos inteiros (o \"4h 12min\" do quadro). Negativa vira zero. */\nexport function splitDuration(ms: number): { d: number; h: number; m: number } {\n const minutes = Math.max(0, Math.floor(ms / 60_000));\n return { d: Math.floor(minutes / 1440), h: Math.floor((minutes % 1440) / 60), m: minutes % 60 };\n}\n\n/** Responsável por mim? (o `sub` da sessão) */\nexport const assignedTo = (task: AutoServiceTask, userId: string) => !!userId && task.assignees.some((p) => p.user_id === userId);\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { CheckboxComponent } from '@trismegisto/angular/checkbox';\nimport { IconComponent } from '@trismegisto/angular/icon';\nimport { SearchFieldComponent } from '@trismegisto/angular/search-field';\nimport { formatMessage } from '@trismegisto/primitives/i18n';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { AutoServiceSuggestionsService } from './auto-service-suggestions.service';\nimport { TASK_LABEL_COLORS, TaskCatalogLabel, TaskPersonOption } from './suggestion-task';\n\n// Os pequenos seletores do quadro de sugestões, para ir dentro de um `hm-popover` (o cartão e o detalhe da tarefa):\n// pessoas do realm do app (com foto) e rótulos do catálogo do app.\n\n/**\n * Pessoa do realm do app: busca (a mesma do auto-serviço, com a foto), as já escolhidas de fora. Lê na abertura (as\n * primeiras) e a cada termo, com espera.\n */\n@Component({\n selector: 'spine-suggestion-people-picker',\n imports: [AccountAvatarComponent, SearchFieldComponent],\n template: `\n <div class=\"as-picker\">\n <hm-search-field [label]=\"text.peopleSearch\" labelHidden [placeholder]=\"text.peopleSearch\" [landmark]=\"false\"\n [debounce]=\"250\" [loading]=\"loading()\" (search)=\"load($event)\" />\n <ul class=\"as-picker__list\" [attr.aria-busy]=\"loading() ? 'true' : null\">\n @for (p of options(); track p.id) {\n <li>\n <button type=\"button\" class=\"as-picker__person\" (click)=\"picked.emit(p)\">\n <hm-account-avatar size=\"small\" [name]=\"nameOf(p)\" [imageUrl]=\"p.picture\" />\n <span class=\"as-picker__person-text\">\n <span class=\"as-picker__person-name\">{{ nameOf(p) }}</span>\n @if (p.username && p.name) { <span class=\"as-picker__muted\">{{ p.username }}</span> }\n </span>\n </button>\n </li>\n } @empty {\n @if (!loading()) { <li class=\"as-picker__muted\">{{ text.peopleEmpty }}</li> }\n }\n </ul>\n </div>\n `,\n styleUrl: './suggestion-pickers.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SuggestionPeoplePickerComponent {\n protected readonly text = inject(SPINE_MESSAGES).suggestions;\n private readonly service = inject(AutoServiceSuggestionsService);\n readonly clientId = input.required<string>();\n /** Quem já está no papel (não aparece de novo). */\n readonly exclude = input<readonly string[]>([]);\n readonly picked = output<TaskPersonOption>();\n\n private readonly found = signal<TaskPersonOption[]>([]);\n protected readonly loading = signal(false);\n protected readonly options = computed(() => this.found().filter((p) => !this.exclude().includes(p.id)));\n private seq = 0;\n\n constructor() {\n effect(() => {\n this.clientId();\n untracked(() => void this.load(''));\n });\n }\n\n protected async load(term: string): Promise<void> {\n const mine = ++this.seq;\n this.loading.set(true);\n try {\n const list = await this.service.searchPeople(this.clientId(), term);\n if (mine === this.seq) this.found.set(list);\n } catch {\n if (mine === this.seq) this.found.set([]);\n } finally {\n if (mine === this.seq) this.loading.set(false);\n }\n }\n\n protected nameOf(p: TaskPersonOption): string {\n return p.name || p.username || p.email || '';\n }\n}\n\n/**\n * Rótulos do catálogo do app: marcar/desmarcar (caixa por rótulo, o ponto na cor dele) e, quando o termo digitado não\n * existe, \"Criar o rótulo\" com a cor escolhida.\n */\n@Component({\n selector: 'spine-suggestion-label-picker',\n imports: [ButtonComponent, CheckboxComponent, SearchFieldComponent],\n template: `\n <div class=\"as-picker\">\n <hm-search-field [label]=\"text.labelFilter\" labelHidden [placeholder]=\"text.labelFilter\" [landmark]=\"false\"\n [value]=\"term()\" (valueChange)=\"term.set($event)\" />\n <ul class=\"as-picker__list\">\n @for (l of shown(); track l.id) {\n <li class=\"as-picker__label-row\">\n <span class=\"as-picker__dot\" [class]=\"'as-tok--' + l.color\" aria-hidden=\"true\"></span>\n <hm-checkbox [label]=\"l.name\" [checked]=\"selected().includes(l.id)\" (checkedChange)=\"toggled.emit({ label: l, linked: $event })\" />\n </li>\n } @empty {\n @if (!creatable()) { <li class=\"as-picker__muted\">{{ text.noLabels }}</li> }\n }\n </ul>\n @if (creatable()) {\n <span class=\"as-picker__heading\">{{ text.labelColor }}</span>\n <div class=\"as-picker__swatches\">\n @for (c of colors; track c; let i = $index) {\n <button type=\"button\" class=\"as-picker__swatch as-picker__swatch--small\" [class]=\"'as-tok--' + c\"\n [attr.aria-label]=\"colorName(i)\" [attr.aria-pressed]=\"color() === c\" (click)=\"color.set(c)\"></button>\n }\n </div>\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"plus\" (clicked)=\"create()\">{{ createText() }}</hm-button>\n }\n </div>\n `,\n styleUrl: './suggestion-pickers.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SuggestionLabelPickerComponent {\n protected readonly text = inject(SPINE_MESSAGES).suggestions;\n readonly labels = input<readonly TaskCatalogLabel[]>([]);\n readonly selected = input<readonly string[]>([]);\n readonly toggled = output<{ label: TaskCatalogLabel; linked: boolean }>();\n readonly created = output<{ name: string; color: string }>();\n\n protected readonly colors = TASK_LABEL_COLORS;\n protected readonly term = signal('');\n protected readonly color = signal<string>('cat-1');\n protected readonly shown = computed(() => {\n const t = this.term().trim().toLocaleLowerCase();\n return this.labels().filter((l) => !t || l.name.toLocaleLowerCase().includes(t));\n });\n /** Termo que ainda não é rótulo: dá para criar. */\n protected readonly creatable = computed(() => {\n const t = this.term().trim().toLocaleLowerCase();\n return !!t && t.length <= 40 && !this.labels().some((l) => l.name.toLocaleLowerCase() === t);\n });\n protected readonly createText = computed(() => formatMessage(this.text.createLabel, { name: this.term().trim() }));\n\n protected colorName(i: number): string {\n return formatMessage(this.text.labelColorName, { n: i + 1 });\n }\n\n protected create(): void {\n const name = this.term().trim();\n if (!name) return;\n this.created.emit({ name, color: this.color() });\n this.term.set('');\n }\n}\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport { HermesToastService } from '@trismegisto/angular/toast';\nimport type { TaskItem } from '@trismegisto/primitives/tasks';\nimport type { WorkflowAssignee, WorkflowDefinition, WorkflowStatus, WorkflowTone } from '@trismegisto/primitives/workflow';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SPINE_SUGGESTION_STATUSES, SpineSuggestionPerson, SpineSuggestionStatus } from '@trismegisto/spine/layout';\nimport {\n AutoServiceRiskInput, AutoServiceSprintInput, AutoServiceSuggestionsService, AutoServiceTaskEdit,\n} from '../auto-service-suggestions.service';\nimport { AutoServiceTask, RISK_STATUSES, TaskMilestone, TaskPriority, TaskRisk, TaskSprint } from '../suggestion-task';\n\n/** Nota de risco de um risco aberto (probabilidade x impacto); o encerrado não conta. */\nconst openScore = (r: TaskRisk): number | null => (r.status === 'closed' ? null : r.likelihood * r.impact);\n\n/** A prioridade da sugestão no degrau da escala `priority` da lib (a que `hm-task-list`, `hm-backlog` e o Gantt leem). */\nexport const PRIORITY_LEVEL: Record<TaskPriority, string> = { urgente: 'urgent', alta: 'high', media: 'medium', baixa: 'low' };\n\n/** As abertas (o que ainda dá trabalho): as três primeiras colunas do quadro. */\nexport const OPEN_STATUSES: readonly SpineSuggestionStatus[] = ['em_analise', 'planejada', 'em_desenvolvimento'];\n\n/** Tom e categoria de cada status no fluxo (as mesmas cores do quadro, no vocabulário da lib). */\nconst STATUS_FLOW: Record<SpineSuggestionStatus, { category: WorkflowStatus['category']; tone: WorkflowTone }> = {\n em_analise: { category: 'todo', tone: 'info' },\n planejada: { category: 'todo', tone: 'neutral' },\n em_desenvolvimento: { category: 'active', tone: 'warning' },\n concluida: { category: 'done', tone: 'success' },\n recusada: { category: 'canceled', tone: 'neutral' },\n};\n\n/** Uma tarefa no formato das peças de planejamento da lib, com a sugestão original junto. */\nexport interface PlanningTask extends TaskItem {\n readonly task: AutoServiceTask;\n readonly sprintId: string | null;\n readonly createdAt: string;\n /** Quando foi concluída (o `status_at` da concluída); null nas outras. */\n readonly completedAt: string | null;\n}\n\n/** A pessoa da sugestão no formato da lib (id, nome e foto). */\nexport function toAssignee(person: SpineSuggestionPerson): WorkflowAssignee {\n return { id: person.user_id, name: person.name || person.username || person.user_id, imageUrl: person.picture };\n}\n\nexport function toPlanningTask(t: AutoServiceTask): PlanningTask {\n const done = t.status === 'concluida';\n return {\n id: t.id,\n key: t.key,\n title: t.title,\n description: t.description,\n status: t.status,\n priority: PRIORITY_LEVEL[t.priority],\n assignee: t.assignees[0] ? toAssignee(t.assignees[0]) : null,\n start: t.start_date,\n due: t.due_date,\n estimate: t.estimate ?? null,\n dependsOn: t.depends_on ?? [],\n done,\n task: t,\n sprintId: t.sprint_id ?? null,\n createdAt: t.created_at,\n completedAt: done ? (t.status_at ?? t.updated_at) : null,\n };\n}\n\n/**\n * Estado do planejamento do quadro de sugestões (uma instância por tela, nos `providers` do quadro): as tarefas sem o\n * recorte do quadro, as sprints, os marcos e os riscos do app, e as gravações (cada uma aplica a resposta do servidor;\n * falha vira toast e nada muda). As visões (Resumo, Tarefas, Planejamento, Cronograma, Riscos e Fluxo) só leem daqui e\n * chamam as ações; abrir a tarefa fica com o quadro (o detalhe é dele).\n */\n@Injectable()\nexport class SuggestionPlanningStore {\n private readonly service = inject(AutoServiceSuggestionsService);\n private readonly toast = inject(HermesToastService);\n private readonly messages = inject(SPINE_MESSAGES);\n readonly text = this.messages.suggestions;\n readonly plan = this.text.planning;\n readonly locale = this.messages.meta.locale;\n\n readonly clientId = signal('');\n private readonly rawTasks = signal<AutoServiceTask[]>([]);\n readonly sprints = signal<TaskSprint[]>([]);\n readonly milestones = signal<TaskMilestone[]>([]);\n readonly risks = signal<TaskRisk[]>([]);\n /** Os riscos já vieram do servidor (no planejamento, ou quando um detalhe de tarefa abriu fora dele). */\n readonly risksLoaded = signal(false);\n #risksReading: Promise<void> | null = null;\n /** Nota de risco de cada tarefa: a maior entre os riscos abertos dela. */\n readonly scoreBy = computed(() => {\n const map = new Map<string, number>();\n for (const r of this.risks()) {\n const score = openScore(r);\n if (r.suggestion_id && score !== null) map.set(r.suggestion_id, Math.max(map.get(r.suggestion_id) ?? 0, score));\n }\n return map;\n });\n readonly loading = signal(false);\n readonly loadError = signal('');\n /** As sprints já vieram do servidor (o detalhe da tarefa lê as sprints mesmo fora das visões de planejamento). */\n readonly sprintsLoaded = signal(false);\n /** Quem consulta (o `sub` da sessão), para \"Minhas tarefas\". */\n readonly me = signal('');\n\n /** As tarefas do quadro de trabalho: sem arquivadas e sem agrupadas (saíram do quadro). */\n readonly tasks = computed(() => this.rawTasks().filter((t) => !t.archived_at && !t.merged_into));\n readonly items = computed(() => this.tasks().map(toPlanningTask));\n readonly open = computed(() => this.items().filter((t) => OPEN_STATUSES.includes(t.task.status)));\n readonly activeSprint = computed(() => this.sprints().find((s) => s.state === 'active') ?? null);\n readonly sprintName = computed(() => new Map(this.sprints().map((s) => [s.id, s.name])));\n\n /** As pessoas que já aparecem no app (responsáveis, envolvidos, quem pediu e os donos de risco), por nome. */\n readonly people = computed<WorkflowAssignee[]>(() => {\n const byId = new Map<string, WorkflowAssignee>();\n for (const t of this.tasks()) {\n for (const p of [...t.assignees, ...t.watchers, ...(t.author ? [t.author] : [])]) byId.set(p.user_id, toAssignee(p));\n }\n for (const r of this.risks()) if (r.owner) byId.set(r.owner.user_id, toAssignee(r.owner));\n return [...byId.values()].sort((a, b) => a.name.localeCompare(b.name));\n });\n\n /** Os 5 status como a lib entende (o texto é o do catálogo), com quantas há em cada um no quadro. */\n readonly statuses = computed<WorkflowStatus[]>(() => {\n const counts = new Map<string, number>();\n for (const t of this.tasks()) counts.set(t.status, (counts.get(t.status) ?? 0) + 1);\n return SPINE_SUGGESTION_STATUSES.map((id) => ({\n id,\n label: this.text.statuses[id],\n ...STATUS_FLOW[id],\n description: pluralMessage(this.plan.workflow.count, counts.get(id) ?? 0, this.locale),\n }));\n });\n\n /** O fluxo fixo das sugestões (só leitura): o caminho principal, recusar uma aberta e reabrir a concluída. */\n readonly workflow = computed<WorkflowDefinition>(() => {\n const w = this.plan.workflow;\n return {\n statuses: this.statuses(),\n initial: 'em_analise',\n transitions: [\n { from: 'em_analise', to: 'planejada', label: w.plan },\n { from: 'planejada', to: 'em_desenvolvimento', label: w.start },\n { from: 'em_desenvolvimento', to: 'concluida', label: w.finish },\n ...OPEN_STATUSES.map((from) => ({ from, to: 'recusada', label: w.refuse, danger: true, reason: 'optional' as const })),\n { from: 'concluida', to: 'em_desenvolvimento', label: w.reopen },\n { from: 'recusada', to: 'em_analise', label: w.reopen },\n ],\n };\n });\n\n /** O status do risco no vocabulário da lib (o `hm-risk-register` agrupa por ele). */\n readonly riskStatuses = computed<WorkflowStatus[]>(() => RISK_STATUSES.map((id) => ({\n id,\n label: this.plan.risks.statuses[id],\n category: id === 'closed' ? 'done' : id === 'mitigating' ? 'active' : 'todo',\n ...(id === 'identified' ? { tone: 'warning' as const } : {}),\n })));\n\n /** Os riscos no formato do `RiskItem` (o dono como pessoa da lib). */\n readonly riskItems = computed(() => this.risks().map((r) => ({\n id: r.id, title: r.title, likelihood: r.likelihood, impact: r.impact, status: r.status, mitigation: r.mitigation,\n owner: r.owner ? toAssignee(r.owner) : null, risk: r,\n // A tarefa ameaçada sai na linha de baixo do título, no registro.\n category: r.suggestion_title ?? this.plan.risks.noTask,\n })));\n\n /**\n * Nota de risco da tarefa: com os riscos já lidos, a conta é daqui (acompanha cada gravação na hora); sem eles, a\n * que veio do servidor junto com a tarefa.\n */\n riskScoreOf(task: Pick<AutoServiceTask, 'id' | 'risk_score'>): number | null {\n return this.risksLoaded() ? (this.scoreBy().get(task.id) ?? null) : (task.risk_score ?? null);\n }\n\n /** Os riscos de uma tarefa, os abertos e maiores primeiro. */\n risksOf(suggestionId: string): TaskRisk[] {\n return this.risks().filter((r) => r.suggestion_id === suggestionId)\n .sort((a, b) => (openScore(b) ?? -1) - (openScore(a) ?? -1) || a.title.localeCompare(b.title));\n }\n\n /** Lê os riscos uma vez (o detalhe da tarefa abre também fora das visões de planejamento). */\n async ensureRisks(clientId = this.clientId()): Promise<void> {\n if (!clientId || this.risksLoaded()) return;\n this.clientId.set(clientId);\n this.#risksReading ??= this.service.risks(clientId)\n .then((risks) => { if (clientId === this.clientId()) { this.risks.set(risks); this.risksLoaded.set(true); } })\n .catch(() => undefined)\n .finally(() => { this.#risksReading = null; });\n return this.#risksReading;\n }\n\n async load(clientId = this.clientId()): Promise<void> {\n if (!clientId) return;\n this.clientId.set(clientId);\n this.loading.set(true);\n this.loadError.set('');\n try {\n const [tasks, sprints, milestones, risks] = await Promise.all([\n this.service.tasks(clientId), this.service.sprints(clientId), this.service.milestones(clientId), this.service.risks(clientId),\n ]);\n if (clientId !== this.clientId()) return;\n this.rawTasks.set(tasks);\n this.sprints.set(sprints);\n this.sprintsLoaded.set(true);\n this.milestones.set(milestones);\n this.risks.set(risks);\n this.risksLoaded.set(true);\n } catch {\n this.loadError.set(this.plan.loadError);\n } finally {\n this.loading.set(false);\n }\n }\n\n /** A tarefa que o servidor devolveu (detalhe, quadro): troca aqui, sem reler tudo. */\n replace(task: AutoServiceTask): void {\n this.rawTasks.update((list) => (list.some((t) => t.id === task.id) ? list.map((t) => (t.id === task.id ? task : t)) : [...list, task]));\n }\n\n remove(id: string): void {\n this.rawTasks.update((list) => list.filter((t) => t.id !== id));\n }\n\n /** Grava um campo da tarefa (datas, pontos, sprint). true = gravou. */\n async updateTask(id: string, edit: AutoServiceTaskEdit): Promise<boolean> {\n return this.run(async () => this.replace(await this.service.update(this.clientId(), id, edit)));\n }\n\n // --- sprints ---\n\n async saveSprint(id: string | null, input: AutoServiceSprintInput): Promise<boolean> {\n return this.run(async () => {\n const saved = id ? await this.service.updateSprint(this.clientId(), id, input) : await this.service.createSprint(this.clientId(), input);\n this.upsertSprint(saved);\n });\n }\n\n async startSprint(sprint: TaskSprint): Promise<boolean> {\n return this.run(async () => this.upsertSprint(await this.service.updateSprint(this.clientId(), sprint.id, { state: 'active' })));\n }\n\n /** Encerrar: o servidor devolve ao backlog as não concluídas; relê as tarefas para mostrar isso. */\n async closeSprint(sprint: TaskSprint): Promise<boolean> {\n return this.run(async () => {\n this.upsertSprint(await this.service.updateSprint(this.clientId(), sprint.id, { state: 'closed' }));\n this.rawTasks.set(await this.service.tasks(this.clientId()));\n });\n }\n\n async removeSprint(sprint: TaskSprint): Promise<boolean> {\n return this.run(async () => {\n await this.service.removeSprint(this.clientId(), sprint.id);\n this.sprints.update((list) => list.filter((s) => s.id !== sprint.id));\n this.rawTasks.update((list) => list.map((t) => (t.sprint_id === sprint.id ? { ...t, sprint_id: null } : t)));\n });\n }\n\n /** Relê as sprints (as contas de pontos são do servidor) depois de mover tarefas entre elas. */\n async refreshSprints(): Promise<void> {\n if (!this.clientId() || this.sprintsReading) return;\n this.sprintsReading = true;\n try {\n this.sprints.set(await this.service.sprints(this.clientId()));\n this.sprintsLoaded.set(true);\n } catch {\n /* as contas ficam as de antes; a próxima leitura corrige */\n } finally {\n this.sprintsReading = false;\n }\n }\n\n /** Uma leitura de sprints em andamento: o detalhe e o backlog pedem juntos, sai uma só. */\n private sprintsReading = false;\n\n private upsertSprint(saved: TaskSprint): void {\n this.sprints.update((list) => (list.some((s) => s.id === saved.id)\n ? list.map((s) => (s.id === saved.id ? saved : s))\n : [...list, saved]).sort((a, b) => a.start_date.localeCompare(b.start_date)));\n }\n\n // --- marcos ---\n\n async createMilestone(title: string, date: string): Promise<boolean> {\n return this.run(async () => {\n const saved = await this.service.createMilestone(this.clientId(), title, date);\n this.milestones.update((list) => [...list, saved].sort((a, b) => a.date.localeCompare(b.date)));\n });\n }\n\n async moveMilestone(id: string, date: string): Promise<boolean> {\n return this.run(async () => {\n const saved = await this.service.updateMilestone(this.clientId(), id, { date });\n this.milestones.update((list) => list.map((m) => (m.id === id ? saved : m)).sort((a, b) => a.date.localeCompare(b.date)));\n });\n }\n\n async removeMilestone(id: string): Promise<boolean> {\n return this.run(async () => {\n await this.service.removeMilestone(this.clientId(), id);\n this.milestones.update((list) => list.filter((m) => m.id !== id));\n });\n }\n\n // --- riscos ---\n\n async saveRisk(id: string | null, input: AutoServiceRiskInput & { title: string }): Promise<boolean> {\n return this.run(async () => {\n const saved = id ? await this.service.updateRisk(this.clientId(), id, input) : await this.service.createRisk(this.clientId(), input);\n this.risks.update((list) => (list.some((r) => r.id === saved.id) ? list.map((r) => (r.id === saved.id ? saved : r)) : [...list, saved]));\n });\n }\n\n async removeRisk(id: string): Promise<boolean> {\n return this.run(async () => {\n await this.service.removeRisk(this.clientId(), id);\n this.risks.update((list) => list.filter((r) => r.id !== id));\n });\n }\n\n /** Executa uma gravação; falha = toast (a mensagem do servidor para os casos conhecidos) e false. */\n private async run(action: () => Promise<void>): Promise<boolean> {\n try {\n await action();\n return true;\n } catch (err) {\n this.toast.error(this.errorText(err));\n return false;\n }\n }\n\n private errorText(err: unknown): string {\n const code = err instanceof HttpErrorResponse ? err.error?.error : null;\n if (code === 'active_sprint_exists') return this.plan.sprints.activeExists;\n if (code === 'dependency_cycle') return this.plan.detail.dependencyCycle;\n if (code === 'invalid_dates') return this.plan.sprints.datesOrder;\n if (code === 'invalid_suggestion' || code === 'suggestion_id_required') return this.plan.risks.taskRequired;\n return this.plan.saveError;\n }\n\n /** \"5 pts\" (ou \"Sem estimativa\"). */\n pointsText(points: number | null | undefined): string {\n return points === null || points === undefined ? this.plan.noEstimate : pluralMessage(this.plan.pointsValue, points, this.locale);\n }\n\n /** \"2 a 13 de nov.\" no idioma da tela. */\n rangeText(start: string, end: string): string {\n const format = new Intl.DateTimeFormat(this.locale, { day: 'numeric', month: 'short', timeZone: 'UTC' });\n const day = (iso: string) => format.format(new Date(`${iso}T00:00:00Z`));\n return formatMessage(this.plan.dateRange, { start: day(start), end: day(end) });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, linkedSignal, model, signal, untracked } from '@angular/core';\nimport { AssigneeSelectComponent } from '@trismegisto/angular/assignee';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { ComboboxComponent, type ComboboxOption } from '@trismegisto/angular/combobox';\nimport { InputComponent } from '@trismegisto/angular/input';\nimport { LevelSelectComponent } from '@trismegisto/angular/level-badge';\nimport { ModalComponent } from '@trismegisto/angular/modal';\nimport { PopconfirmComponent, PopconfirmTriggerDirective } from '@trismegisto/angular/popconfirm';\nimport { SelectComponent } from '@trismegisto/angular/select';\nimport { TextareaComponent } from '@trismegisto/angular/textarea';\nimport { LEVEL_SCALE_PRESETS } from '@trismegisto/primitives/workflow';\nimport { RISK_STATUSES, RiskStatus, TaskRisk } from '../suggestion-task';\nimport { SuggestionPlanningStore } from './suggestion-planning.store';\n\n/** Valores das escalas prontas de probabilidade e impacto, do degrau 1 ao 5. */\nconst LIKELIHOOD = LEVEL_SCALE_PRESETS.likelihood.map(([value]) => value);\nconst IMPACT = LEVEL_SCALE_PRESETS.impact.map(([value]) => value);\n\ninterface RiskDraft {\n id: string | null; title: string; suggestionId: string | null; likelihood: number; impact: number; ownerId: string | null;\n status: RiskStatus; mitigation: string;\n}\n\n/**\n * Cadastro e edição de um risco num `hm-modal`, usado pela visão Riscos e pelo detalhe da tarefa. Todo risco é de uma\n * tarefa: na visão Riscos ela se escolhe (`hm-combobox`, obrigatória); no detalhe vem fixa (`task`). Probabilidade e\n * impacto pelo `hm-level-select` segmentado (as escalas prontas, convertidas para os degraus 1..5), o dono pelo\n * `hm-assignee-select` (as pessoas que já aparecem no app), o status e a mitigação.\n */\n@Component({\n selector: 'spine-suggestion-risk-form',\n imports: [\n AssigneeSelectComponent, ButtonComponent, ComboboxComponent, InputComponent, LevelSelectComponent, ModalComponent,\n PopconfirmComponent, PopconfirmTriggerDirective, SelectComponent, TextareaComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './planning-views.scss',\n template: `\n <hm-modal [heading]=\"draft().id ? p.risks.editHeading : p.risks.newHeading\" size=\"large\" [(open)]=\"open\">\n <form class=\"plan-form\" (submit)=\"$event.preventDefault(); save()\" novalidate>\n <hm-input [label]=\"p.risks.title\" required [maxLength]=\"200\" [value]=\"draft().title\" (valueChange)=\"patch({ title: $any($event) })\"\n [error]=\"submitted() && !draft().title.trim() ? p.risks.titleRequired : ''\" />\n @if (task(); as fixed) {\n <p class=\"plan-muted\">{{ p.risks.task }}: <strong>{{ fixed.title }}</strong></p>\n } @else {\n <hm-combobox [label]=\"p.risks.task\" required [placeholder]=\"p.risks.taskPlaceholder\" [options]=\"taskOptions()\"\n [value]=\"draft().suggestionId ?? ''\" (valueChange)=\"patch({ suggestionId: $event || null })\"\n [error]=\"submitted() && !draft().suggestionId ? p.risks.taskRequired : ''\" />\n }\n <hm-level-select scale=\"likelihood\" appearance=\"segmented\" [value]=\"likelihood()\" (valueChange)=\"patch({ likelihood: level(likelihoodValues, $event) })\" />\n <hm-level-select scale=\"impact\" appearance=\"segmented\" [value]=\"impact()\" (valueChange)=\"patch({ impact: level(impactValues, $event) })\" />\n <div class=\"plan-row\">\n <hm-assignee-select [label]=\"p.risks.owner\" [people]=\"s.people()\" [me]=\"s.me()\" [value]=\"draft().ownerId\"\n (valueChange)=\"patch({ ownerId: $event || null })\" />\n <hm-select [label]=\"p.risks.status\" [value]=\"draft().status\" (valueChange)=\"patch({ status: $any($event) })\">\n @for (st of statuses; track st) {\n <option [value]=\"st\" [selected]=\"st === draft().status\">{{ p.risks.statuses[st] }}</option>\n }\n </hm-select>\n </div>\n <hm-textarea [label]=\"p.risks.mitigation\" [rows]=\"3\" autoGrow [maxLength]=\"2000\" [value]=\"draft().mitigation\" (valueChange)=\"patch({ mitigation: $event })\" />\n </form>\n <div footer class=\"plan-footer\">\n @if (draft().id) {\n <hm-button class=\"plan-footer__start\" intent=\"danger\" emphasis=\"minimal\" icon=\"trash\" [hmPopconfirmTrigger]=\"removeConfirm\">{{ p.delete }}</hm-button>\n <hm-popconfirm #removeConfirm [heading]=\"p.risks.deleteHeading\" [confirmLabel]=\"p.delete\" intent=\"danger\" (confirmed)=\"remove()\" />\n }\n <hm-button emphasis=\"minimal\" (clicked)=\"open.set(false)\">{{ p.cancel }}</hm-button>\n <hm-button [loading]=\"saving()\" (clicked)=\"save()\">{{ p.save }}</hm-button>\n </div>\n </hm-modal>\n `,\n})\nexport class SuggestionRiskFormComponent {\n protected readonly s = inject(SuggestionPlanningStore);\n protected readonly p = this.s.plan;\n protected readonly statuses = RISK_STATUSES;\n protected readonly likelihoodValues = LIKELIHOOD;\n protected readonly impactValues = IMPACT;\n\n readonly open = model(false);\n /** O risco a editar; null = risco novo. */\n readonly risk = input<TaskRisk | null>(null);\n /** A tarefa fixa (aberto pelo detalhe dela); sem ela, a tarefa se escolhe no formulário. */\n readonly task = input<{ id: string; title: string } | null>(null);\n\n protected readonly submitted = linkedSignal({ source: this.open, computation: () => false });\n protected readonly saving = signal(false);\n /** Reabre do zero a cada abertura (ou troca de risco). */\n protected readonly draft = linkedSignal<{ open: boolean; risk: TaskRisk | null }, RiskDraft>({\n source: () => ({ open: this.open(), risk: this.risk() }),\n computation: ({ risk }) => (risk ? this.fromRisk(risk) : this.empty()),\n });\n protected readonly likelihood = computed(() => LIKELIHOOD[this.draft().likelihood - 1] ?? null);\n protected readonly impact = computed(() => IMPACT[this.draft().impact - 1] ?? null);\n /** As tarefas que podem ter risco: as do quadro (a sugestão agrupada some com a de destino). */\n protected readonly taskOptions = computed<ComboboxOption[]>(() =>\n this.s.items().map((t) => ({ value: t.id, label: t.key ? `${t.key} · ${t.title}` : t.title })),\n );\n\n /** Valor da escala -> degrau 1..5 (o servidor guarda o número). */\n protected level(values: readonly string[], value: string | null): number {\n return Math.max(1, values.indexOf(value ?? '') + 1);\n }\n\n protected patch(change: Partial<RiskDraft>): void {\n this.draft.update((d) => ({ ...d, ...change }));\n }\n\n protected async save(): Promise<void> {\n this.submitted.set(true);\n const d = this.draft();\n const suggestionId = this.task()?.id ?? d.suggestionId;\n if (!d.title.trim() || !suggestionId) return;\n this.saving.set(true);\n const ok = await this.s.saveRisk(d.id, {\n title: d.title.trim(), likelihood: d.likelihood, impact: d.impact, owner_id: d.ownerId, status: d.status,\n mitigation: d.mitigation.trim(), suggestion_id: suggestionId,\n });\n this.saving.set(false);\n if (ok) this.open.set(false);\n }\n\n protected async remove(): Promise<void> {\n const id = this.draft().id;\n if (id && (await this.s.removeRisk(id))) this.open.set(false);\n }\n\n private fromRisk(risk: TaskRisk): RiskDraft {\n return {\n id: risk.id, title: risk.title, suggestionId: risk.suggestion_id, likelihood: risk.likelihood, impact: risk.impact,\n ownerId: risk.owner?.user_id ?? null, status: risk.status, mitigation: risk.mitigation,\n };\n }\n\n private empty(): RiskDraft {\n return {\n // Sem rastrear: a tarefa fixa não reabre o rascunho enquanto se digita.\n id: null, title: '', suggestionId: untracked(this.task)?.id ?? null, likelihood: 3, impact: 3, ownerId: this.s.me() || null,\n status: 'identified', mitigation: '',\n };\n }\n}\n","import { Location } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, untracked, viewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';\nimport { AlertComponent } from '@trismegisto/angular/alert';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { CheckboxComponent } from '@trismegisto/angular/checkbox';\nimport { ComboboxMultiComponent } from '@trismegisto/angular/combobox-multi';\nimport { DatePickerComponent } from '@trismegisto/angular/date-picker';\nimport { HermesDialogService } from '@trismegisto/angular/dialog';\nimport { IconComponent } from '@trismegisto/angular/icon';\nimport { IconButtonComponent } from '@trismegisto/angular/icon-button';\nimport { InputComponent } from '@trismegisto/angular/input';\nimport { LevelBadgeComponent } from '@trismegisto/angular/level-badge';\nimport { ModalComponent } from '@trismegisto/angular/modal';\nimport { PopoverComponent, PopoverTriggerDirective } from '@trismegisto/angular/popover';\nimport { RichTextComponent } from '@trismegisto/angular/rich-text';\nimport { SelectComponent } from '@trismegisto/angular/select';\nimport { SwitchComponent } from '@trismegisto/angular/switch';\nimport { TabComponent, TabsComponent } from '@trismegisto/angular/tabs';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { TextareaComponent } from '@trismegisto/angular/textarea';\nimport { HermesToastService } from '@trismegisto/angular/toast';\nimport { ComboboxOption } from '@trismegisto/primitives/combobox';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';\nimport { riskLevel, riskScore } from '@trismegisto/primitives/workflow';\nimport { SPINE_MESSAGES, SpinePreferencesService, SpineUserStorage } from '@trismegisto/spine';\nimport {\n SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_KINDS, SPINE_SUGGESTION_LIMITS, SPINE_SUGGESTION_STATUS_COLORS,\n SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_WAITING, SPINE_SUGGESTION_WAITING_COLORS, SpineSuggestionKind,\n SpineChatMessage, SpineSuggestionChatComponent, SpineSuggestionPerson, SpineSuggestionStatus, SpineSuggestionWaiting,\n SpineTagRowComponent, SpineTagRowItem,\n} from '@trismegisto/spine/layout';\nimport { AutoServiceSuggestionsService } from './auto-service-suggestions.service';\nimport {\n SuggestionLabelPickerComponent, SuggestionPeoplePickerComponent,\n} from './suggestion-pickers.component';\nimport {\n AutoServiceSuggestionEvent, AutoServiceTask, DueState, TASK_PRIORITIES, TASK_PRIORITY_ICONS, TaskCatalogLabel,\n TaskChecklistItem, TaskMergedOrigin, TaskPersonOption, TaskPriority, TaskReporter, TaskRisk, TaskRole, dueState, todayIso,\n} from './suggestion-task';\nimport { SuggestionPlanningStore } from './planning/suggestion-planning.store';\nimport { SuggestionRiskFormComponent } from './planning/suggestion-risk-form.component';\n\nconst EVENTS_PAGE = 20;\n/** A escala de pontos do seletor (a sequência usual de planejamento); vazio = sem estimativa. */\nconst POINT_SCALE = [1, 2, 3, 5, 8, 13, 21] as const;\n\n/** Copia para a área de transferência; false se o navegador recusar. */\nexport async function copyText(value: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(value);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * A tarefa aberta (modal grande, duas colunas, como os quadros de tarefas conhecidos), montada pelo quadro.\n *\n * - **Esquerda**: título editável no lugar (Enter salva, Esc desiste), descrição em `hm-rich-text` (ler; \"Editar\"\n * abre o editor e \"Salvar\" grava o HTML, que o servidor saneia), checklist (marcar, renomear, subir/descer, remover,\n * \"Mostrar no cartão\") e as abas Comentários e Atividades (do mais novo, \"Carregar mais\"). Comentário é texto simples\n * e pode ser interno (só a equipe vê; quem pediu não lê em \"Minhas sugestões\").\n * - **Direita**: status, tipo, responsáveis (\"Atribuir a mim\") e envolvidos (busca de pessoas do realm, com foto),\n * relator, prioridade, início e conclusão, rótulos (catálogo do app; cria na hora), capa, tela de origem (\"Abrir a\n * tela\" quando o app administrado é o desta sessão), apoios, criada/atualizada e \"Última alteração há X por Fulano\";\n * a chave com copiar; arquivar/restaurar e excluir (com confirmação).\n * - **Agrupar**: \"Relatores\" (o autor e quem veio das agrupadas, com foto) no lugar do relator; \"Agrupadas aqui\" (chave,\n * título e autor de cada origem, com link e \"Desagrupar\"); \"Agrupar em…\" pede o seletor ao quadro (`mergeRequested`).\n * Na agrupada, o aviso \"Agrupada em SUG-12\" no topo, com \"Abrir SUG-12\" (`openTask`) e \"Desagrupar\" (`unmerged`).\n * - **Nova tarefa** (`task` nulo, `draft`): título, tipo, coluna, prioridade, datas, descrição, rótulos e \"Atribuir a\n * mim\"; criar troca para a tarefa completa.\n *\n * Toda mudança vai direto ao servidor, que devolve a tarefa inteira: ela vira a nova verdade aqui (`taskChange`) e no\n * quadro (`changed`).\n */\n@Component({\n selector: 'spine-suggestion-task-detail',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, CheckboxComponent, ComboboxMultiComponent, DatePickerComponent, IconButtonComponent,\n IconComponent, InputComponent, LevelBadgeComponent, ModalComponent, PopoverComponent, PopoverTriggerDirective, RichTextComponent,\n SelectComponent, SuggestionLabelPickerComponent, SuggestionPeoplePickerComponent, SuggestionRiskFormComponent,\n SpineSuggestionChatComponent, SpineTagRowComponent, SwitchComponent, TabComponent, TabsComponent, TagComponent, TextareaComponent,\n ],\n templateUrl: './suggestion-task-detail.component.html',\n styleUrl: './suggestion-task-detail.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SuggestionTaskDetailComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.suggestions;\n private readonly service = inject(AutoServiceSuggestionsService);\n private readonly toast = inject(HermesToastService);\n private readonly dialogs = inject(HermesDialogService);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly userStorage = inject(SpineUserStorage, { optional: true });\n private readonly router = inject(Router, { optional: true });\n private readonly location = inject(Location, { optional: true });\n /** O planejamento do quadro (sprints): só existe dentro dele. */\n protected readonly planning = inject(SuggestionPlanningStore, { optional: true });\n\n readonly clientId = input.required<string>();\n /** A tarefa aberta (leve, do quadro: a completa chega do servidor). null + `draft` = nova tarefa. */\n readonly task = input<AutoServiceTask | null>(null);\n readonly draft = input(false);\n /** Coluna da nova tarefa. */\n readonly draftStatus = input<SpineSuggestionStatus>('em_analise');\n readonly labels = input<readonly TaskCatalogLabel[]>([]);\n /** As tarefas que podem ser dependência desta (as do quadro). */\n readonly candidates = input<readonly AutoServiceTask[]>([]);\n /** A tela da sugestão abre daqui (o app administrado é o desta sessão). */\n readonly canOpenScreen = input(false);\n\n /** A tarefa mudou (o servidor devolveu a nova versão). */\n readonly changed = output<AutoServiceTask>();\n readonly created = output<AutoServiceTask>();\n readonly removed = output<AutoServiceTask>();\n readonly closed = output<void>();\n /** Um rótulo novo entrou no catálogo. */\n readonly labelCreated = output<TaskCatalogLabel>();\n /** \"Agrupar em…\": o quadro fecha este modal e abre o seletor. */\n readonly mergeRequested = output<AutoServiceTask>();\n /** Abrir outra tarefa pelo id (o destino de uma agrupada, uma das agrupadas). */\n readonly openTask = output<string>();\n /** Desagrupou (daqui): o quadro relê, a origem volta para ele. */\n readonly unmerged = output<void>();\n\n protected readonly statuses = SPINE_SUGGESTION_STATUSES;\n protected readonly statusColors = SPINE_SUGGESTION_STATUS_COLORS;\n protected readonly waitingValues = SPINE_SUGGESTION_WAITING;\n protected readonly waitingColors = SPINE_SUGGESTION_WAITING_COLORS;\n protected readonly kinds = SPINE_SUGGESTION_KINDS;\n protected readonly kindColors = SPINE_SUGGESTION_KIND_COLORS;\n protected readonly priorities = TASK_PRIORITIES;\n protected readonly priorityIcons = TASK_PRIORITY_ICONS;\n protected readonly limits = SPINE_SUGGESTION_LIMITS;\n protected readonly today = todayIso(this.preferences.effectiveTimeZone());\n\n protected readonly current = signal<AutoServiceTask | null>(null);\n protected readonly loadError = signal('');\n protected readonly busy = signal(false);\n protected readonly open = computed(() => !!this.current() || this.draft());\n\n // --- planejamento: pontos, sprint e dependências ---\n protected readonly pointScale = POINT_SCALE;\n protected readonly plan = this.messages.suggestions.planning;\n /** As sprints que aceitam tarefa (não encerradas), mais a da tarefa se ela já estiver numa encerrada. */\n protected readonly sprintOptions = computed(() => {\n const current = this.current()?.sprint_id ?? null;\n return (this.planning?.sprints() ?? []).filter((s) => s.state !== 'closed' || s.id === current);\n });\n protected readonly dependencyOptions = computed<ComboboxOption[]>(() => {\n const self = this.current()?.id;\n return this.candidates().filter((c) => c.id !== self && !c.merged_into).map((c) => ({ value: c.id, label: `${c.key} ${c.title}` }));\n });\n /** As abertas de que esta depende: \"Bloqueada por SUG-3, SUG-7\". */\n protected readonly blockedBy = computed(() => {\n const ids = new Set(this.current()?.depends_on ?? []);\n const keys = this.candidates().filter((c) => ids.has(c.id) && c.status !== 'concluida' && c.status !== 'recusada').map((c) => c.key);\n return keys.length ? formatMessage(this.plan.detail.blockedBy, { list: keys.join(', ') }) : '';\n });\n protected readonly heading = computed(() => {\n const t = this.current();\n return t ? `${t.key} · ${t.title}` : this.text.newTaskHeading;\n });\n\n // título e descrição\n protected readonly editingTitle = signal(false);\n protected readonly titleDraft = signal('');\n protected readonly editingDescription = signal(false);\n protected readonly descriptionDraft = signal('');\n\n // checklist\n protected readonly newItem = signal('');\n protected readonly renaming = signal<string | null>(null);\n protected readonly renameDraft = signal('');\n\n // comentários e atividades\n /** Resumo (descrição e checklist), Comentários (a conversa com quem pediu) e Histórico (tudo o que mudou). */\n protected readonly tab = signal<'summary' | 'comments' | 'activity'>('summary');\n protected readonly comments = signal<AutoServiceSuggestionEvent[]>([]);\n protected readonly commentsTotal = signal(0);\n protected readonly activity = signal<AutoServiceSuggestionEvent[]>([]);\n protected readonly activityTotal = signal(0);\n protected readonly eventsLoading = signal(false);\n private readonly chat = viewChild(SpineSuggestionChatComponent);\n /**\n * A aba Comentários como chat (do mais antigo ao mais novo; a lista vem do mais novo). À direita, o que a pessoa\n * escreveu como equipe; o que ela escreveu como quem pede (pela página) fica à esquerda, como os outros.\n */\n protected readonly chatItems = computed<SpineChatMessage[]>(() => [...this.comments()].reverse().map((e) => ({\n id: e.id, text: e.comment ?? '', created_at: e.created_at, author: e.actor, from_requester: !!e.from_requester,\n internal: !!e.internal, status: e.kind === 'status' && e.to_status !== 'nova' ? e.to_status : null,\n })));\n /** As abas de eventos já lidas desta tarefa (vazia também conta: trocar de aba não relê). */\n private readonly loadedTabs = new Set<'comments' | 'activity'>();\n protected readonly comment = signal('');\n protected readonly commentInternal = signal(false);\n protected readonly commentError = signal('');\n protected readonly commenting = signal(false);\n\n // nova tarefa\n protected readonly draftTitle = signal('');\n protected readonly draftTitleError = signal('');\n protected readonly draftKind = signal<string>('melhoria');\n protected readonly draftColumn = signal<string>('em_analise');\n protected readonly draftPriority = signal<string>('media');\n protected readonly draftStart = signal<string | null>(null);\n protected readonly draftDue = signal<string | null>(null);\n protected readonly draftDescription = signal('');\n protected readonly draftLabels = signal<string[]>([]);\n protected readonly draftAssignMe = signal(true);\n\n protected readonly selectedLabels = computed(() => this.current()?.labels.map((l) => l.id) ?? this.draftLabels());\n protected readonly assigneeIds = computed(() => this.current()?.assignees.map((p) => p.user_id) ?? []);\n protected readonly watcherIds = computed(() => this.current()?.watchers.map((p) => p.user_id) ?? []);\n protected readonly checklistItems = computed(() => [...(this.current()?.checklist.items ?? [])].sort((a, b) => a.position - b.position));\n protected readonly dueSituation = computed<DueState>(() => {\n const t = this.current();\n return t ? dueState(t, this.today) : null;\n });\n protected readonly isMine = computed(() => {\n const me = this.me();\n return !!me && this.assigneeIds().includes(me);\n });\n\n // --- riscos da tarefa ---\n\n /** A tarefa aberta, para o formulário de risco (só depois de criada: risco novo precisa da tarefa gravada). */\n protected readonly riskTask = computed(() => {\n const t = this.current();\n return t?.id ? { id: t.id, title: t.title } : null;\n }, { equal: (a, b) => a?.id === b?.id && a?.title === b?.title });\n protected readonly taskRisks = computed(() => {\n const id = this.riskTask()?.id;\n return id && this.planning ? this.planning.risksOf(id) : [];\n });\n protected readonly riskOpen = signal(false);\n protected readonly riskEditing = signal<TaskRisk | null>(null);\n\n protected openRisk(risk: TaskRisk | null): void {\n this.riskEditing.set(risk);\n this.riskOpen.set(true);\n }\n\n /** Faixa do risco (baixo, médio, alto, crítico) para o selo. */\n protected riskLevelOf(r: TaskRisk): string {\n return riskLevel(riskScore(r.likelihood, r.impact));\n }\n\n constructor() {\n // A sprint e os riscos da tarefa saem do planejamento: lê uma vez quando o detalhe abre, se ninguém leu ainda.\n effect(() => {\n if (!this.open() || !this.planning) return;\n if (!untracked(() => this.planning!.sprintsLoaded())) void this.planning.refreshSprints();\n if (!untracked(() => this.planning!.risksLoaded())) void this.planning.ensureRisks();\n });\n effect(() => {\n const task = this.task();\n const draft = this.draft();\n untracked(() => {\n this.reset();\n if (task) void this.load(task);\n else if (draft) this.startDraft();\n });\n });\n }\n\n protected me(): string {\n return this.userStorage?.userId() ?? '';\n }\n\n private reset(): void {\n this.current.set(null);\n this.loadError.set('');\n this.editingTitle.set(false);\n this.editingDescription.set(false);\n this.renaming.set(null);\n this.newItem.set('');\n this.comments.set([]);\n this.activity.set([]);\n this.commentsTotal.set(0);\n this.activityTotal.set(0);\n this.comment.set('');\n this.commentInternal.set(false);\n this.commentError.set('');\n this.tab.set('summary');\n this.loadedTabs.clear();\n }\n\n private startDraft(): void {\n this.draftTitle.set('');\n this.draftTitleError.set('');\n this.draftKind.set('melhoria');\n this.draftColumn.set(this.draftStatus());\n this.draftPriority.set('media');\n this.draftStart.set(null);\n this.draftDue.set(null);\n this.draftDescription.set('');\n this.draftLabels.set([]);\n this.draftAssignMe.set(true);\n }\n\n private async load(light: AutoServiceTask): Promise<void> {\n this.current.set(light);\n try {\n const full = await this.service.task(this.clientId(), light.id);\n if (this.task()?.id !== light.id) return;\n this.current.set({ ...full, author: full.author ?? light.author });\n void this.loadEvents('comments', true);\n if (full.unread || light.unread) this.markRead({ ...full, author: full.author ?? light.author });\n } catch {\n this.loadError.set(this.text.loadError);\n }\n }\n\n protected setOpen(open: boolean): void {\n if (!open) this.closed.emit();\n }\n\n /** Aplica a versão do servidor aqui e avisa o quadro. */\n private apply(task: AutoServiceTask): void {\n const prev = this.current();\n const next = { ...task, author: task.author ?? prev?.author ?? null };\n this.current.set(next);\n this.changed.emit(next);\n }\n\n /** Roda uma mudança no servidor; erro = aviso no canto. */\n private async run(call: () => Promise<AutoServiceTask>, success?: string): Promise<boolean> {\n if (this.busy()) return false;\n this.busy.set(true);\n try {\n this.apply(await call());\n if (success) this.toast.success(success);\n if (this.tab() === 'activity') void this.loadEvents('activity', true);\n return true;\n } catch (err) {\n const cycle = err instanceof HttpErrorResponse && err.error?.error === 'dependency_cycle';\n this.toast.error(cycle ? this.plan.detail.dependencyCycle : this.text.saveError);\n return false;\n } finally {\n this.busy.set(false);\n }\n }\n\n protected changeEstimate(value: string): void {\n const estimate = value === '' ? null : Number(value);\n if (estimate !== (this.current()?.estimate ?? null)) void this.edit({ estimate });\n }\n\n protected changeSprint(value: string): void {\n const sprintId = value || null;\n if (sprintId !== (this.current()?.sprint_id ?? null)) void this.edit({ sprint_id: sprintId });\n }\n\n /** O combobox devolve a lista inteira: liga as que entraram e desliga as que saíram, uma por vez. */\n protected async changeDependencies(next: readonly string[]): Promise<void> {\n const t = this.current();\n if (!t) return;\n const before = new Set(t.depends_on ?? []);\n const after = new Set(next);\n for (const id of after) if (!before.has(id)) await this.run(() => this.service.setDependency(this.clientId(), t.id, id, true));\n for (const id of before) if (!after.has(id)) await this.run(() => this.service.setDependency(this.clientId(), t.id, id, false));\n }\n\n private edit(patch: Parameters<AutoServiceSuggestionsService['update']>[2]): Promise<boolean> {\n const t = this.current();\n return t ? this.run(() => this.service.update(this.clientId(), t.id, patch)) : Promise.resolve(false);\n }\n\n // --- título e descrição ---\n\n protected startTitle(): void {\n this.titleDraft.set(this.current()?.title ?? '');\n this.editingTitle.set(true);\n }\n\n protected async saveTitle(): Promise<void> {\n const title = this.titleDraft().trim();\n if (!title || title === this.current()?.title) {\n this.editingTitle.set(false);\n return;\n }\n if (await this.edit({ title })) this.editingTitle.set(false);\n }\n\n protected onTitleKey(event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n void this.saveTitle();\n } else if (event.key === 'Escape') {\n event.stopPropagation();\n this.editingTitle.set(false);\n }\n }\n\n protected startDescription(): void {\n this.descriptionDraft.set(this.current()?.description_html ?? '');\n this.editingDescription.set(true);\n }\n\n protected async saveDescription(): Promise<void> {\n if (await this.edit({ description_html: this.descriptionDraft() })) this.editingDescription.set(false);\n }\n\n // --- campos da direita ---\n\n /** Abrir a tarefa lê a conversa: zera o \"N novas\" (aqui e no quadro); falhar não atrapalha. */\n private markRead(t: AutoServiceTask): void {\n const read = { ...t, unread: 0 };\n this.current.set(read);\n this.changed.emit(read);\n this.service.markRead(this.clientId(), t.id).catch(() => undefined);\n }\n\n /** Com quem está a vez (o servidor também muda sozinho: comentário público da equipe = quem pediu; resposta = equipe). */\n protected changeWaiting(value: string): void {\n const t = this.current();\n const waiting = (value || null) as SpineSuggestionWaiting | null;\n if (!t || waiting === (t.waiting_on ?? null)) return;\n void this.edit({ waiting_on: waiting }).then((ok) => { if (ok) this.toast.success(this.text.waitingSaved); });\n }\n\n /** Os rótulos na linha de selos, cada um com a cor do token ('cat-3' → 3). */\n protected labelTags(t: AutoServiceTask): SpineTagRowItem[] {\n return t.labels.map((l) => ({ id: l.id, name: l.name, color: Number(l.color.replace('cat-', '')) || undefined }));\n }\n\n protected unreadText(count: number): string {\n return pluralMessage(this.text.unread, count, this.messages.meta.locale);\n }\n\n\n protected changeStatus(status: string): void {\n const t = this.current();\n if (!t || status === t.status) return;\n void this.run(() => this.service.move(this.clientId(), t.id, { status: status as SpineSuggestionStatus }), this.text.statusSaved);\n }\n\n protected changeKind(kind: string): void {\n if (kind !== this.current()?.kind) void this.edit({ kind: kind as SpineSuggestionKind });\n }\n\n protected changePriority(priority: string): void {\n if (priority !== this.current()?.priority) void this.edit({ priority: priority as TaskPriority });\n }\n\n protected changeDate(field: 'start_date' | 'due_date', value: string | null): void {\n const t = this.current();\n if (!t || (value || null) === t[field]) return;\n void this.edit({ [field]: value || null });\n }\n\n protected toggleChecklistOnCard(on: boolean): void {\n if (on !== this.current()?.checklist_on_card) void this.edit({ checklist_on_card: on });\n }\n\n protected assignMe(): void {\n const t = this.current();\n if (t) void this.run(() => this.service.addPerson(this.clientId(), t.id, 'me', 'responsavel'), this.text.assignedToMe);\n }\n\n protected addPerson(person: TaskPersonOption, role: TaskRole, popover: PopoverComponent): void {\n popover.close();\n const t = this.current();\n if (t) void this.run(() => this.service.addPerson(this.clientId(), t.id, person.id, role));\n }\n\n protected removePerson(person: SpineSuggestionPerson, role: TaskRole): void {\n const t = this.current();\n if (t) void this.run(() => this.service.removePerson(this.clientId(), t.id, person.user_id, role));\n }\n\n protected toggleLabel(label: TaskCatalogLabel, linked: boolean): void {\n const t = this.current();\n if (!t) {\n this.draftLabels.update((ids) => (linked ? [...new Set([...ids, label.id])] : ids.filter((id) => id !== label.id)));\n return;\n }\n void this.run(() => this.service.setLabel(this.clientId(), t.id, label.id, linked));\n }\n\n protected async createLabel(name: string, color: string): Promise<void> {\n try {\n const label = await this.service.createLabel(this.clientId(), name, color);\n const entry: TaskCatalogLabel = { ...label, uses: 0 };\n this.labelCreated.emit(entry);\n this.toggleLabel(entry, true);\n } catch {\n this.toast.error(this.text.saveError);\n }\n }\n\n protected async copyKey(): Promise<void> {\n const t = this.current();\n if (!t) return;\n if (await copyText(t.key)) this.toast.success(this.text.keyCopied);\n else this.toast.error(this.text.copyError);\n }\n\n protected screenHref(path: string): string {\n return this.location?.prepareExternalUrl(path) ?? path;\n }\n\n /** Clique simples navega no app (e fecha); com Ctrl/Cmd/Shift ou botão do meio, o navegador abre a aba. */\n protected openScreen(event: MouseEvent, path: string): void {\n if (!this.router || event.button !== 0 || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return;\n event.preventDefault();\n this.closed.emit();\n void this.router.navigateByUrl(path);\n }\n\n protected toggleArchived(): void {\n const t = this.current();\n if (!t) return;\n const archive = !t.archived_at;\n void this.run(() => this.service.setArchived(this.clientId(), t.id, archive), archive ? this.text.archivedToast : this.text.restoredToast);\n }\n\n protected async remove(): Promise<void> {\n const t = this.current();\n if (!t) return;\n const ok = await this.dialogs.confirm({\n heading: formatMessage(this.text.deleteHeading, { key: t.key }), message: this.text.deleteMessage,\n confirmLabel: this.text.deleteConfirm, danger: true,\n });\n if (!ok) return;\n try {\n await this.service.remove(this.clientId(), t.id);\n this.toast.success(this.text.deleted);\n this.removed.emit(t);\n } catch {\n this.toast.error(this.text.saveError);\n }\n }\n\n // --- agrupar ---\n\n /** Desagrupa esta (a agrupada): ela volta ao quadro. */\n protected async unmergeSelf(): Promise<void> {\n const t = this.current();\n if (!t?.merged_into || this.busy()) return;\n if (await this.run(() => this.service.unmerge(this.clientId(), t.id), formatMessage(this.text.unmergedToast, { key: t.key }))) {\n this.unmerged.emit();\n }\n }\n\n /** Desagrupa uma das agrupadas nesta: relê esta (perde os relatores e apoios que vieram dela). */\n protected async unmergeOrigin(origin: TaskMergedOrigin): Promise<void> {\n const t = this.current();\n if (!t) return;\n const ok = await this.run(async () => {\n await this.service.unmerge(this.clientId(), origin.id);\n return this.service.task(this.clientId(), t.id);\n }, formatMessage(this.text.unmergedToast, { key: origin.key }));\n if (ok) this.unmerged.emit();\n }\n\n /** Quem pediu: o autor e os relatores extras (do detalhe); sem a lista ainda, só o autor. */\n protected reportersOf(t: AutoServiceTask): TaskReporter[] {\n if (t.reporters?.length) return t.reporters;\n return [{ ...(t.author ?? { user_id: '', username: null, name: null, picture: null }), role: 'author', from_suggestion_id: null }];\n }\n\n /** \"Autor\" ou \"via SUG-30\" (a agrupada de onde o relator veio). */\n protected reporterHint(t: AutoServiceTask, r: TaskReporter): string {\n if (r.role === 'author') return this.text.reporterAuthor;\n const origin = t.merged?.find((m) => m.id === r.from_suggestion_id);\n return origin ? formatMessage(this.text.reporterVia, { key: origin.key }) : '';\n }\n\n protected mergedIntoText(key: string): string {\n return formatMessage(this.text.mergedInto, { key });\n }\n\n protected openMergedText(key: string): string {\n return formatMessage(this.text.openMerged, { key });\n }\n\n protected unmergeLabel(key: string): string {\n return formatMessage(this.text.unmergeLabel, { key });\n }\n\n // --- checklist ---\n\n protected addItem(): void {\n const t = this.current();\n const text = this.newItem().trim();\n if (!t || !text) return;\n void this.run(() => this.service.addChecklistItem(this.clientId(), t.id, text)).then((ok) => ok && this.newItem.set(''));\n }\n\n protected onNewItemKey(event: KeyboardEvent): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.addItem();\n }\n }\n\n protected toggleItem(item: TaskChecklistItem, done: boolean): void {\n const t = this.current();\n if (t && done !== item.done) void this.run(() => this.service.updateChecklistItem(this.clientId(), t.id, item.id, { done }));\n }\n\n protected startRename(item: TaskChecklistItem): void {\n this.renaming.set(item.id);\n this.renameDraft.set(item.text);\n }\n\n protected saveRename(item: TaskChecklistItem): void {\n const text = this.renameDraft().trim();\n this.renaming.set(null);\n const t = this.current();\n if (t && text && text !== item.text) void this.run(() => this.service.updateChecklistItem(this.clientId(), t.id, item.id, { text }));\n }\n\n protected onRenameKey(event: KeyboardEvent, item: TaskChecklistItem): void {\n if (event.key === 'Enter') {\n event.preventDefault();\n this.saveRename(item);\n } else if (event.key === 'Escape') {\n event.stopPropagation();\n this.renaming.set(null);\n }\n }\n\n protected moveItem(item: TaskChecklistItem, delta: -1 | 1): void {\n const t = this.current();\n const index = this.checklistItems().findIndex((i) => i.id === item.id);\n const target = index + delta;\n if (!t || index < 0 || target < 0 || target >= this.checklistItems().length) return;\n void this.run(() => this.service.updateChecklistItem(this.clientId(), t.id, item.id, { position: target }));\n }\n\n protected removeItem(item: TaskChecklistItem): void {\n const t = this.current();\n if (t) void this.run(() => this.service.removeChecklistItem(this.clientId(), t.id, item.id));\n }\n\n // --- comentários e atividades ---\n\n protected selectTab(tab: string): void {\n const next = tab === 'activity' || tab === 'comments' ? tab : 'summary';\n this.tab.set(next);\n if (next === 'summary') return;\n if (!this.loadedTabs.has(next)) void this.loadEvents(next, true);\n }\n\n protected async loadEvents(type: 'comments' | 'activity', reset: boolean): Promise<void> {\n const t = this.current();\n if (!t) return;\n const list = type === 'comments' ? this.comments : this.activity;\n const total = type === 'comments' ? this.commentsTotal : this.activityTotal;\n this.eventsLoading.set(true);\n try {\n const res = await this.service.events(this.clientId(), t.id, { type, limit: EVENTS_PAGE, offset: reset ? 0 : list().length });\n if (this.current()?.id !== t.id) return;\n list.set(reset ? res.events : [...list(), ...res.events]);\n total.set(res.total);\n this.loadedTabs.add(type);\n } catch {\n this.loadError.set(this.text.loadError);\n } finally {\n this.eventsLoading.set(false);\n }\n }\n\n protected async sendComment(text?: string): Promise<void> {\n const t = this.current();\n const comment = (text ?? this.comment()).trim();\n if (!t || this.commenting()) return;\n this.commentError.set(comment ? '' : this.text.commentRequired);\n if (!comment) return;\n this.commenting.set(true);\n try {\n const event = await this.service.comment(this.clientId(), t.id, comment, this.commentInternal());\n this.comments.update((list) => [event, ...list]);\n this.commentsTotal.update((n) => n + 1);\n this.comment.set('');\n this.commentInternal.set(false);\n const updated = {\n ...t, comments_count: t.comments_count + 1,\n last_activity: { at: event.created_at, actor: event.actor },\n ...(event.internal ? {} : { last_comment: { comment: event.comment ?? comment, created_at: event.created_at } }),\n ...(event.internal || t.status === 'concluida' || t.status === 'recusada'\n ? {} : { waiting_on: 'solicitante' as const, waiting_since: event.created_at }),\n };\n this.current.set(updated);\n this.changed.emit(updated);\n this.chat()?.scrollToEnd();\n } catch {\n this.commentError.set(this.text.commentError);\n } finally {\n this.commenting.set(false);\n }\n }\n\n // --- nova tarefa ---\n\n protected async create(): Promise<void> {\n const title = this.draftTitle().trim();\n this.draftTitleError.set(title ? '' : this.text.titleRequired);\n if (!title || this.busy()) return;\n this.busy.set(true);\n try {\n const task = await this.service.create(this.clientId(), {\n title, kind: this.draftKind() as SpineSuggestionKind, status: this.draftColumn() as SpineSuggestionStatus,\n priority: this.draftPriority() as TaskPriority, start_date: this.draftStart(), due_date: this.draftDue(),\n description_html: this.draftDescription(), label_ids: this.draftLabels(),\n people: this.draftAssignMe() ? [{ user_id: 'me', role: 'responsavel' }] : [],\n });\n this.toast.success(this.text.taskCreated);\n this.created.emit(task);\n } catch {\n this.toast.error(this.text.createError);\n } finally {\n this.busy.set(false);\n }\n }\n\n // --- textos ---\n\n protected personName(p: SpineSuggestionPerson | null | undefined): string {\n return p?.name || p?.username || this.text.removedAuthor;\n }\n\n protected statusLabel(status: string | null): string {\n if (!status) return '—';\n return (this.text.statuses as Record<string, string>)[status] ?? (this.text.legacyStatuses as Record<string, string>)[status] ?? status;\n }\n\n /** O valor de um evento 'change' legível: prioridade e tipo pelo catálogo, data no formato local. */\n private valueText(field: string | null | undefined, value: string | null | undefined): string {\n if (!value) return '—';\n if (field === 'priority') return (this.text.priorities as Record<string, string>)[value] ?? value;\n if (field === 'kind') return (this.text.kinds as Record<string, string>)[value] ?? value;\n if (field === 'start_date' || field === 'due_date') return this.day(value);\n return value;\n }\n\n protected eventText(e: AutoServiceSuggestionEvent): string {\n const actor = e.actor ? this.personName(e.actor) : this.text.someone;\n if (e.kind === 'comment') return formatMessage(this.text.eventComment, { actor });\n if (e.kind === 'status') return formatMessage(this.text.eventStatus, { actor, from: this.statusLabel(e.from_status), to: this.statusLabel(e.to_status) });\n const field = e.field ?? 'other';\n const removed = ['start_date', 'due_date', 'cover'].includes(field) && !e.to_value ? `${field}_removed` : field;\n const template = (this.text.activity as Record<string, string>)[removed] ?? this.text.activity.other;\n return formatMessage(template, { actor, from: this.valueText(e.field, e.from_value), to: this.valueText(e.field, e.to_value) });\n }\n\n protected lastChange(t: AutoServiceTask): string {\n if (!t.last_activity) return '';\n const when = this.age(t.last_activity.at);\n return t.last_activity.actor\n ? formatMessage(this.text.lastChange, { when, actor: this.personName(t.last_activity.actor) })\n : formatMessage(this.text.lastChangeNoActor, { when });\n }\n\n protected dueText(t: AutoServiceTask): string {\n if (!t.due_date) return '';\n const s = this.dueSituation();\n if (s === 'overdue') return formatMessage(this.text.dueLate, { date: this.day(t.due_date) });\n if (s === 'today') return this.text.dueToday;\n if (s === 'tomorrow') return this.text.dueTomorrow;\n return formatMessage(this.text.dueOn, { date: this.day(t.due_date) });\n }\n\n protected removePersonLabel(p: SpineSuggestionPerson): string {\n return formatMessage(this.text.removePerson, { name: this.personName(p) });\n }\n\n protected itemLabel(template: string, item: TaskChecklistItem): string {\n return formatMessage(template, { text: item.text });\n }\n\n protected age(iso: string): string {\n const seconds = Math.round((Date.now() - new Date(iso).getTime()) / 1000);\n const units: Array<[Intl.RelativeTimeFormatUnit, number]> = [['year', 31_536_000], ['month', 2_592_000], ['week', 604_800], ['day', 86_400], ['hour', 3_600], ['minute', 60]];\n try {\n const rtf = new Intl.RelativeTimeFormat(this.messages.meta.locale, { numeric: 'auto' });\n for (const [unit, size] of units) 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, withTime = false): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, {\n dateStyle: 'short', ...(withTime ? { timeStyle: 'short' as const } : {}), timeZone: this.preferences.effectiveTimeZone(),\n }).format(new Date(iso));\n } catch {\n return iso.slice(0, 10);\n }\n }\n\n /** Data sem hora (AAAA-MM-DD), sem fuso: o dia é o dia. */\n protected day(iso: string): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, { dateStyle: 'short', timeZone: 'UTC' }).format(new Date(`${iso}T00:00:00Z`));\n } catch {\n return iso;\n }\n }\n}\n","<hm-modal [heading]=\"heading()\" [open]=\"open()\" (openChange)=\"setOpen($event)\" size=\"xlarge\">\n @if (current(); as t) {\n @if (loadError()) {\n <hm-alert variant=\"error\">{{ loadError() }}</hm-alert>\n }\n <div class=\"as-task\">\n <!-- Esquerda: o trabalho (título, descrição, checklist, conversa). -->\n <div class=\"as-task__main\">\n <div class=\"as-task__key-row\">\n <span class=\"as-task__key\">{{ t.key }}</span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"copy\" [label]=\"text.copyKey\" (clicked)=\"copyKey()\" />\n <hm-tag [name]=\"text.kinds[t.kind]\" [color]=\"kindColors[t.kind]\" />\n @if (t.archived_at) { <hm-tag [name]=\"text.archivedTag\" /> }\n @if (t.merged_into) { <hm-tag [name]=\"text.mergedTag\" color=\"info\" /> }\n </div>\n\n <!-- Agrupada: o destino tem os relatores e os apoios; os comentários ficam aqui. -->\n @if (t.merged_into; as into) {\n <div class=\"as-task__merged\">\n <hm-icon class=\"as-task__merged-icon\" shape=\"layers\" />\n <div class=\"as-task__merged-text\">\n <strong>{{ mergedIntoText(into.key) }}</strong>\n <span>{{ into.title }}</span>\n <span class=\"as-field__hint\">{{ text.mergedIntoHint }}</span>\n </div>\n <div class=\"as-actions\">\n <hm-button size=\"small\" emphasis=\"medium\" (clicked)=\"openTask.emit(into.id)\">{{ openMergedText(into.key) }}</hm-button>\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"unlink\" [disabled]=\"busy()\" (clicked)=\"unmergeSelf()\">{{ text.unmerge }}</hm-button>\n </div>\n </div>\n }\n\n @if (editingTitle()) {\n <hm-input [label]=\"text.title\" labelHidden [maxLength]=\"limits.title\" [value]=\"titleDraft()\"\n (valueChange)=\"titleDraft.set($event)\" (keydown)=\"onTitleKey($event)\" (focusout)=\"saveTitle()\" />\n } @else {\n <h2 class=\"as-task__title\">\n <button type=\"button\" class=\"as-task__title-button\" [attr.aria-label]=\"text.editTitle + ': ' + t.title\" (click)=\"startTitle()\">\n {{ t.title }}<hm-icon class=\"as-task__title-pen\" shape=\"pencil\" />\n </button>\n </h2>\n }\n <p class=\"as-task__dates\">\n <span>{{ text.createdAt }} {{ date(t.created_at, true) }}</span>\n <span aria-hidden=\"true\">·</span>\n <span>{{ text.updatedAt }} {{ date(t.updated_at, true) }}</span>\n @if (lastChange(t); as change) {\n <span aria-hidden=\"true\">·</span>\n <span>{{ change }}</span>\n }\n </p>\n\n <!-- Abas: Resumo (descrição e checklist), Comentários (a conversa com quem pediu) e Histórico (tudo o que mudou). -->\n <hm-tabs [label]=\"text.taskLabel\" [active]=\"tab()\" (activeChange)=\"selectTab($event)\">\n <hm-tab id=\"summary\" [label]=\"text.tabSummary\">\n <div class=\"as-task__summary\">\n <section class=\"as-task__section\" aria-labelledby=\"as-task-description\">\n <div class=\"as-task__section-head\">\n <h3 id=\"as-task-description\" class=\"as-task__heading\">{{ text.description }}</h3>\n @if (!editingDescription()) {\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"pencil\" (clicked)=\"startDescription()\">{{ text.editDescription }}</hm-button>\n }\n </div>\n @if (editingDescription()) {\n <hm-rich-text [label]=\"text.description\" labelHidden [rows]=\"6\" [maxRows]=\"20\" [value]=\"descriptionDraft()\"\n (valueChange)=\"descriptionDraft.set($event)\" />\n <div class=\"as-actions\">\n <hm-button emphasis=\"medium\" (clicked)=\"editingDescription.set(false)\">{{ text.cancel }}</hm-button>\n <hm-button [loading]=\"busy()\" (clicked)=\"saveDescription()\">{{ text.save }}</hm-button>\n </div>\n } @else if (t.description_html) {\n <hm-rich-text class=\"as-task__description\" [label]=\"text.description\" labelHidden readonly hideToolbar [value]=\"t.description_html\" />\n } @else {\n <p class=\"muted\">{{ text.noDescription }}</p>\n }\n </section>\n \n <section class=\"as-task__section\" aria-labelledby=\"as-task-checklist\">\n <div class=\"as-task__section-head\">\n <h3 id=\"as-task-checklist\" class=\"as-task__heading\">\n {{ text.checklist }}\n @if (t.checklist.total) {\n <span class=\"as-task__count\">{{ t.checklist.done }}/{{ t.checklist.total }}</span>\n <span class=\"as-task__progress\" role=\"progressbar\" aria-valuemin=\"0\" [attr.aria-valuemax]=\"t.checklist.total\"\n [attr.aria-valuenow]=\"t.checklist.done\" [attr.aria-label]=\"text.checklist\">\n <span [style.inline-size.%]=\"(t.checklist.done / t.checklist.total) * 100\"></span>\n </span>\n }\n </h3>\n <hm-switch [label]=\"text.checklistOnCard\" [value]=\"t.checklist_on_card\" (valueChange)=\"toggleChecklistOnCard($event)\" />\n </div>\n <ul class=\"as-checklist\">\n @for (item of checklistItems(); track item.id; let first = $first; let last = $last) {\n <li class=\"as-checklist__item\" [class.as-checklist__item--done]=\"item.done\">\n @if (renaming() === item.id) {\n <hm-input class=\"as-checklist__rename\" [label]=\"text.checklist\" labelHidden [maxLength]=\"500\" [value]=\"renameDraft()\"\n (valueChange)=\"renameDraft.set($event)\" (keydown)=\"onRenameKey($event, item)\" (focusout)=\"saveRename(item)\" />\n } @else {\n <hm-checkbox class=\"as-checklist__check\" [label]=\"item.text\" [checked]=\"item.done\" (checkedChange)=\"toggleItem(item, $event)\" />\n <span class=\"as-checklist__tools\">\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"pencil\" [label]=\"text.editTitle + ': ' + item.text\" (clicked)=\"startRename(item)\" />\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"angle-up\" [label]=\"itemLabel(text.checklistUp, item)\" [disabled]=\"first\" (clicked)=\"moveItem(item, -1)\" />\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"angle-down\" [label]=\"itemLabel(text.checklistDown, item)\" [disabled]=\"last\" (clicked)=\"moveItem(item, 1)\" />\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"trash\" [label]=\"itemLabel(text.checklistRemove, item)\" (clicked)=\"removeItem(item)\" />\n </span>\n }\n </li>\n } @empty {\n <li class=\"muted\">{{ text.checklistEmpty }}</li>\n }\n </ul>\n <div class=\"as-checklist__add\">\n <hm-input class=\"as-checklist__new\" [label]=\"text.checklistAdd\" labelHidden [placeholder]=\"text.checklistPlaceholder\"\n [maxLength]=\"500\" [value]=\"newItem()\" (valueChange)=\"newItem.set($event)\" (keydown)=\"onNewItemKey($event)\" />\n <hm-button emphasis=\"medium\" icon=\"plus\" [disabled]=\"!newItem().trim()\" (clicked)=\"addItem()\">{{ text.checklistAdd }}</hm-button>\n </div>\n </section>\n </div>\n </hm-tab>\n <hm-tab id=\"comments\" [label]=\"text.tabComments\" [count]=\"commentsTotal() || null\">\n <!-- A conversa em chat: à direita o que a pessoa escreveu como equipe; quem pediu (inclusive ela mesma pela\n página de quem pede) à esquerda, com o papel no cabeçalho. O \"Só para a equipe\" vai junto do Enviar. -->\n <spine-suggestion-chat class=\"as-task__chat\" side=\"equipe\" [me]=\"me()\" [items]=\"chatItems()\"\n [label]=\"text.tabComments\" [empty]=\"text.commentsEmpty\"\n [hasMore]=\"comments().length < commentsTotal()\" [loading]=\"eventsLoading()\"\n [composerLabel]=\"text.comment\" [placeholder]=\"commentInternal() ? text.commentInternal : text.commentHint\"\n [sendLabel]=\"text.commentSend\" [sending]=\"commenting()\" [error]=\"commentError()\"\n [(draft)]=\"comment\" (loadHistory)=\"loadEvents('comments', false)\" (send)=\"sendComment($event)\">\n <hm-checkbox spineChatComposer [label]=\"text.commentInternal\" [checked]=\"commentInternal()\"\n (checkedChange)=\"commentInternal.set($event)\" />\n </spine-suggestion-chat>\n </hm-tab>\n <hm-tab id=\"activity\" [label]=\"text.tabActivity\">\n <ol class=\"as-timeline\">\n @for (e of activity(); track e.id) {\n <li class=\"as-timeline__item\">\n <hm-account-avatar class=\"as-timeline__face\" size=\"small\" [name]=\"e.actor ? personName(e.actor) : text.someone\" [imageUrl]=\"e.actor?.picture\" />\n <div class=\"as-timeline__body\">\n <span class=\"as-timeline__line\">{{ eventText(e) }} ·\n <time class=\"muted\" [attr.datetime]=\"e.created_at\" [attr.title]=\"date(e.created_at, true)\">{{ age(e.created_at) }}</time>\n </span>\n @if (e.comment) {\n <p class=\"as-timeline__comment\" [class.as-timeline__comment--internal]=\"e.internal\">{{ e.comment }}</p>\n }\n </div>\n </li>\n } @empty {\n @if (!eventsLoading()) { <li class=\"muted\">{{ text.activityEmpty }}</li> }\n }\n </ol>\n @if (activity().length < activityTotal()) {\n <hm-button emphasis=\"medium\" [loading]=\"eventsLoading()\" (clicked)=\"loadEvents('activity', false)\">{{ text.loadMore }}</hm-button>\n }\n </hm-tab>\n </hm-tabs>\n </div>\n\n <!-- Direita: os campos da tarefa (cada mudança grava na hora). -->\n <aside class=\"as-task__side\" [attr.aria-label]=\"text.taskLabel\">\n <hm-select [label]=\"text.status\" [value]=\"t.status\" [disabled]=\"busy()\" (valueChange)=\"changeStatus($any($event))\">\n @for (st of statuses; track st) { <option [value]=\"st\">{{ text.statuses[st] }}</option> }\n </hm-select>\n <!-- A conversa com quem pede: com quem está a vez (muda sozinho a cada mensagem; aqui dá para acertar). -->\n <hm-select [label]=\"text.menuWaiting\" [value]=\"t.waiting_on ?? ''\" [disabled]=\"busy()\" (valueChange)=\"changeWaiting($any($event))\">\n <option value=\"\">{{ text.waitingClear }}</option>\n @for (w of waitingValues; track w) { <option [value]=\"w\">{{ text.waiting[w] }}</option> }\n </hm-select>\n\n <div class=\"as-field\">\n <div class=\"as-field__head\">\n <span class=\"as-field__label\">{{ text.assignees }}</span>\n @if (!isMine()) {\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"user-plus\" (clicked)=\"assignMe()\">{{ text.assignMe }}</hm-button>\n }\n </div>\n <ul class=\"as-people\">\n @for (p of t.assignees; track p.user_id) {\n <li class=\"as-people__item\">\n <hm-account-avatar size=\"small\" [name]=\"personName(p)\" [imageUrl]=\"p.picture\" />\n <span class=\"as-people__name\">{{ personName(p) }}</span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"trash\" [label]=\"removePersonLabel(p)\" (clicked)=\"removePerson(p, 'responsavel')\" />\n </li>\n } @empty {\n <li class=\"muted\">{{ text.nobody }}</li>\n }\n </ul>\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"plus\" [hmPopoverTrigger]=\"assigneePop\">{{ text.addAssignee }}</hm-button>\n <hm-popover #assigneePop [label]=\"text.addAssignee\">\n @if (assigneePop.open()) {\n <spine-suggestion-people-picker [clientId]=\"clientId()\" [exclude]=\"assigneeIds()\" (picked)=\"addPerson($event, 'responsavel', assigneePop)\" />\n }\n </hm-popover>\n </div>\n\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ text.watchers }}</span>\n <ul class=\"as-people\">\n @for (p of t.watchers; track p.user_id) {\n <li class=\"as-people__item\">\n <hm-account-avatar size=\"small\" [name]=\"personName(p)\" [imageUrl]=\"p.picture\" />\n <span class=\"as-people__name\">{{ personName(p) }}</span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"trash\" [label]=\"removePersonLabel(p)\" (clicked)=\"removePerson(p, 'envolvido')\" />\n </li>\n } @empty {\n <li class=\"muted\">{{ text.nobody }}</li>\n }\n </ul>\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"plus\" [hmPopoverTrigger]=\"watcherPop\">{{ text.addWatcher }}</hm-button>\n <hm-popover #watcherPop [label]=\"text.addWatcher\">\n @if (watcherPop.open()) {\n <spine-suggestion-people-picker [clientId]=\"clientId()\" [exclude]=\"watcherIds()\" (picked)=\"addPerson($event, 'envolvido', watcherPop)\" />\n }\n </hm-popover>\n </div>\n\n <!-- Quem pediu: o autor e, numa que recebeu agrupadas, os relatores que vieram delas. -->\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ (t.reporters?.length ?? 0) > 1 ? text.reporters : text.reporter }}</span>\n <ul class=\"as-people\">\n @for (p of reportersOf(t); track p.user_id || $index) {\n <li class=\"as-people__item\">\n <hm-account-avatar size=\"small\" [name]=\"personName(p.user_id ? p : null)\" [imageUrl]=\"p.picture\" />\n <span class=\"as-people__name\">{{ personName(p.user_id ? p : null) }}</span>\n @if ((t.reporters?.length ?? 0) > 1 && reporterHint(t, p); as hint) {\n <span class=\"as-field__hint\">{{ hint }}</span>\n }\n </li>\n }\n </ul>\n <span class=\"as-field__hint\">{{ t.origin === 'equipe' ? text.originTeam : text.originUser }}</span>\n </div>\n\n @if (t.merged?.length) {\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ text.mergedHere }}</span>\n <ul class=\"as-merged\">\n @for (m of t.merged; track m.id) {\n <li class=\"as-merged__item\">\n <button type=\"button\" class=\"as-merged__link\" (click)=\"openTask.emit(m.id)\">\n <span class=\"as-task__key\">{{ m.key }}</span> {{ m.title }}\n </button>\n <span class=\"as-merged__author\">\n <hm-account-avatar size=\"small\" [name]=\"personName(m.author)\" [imageUrl]=\"m.author?.picture\" />\n {{ personName(m.author) }}\n </span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"unlink\" [label]=\"unmergeLabel(m.key)\"\n [disabled]=\"busy()\" (clicked)=\"unmergeOrigin(m)\" />\n </li>\n }\n </ul>\n </div>\n }\n\n <hm-select [label]=\"text.priority\" [value]=\"t.priority\" [disabled]=\"busy()\" (valueChange)=\"changePriority($any($event))\">\n @for (p of priorities; track p) { <option [value]=\"p\">{{ text.priorities[p] }}</option> }\n </hm-select>\n <hm-select [label]=\"text.kind\" [value]=\"t.kind\" [disabled]=\"busy()\" (valueChange)=\"changeKind($any($event))\">\n @for (k of kinds; track k) { <option [value]=\"k\">{{ text.kinds[k] }}</option> }\n </hm-select>\n <div class=\"as-field__dates\">\n <hm-date-picker [label]=\"text.startDate\" [value]=\"t.start_date\" [max]=\"$any(t.due_date)\" (valueChange)=\"changeDate('start_date', $event)\" />\n <hm-date-picker [label]=\"text.dueDate\" [value]=\"t.due_date\" [min]=\"$any(t.start_date)\" (valueChange)=\"changeDate('due_date', $event)\" />\n </div>\n @if (t.due_date) {\n <span class=\"as-due\" [attr.data-due]=\"dueSituation()\"><hm-icon shape=\"calendar\" />{{ dueText(t) }}</span>\n }\n\n <!-- Planejamento: pontos, sprint e as tarefas de que esta depende (Cronograma e Planejamento leem daqui). -->\n <div class=\"as-field__dates\">\n <hm-select [label]=\"plan.detail.estimate\" [value]=\"t.estimate === null || t.estimate === undefined ? '' : '' + t.estimate\" [disabled]=\"busy()\"\n (valueChange)=\"changeEstimate($any($event))\">\n <option value=\"\">{{ plan.noEstimate }}</option>\n @for (n of pointScale; track n) { <option [value]=\"'' + n\">{{ n }}</option> }\n @if (t.estimate !== null && t.estimate !== undefined && !pointScale.includes($any(t.estimate))) {\n <option [value]=\"'' + t.estimate\">{{ t.estimate }}</option>\n }\n </hm-select>\n <hm-select [label]=\"plan.detail.sprint\" [value]=\"t.sprint_id ?? ''\" [disabled]=\"busy()\" (valueChange)=\"changeSprint($any($event))\">\n <option value=\"\">{{ plan.detail.backlogOption }}</option>\n @for (sp of sprintOptions(); track sp.id) { <option [value]=\"sp.id\">{{ sp.name }}</option> }\n </hm-select>\n </div>\n <hm-combobox-multi [label]=\"plan.detail.dependsOn\" [placeholder]=\"plan.detail.dependsOnPlaceholder\" [options]=\"dependencyOptions()\"\n [selected]=\"t.depends_on ?? []\" [visibleChipsLimit]=\"null\" (selectedChange)=\"changeDependencies($event)\" />\n @if (blockedBy()) {\n <span class=\"as-due\" data-due=\"today\"><hm-icon shape=\"link\" />{{ blockedBy() }}</span>\n }\n\n <!-- Riscos da tarefa: todo risco é de uma tarefa; a nota de risco dela é a maior entre os abertos. -->\n @if (planning && riskTask(); as rt) {\n <div class=\"as-field\">\n <div class=\"as-field__head\">\n <span class=\"as-field__label\">{{ plan.risks.ofTask }}</span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"plus\" [label]=\"plan.risks.add\" (clicked)=\"openRisk(null)\" />\n </div>\n @if (taskRisks().length) {\n <ul class=\"as-risks\">\n @for (r of taskRisks(); track r.id) {\n <li>\n <button type=\"button\" class=\"as-risks__item\" (click)=\"openRisk(r)\">\n <hm-level-badge scale=\"risk\" [value]=\"riskLevelOf(r)\" />\n <span class=\"as-risks__title\" [class.as-risks__title--closed]=\"r.status === 'closed'\">{{ r.title }}</span>\n <span class=\"as-risks__status\">{{ plan.risks.statuses[r.status] }}</span>\n </button>\n </li>\n }\n </ul>\n } @else {\n <p class=\"as-field__hint\">{{ plan.risks.empty }}</p>\n }\n </div>\n <spine-suggestion-risk-form [(open)]=\"riskOpen\" [risk]=\"riskEditing()\" [task]=\"rt\" />\n }\n\n <div class=\"as-field\">\n <div class=\"as-field__head\">\n <span class=\"as-field__label\">{{ text.labels }}</span>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"tag\" [label]=\"text.addLabel\" [hmPopoverTrigger]=\"labelPop\" />\n </div>\n <!-- Em linha, como os grupos: o que não cabe vira \"+N\" (cada rótulo na cor dele). -->\n <spine-tag-row [label]=\"text.labels\" [items]=\"labelTags(t)\" [empty]=\"text.noLabels\" />\n <hm-popover #labelPop [label]=\"text.labels\">\n @if (labelPop.open()) {\n <spine-suggestion-label-picker [labels]=\"labels()\" [selected]=\"selectedLabels()\"\n (toggled)=\"toggleLabel($event.label, $event.linked)\" (created)=\"createLabel($event.name, $event.color)\" />\n }\n </hm-popover>\n </div>\n\n <dl class=\"as-facts\">\n <dt>{{ text.screenOrigin }}</dt>\n <dd class=\"as-facts__screen\">\n @if (t.screen.new) { <hm-tag [name]=\"text.newScreenTag\" color=\"info\" /> }\n <span class=\"as-facts__screen-name\" [attr.title]=\"t.screen.label || null\">{{ t.screen.label || text.noScreen }}</span>\n @if (t.screen.path && canOpenScreen()) {\n <a class=\"as-facts__link\" [href]=\"screenHref(t.screen.path)\" [attr.aria-label]=\"text.openScreen\" [attr.title]=\"text.openScreen\"\n (click)=\"openScreen($event, t.screen.path)\"><hm-icon shape=\"pop-out\" /></a>\n }\n </dd>\n <dt>{{ text.votesField }}</dt>\n <dd>{{ t.votes }}</dd>\n </dl>\n\n <!-- Os grupos de quem pediu: em linha, no modelo dos rótulos; o que não cabe vira \"+N\". -->\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ text.requestingGroups }}</span>\n <spine-tag-row [label]=\"text.requestingGroups\" [items]=\"t.groups ?? []\" [empty]=\"text.noGroups\" />\n </div>\n\n <div class=\"as-task__danger\">\n <!-- Sem cadeia: nem a agrupada nem a que recebeu outras vão para dentro de outra. -->\n @if (!t.merged_into && !t.merged_count) {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"layers\" (clicked)=\"mergeRequested.emit(t)\">{{ text.menuMerge }}</hm-button>\n }\n <hm-button size=\"small\" emphasis=\"medium\" [icon]=\"t.archived_at ? 'unarchive' : 'archive'\" (clicked)=\"toggleArchived()\">\n {{ t.archived_at ? text.menuRestore : text.menuArchive }}\n </hm-button>\n <hm-button size=\"small\" emphasis=\"medium\" intent=\"danger\" icon=\"trash\" (clicked)=\"remove()\">{{ text.menuDelete }}</hm-button>\n </div>\n </aside>\n </div>\n } @else if (draft()) {\n <!-- Nova tarefa: o essencial; o resto (pessoas, checklist, conversa) assim que existir. -->\n <div class=\"as-task\">\n <div class=\"as-task__main\">\n <hm-input [label]=\"text.title\" [placeholder]=\"text.addTaskPlaceholder\" [maxLength]=\"limits.title\" required\n [error]=\"draftTitleError()\" [value]=\"draftTitle()\" (valueChange)=\"draftTitle.set($event)\" />\n <hm-rich-text [label]=\"text.description\" [rows]=\"6\" [maxRows]=\"20\" [value]=\"draftDescription()\" (valueChange)=\"draftDescription.set($event)\" />\n <p class=\"as-field__hint\">{{ text.draftHint }}</p>\n </div>\n <aside class=\"as-task__side\" [attr.aria-label]=\"text.taskLabel\">\n <hm-select [label]=\"text.status\" [value]=\"draftColumn()\" (valueChange)=\"draftColumn.set($any($event))\">\n @for (st of statuses; track st) { <option [value]=\"st\">{{ text.statuses[st] }}</option> }\n </hm-select>\n <hm-select [label]=\"text.kind\" [value]=\"draftKind()\" (valueChange)=\"draftKind.set($any($event))\">\n @for (k of kinds; track k) { <option [value]=\"k\">{{ text.kinds[k] }}</option> }\n </hm-select>\n <hm-select [label]=\"text.priority\" [value]=\"draftPriority()\" (valueChange)=\"draftPriority.set($any($event))\">\n @for (p of priorities; track p) { <option [value]=\"p\">{{ text.priorities[p] }}</option> }\n </hm-select>\n <div class=\"as-field__dates\">\n <hm-date-picker [label]=\"text.startDate\" [value]=\"draftStart()\" [max]=\"$any(draftDue())\" (valueChange)=\"draftStart.set($event)\" />\n <hm-date-picker [label]=\"text.dueDate\" [value]=\"draftDue()\" [min]=\"$any(draftStart())\" (valueChange)=\"draftDue.set($event)\" />\n </div>\n <div class=\"as-field\">\n <span class=\"as-field__label\">{{ text.labels }}</span>\n <spine-suggestion-label-picker [labels]=\"labels()\" [selected]=\"draftLabels()\"\n (toggled)=\"toggleLabel($event.label, $event.linked)\" (created)=\"createLabel($event.name, $event.color)\" />\n </div>\n <hm-checkbox [label]=\"text.assignMeOnCreate\" [checked]=\"draftAssignMe()\" (checkedChange)=\"draftAssignMe.set($event)\" />\n </aside>\n </div>\n }\n\n <div footer class=\"as-task__footer\">\n @if (!current() && draft()) {\n <hm-button emphasis=\"medium\" (clicked)=\"closed.emit()\">{{ text.cancel }}</hm-button>\n <hm-button icon=\"plus\" [loading]=\"busy()\" (clicked)=\"create()\">{{ text.createTask }}</hm-button>\n } @else {\n <hm-button emphasis=\"medium\" (clicked)=\"closed.emit()\">{{ text.close }}</hm-button>\n }\n </div>\n</hm-modal>\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { AlertComponent } from '@trismegisto/angular/alert';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { HermesDialogService } from '@trismegisto/angular/dialog';\nimport { ModalComponent } from '@trismegisto/angular/modal';\nimport { SearchFieldComponent } from '@trismegisto/angular/search-field';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { HermesToastService } from '@trismegisto/angular/toast';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { SPINE_SUGGESTION_STATUS_COLORS } from '@trismegisto/spine/layout';\nimport { AutoServiceSuggestionsService } from './auto-service-suggestions.service';\nimport { AutoServiceTask, TaskMergePreview } from './suggestion-task';\n\n/** Sem acento e sem caixa: \"relatório\" acha \"RELATORIO\". */\nconst fold = (s: string) => s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\n\n/** Teto da lista do seletor: a busca afunila o resto. */\nconst MAX_OPTIONS = 50;\n\n/**\n * \"Agrupar em…\": escolhe a sugestão principal para uma repetida (`source`), entre as abertas do quadro (`candidates`,\n * menos ela e as já agrupadas), com busca pela chave e pelo título. Escolher pede a prévia ao servidor (\"3 apoios e 1\n * relator passam para SUG-12\"); \"Agrupar\" confirma (`HermesDialogService.confirm`) e grava. Uma sugestão que já recebeu\n * outras não pode ser agrupada (sem cadeia): o seletor avisa em vez de listar.\n */\n@Component({\n selector: 'spine-suggestion-merge-picker',\n imports: [AlertComponent, ButtonComponent, ModalComponent, SearchFieldComponent, TagComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <hm-modal [heading]=\"heading()\" [open]=\"!!source()\" (openChange)=\"onOpen($event)\">\n @if (source(); as s) {\n <div class=\"as-merge\">\n <p class=\"as-merge__intro\">{{ text.mergeIntro }}</p>\n @if (s.merged_count) {\n <hm-alert variant=\"warning\">{{ text.mergeHasMerged }}</hm-alert>\n } @else {\n <hm-search-field [label]=\"text.mergeSearch\" labelHidden [placeholder]=\"text.mergeSearch\" [landmark]=\"false\"\n [value]=\"term()\" (search)=\"term.set($event)\" />\n <ul class=\"as-merge__list\" [attr.aria-label]=\"text.mergeSearch\">\n @for (c of options(); track c.id) {\n <li>\n <button type=\"button\" class=\"as-merge__option\" [class.as-merge__option--on]=\"picked()?.id === c.id\"\n [attr.aria-pressed]=\"picked()?.id === c.id\" (click)=\"pick(c)\">\n <span class=\"as-merge__key\">{{ c.key }}</span>\n <span class=\"as-merge__title\">{{ c.title }}</span>\n <span class=\"as-merge__meta\">\n <hm-tag [name]=\"text.statuses[c.status]\" [color]=\"statusColors[c.status]\" />\n <span>{{ votesText(c.votes) }}</span>\n </span>\n </button>\n </li>\n } @empty {\n <li class=\"as-merge__empty\">{{ text.mergeNone }}</li>\n }\n </ul>\n @if (picked()) {\n <p class=\"as-merge__preview\" aria-live=\"polite\">\n @if (previewError()) { {{ text.mergePreviewError }} }\n @else if (preview(); as p) { {{ previewText(p) }} }\n @else { {{ text.mergeCalculating }} }\n </p>\n }\n }\n </div>\n }\n <div footer class=\"as-merge__footer\">\n <hm-button emphasis=\"medium\" (clicked)=\"closed.emit()\">{{ text.cancel }}</hm-button>\n <hm-button icon=\"layers\" [disabled]=\"!preview() || !!source()?.merged_count\" [loading]=\"busy()\" (clicked)=\"confirm()\">\n {{ text.mergeConfirm }}\n </hm-button>\n </div>\n </hm-modal>\n `,\n styles: [`\n .as-merge { display: flex; flex-direction: column; gap: var(--hm-space-sm); min-inline-size: 0; }\n .as-merge__intro, .as-merge__empty { margin: 0; color: var(--hm-muted); font-size: var(--hm-font-size-sm); }\n .as-merge__list {\n display: flex; flex-direction: column; gap: var(--hm-space-xxxs); max-block-size: 22rem; margin: 0; padding: 0;\n overflow: auto; list-style: none;\n }\n .as-merge__option {\n display: grid; grid-template-columns: auto 1fr; gap: var(--hm-space-micro) var(--hm-space-xs); inline-size: 100%;\n padding: var(--hm-space-xs) var(--hm-space-sm); border: var(--hm-border-hairline) solid var(--hm-border);\n border-radius: var(--hm-radius-control); background: var(--hm-surface-raised); color: var(--hm-text); font: inherit;\n text-align: start; cursor: pointer;\n }\n .as-merge__option:hover { background: var(--hm-surface-muted); }\n .as-merge__option:focus-visible { outline: var(--hm-border-thin) solid var(--hm-accent); outline-offset: var(--hm-border-thin); }\n .as-merge__option--on { border-color: var(--hm-accent); background: var(--hm-accent-subtle); }\n .as-merge__key { color: var(--hm-muted); font-size: var(--hm-font-size-xs); font-weight: var(--hm-font-weight-semibold); }\n .as-merge__title { font-weight: var(--hm-font-weight-semibold); overflow-wrap: anywhere; }\n .as-merge__meta {\n display: inline-flex; grid-column: 2; flex-wrap: wrap; align-items: center; gap: var(--hm-space-xxxs);\n color: var(--hm-muted); font-size: var(--hm-font-size-sm);\n }\n .as-merge__preview {\n margin: 0; padding: var(--hm-space-xs) var(--hm-space-sm); border-radius: var(--hm-radius-control);\n background: var(--hm-surface-muted); color: var(--hm-text);\n }\n .as-merge__footer { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--hm-space-xs); inline-size: 100%; }\n `],\n})\nexport class SuggestionMergePickerComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.suggestions;\n private readonly service = inject(AutoServiceSuggestionsService);\n private readonly dialogs = inject(HermesDialogService);\n private readonly toast = inject(HermesToastService);\n\n readonly clientId = input.required<string>();\n /** A que vai ser agrupada; null = fechado. */\n readonly source = input<AutoServiceTask | null>(null);\n /** As do quadro (o seletor tira a própria e as agrupadas). */\n readonly candidates = input<readonly AutoServiceTask[]>([]);\n\n /** Agrupou: o destino inteiro, como o servidor devolveu. */\n readonly merged = output<{ source: AutoServiceTask; target: AutoServiceTask }>();\n readonly closed = output<void>();\n\n protected readonly statusColors = SPINE_SUGGESTION_STATUS_COLORS;\n protected readonly term = signal('');\n protected readonly picked = signal<AutoServiceTask | null>(null);\n protected readonly preview = signal<TaskMergePreview | null>(null);\n protected readonly previewError = signal(false);\n protected readonly busy = signal(false);\n\n protected readonly heading = computed(() => formatMessage(this.text.mergeHeading, { key: this.source()?.key ?? '' }));\n protected readonly options = computed(() => {\n const source = this.source();\n const term = fold(this.term().trim());\n return this.candidates()\n .filter((c) => c.id !== source?.id && !c.merged_into)\n .filter((c) => !term || fold(`${c.key} ${c.title}`).includes(term))\n .slice(0, MAX_OPTIONS);\n });\n\n constructor() {\n // Cada abertura começa do zero.\n effect(() => {\n this.source();\n untracked(() => {\n this.term.set('');\n this.picked.set(null);\n this.preview.set(null);\n this.previewError.set(false);\n });\n });\n }\n\n protected onOpen(open: boolean): void {\n if (!open) this.closed.emit();\n }\n\n protected async pick(target: AutoServiceTask): Promise<void> {\n const source = this.source();\n if (!source || this.picked()?.id === target.id) return;\n this.picked.set(target);\n this.preview.set(null);\n this.previewError.set(false);\n try {\n const preview = await this.service.mergePreview(this.clientId(), source.id, target.id);\n if (this.picked()?.id === target.id) this.preview.set(preview);\n } catch {\n if (this.picked()?.id === target.id) this.previewError.set(true);\n }\n }\n\n protected previewText(p: TaskMergePreview): string {\n const locale = this.messages.meta.locale;\n return formatMessage(this.text.mergePreview, {\n votes: pluralMessage(this.text.votes, p.votes, locale),\n reporters: pluralMessage(this.text.reportersCount, p.reporters, locale),\n key: p.target.key,\n });\n }\n\n protected votesText(count: number): string {\n return pluralMessage(this.text.votes, count, this.messages.meta.locale);\n }\n\n protected async confirm(): Promise<void> {\n const source = this.source();\n const preview = this.preview();\n const target = this.picked();\n if (!source || !preview || !target || this.busy()) return;\n const ok = await this.dialogs.confirm({\n heading: formatMessage(this.text.mergeConfirmHeading, { key: source.key, target: target.key }),\n message: `${this.previewText(preview)} ${this.text.mergeConfirmMessage}`,\n confirmLabel: this.text.mergeConfirm,\n });\n if (!ok) return;\n this.busy.set(true);\n try {\n const saved = await this.service.merge(this.clientId(), source.id, target.id);\n this.toast.success(formatMessage(this.text.mergedToast, { key: source.key, target: target.key }));\n this.merged.emit({ source, target: saved });\n } catch {\n this.toast.error(this.text.mergeError);\n } finally {\n this.busy.set(false);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, linkedSignal, signal } from '@angular/core';\nimport { BacklogComponent, type BacklogMoveEvent } from '@trismegisto/angular/backlog';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { DatePickerComponent } from '@trismegisto/angular/date-picker';\nimport { InputComponent } from '@trismegisto/angular/input';\nimport { ModalComponent } from '@trismegisto/angular/modal';\nimport { PopconfirmComponent, PopconfirmTriggerDirective } from '@trismegisto/angular/popconfirm';\nimport { ProgressComponent } from '@trismegisto/angular/progress';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { TextareaComponent } from '@trismegisto/angular/textarea';\nimport { HermesToastService } from '@trismegisto/angular/toast';\nimport { formatMessage } from '@trismegisto/primitives/i18n';\nimport { taskBurndownInput } from '@trismegisto/primitives/project-planning';\nimport { burndownSeries, type BacklogSection } from '@trismegisto/primitives/tasks';\nimport { TaskSprint } from '../suggestion-task';\nimport { PlanningTask, SuggestionPlanningStore } from './suggestion-planning.store';\n\nconst BACKLOG = 'backlog';\nconst STATE_COLORS = { planned: 'neutral', active: 'info', closed: 'success' } as const;\n\ninterface SprintDraft { name: string; goal: string; start: string | null; end: string | null; capacity: number | null }\n\n/**\n * Planejamento: as sprints do app (criar, editar, iniciar, encerrar — as não concluídas voltam ao backlog — e excluir),\n * o `hm-backlog` com as sprints abertas e o backlog (arrastar uma tarefa entre eles grava a sprint dela) e o andamento\n * da sprint em curso: pontos concluídos e comprometidos contra a capacidade (`hm-progress`) e o burndown dia a dia\n * (`taskBurndownInput` → `burndownSeries`) numa tabela — o spine não depende do pacote de gráficos.\n */\n@Component({\n selector: 'spine-suggestion-planning',\n imports: [\n BacklogComponent, ButtonComponent, DatePickerComponent, InputComponent, ModalComponent, PopconfirmComponent,\n PopconfirmTriggerDirective, ProgressComponent, TagComponent, TextareaComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './planning-views.scss',\n template: `\n <section class=\"plan-card\" aria-labelledby=\"sug-plan-sprints\">\n <div class=\"plan-toolbar\">\n <h3 id=\"sug-plan-sprints\">{{ p.sprints.heading }}</h3>\n <hm-button class=\"plan-toolbar__end\" icon=\"plus\" size=\"small\" (clicked)=\"create()\">{{ p.sprints.new }}</hm-button>\n </div>\n @if (openSprints().length) {\n <ul class=\"plan-rows\">\n @for (sp of openSprints(); track sp.id) {\n <li>\n <span>\n <strong>{{ sp.name }}</strong>\n <hm-tag [name]=\"p.sprints.state[sp.state]\" [color]=\"stateColors[sp.state]\" />\n <span class=\"plan-muted\">{{ s.rangeText(sp.start_date, sp.end_date) }} · {{ s.pointsText(sp.points) }}@if (sp.capacity !== null) { / {{ s.pointsText(sp.capacity) }} }</span>\n </span>\n <span class=\"plan-toolbar\">\n @if (sp.state === 'planned' && !s.activeSprint()) {\n <hm-button emphasis=\"medium\" size=\"small\" icon=\"play\" (clicked)=\"s.startSprint(sp)\">{{ p.sprints.start }}</hm-button>\n }\n @if (sp.state === 'active') {\n <hm-button emphasis=\"medium\" size=\"small\" icon=\"check\" [hmPopconfirmTrigger]=\"closeConfirm\">{{ p.sprints.close }}</hm-button>\n <hm-popconfirm #closeConfirm [heading]=\"named(p.sprints.closeHeading, sp)\" [message]=\"p.sprints.closeMessage\" [confirmLabel]=\"p.sprints.close\" (confirmed)=\"s.closeSprint(sp)\" />\n }\n <hm-button emphasis=\"minimal\" size=\"small\" icon=\"pencil\" (clicked)=\"edit(sp)\">{{ p.edit }}</hm-button>\n <hm-button emphasis=\"minimal\" intent=\"danger\" size=\"small\" icon=\"trash\" [hmPopconfirmTrigger]=\"removeConfirm\">{{ p.delete }}</hm-button>\n <hm-popconfirm #removeConfirm [heading]=\"named(p.sprints.deleteHeading, sp)\" [message]=\"p.sprints.deleteMessage\" [confirmLabel]=\"p.delete\" intent=\"danger\" (confirmed)=\"s.removeSprint(sp)\" />\n </span>\n </li>\n }\n </ul>\n }\n <p class=\"plan-muted\">{{ p.sprints.hint }}</p>\n <hm-backlog [(sections)]=\"sections\" [itemLabel]=\"byName\" [headingLevel]=\"4\" (moved)=\"onMoved($event)\" />\n </section>\n\n @if (s.activeSprint(); as sprint) {\n <section class=\"plan-card\" aria-labelledby=\"sug-plan-progress\">\n <h3 id=\"sug-plan-progress\">{{ named(p.sprints.progressHeading, sprint) }}</h3>\n <hm-progress [label]=\"p.sprints.done\" [value]=\"sprint.done_points\" [max]=\"sprint.points || 1\" intent=\"success\" showValue />\n @if (sprint.capacity) {\n <hm-progress [label]=\"p.sprints.capacityUse\" [value]=\"sprint.points\" [max]=\"sprint.capacity\" [intent]=\"sprint.points > sprint.capacity ? 'danger' : 'accent'\" showValue />\n }\n @if (burndown().length) {\n <div class=\"plan-table-wrap\" tabindex=\"0\" role=\"region\" [attr.aria-label]=\"named(p.sprints.burndownCaption, sprint)\">\n <table class=\"plan-table\">\n <caption>{{ named(p.sprints.burndownCaption, sprint) }}</caption>\n <thead><tr><th scope=\"col\">{{ p.sprints.day }}</th><th scope=\"col\">{{ p.sprints.ideal }}</th><th scope=\"col\">{{ p.sprints.remaining }}</th></tr></thead>\n <tbody>\n @for (row of burndown(); track row.day) {\n <tr><th scope=\"row\">{{ row.day }}</th><td>{{ row.ideal }}</td><td>{{ row.remaining ?? '—' }}</td></tr>\n }\n </tbody>\n </table>\n </div>\n }\n </section>\n }\n\n @if (closedSprints().length) {\n <section class=\"plan-card\" aria-labelledby=\"sug-plan-closed\">\n <h3 id=\"sug-plan-closed\">{{ p.sprints.closed }}</h3>\n <p class=\"plan-muted\">{{ p.sprints.readOnlyClosed }}</p>\n <ul class=\"plan-rows\">\n @for (sp of closedSprints(); track sp.id) {\n <li>\n <span><strong>{{ sp.name }}</strong> <span class=\"plan-muted\">{{ s.rangeText(sp.start_date, sp.end_date) }}</span></span>\n <span>{{ s.pointsText(sp.done_points) }} / {{ s.pointsText(sp.points) }}</span>\n </li>\n }\n </ul>\n </section>\n }\n\n <hm-modal [heading]=\"editing() ? p.sprints.editHeading : p.sprints.newHeading\" size=\"medium\" [(open)]=\"modalOpen\">\n <form class=\"plan-form\" (submit)=\"$event.preventDefault(); save()\" novalidate>\n <hm-input [label]=\"p.sprints.name\" required [maxLength]=\"80\" [value]=\"draft().name\" (valueChange)=\"patch({ name: $any($event) })\"\n [error]=\"submitted() && !draft().name.trim() ? p.sprints.nameRequired : ''\" />\n <hm-textarea [label]=\"p.sprints.goal\" [rows]=\"2\" autoGrow [maxLength]=\"500\" [value]=\"draft().goal\" (valueChange)=\"patch({ goal: $event })\" />\n <div class=\"plan-row\">\n <hm-date-picker [label]=\"p.sprints.start_date\" required [value]=\"draft().start\" [max]=\"$any(draft().end)\" (valueChange)=\"patch({ start: $event })\" />\n <hm-date-picker [label]=\"p.sprints.end_date\" required [value]=\"draft().end\" [min]=\"$any(draft().start)\" (valueChange)=\"patch({ end: $event })\" />\n </div>\n @if (dateError()) {\n <p class=\"plan-muted\" role=\"alert\">{{ dateError() }}</p>\n }\n <hm-input type=\"number\" [label]=\"p.sprints.capacity\" [min]=\"0\" [max]=\"9999\" [step]=\"1\" [value]=\"$any(draft().capacity ?? '')\"\n (valueChange)=\"patch({ capacity: toNumber($event) })\" />\n </form>\n <div footer class=\"plan-footer\">\n <hm-button emphasis=\"minimal\" (clicked)=\"modalOpen.set(false)\">{{ p.cancel }}</hm-button>\n <hm-button [loading]=\"saving()\" (clicked)=\"save()\">{{ p.save }}</hm-button>\n </div>\n </hm-modal>\n `,\n})\nexport class SuggestionPlanningViewComponent {\n protected readonly s = inject(SuggestionPlanningStore);\n private readonly toast = inject(HermesToastService);\n protected readonly p = this.s.plan;\n protected readonly stateColors = STATE_COLORS;\n\n /** Hoje (AAAA-MM-DD no fuso de quem consulta): o burndown real para aqui. */\n readonly today = input.required<string>();\n\n protected readonly byName = (t: PlanningTask) => `${t.key ?? ''} ${t.title}`.trim();\n /** Sobe quando uma gravação falha: as seções voltam ao que o store tem (desfaz o arrasto). */\n private readonly revision = signal(0);\n protected readonly openSprints = computed(() => this.s.sprints().filter((sp) => sp.state !== 'closed'));\n protected readonly closedSprints = computed(() => this.s.sprints().filter((sp) => sp.state === 'closed').reverse());\n\n /** As sprints abertas e o backlog; a concluída só fica na sprint em curso (é o que ela entregou). */\n protected readonly sections = linkedSignal<readonly BacklogSection<PlanningTask>[]>(() => {\n this.revision();\n const open = this.openSprints();\n const ids = new Set(open.map((sp) => sp.id));\n const active = this.s.activeSprint()?.id;\n const tasks = this.s.items().filter((t) => t.task.status !== 'recusada' && (!t.done || (t.sprintId && t.sprintId === active)));\n return [\n ...open.map((sp) => ({\n id: sp.id,\n title: `${sp.name} · ${this.p.sprints.state[sp.state]}`,\n kind: 'sprint' as const,\n start: sp.start_date,\n end: sp.end_date,\n goal: sp.goal,\n capacity: sp.capacity,\n items: tasks.filter((t) => t.sprintId === sp.id),\n })),\n { id: BACKLOG, title: this.p.backlog, kind: 'backlog' as const, items: tasks.filter((t) => !t.done && (!t.sprintId || !ids.has(t.sprintId))) },\n ];\n });\n\n /** Burndown da sprint em curso, um dia por linha (o restante para em hoje). */\n protected readonly burndown = computed(() => {\n const sprint = this.s.activeSprint();\n if (!sprint) return [];\n const tasks = this.s.items().filter((t) => t.sprintId === sprint.id);\n const series = burndownSeries(taskBurndownInput(tasks, {\n start: sprint.start_date, end: sprint.end_date, completedAt: (t) => t.completedAt, addedAt: (t) => t.createdAt,\n today: `${this.today()}T23:59:59`,\n }));\n const format = new Intl.DateTimeFormat(this.s.locale, { day: 'numeric', month: 'numeric' });\n const round = (v: number | null) => (v === null ? null : Math.round(v * 10) / 10);\n return series.days.map((d, i) => ({ day: format.format(d), ideal: round(series.ideal[i]), remaining: round(series.remaining[i]) }));\n });\n\n // --- cadastro ---\n\n protected readonly modalOpen = signal(false);\n protected readonly editing = signal<TaskSprint | null>(null);\n protected readonly submitted = signal(false);\n protected readonly saving = signal(false);\n protected readonly draft = signal<SprintDraft>(this.empty());\n protected readonly dateError = computed(() => {\n if (!this.submitted()) return '';\n const d = this.draft();\n if (!d.start || !d.end) return this.p.sprints.datesRequired;\n return d.end < d.start ? this.p.sprints.datesOrder : '';\n });\n\n protected named(message: string, sprint: TaskSprint): string {\n return formatMessage(message, { name: sprint.name });\n }\n\n protected patch(change: Partial<SprintDraft>): void {\n this.draft.update((d) => ({ ...d, ...change }));\n }\n\n protected toNumber(value: unknown): number | null {\n if (value === '' || value === null || value === undefined) return null;\n const n = Math.trunc(Number(value));\n return Number.isFinite(n) && n >= 0 ? n : null;\n }\n\n protected create(): void {\n this.editing.set(null);\n this.submitted.set(false);\n this.draft.set(this.empty());\n this.modalOpen.set(true);\n }\n\n protected edit(sprint: TaskSprint): void {\n this.editing.set(sprint);\n this.submitted.set(false);\n this.draft.set({ name: sprint.name, goal: sprint.goal, start: sprint.start_date, end: sprint.end_date, capacity: sprint.capacity });\n this.modalOpen.set(true);\n }\n\n protected async save(): Promise<void> {\n this.submitted.set(true);\n const d = this.draft();\n if (!d.name.trim() || this.dateError()) return;\n this.saving.set(true);\n const ok = await this.s.saveSprint(this.editing()?.id ?? null, {\n name: d.name.trim(), goal: d.goal.trim(), start_date: d.start!, end_date: d.end!, capacity: d.capacity,\n });\n this.saving.set(false);\n if (ok) this.modalOpen.set(false);\n }\n\n /** Arrastar para outra seção grava a sprint da tarefa; na mesma seção, a ordem é só da tela. */\n protected async onMoved(event: BacklogMoveEvent<PlanningTask>): Promise<void> {\n if (event.from === event.to) return;\n const sprintId = event.to === BACKLOG ? null : event.to;\n const ok = await this.s.updateTask(event.item.id, { sprint_id: sprintId });\n if (!ok) {\n this.revision.update((n) => n + 1);\n return;\n }\n void this.s.refreshSprints();\n const target = sprintId ? this.s.sprintName().get(sprintId) ?? '' : this.p.backlog;\n this.toast.success(formatMessage(this.p.sprints.moved, { key: event.item.key ?? event.item.title, target }));\n }\n\n private empty(): SprintDraft {\n return { name: '', goal: '', start: null, end: null, capacity: null };\n }\n}\n","import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { RiskRegisterComponent, type RiskCellSelection } from '@trismegisto/angular/risk-register';\nimport { TaskRisk } from '../suggestion-task';\nimport { SuggestionPlanningStore } from './suggestion-planning.store';\nimport { SuggestionRiskFormComponent } from './suggestion-risk-form.component';\n\n/**\n * Riscos das tarefas do app: o `hm-risk-register` com a matriz probabilidade x impacto (clicar numa célula filtra a\n * lista) e, embaixo do título de cada risco, a tarefa ameaçada. Cadastro e edição no `spine-suggestion-risk-form`,\n * onde a tarefa é obrigatória (todo risco é de uma tarefa).\n */\n@Component({\n selector: 'spine-suggestion-risks',\n imports: [ButtonComponent, RiskRegisterComponent, SuggestionRiskFormComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './planning-views.scss',\n template: `\n <div class=\"plan-toolbar\">\n <hm-button icon=\"plus\" (clicked)=\"create()\">{{ p.risks.new }}</hm-button>\n <p class=\"plan-muted\">{{ p.risks.hint }}</p>\n </div>\n <hm-risk-register [label]=\"p.risks.label\" [risks]=\"s.riskItems()\" [statuses]=\"s.riskStatuses()\" interactive\n [(selected)]=\"selected\" (riskClick)=\"edit($event.risk)\" />\n\n <spine-suggestion-risk-form [(open)]=\"open\" [risk]=\"editing()\" />\n `,\n})\nexport class SuggestionRisksComponent {\n protected readonly s = inject(SuggestionPlanningStore);\n protected readonly p = this.s.plan;\n\n protected readonly selected = signal<RiskCellSelection | null>(null);\n protected readonly open = signal(false);\n protected readonly editing = signal<TaskRisk | null>(null);\n\n protected create(): void {\n this.editing.set(null);\n this.open.set(true);\n }\n\n protected edit(risk: TaskRisk): void {\n this.editing.set(risk);\n this.open.set(true);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, output, signal } from '@angular/core';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { DatePickerComponent } from '@trismegisto/angular/date-picker';\nimport { GanttComponent, type GanttTaskChange } from '@trismegisto/angular/gantt';\nimport { IconButtonComponent } from '@trismegisto/angular/icon-button';\nimport { InputComponent } from '@trismegisto/angular/input';\nimport { HermesToastService } from '@trismegisto/angular/toast';\nimport { WorkloadComponent, type WorkloadCellEvent } from '@trismegisto/angular/workload';\nimport { formatMessage } from '@trismegisto/primitives/i18n';\nimport { taskGanttItems, taskWorkloadAllocations } from '@trismegisto/primitives/project-planning';\nimport { type GanttItem, type WorkloadPeriod, type WorkloadPerson } from '@trismegisto/primitives/tasks';\nimport { SuggestionPlanningStore } from './suggestion-planning.store';\n\n/** Capacidade de referência por pessoa por semana quando a sprint em curso não diz (pontos). */\nconst DEFAULT_WEEKLY_CAPACITY = 8;\nconst WEEKS = 4;\nconst DAY_MS = 86_400_000;\nconst MILESTONE_PREFIX = 'milestone:';\n\n/** AAAA-MM-DD de uma data local. */\nfunction isoDay(d: Date): string {\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\n/** A segunda-feira da semana de `d` (meia-noite local). */\nfunction mondayOf(d: Date): Date {\n const day = (d.getDay() + 6) % 7;\n return new Date(d.getFullYear(), d.getMonth(), d.getDate() - day);\n}\n\n/**\n * Cronograma: o `hm-gantt` com as tarefas abertas que têm data (barras de `taskGanttItems`, agrupadas pela sprint, com\n * as setas de dependência) e os marcos do app; arrastar uma barra grava início e prazo (dependência quebrada vira\n * aviso) e arrastar um marco grava a data. Os marcos se cadastram e se excluem aqui. Abaixo, a carga da equipe nas\n * próximas 4 semanas (`taskWorkloadAllocations` → `hm-workload`), contra uma capacidade de referência por pessoa.\n */\n@Component({\n selector: 'spine-suggestion-schedule',\n imports: [ButtonComponent, DatePickerComponent, GanttComponent, IconButtonComponent, InputComponent, WorkloadComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './planning-views.scss',\n template: `\n <section class=\"plan-card\" aria-labelledby=\"sug-sched-gantt\">\n <h3 id=\"sug-sched-gantt\">{{ p.schedule.heading }}</h3>\n <p class=\"plan-muted\">{{ p.schedule.hint }}</p>\n <hm-gantt [label]=\"p.schedule.label\" [items]=\"items()\" scale=\"week\" editable interactive\n (itemClick)=\"onClick($event)\" (taskChange)=\"onChange($event)\" />\n </section>\n\n <section class=\"plan-card\" aria-labelledby=\"sug-sched-milestones\">\n <h3 id=\"sug-sched-milestones\">{{ p.schedule.milestones }}</h3>\n <form class=\"plan-row\" (submit)=\"$event.preventDefault(); addMilestone()\" novalidate>\n <hm-input [label]=\"p.schedule.milestoneTitle\" [maxLength]=\"120\" [value]=\"title()\" (valueChange)=\"title.set($any($event))\" />\n <hm-date-picker [label]=\"p.schedule.milestoneDate\" [value]=\"date()\" (valueChange)=\"date.set($event)\" />\n <hm-button type=\"submit\" emphasis=\"medium\" icon=\"plus\" [loading]=\"saving()\">{{ p.schedule.newMilestone }}</hm-button>\n </form>\n @if (missing()) {\n <p class=\"plan-muted\" role=\"alert\">{{ p.schedule.milestoneRequired }}</p>\n }\n @if (s.milestones().length) {\n <ul class=\"plan-rows\">\n @for (m of s.milestones(); track m.id) {\n <li>\n <span>{{ m.title }} <span class=\"plan-muted\">{{ dayText(m.date) }}</span></span>\n <hm-icon-button icon=\"trash\" size=\"small\" [label]=\"removeLabel(m.title)\" (clicked)=\"s.removeMilestone(m.id)\" />\n </li>\n }\n </ul>\n }\n </section>\n\n <section class=\"plan-card\" aria-labelledby=\"sug-sched-load\">\n <h3 id=\"sug-sched-load\">{{ p.schedule.workloadHeading }}</h3>\n <p class=\"plan-muted\">{{ capacityHint() }}</p>\n @if (team().length) {\n <hm-workload [label]=\"p.schedule.workloadLabel\" [people]=\"team()\" [periods]=\"weeks()\" [allocations]=\"allocations()\" unit=\"pts\"\n interactive (cellClick)=\"onCell($event)\" />\n } @else {\n <p class=\"plan-muted\">{{ p.schedule.noPeople }}</p>\n }\n </section>\n `,\n})\nexport class SuggestionScheduleComponent {\n protected readonly s = inject(SuggestionPlanningStore);\n private readonly toast = inject(HermesToastService);\n protected readonly p = this.s.plan;\n\n readonly openTask = output<string>();\n /** Clique numa célula da carga: a pessoa (o quadro pode filtrar por ela). */\n readonly person = output<string>();\n\n protected readonly items = computed<GanttItem[]>(() => {\n const names = this.s.sprintName();\n const tasks = taskGanttItems(this.s.open(), {\n group: (t) => (t.sprintId ? names.get(t.sprintId) ?? this.p.backlog : this.p.backlog),\n tone: (t) => (t.task.priority === 'urgente' ? 'danger' : t.task.status === 'em_desenvolvimento' ? 'info' : undefined),\n });\n const milestones: GanttItem[] = this.s.milestones().map((m) => ({\n id: `${MILESTONE_PREFIX}${m.id}`, label: m.title, start: m.date, milestone: true, group: this.p.schedule.milestones,\n }));\n return [...tasks, ...milestones];\n });\n\n /** Capacidade por pessoa por semana: a da sprint em curso dividida pela equipe e pelas semanas dela; senão, a padrão. */\n private readonly weekly = computed(() => {\n const sprint = this.s.activeSprint();\n const people = this.team0().length;\n if (!sprint?.capacity || !people) return DEFAULT_WEEKLY_CAPACITY;\n const days = (Date.parse(`${sprint.end_date}T00:00:00Z`) - Date.parse(`${sprint.start_date}T00:00:00Z`)) / DAY_MS + 1;\n return Math.max(1, Math.round(sprint.capacity / Math.max(1, days / 7) / people));\n });\n\n /** Quem tem tarefa aberta atribuída. */\n private readonly team0 = computed(() => {\n const ids = new Set(this.s.open().map((t) => t.assignee?.id).filter(Boolean));\n return this.s.people().filter((p) => ids.has(p.id));\n });\n\n protected readonly team = computed<WorkloadPerson[]>(() =>\n this.team0().map((p) => ({ id: p.id, name: p.name, imageUrl: p.imageUrl, capacity: this.weekly() })));\n\n protected readonly capacityHint = computed(() => formatMessage(this.p.schedule.workloadHint, { capacity: this.weekly() }));\n\n private readonly ranges = computed(() => {\n const monday = mondayOf(new Date());\n const format = new Intl.DateTimeFormat(this.s.locale, { day: 'numeric', month: 'short' });\n return Array.from({ length: WEEKS }, (_, i) => {\n const start = new Date(monday.getFullYear(), monday.getMonth(), monday.getDate() + i * 7);\n const end = new Date(start.getFullYear(), start.getMonth(), start.getDate() + 6);\n return { id: `w${i}`, start, end, label: formatMessage(this.p.schedule.week, { date: format.format(start) }) };\n });\n });\n\n protected readonly weeks = computed<WorkloadPeriod[]>(() => this.ranges().map((r) => ({ id: r.id, label: r.label })));\n protected readonly allocations = computed(() => taskWorkloadAllocations(this.s.open(), this.ranges()));\n\n // --- marcos ---\n\n protected readonly title = signal('');\n protected readonly date = signal<string | null>(null);\n protected readonly missing = signal(false);\n protected readonly saving = signal(false);\n\n protected async addMilestone(): Promise<void> {\n const title = this.title().trim();\n const date = this.date();\n this.missing.set(!title || !date);\n if (!title || !date) return;\n this.saving.set(true);\n const ok = await this.s.createMilestone(title, date);\n this.saving.set(false);\n if (ok) {\n this.title.set('');\n this.date.set(null);\n }\n }\n\n protected removeLabel(title: string): string {\n return formatMessage(this.p.schedule.removeMilestone, { title });\n }\n\n protected dayText(iso: string): string {\n return new Intl.DateTimeFormat(this.s.locale, { day: 'numeric', month: 'short', year: 'numeric', timeZone: 'UTC' })\n .format(new Date(`${iso}T00:00:00Z`));\n }\n\n // --- gestos ---\n\n protected onClick(item: GanttItem): void {\n if (!item.milestone) this.openTask.emit(item.id);\n }\n\n protected async onChange(change: GanttTaskChange): Promise<void> {\n const start = isoDay(new Date(change.start));\n if (change.item.milestone) {\n await this.s.moveMilestone(change.id.slice(MILESTONE_PREFIX.length), start);\n return;\n }\n const task = this.s.items().find((t) => t.id === change.id);\n if (!task) return;\n const ok = await this.s.updateTask(change.id, { start_date: start, due_date: isoDay(new Date(change.end)) });\n if (!ok) return;\n const key = task.key ?? task.title;\n if (change.conflicts.length) {\n this.toast.warning(formatMessage(this.p.schedule.conflicts, { key, list: change.conflicts.map((c) => c.label).join(', ') }));\n } else {\n this.toast.success(formatMessage(this.p.schedule.rescheduled, { key }));\n }\n }\n\n protected onCell(event: WorkloadCellEvent): void {\n this.person.emit(event.person.id);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { DeadlineComponent } from '@trismegisto/angular/deadline';\nimport { ProgressComponent } from '@trismegisto/angular/progress';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { TaskListComponent } from '@trismegisto/angular/task-card';\nimport { formatMessage } from '@trismegisto/primitives/i18n';\nimport { sumEstimates } from '@trismegisto/primitives/tasks';\nimport { addDays } from '../suggestion-task';\nimport { SuggestionPlanningStore } from './suggestion-planning.store';\n\n/** Risco alto: probabilidade x impacto a partir do terceiro degrau da matriz do `hm-risk-register` (9 de 25). */\nconst HIGH_RISK = 9;\n/** Quantas linhas cada bloco mostra. */\nconst ROWS = 6;\n\n/**\n * Resumo do quadro: a sprint em andamento (meta, datas e pontos concluídos/comprometidos contra a capacidade), as\n * tarefas abertas de quem consulta (`hm-task-list`), os prazos vencidos e dos próximos 7 dias (`hm-deadline`), os\n * riscos altos em aberto e o próximo marco. Clicar numa tarefa abre o detalhe (o quadro cuida dele).\n */\n@Component({\n selector: 'spine-suggestion-summary',\n imports: [DeadlineComponent, ProgressComponent, TagComponent, TaskListComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './planning-views.scss',\n template: `\n <div class=\"plan-grid\">\n <section class=\"plan-card\" aria-labelledby=\"sug-sum-sprint\">\n <h3 id=\"sug-sum-sprint\">{{ s.activeSprint()?.name ?? p.summary.activeSprint }}</h3>\n @if (s.activeSprint(); as sprint) {\n <p class=\"plan-muted\">{{ s.rangeText(sprint.start_date, sprint.end_date) }}@if (sprint.goal) { · {{ sprint.goal }} }</p>\n <hm-progress [label]=\"sprintPoints()\" [hint]=\"capacityHint()\" [value]=\"sprint.done_points\" [max]=\"sprint.points || 1\" intent=\"success\" showValue />\n <dl class=\"plan-stats\">\n <div><dt>{{ p.sprints.committed }}</dt><dd>{{ s.pointsText(sprint.points) }}</dd></div>\n <div><dt>{{ p.summary.openTasks }}</dt><dd>{{ sprintOpen() }}</dd></div>\n </dl>\n } @else {\n <p class=\"plan-muted\">{{ p.noSprint }}</p>\n }\n <dl class=\"plan-stats\">\n <div><dt>{{ p.summary.openTasks }}</dt><dd>{{ s.open().length }}</dd></div>\n <div><dt>{{ p.summary.overdue }}</dt><dd>{{ overdue() }}</dd></div>\n <div><dt>{{ p.points }}</dt><dd>{{ s.pointsText(openPoints()) }}</dd></div>\n </dl>\n </section>\n\n <section class=\"plan-card\" aria-labelledby=\"sug-sum-mine\">\n <h3 id=\"sug-sum-mine\">{{ p.summary.mine }}</h3>\n @if (mine().length) {\n <hm-task-list [label]=\"p.summary.mine\" [tasks]=\"mine()\" [statuses]=\"s.statuses()\" openable (open)=\"openTask.emit($event.id)\" />\n } @else {\n <p class=\"plan-muted\">{{ p.summary.mineEmpty }}</p>\n }\n </section>\n\n <section class=\"plan-card\" aria-labelledby=\"sug-sum-due\">\n <h3 id=\"sug-sum-due\">{{ p.summary.deadlines }}</h3>\n @if (deadlines().length) {\n <ul class=\"plan-rows\">\n @for (t of deadlines(); track t.id) {\n <li>\n <button type=\"button\" class=\"plan-link\" (click)=\"openTask.emit(t.id)\"><span class=\"plan-key\">{{ t.key }}</span> {{ t.title }}</button>\n <hm-deadline [due]=\"t.due\" />\n </li>\n }\n </ul>\n } @else {\n <p class=\"plan-muted\">{{ p.summary.deadlinesEmpty }}</p>\n }\n </section>\n\n <section class=\"plan-card\" aria-labelledby=\"sug-sum-risks\">\n <h3 id=\"sug-sum-risks\">{{ p.summary.topRisks }}</h3>\n @if (topRisks().length) {\n <ul class=\"plan-rows\">\n @for (r of topRisks(); track r.id) {\n <li>\n <span class=\"plan-title\">{{ r.title }}</span>\n <hm-tag [name]=\"riskScore(r.likelihood, r.impact)\" [color]=\"r.likelihood * r.impact >= 16 ? 'danger' : 'warning'\" />\n </li>\n }\n </ul>\n } @else {\n <p class=\"plan-muted\">{{ p.summary.topRisksEmpty }}</p>\n }\n <h4>{{ p.summary.nextMilestone }}</h4>\n @if (nextMilestone(); as m) {\n <p class=\"plan-text\"><span class=\"plan-title\">{{ m.title }}</span> · <hm-deadline [due]=\"m.date\" /></p>\n } @else {\n <p class=\"plan-muted\">{{ p.summary.nextMilestoneEmpty }}</p>\n }\n </section>\n </div>\n `,\n})\nexport class SuggestionSummaryComponent {\n protected readonly s = inject(SuggestionPlanningStore);\n protected readonly p = this.s.plan;\n\n /** Hoje (AAAA-MM-DD no fuso de quem consulta), do quadro. */\n readonly today = input.required<string>();\n readonly openTask = output<string>();\n\n protected readonly sprintPoints = computed(() => {\n const sprint = this.s.activeSprint();\n return sprint ? formatMessage(this.p.summary.sprintPoints, { done: sprint.done_points, total: sprint.points }) : '';\n });\n\n protected readonly capacityHint = computed(() => {\n const capacity = this.s.activeSprint()?.capacity;\n return capacity === null || capacity === undefined ? '' : formatMessage(this.p.summary.sprintCapacity, { capacity });\n });\n\n protected readonly sprintOpen = computed(() => {\n const id = this.s.activeSprint()?.id;\n return this.s.open().filter((t) => t.sprintId === id).length;\n });\n\n protected readonly openPoints = computed(() => sumEstimates(this.s.open()));\n protected readonly overdue = computed(() => this.s.open().filter((t) => t.task.due_date && t.task.due_date < this.today()).length);\n\n protected readonly mine = computed(() => this.s.open().filter((t) => t.task.assignees.some((p) => p.user_id === this.s.me())).slice(0, ROWS * 2));\n\n /** Vencidas ou com prazo até daqui a 7 dias, da mais urgente para a menos. */\n protected readonly deadlines = computed(() => {\n const limit = addDays(this.today(), 7);\n return this.s.open()\n .filter((t) => t.task.due_date && t.task.due_date <= limit)\n .sort((a, b) => a.task.due_date!.localeCompare(b.task.due_date!))\n .slice(0, ROWS);\n });\n\n protected readonly topRisks = computed(() => this.s.risks()\n .filter((r) => r.status !== 'closed' && r.likelihood * r.impact >= HIGH_RISK)\n .slice(0, ROWS));\n\n protected readonly nextMilestone = computed(() => this.s.milestones().find((m) => m.date >= this.today()) ?? null);\n\n protected riskScore(likelihood: number, impact: number): string {\n return formatMessage(this.p.summary.riskScore, { likelihood, impact });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, output, signal } from '@angular/core';\nimport { DataGridComponent, type DataGridRowAction } from '@trismegisto/angular/data-grid';\nimport { EmptyComponent } from '@trismegisto/angular/empty';\nimport { SegmentedControlComponent, type SegmentedOption } from '@trismegisto/angular/segmented-control';\nimport { TaskListComponent } from '@trismegisto/angular/task-card';\nimport { type GridColumn } from '@trismegisto/primitives/data-grid';\nimport { pluralMessage } from '@trismegisto/primitives/i18n';\nimport { riskLevel } from '@trismegisto/primitives/workflow';\nimport { SPINE_MESSAGES } from '@trismegisto/spine';\nimport { PlanningTask, SuggestionPlanningStore } from './suggestion-planning.store';\n\nconst PRIORITY_RANK: Record<string, number> = { urgente: 0, alta: 1, media: 2, baixa: 3 };\n\n/**\n * As tarefas abertas do app (em análise, planejadas e em desenvolvimento) em lista (`hm-task-list`, agrupada pelo\n * status) ou em tabela (`hm-data-grid`, ordenável, com sprint e pontos). Abrir leva ao detalhe da tarefa, que o quadro\n * mostra; é lá que se edita.\n */\n@Component({\n selector: 'spine-suggestion-tasks',\n imports: [DataGridComponent, EmptyComponent, SegmentedControlComponent, TaskListComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './planning-views.scss',\n template: `\n <div class=\"plan-toolbar\">\n <hm-segmented-control [label]=\"p.tasks.viewLabel\" [options]=\"views\" [value]=\"view()\" (valueChange)=\"view.set($any($event))\" size=\"small\" />\n <p class=\"plan-muted\" aria-live=\"polite\">{{ countText() }}</p>\n </div>\n @if (!rows().length) {\n <hm-empty [heading]=\"p.tasks.emptyHeading\" [description]=\"p.tasks.emptyBody\" icon=\"tasks\" />\n } @else if (view() === 'list') {\n <hm-task-list [label]=\"p.tasks.listLabel\" [tasks]=\"rows()\" [statuses]=\"s.statuses()\" openable (open)=\"openTask.emit($event.id)\" />\n } @else {\n <hm-data-grid\n [caption]=\"p.tasks.gridCaption\"\n [columns]=\"columns()\"\n [rows]=\"rows()\"\n [rowId]=\"byId\"\n [rowActions]=\"actions\"\n [filterable]=\"false\"\n [paginated]=\"false\"\n [pagination]=\"false\"\n (actionTriggered)=\"openTask.emit($event.row.id)\"\n />\n }\n `,\n})\nexport class SuggestionTasksComponent {\n protected readonly s = inject(SuggestionPlanningStore);\n protected readonly p = this.s.plan;\n private readonly locale = inject(SPINE_MESSAGES).meta.locale;\n\n readonly openTask = output<string>();\n\n protected readonly view = signal<'list' | 'table'>('list');\n protected readonly byId = (t: PlanningTask) => t.id;\n protected readonly views: SegmentedOption[] = [\n { value: 'list', label: this.p.tasks.viewList, icon: 'list' },\n { value: 'table', label: this.p.tasks.viewTable, icon: 'table' },\n ];\n protected readonly actions: DataGridRowAction<PlanningTask>[] = [{ id: 'open', label: this.p.tasks.open, icon: 'eye' }];\n\n /** Pela ordem do fluxo (as que estão mais perto de sair primeiro) e, no mesmo status, pela prioridade. */\n protected readonly rows = computed(() => {\n const order = ['em_desenvolvimento', 'planejada', 'em_analise'];\n return [...this.s.open()].sort((a, b) => order.indexOf(a.task.status) - order.indexOf(b.task.status)\n || PRIORITY_RANK[a.task.priority] - PRIORITY_RANK[b.task.priority] || a.task.position - b.task.position);\n });\n\n protected readonly countText = computed(() => pluralMessage(this.p.tasks.count, this.rows().length, this.locale));\n\n protected readonly columns = computed<GridColumn<PlanningTask>[]>(() => {\n const t = this.p.tasks;\n const text = this.s.text;\n const date = (iso: string | null) => (iso\n ? new Intl.DateTimeFormat(this.locale, { day: 'numeric', month: 'short', timeZone: 'UTC' }).format(new Date(`${iso}T00:00:00Z`))\n : '—');\n return [\n { key: 'key', title: t.key, value: (r) => r.key ?? '', initialWidth: '6rem' },\n { key: 'title', title: t.title, value: (r) => r.title, initialWidth: '18rem' },\n { key: 'status', title: t.status, value: (r) => text.statuses[r.task.status], initialWidth: '10rem' },\n {\n key: 'priority', title: t.priority, value: (r) => text.priorities[r.task.priority],\n raw: (r) => PRIORITY_RANK[r.task.priority],\n },\n { key: 'assignee', title: t.assignee, value: (r) => r.assignee?.name ?? this.p.unassigned, initialWidth: '11rem' },\n { key: 'sprint', title: t.sprint, value: (r) => (r.sprintId ? this.s.sprintName().get(r.sprintId) ?? '—' : this.p.backlog) },\n {\n key: 'estimate', title: this.p.points, type: 'number', align: 'end',\n value: (r) => (r.estimate === null || r.estimate === undefined ? '—' : String(r.estimate)), raw: (r) => r.estimate ?? null,\n },\n { key: 'due', title: t.due, type: 'date', value: (r) => date(r.task.due_date), raw: (r) => r.task.due_date ?? '' },\n {\n key: 'risk', title: this.p.risks.level,\n value: (r) => {\n const score = this.s.riskScoreOf(r.task);\n return score === null ? '—' : `${this.p.risks.levels[riskLevel(score) as 'low' | 'medium' | 'high' | 'critical']} (${score})`;\n },\n raw: (r) => this.s.riskScoreOf(r.task) ?? 0,\n },\n ];\n });\n}\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\nimport { WorkflowDiagramComponent } from '@trismegisto/angular/workflow-diagram';\nimport { SuggestionPlanningStore } from './suggestion-planning.store';\n\n/**\n * O fluxo dos status das sugestões, só leitura (`hm-workflow-diagram`): é o contrato com quem pede, que acompanha a\n * sugestão por esses mesmos 5 status em \"Minhas sugestões\", então não muda por app. Cada status diz quantas há no quadro.\n */\n@Component({\n selector: 'spine-suggestion-workflow',\n imports: [WorkflowDiagramComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './planning-views.scss',\n template: `\n <section class=\"plan-card\" aria-labelledby=\"sug-flow\">\n <h3 id=\"sug-flow\">{{ p.workflow.heading }}</h3>\n <p class=\"plan-muted\">{{ p.workflow.hint }}</p>\n <hm-workflow-diagram [label]=\"p.workflow.label\" [definition]=\"s.workflow()\" />\n </section>\n `,\n})\nexport class SuggestionWorkflowComponent {\n protected readonly s = inject(SuggestionPlanningStore);\n protected readonly p = this.s.plan;\n}\n","import { Location } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AUTH_CONFIG } from '@orfeu/angular/core';\nimport { AccountAvatarComponent } from '@trismegisto/angular/account-avatar';\nimport { AlertComponent } from '@trismegisto/angular/alert';\nimport { ButtonComponent } from '@trismegisto/angular/button';\nimport { HermesDialogService } from '@trismegisto/angular/dialog';\nimport { EmptyComponent } from '@trismegisto/angular/empty';\nimport { IconComponent } from '@trismegisto/angular/icon';\nimport { IconButtonComponent } from '@trismegisto/angular/icon-button';\nimport { KanbanCardDirective, KanbanColumn, KanbanColumnActionsDirective, KanbanColumnEmptyDirective, KanbanColumnFooterDirective, KanbanColumnSummaryDirective, KanbanComponent, KanbanMoveEvent } from '@trismegisto/angular/kanban';\nimport { LevelBadgeComponent } from '@trismegisto/angular/level-badge';\nimport { MenuButtonComponent } from '@trismegisto/angular/menu-button';\nimport { PaginatorComponent } from '@trismegisto/angular/paginator';\nimport { SearchFieldComponent } from '@trismegisto/angular/search-field';\nimport { SegmentedControlComponent, SegmentedOption } from '@trismegisto/angular/segmented-control';\nimport { SelectComponent } from '@trismegisto/angular/select';\nimport { SkeletonComponent } from '@trismegisto/angular/skeleton';\nimport { TagComponent } from '@trismegisto/angular/tag';\nimport { HermesToastService } from '@trismegisto/angular/toast';\nimport { formatMessage, pluralMessage } from '@trismegisto/primitives/i18n';\nimport { PaginationState } from '@trismegisto/primitives/pagination';\nimport { MenuItem } from '@trismegisto/primitives/popover';\nimport { riskLevel } from '@trismegisto/primitives/workflow';\nimport { SPINE_MESSAGES, SpinePreferencesService, SpineUserStorage } from '@trismegisto/spine';\nimport {\n NEW_SCREEN_VALUE, SPINE_SUGGESTION_KIND_COLORS, SPINE_SUGGESTION_KIND_ICONS, SPINE_SUGGESTION_KINDS,\n SPINE_SUGGESTION_STATUS_COLORS, SPINE_SUGGESTION_STATUS_ICONS, SPINE_SUGGESTION_STATUSES, SPINE_SUGGESTION_WAITING,\n SPINE_SUGGESTION_WAITING_COLORS, SpineSuggestionPerson, SpineSuggestionStatus, SpineSuggestionWaiting, SpineTagRowComponent,\n SpineTagRowItem, screenName,\n} from '@trismegisto/spine/layout';\nimport {\n AUTO_SERVICE_SUGGESTION_DONE_DAYS, AutoServiceSuggestionsService,\n} from './auto-service-suggestions.service';\nimport { SuggestionTaskDetailComponent, copyText } from './suggestion-task-detail.component';\nimport { SuggestionMergePickerComponent } from './suggestion-merge.component';\nimport {\n AutoServiceTask, DueState, TASK_PRIORITIES, TASK_PRIORITY_ICONS, TaskCatalogLabel, TaskChecklistItem, TaskPriority,\n addDays, assignedTo, daysBetween, dueState, splitDuration, todayIso,\n} from './suggestion-task';\nimport { SuggestionPlanningStore } from './planning/suggestion-planning.store';\nimport { SuggestionPlanningViewComponent } from './planning/suggestion-planning-view.component';\nimport { SuggestionRisksComponent } from './planning/suggestion-risks.component';\nimport { SuggestionScheduleComponent } from './planning/suggestion-schedule.component';\nimport { SuggestionSummaryComponent } from './planning/suggestion-summary.component';\nimport { SuggestionTasksComponent } from './planning/suggestion-tasks.component';\nimport { SuggestionWorkflowComponent } from './planning/suggestion-workflow.component';\n\n/** As visões: o quadro e o arquivo de sempre, mais as de planejamento (que leem do `SuggestionPlanningStore`). */\ntype Mode = 'summary' | 'tasks' | 'board' | 'planning' | 'schedule' | 'risks' | 'workflow' | 'archive';\nconst PLANNING_MODES: readonly Mode[] = ['summary', 'tasks', 'planning', 'schedule', 'risks', 'workflow'];\nconst MODES: readonly Mode[] = ['summary', 'tasks', 'board', 'planning', 'schedule', 'risks', 'workflow', 'archive'];\ntype SortKey = 'position' | 'votes' | 'recent' | 'priority' | 'due';\n\n/** As colunas do quadro: recusada não tem coluna (sai na hora; fica no arquivo). */\nconst BOARD_STATUSES = ['em_analise', 'planejada', 'em_desenvolvimento', 'concluida'] as const satisfies readonly SpineSuggestionStatus[];\nconst OPEN_STATUSES: readonly SpineSuggestionStatus[] = ['em_analise', 'planejada', 'em_desenvolvimento'];\n/** Quantas levam o selo \"Mais votada\" (das com algum apoio, no quadro inteiro, não só no filtrado). */\nconst TOP_VOTED = 3;\n/** Responsáveis que aparecem no cartão; o resto vira \"+N\". */\nconst FACES = 3;\nconst ARCHIVE_PAGE = 20;\nconst EXCERPT = 140;\n/** Parâmetro do link copiado (\"?sugestao=SUG-12\"): abrir a tela com ele abre a tarefa. */\nexport const SUGGESTION_LINK_PARAM = 'sugestao';\n\nconst PRIORITY_RANK: Record<TaskPriority, number> = { urgente: 0, alta: 1, media: 2, baixa: 3 };\nconst byPosition = (a: AutoServiceTask, b: AutoServiceTask) => a.position - b.position || a.created_at.localeCompare(b.created_at);\nconst SORTS: Record<SortKey, (a: AutoServiceTask, b: AutoServiceTask) => number> = {\n position: byPosition,\n votes: (a, b) => b.votes - a.votes || byPosition(a, b),\n recent: (a, b) => b.created_at.localeCompare(a.created_at),\n priority: (a, b) => PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority] || byPosition(a, b),\n due: (a, b) => (a.due_date ?? '9999').localeCompare(b.due_date ?? '9999') || byPosition(a, b),\n};\n\n/** Sem acento e minúsculo: \"analise\" acha \"Análise\". */\nconst fold = (s: string) => s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase();\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/**\n * O quadro de trabalho das sugestões do app (`hm-kanban`), montado na tela Sugestões do auto-serviço.\n *\n * - **Quadro**: o servidor manda o recorte (`board=true`): abertas e as concluídas dos últimos `done_days` dias;\n * recusadas e arquivadas saem. Indicadores do quadro inteiro, tudo calculado aqui com o que já vem (vencidas e as\n * que venceram ontem, vencendo em breve, em andamento por status, concluídas na janela e hoje, atribuídas a mim e as\n * abertas por prioridade; vencidas, vencendo, minhas e cada prioridade também filtram) e os filtros da tela — texto\n * (inclusive a chave \"SUG-12\"), responsável (\"minhas\", \"sem responsável\"), tipo, status (só aquela coluna),\n * prioridade, rótulo, prazo, e em \"Mais filtros\" tela e quem pediu, além da ordenação — sobre a lista inteira.\n * - **Coluna**: \"Mais antiga há 4h 12min\" (pelo `status_at`) e as vencidas abaixo do título, vazio explicado e\n * \"+ Criar tarefa\" no rodapé (os templates `hmKanbanColumnSummary`/`Empty`/`Footer` do `hm-kanban`).\n * - **Cartão**: capa (token da paleta), chave, selo de prioridade, título, contexto (tipo · tela), rótulos, trecho,\n * checklist (e os itens, com \"Mostrar no cartão\"), prazo por extenso (vencida em vermelho; hoje/amanhã em âmbar) e o\n * rodapé com comentários, checklist, apoios, a data e os responsáveis com \"+N\"; o \"⋮\": status e prioridade\n * (submenus), atribuir a mim, copiar link e chave, rótulos, capa (popover), arquivar e excluir (com confirmação).\n * - **Criar**: sempre o cadastro completo (a tarefa em branco no modal), já com o status da coluna: \"Nova tarefa\" no\n * topo (o \"▾\" escolhe a coluna), o \"+\" do cabeçalho e o \"+ Criar tarefa\" do rodapé de cada coluna.\n * - **Arrastar** (ponteiro, toque ou teclado; o `hm-kanban` cuida do gesto e dos anúncios) muda status e/ou posição: a\n * tela aplica na hora e grava; se o servidor recusar, avisa e relê. A posição gravada é sempre a da coluna INTEIRA\n * (pelo vizinho visível). Fora da \"ordem do quadro\", arrastar só troca de coluna (vai para o fim).\n * - **Arquivo**: arquivadas, recusadas, agrupadas (selo \"Agrupada\", com \"Desagrupar\") e concluídas antigas, paginado e\n * buscado no servidor, com \"Reabrir\"/\"Restaurar\".\n * - **Agrupar**: \"Agrupar em…\" no \"⋯\" do cartão e no detalhe abre o seletor (`spine-suggestion-merge-picker`) com as\n * abertas do quadro e a prévia do servidor; confirmar agrupa, tira a origem do quadro e abre o destino.\n * - **Tarefa**: `spine-suggestion-task-detail` (modal de duas colunas); o link \"?sugestao=SUG-12\" abre direto nela.\n * - **Planejamento** (pasta `planning/`): Resumo, Tarefas (lista e tabela), Planejamento (sprints, backlog e burndown),\n * Cronograma (Gantt com marcos e a carga da equipe), Riscos (matriz e registro) e Fluxo (os status, só leitura), no\n * molde do app de projetos do site de docs. Leem do `SuggestionPlanningStore` (tarefas sem o recorte do quadro,\n * sprints, marcos e riscos), relido ao entrar nelas; abrir uma tarefa abre o mesmo detalhe.\n */\n@Component({\n selector: 'spine-auto-service-suggestions',\n imports: [\n AccountAvatarComponent, AlertComponent, ButtonComponent, EmptyComponent, IconButtonComponent, IconComponent,\n KanbanCardDirective, KanbanColumnActionsDirective, KanbanColumnEmptyDirective, KanbanColumnFooterDirective,\n KanbanColumnSummaryDirective, KanbanComponent, LevelBadgeComponent, MenuButtonComponent, PaginatorComponent,\n SearchFieldComponent, SegmentedControlComponent, SelectComponent, SpineTagRowComponent, SuggestionMergePickerComponent,\n SuggestionTaskDetailComponent, TagComponent, SkeletonComponent, SuggestionSummaryComponent, SuggestionTasksComponent,\n SuggestionPlanningViewComponent, SuggestionScheduleComponent, SuggestionRisksComponent, SuggestionWorkflowComponent,\n ],\n providers: [SuggestionPlanningStore],\n templateUrl: './auto-service-suggestions.component.html',\n styleUrl: './auto-service-suggestions.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceSuggestionsComponent {\n private readonly messages = inject(SPINE_MESSAGES);\n protected readonly text = this.messages.suggestions;\n private readonly service = inject(AutoServiceSuggestionsService);\n protected readonly planning = inject(SuggestionPlanningStore);\n private readonly toast = inject(HermesToastService);\n private readonly dialogs = inject(HermesDialogService);\n private readonly preferences = inject(SpinePreferencesService);\n private readonly userStorage = inject(SpineUserStorage, { optional: true });\n private readonly router = inject(Router, { optional: true });\n private readonly location = inject(Location, { optional: true });\n /** O client da sessão: a tela da sugestão só abre daqui se o app administrado for este. */\n private readonly sessionClientId = inject(AUTH_CONFIG, { optional: true })?.clientId ?? null;\n\n readonly clientId = input.required<string>();\n\n protected readonly kinds = SPINE_SUGGESTION_KINDS;\n protected readonly statuses = SPINE_SUGGESTION_STATUSES;\n protected readonly statusColors = SPINE_SUGGESTION_STATUS_COLORS;\n protected readonly statusIcons = SPINE_SUGGESTION_STATUS_ICONS;\n protected readonly kindColors = SPINE_SUGGESTION_KIND_COLORS;\n protected readonly waitingValues = SPINE_SUGGESTION_WAITING;\n protected readonly waitingColors = SPINE_SUGGESTION_WAITING_COLORS;\n protected readonly newScreenValue = NEW_SCREEN_VALUE;\n protected readonly priorities = TASK_PRIORITIES;\n protected readonly sortKeys: readonly SortKey[] = ['position', 'votes', 'recent', 'priority', 'due'];\n protected readonly today = todayIso(this.preferences.effectiveTimeZone());\n\n protected readonly mode = signal<Mode>('board');\n protected readonly modeOptions: readonly SegmentedOption[] = [\n { value: 'summary', label: this.text.planning.viewSummary, icon: 'dashboard' },\n { value: 'tasks', label: this.text.planning.viewTasks, icon: 'list' },\n { value: 'board', label: this.text.viewBoard, icon: 'view-columns' },\n { value: 'planning', label: this.text.planning.viewPlanning, icon: 'tasks' },\n { value: 'schedule', label: this.text.planning.viewSchedule, icon: 'calendar-days' },\n { value: 'risks', label: this.text.planning.viewRisks, icon: 'exclamation-triangle' },\n { value: 'workflow', label: this.text.planning.viewWorkflow, icon: 'nodes' },\n { value: 'archive', label: this.text.viewArchive, icon: 'archive' },\n ];\n protected readonly isPlanningMode = computed(() => PLANNING_MODES.includes(this.mode()));\n\n // --- quadro ---\n protected readonly all = signal<AutoServiceTask[]>([]);\n protected readonly catalog = signal<TaskCatalogLabel[]>([]);\n protected readonly doneDays = signal(AUTO_SERVICE_SUGGESTION_DONE_DAYS);\n protected readonly loading = signal(false);\n protected readonly loadError = signal('');\n protected readonly search = signal('');\n protected readonly kind = signal<string>('');\n protected readonly screen = signal<string>('');\n protected readonly author = signal<string>('');\n /** '' | 'me' | 'none' | user_id */\n protected readonly assignee = signal<string>('');\n protected readonly label = signal<string>('');\n protected readonly priority = signal<string>('');\n /** '' | 'overdue' | 'soon' */\n protected readonly due = signal<string>('');\n /** '' | um status do quadro: só essa coluna aparece. */\n protected readonly status = signal<string>('');\n /** '' | 'solicitante' | 'responsaveis': com quem está a vez na conversa. */\n protected readonly waiting = signal<string>('');\n /** '' | 'none' (criada pela equipe, sem grupo) | group_id: o grupo de quem pediu. */\n protected readonly group = signal<string>('');\n protected readonly sort = signal<SortKey>('position');\n /** \"Mais filtros\" aberto (quem pediu e o grupo). */\n protected readonly moreFilters = signal(false);\n protected readonly boardStatuses = BOARD_STATUSES;\n /** Os filtros escondidos em \"Mais filtros\" que estão ligados (o botão mostra a conta). */\n protected readonly extraFilters = computed(() => [this.author(), this.group()].filter(Boolean).length);\n protected readonly moreFiltersText = computed(() => (this.extraFilters()\n ? formatMessage(this.text.moreFiltersActive, { count: this.extraFilters() }) : this.text.moreFilters));\n\n protected readonly me = computed(() => this.userStorage?.userId() ?? '');\n\n protected readonly filtered = computed(() => {\n const term = fold(this.search().trim());\n const keyMatch = this.search().trim().match(/^(?:sug-?)?(\\d{1,9})$/i);\n const [kind, screen, author, assignee, label, priority, due, waiting, group] = [this.kind(), this.screen(),\n this.author(), this.assignee(), this.label(), this.priority(), this.due(), this.waiting(), this.group()];\n const me = this.me();\n return this.all().filter((s) => (!kind || s.kind === kind)\n && (!screen || (screen === NEW_SCREEN_VALUE ? !!s.screen.new : !s.screen.new && s.screen.path === screen))\n && (!waiting || (s.waiting_on === waiting && OPEN_STATUSES.includes(s.status)))\n && (!group || (group === 'none' ? !s.groups?.length : !!s.groups?.some((g) => g.id === group)))\n && (!author || s.author?.user_id === author)\n && (!assignee || (assignee === 'none' ? s.assignees.length === 0 : assignedTo(s, assignee === 'me' ? me : assignee)))\n && (!label || s.labels.some((l) => l.id === label))\n && (!priority || s.priority === priority)\n && (!due || this.matchesDue(s, due))\n && (!term || (keyMatch && s.key_number === Number(keyMatch[1]))\n || fold(`${s.title} ${s.description} ${s.screen.label ?? ''} ${this.personName(s.author)} ${s.key}`).includes(term)));\n });\n protected readonly isFiltered = computed(() => !!(this.search().trim() || this.kind() || this.screen() || this.author()\n || this.assignee() || this.label() || this.priority() || this.due() || this.status() || this.waiting() || this.group()));\n protected readonly filteredText = computed(() => formatMessage(this.text.boardFiltered, {\n shown: this.columns().reduce((n, c) => n + c.items.length, 0), total: this.all().length,\n }));\n\n protected readonly columns = computed<KanbanColumn<AutoServiceTask>[]>(() => {\n const list = this.filtered();\n const order = SORTS[this.sort()];\n const only = this.status();\n return BOARD_STATUSES.filter((status) => !only || status === only).map((status) => ({\n id: status, title: this.text.statuses[status], items: list.filter((s) => s.status === status).sort(order),\n }));\n });\n\n /**\n * Resumo de cada coluna (o que está à vista nela): há quanto tempo a mais antiga está no status (\"Mais antiga há\n * 4h 12min\", pelo `status_at`) e quantas vencidas.\n */\n protected readonly columnSummaries = computed(() => {\n const now = Date.now();\n return new Map(this.columns().map((c) => {\n const since = c.items.map((s) => Date.parse(s.status_at ?? s.created_at)).filter((t) => !Number.isNaN(t));\n const oldest = since.length ? this.duration(now - Math.min(...since)) : '';\n const overdue = c.items.filter((s) => dueState(s, this.today) === 'overdue').length;\n return [c.id, {\n oldest: oldest ? formatMessage(this.text.columnOldest, { age: oldest }) : '',\n overdue: overdue ? pluralMessage(this.text.columnOverdue, overdue, this.messages.meta.locale) : '',\n }];\n }));\n });\n\n /**\n * Telas, pessoas, responsáveis e grupos que aparecem no quadro, para os filtros (só o que existe). As telas na ordem\n * do caminho (\"Módulo › Tela\"), então as de um módulo ficam juntas; as novas (que ainda não existem) são uma opção só.\n */\n protected readonly screens = computed(() => {\n const byPath = new Map<string, string>();\n for (const s of this.all()) if (s.screen.path && !s.screen.new) byPath.set(s.screen.path, s.screen.label || s.screen.path);\n return [...byPath].map(([path, label]) => ({ path, label })).sort((a, b) => a.label.localeCompare(b.label));\n });\n protected readonly hasNewScreens = computed(() => this.all().some((s) => s.screen.new));\n protected readonly groupOptions = computed(() => {\n const byId = new Map<string, string>();\n for (const s of this.all()) for (const g of s.groups ?? []) byId.set(g.id, g.name);\n return [...byId].map(([id, name]) => ({ id, name })).sort((a, b) => a.name.localeCompare(b.name));\n });\n protected readonly authors = computed(() => this.people((s) => (s.author ? [s.author] : [])));\n protected readonly assigneeOptions = computed(() => this.people((s) => s.assignees));\n\n /** Indicadores do quadro inteiro (o filtro não muda: é o retrato do app). */\n protected readonly stats = computed(() => {\n const list = this.all();\n const count = (status: SpineSuggestionStatus) => list.filter((s) => s.status === status).length;\n const open = list.filter((s) => OPEN_STATUSES.includes(s.status));\n const yesterday = addDays(this.today, -1);\n const zone = this.preferences.effectiveTimeZone();\n const overdue = open.filter((s) => dueState(s, this.today) === 'overdue');\n const done = list.filter((s) => s.status === 'concluida');\n return {\n open: open.length, em_analise: count('em_analise'), planejada: count('planejada'),\n em_desenvolvimento: count('em_desenvolvimento'), concluida: done.length,\n mine: open.filter((s) => assignedTo(s, this.me())).length,\n overdue: overdue.length,\n /** Venceram ontem: passaram a vencidas hoje (o \"+N desde ontem\"). */\n overdueNew: overdue.filter((s) => s.due_date === yesterday).length,\n soon: open.filter((s) => { const d = dueState(s, this.today); return d === 'today' || d === 'tomorrow'; }).length,\n /** A vez é da equipe (quem pediu escreveu) e as mensagens de quem pede ainda não lidas por quem consulta. */\n waitingTeam: open.filter((s) => s.waiting_on === 'responsaveis').length,\n unread: list.reduce((n, s) => n + (s.unread ?? 0), 0),\n doneToday: done.filter((s) => todayIso(zone, new Date(s.status_at ?? s.updated_at)) === this.today).length,\n byPriority: TASK_PRIORITIES.map((p) => ({ priority: p, count: open.filter((s) => s.priority === p).length })),\n };\n });\n protected readonly doneLabel = computed(() => formatMessage(this.text.kpiDone, { days: this.doneDays() }));\n /** \"Em análise 3 · Planejada 4 · Em desenvolvimento 5\" no indicador das abertas. */\n protected readonly openParts = computed(() => OPEN_STATUSES.map((st) => ({\n status: st,\n text: formatMessage(this.text.kpiStatusCount, { status: this.text.statuses[st], count: this.all().filter((s) => s.status === st).length }),\n })));\n protected readonly overdueNote = computed(() => (this.stats().overdueNew\n ? formatMessage(this.text.kpiOverdueTrend, { count: this.stats().overdueNew }) : this.text.kpiOverdueSteady));\n protected readonly doneNote = computed(() => (this.stats().doneToday\n ? formatMessage(this.text.kpiDoneToday, { count: this.stats().doneToday }) : this.text.kpiDoneNoneToday));\n protected readonly kpiLoading = computed(() => this.loading() && !this.all().length);\n /** Itens do \"▾\" ao lado de \"Nova tarefa\": criar direto numa coluna. */\n protected readonly newTaskItems: MenuItem[] = BOARD_STATUSES.map((st) => ({\n id: st, label: formatMessage(this.text.newTaskIn, { status: this.text.statuses[st] }), icon: SPINE_SUGGESTION_STATUS_ICONS[st],\n }));\n protected readonly topIds = computed(() => new Set(\n this.all().filter((s) => s.votes > 0).sort(SORTS.votes).slice(0, TOP_VOTED).map((s) => s.id)));\n\n /** O menu \"⋯\" de cada cartão, montado uma vez por versão da tarefa (o menu aberto não perde o foco). */\n protected readonly menus = computed(() => new Map(this.all().map((t) => [t.id, this.buildMenu(t)])));\n\n protected readonly itemKey = (s: AutoServiceTask) => s.id;\n protected readonly itemLabel = (s: AutoServiceTask) => `${s.key} ${s.title}`;\n\n // --- arquivo ---\n protected readonly archived = signal<AutoServiceTask[]>([]);\n protected readonly archiveTotal = signal(0);\n protected readonly archivePage = signal<PaginationState>({ page: 1, size: ARCHIVE_PAGE });\n protected readonly archiveSearch = signal('');\n protected readonly archiveKind = signal<string>('');\n protected readonly archiveStatus = signal<string>('');\n protected readonly archiveLoading = signal(false);\n protected readonly archiveError = signal('');\n protected readonly reopening = signal<string | null>(null);\n protected readonly archiveCountText = computed(() =>\n pluralMessage(this.text.archiveCount, this.archiveTotal(), this.messages.meta.locale));\n protected readonly archiveEmptyHint = computed(() => formatMessage(this.text.archiveEmptyHint, { days: this.doneDays() }));\n\n // --- tarefa aberta ---\n protected readonly selected = signal<AutoServiceTask | null>(null);\n protected readonly drafting = signal(false);\n protected readonly draftStatus = signal<SpineSuggestionStatus>('em_analise');\n protected readonly canOpenScreen = computed(() =>\n !!this.sessionClientId && this.sessionClientId.toLowerCase() === this.clientId().toLowerCase());\n\n private linkHandled = false;\n\n constructor() {\n effect(() => {\n const clientId = this.clientId();\n untracked(() => {\n this.selected.set(null);\n this.drafting.set(false);\n void this.loadLabels(clientId);\n this.planning.clientId.set(clientId);\n if (this.mode() === 'archive') void this.loadArchive(1, clientId);\n else if (this.isPlanningMode()) void this.planning.load(clientId);\n else void this.load(clientId);\n });\n });\n effect(() => this.planning.me.set(this.me()));\n }\n\n private people(of: (s: AutoServiceTask) => readonly SpineSuggestionPerson[]): SpineSuggestionPerson[] {\n const byId = new Map<string, SpineSuggestionPerson>();\n for (const s of this.all()) for (const p of of(s)) byId.set(p.user_id, p);\n return [...byId.values()].sort((a, b) => this.personName(a).localeCompare(this.personName(b)));\n }\n\n private matchesDue(s: AutoServiceTask, due: string): boolean {\n const state = dueState(s, this.today);\n return due === 'overdue' ? state === 'overdue' : state === 'today' || state === 'tomorrow';\n }\n\n protected setMode(value: string): void {\n const mode = MODES.includes(value as Mode) ? (value as Mode) : 'board';\n if (mode === this.mode()) return;\n const wasPlanning = this.isPlanningMode();\n this.mode.set(mode);\n // Cada troca relê: o que foi reaberto no arquivo aparece no quadro e vice-versa. Entre duas visões de\n // planejamento o store já está em dia (cada gravação aplica a resposta do servidor).\n if (mode === 'archive') void this.loadArchive(1);\n else if (this.isPlanningMode()) {\n if (!wasPlanning) void this.planning.load();\n } else void this.load();\n }\n\n protected refresh(): void {\n if (this.mode() === 'archive') void this.loadArchive(this.archivePage().page);\n else if (this.isPlanningMode()) void this.planning.load();\n else void this.load();\n }\n\n /** Clique numa pessoa da carga (Cronograma): o quadro filtrado pelas tarefas dela. */\n protected filterByPerson(userId: string): void {\n this.assignee.set(userId);\n this.setMode('board');\n }\n\n protected async load(clientId = this.clientId()): Promise<void> {\n this.loading.set(true);\n this.loadError.set('');\n try {\n const board = await this.service.board(clientId);\n this.all.set(board.suggestions);\n this.doneDays.set(board.doneDays);\n void this.openFromLink(clientId);\n } catch {\n this.loadError.set(this.text.loadError);\n } finally {\n this.loading.set(false);\n }\n }\n\n private async loadLabels(clientId = this.clientId()): Promise<void> {\n try {\n this.catalog.set(await this.service.labels(clientId));\n } catch {\n this.catalog.set([]);\n }\n }\n\n /** \"?sugestao=SUG-12\" na URL: abre a tarefa (uma vez por tela). */\n private async openFromLink(clientId: string): Promise<void> {\n if (this.linkHandled || !this.router) return;\n this.linkHandled = true;\n const key = this.router.parseUrl(this.router.url).queryParams[SUGGESTION_LINK_PARAM];\n if (typeof key !== 'string' || !key) return;\n const known = this.all().find((s) => s.key.toLowerCase() === key.toLowerCase());\n try {\n this.openDetail(known ?? (await this.service.lookup(clientId, key)));\n } catch {\n this.toast.error(this.text.loadError);\n }\n }\n\n protected clearFilters(): void {\n for (const s of [this.search, this.kind, this.screen, this.author, this.assignee, this.label, this.priority, this.due, this.status,\n this.waiting, this.group]) {\n s.set('');\n }\n }\n\n /**\n * Indicador que filtra (\"atribuídas a mim\", \"vencidas\", \"vencendo em breve\", \"aguardando responsáveis\"): liga/desliga\n * o filtro equivalente.\n */\n protected toggleKpi(which: 'mine' | 'overdue' | 'soon' | 'waiting', on: boolean): void {\n if (which === 'mine') this.assignee.set(on ? 'me' : '');\n else if (which === 'waiting') this.waiting.set(on ? 'responsaveis' : '');\n else this.due.set(on ? which : '');\n }\n\n /** Uma prioridade da legenda do indicador: filtra por ela (de novo, desliga). */\n protected togglePriority(p: TaskPriority): void {\n this.priority.update((current) => (current === p ? '' : p));\n }\n\n /** Largura de cada prioridade na barra empilhada (% das abertas). */\n protected priorityShare(count: number): number {\n const total = this.stats().open;\n return total ? (count / total) * 100 : 0;\n }\n\n protected priorityPart(p: TaskPriority, count: number): string {\n return formatMessage(this.text.kpiPriorityPart, { priority: this.text.priorities[p], count });\n }\n\n /**\n * O quadro já moveu o cartão (na lista filtrada); aqui vira a posição na coluna INTEIRA — logo depois do vizinho de\n * cima que está visível (ou antes do de baixo; sozinho na coluna filtrada = fim) — aplica na lista e grava. Com\n * outra ordenação, só a coluna conta: vai para o fim dela, e reordenar na mesma coluna não grava.\n */\n protected async onMoved(event: KanbanMoveEvent<AutoServiceTask>): Promise<void> {\n const item = event.item;\n const to = event.to as SpineSuggestionStatus;\n const changed = event.from !== to;\n let change: { status?: SpineSuggestionStatus; position?: number };\n\n if (this.sort() !== 'position') {\n if (!changed) {\n this.all.update((list) => [...list]); // devolve o cartão ao lugar da ordenação\n return;\n }\n const end = this.all().filter((s) => s.status === to && s.id !== item.id).length;\n this.all.update((list) => list.map((s) => (s.id === item.id ? { ...s, status: to, position: end } : s)));\n change = { status: to };\n } else {\n const shown = event.columns.find((c) => c.id === to)?.items ?? [];\n const above = shown[event.toIndex - 1];\n const below = shown[event.toIndex + 1];\n const column = this.all().filter((s) => s.status === to && s.id !== item.id).sort(byPosition);\n let index = column.length;\n if (above) index = column.findIndex((s) => s.id === above.id) + 1;\n else if (below) index = Math.max(0, column.findIndex((s) => s.id === below.id));\n\n const order = [...column.slice(0, index).map((s) => s.id), item.id, ...column.slice(index).map((s) => s.id)];\n const position = new Map(order.map((id, i) => [id, i]));\n this.all.update((list) => list.map((s) => (position.has(s.id)\n ? { ...s, position: position.get(s.id)!, ...(s.id === item.id ? { status: to } : {}) } : s)));\n change = { ...(changed ? { status: to } : {}), position: index };\n }\n\n try {\n this.replace(await this.service.move(this.clientId(), item.id, change));\n } catch {\n this.toast.error(this.text.moveError);\n await this.load();\n }\n }\n\n // --- criação ---\n\n /**\n * Abre o cadastro completo (a tarefa em branco no modal) já na coluna escolhida: \"Nova tarefa\" do topo (Em análise),\n * o \"▾\" ao lado dele, o \"+\" do cabeçalho e o \"+ Criar tarefa\" do rodapé de cada coluna.\n */\n protected newTask(status: string = 'em_analise'): void {\n this.selected.set(null);\n this.draftStatus.set(BOARD_STATUSES.includes(status as (typeof BOARD_STATUSES)[number]) ? (status as SpineSuggestionStatus) : 'em_analise');\n this.drafting.set(true);\n }\n\n /** Nome do \"+\" da coluna: \"Nova tarefa em Planejada\". */\n protected newTaskInLabel(status: string): string {\n return formatMessage(this.text.newTaskIn, { status: this.text.statuses[status as SpineSuggestionStatus] ?? status });\n }\n\n // --- tarefa aberta ---\n\n protected openDetail(s: AutoServiceTask): void {\n this.drafting.set(false);\n this.selected.set(s);\n }\n\n protected closeDetail(): void {\n this.selected.set(null);\n this.drafting.set(false);\n if (this.mode() === 'archive') void this.loadArchive(this.archivePage().page);\n }\n\n protected onCreated(task: AutoServiceTask): void {\n if (this.mode() === 'board') this.all.update((list) => [...list, task]);\n this.planning.replace(task);\n this.drafting.set(false);\n this.selected.set(task);\n }\n\n protected onRemoved(task: AutoServiceTask): void {\n this.all.update((list) => list.filter((s) => s.id !== task.id));\n this.planning.remove(task.id);\n this.archived.update((list) => list.filter((s) => s.id !== task.id));\n this.archiveTotal.update((n) => Math.max(0, n - (this.mode() === 'archive' ? 1 : 0)));\n this.selected.set(null);\n }\n\n protected onLabelCreated(label: TaskCatalogLabel): void {\n this.catalog.update((list) => [...list, label].sort((a, b) => a.name.localeCompare(b.name)));\n }\n\n /**\n * Troca a tarefa nas listas (o que o servidor devolveu), mantendo o autor que já veio com a foto. Recusada,\n * arquivada e agrupada saem do quadro na hora (o servidor também as tira do próximo `board=true`).\n */\n protected replace(saved: AutoServiceTask): void {\n const merge = (s: AutoServiceTask) => ({ ...s, ...saved, author: saved.author ?? s.author });\n const leaves = saved.status === 'recusada' || !!saved.archived_at || !!saved.merged_into;\n this.all.update((list) => (leaves\n ? list.filter((s) => s.id !== saved.id)\n : list.map((s) => (s.id === saved.id ? merge(s) : s))));\n this.archived.update((list) => list.map((s) => (s.id === saved.id ? merge(s) : s)));\n this.planning.replace(saved);\n }\n\n // --- menu do cartão ---\n\n private buildMenu(t: AutoServiceTask): MenuItem[] {\n const linked = new Set(t.labels.map((l) => l.id));\n const labels: MenuItem[] = this.catalog().length\n ? this.catalog().map((l) => ({ id: `label:${l.id}`, label: l.name, icon: linked.has(l.id) ? 'check' : 'tag' }))\n : [{ id: 'label:none', label: this.text.menuNoLabels, disabled: true }];\n return [\n {\n id: 'status', label: this.text.menuStatus, icon: 'view-columns',\n children: SPINE_SUGGESTION_STATUSES.map((st) => ({\n id: `status:${st}`, label: this.text.statuses[st], icon: st === t.status ? 'check' : SPINE_SUGGESTION_STATUS_ICONS[st], disabled: st === t.status,\n })),\n },\n {\n id: 'priority', label: this.text.menuPriority, icon: TASK_PRIORITY_ICONS[t.priority],\n children: TASK_PRIORITIES.map((p) => ({ id: `priority:${p}`, label: this.text.priorities[p], icon: p === t.priority ? 'check' : TASK_PRIORITY_ICONS[p] })),\n },\n {\n id: 'waiting', label: this.text.menuWaiting, icon: 'chat-bubble',\n children: [\n ...SPINE_SUGGESTION_WAITING.map((w) => ({\n id: `waiting:${w}`, label: this.text.waiting[w], icon: t.waiting_on === w ? 'check' : 'chat-bubble', disabled: t.waiting_on === w,\n })),\n { id: 'waiting:none', label: this.text.waitingClear, icon: t.waiting_on ? 'check-circle' : 'check', disabled: !t.waiting_on },\n ],\n },\n { id: 'assign-me', label: this.text.menuAssignMe, icon: 'user-plus', disabled: assignedTo(t, this.me()) },\n { id: 'labels', label: this.text.menuLabel, icon: 'tag', children: labels },\n { id: 'copy-link', label: this.text.menuCopyLink, icon: 'link', separatorAbove: true },\n { id: 'copy-key', label: this.text.menuCopyKey, icon: 'copy' },\n // Sem cadeia: a que já recebeu outras não pode ser agrupada (o seletor explica; aqui fica desligado).\n { id: 'merge', label: this.text.menuMerge, icon: 'layers', separatorAbove: true, disabled: !!t.merged_count },\n { id: 'archive', label: this.text.menuArchive, icon: 'archive', separatorAbove: true },\n { id: 'delete', label: this.text.menuDelete, icon: 'trash', danger: true },\n ];\n }\n\n protected menuOf(t: AutoServiceTask): MenuItem[] {\n return this.menus().get(t.id) ?? [];\n }\n\n protected menuLabel(t: AutoServiceTask): string {\n return formatMessage(this.text.cardMenu, { key: t.key });\n }\n\n /** Uma escolha do \"⋯\": cada uma grava e devolve a tarefa nova (ou copia, ou abre a capa ancorada no botão). */\n protected async onMenu(t: AutoServiceTask, id: string, anchor: HTMLElement): Promise<void> {\n const clientId = this.clientId();\n const [action, value] = id.split(':');\n try {\n if (action === 'status') this.replace(await this.service.move(clientId, t.id, { status: value as SpineSuggestionStatus }));\n else if (action === 'priority') this.replace(await this.service.update(clientId, t.id, { priority: value as TaskPriority }));\n else if (action === 'waiting') {\n this.replace(await this.service.update(clientId, t.id, { waiting_on: value === 'none' ? null : value as SpineSuggestionWaiting }));\n this.toast.success(this.text.waitingSaved);\n }\n else if (action === 'assign-me') {\n this.replace(await this.service.addPerson(clientId, t.id, 'me', 'responsavel'));\n this.toast.success(this.text.assignedToMe);\n } else if (action === 'label') {\n this.replace(await this.service.setLabel(clientId, t.id, value, !t.labels.some((l) => l.id === value)));\n } else if (action === 'copy-link') {\n if (await copyText(this.linkOf(t))) this.toast.success(this.text.linkCopied);\n else this.toast.error(this.text.copyError);\n } else if (action === 'copy-key') {\n if (await copyText(t.key)) this.toast.success(this.text.keyCopied);\n else this.toast.error(this.text.copyError);\n } else if (action === 'merge') {\n this.startMerge(t);\n } else if (action === 'archive') {\n this.replace(await this.service.setArchived(clientId, t.id, true));\n this.toast.success(this.text.archivedToast);\n } else if (action === 'delete') await this.confirmDelete(t);\n } catch {\n this.toast.error(this.text.saveError);\n }\n }\n\n // --- agrupar ---\n\n /** A que está sendo agrupada (o seletor aberto); o detalhe fecha antes (um modal por vez). */\n protected readonly mergeSource = signal<AutoServiceTask | null>(null);\n\n protected startMerge(t: AutoServiceTask): void {\n this.selected.set(null);\n this.drafting.set(false);\n this.mergeSource.set(t);\n }\n\n /** Agrupou: a origem sai do quadro, o destino é trocado pela versão do servidor e abre (mostra \"Agrupadas aqui\"). */\n protected onMerged(event: { source: AutoServiceTask; target: AutoServiceTask }): void {\n this.mergeSource.set(null);\n this.all.update((list) => list.filter((s) => s.id !== event.source.id));\n this.replace(event.target);\n this.selected.set(event.target);\n }\n\n /** O detalhe pediu outra tarefa (o destino de uma agrupada, uma das agrupadas): abre a completa. */\n protected async openTask(id: string): Promise<void> {\n try {\n const task = await this.service.task(this.clientId(), id);\n this.openDetail(task);\n } catch {\n this.toast.error(this.text.loadError);\n }\n }\n\n /** Desagrupou: a origem volta ao quadro (relê o que estiver à vista). */\n protected onUnmerged(): void {\n if (this.mode() === 'archive') void this.loadArchive(this.archivePage().page);\n else void this.load();\n }\n\n protected mergedIntoText(key: string): string {\n return formatMessage(this.text.mergedInto, { key });\n }\n\n /** \"Desagrupar\" no arquivo. */\n protected async unmergeFromArchive(t: AutoServiceTask): Promise<void> {\n this.reopening.set(t.id);\n try {\n await this.service.unmerge(this.clientId(), t.id);\n this.toast.success(formatMessage(this.text.unmergedToast, { key: t.key }));\n void this.loadArchive(this.archivePage().page);\n } catch {\n this.toast.error(this.text.saveError);\n } finally {\n this.reopening.set(null);\n }\n }\n\n private async confirmDelete(t: AutoServiceTask): Promise<void> {\n const ok = await this.dialogs.confirm({\n heading: formatMessage(this.text.deleteHeading, { key: t.key }), message: this.text.deleteMessage,\n confirmLabel: this.text.deleteConfirm, danger: true,\n });\n if (!ok) return;\n await this.service.remove(this.clientId(), t.id);\n this.onRemoved(t);\n this.toast.success(this.text.deleted);\n }\n\n /** O link da tela com a tarefa: o caminho atual (sem a query) + \"?sugestao=SUG-12\". */\n private linkOf(t: AutoServiceTask): string {\n const path = (this.location?.path() ?? '').split('?')[0];\n const base = this.location?.prepareExternalUrl(path) ?? path;\n const origin = typeof window !== 'undefined' ? window.location.origin : '';\n return `${origin}${base}?${SUGGESTION_LINK_PARAM}=${encodeURIComponent(t.key)}`;\n }\n\n /** Item do checklist marcado no próprio cartão. */\n protected async toggleCardItem(t: AutoServiceTask, item: TaskChecklistItem): Promise<void> {\n try {\n this.replace(await this.service.updateChecklistItem(this.clientId(), t.id, item.id, { done: !item.done }));\n } catch {\n this.toast.error(this.text.saveError);\n }\n }\n\n // --- arquivo ---\n\n protected async loadArchive(page = 1, clientId = this.clientId()): Promise<void> {\n const size = this.archivePage().size;\n this.archiveLoading.set(true);\n this.archiveError.set('');\n try {\n const res = await this.service.archive(clientId, {\n limit: size, offset: (page - 1) * size, search: this.archiveSearch().trim(),\n kind: this.archiveKind() as AutoServiceTask['kind'] | '', status: this.archiveStatus() as 'concluida' | 'recusada' | '',\n });\n this.archived.set(res.suggestions);\n this.archiveTotal.set(res.total);\n this.archivePage.set({ page, size });\n } catch {\n this.archiveError.set(this.text.loadError);\n } finally {\n this.archiveLoading.set(false);\n }\n }\n\n protected onArchiveSearch(term: string): void {\n this.archiveSearch.set(term);\n void this.loadArchive(1);\n }\n\n protected onArchiveFilter(which: 'kind' | 'status', value: string): void {\n (which === 'kind' ? this.archiveKind : this.archiveStatus).set(value);\n void this.loadArchive(1);\n }\n\n protected onArchivePage(state: PaginationState): void {\n this.archivePage.set({ page: state.page, size: state.size });\n void this.loadArchive(state.page);\n }\n\n /** Recusada volta para Em análise (fim da coluna); arquivada volta ao quadro com o status que tinha. */\n protected async reopen(s: AutoServiceTask): Promise<void> {\n if (this.reopening()) return;\n this.reopening.set(s.id);\n try {\n if (s.archived_at) await this.service.setArchived(this.clientId(), s.id, false);\n if (s.status === 'recusada') await this.service.move(this.clientId(), s.id, { status: 'em_analise' });\n this.toast.success(s.status === 'recusada' ? this.text.reopened : this.text.restoredToast);\n const page = this.archivePage().page;\n // Última da página: volta uma, para não cair numa página vazia.\n await this.loadArchive(this.archived().length === 1 && page > 1 ? page - 1 : page);\n } catch {\n this.toast.error(this.text.reopenError);\n } finally {\n this.reopening.set(null);\n }\n }\n\n // --- textos do cartão ---\n\n protected sortLabel(k: SortKey): string {\n if (k === 'priority') return this.text.priority;\n if (k === 'due') return this.text.dueDate;\n return this.text.sorts[k];\n }\n\n protected kindLabel(s: AutoServiceTask): string {\n return this.text.kinds[s.kind];\n }\n\n protected kindIcon(s: AutoServiceTask): string {\n return SPINE_SUGGESTION_KIND_ICONS[s.kind];\n }\n\n protected priorityIcon(s: AutoServiceTask): string {\n return TASK_PRIORITY_ICONS[s.priority];\n }\n\n protected priorityName(s: AutoServiceTask): string {\n return this.text.priorities[s.priority];\n }\n\n protected isTop(s: AutoServiceTask): boolean {\n return this.topIds().has(s.id);\n }\n\n protected excerpt(s: AutoServiceTask): string {\n const d = s.description.replace(/\\s+/g, ' ').trim();\n return d.length > EXCERPT ? `${d.slice(0, EXCERPT - 1).trimEnd()}…` : d;\n }\n\n protected faces(s: AutoServiceTask): SpineSuggestionPerson[] {\n return s.assignees.slice(0, FACES);\n }\n\n protected moreFaces(s: AutoServiceTask): string {\n const rest = s.assignees.length - FACES;\n return rest > 0 ? formatMessage(this.text.moreAssignees, { count: rest }) : '';\n }\n\n protected dueOf(s: AutoServiceTask): DueState {\n return dueState(s, this.today);\n }\n\n /** \"Vencida há 3 dias\", \"Vence hoje\", \"Vence amanhã\", \"No prazo · até 12 de nov.\" (concluída: \"Até 12 de nov.\"). */\n protected dueText(s: AutoServiceTask): string {\n if (!s.due_date) return '';\n const state = this.dueOf(s);\n if (state === 'overdue') {\n return pluralMessage(this.text.dueLateDays, daysBetween(s.due_date, this.today), this.messages.meta.locale);\n }\n if (state === 'today') return this.text.dueToday;\n if (state === 'tomorrow') return this.text.dueTomorrow;\n if (state === 'later') return formatMessage(this.text.dueWithin, { date: this.day(s.due_date) });\n return formatMessage(this.text.dueOn, { date: this.day(s.due_date) });\n }\n\n protected dueIcon(s: AutoServiceTask): string {\n const state = this.dueOf(s);\n if (state === 'overdue') return 'alarm-clock';\n if (state === 'today' || state === 'tomorrow') return 'hourglass';\n return 'calendar';\n }\n\n /** O nome da tela no cartão: o último nível do caminho, o nome da nova ou \"Sem tela\". */\n protected screenNameOf(s: AutoServiceTask): string {\n if (s.screen.new) return s.screen.label || this.text.newScreenTag;\n return screenName(s.screen.label) || s.screen.path || this.text.noScreen;\n }\n\n /** Selo \"Aguardando…\" do cartão (o `let-item` do kanban chega sem tipo). */\n protected waitingName(s: AutoServiceTask): string {\n return s.waiting_on ? this.text.waiting[s.waiting_on] : '';\n }\n\n protected waitingColor(s: AutoServiceTask) {\n return s.waiting_on ? SPINE_SUGGESTION_WAITING_COLORS[s.waiting_on] : 'neutral';\n }\n\n /** Faixa da nota de risco da tarefa (baixo, médio, alto, crítico); vazio = sem risco aberto. */\n protected riskLevelOf(task: AutoServiceTask): string {\n const score = this.planning.riskScoreOf(task);\n return score === null ? '' : riskLevel(score);\n }\n\n protected unreadText(count: number): string {\n return pluralMessage(this.text.unread, count, this.messages.meta.locale);\n }\n\n protected createdText(s: AutoServiceTask): string {\n return formatMessage(this.text.createdOn, { date: this.date(s.created_at, true) });\n }\n\n /** Explicação da coluna vazia: com filtro, \"nenhuma com estes filtros\"; sem, o que costuma cair nela. */\n protected emptyHint(status: string): string {\n if (this.isFiltered()) return this.text.columnEmptyFiltered;\n const hint = this.text.columnEmptyHints[status as (typeof BOARD_STATUSES)[number]] ?? '';\n return formatMessage(hint, { days: this.doneDays() });\n }\n\n protected emptyIcon(status: string): string {\n return this.isFiltered() ? 'filter' : (SPINE_SUGGESTION_STATUS_ICONS[status as SpineSuggestionStatus] ?? 'inbox');\n }\n\n /** \"3d 4h\", \"4h 12min\", \"12min\" (o catálogo dá o formato). */\n private duration(ms: number): string {\n const { d, h, m } = splitDuration(ms);\n if (d) return formatMessage(this.text.duration.days, { d, h });\n if (h) return formatMessage(this.text.duration.hours, { h, m });\n return formatMessage(this.text.duration.minutes, { m });\n }\n\n protected checklistText(s: AutoServiceTask): string {\n return formatMessage(this.text.checklistSpoken, { done: s.checklist.done, total: s.checklist.total });\n }\n\n /** Checklist no cartão: os itens abertos (por cartão, só nesta tela; começa fechado, o rodapé diz quantos faltam). */\n private readonly openChecklists = signal<ReadonlySet<string>>(new Set());\n\n protected checklistOpen(s: AutoServiceTask): boolean {\n return this.openChecklists().has(s.id);\n }\n\n protected toggleChecklist(s: AutoServiceTask): void {\n this.openChecklists.update((set) => {\n const next = new Set(set);\n if (!next.delete(s.id)) next.add(s.id);\n return next;\n });\n }\n\n /** Os rótulos na linha de selos do cartão, cada um com a cor do token ('cat-3' → 3). */\n protected labelTags(s: AutoServiceTask): SpineTagRowItem[] {\n return s.labels.map((l) => ({ id: l.id, name: l.name, color: Number(l.color.replace('cat-', '')) || undefined }));\n }\n\n /** \"3 atividades (1/3)\". */\n protected cardChecklistText(s: AutoServiceTask): string {\n return pluralMessage(this.text.cardChecklist, s.checklist.total, this.messages.meta.locale, { done: s.checklist.done });\n }\n\n /** \"Pedida por Ana\" (+N relatores das agrupadas): a dica da foto de quem pediu. */\n protected requestersText(s: AutoServiceTask): string {\n const who = formatMessage(this.text.requestedByName, { name: this.personName(s.author) });\n return s.reporters_count ? `${who} ${this.moreText(s.reporters_count)}` : who;\n }\n\n /** \"+N\". */\n protected moreText(count: number): string {\n return formatMessage(this.text.moreAssignees, { count });\n }\n\n protected cardItems(s: AutoServiceTask): TaskChecklistItem[] {\n return s.checklist_on_card ? [...(s.checklist.items ?? [])].sort((a, b) => a.position - b.position) : [];\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 commentsText(count: number): string {\n return pluralMessage(this.text.comments, count, this.messages.meta.locale);\n }\n\n protected closedOn(s: AutoServiceTask): string {\n if (s.archived_at) return `${this.text.archivedTag} · ${this.date(s.archived_at)}`;\n const template = s.status === 'recusada' ? this.text.closedOn.recusada : this.text.closedOn.concluida;\n return formatMessage(template, { date: this.date(s.status_at ?? s.updated_at) });\n }\n\n /** \"há 3 dias\", \"ontem\", \"há 2 horas\" (Intl.RelativeTimeFormat no idioma do catálogo). */\n protected age(iso: string): string {\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, withTime = false): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, {\n dateStyle: 'short', ...(withTime ? { timeStyle: 'short' as const } : {}), timeZone: this.preferences.effectiveTimeZone(),\n }).format(new Date(iso));\n } catch {\n return iso.slice(0, 10);\n }\n }\n\n /** Data sem hora (AAAA-MM-DD): o dia é o dia, sem fuso. */\n protected day(iso: string): string {\n try {\n return new Intl.DateTimeFormat(this.messages.meta.locale, { day: '2-digit', month: 'short', timeZone: 'UTC' }).format(new Date(`${iso}T00:00:00Z`));\n } catch {\n return iso;\n }\n }\n}\n","<div class=\"as-stack as-suggestions\">\n <!-- As visões (Resumo, Tarefas, Quadro, Planejamento, Cronograma, Riscos, Fluxo e Arquivo), o atualizar e a nova\n tarefa (com o \"▾\" para criar direto numa coluna). As visões rolam por dentro em tela estreita. -->\n <div class=\"as-suggestions__bar\">\n <div class=\"as-suggestions__modes\">\n <hm-segmented-control [label]=\"text.viewLabel\" [options]=\"modeOptions\" [value]=\"mode()\" (valueChange)=\"setMode($event)\" />\n </div>\n <span class=\"as-suggestions__spacer\"></span>\n <hm-icon-button emphasis=\"subtle\" icon=\"refresh\" [label]=\"text.refresh\" (clicked)=\"refresh()\" />\n <span class=\"as-split\" role=\"group\" [attr.aria-label]=\"text.newTask\">\n <hm-button icon=\"plus\" (clicked)=\"newTask()\">{{ text.newTask }}</hm-button>\n <hm-menu-button class=\"as-split__more\" icon=\"chevron-down\" [showArrow]=\"false\" align=\"end\" [label]=\"text.newTaskOptions\"\n [items]=\"newTaskItems\" (chosen)=\"newTask($any($event))\" />\n </span>\n </div>\n\n @if (mode() === 'board') {\n @if (loadError()) {\n <hm-alert variant=\"error\">{{ loadError() }}</hm-alert>\n } @else {\n <!-- Indicadores do quadro inteiro (o filtro não mexe neles). Os botões filtram: vencidas, vencendo em breve,\n atribuídas a mim e cada prioridade da legenda. Cor sempre com texto junto. -->\n <section class=\"as-kpis\" [attr.aria-label]=\"text.kpis\" [attr.aria-busy]=\"kpiLoading() ? 'true' : null\">\n <button type=\"button\" class=\"as-kpi\" data-tone=\"danger\" [attr.aria-pressed]=\"due() === 'overdue'\"\n (click)=\"toggleKpi('overdue', due() !== 'overdue')\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"alarm-clock\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiOverdue }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().overdue }}</span>\n <span class=\"as-kpi__note\" [class.as-kpi__note--up]=\"stats().overdueNew > 0\">\n @if (stats().overdueNew) { <hm-icon shape=\"arrow-up\" /> }{{ overdueNote() }}\n </span>\n </span>\n </button>\n\n <button type=\"button\" class=\"as-kpi\" data-tone=\"warning\" [attr.aria-pressed]=\"due() === 'soon'\"\n (click)=\"toggleKpi('soon', due() !== 'soon')\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"hourglass\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiSoon }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().soon }}</span>\n <span class=\"as-kpi__note\">{{ text.dueSoonFilter }}</span>\n </span>\n </button>\n\n <!-- A vez é da equipe: quem pediu escreveu na conversa. A nota conta as mensagens ainda não lidas. -->\n <button type=\"button\" class=\"as-kpi\" data-tone=\"accent\" [attr.aria-pressed]=\"waiting() === 'responsaveis'\"\n (click)=\"toggleKpi('waiting', waiting() !== 'responsaveis')\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"chat-bubble\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.waiting.responsaveis }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().waitingTeam }}</span>\n <span class=\"as-kpi__note\" [class.as-kpi__note--up]=\"stats().unread > 0\">{{ unreadText(stats().unread) }}</span>\n </span>\n </button>\n\n <div class=\"as-kpi\" data-tone=\"info\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon [shape]=\"statusIcons.em_desenvolvimento\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiOpen }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().open }}</span>\n <span class=\"as-kpi__parts\">\n @for (part of openParts(); track part.status) {\n <span class=\"as-kpi__part\" [attr.data-status]=\"part.status\"><span class=\"as-kpi__dot\" aria-hidden=\"true\"></span>{{ part.text }}</span>\n }\n </span>\n </span>\n </div>\n\n <div class=\"as-kpi\" data-tone=\"success\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon [shape]=\"statusIcons.concluida\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ doneLabel() }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().concluida }}</span>\n <span class=\"as-kpi__note\" [class.as-kpi__note--good]=\"stats().doneToday > 0\">\n @if (stats().doneToday) { <hm-icon shape=\"arrow-up\" /> }{{ doneNote() }}\n </span>\n </span>\n </div>\n\n <button type=\"button\" class=\"as-kpi\" data-tone=\"accent\" [attr.aria-pressed]=\"assignee() === 'me'\"\n (click)=\"toggleKpi('mine', assignee() !== 'me')\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"user-checkmark\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiMine }}</span>\n <span class=\"as-kpi__value\">{{ kpiLoading() ? '—' : stats().mine }}</span>\n <span class=\"as-kpi__note\">{{ text.kpiMineHint }}</span>\n </span>\n </button>\n\n <div class=\"as-kpi as-kpi--wide\" data-tone=\"neutral\">\n <span class=\"as-kpi__icon\" aria-hidden=\"true\"><hm-icon shape=\"bar-chart\" /></span>\n <span class=\"as-kpi__body\">\n <span class=\"as-kpi__label\">{{ text.kpiPriority }}</span>\n @if (stats().open) {\n <span class=\"as-kpi__bar\" aria-hidden=\"true\">\n @for (p of stats().byPriority; track p.priority) {\n @if (p.count) {\n <span class=\"as-kpi__seg\" [attr.data-priority]=\"p.priority\" [style.inline-size.%]=\"priorityShare(p.count)\"></span>\n }\n }\n </span>\n <span class=\"as-kpi__legend\">\n @for (p of stats().byPriority; track p.priority) {\n <button type=\"button\" class=\"as-kpi__chip\" [attr.data-priority]=\"p.priority\" [attr.aria-pressed]=\"priority() === p.priority\"\n [disabled]=\"!p.count && priority() !== p.priority\" (click)=\"togglePriority(p.priority)\">\n <span class=\"as-kpi__dot\" aria-hidden=\"true\"></span>{{ priorityPart(p.priority, p.count) }}\n </button>\n }\n </span>\n } @else {\n <span class=\"as-kpi__note\">{{ text.kpiPriorityNone }}</span>\n }\n </span>\n </div>\n </section>\n\n <!-- Filtros numa linha: busca larga, os mais usados e \"Mais filtros\" (tela, quem pediu); à direita, a ordenação.\n Valem sobre a lista inteira: a posição gravada ao arrastar é sempre a da coluna inteira. -->\n <div class=\"as-filters\" role=\"group\" [attr.aria-label]=\"text.filters\">\n <hm-search-field class=\"as-filters__search\" [label]=\"text.search\" labelHidden [placeholder]=\"text.search\"\n [landmark]=\"false\" [debounce]=\"150\" [value]=\"search()\" (search)=\"search.set($event)\" />\n <hm-select class=\"as-filters__select\" [label]=\"text.assigneeFilter\" labelHidden [(value)]=\"assignee\">\n <option value=\"\">{{ text.allAssignees }}</option>\n <option value=\"me\">{{ text.assigneeMine }}</option>\n <option value=\"none\">{{ text.assigneeNone }}</option>\n @for (p of assigneeOptions(); track p.user_id) {\n <option [value]=\"p.user_id\">{{ personName(p) }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.kindFilter\" labelHidden [(value)]=\"kind\">\n <option value=\"\">{{ text.allKinds }}</option>\n @for (k of kinds; track k) {\n <option [value]=\"k\">{{ text.kinds[k] }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.statusFilter\" labelHidden [(value)]=\"status\">\n <option value=\"\">{{ text.allBoardStatuses }}</option>\n @for (st of boardStatuses; track st) {\n <option [value]=\"st\">{{ text.statuses[st] }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.priorityFilter\" labelHidden [(value)]=\"priority\">\n <option value=\"\">{{ text.allPriorities }}</option>\n @for (p of priorities; track p) {\n <option [value]=\"p\">{{ text.priorities[p] }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.labelFilter\" labelHidden [(value)]=\"label\">\n <option value=\"\">{{ text.allLabels }}</option>\n @for (l of catalog(); track l.id) {\n <option [value]=\"l.id\">{{ l.name }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.dueFilter\" labelHidden [(value)]=\"due\">\n <option value=\"\">{{ text.dueAny }}</option>\n <option value=\"overdue\">{{ text.dueOverdueFilter }}</option>\n <option value=\"soon\">{{ text.dueSoonFilter }}</option>\n </hm-select>\n <!-- A tela a mudar: \"Módulo › Tela\" (as de um módulo ficam juntas) e as novas, que ainda não existem. -->\n <hm-select class=\"as-filters__select as-filters__select--wide\" [label]=\"text.screenFilter\" labelHidden [(value)]=\"screen\">\n <option value=\"\">{{ text.allScreens }}</option>\n @if (hasNewScreens()) {\n <option [value]=\"newScreenValue\">{{ text.newScreenTag }}</option>\n }\n @for (sc of screens(); track sc.path) {\n <option [value]=\"sc.path\">{{ sc.label }}</option>\n }\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.waitingFilter\" labelHidden [(value)]=\"waiting\">\n <option value=\"\">{{ text.waitingFilter }}: {{ text.waitingAny }}</option>\n @for (w of waitingValues; track w) {\n <option [value]=\"w\">{{ text.waiting[w] }}</option>\n }\n </hm-select>\n <button type=\"button\" class=\"as-filters__more\" [class.as-filters__more--on]=\"extraFilters() > 0\"\n [attr.aria-expanded]=\"moreFilters()\" [attr.aria-controls]=\"moreFilters() ? 'as-more-filters' : null\"\n (click)=\"moreFilters.set(!moreFilters())\">\n <hm-icon shape=\"filter\" />{{ moreFiltersText() }}\n </button>\n <span class=\"as-filters__spacer\"></span>\n <hm-select class=\"as-filters__select as-filters__sort\" [label]=\"text.sort\" labelHidden [value]=\"sort()\" (valueChange)=\"sort.set($any($event))\">\n @for (k of sortKeys; track k) {\n <option [value]=\"k\">{{ text.sort }}: {{ sortLabel(k) }}</option>\n }\n </hm-select>\n </div>\n @if (moreFilters()) {\n <div class=\"as-filters as-filters--more\" id=\"as-more-filters\">\n <hm-select class=\"as-filters__select\" [label]=\"text.groupFilter\" labelHidden [(value)]=\"group\">\n <option value=\"\">{{ text.allGroups }}</option>\n @for (g of groupOptions(); track g.id) {\n <option [value]=\"g.id\">{{ g.name }}</option>\n }\n <option value=\"none\">{{ text.noGroups }}</option>\n </hm-select>\n <hm-select class=\"as-filters__select\" [label]=\"text.authorFilter\" labelHidden [(value)]=\"author\">\n <option value=\"\">{{ text.allAuthors }}</option>\n @for (p of authors(); track p.user_id) {\n <option [value]=\"p.user_id\">{{ personName(p) }}</option>\n }\n </hm-select>\n </div>\n }\n <div class=\"as-suggestions__status\">\n @if (sort() !== 'position') {\n <p class=\"as-suggestions__hint\">{{ text.sortHint }}</p>\n }\n @if (isFiltered()) {\n <span class=\"as-suggestions__count\" aria-live=\"polite\">{{ filteredText() }}</span>\n <hm-button size=\"small\" emphasis=\"minimal\" icon=\"filter-close\" (clicked)=\"clearFilters()\">{{ text.clearFilters }}</hm-button>\n }\n </div>\n\n <hm-kanban class=\"as-board\" [label]=\"text.boardLabel\" [columns]=\"columns()\" [itemKey]=\"itemKey\" [itemLabel]=\"itemLabel\"\n (moved)=\"onMoved($event)\">\n <!-- \"+\" no cabeçalho: abre o cadastro completo (o modal da \"Nova tarefa\") já nesta coluna. -->\n <ng-template hmKanbanColumnActions let-column>\n <hm-icon-button size=\"small\" emphasis=\"subtle\" icon=\"plus\" [label]=\"newTaskInLabel(column.id)\" (clicked)=\"newTask(column.id)\" />\n </ng-template>\n\n <!-- Logo abaixo do cabeçalho: há quanto tempo a mais antiga está no status e quantas venceram. -->\n <ng-template hmKanbanColumnSummary let-column>\n @if (columnSummaries().get(column.id); as sum) {\n @if (sum.oldest) {\n <span class=\"as-colsum\"><hm-icon shape=\"clock\" />{{ sum.oldest }}</span>\n }\n @if (sum.overdue) {\n <span class=\"as-colsum as-colsum--late\"><hm-icon shape=\"alarm-clock\" />{{ sum.overdue }}</span>\n }\n }\n </ng-template>\n\n <!-- Coluna vazia: ícone grande, a frase e o que costuma cair nela (com filtro, \"nenhuma com estes filtros\"). -->\n <ng-template hmKanbanColumnEmpty let-column>\n <span class=\"as-colempty\">\n <hm-icon class=\"as-colempty__icon\" [shape]=\"emptyIcon(column.id)\" />\n <span class=\"as-colempty__title\">{{ text.columnEmpty }}</span>\n <span class=\"as-colempty__hint\">{{ emptyHint(column.id) }}</span>\n </span>\n </ng-template>\n\n <!-- Rodapé: \"+ Criar tarefa\" abre o mesmo cadastro, com o status da coluna já escolhido. -->\n <ng-template hmKanbanColumnFooter let-column>\n <button type=\"button\" class=\"as-colfoot\" (click)=\"newTask(column.id)\">\n <hm-icon shape=\"plus\" />{{ text.createTask }}<span class=\"as-sr-only\">: {{ column.title }}</span>\n </button>\n </ng-template>\n\n <ng-template hmKanbanCard let-item>\n <div class=\"as-card\" [class.as-card--top]=\"isTop(item)\">\n <div class=\"as-card__body\">\n <!-- Uma linha só: chave, tipo, prioridade (e o selo de mais votada) e o \"⋯\". -->\n <div class=\"as-card__top\">\n <span class=\"as-card__key\">{{ item.key }}</span>\n <span class=\"as-card__kind\" [attr.data-kind]=\"item.kind\"><hm-icon [shape]=\"kindIcon(item)\" />{{ kindLabel(item) }}</span>\n <span class=\"as-card__priority\" [attr.data-priority]=\"item.priority\">\n <hm-icon [shape]=\"priorityIcon(item)\" /><span class=\"as-sr-only\">{{ text.priority }}: </span>{{ priorityName(item) }}\n </span>\n @if (isTop(item)) {\n <span class=\"as-card__badge\" [attr.title]=\"text.topVoted\"><hm-icon shape=\"flame\" /><span class=\"as-sr-only\">{{ text.topVoted }}</span></span>\n }\n <span #menuAnchor class=\"as-card__menu\">\n <hm-menu-button size=\"small\" icon=\"ellipsis-vertical\" [showArrow]=\"false\" align=\"end\" [label]=\"menuLabel(item)\"\n [items]=\"menuOf(item)\" (chosen)=\"onMenu(item, $event, menuAnchor)\" />\n </span>\n </div>\n <button type=\"button\" class=\"as-card__title\" (click)=\"openDetail(item)\">{{ item.title }}</button>\n\n <!-- Tudo o que identifica e situa a tarefa, lado a lado (quebra quando falta largura): a tela (o caminho\n inteiro na dica), \"Nova tela\", rótulos, com quem está a vez, mensagens novas e o prazo. -->\n <div class=\"as-card__chips\">\n <span class=\"as-card__screen\" [class.as-card__screen--new]=\"item.screen.new\" [attr.title]=\"item.screen.label || null\">\n <hm-icon [shape]=\"item.screen.new ? 'plus' : 'application'\" />{{ screenNameOf(item) }}\n </span>\n @if (item.screen.new) { <span class=\"as-card__screen-tag\">{{ text.newScreenTag }}</span> }\n <!-- Os rótulos ocupam o resto da linha da tela; o que não cabe vira \"+N\" (não quebra a linha). -->\n @if (item.labels.length) {\n <spine-tag-row class=\"as-card__labels\" [label]=\"text.labels\" [items]=\"labelTags(item)\" />\n }\n @if (item.waiting_on && item.status !== 'concluida' && item.status !== 'recusada') {\n <hm-tag [name]=\"waitingName(item)\" [color]=\"waitingColor(item)\" />\n }\n @if (item.unread) { <span class=\"as-card__unread\">{{ unreadText(item.unread) }}</span> }\n @if (item.due_date) {\n <span class=\"as-card__due\" [attr.data-due]=\"dueOf(item) ?? 'closed'\"><hm-icon [shape]=\"dueIcon(item)\" />{{ dueText(item) }}</span>\n }\n <!-- Nota de risco da tarefa (a maior entre os riscos abertos); o selo já se anuncia como \"Risco: Alto\". -->\n @if (riskLevelOf(item); as level) {\n <hm-level-badge class=\"as-card__risk\" scale=\"risk\" [value]=\"level\" />\n }\n </div>\n\n <!-- Com o checklist no cartão, a descrição sai (o checklist já diz o que falta). -->\n @if (!cardItems(item).length && excerpt(item); as ex) {\n <p class=\"as-card__excerpt\">{{ ex }}</p>\n }\n @if (cardItems(item).length && checklistOpen(item)) {\n <ul class=\"as-card__checklist\" [id]=\"'as-card-checklist-' + item.id\">\n @for (c of cardItems(item); track c.id) {\n <li>\n <button type=\"button\" class=\"as-card__check\" [attr.aria-pressed]=\"c.done\" (click)=\"toggleCardItem(item, c)\">\n <hm-icon [shape]=\"c.done ? 'check-circle' : 'circle-empty'\" /><span [class.as-card__done]=\"c.done\">{{ c.text }}</span>\n </button>\n </li>\n }\n </ul>\n }\n\n <!-- Rodapé: o checklist (abre e fecha os itens) à esquerda; contadores, data, quem pediu e os responsáveis à direita. -->\n <div class=\"as-card__foot\">\n @if (cardItems(item).length) {\n <button type=\"button\" class=\"as-card__checklist-toggle\" [class.as-card__count--full]=\"item.checklist.done === item.checklist.total\"\n [attr.aria-expanded]=\"checklistOpen(item)\" [attr.aria-controls]=\"checklistOpen(item) ? 'as-card-checklist-' + item.id : null\"\n (click)=\"toggleChecklist(item)\">\n <hm-icon shape=\"list-check\" />{{ cardChecklistText(item) }}<hm-icon [shape]=\"checklistOpen(item) ? 'angle-up' : 'angle-down'\" />\n </button>\n } @else if (item.checklist.total) {\n <span class=\"as-card__count\" [class.as-card__count--full]=\"item.checklist.done === item.checklist.total\" [attr.title]=\"checklistText(item)\">\n <hm-icon shape=\"list-check\" /><span aria-hidden=\"true\">{{ item.checklist.done }}/{{ item.checklist.total }}</span><span class=\"as-sr-only\">{{ checklistText(item) }}</span>\n </span>\n }\n <span class=\"as-card__spacer\"></span>\n <span class=\"as-card__count\" [class.as-card__count--zero]=\"!item.comments_count\" [attr.title]=\"commentsText(item.comments_count)\">\n <hm-icon shape=\"comment-message\" /><span aria-hidden=\"true\">{{ item.comments_count }}</span><span class=\"as-sr-only\">{{ commentsText(item.comments_count) }}</span>\n </span>\n <span class=\"as-card__count\" [class.as-card__count--on]=\"item.votes > 0\" [class.as-card__count--zero]=\"!item.votes\" [attr.title]=\"votesText(item.votes)\">\n <hm-icon shape=\"thumbs-up\" /><span aria-hidden=\"true\">{{ item.votes }}</span><span class=\"as-sr-only\">{{ votesText(item.votes) }}</span>\n </span>\n <span class=\"as-card__date\" [attr.title]=\"createdText(item)\">\n <hm-icon shape=\"clock\" /><span aria-hidden=\"true\">{{ date(item.created_at) }}</span><span class=\"as-sr-only\">{{ createdText(item) }}</span>\n </span>\n <!-- Quem pediu (a foto do autor e \"+N\" relatores das agrupadas) e, depois do fio, os responsáveis. -->\n @if (item.author) {\n <span class=\"as-card__requesters\" [attr.title]=\"requestersText(item)\">\n <hm-account-avatar size=\"small\" [name]=\"personName(item.author)\" [imageUrl]=\"item.author.picture\" />\n @if (item.reporters_count) { <span class=\"as-card__more\">{{ moreText(item.reporters_count) }}</span> }\n <span class=\"as-sr-only\">{{ requestersText(item) }}</span>\n </span>\n }\n <span class=\"as-card__faces\">\n @for (p of faces(item); track p.user_id) {\n <hm-account-avatar size=\"small\" [name]=\"personName(p)\" [imageUrl]=\"p.picture\" [attr.title]=\"personName(p)\" />\n } @empty {\n <span class=\"as-card__nobody\" [attr.title]=\"text.assigneeNone\">\n <hm-icon shape=\"user-circle\" /><span class=\"as-sr-only\">{{ text.assigneeNone }}</span>\n </span>\n }\n @if (moreFaces(item); as more) { <span class=\"as-card__more\">{{ more }}</span> }\n </span>\n </div>\n </div>\n </div>\n </ng-template>\n </hm-kanban>\n }\n } @else if (isPlanningMode()) {\n <!-- Planejamento: as visões leem do store (tarefas sem o recorte do quadro, sprints, marcos e riscos). -->\n @if (planning.loadError()) {\n <hm-alert variant=\"error\">\n {{ planning.loadError() }}\n <hm-button emphasis=\"minimal\" size=\"small\" (clicked)=\"planning.load()\">{{ text.planning.retry }}</hm-button>\n </hm-alert>\n } @else if (planning.loading() && !planning.tasks().length) {\n <hm-skeleton shape=\"cards\" [label]=\"text.planning.viewPlanning\" />\n } @else {\n @switch (mode()) {\n @case ('summary') { <spine-suggestion-summary [today]=\"today\" (openTask)=\"openTask($event)\" /> }\n @case ('tasks') { <spine-suggestion-tasks (openTask)=\"openTask($event)\" /> }\n @case ('planning') { <spine-suggestion-planning [today]=\"today\" /> }\n @case ('schedule') { <spine-suggestion-schedule (openTask)=\"openTask($event)\" (person)=\"filterByPerson($event)\" /> }\n @case ('risks') { <spine-suggestion-risks /> }\n @case ('workflow') { <spine-suggestion-workflow /> }\n }\n }\n } @else {\n <!-- Arquivo: arquivadas, recusadas e concluídas fora da janela do quadro, paginado no servidor. -->\n <div class=\"as-suggestions__filters\">\n <hm-search-field class=\"as-suggestions__search\" [label]=\"text.archiveSearch\" labelHidden [placeholder]=\"text.archiveSearch\"\n [landmark]=\"false\" [debounce]=\"300\" [value]=\"archiveSearch()\" (search)=\"onArchiveSearch($event)\" />\n <hm-select class=\"as-suggestions__select\" [label]=\"text.statusFilter\" labelHidden [value]=\"archiveStatus()\"\n (valueChange)=\"onArchiveFilter('status', $any($event))\">\n <option value=\"\">{{ text.statusFilter }}: {{ text.allStatuses }}</option>\n @for (st of statuses; track st) {\n <option [value]=\"st\">{{ text.statuses[st] }}</option>\n }\n </hm-select>\n <hm-select class=\"as-suggestions__select\" [label]=\"text.kindFilter\" labelHidden [value]=\"archiveKind()\"\n (valueChange)=\"onArchiveFilter('kind', $any($event))\">\n <option value=\"\">{{ text.allKinds }}</option>\n @for (k of kinds; track k) {\n <option [value]=\"k\">{{ text.kinds[k] }}</option>\n }\n </hm-select>\n @if (archiveTotal()) {\n <span class=\"as-suggestions__count\" aria-live=\"polite\">{{ archiveCountText() }}</span>\n }\n </div>\n\n @if (archiveError()) {\n <hm-alert variant=\"error\">{{ archiveError() }}</hm-alert>\n } @else if (!archiveLoading() && archived().length === 0) {\n <hm-empty icon=\"archive\" [heading]=\"text.archiveEmpty\" [description]=\"archiveEmptyHint()\" />\n } @else {\n <ul class=\"as-archive\" [attr.aria-label]=\"text.archiveLabel\" [attr.aria-busy]=\"archiveLoading() ? 'true' : null\">\n @for (s of archived(); track s.id) {\n <li class=\"as-archive__item\">\n <div class=\"as-archive__main\">\n <div class=\"as-archive__tags\">\n <span class=\"as-card__key\">{{ s.key }}</span>\n <hm-tag [name]=\"text.statuses[s.status]\" [color]=\"statusColors[s.status]\" />\n <hm-tag [name]=\"text.kinds[s.kind]\" [color]=\"kindColors[s.kind]\" />\n @if (s.merged_into; as into) {\n <!-- Agrupada: no arquivo, com o destino; os comentários ficam nela. -->\n <hm-tag [name]=\"text.mergedTag\" color=\"info\" />\n <button type=\"button\" class=\"as-archive__link\" (click)=\"openTask(into.id)\">{{ mergedIntoText(into.key) }}</button>\n } @else {\n <span class=\"as-archive__date\">{{ closedOn(s) }}</span>\n }\n </div>\n <button type=\"button\" class=\"as-card__title\" (click)=\"openDetail(s)\">{{ s.title }}</button>\n <div class=\"as-archive__meta\">\n <hm-account-avatar size=\"small\" [name]=\"personName(s.author)\" [imageUrl]=\"s.author?.picture\" />\n <span>{{ personName(s.author) }}</span>\n <span aria-hidden=\"true\">·</span>\n <span>{{ s.screen.label || text.noScreen }}</span>\n @if (s.votes) {\n <span aria-hidden=\"true\">·</span>\n <span>{{ votesText(s.votes) }}</span>\n }\n </div>\n </div>\n @if (s.merged_into) {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"unlink\" [loading]=\"reopening() === s.id\" (clicked)=\"unmergeFromArchive(s)\">\n {{ text.unmerge }}\n </hm-button>\n } @else if (s.archived_at) {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"unarchive\" [loading]=\"reopening() === s.id\" (clicked)=\"reopen(s)\">\n {{ text.menuRestore }}\n </hm-button>\n } @else if (s.status === 'recusada') {\n <hm-button size=\"small\" emphasis=\"medium\" icon=\"unarchive\" [loading]=\"reopening() === s.id\" (clicked)=\"reopen(s)\">\n {{ text.reopen }}\n </hm-button>\n }\n </li>\n }\n </ul>\n @if (archiveTotal() > archivePage().size) {\n <hm-paginator variant=\"simple\" [label]=\"text.pagination\" [state]=\"archivePage()\" [totalItems]=\"archiveTotal()\"\n [sizes]=\"[20, 50]\" (stateChanged)=\"onArchivePage($event)\" />\n }\n }\n }\n</div>\n\n\n<spine-suggestion-task-detail [clientId]=\"clientId()\" [task]=\"selected()\" [candidates]=\"planning.tasks().length ? planning.tasks() : all()\" [draft]=\"drafting()\" [draftStatus]=\"draftStatus()\"\n [labels]=\"catalog()\" [canOpenScreen]=\"canOpenScreen()\"\n (changed)=\"replace($event)\" (created)=\"onCreated($event)\" (removed)=\"onRemoved($event)\"\n (closed)=\"closeDetail()\" (labelCreated)=\"onLabelCreated($event)\"\n (mergeRequested)=\"startMerge($event)\" (openTask)=\"openTask($event)\" (unmerged)=\"onUnmerged()\" />\n\n<!-- \"Agrupar em…\" (do \"⋯\" do cartão ou do detalhe): as abertas do quadro, com a prévia do servidor. -->\n<spine-suggestion-merge-picker [clientId]=\"clientId()\" [source]=\"mergeSource()\" [candidates]=\"all()\"\n (merged)=\"onMerged($event)\" (closed)=\"mergeSource.set(null)\" />\n","import { ChangeDetectionStrategy, Component, signal } from '@angular/core';\nimport { AutoServiceClient, AutoServiceClientPickerComponent } from '../client-picker/auto-service-client-picker.component';\nimport { AutoServiceSuggestionsComponent } from '../tabs/auto-service-suggestions/auto-service-suggestions.component';\n\n/**\n * Tela \"Sugestões\" do auto-serviço (router `AUTO_SERVICE_SUGGESTIONS_TEMPLATE_ROUTER_ID`, na raiz do menu; migration\n * 0036 do argos): o seletor de client + o quadro de sugestões que era a aba Cliente › Sugestões. Carregada só por\n * `AUTO_SERVICE_SCREENS.suggestions` -- nunca exportada pelo ponto de entrada (ver `public-api.ts`).\n */\n@Component({\n selector: 'spine-auto-service-suggestions-page',\n imports: [AutoServiceClientPickerComponent, AutoServiceSuggestionsComponent],\n // Sem título/descrição internos: vêm da barra da página do spine (nome da rota + descrição do router AD100007).\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-suggestions [clientId]=\"c.id\" />\n }\n </div>\n `,\n styleUrl: './auto-service-page.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AutoServiceSuggestionsPageComponent {\n protected readonly client = signal<AutoServiceClient | null>(null);\n}\n"],"names":["OPEN_STATUSES","fold","PRIORITY_RANK"],"mappings":"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"}
|