@careonbrasil/dashboard 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"careonbrasil-dashboard.mjs","sources":["../../../projects/dashboard/src/lib/models/dashboard.models.ts","../../../projects/dashboard/src/lib/components/performance-wave/performance-wave.component.ts","../../../projects/dashboard/src/lib/components/performance-wave/performance-wave.component.html","../../../projects/dashboard/src/lib/components/dashboard-icon/dashboard-icon.component.ts","../../../projects/dashboard/src/lib/components/dashboard-icon/dashboard-icon.component.html","../../../projects/dashboard/src/lib/components/dashboard-skeleton/dashboard-skeleton.component.ts","../../../projects/dashboard/src/lib/components/dashboard-skeleton/dashboard-skeleton.component.html","../../../projects/dashboard/src/lib/dashboard.component.ts","../../../projects/dashboard/src/lib/dashboard.component.html","../../../projects/dashboard/src/lib/careon-dashboard.module.ts","../../../projects/dashboard/src/public-api.ts","../../../projects/dashboard/src/careonbrasil-dashboard.ts"],"sourcesContent":["import {\r\n TimelinePoint,\r\n ComparisonItem,\r\n DonutChartItem,\r\n StackedBarItem,\r\n FunnelBarItem\r\n} from '@careonbrasil/ng-charts';\r\n\r\n/**\r\n * Periodo de agregacao temporal para consulta e exibicao das metricas do dashboard.\r\n */\r\nexport enum DashboardPeriod {\r\n /** Visualizacao agregada das metricas do dia atual. */\r\n Today = 'Today',\r\n /** Visualizacao agregada dos ultimos 7 dias. */\r\n Week = 'Week',\r\n /** Visualizacao agregada do mes corrente (ultimos 30 dias). */\r\n Month = 'Month'\r\n}\r\n\r\n/**\r\n * Resumo consolidado dos indicadores-chave de performance (KPIs) exibidos nos cards superiores.\r\n * Inclui os totais do periodo corrente, do periodo imediatamente anterior e a variacao correspondente.\r\n */\r\nexport interface DashboardKpiSummary {\r\n /** Quantidade total de vagas publicadas no periodo atual. */\r\n registeredVacancies?: number;\r\n /** Quantidade total de vagas publicadas no periodo anterior equivalente. */\r\n registeredVacanciesPrevious?: number;\r\n /** Diferenca absoluta de vagas publicadas entre o periodo atual e o anterior. */\r\n registeredVacanciesDifference?: number;\r\n\r\n /** Total de candidaturas recebidas nas vagas da instituicao no periodo atual. */\r\n candidateApplications?: number;\r\n /** Total de candidaturas recebidas no periodo anterior equivalente. */\r\n candidateApplicationsPrevious?: number;\r\n /** Diferenca absoluta de candidaturas entre os dois periodos. */\r\n candidateApplicationsDifference?: number;\r\n\r\n /** Quantidade de curriculos pendentes de avaliacao ou triagem pelo recrutador. */\r\n pendingReviews?: number;\r\n /** Quantidade de curriculos pendentes no periodo anterior. */\r\n pendingReviewsPrevious?: number;\r\n /** Variacao de curriculos pendentes entre os periodos. */\r\n pendingReviewsDifference?: number;\r\n\r\n /** Media aritmetica de candidatos inscritos por vaga publicada no periodo. */\r\n averageCandidatesPerVacancy?: number;\r\n /** Media de candidatos por vaga no periodo anterior. */\r\n averageCandidatesPerVacancyPrevious?: number;\r\n /** Diferenca na media de candidatos por vaga. */\r\n averageCandidatesDifference?: number;\r\n\r\n /** Quantidade de vagas ativas no momento (status aberto). */\r\n openVacancies?: number;\r\n /** Quantidade de vagas encerradas, canceladas ou preenchidas. */\r\n closedVacancies?: number;\r\n /** Total acumulado de vagas registradas pela instituicao. */\r\n totalVacancies?: number;\r\n}\r\n\r\n/**\r\n * Representa uma vaga ou plantao que demanda intervencao imediata do recrutador.\r\n * Exibido na secao \"Precisa da sua atencao\".\r\n */\r\nexport interface DashboardAttentionItem {\r\n /** Identificador unico da vaga no sistema. */\r\n dutyId: number;\r\n /** Titulo principal da vaga (ex: especialidade médica, cargo). */\r\n title: string;\r\n /** Subtitulo contextual com informacoes de horario, setor ou unidade. */\r\n subtitle: string;\r\n /** Quantidade de profissionais inscritos nesta vaga. */\r\n candidatesCount?: number;\r\n /** Quantidade de inscricoes pendentes de analise para esta vaga. */\r\n pendingReviewsCount?: number;\r\n /** Quantidade de dias corridos em que a vaga permanece aberta sem candidaturas. */\r\n daysOpen?: number;\r\n /** Quantidade de horas decorridas desde a abertura da vaga. */\r\n hoursOpen?: number;\r\n /** Indica se a vaga e de regime fixo continuo ou plantao avulso. */\r\n isFixedJob?: boolean;\r\n}\r\n\r\n/**\r\n * Nivel qualitativo de atratividade e conversao institucional.\r\n * Utilizado para parametrizar a renderizacao da onda vetorial de performance.\r\n */\r\nexport enum PerformanceLevel {\r\n /** Nivel Azul: Desempenho satisfatorio, alta conversao e boa procura de candidatos. */\r\n Blue = 'Blue',\r\n /** Nivel Laranja: Desempenho moderado, vagas visualizadas com conversao abaixo do potencial. */\r\n Orange = 'Orange',\r\n /** Nivel Vermelho: Desempenho critico, baixa procura ou periodo prolongado sem publicacoes. */\r\n Red = 'Red'\r\n}\r\n\r\n/**\r\n * Analise qualitativa e orientacao consultiva sobre o desempenho de recrutamento da instituicao.\r\n */\r\nexport interface DashboardPerformanceAnalysis {\r\n /** Taxa media percentual de conversao de visualizacoes em candidaturas (0 a 100). */\r\n averageConversionRate?: number;\r\n /** Nivel de performance categorizado (Blue, Orange ou Red). */\r\n level?: PerformanceLevel | number;\r\n /** Titulo em destaque sintetizando o diagnostico da instituicao. */\r\n highlightTitle?: string;\r\n /** Descricao explicativa com recomendacoes praticas para otimizacao das vagas. */\r\n description?: string;\r\n /** Total de vagas avaliadas no calculo do periodo. */\r\n totalVacanciesInPeriod?: number;\r\n}\r\n\r\n/**\r\n * Classificacao comparativa da remuneracao oferecida em relacao a media regional de mercado.\r\n */\r\nexport enum DutySalaryStatus {\r\n /** Remuneracao oferecida abaixo da media praticada na regiao. */\r\n BelowMarket = 'BelowMarket',\r\n /** Remuneracao alinhada com a faixa media de mercado da regiao. */\r\n AtMarket = 'AtMarket',\r\n /** Remuneracao acima da media regional, conferindo vantagem competitiva. */\r\n AboveMarket = 'AboveMarket',\r\n /** Remuneracao a combinar ou nao informada no cadastro da vaga. */\r\n NotInformed = 'NotInformed',\r\n /** Volume amostral insuficiente na regiao para calculo de referencia confiavel. */\r\n InsufficientData = 'InsufficientData'\r\n}\r\n\r\n/**\r\n * Diagnostico salarial comparativo de uma vaga especifica frente aos dados de mercado da regiao.\r\n */\r\nexport interface DashboardDutySalaryComparison {\r\n /** Valor monetario oferecido pela instituicao para o plantao ou cargo. */\r\n yourSalary?: number | null;\r\n /** Valor medio regional apurado para a mesma especialidade e carga horaria. */\r\n regionalAverageSalary?: number | null;\r\n /** Diferenca percentual em relacao a media regional (positivo indica acima, negativo abaixo). */\r\n differencePercentage?: number | null;\r\n /** Classificacao da faixa salarial de acordo com o enum DutySalaryStatus. */\r\n status: DutySalaryStatus;\r\n /** Titulo sintetico do comparativo salarial. */\r\n highlightTitle: string;\r\n /** Orientacao detalhada sobre o impacto do valor oferecido na velocidade de preenchimento. */\r\n description: string;\r\n /** Texto formatado do badge visual (ex: '+15%', 'Na media', 'Abaixo'). */\r\n badgeText?: string | null;\r\n}\r\n\r\n/**\r\n * Conjunto completo de metricas analiticas de uma vaga selecionada para aprofundamento.\r\n * Utilizado na secao \"Analise por Vaga\".\r\n */\r\nexport interface DashboardDutyAnalysis {\r\n /** Identificador unico da vaga. */\r\n dutyId: number;\r\n /** Titulo da vaga ou especialidade. */\r\n title: string;\r\n /** Detalhes de localidade, data ou modalidade da vaga. */\r\n subtitle: string;\r\n /** Total de candidaturas confirmadas para a vaga. */\r\n candidatesCount: number;\r\n /** Quantidade total de visualizacoes da pagina de detalhes da vaga. */\r\n viewsCount: number;\r\n /** Taxa de conversao calculada: (candidaturas / visualizacoes) * 100. */\r\n conversionRate: number;\r\n /** Serie historica de pontos temporais de candidaturas para o grafico de linha do tempo. */\r\n timelinePoints: TimelinePoint[];\r\n /** Fatias do grafico Donut representando a proporcao de conversao de candidatos. */\r\n conversionDonut?: DonutChartItem[];\r\n /** Etapas do funil de atracao da vaga (Visualizacoes -> Candidaturas). */\r\n funnelItems?: FunnelBarItem[];\r\n /** Analise comparativa de remuneracao regional da vaga. */\r\n salaryComparison?: DashboardDutySalaryComparison;\r\n}\r\n\r\n/**\r\n * Contrato de dados principal que alimenta o componente `<careon-dashboard>`.\r\n * Agrupa todas as secoes de metricas, listas e graficos consolidados.\r\n */\r\nexport interface DashboardOverviewData {\r\n /** Identificador unico da instituicao no sistema. */\r\n institutionId?: number;\r\n /** Razao social ou nome de exibicao da instituicao. */\r\n institutionName?: string;\r\n /** Rotulo amigavel do periodo ativo (ex: 'Hoje', 'Semana', 'Mes'). */\r\n period?: string;\r\n /** Data inicial do intervalo temporal coberto pelas metricas. */\r\n startDate?: string | Date;\r\n /** Data final do intervalo temporal coberto pelas metricas. */\r\n endDate?: string | Date;\r\n /** Resumo numerico dos KPIs superiores. */\r\n kpis?: DashboardKpiSummary;\r\n /** Pontos para o grafico de linha do tempo geral de candidaturas. */\r\n timeline?: TimelinePoint[];\r\n /** Dados para o grafico de barras comparativas entre vagas. */\r\n comparison?: ComparisonItem[];\r\n /** Distribuicao percentual de candidaturas por categoria ou especialidade. */\r\n distribution?: DonutChartItem[];\r\n /** Distribuicao de status das vagas (abertas vs. encerradas) para barra empilhada. */\r\n dutiesStatus?: StackedBarItem[];\r\n /** Etapas consolidadas do funil geral de recrutamento da instituicao. */\r\n recruitmentFunnel?: FunnelBarItem[];\r\n /** Relacao de vagas prioritarias que requerem atencao imediata do recrutador. */\r\n attentionItems?: DashboardAttentionItem[];\r\n /** Diagnostico de performance geral da instituicao com curva de ondas. */\r\n performanceAnalysis?: DashboardPerformanceAnalysis;\r\n /** Relacao de vagas detalhadas com metricas individuais para o seletor. */\r\n vacanciesAnalysis?: DashboardDutyAnalysis[];\r\n}\r\n\r\n/**\r\n * Payload emitido quando um elemento interativo interno de um grafico e selecionado.\r\n */\r\nexport interface DashboardItemSelectedEvent<T = any> {\r\n /** Nome ou identificador da secao grafica de origem do evento. */\r\n chart: string;\r\n /** Registro de dados vinculado ao elemento selecionado. */\r\n item: T;\r\n}\r\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { PerformanceLevel } from '../../models/dashboard.models';\r\n\r\n/**\r\n * Componente grafico de onda vetorial (SVG inline) para representacao qualitativa de desempenho.\r\n * Renderiza tres perfis distintos de curva:\r\n * - Blue: Curva suave e ascendente, simbolizando alto engajamento.\r\n * - Orange: Curva intermediaria com pequenas oscilacoes.\r\n * - Red: Curva descendente acentuada, indicando necessidade de atencao.\r\n */\r\n@Component({\r\n selector: 'careon-performance-wave',\r\n templateUrl: './performance-wave.component.html',\r\n styleUrls: ['./performance-wave.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class PerformanceWaveComponent {\r\n readonly PerformanceLevel = PerformanceLevel;\r\n\r\n /**\r\n * Nivel de performance que determina o formato da onda e as cores do gradiente vetorial.\r\n * @default PerformanceLevel.Blue\r\n */\r\n @Input() level: PerformanceLevel = PerformanceLevel.Blue;\r\n}\r\n","<div class=\"performance-wave-container\" [ngSwitch]=\"level\">\r\n <!-- Gráfico Azul: taxa >= 4% -->\r\n <svg\r\n *ngSwitchCase=\"PerformanceLevel.Blue\"\r\n class=\"performance-wave-svg\"\r\n viewBox=\"0 0 452 98\"\r\n preserveAspectRatio=\"none\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M0.485352 79.9565C0.485352 78.4292 1.65796 77.1444 3.17418 76.9605C91.3906 66.2645 136.386 21.7967 225.485 31.8008C314.054 41.7454 380.833 7.65094 447.265 1.74872C449.003 1.59429 450.485 2.97287 450.485 4.71795V94.485C450.485 96.1419 449.142 97.485 447.485 97.485H3.48535C1.82849 97.485 0.485352 96.1419 0.485352 94.485V79.9565Z\"\r\n fill=\"#DBEAFD\"\r\n />\r\n <path\r\n d=\"M1.48535 76.4851C91.2853 66.4851 136.185 21.4851 225.985 31.4851C315.785 41.4851 383.135 6.48506 450.485 1.48506\"\r\n stroke=\"#245DEF\"\r\n stroke-width=\"2.97\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <!-- Gráfico Laranja: taxa < 4% -->\r\n <svg\r\n *ngSwitchCase=\"PerformanceLevel.Orange\"\r\n class=\"performance-wave-svg\"\r\n viewBox=\"0 0 451 98\"\r\n preserveAspectRatio=\"none\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M0 48.297C0 47.5374 0.433006 46.8417 1.11413 46.5054C68.2428 13.3645 135.371 -3.17555 202.5 2.37853C269.731 7.94106 350.354 41.2053 448.816 85.6166C449.533 85.9398 450 86.656 450 87.4422V95.3202C450 96.4248 449.105 97.3202 448 97.3202H1.99999C0.89542 97.3202 0 96.4248 0 95.3202V48.297Z\"\r\n fill=\"#E88618\"\r\n fill-opacity=\"0.22\"\r\n />\r\n <path\r\n d=\"M1.5 48.3202C69 17.1144 136 -2.89515 203.5 2.30581C271 7.50677 350 45.2125 449 86.8202\"\r\n stroke=\"#E88618\"\r\n stroke-width=\"2.97\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <!-- Gráfico Vermelho: 0 vagas no período -->\r\n <svg\r\n *ngSwitchDefault\r\n class=\"performance-wave-svg\"\r\n viewBox=\"0 0 450 97\"\r\n preserveAspectRatio=\"none\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M0 3.97707C0 2.14014 1.66636 0.739066 3.48178 1.01927C91.1757 14.5544 136.168 28.0029 225 34.771C313.933 41.5468 380.896 61.7137 447.599 75.4232C448.996 75.7104 450 76.939 450 78.3656V93.4853C450 95.1421 448.657 96.4853 447 96.4853H3C1.34314 96.4853 0 95.1421 0 93.4853V3.97707Z\"\r\n fill=\"#FFDEDE\"\r\n />\r\n <path\r\n d=\"M1.5 1.48529C72.9286 15.771 108.571 21.8424 180 28.9853C251.429 36.1281 394.429 60.6996 448 74.9853\"\r\n stroke=\"#E8412A\"\r\n stroke-width=\"2.97\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n</div>\r\n","import { Component, Input, ChangeDetectionStrategy, HostBinding } from '@angular/core';\r\n\r\n/**\r\n * Nomes de icones vetoriais SVG suportados pelo componente.\r\n */\r\nexport type DashboardIconName = 'arrow-up' | 'arrow-down' | 'info' | 'chevron-down';\r\n\r\n/**\r\n * Componente interno para renderizacao de icones vetoriais SVG leves do dashboard.\r\n */\r\n@Component({\r\n selector: 'careon-dashboard-icon',\r\n templateUrl: './dashboard-icon.component.html',\r\n styleUrls: ['./dashboard-icon.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DashboardIconComponent {\r\n /** Nome do icone a ser exibido. */\r\n @Input() name: DashboardIconName = 'info';\r\n\r\n /** Aplica rotacao de 180 graus (util para setas de expansao e indicadores de tendencia). */\r\n @HostBinding('class.rotated') @Input() rotated = false;\r\n\r\n /** Classes CSS adicionais a serem anexadas ao elemento SVG. */\r\n @Input() customClass = '';\r\n}\r\n","<ng-container [ngSwitch]=\"name\">\r\n <!-- Arrow Up Icon -->\r\n <svg\r\n *ngSwitchCase=\"'arrow-up'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 10 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M2.5 7.5L7.5 2.5M7.5 2.5H3.75M7.5 2.5V6.25\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.6\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <!-- Arrow Down Icon -->\r\n <svg\r\n *ngSwitchCase=\"'arrow-down'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 10 10\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M2.5 2.5L7.5 7.5M7.5 7.5H3.75M7.5 7.5V3.75\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.6\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n\r\n <!-- Info Icon -->\r\n <svg\r\n *ngSwitchCase=\"'info'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <circle cx=\"10\" cy=\"10\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.5\" />\r\n <path d=\"M10 8.5V14\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" />\r\n <circle cx=\"10\" cy=\"5.5\" r=\"1.1\" fill=\"currentColor\" />\r\n </svg>\r\n\r\n <!-- Chevron Down Icon -->\r\n <svg\r\n *ngSwitchCase=\"'chevron-down'\"\r\n [class]=\"customClass\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M5 7.5L10 12.5L15 7.5\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n</ng-container>\r\n","import { Component, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n/**\r\n * Componente visual de esqueleto de carregamento (Loading Skeleton).\r\n * Reproduz fielmente a distribuicao espacial dos cards, graficos e secoes do dashboard\r\n * com efeito animado de shimmer durante operacoes assincronas de carregamento.\r\n */\r\n@Component({\r\n selector: 'careon-dashboard-skeleton',\r\n templateUrl: './dashboard-skeleton.component.html',\r\n styleUrls: ['./dashboard-skeleton.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DashboardSkeletonComponent {}\r\n","<div class=\"dashboard-skeleton-container\" aria-busy=\"true\" aria-label=\"Carregando dados do dashboard\">\r\n <!-- #region Section1: KPIs -->\r\n <section class=\"skeleton-section skeleton-section--kpis\">\r\n <div class=\"kpi-grid\">\r\n <!-- 4 Standard KPI Cards -->\r\n <article class=\"skeleton-card skeleton-kpi-card\" *ngFor=\"let kpi of [1, 2, 3, 4]\">\r\n <div class=\"skeleton-line skeleton-w-40 skeleton-h-12\"></div>\r\n <div class=\"skeleton-kpi-body\">\r\n <div class=\"skeleton-line skeleton-w-50 skeleton-h-20\"></div>\r\n <div class=\"skeleton-pill skeleton-badge\"></div>\r\n </div>\r\n <div class=\"skeleton-line skeleton-w-30 skeleton-h-10\"></div>\r\n </article>\r\n\r\n <!-- 1 Status KPI Card -->\r\n <article class=\"skeleton-card skeleton-kpi-card skeleton-kpi-card--status\">\r\n <div class=\"skeleton-line skeleton-w-50 skeleton-h-12\"></div>\r\n <div class=\"skeleton-status-bar\">\r\n <div class=\"skeleton-bar-segment skeleton-bar-segment--main\"></div>\r\n <div class=\"skeleton-bar-segment skeleton-bar-segment--secondary\"></div>\r\n </div>\r\n <div class=\"skeleton-status-legend\">\r\n <div class=\"skeleton-legend-item\">\r\n <span class=\"skeleton-dot\"></span>\r\n <div class=\"skeleton-line skeleton-w-40 skeleton-h-10\"></div>\r\n </div>\r\n <div class=\"skeleton-legend-item\">\r\n <span class=\"skeleton-dot\"></span>\r\n <div class=\"skeleton-line skeleton-w-45 skeleton-h-10\"></div>\r\n </div>\r\n </div>\r\n </article>\r\n </div>\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Section2: Attention & Performance -->\r\n <section class=\"skeleton-section skeleton-section--attention\">\r\n <div class=\"attention-perf-grid\">\r\n <!-- Attention Card -->\r\n <article class=\"skeleton-card skeleton-card--attention\">\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-18 skeleton-mb-24\"></div>\r\n <div class=\"skeleton-attention-list\">\r\n <div class=\"skeleton-attention-row\" *ngFor=\"let row of [1, 2, 3]; let last = last\">\r\n <div class=\"skeleton-line skeleton-w-50 skeleton-h-14 skeleton-mb-8\"></div>\r\n <div class=\"skeleton-line skeleton-w-85 skeleton-h-12\"></div>\r\n <div class=\"skeleton-divider\" *ngIf=\"!last\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton-button-pill skeleton-mt-auto\"></div>\r\n </article>\r\n\r\n <!-- Performance Card -->\r\n <article class=\"skeleton-card skeleton-card--performance\">\r\n <div class=\"skeleton-perf-header skeleton-mb-16\">\r\n <div class=\"skeleton-line skeleton-w-55 skeleton-h-18\"></div>\r\n <span class=\"skeleton-info-icon\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"#C9CDD0\" stroke-width=\"2\"/>\r\n <circle cx=\"12\" cy=\"8\" r=\"1.25\" fill=\"#C9CDD0\"/>\r\n <line x1=\"12\" y1=\"11\" x2=\"12\" y2=\"16\" stroke=\"#C9CDD0\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </span>\r\n </div>\r\n\r\n <div class=\"skeleton-perf-wave-box\">\r\n <svg class=\"skeleton-wave-svg\" viewBox=\"0 0 450 100\" preserveAspectRatio=\"none\">\r\n <path\r\n d=\"M 0,80 Q 90,70 180,45 T 450,20 L 450,100 L 0,100 Z\"\r\n fill=\"#DEE2E6\"\r\n />\r\n <path\r\n d=\"M 0,80 Q 90,70 180,45 T 450,20\"\r\n fill=\"none\"\r\n stroke=\"#C2C7CC\"\r\n stroke-width=\"2.8\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"skeleton-line skeleton-w-75 skeleton-h-14 skeleton-mb-8\"></div>\r\n <div class=\"skeleton-line skeleton-w-90 skeleton-h-14 skeleton-mb-24\"></div>\r\n <div class=\"skeleton-button-pill skeleton-mt-auto\"></div>\r\n </article>\r\n </div>\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Section3: Vacancy Deep Dive -->\r\n <section class=\"skeleton-section skeleton-section--deepdive\">\r\n <article class=\"skeleton-card skeleton-card--deepdive\">\r\n <!-- Header with Dropdown Selector -->\r\n <div class=\"skeleton-deepdive-header skeleton-mb-24\">\r\n <div class=\"skeleton-header-titles\">\r\n <div class=\"skeleton-line skeleton-w-40 skeleton-h-18 skeleton-mb-8\"></div>\r\n <div class=\"skeleton-line skeleton-w-25 skeleton-h-12\"></div>\r\n </div>\r\n <div class=\"skeleton-dropdown-pill\">\r\n <div class=\"skeleton-line skeleton-w-50 skeleton-h-12\"></div>\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\r\n <path d=\"M6 9L12 15L18 9\" stroke=\"#87898A\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-- Timeline Chart Box -->\r\n <div class=\"skeleton-timeline-container skeleton-mb-32\">\r\n <svg class=\"skeleton-timeline-overlay-svg\" viewBox=\"0 0 700 170\" preserveAspectRatio=\"none\">\r\n <line x1=\"0\" y1=\"140\" x2=\"700\" y2=\"140\" stroke=\"#F7F7F7\" stroke-width=\"1\"/>\r\n <polyline\r\n points=\"50,110 150,60 250,90 350,50 450,135 550,60 650,25\"\r\n fill=\"none\"\r\n stroke=\"#C2C7CC\"\r\n stroke-width=\"1.6\"\r\n stroke-dasharray=\"2 3\"\r\n />\r\n <circle cx=\"50\" cy=\"110\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"150\" cy=\"60\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"250\" cy=\"90\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"350\" cy=\"50\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"450\" cy=\"135\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"550\" cy=\"60\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"650\" cy=\"25\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n </svg>\r\n\r\n <div class=\"skeleton-timeline-columns\">\r\n <div class=\"skeleton-timeline-col\">\r\n <div class=\"skeleton-bar-hatched\" style=\"height: 32px;\"></div>\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-12 skeleton-mt-8\"></div>\r\n </div>\r\n <div class=\"skeleton-timeline-col\">\r\n <div class=\"skeleton-bar-hatched\" style=\"height: 82px;\"></div>\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-12 skeleton-mt-8\"></div>\r\n </div>\r\n <div class=\"skeleton-timeline-col\">\r\n <div class=\"skeleton-bar-hatched\" style=\"height: 52px;\"></div>\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-12 skeleton-mt-8\"></div>\r\n </div>\r\n <div class=\"skeleton-timeline-col\">\r\n <div class=\"skeleton-bar-hatched\" style=\"height: 92px;\"></div>\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-12 skeleton-mt-8\"></div>\r\n </div>\r\n <div class=\"skeleton-timeline-col\">\r\n <div class=\"skeleton-bar-hatched\" style=\"height: 8px;\"></div>\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-12 skeleton-mt-8\"></div>\r\n </div>\r\n <div class=\"skeleton-timeline-col\">\r\n <div class=\"skeleton-bar-hatched\" style=\"height: 82px;\"></div>\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-12 skeleton-mt-8\"></div>\r\n </div>\r\n <div class=\"skeleton-timeline-col skeleton-timeline-col--active\">\r\n <div class=\"skeleton-tag-pill\"></div>\r\n <div class=\"skeleton-bar-solid\" style=\"height: 118px;\"></div>\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-12 skeleton-mt-8\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Middle Subgrid: Donut and Funnel -->\r\n <div class=\"skeleton-deepdive-middle-grid skeleton-mb-32\">\r\n <!-- Donut Sub-card -->\r\n <div class=\"skeleton-subcard skeleton-donut-subcard\">\r\n <div class=\"skeleton-line skeleton-w-50 skeleton-h-13 skeleton-mb-16\"></div>\r\n <div class=\"skeleton-donut-layout\">\r\n <div class=\"skeleton-donut-ring\">\r\n <svg width=\"100\" height=\"100\" viewBox=\"0 0 100 100\">\r\n <circle cx=\"50\" cy=\"50\" r=\"36\" fill=\"none\" stroke=\"#DEE2E6\" stroke-width=\"16\"/>\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"36\"\r\n fill=\"none\"\r\n stroke=\"#C2C7CC\"\r\n stroke-width=\"16\"\r\n stroke-dasharray=\"60 170\"\r\n stroke-dashoffset=\"15\"\r\n />\r\n </svg>\r\n </div>\r\n <div class=\"skeleton-donut-legends\">\r\n <div class=\"skeleton-legend-item skeleton-mb-12\">\r\n <span class=\"skeleton-dot\"></span>\r\n <div class=\"skeleton-line skeleton-w-70 skeleton-h-11\"></div>\r\n </div>\r\n <div class=\"skeleton-legend-item\">\r\n <span class=\"skeleton-dot\"></span>\r\n <div class=\"skeleton-line skeleton-w-55 skeleton-h-11\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Funnel Sub-card -->\r\n <div class=\"skeleton-subcard skeleton-funnel-subcard\">\r\n <div class=\"skeleton-line skeleton-w-40 skeleton-h-12 skeleton-mb-16\"></div>\r\n <div class=\"skeleton-funnel-bars\">\r\n <div class=\"skeleton-funnel-bar skeleton-w-100 skeleton-mb-12\"></div>\r\n <div class=\"skeleton-funnel-bar skeleton-w-65\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Bottom Row: Salary Comparison -->\r\n <div class=\"skeleton-salary-grid\">\r\n <!-- Salary Metrics Box -->\r\n <div class=\"skeleton-subcard skeleton-salary-metrics-subcard\">\r\n <div class=\"skeleton-salary-columns skeleton-mb-16\">\r\n <div class=\"skeleton-salary-metric-col\">\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-12 skeleton-mb-8\"></div>\r\n <div class=\"skeleton-line skeleton-w-80 skeleton-h-24\"></div>\r\n </div>\r\n <div class=\"skeleton-salary-divider\"></div>\r\n <div class=\"skeleton-salary-metric-col\">\r\n <div class=\"skeleton-line skeleton-w-60 skeleton-h-12 skeleton-mb-8\"></div>\r\n <div class=\"skeleton-line skeleton-w-80 skeleton-h-24\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton-line skeleton-w-75 skeleton-h-12 skeleton-mb-6\"></div>\r\n <div class=\"skeleton-line skeleton-w-90 skeleton-h-12\"></div>\r\n </div>\r\n\r\n <!-- Salary Action Box -->\r\n <div class=\"skeleton-subcard skeleton-salary-action-subcard\">\r\n <div class=\"skeleton-line skeleton-w-70 skeleton-h-16 skeleton-mb-8\"></div>\r\n <div class=\"skeleton-line skeleton-w-85 skeleton-h-12 skeleton-mb-24\"></div>\r\n <div class=\"skeleton-button-pill skeleton-button-pill--medium skeleton-mt-auto\"></div>\r\n </div>\r\n </div>\r\n </article>\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region Section4: Applications per Vacancy -->\r\n <section class=\"skeleton-section skeleton-section--applications\">\r\n <article class=\"skeleton-card skeleton-card--applications\">\r\n <div class=\"skeleton-header-titles skeleton-mb-24\">\r\n <div class=\"skeleton-line skeleton-w-35 skeleton-h-20 skeleton-mb-8\"></div>\r\n <div class=\"skeleton-line skeleton-w-20 skeleton-h-20\"></div>\r\n </div>\r\n\r\n <div class=\"skeleton-comparison-chart-container\">\r\n <svg class=\"skeleton-comparison-overlay-svg\" viewBox=\"0 0 1040 180\" preserveAspectRatio=\"none\">\r\n <line x1=\"0\" y1=\"150\" x2=\"1040\" y2=\"150\" stroke=\"#F7F7F7\" stroke-width=\"1\"/>\r\n <polyline\r\n points=\"40,85 140,55 240,135 340,105 440,80 540,148 640,40 740,115 840,90 940,125\"\r\n fill=\"none\"\r\n stroke=\"#C2C7CC\"\r\n stroke-width=\"1.6\"\r\n stroke-dasharray=\"2 3\"\r\n />\r\n <circle cx=\"40\" cy=\"85\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"140\" cy=\"55\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"240\" cy=\"135\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"340\" cy=\"105\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"440\" cy=\"80\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"540\" cy=\"148\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"640\" cy=\"40\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"740\" cy=\"115\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"840\" cy=\"90\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n <circle cx=\"940\" cy=\"125\" r=\"3.2\" fill=\"#FFFFFF\" stroke=\"#C2C7CC\" stroke-width=\"1.6\"/>\r\n </svg>\r\n\r\n <div class=\"skeleton-comparison-bars\">\r\n <div\r\n class=\"skeleton-comparison-col\"\r\n *ngFor=\"let h of ['100px', '130px', '28px', '60px', '85px', '4px', '115px', '48px', '72px', '36px']\"\r\n >\r\n <div class=\"skeleton-comparison-bar\" [style.height]=\"h\"></div>\r\n <div class=\"skeleton-line skeleton-w-70 skeleton-h-12 skeleton-mt-8\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </article>\r\n </section>\r\n <!-- #endregion -->\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges\r\n} from '@angular/core';\r\nimport {\r\n StackedBarItem,\r\n TimelinePoint,\r\n DonutChartItem,\r\n FunnelBarItem,\r\n ComparisonItem\r\n} from '@careonbrasil/ng-charts';\r\nimport {\r\n DashboardOverviewData,\r\n DashboardPeriod,\r\n DashboardItemSelectedEvent,\r\n DashboardAttentionItem,\r\n DashboardPerformanceAnalysis,\r\n PerformanceLevel,\r\n DashboardDutyAnalysis,\r\n DashboardDutySalaryComparison,\r\n DutySalaryStatus\r\n} from './models/dashboard.models';\r\n\r\nexport type KpiPolarity = 'higherIsBetter' | 'lowerIsBetter' | 'neutral';\r\n\r\nexport interface KpiBadgeInfo {\r\n changeText: string;\r\n badgeClass: string;\r\n isPositive: boolean;\r\n isNegative: boolean;\r\n isZero: boolean;\r\n}\r\n\r\nexport function formatKpiBadge(diff: number, polarity: KpiPolarity, isDecimal = false): KpiBadgeInfo {\r\n const isZero = diff === 0;\r\n const isPositive = diff > 0;\r\n const isNegative = diff < 0;\r\n\r\n const changeText = isZero\r\n ? (isDecimal ? '0,0' : '0')\r\n : (isDecimal ? Math.abs(diff).toFixed(1).replace('.', ',') : `${Math.abs(diff)}`);\r\n\r\n let badgeClass = 'kpi-badge--gray';\r\n if (!isZero) {\r\n if (polarity === 'neutral') {\r\n badgeClass = 'kpi-badge--blue';\r\n } else if (polarity === 'higherIsBetter') {\r\n badgeClass = isPositive ? 'kpi-badge--green' : 'kpi-badge--coral';\r\n } else if (polarity === 'lowerIsBetter') {\r\n badgeClass = isPositive ? 'kpi-badge--coral' : 'kpi-badge--green';\r\n }\r\n }\r\n\r\n return { changeText, badgeClass, isPositive, isNegative, isZero };\r\n}\r\n\r\nexport const DEFAULT_PERFORMANCE_TEXTS: Record<PerformanceLevel, { title: string; description: string }> = {\r\n [PerformanceLevel.Blue]: {\r\n title: 'Ainda tem espaço para se destacar.',\r\n description: 'Sua instituição já desperta bom interesse entre os candidatos. Fale com um consultor da CareOn para ir ainda mais longe.'\r\n },\r\n [PerformanceLevel.Orange]: {\r\n title: 'Suas vagas estão sendo vistas, mas pouca gente se candidata.',\r\n description: 'Isso pode indicar que os valores oferecidos estão abaixo da média da região, que faltam informações mais atrativas ou que suas informações estão incompletas. Fale com um consultor da CareOn.'\r\n },\r\n [PerformanceLevel.Red]: {\r\n title: 'Sua instituição não está sendo muito procurada pelos candidatos.',\r\n description: 'Faz tempo que você não publica uma vaga, por isso sua análise de desempenho vem caindo. Fale com um consultor da CareOn para ter um apoio personalizado.'\r\n }\r\n};\r\n\r\n/**\r\n * Componente principal de Dashboard de Recrutamento Institucional da CareOn.\r\n * \r\n * Centraliza e orquestra a exibicao de:\r\n * - Cabecalho com filtros temporais reativos (Hoje, Semana, Mes)\r\n * - Cards superiores de Indicadores-Chave de Performance (KPIs)\r\n * - Secao acionavel \"Precisa da sua atencao\" (alertas de vagas criticas)\r\n * - Secao \"Analise de Desempenho\" (curva de ondas vetorial e orientacao consultiva)\r\n * - Secao \"Analise por Vaga\" (dropdown de vagas, timeline, donut de conversao, funil e analise salarial)\r\n * - Secao \"Candidaturas por Vaga\" (grafico comparativo de barras entre vagas)\r\n */\r\n@Component({\r\n selector: 'careon-dashboard',\r\n templateUrl: './dashboard.component.html',\r\n styleUrls: ['./dashboard.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DashboardComponent implements OnChanges {\r\n // #region Inputs\r\n /**\r\n * Consolidated metrics dataset feeding the dashboard.\r\n */\r\n @Input() data?: DashboardOverviewData;\r\n\r\n /**\r\n * Whether the dashboard is currently fetching data from the backend API.\r\n * @default false\r\n */\r\n @Input() loading = false;\r\n\r\n /**\r\n * Active time period filter.\r\n * @default 'Week'\r\n */\r\n @Input() currentPeriod: DashboardPeriod = DashboardPeriod.Week;\r\n\r\n readonly DutySalaryStatus = DutySalaryStatus;\r\n readonly PerformanceLevel = PerformanceLevel;\r\n readonly DashboardPeriod = DashboardPeriod;\r\n\r\n /**\r\n * Main dashboard title.\r\n * @default 'Dashboard'\r\n */\r\n @Input() title = 'Dashboard';\r\n\r\n /**\r\n * Optional subtitle or institution name displayed in the header.\r\n * @default 'Visão geral de recrutamento'\r\n */\r\n @Input() subtitle = 'Visão geral de recrutamento';\r\n\r\n /**\r\n * Empty state message when no data is returned.\r\n */\r\n @Input() emptyMessage = 'Nenhum dado registrado para o período selecionado.';\r\n\r\n /**\r\n * Consultant phone number for WhatsApp redirect.\r\n * @default '5547996569707'\r\n */\r\n @Input() consultantPhone = '5547996569707';\r\n\r\n /**\r\n * Initial message for WhatsApp consultant chat.\r\n * @default 'empty string'\r\n */\r\n @Input() consultantMessage = '';\r\n\r\n /**\r\n * Controls whether zeroed states display the actionable 'Publicar Vaga' CTA banner or a basic informational zero state.\r\n * - 'publish': displays the special business zero state with the 'Publicar Vaga' action button.\r\n * - 'basic': displays the simple/basic zero state without the 'Publicar Vaga' action button.\r\n * @default 'publish'\r\n */\r\n @Input() zeroStateMode: 'publish' | 'basic' = 'publish';\r\n\r\n get isPublishZeroState(): boolean {\r\n return this.zeroStateMode === 'publish';\r\n }\r\n // #endregion\r\n\r\n // #region Outputs\r\n /**\r\n * Emitted whenever the user selects a different period filter (Today, Week, Month).\r\n */\r\n @Output() periodChange = new EventEmitter<DashboardPeriod>();\r\n\r\n /**\r\n * Emitted whenever an interactive element in any chart is clicked (reserved for upcoming chart sections).\r\n */\r\n @Output() itemSelected = new EventEmitter<DashboardItemSelectedEvent>();\r\n\r\n /**\r\n * Emitted whenever the user clicks on 'Publicar Vaga' across any of the zero-state banners.\r\n */\r\n @Output() publishDuty = new EventEmitter<string | void>();\r\n\r\n /**\r\n * Emitted whenever the user selects a duty in the vacancy analysis dropdown.\r\n */\r\n @Output() dutySelected = new EventEmitter<DashboardDutyAnalysis>();\r\n\r\n /**\r\n * Emitted whenever the user clicks on 'Fale com um consultor' across any section.\r\n */\r\n @Output() consultantClick = new EventEmitter<string>();\r\n\r\n /**\r\n * Emitted whenever a vacancy in the attention list is clicked.\r\n */\r\n @Output() attentionItemSelected = new EventEmitter<DashboardAttentionItem>();\r\n // #endregion\r\n\r\n onPublishDuty(section = 'Zero State'): void {\r\n this.publishDuty.emit(section);\r\n }\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['data']) {\r\n this.syncSelectedDuty();\r\n this.cdr.markForCheck();\r\n }\r\n if (changes['loading'] || changes['currentPeriod']) {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n private syncSelectedDuty(): void {\r\n if (!this.vacanciesAnalysis || this.vacanciesAnalysis.length === 0) {\r\n this.selectedDutyId = null;\r\n return;\r\n }\r\n const exists = this.vacanciesAnalysis.some(d => d.dutyId === this.selectedDutyId);\r\n if (!exists) {\r\n this.selectedDutyId = this.vacanciesAnalysis[0].dutyId;\r\n }\r\n }\r\n\r\n // #region AttentionSection\r\n get attentionItems(): DashboardAttentionItem[] {\r\n return this.data?.attentionItems ?? [];\r\n }\r\n\r\n onAttentionItemClick(item: DashboardAttentionItem): void {\r\n this.attentionItemSelected.emit(item);\r\n }\r\n\r\n openConsultantWhatsApp(section = 'Consultor'): void {\r\n this.consultantClick.emit(section);\r\n if (typeof window !== 'undefined') {\r\n const cleanPhone = (this.consultantPhone || '5547996569707').replace(/\\D/g, '');\r\n const textParam = this.consultantMessage\r\n ? `&text=${encodeURIComponent(this.consultantMessage)}`\r\n : '';\r\n const whatsappUrl = `https://api.whatsapp.com/send?phone=${cleanPhone}${textParam}`;\r\n window.open(whatsappUrl, '_blank', 'noopener,noreferrer');\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region PerformanceAnalysisSection\r\n showInfoTooltip = false;\r\n\r\n toggleInfoTooltip(): void {\r\n this.showInfoTooltip = !this.showInfoTooltip;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onInfoMouseEnter(): void {\r\n this.showInfoTooltip = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onInfoMouseLeave(): void {\r\n this.showInfoTooltip = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get performanceAnalysis(): DashboardPerformanceAnalysis | undefined {\r\n return this.data?.performanceAnalysis;\r\n }\r\n\r\n get performanceLevel(): PerformanceLevel {\r\n const level = this.performanceAnalysis?.level;\r\n if (level === PerformanceLevel.Blue || (level as any) === 0) return PerformanceLevel.Blue;\r\n if (level === PerformanceLevel.Orange || (level as any) === 1) return PerformanceLevel.Orange;\r\n if (level === PerformanceLevel.Red || (level as any) === 2) return PerformanceLevel.Red;\r\n return PerformanceLevel.Red;\r\n }\r\n\r\n get performanceTitle(): string {\r\n return this.performanceAnalysis?.highlightTitle\r\n || DEFAULT_PERFORMANCE_TEXTS[this.performanceLevel]?.title\r\n || DEFAULT_PERFORMANCE_TEXTS[PerformanceLevel.Red].title;\r\n }\r\n\r\n get performanceDescription(): string {\r\n return this.performanceAnalysis?.description\r\n || DEFAULT_PERFORMANCE_TEXTS[this.performanceLevel]?.description\r\n || DEFAULT_PERFORMANCE_TEXTS[PerformanceLevel.Red].description;\r\n }\r\n // #endregion\r\n\r\n // #region VacancyAnalysisSection\r\n selectedDutyId: number | null = null;\r\n isDutyDropdownOpen = false;\r\n\r\n get vacanciesAnalysis(): DashboardDutyAnalysis[] {\r\n return this.data?.vacanciesAnalysis ?? [];\r\n }\r\n\r\n get selectedDuty(): DashboardDutyAnalysis | null {\r\n if (this.vacanciesAnalysis.length === 0) return null;\r\n if (this.selectedDutyId) {\r\n const found = this.vacanciesAnalysis.find(d => d.dutyId === this.selectedDutyId);\r\n if (found) return found;\r\n }\r\n return this.vacanciesAnalysis[0];\r\n }\r\n\r\n toggleDutyDropdown(): void {\r\n this.isDutyDropdownOpen = !this.isDutyDropdownOpen;\r\n }\r\n\r\n closeDutyDropdown(): void {\r\n this.isDutyDropdownOpen = false;\r\n }\r\n\r\n selectDuty(duty: DashboardDutyAnalysis): void {\r\n this.selectedDutyId = duty.dutyId;\r\n this.isDutyDropdownOpen = false;\r\n this.dutySelected.emit(duty);\r\n }\r\n\r\n get vacancySectionSubtitle(): string {\r\n const candidates = this.selectedDuty?.candidatesCount ?? 0;\r\n const candText = candidates === 1 ? 'candidatura' : 'candidaturas';\r\n switch (this.currentPeriod) {\r\n case DashboardPeriod.Week:\r\n return `${candidates} ${candText} nos últimos 7 dias`;\r\n case DashboardPeriod.Month:\r\n return `${candidates} ${candText} neste mês`;\r\n case DashboardPeriod.Today:\r\n default:\r\n return `${candidates} ${candText} hoje`;\r\n }\r\n }\r\n\r\n get selectedDutyTimelinePoints(): TimelinePoint[] {\r\n return this.selectedDuty?.timelinePoints ?? [];\r\n }\r\n\r\n get selectedDutyDonutItems(): DonutChartItem[] {\r\n if (this.selectedDuty?.conversionDonut && this.selectedDuty.conversionDonut.length > 0) {\r\n return this.selectedDuty.conversionDonut;\r\n }\r\n const views = this.selectedDuty?.viewsCount ?? 0;\r\n const candidates = this.selectedDuty?.candidatesCount ?? 0;\r\n return [\r\n { label: 'Visualizações', value: views, color: '#1E1B4B' },\r\n { label: 'Candidaturas', value: candidates, color: '#3B82F6' }\r\n ];\r\n }\r\n\r\n get selectedDutyConversionRateText(): string {\r\n const rate = this.selectedDuty?.conversionRate ?? 0;\r\n return `${rate}%`;\r\n }\r\n\r\n get selectedDutyFunnelItems(): FunnelBarItem[] {\r\n if (this.selectedDuty?.funnelItems && this.selectedDuty.funnelItems.length > 0) {\r\n return this.selectedDuty.funnelItems;\r\n }\r\n const views = this.selectedDuty?.viewsCount ?? 0;\r\n const candidates = this.selectedDuty?.candidatesCount ?? 0;\r\n return [\r\n { label: 'Visualizações', count: views, barColor: '#1E1B4B' },\r\n { label: 'Candidaturas', count: candidates, barColor: '#3B82F6' }\r\n ];\r\n }\r\n\r\n onTimelinePointSelected(point: TimelinePoint): void {\r\n this.itemSelected.emit({\r\n chart: 'Linha Temporal por Vaga',\r\n item: point\r\n });\r\n }\r\n // #endregion\r\n\r\n // #region VacancySalaryComparisonSection\r\n get selectedDutySalaryComparison(): DashboardDutySalaryComparison | undefined {\r\n return this.selectedDuty?.salaryComparison;\r\n }\r\n\r\n get salaryStatus(): DutySalaryStatus | null {\r\n const s = this.selectedDutySalaryComparison?.status;\r\n if (s === DutySalaryStatus.BelowMarket || (s as any) === 0) return DutySalaryStatus.BelowMarket;\r\n if (s === DutySalaryStatus.AtMarket || (s as any) === 1) return DutySalaryStatus.AtMarket;\r\n if (s === DutySalaryStatus.AboveMarket || (s as any) === 2) return DutySalaryStatus.AboveMarket;\r\n if (s === DutySalaryStatus.NotInformed || (s as any) === 3) return DutySalaryStatus.NotInformed;\r\n if (s === DutySalaryStatus.InsufficientData || (s as any) === 4) return DutySalaryStatus.InsufficientData;\r\n return null;\r\n }\r\n\r\n formatCurrency(value?: number | null): string {\r\n if (value === null || value === undefined) {\r\n return '';\r\n }\r\n return new Intl.NumberFormat('pt-BR', {\r\n style: 'currency',\r\n currency: 'BRL',\r\n maximumFractionDigits: 0\r\n }).format(value).replace(/\\u00A0/g, ' ');\r\n }\r\n\r\n get formattedYourSalary(): string {\r\n const comparison = this.selectedDutySalaryComparison;\r\n if (!comparison || this.salaryStatus === DutySalaryStatus.NotInformed || comparison.yourSalary === null || comparison.yourSalary === undefined) {\r\n return 'Não informado';\r\n }\r\n return this.formatCurrency(comparison.yourSalary);\r\n }\r\n\r\n get formattedRegionalAverage(): string {\r\n const comparison = this.selectedDutySalaryComparison;\r\n if (!comparison || this.salaryStatus === DutySalaryStatus.InsufficientData || comparison.regionalAverageSalary === null || comparison.regionalAverageSalary === undefined) {\r\n return 'Dados insuficientes';\r\n }\r\n return this.formatCurrency(comparison.regionalAverageSalary);\r\n }\r\n\r\n get salaryBadgeClass(): string {\r\n switch (this.salaryStatus) {\r\n case DutySalaryStatus.BelowMarket:\r\n return 'salary-badge--orange';\r\n case DutySalaryStatus.AtMarket:\r\n return 'salary-badge--blue';\r\n case DutySalaryStatus.AboveMarket:\r\n return 'salary-badge--purple';\r\n default:\r\n return '';\r\n }\r\n }\r\n\r\n get salaryTitleColorClass(): string {\r\n switch (this.salaryStatus) {\r\n case DutySalaryStatus.BelowMarket:\r\n return 'salary-title--orange';\r\n case DutySalaryStatus.AtMarket:\r\n return 'salary-title--blue';\r\n case DutySalaryStatus.AboveMarket:\r\n return 'salary-title--purple';\r\n case DutySalaryStatus.NotInformed:\r\n return 'salary-title--red';\r\n case DutySalaryStatus.InsufficientData:\r\n default:\r\n return 'salary-title--default';\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region KpiGetters\r\n // 1. Vagas Publicadas\r\n get registeredVacancies(): number {\r\n return this.data?.kpis?.registeredVacancies ?? 0;\r\n }\r\n\r\n get registeredVacanciesDiff(): number {\r\n return this.data?.kpis?.registeredVacanciesDifference ?? 0;\r\n }\r\n\r\n get registeredVacanciesBadge(): KpiBadgeInfo {\r\n return formatKpiBadge(this.registeredVacanciesDiff, 'neutral');\r\n }\r\n\r\n get registeredVacanciesChange(): string {\r\n return this.registeredVacanciesBadge.changeText;\r\n }\r\n\r\n get registeredVacanciesBadgeClass(): string {\r\n return this.registeredVacanciesBadge.badgeClass;\r\n }\r\n\r\n // 2. Candidatos Inscritos\r\n get candidateApplications(): number {\r\n return this.data?.kpis?.candidateApplications ?? 0;\r\n }\r\n\r\n get candidateApplicationsDiff(): number {\r\n return this.data?.kpis?.candidateApplicationsDifference ?? 0;\r\n }\r\n\r\n get candidateApplicationsBadge(): KpiBadgeInfo {\r\n return formatKpiBadge(this.candidateApplicationsDiff, 'higherIsBetter');\r\n }\r\n\r\n get candidateApplicationsChange(): string {\r\n return this.candidateApplicationsBadge.changeText;\r\n }\r\n\r\n get candidateApplicationsBadgeClass(): string {\r\n return this.candidateApplicationsBadge.badgeClass;\r\n }\r\n\r\n // 3. Currículos para Avaliar\r\n get pendingReviews(): number {\r\n return this.data?.kpis?.pendingReviews ?? 0;\r\n }\r\n\r\n get pendingReviewsDiff(): number {\r\n return this.data?.kpis?.pendingReviewsDifference ?? 0;\r\n }\r\n\r\n get pendingReviewsBadge(): KpiBadgeInfo {\r\n return formatKpiBadge(this.pendingReviewsDiff, 'lowerIsBetter');\r\n }\r\n\r\n get pendingReviewsChange(): string {\r\n return this.pendingReviewsBadge.changeText;\r\n }\r\n\r\n get pendingReviewsBadgeClass(): string {\r\n return this.pendingReviewsBadge.badgeClass;\r\n }\r\n\r\n // 4. Média de Candidatos\r\n get averageCandidatesPerVacancy(): string {\r\n const avg = this.data?.kpis?.averageCandidatesPerVacancy;\r\n if (avg === undefined || avg === null) return '0,0';\r\n return avg.toFixed(1).replace('.', ',');\r\n }\r\n\r\n get averageCandidatesDiff(): number {\r\n return this.data?.kpis?.averageCandidatesDifference ?? 0;\r\n }\r\n\r\n get averageCandidatesBadge(): KpiBadgeInfo {\r\n return formatKpiBadge(this.averageCandidatesDiff, 'higherIsBetter', true);\r\n }\r\n\r\n get averageCandidatesChange(): string {\r\n return this.averageCandidatesBadge.changeText;\r\n }\r\n\r\n get averageCandidatesBadgeClass(): string {\r\n return this.averageCandidatesBadge.badgeClass;\r\n }\r\n\r\n // 5. Status das Vagas\r\n get openVacancies(): number {\r\n return this.data?.kpis?.openVacancies ?? 0;\r\n }\r\n\r\n get closedVacancies(): number {\r\n return this.data?.kpis?.closedVacancies ?? 0;\r\n }\r\n\r\n get totalDutiesCount(): number {\r\n return this.data?.kpis?.totalVacancies ?? (this.openVacancies + this.closedVacancies);\r\n }\r\n\r\n get dutiesStatusItems(): StackedBarItem[] {\r\n if (this.data?.dutiesStatus && this.data.dutiesStatus.length > 0) {\r\n return this.data.dutiesStatus;\r\n }\r\n return [\r\n { label: 'Abertas', value: this.openVacancies, color: '#3B82F6' },\r\n { label: 'Encerradas', value: this.closedVacancies, color: '#1E1B4B' }\r\n ];\r\n }\r\n // #endregion\r\n\r\n // #region ComparisonSection\r\n get comparisonItems(): ComparisonItem[] {\r\n return this.data?.comparison ?? [];\r\n }\r\n\r\n get hasComparisonDuties(): boolean {\r\n return this.comparisonItems.length > 0;\r\n }\r\n\r\n get totalComparisonCandidates(): number {\r\n return this.comparisonItems.reduce((acc, curr) => acc + (curr.value || 0), 0);\r\n }\r\n\r\n get totalComparisonVacancies(): number {\r\n return this.comparisonItems.length;\r\n }\r\n\r\n get comparisonSubtitle(): string {\r\n const candCount = this.totalComparisonCandidates;\r\n const dutyCount = this.totalComparisonVacancies;\r\n const candText = candCount === 1 ? '1 candidatura no total' : `${candCount} candidaturas no total`;\r\n const dutyText = dutyCount === 1 ? '1 vaga ativa' : `${dutyCount} vagas ativas`;\r\n return `${candText}, em ${dutyText}`;\r\n }\r\n // #endregion\r\n\r\n // #region StateHelpers\r\n get hasData(): boolean {\r\n return !!this.data && !!this.data.kpis;\r\n }\r\n // #endregion\r\n\r\n // #region UserActions\r\n setPeriod(period: DashboardPeriod): void {\r\n if (this.currentPeriod === period) return;\r\n this.currentPeriod = period;\r\n this.periodChange.emit(period);\r\n }\r\n\r\n onChartItemSelected(item: any, chartName: string): void {\r\n this.itemSelected.emit({\r\n chart: chartName,\r\n item\r\n });\r\n }\r\n // #endregion\r\n}\r\n","<div class=\"careon-dashboard-container\">\r\n <!-- #region DashboardHeader -->\r\n <header class=\"dashboard-header\">\r\n <div class=\"header-titles\">\r\n <h1 class=\"main-title\">{{ title }}</h1>\r\n <p *ngIf=\"subtitle\" class=\"subtitle\">\r\n {{ subtitle }}\r\n </p>\r\n </div>\r\n\r\n <div class=\"period-filter-group\">\r\n <button\r\n type=\"button\"\r\n class=\"period-pill\"\r\n [class.active]=\"currentPeriod === DashboardPeriod.Today\"\r\n (click)=\"setPeriod(DashboardPeriod.Today)\"\r\n >\r\n Hoje\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"period-pill\"\r\n [class.active]=\"currentPeriod === DashboardPeriod.Week\"\r\n (click)=\"setPeriod(DashboardPeriod.Week)\"\r\n >\r\n Semana\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"period-pill\"\r\n [class.active]=\"currentPeriod === DashboardPeriod.Month\"\r\n (click)=\"setPeriod(DashboardPeriod.Month)\"\r\n >\r\n Mês\r\n </button>\r\n </div>\r\n </header>\r\n <!-- #endregion -->\r\n\r\n <!-- #region LoadingSkeletonState -->\r\n <careon-dashboard-skeleton *ngIf=\"loading\"></careon-dashboard-skeleton>\r\n <!-- #endregion -->\r\n\r\n <!-- #region EmptyState -->\r\n <div *ngIf=\"!loading && !hasData\" class=\"dashboard-empty-state\">\r\n <p class=\"empty-title\">Sem registros</p>\r\n <p class=\"empty-description\">{{ emptyMessage }}</p>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region DashboardContent -->\r\n <main *ngIf=\"!loading && hasData\" class=\"dashboard-content\">\r\n <!-- #region KpiCardsRow -->\r\n <section class=\"kpi-cards-grid\">\r\n <!-- KPI 1: Vagas Publicadas -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Vagas Publicadas</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ registeredVacancies }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"registeredVacanciesBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"registeredVacanciesBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"registeredVacanciesBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ registeredVacanciesBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">\r\n no total\r\n </span>\r\n </article>\r\n\r\n <!-- KPI 2: Candidatos Inscritos -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Candidatos Inscritos</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ candidateApplications }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"candidateApplicationsBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"candidateApplicationsBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"candidateApplicationsBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ candidateApplicationsBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">\r\n {{ currentPeriod === 'Today' ? 'hoje' : currentPeriod === 'Week' ? 'essa semana' : 'esse mês' }}\r\n </span>\r\n </article>\r\n\r\n <!-- KPI 3: Currículos para Avaliar -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Currículos para Avaliar</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ pendingReviews }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"pendingReviewsBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"pendingReviewsBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"pendingReviewsBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ pendingReviewsBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">aguardando agora</span>\r\n </article>\r\n\r\n <!-- KPI 4: Média de Candidatos -->\r\n <article class=\"kpi-card\">\r\n <div class=\"kpi-card-header\">\r\n <span class=\"kpi-label\">Média de Candidatos</span>\r\n </div>\r\n <div class=\"kpi-card-body\">\r\n <span class=\"kpi-value\">{{ averageCandidatesPerVacancy }}</span>\r\n <span class=\"kpi-badge\" [ngClass]=\"averageCandidatesBadge.badgeClass\">\r\n <careon-dashboard-icon *ngIf=\"averageCandidatesBadge.isPositive\" name=\"arrow-up\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <careon-dashboard-icon *ngIf=\"averageCandidatesBadge.isNegative\" name=\"arrow-down\" class=\"kpi-badge-icon\"></careon-dashboard-icon>\r\n <span>{{ averageCandidatesBadge.changeText }}</span>\r\n </span>\r\n </div>\r\n <span class=\"kpi-footer\">por vaga</span>\r\n </article>\r\n\r\n <!-- KPI 5: Status das Vagas -->\r\n <article class=\"kpi-card kpi-card--status\">\r\n <careon-stacked-horizontal-bar\r\n [title]=\"'Status das Vagas'\"\r\n [totalLabel]=\"'vagas'\"\r\n [showHeader]=\"true\"\r\n [showLegend]=\"true\"\r\n [data]=\"dutiesStatusItems\"\r\n [emptyText]=\"'Sem vagas registradas'\"\r\n (itemSelected)=\"onChartItemSelected($event, 'Status das Vagas')\"\r\n ></careon-stacked-horizontal-bar>\r\n </article>\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region AttentionSection -->\r\n <section class=\"attention-section\">\r\n <!-- #region AttentionCard -->\r\n <article class=\"attention-card\">\r\n <h2 class=\"attention-card-title\">Precisa da sua atenção</h2>\r\n\r\n <ng-container *ngIf=\"attentionItems.length > 0; else noAttention\">\r\n <div class=\"attention-items-list\">\r\n <div *ngFor=\"let item of attentionItems; let last = last\" class=\"attention-item-wrapper\">\r\n <div class=\"attention-item\" (click)=\"onAttentionItemClick(item)\">\r\n <span class=\"attention-item-title\">{{ item.title }}</span>\r\n <span class=\"attention-item-subtitle\">{{ item.subtitle }}</span>\r\n </div>\r\n <div *ngIf=\"!last\" class=\"attention-divider\"></div>\r\n </div>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"btn-consultant\"\r\n (click)=\"openConsultantWhatsApp('Precisa da sua atenção')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </ng-container>\r\n\r\n <ng-template #noAttention>\r\n <ng-container *ngIf=\"isPublishZeroState; else basicAttentionZero\">\r\n <div class=\"attention-zero-box\">\r\n <div class=\"attention-zero-header\">\r\n <careon-dashboard-icon name=\"info\" class=\"zero-info-icon\"></careon-dashboard-icon>\r\n <div class=\"attention-zero-texts\">\r\n <h3 class=\"attention-zero-title\">Nenhuma vaga precisa de atenção</h3>\r\n <p class=\"attention-zero-subtitle\">Você não tem vagas em aberto para revisar.</p>\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-zero-publish btn-zero-publish--full\"\r\n (click)=\"onPublishDuty('Precisa da sua atenção')\"\r\n >\r\n Publicar Vaga\r\n </button>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #basicAttentionZero>\r\n <div class=\"basic-empty-state basic-empty-state--attention\">\r\n <div class=\"basic-empty-icon-wrap\">\r\n <careon-dashboard-icon name=\"info\" class=\"basic-empty-icon\"></careon-dashboard-icon>\r\n </div>\r\n <h3 class=\"basic-empty-title\">Tudo em dia!</h3>\r\n <p class=\"basic-empty-text\">Nenhuma vaga precisa da sua atenção no momento.</p>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-consultant\"\r\n (click)=\"openConsultantWhatsApp('Precisa da sua atenção - Sem vagas')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </ng-template>\r\n </ng-template>\r\n </article>\r\n <!-- #endregion -->\r\n\r\n <!-- #region PerformanceCard -->\r\n <article class=\"performance-card\">\r\n <div class=\"performance-card-header\">\r\n <h2 class=\"performance-card-title\">Análise de Desempenho</h2>\r\n\r\n <div\r\n class=\"performance-info-wrapper\"\r\n (mouseenter)=\"onInfoMouseEnter()\"\r\n (mouseleave)=\"onInfoMouseLeave()\"\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"btn-info\"\r\n aria-label=\"Informações sobre a Análise de Desempenho\"\r\n (click)=\"toggleInfoTooltip()\"\r\n >\r\n <careon-dashboard-icon name=\"info\" class=\"info-icon\"></careon-dashboard-icon>\r\n </button>\r\n\r\n <!-- Tooltip -->\r\n <div *ngIf=\"showInfoTooltip\" class=\"info-tooltip\" role=\"tooltip\">\r\n <div class=\"tooltip-arrow\"></div>\r\n <p class=\"tooltip-text\">\r\n Esta análise mede o interesse dos candidatos pela sua empresa e é atualizada continuamente à medida que mais profissionais demonstram desejo de fazer parte do seu time.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Gráfico de Ondas -->\r\n <careon-performance-wave [level]=\"performanceLevel\"></careon-performance-wave>\r\n\r\n <!-- Conteúdo Textual -->\r\n <div class=\"performance-body\">\r\n <h3 class=\"performance-highlight-title\">{{ performanceTitle }}</h3>\r\n <p class=\"performance-description\">{{ performanceDescription }}</p>\r\n </div>\r\n\r\n <!-- Botão WhatsApp -->\r\n <button\r\n type=\"button\"\r\n class=\"btn-consultant\"\r\n (click)=\"openConsultantWhatsApp('Análise de Desempenho')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </article>\r\n <!-- #endregion -->\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region VacancyAnalysisSection -->\r\n <section class=\"vacancy-analysis-section vacancy-analysis-card\">\r\n <!-- #region SectionHeader -->\r\n <header class=\"vacancy-section-header\">\r\n <div class=\"vacancy-section-title-group\">\r\n <h2 class=\"vacancy-section-title\">Análise por Vaga</h2>\r\n <span class=\"vacancy-section-subtitle\" *ngIf=\"selectedDuty\">{{ vacancySectionSubtitle }}</span>\r\n <span class=\"vacancy-section-subtitle\" *ngIf=\"!selectedDuty\">\r\n {{ isPublishZeroState ? 'Nenhuma candidatura registrada' : 'Nenhuma vaga ativa no momento' }}\r\n </span>\r\n </div>\r\n\r\n <div class=\"vacancy-dropdown-wrapper\" *ngIf=\"vacanciesAnalysis.length > 0\">\r\n <span class=\"vacancy-dropdown-label\">Escolha a vaga:</span>\r\n\r\n <div class=\"vacancy-dropdown-container\">\r\n <button\r\n type=\"button\"\r\n class=\"vacancy-dropdown-btn\"\r\n [class.vacancy-dropdown-btn--open]=\"isDutyDropdownOpen\"\r\n (click)=\"toggleDutyDropdown()\"\r\n [attr.aria-expanded]=\"isDutyDropdownOpen\"\r\n >\r\n <span class=\"vacancy-dropdown-btn-text\">{{ selectedDuty?.title || 'Selecione uma vaga' }}</span>\r\n <careon-dashboard-icon name=\"chevron-down\" [rotated]=\"isDutyDropdownOpen\" class=\"vacancy-dropdown-btn-icon\"></careon-dashboard-icon>\r\n </button>\r\n\r\n <!-- Backdrop para fechar dropdown ao clicar fora -->\r\n <div *ngIf=\"isDutyDropdownOpen\" class=\"vacancy-dropdown-backdrop\" (click)=\"closeDutyDropdown()\"></div>\r\n\r\n <!-- Menu flutuante do dropdown -->\r\n <div *ngIf=\"isDutyDropdownOpen\" class=\"vacancy-dropdown-menu\" role=\"menu\">\r\n <div\r\n *ngFor=\"let duty of vacanciesAnalysis\"\r\n class=\"vacancy-dropdown-item\"\r\n [class.vacancy-dropdown-item--selected]=\"duty.dutyId === selectedDuty?.dutyId\"\r\n (click)=\"selectDuty(duty)\"\r\n role=\"menuitem\"\r\n >\r\n <div class=\"duty-radio-outer\" [class.duty-radio-outer--checked]=\"duty.dutyId === selectedDuty?.dutyId\">\r\n <div class=\"duty-radio-inner\" *ngIf=\"duty.dutyId === selectedDuty?.dutyId\"></div>\r\n </div>\r\n\r\n <div class=\"duty-item-content\">\r\n <span class=\"duty-item-title\">{{ duty.title }}</span>\r\n <span class=\"duty-item-subtitle\">{{ duty.subtitle }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </header>\r\n <!-- #endregion -->\r\n\r\n <ng-container *ngIf=\"selectedDuty; else noActiveDuties\">\r\n <!-- #region TimelineChart -->\r\n <div class=\"vacancy-timeline-wrapper\">\r\n <careon-timeline-bar-chart\r\n [data]=\"selectedDutyTimelinePoints\"\r\n [autoBarWidth]=\"false\"\r\n [barWidth]=\"68\"\r\n (itemSelected)=\"onTimelinePointSelected($event)\"\r\n ></careon-timeline-bar-chart>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region BottomMetricsRow -->\r\n <div class=\"vacancy-bottom-grid\">\r\n <!-- Card Taxa de Conversão -->\r\n <article class=\"vacancy-metric-card vacancy-metric-card--donut\">\r\n <careon-donut-chart\r\n [title]=\"'Taxa de conversão'\"\r\n [titleBold]=\"true\"\r\n [titleSize]=\"14\"\r\n [titlePadding]=\"6\"\r\n [data]=\"selectedDutyDonutItems\"\r\n [centerText]=\"selectedDutyConversionRateText\"\r\n [size]=\"96\"\r\n [strokeWidth]=\"18\"\r\n ></careon-donut-chart>\r\n </article>\r\n\r\n <!-- Card Visualizações → Candidaturas -->\r\n <article class=\"vacancy-metric-card vacancy-metric-card--funnel\">\r\n <careon-funnel-bar\r\n [title]=\"'Visualizações → Candidaturas'\"\r\n [titleBold]=\"true\"\r\n [titleSize]=\"14\"\r\n [titlePadding]=\"6\"\r\n [data]=\"selectedDutyFunnelItems\"\r\n [minBarWidth]=\"260\"\r\n ></careon-funnel-bar>\r\n </article>\r\n </div>\r\n <!-- #endregion -->\r\n\r\n <!-- #region SalaryAndSupportRow -->\r\n <div class=\"vacancy-salary-support-grid\" *ngIf=\"selectedDutySalaryComparison\">\r\n <!-- Card Média Salarial -->\r\n <article class=\"vacancy-salary-card\">\r\n <header class=\"salary-card-header\">\r\n <!-- Coluna 1: Seu valor -->\r\n <div class=\"salary-metric-col\">\r\n <span class=\"salary-metric-label\">Seu valor</span>\r\n <span\r\n class=\"salary-metric-value\"\r\n [class.salary-metric-value--not-informed]=\"salaryStatus === DutySalaryStatus.NotInformed\"\r\n [class.salary-metric-value--insufficient]=\"salaryStatus === DutySalaryStatus.InsufficientData\"\r\n >\r\n {{ formattedYourSalary }}\r\n </span>\r\n </div>\r\n\r\n <!-- Divisor vertical -->\r\n <div class=\"salary-metric-divider\"></div>\r\n\r\n <!-- Coluna 2: Média da região -->\r\n <div class=\"salary-metric-col\">\r\n <span class=\"salary-metric-label\">Média da região</span>\r\n <span\r\n class=\"salary-metric-value\"\r\n [class.salary-metric-value--orange]=\"salaryStatus === DutySalaryStatus.BelowMarket\"\r\n [class.salary-metric-value--blue]=\"salaryStatus === DutySalaryStatus.AtMarket\"\r\n [class.salary-metric-value--navy]=\"salaryStatus === DutySalaryStatus.AboveMarket\"\r\n [class.salary-metric-value--insufficient]=\"salaryStatus === DutySalaryStatus.InsufficientData\"\r\n [class.salary-metric-value--muted]=\"salaryStatus === DutySalaryStatus.NotInformed\"\r\n >\r\n {{ formattedRegionalAverage }}\r\n </span>\r\n </div>\r\n\r\n <!-- Badge Dinâmico -->\r\n <div\r\n class=\"salary-badge\"\r\n [ngClass]=\"salaryBadgeClass\"\r\n *ngIf=\"selectedDutySalaryComparison.badgeText\"\r\n >\r\n {{ selectedDutySalaryComparison.badgeText }}\r\n </div>\r\n </header>\r\n\r\n <!-- Linha/Corpo textual com Destaque e Explicação -->\r\n <div class=\"salary-card-body\">\r\n <h4 class=\"salary-highlight-title\" [ngClass]=\"salaryTitleColorClass\">\r\n {{ selectedDutySalaryComparison.highlightTitle }}\r\n </h4>\r\n <p class=\"salary-description\">\r\n {{ selectedDutySalaryComparison.description }}\r\n </p>\r\n </div>\r\n </article>\r\n\r\n <!-- Card de Suporte: Dúvidas sobre esses dados? -->\r\n <article class=\"vacancy-support-card\">\r\n <h4 class=\"support-card-title\">Ainda com dúvidas sobre esses dados?</h4>\r\n <p class=\"support-card-subtitle\">\r\n Se depois de ver os gráficos você ficou com perguntas sem resposta, fale com a nossa equipe.\r\n </p>\r\n <button\r\n type=\"button\"\r\n class=\"btn-support-consultant\"\r\n (click)=\"openConsultantWhatsApp('Dúvidas sobre esses dados')\"\r\n >\r\n Fale com um consultor\r\n </button>\r\n </article>\r\n </div>\r\n <!-- #endregion -->\r\n </ng-container>\r\n\r\n <ng-template #noActiveDuties>\r\n <div class=\"zero-state-banner\" *ngIf=\"isPublishZeroState; else basicVacancyZero\">\r\n <div class=\"zero-state-banner-left\">\r\n <careon-dashboard-icon name=\"info\" class=\"zero-info-icon\"></careon-dashboard-icon>\r\n <div class=\"zero-state-banner-texts\">\r\n <h3 class=\"zero-state-banner-title\">Nenhuma vaga para analisar</h3>\r\n <p class=\"zero-state-banner-subtitle\">Cadastre uma vaga para começar a acompanhar o desempenho dela aqui.</p>\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-zero-publish\"\r\n (click)=\"onPublishDuty('Análise por Vaga')\"\r\n >\r\n Publicar Vaga\r\n </button>\r\n </div>\r\n\r\n <ng-template #basicVacancyZero>\r\n <div class=\"basic-empty-state basic-empty-state--vacancy\">\r\n <div class=\"basic-empty-icon-wrap\">\r\n <careon-dashboard-icon name=\"info\" class=\"basic-empty-icon\"></careon-dashboard-icon>\r\n </div>\r\n <h3 class=\"basic-empty-title\">Nenhuma vaga para analisar</h3>\r\n <p class=\"basic-empty-text\">Nenhuma vaga ativa no momento para análise.</p>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </section>\r\n <!-- #endregion -->\r\n\r\n <!-- #region ApplicationsPerVacancySection -->\r\n <section class=\"applications-per-vacancy-section\">\r\n <header class=\"applications-section-header\">\r\n <h2 class=\"applications-section-title\">Candidaturas por Vaga</h2>\r\n <span class=\"applications-section-subtitle\" *ngIf=\"hasComparisonDuties\">\r\n {{ comparisonSubtitle }}\r\n </span>\r\n <span class=\"applications-section-subtitle\" *ngIf=\"!hasComparisonDuties\">\r\n {{ isPublishZeroState ? '0 candidaturas no total, nenhuma vaga ativa' : 'Nenhuma vaga ativa no momento' }}\r\n </span>\r\n </header>\r\n\r\n <div class=\"applications-chart-wrapper\" *ngIf=\"hasComparisonDuties; else noComparisonDuties\">\r\n <careon-comparison-bar-chart\r\n [data]=\"comparisonItems\"\r\n [autoBarWidth]=\"false\"\r\n [barWidth]=\"75\"\r\n [itemSlotWidth]=\"100\"\r\n [barColor]=\"'#3B82F6'\"\r\n [zeroColor]=\"'#EF4444'\"\r\n [trendLineColor]=\"'#1E293B'\"\r\n [dotColor]=\"'#1E293B'\"\r\n [textColor]=\"'#64748B'\"\r\n (itemSelected)=\"onChartItemSelected($event, 'Candidaturas por Vaga')\"\r\n ></careon-comparison-bar-chart>\r\n </div>\r\n\r\n <ng-template #noComparisonDuties>\r\n <div class=\"zero-state-banner\" *ngIf=\"isPublishZeroState; else basicComparisonZero\">\r\n <div class=\"zero-state-banner-left\">\r\n <careon-dashboard-icon name=\"info\" class=\"zero-info-icon\"></careon-dashboard-icon>\r\n <div class=\"zero-state-banner-texts\">\r\n <h3 class=\"zero-state-banner-title\">Nenhuma candidatura registrada</h3>\r\n <p class=\"zero-state-banner-subtitle\">Sem vagas em aberto, ainda não há candidaturas para mostrar.</p>\r\n </div>\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"btn-zero-publish\"\r\n (click)=\"onPublishDuty('Candidaturas por Vaga')\"\r\n >\r\n Publicar Vaga\r\n </button>\r\n </div>\r\n\r\n <ng-template #basicComparisonZero>\r\n <div class=\"basic-empty-state basic-empty-state--comparison\">\r\n <div class=\"basic-empty-icon-wrap\">\r\n <careon-dashboard-icon name=\"info\" class=\"basic-empty-icon\"></careon-dashboard-icon>\r\n </div>\r\n <h3 class=\"basic-empty-title\">Nenhuma candidatura registrada</h3>\r\n <p class=\"basic-empty-text\">Nenhuma vaga ativa no momento para análise.</p>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </section>\r\n <!-- #endregion -->\r\n </main>\r\n <!-- #endregion -->\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CareonChartsModule } from '@careonbrasil/ng-charts';\r\nimport { DashboardComponent } from './dashboard.component';\r\nimport { PerformanceWaveComponent } from './components/performance-wave/performance-wave.component';\r\nimport { DashboardIconComponent } from './components/dashboard-icon/dashboard-icon.component';\r\nimport { DashboardSkeletonComponent } from './components/dashboard-skeleton/dashboard-skeleton.component';\r\n\r\n@NgModule({\r\n declarations: [\r\n DashboardComponent,\r\n PerformanceWaveComponent,\r\n DashboardIconComponent,\r\n DashboardSkeletonComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n CareonChartsModule\r\n ],\r\n exports: [\r\n DashboardComponent,\r\n PerformanceWaveComponent,\r\n DashboardIconComponent,\r\n DashboardSkeletonComponent\r\n ]\r\n})\r\nexport class CareonDashboardModule {}\r\n","/*\r\n * Public API Surface of @careonbrasil/dashboard\r\n */\r\n\r\nexport * from './lib/dashboard.component';\r\nexport * from './lib/careon-dashboard.module';\r\nexport * from './lib/models/dashboard.models';\r\nexport * from './lib/components/performance-wave/performance-wave.component';\r\nexport * from './lib/components/dashboard-icon/dashboard-icon.component';\r\nexport * from './lib/components/dashboard-skeleton/dashboard-skeleton.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i3.PerformanceWaveComponent","i4.DashboardIconComponent","i5.DashboardSkeletonComponent"],"mappings":"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"}