@careonbrasil/dashboard 14.0.1 → 14.0.2

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 CHANGED
@@ -1,359 +1,359 @@
1
- # @careonbrasil/dashboard
2
-
3
- Biblioteca oficial de Dashboard de Recrutamento Institucional desenvolvida para o ecossistema CareOn.
4
-
5
- Fornece uma solucao analitica completa de metricas de atracao e selecao de profissionais de saude, reunindo indicadores-chave (KPIs), analise qualitativa de desempenho com ondas vetoriais, aprofundamento individual por vaga, comparativos de mercado e alertas operacionais acionaveis.
6
-
7
- Construida para projetos Angular 14 com suporte nativo a `ChangeDetectionStrategy.OnPush`, renderizacao vetorial SVG e integracao direta com `@careonbrasil/ng-charts`.
8
-
9
- ---
10
-
11
- ## Sumario
12
-
13
- 1. [Instalacao](#1-instalacao)
14
- 2. [Configuracao](#2-configuracao)
15
- 3. [Componentes](#3-componentes)
16
- - [Dashboard Principal (`<careon-dashboard>`)](#1-dashboard-principal-careon-dashboard)
17
- - [Esqueleto de Carregamento (`<careon-dashboard-skeleton>`)](#2-esqueleto-de-carregamento-careon-dashboard-skeleton)
18
- - [Onda de Performance (`<careon-performance-wave>`)](#3-onda-de-performance-careon-performance-wave)
19
- 4. [Modelos de Dados](#4-modelos-de-dados)
20
- - [DashboardOverviewData](#dashboardoverviewdata)
21
- - [DashboardKpiSummary](#dashboardkpisummary)
22
- - [DashboardAttentionItem](#dashboardattentionitem)
23
- - [DashboardPerformanceAnalysis](#dashboardperformanceanalysis)
24
- - [DashboardDutyAnalysis](#dashboarddutyanalysis)
25
- - [DashboardDutySalaryComparison](#dashboarddutysalarycomparison)
26
- - [Enums do Pacote](#enums-do-pacote)
27
- 5. [Compilacao e Publicacao](#5-compilacao-e-publicacao)
28
-
29
- ---
30
-
31
- ## 1. Instalacao
32
-
33
- Instale o pacote via NPM ou Yarn:
34
-
35
- ```bash
36
- npm install @careonbrasil/dashboard
37
- ```
38
-
39
- ### Dependencias de Peer
40
-
41
-
42
- | Dependencia | Versao compativel | Finalidade |
43
- | :--- | :--- | :--- |
44
- | `@angular/core` | `>=14.0.0 <15.0.0` | Nucleo do Angular |
45
- | `@angular/common` | `>=14.0.0 <15.0.0` | Diretivas comuns e pipes |
46
-
47
- ### Dependencias Diretas
48
-
49
- | Dependencia | Versao compativel | Finalidade |
50
- | :--- | :--- | :--- |
51
- | `@careonbrasil/ng-charts` | `^14.0.6` | Biblioteca de graficos SVG CareOn |
52
- | `tslib` | `^2.3.0` | Runtime helpers do TypeScript |
53
-
54
- > **Nota de Estilo**: O dashboard utiliza tipografia corporativa padrao Montserrat. Recomenda-se carregar a fonte no projeto hospedeiro (`font-family: 'Montserrat', sans-serif`).
55
-
56
- ---
57
-
58
- ## 2. Configuracao
59
-
60
- Importe o modulo `CareonDashboardModule` no seu modulo Angular (ex: `AppModule` ou modulo de feature):
61
-
62
- ```typescript
63
- import { NgModule } from '@angular/core';
64
- import { BrowserModule } from '@angular/platform-browser';
65
- import { CareonDashboardModule } from '@careonbrasil/dashboard';
66
-
67
- import { AppComponent } from './app.component';
68
-
69
- @NgModule({
70
- declarations: [AppComponent],
71
- imports: [
72
- BrowserModule,
73
- CareonDashboardModule
74
- ],
75
- bootstrap: [AppComponent]
76
- })
77
- export class AppModule { }
78
- ```
79
-
80
- ---
81
-
82
- ## 3. Componentes
83
-
84
- ### 1. Dashboard Principal (`<careon-dashboard>`)
85
-
86
- Componente central que orquestra a visualizacao analitica completa. E estruturado nas seguintes secoes funcionais:
87
-
88
- 1. **Cabecalho com Filtros**: Titulo, subtitulo e alternador de periodo reativo (`Hoje`, `Semana`, `Mes`).
89
- 2. **Cards de Indicadores-Chave (KPIs)**: Vagas Publicadas, Candidatos Inscritos, Curriculos para Avaliar, Media de Candidatos por Vaga e Balanco de Status (Abertas vs. Encerradas) com badges de variacao comparativa.
90
- 3. **Secao "Precisa da sua atencao"**: Listagem de vagas prioritarias (sem candidatos ou com prazo expirando), com atalho para contato consultivo.
91
- 4. **Secao "Analise de Desempenho"**: Indicador de engajamento institucional por meio de curva de ondas vetorial (`PerformanceLevel`), status descritivo e recomendacoes praticas.
92
- 5. **Secao "Analise por Vaga"**: Seletor dropdown para inspecao de vaga individual com linha do tempo de candidaturas, taxa de conversao (grafico donut), funil de atracao e comparativo salarial regional.
93
- 6. **Secao "Candidaturas por Vaga"**: Grafico comparativo de barras verticais com linha de tendencia destacando a distribuicao de candidatos entre vagas ativas.
94
-
95
- #### Inputs e Outputs
96
-
97
- | Propriedade | Tipo | Padrao | Descricao |
98
- | :--- | :--- | :--- | :--- |
99
- | `[data]` | `DashboardOverviewData` | `undefined` | Conjunto completo de dados analiticos para alimentar o dashboard. |
100
- | `[loading]` | `boolean` | `false` | Quando `true`, exibe o esqueleto de carregamento com animacao shimmer. |
101
- | `[currentPeriod]` | `DashboardPeriod` | `DashboardPeriod.Week` | Periodo temporal ativo (`Today`, `Week`, `Month`). |
102
- | `[title]` | `string` | `'Dashboard'` | Titulo principal exibido no cabecalho. |
103
- | `[subtitle]` | `string` | `'Visao geral de recrutamento'` | Subtitulo ou nome da unidade no cabecalho. |
104
- | `[emptyMessage]` | `string` | `'Nenhum dado registrado para o periodo selecionado.'` | Mensagem do estado vazio quando nao ha dados. |
105
- | `[consultantPhone]` | `string` | `'5547996569707'` | Numero de telefone para o redirecionamento ao WhatsApp de consultoria. |
106
- | `[consultantMessage]` | `string` | `''` | Mensagem inicial pre-formatada para o WhatsApp. |
107
- | `[zeroStateMode]` | `'publish' \| 'basic'` | `'publish'` | Modo de estado vazio das secoes: `'publish'` exibe chamada para publicacao; `'basic'` exibe aviso informativo. |
108
- | `(periodChange)` | `EventEmitter<DashboardPeriod>` | — | Disparado quando o usuario clica em um filtro de periodo (`Hoje`, `Semana`, `Mes`). |
109
- | `(attentionItemSelected)` | `EventEmitter<DashboardAttentionItem>` | — | Disparado ao clicar em um item da lista de atencao. |
110
- | `(dutySelected)` | `EventEmitter<DashboardDutyAnalysis>` | — | Disparado ao selecionar uma vaga no dropdown da secao "Analise por Vaga". |
111
- | `(publishDuty)` | `EventEmitter<string \| void>` | — | Disparado ao clicar nos botoes "Publicar Vaga" das areas de estado zero (emite o nome da secao de origem). |
112
- | `(consultantClick)` | `EventEmitter<string>` | — | Disparado ao clicar nos links de suporte "Fale com um consultor" (emite a secao de origem). |
113
- | `(itemSelected)` | `EventEmitter<DashboardItemSelectedEvent>` | — | Disparado ao selecionar elementos interativos dos graficos integrados. |
114
-
115
- #### Exemplo de Uso
116
-
117
- ```html
118
- <careon-dashboard
119
- [data]="dashboardData"
120
- [loading]="isLoading"
121
- [currentPeriod]="selectedPeriod"
122
- [title]="'Painel Institucional'"
123
- [subtitle]="'Hospital Central'"
124
- (periodChange)="onPeriodChange($event)"
125
- (attentionItemSelected)="onAttentionItemClick($event)"
126
- (dutySelected)="onDutyChange($event)"
127
- (publishDuty)="onPublishDutyClick($event)"
128
- (consultantClick)="onConsultantClick($event)"
129
- ></careon-dashboard>
130
- ```
131
-
132
- ```typescript
133
- import { Component, OnInit } from '@angular/core';
134
- import {
135
- DashboardOverviewData,
136
- DashboardPeriod,
137
- DashboardAttentionItem,
138
- DashboardDutyAnalysis
139
- } from '@careonbrasil/dashboard';
140
-
141
- @Component({
142
- selector: 'app-analytics-page',
143
- templateUrl: './analytics-page.component.html'
144
- })
145
- export class AnalyticsPageComponent implements OnInit {
146
- dashboardData?: DashboardOverviewData;
147
- isLoading = false;
148
- selectedPeriod: DashboardPeriod = DashboardPeriod.Week;
149
-
150
- ngOnInit(): void {
151
- this.loadData(this.selectedPeriod);
152
- }
153
-
154
- loadData(period: DashboardPeriod): void {
155
- this.isLoading = true;
156
- this.selectedPeriod = period;
157
- // Exemplo: chamada a servico de dados
158
- }
159
-
160
- onPeriodChange(period: DashboardPeriod): void {
161
- this.loadData(period);
162
- }
163
-
164
- onAttentionItemClick(item: DashboardAttentionItem): void {
165
- console.log('Navegar para vaga com atencao:', item.dutyId);
166
- }
167
-
168
- onDutyChange(duty: DashboardDutyAnalysis): void {
169
- console.log('Vaga selecionada na analise:', duty.title);
170
- }
171
-
172
- onPublishDutyClick(section?: string | void): void {
173
- console.log('Abrir fluxo de publicacao a partir de:', section);
174
- }
175
-
176
- onConsultantClick(section: string): void {
177
- console.log('Contato com consultor acionado em:', section);
178
- }
179
- }
180
- ```
181
-
182
- ---
183
-
184
- ### 2. Esqueleto de Carregamento (`<careon-dashboard-skeleton>`)
185
-
186
- Componente visual independente que replica a disposicao geometrica dos cards de KPIs, listas de atencao e paineis de graficos do dashboard com animacao suave de shimmer. Util para telas com transicoes assincronas de carregamento.
187
-
188
- ```html
189
- <careon-dashboard-skeleton></careon-dashboard-skeleton>
190
- ```
191
-
192
- ---
193
-
194
- ### 3. Onda de Performance (`<careon-performance-wave>`)
195
-
196
- Componente vetorial SVG inline responsavel por desenhar as curvas caracteristicas de desempenho institucional. Pode ser utilizado separadamente em outros contextos institucionais:
197
-
198
- #### Inputs
199
-
200
- | Propriedade | Tipo | Padrao | Descricao |
201
- | :--- | :--- | :--- | :--- |
202
- | `[level]` | `PerformanceLevel` | `PerformanceLevel.Blue` | Nivel de performance que define a curvatura e as cores do gradiente (`Blue`, `Orange`, `Red`). |
203
-
204
- #### Exemplo de Uso
205
-
206
- ```html
207
- <careon-performance-wave [level]="PerformanceLevel.Orange"></careon-performance-wave>
208
- ```
209
-
210
- ---
211
-
212
- ## 4. Modelos de Dados
213
-
214
- ### `DashboardOverviewData`
215
-
216
- Contrato mestre que alimenta o componente principal:
217
-
218
- ```typescript
219
- export interface DashboardOverviewData {
220
- /** Identificador unico da instituicao. */
221
- institutionId?: number;
222
- /** Razao social ou nome de exibicao da instituicao. */
223
- institutionName?: string;
224
- /** Rotulo do periodo ativo (ex: 'Hoje', 'Semana', 'Mes'). */
225
- period?: string;
226
- /** Data inicial do intervalo temporal coberto pelas metricas. */
227
- startDate?: string | Date;
228
- /** Data final do intervalo temporal coberto pelas metricas. */
229
- endDate?: string | Date;
230
- /** Resumo numerico dos KPIs superiores. */
231
- kpis?: DashboardKpiSummary;
232
- /** Pontos para o grafico de linha do tempo de candidaturas. */
233
- timeline?: TimelinePoint[];
234
- /** Dados para o grafico de barras comparativas entre vagas. */
235
- comparison?: ComparisonItem[];
236
- /** Distribuicao de candidaturas por categoria para grafico donut. */
237
- distribution?: DonutChartItem[];
238
- /** Distribuicao de status das vagas (abertas vs. encerradas). */
239
- dutiesStatus?: StackedBarItem[];
240
- /** Etapas do funil geral de recrutamento. */
241
- recruitmentFunnel?: FunnelBarItem[];
242
- /** Relacao de vagas prioritarias que requerem atencao imediata. */
243
- attentionItems?: DashboardAttentionItem[];
244
- /** Diagnostico qualitativo de performance geral com curva de ondas. */
245
- performanceAnalysis?: DashboardPerformanceAnalysis;
246
- /** Relacao de vagas detalhadas com metricas individuais para o seletor. */
247
- vacanciesAnalysis?: DashboardDutyAnalysis[];
248
- }
249
- ```
250
-
251
- ### `DashboardKpiSummary`
252
-
253
- ```typescript
254
- export interface DashboardKpiSummary {
255
- registeredVacancies?: number;
256
- registeredVacanciesPrevious?: number;
257
- registeredVacanciesDifference?: number;
258
-
259
- candidateApplications?: number;
260
- candidateApplicationsPrevious?: number;
261
- candidateApplicationsDifference?: number;
262
-
263
- pendingReviews?: number;
264
- pendingReviewsPrevious?: number;
265
- pendingReviewsDifference?: number;
266
-
267
- averageCandidatesPerVacancy?: number;
268
- averageCandidatesPerVacancyPrevious?: number;
269
- averageCandidatesDifference?: number;
270
-
271
- openVacancies?: number;
272
- closedVacancies?: number;
273
- totalVacancies?: number;
274
- }
275
- ```
276
-
277
- ### `DashboardAttentionItem`
278
-
279
- ```typescript
280
- export interface DashboardAttentionItem {
281
- dutyId: number;
282
- title: string;
283
- subtitle: string;
284
- candidatesCount?: number;
285
- pendingReviewsCount?: number;
286
- daysOpen?: number;
287
- hoursOpen?: number;
288
- isFixedJob?: boolean;
289
- }
290
- ```
291
-
292
- ### `DashboardPerformanceAnalysis`
293
-
294
- ```typescript
295
- export interface DashboardPerformanceAnalysis {
296
- averageConversionRate?: number;
297
- level?: PerformanceLevel | number;
298
- highlightTitle?: string;
299
- description?: string;
300
- totalVacanciesInPeriod?: number;
301
- }
302
- ```
303
-
304
- ### `DashboardDutyAnalysis`
305
-
306
- ```typescript
307
- export interface DashboardDutyAnalysis {
308
- dutyId: number;
309
- title: string;
310
- subtitle: string;
311
- candidatesCount: number;
312
- viewsCount: number;
313
- conversionRate: number;
314
- timelinePoints: TimelinePoint[];
315
- conversionDonut?: DonutChartItem[];
316
- funnelItems?: FunnelBarItem[];
317
- salaryComparison?: DashboardDutySalaryComparison;
318
- }
319
- ```
320
-
321
- ### `DashboardDutySalaryComparison`
322
-
323
- ```typescript
324
- export interface DashboardDutySalaryComparison {
325
- yourSalary?: number | null;
326
- regionalAverageSalary?: number | null;
327
- differencePercentage?: number | null;
328
- status: DutySalaryStatus;
329
- highlightTitle: string;
330
- description: string;
331
- badgeText?: string | null;
332
- }
333
- ```
334
-
335
- ### Enums do Pacote
336
-
337
- ```typescript
338
- export enum DashboardPeriod {
339
- Today = 'Today',
340
- Week = 'Week',
341
- Month = 'Month'
342
- }
343
-
344
- export enum PerformanceLevel {
345
- Blue = 'Blue',
346
- Orange = 'Orange',
347
- Red = 'Red'
348
- }
349
-
350
- export enum DutySalaryStatus {
351
- BelowMarket = 'BelowMarket',
352
- AtMarket = 'AtMarket',
353
- AboveMarket = 'AboveMarket',
354
- NotInformed = 'NotInformed',
355
- InsufficientData = 'InsufficientData'
356
- }
357
- ```
358
-
359
- ---
1
+ # @careonbrasil/dashboard
2
+
3
+ Biblioteca oficial de Dashboard de Recrutamento Institucional desenvolvida para o ecossistema CareOn.
4
+
5
+ Fornece uma solucao analitica completa de metricas de atracao e selecao de profissionais de saude, reunindo indicadores-chave (KPIs), analise qualitativa de desempenho com ondas vetoriais, aprofundamento individual por vaga, comparativos de mercado e alertas operacionais acionaveis.
6
+
7
+ Construida para projetos Angular 14 com suporte nativo a `ChangeDetectionStrategy.OnPush`, renderizacao vetorial SVG e integracao direta com `@careonbrasil/ng-charts`.
8
+
9
+ ---
10
+
11
+ ## Sumario
12
+
13
+ 1. [Instalacao](#1-instalacao)
14
+ 2. [Configuracao](#2-configuracao)
15
+ 3. [Componentes](#3-componentes)
16
+ - [Dashboard Principal (`<careon-dashboard>`)](#1-dashboard-principal-careon-dashboard)
17
+ - [Esqueleto de Carregamento (`<careon-dashboard-skeleton>`)](#2-esqueleto-de-carregamento-careon-dashboard-skeleton)
18
+ - [Onda de Performance (`<careon-performance-wave>`)](#3-onda-de-performance-careon-performance-wave)
19
+ 4. [Modelos de Dados](#4-modelos-de-dados)
20
+ - [DashboardOverviewData](#dashboardoverviewdata)
21
+ - [DashboardKpiSummary](#dashboardkpisummary)
22
+ - [DashboardAttentionItem](#dashboardattentionitem)
23
+ - [DashboardPerformanceAnalysis](#dashboardperformanceanalysis)
24
+ - [DashboardDutyAnalysis](#dashboarddutyanalysis)
25
+ - [DashboardDutySalaryComparison](#dashboarddutysalarycomparison)
26
+ - [Enums do Pacote](#enums-do-pacote)
27
+ 5. [Compilacao e Publicacao](#5-compilacao-e-publicacao)
28
+
29
+ ---
30
+
31
+ ## 1. Instalacao
32
+
33
+ Instale o pacote via NPM ou Yarn:
34
+
35
+ ```bash
36
+ npm install @careonbrasil/dashboard
37
+ ```
38
+
39
+ ### Dependencias de Peer
40
+
41
+
42
+ | Dependencia | Versao compativel | Finalidade |
43
+ | :--- | :--- | :--- |
44
+ | `@angular/core` | `>=14.0.0 <15.0.0` | Nucleo do Angular |
45
+ | `@angular/common` | `>=14.0.0 <15.0.0` | Diretivas comuns e pipes |
46
+
47
+ ### Dependencias Diretas
48
+
49
+ | Dependencia | Versao compativel | Finalidade |
50
+ | :--- | :--- | :--- |
51
+ | `@careonbrasil/ng-charts` | `^14.0.6` | Biblioteca de graficos SVG CareOn |
52
+ | `tslib` | `^2.3.0` | Runtime helpers do TypeScript |
53
+
54
+ > **Nota de Estilo**: O dashboard utiliza tipografia corporativa padrao Montserrat. Recomenda-se carregar a fonte no projeto hospedeiro (`font-family: 'Montserrat', sans-serif`).
55
+
56
+ ---
57
+
58
+ ## 2. Configuracao
59
+
60
+ Importe o modulo `CareonDashboardModule` no seu modulo Angular (ex: `AppModule` ou modulo de feature):
61
+
62
+ ```typescript
63
+ import { NgModule } from '@angular/core';
64
+ import { BrowserModule } from '@angular/platform-browser';
65
+ import { CareonDashboardModule } from '@careonbrasil/dashboard';
66
+
67
+ import { AppComponent } from './app.component';
68
+
69
+ @NgModule({
70
+ declarations: [AppComponent],
71
+ imports: [
72
+ BrowserModule,
73
+ CareonDashboardModule
74
+ ],
75
+ bootstrap: [AppComponent]
76
+ })
77
+ export class AppModule { }
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 3. Componentes
83
+
84
+ ### 1. Dashboard Principal (`<careon-dashboard>`)
85
+
86
+ Componente central que orquestra a visualizacao analitica completa. E estruturado nas seguintes secoes funcionais:
87
+
88
+ 1. **Cabecalho com Filtros**: Titulo, subtitulo e alternador de periodo reativo (`Hoje`, `Semana`, `Mes`).
89
+ 2. **Cards de Indicadores-Chave (KPIs)**: Vagas Publicadas, Candidatos Inscritos, Curriculos para Avaliar, Media de Candidatos por Vaga e Balanco de Status (Abertas vs. Encerradas) com badges de variacao comparativa.
90
+ 3. **Secao "Precisa da sua atencao"**: Listagem de vagas prioritarias (sem candidatos ou com prazo expirando), com atalho para contato consultivo.
91
+ 4. **Secao "Analise de Desempenho"**: Indicador de engajamento institucional por meio de curva de ondas vetorial (`PerformanceLevel`), status descritivo e recomendacoes praticas.
92
+ 5. **Secao "Analise por Vaga"**: Seletor dropdown para inspecao de vaga individual com linha do tempo de candidaturas, taxa de conversao (grafico donut), funil de atracao e comparativo salarial regional.
93
+ 6. **Secao "Candidaturas por Vaga"**: Grafico comparativo de barras verticais com linha de tendencia destacando a distribuicao de candidatos entre vagas ativas.
94
+
95
+ #### Inputs e Outputs
96
+
97
+ | Propriedade | Tipo | Padrao | Descricao |
98
+ | :--- | :--- | :--- | :--- |
99
+ | `[data]` | `DashboardOverviewData` | `undefined` | Conjunto completo de dados analiticos para alimentar o dashboard. |
100
+ | `[loading]` | `boolean` | `false` | Quando `true`, exibe o esqueleto de carregamento com animacao shimmer. |
101
+ | `[currentPeriod]` | `DashboardPeriod` | `DashboardPeriod.Week` | Periodo temporal ativo (`Today`, `Week`, `Month`). |
102
+ | `[title]` | `string` | `'Dashboard'` | Titulo principal exibido no cabecalho. |
103
+ | `[subtitle]` | `string` | `'Visao geral de recrutamento'` | Subtitulo ou nome da unidade no cabecalho. |
104
+ | `[emptyMessage]` | `string` | `'Nenhum dado registrado para o periodo selecionado.'` | Mensagem do estado vazio quando nao ha dados. |
105
+ | `[consultantPhone]` | `string` | `undefined` | Numero de telefone para o redirecionamento de input. |
106
+ | `[consultantMessage]` | `string` | `''` | Mensagem inicial pre-formatada para o WhatsApp. |
107
+ | `[zeroStateMode]` | `'publish' \| 'basic'` | `'publish'` | Modo de estado vazio das secoes: `'publish'` exibe chamada para publicacao; `'basic'` exibe aviso informativo. |
108
+ | `(periodChange)` | `EventEmitter<DashboardPeriod>` | — | Disparado quando o usuario clica em um filtro de periodo (`Hoje`, `Semana`, `Mes`). |
109
+ | `(attentionItemSelected)` | `EventEmitter<DashboardAttentionItem>` | — | Disparado ao clicar em um item da lista de atencao. |
110
+ | `(dutySelected)` | `EventEmitter<DashboardDutyAnalysis>` | — | Disparado ao selecionar uma vaga no dropdown da secao "Analise por Vaga". |
111
+ | `(publishDuty)` | `EventEmitter<string \| void>` | — | Disparado ao clicar nos botoes "Publicar Vaga" das areas de estado zero (emite o nome da secao de origem). |
112
+ | `(consultantClick)` | `EventEmitter<string>` | — | Disparado ao clicar nos links de suporte "Fale com um consultor" (emite a secao de origem). |
113
+ | `(itemSelected)` | `EventEmitter<DashboardItemSelectedEvent>` | — | Disparado ao selecionar elementos interativos dos graficos integrados. |
114
+
115
+ #### Exemplo de Uso
116
+
117
+ ```html
118
+ <careon-dashboard
119
+ [data]="dashboardData"
120
+ [loading]="isLoading"
121
+ [currentPeriod]="selectedPeriod"
122
+ [title]="'Painel Institucional'"
123
+ [subtitle]="'Hospital Central'"
124
+ (periodChange)="onPeriodChange($event)"
125
+ (attentionItemSelected)="onAttentionItemClick($event)"
126
+ (dutySelected)="onDutyChange($event)"
127
+ (publishDuty)="onPublishDutyClick($event)"
128
+ (consultantClick)="onConsultantClick($event)"
129
+ ></careon-dashboard>
130
+ ```
131
+
132
+ ```typescript
133
+ import { Component, OnInit } from '@angular/core';
134
+ import {
135
+ DashboardOverviewData,
136
+ DashboardPeriod,
137
+ DashboardAttentionItem,
138
+ DashboardDutyAnalysis
139
+ } from '@careonbrasil/dashboard';
140
+
141
+ @Component({
142
+ selector: 'app-analytics-page',
143
+ templateUrl: './analytics-page.component.html'
144
+ })
145
+ export class AnalyticsPageComponent implements OnInit {
146
+ dashboardData?: DashboardOverviewData;
147
+ isLoading = false;
148
+ selectedPeriod: DashboardPeriod = DashboardPeriod.Week;
149
+
150
+ ngOnInit(): void {
151
+ this.loadData(this.selectedPeriod);
152
+ }
153
+
154
+ loadData(period: DashboardPeriod): void {
155
+ this.isLoading = true;
156
+ this.selectedPeriod = period;
157
+ // Exemplo: chamada a servico de dados
158
+ }
159
+
160
+ onPeriodChange(period: DashboardPeriod): void {
161
+ this.loadData(period);
162
+ }
163
+
164
+ onAttentionItemClick(item: DashboardAttentionItem): void {
165
+ console.log('Navegar para vaga com atencao:', item.dutyId);
166
+ }
167
+
168
+ onDutyChange(duty: DashboardDutyAnalysis): void {
169
+ console.log('Vaga selecionada na analise:', duty.title);
170
+ }
171
+
172
+ onPublishDutyClick(section?: string | void): void {
173
+ console.log('Abrir fluxo de publicacao a partir de:', section);
174
+ }
175
+
176
+ onConsultantClick(section: string): void {
177
+ console.log('Contato com consultor acionado em:', section);
178
+ }
179
+ }
180
+ ```
181
+
182
+ ---
183
+
184
+ ### 2. Esqueleto de Carregamento (`<careon-dashboard-skeleton>`)
185
+
186
+ Componente visual independente que replica a disposicao geometrica dos cards de KPIs, listas de atencao e paineis de graficos do dashboard com animacao suave de shimmer. Util para telas com transicoes assincronas de carregamento.
187
+
188
+ ```html
189
+ <careon-dashboard-skeleton></careon-dashboard-skeleton>
190
+ ```
191
+
192
+ ---
193
+
194
+ ### 3. Onda de Performance (`<careon-performance-wave>`)
195
+
196
+ Componente vetorial SVG inline responsavel por desenhar as curvas caracteristicas de desempenho institucional. Pode ser utilizado separadamente em outros contextos institucionais:
197
+
198
+ #### Inputs
199
+
200
+ | Propriedade | Tipo | Padrao | Descricao |
201
+ | :--- | :--- | :--- | :--- |
202
+ | `[level]` | `PerformanceLevel` | `PerformanceLevel.Blue` | Nivel de performance que define a curvatura e as cores do gradiente (`Blue`, `Orange`, `Red`). |
203
+
204
+ #### Exemplo de Uso
205
+
206
+ ```html
207
+ <careon-performance-wave [level]="PerformanceLevel.Orange"></careon-performance-wave>
208
+ ```
209
+
210
+ ---
211
+
212
+ ## 4. Modelos de Dados
213
+
214
+ ### `DashboardOverviewData`
215
+
216
+ Contrato mestre que alimenta o componente principal:
217
+
218
+ ```typescript
219
+ export interface DashboardOverviewData {
220
+ /** Identificador unico da instituicao. */
221
+ institutionId?: number;
222
+ /** Razao social ou nome de exibicao da instituicao. */
223
+ institutionName?: string;
224
+ /** Rotulo do periodo ativo (ex: 'Hoje', 'Semana', 'Mes'). */
225
+ period?: string;
226
+ /** Data inicial do intervalo temporal coberto pelas metricas. */
227
+ startDate?: string | Date;
228
+ /** Data final do intervalo temporal coberto pelas metricas. */
229
+ endDate?: string | Date;
230
+ /** Resumo numerico dos KPIs superiores. */
231
+ kpis?: DashboardKpiSummary;
232
+ /** Pontos para o grafico de linha do tempo de candidaturas. */
233
+ timeline?: TimelinePoint[];
234
+ /** Dados para o grafico de barras comparativas entre vagas. */
235
+ comparison?: ComparisonItem[];
236
+ /** Distribuicao de candidaturas por categoria para grafico donut. */
237
+ distribution?: DonutChartItem[];
238
+ /** Distribuicao de status das vagas (abertas vs. encerradas). */
239
+ dutiesStatus?: StackedBarItem[];
240
+ /** Etapas do funil geral de recrutamento. */
241
+ recruitmentFunnel?: FunnelBarItem[];
242
+ /** Relacao de vagas prioritarias que requerem atencao imediata. */
243
+ attentionItems?: DashboardAttentionItem[];
244
+ /** Diagnostico qualitativo de performance geral com curva de ondas. */
245
+ performanceAnalysis?: DashboardPerformanceAnalysis;
246
+ /** Relacao de vagas detalhadas com metricas individuais para o seletor. */
247
+ vacanciesAnalysis?: DashboardDutyAnalysis[];
248
+ }
249
+ ```
250
+
251
+ ### `DashboardKpiSummary`
252
+
253
+ ```typescript
254
+ export interface DashboardKpiSummary {
255
+ registeredVacancies?: number;
256
+ registeredVacanciesPrevious?: number;
257
+ registeredVacanciesDifference?: number;
258
+
259
+ candidateApplications?: number;
260
+ candidateApplicationsPrevious?: number;
261
+ candidateApplicationsDifference?: number;
262
+
263
+ pendingReviews?: number;
264
+ pendingReviewsPrevious?: number;
265
+ pendingReviewsDifference?: number;
266
+
267
+ averageCandidatesPerVacancy?: number;
268
+ averageCandidatesPerVacancyPrevious?: number;
269
+ averageCandidatesDifference?: number;
270
+
271
+ openVacancies?: number;
272
+ closedVacancies?: number;
273
+ totalVacancies?: number;
274
+ }
275
+ ```
276
+
277
+ ### `DashboardAttentionItem`
278
+
279
+ ```typescript
280
+ export interface DashboardAttentionItem {
281
+ dutyId: number;
282
+ title: string;
283
+ subtitle: string;
284
+ candidatesCount?: number;
285
+ pendingReviewsCount?: number;
286
+ daysOpen?: number;
287
+ hoursOpen?: number;
288
+ isFixedJob?: boolean;
289
+ }
290
+ ```
291
+
292
+ ### `DashboardPerformanceAnalysis`
293
+
294
+ ```typescript
295
+ export interface DashboardPerformanceAnalysis {
296
+ averageConversionRate?: number;
297
+ level?: PerformanceLevel | number;
298
+ highlightTitle?: string;
299
+ description?: string;
300
+ totalVacanciesInPeriod?: number;
301
+ }
302
+ ```
303
+
304
+ ### `DashboardDutyAnalysis`
305
+
306
+ ```typescript
307
+ export interface DashboardDutyAnalysis {
308
+ dutyId: number;
309
+ title: string;
310
+ subtitle: string;
311
+ candidatesCount: number;
312
+ viewsCount: number;
313
+ conversionRate: number;
314
+ timelinePoints: TimelinePoint[];
315
+ conversionDonut?: DonutChartItem[];
316
+ funnelItems?: FunnelBarItem[];
317
+ salaryComparison?: DashboardDutySalaryComparison;
318
+ }
319
+ ```
320
+
321
+ ### `DashboardDutySalaryComparison`
322
+
323
+ ```typescript
324
+ export interface DashboardDutySalaryComparison {
325
+ yourSalary?: number | null;
326
+ regionalAverageSalary?: number | null;
327
+ differencePercentage?: number | null;
328
+ status: DutySalaryStatus;
329
+ highlightTitle: string;
330
+ description: string;
331
+ badgeText?: string | null;
332
+ }
333
+ ```
334
+
335
+ ### Enums do Pacote
336
+
337
+ ```typescript
338
+ export enum DashboardPeriod {
339
+ Today = 'Today',
340
+ Week = 'Week',
341
+ Month = 'Month'
342
+ }
343
+
344
+ export enum PerformanceLevel {
345
+ Blue = 'Blue',
346
+ Orange = 'Orange',
347
+ Red = 'Red'
348
+ }
349
+
350
+ export enum DutySalaryStatus {
351
+ BelowMarket = 'BelowMarket',
352
+ AtMarket = 'AtMarket',
353
+ AboveMarket = 'AboveMarket',
354
+ NotInformed = 'NotInformed',
355
+ InsufficientData = 'InsufficientData'
356
+ }
357
+ ```
358
+
359
+ ---