# CustomFields

![Status](https://img.shields.io/badge/status-stable-brightgreen)

Componente que carrega e renderiza campos customizados dinamicamente a partir da API de customização de campos da plataforma Senior. Realiza chamadas HTTP para obter a configuração dos campos, gera o formulário reativamente e implementa `ControlValueAccessor` e `Validator` para integração completa com formulários Angular.

## Quando usar

- Telas que precisam exibir campos customizados configurados pelo cliente na plataforma Senior
- Formulários de entidades que suportam extensão via campo customizável
- Quando os campos são definidos dinamicamente em runtime via API

## Quando não usar

- Formulários com campos fixos conhecidos em tempo de compilação — use [`DynamicForm`](../dynamic-form/README.md) diretamente
- Ambientes sem conexão com a API da plataforma Senior — o componente depende de autenticação e endpoints externos

## Instalação

```typescript
import { CustomFieldsModule } from '@seniorsistemas/angular-components/custom-fields';

@Component({ standalone: true, imports: [CustomFieldsModule] })
export class MeuComponent {}
```

Requer `LocaleModule.forRoot()` e `TranslateModule.forRoot()` configurados na aplicação.

## Uso básico

```html
<form [formGroup]="form">
  <s-custom-fields
    formControlName="camposCustomizados"
    domain="plataforma"
    service="servico"
    entity="entidade"
  />
</form>
```

```typescript
this.form = new FormGroup({
  camposCustomizados: new FormControl(null),
});
```

## API

### Inputs

| Propriedade | Tipo | Padrão | Obrigatório | Descrição |
|-------------|------|--------|:-----------:|-----------|
| `domain` | `string` | — | Sim | Domínio para buscar os campos na API |
| `service` | `string` | — | Sim | Nome do serviço para identificar os campos |
| `entity` | `string` | — | Sim | Nome da entidade para a qual os campos são carregados |
| `entityObject` | `CustomFieldsResponse` | — | — | Dados pré-carregados para evitar chamada extra à API |
| `invalidErrorLabel` | `string` | `''` | — | Mensagem de erro para campos com valor inválido |
| `customFieldsEndpoint` | `string` | `'platform/field_customization/queries/getEntity'` | — | Endpoint para buscar a configuração dos campos |
| `fileLocationEndpoint` | `string` | `'platform/field_customization/actions/requestUpload'` | — | Endpoint para upload de arquivos em campos blob |
| `requestAccessEndpoint` | `string` | `'platform/field_customization/actions/requestAccess'` | — | Endpoint para acesso a arquivos já enviados |
| `requiredErrorMessage` | `string` | `''` | — | Mensagem de erro para campos obrigatórios não preenchidos |
| `displayTimeInfoSign` | `number` | `0` | — | Tempo em ms após o qual o info-sign de campos data é exibido |
| `showFileUploadDate` | `boolean` | `false` | — | Exibe data de upload nos campos do tipo arquivo |
| `ready$` | `BehaviorSubject<boolean> \| null` | `null` | — | Observable que sinaliza quando iniciar o carregamento dos campos |
| `disableFields` | `boolean` | — | — | Quando `true`, todos os campos são desabilitados |

### Tipos

```typescript
enum CustomFieldType {
  String = 'String',
  Boolean = 'Boolean',
  Integer = 'Integer',
  Double = 'Double',
  Date = 'Date',
  DateTime = 'DateTime',
  LocalDateTime = 'LocalDateTime',
  Time = 'Time',
  Money = 'Money',
  Blob = 'Blob',
  Binary = 'Binary',
  Any = 'Any',
  Enum = 'Enum',
}

interface CustomFieldsResponse {
  entity_: {
    active: boolean;
    fields: FieldFromAPI[];
  };
}
```

## Exemplos

### Uso básico com formulário reativo

```html
<form [formGroup]="form">
  <s-custom-fields
    formControlName="camposCustomizados"
    domain="plataforma"
    service="servico"
    entity="entidade"
    requiredErrorMessage="Campo obrigatório"
  />
</form>
```

### Com dados pré-carregados

```html
<s-custom-fields
  formControlName="camposCustomizados"
  domain="plataforma"
  service="servico"
  entity="entidade"
  [entityObject]="dadosPreCarregados"
/>
```

### Desabilitando campos

```html
<s-custom-fields
  formControlName="camposCustomizados"
  domain="plataforma"
  service="servico"
  entity="entidade"
  [disableFields]="modoSomenteLeitura"
/>
```

## Acessibilidade

- Os campos renderizados são os mesmos do `DynamicForm`, que segue as práticas de acessibilidade dos componentes internos
- Labels e tooltips dos campos são configurados via API de customização da plataforma

## Componentes relacionados

- [`DynamicForm`](../dynamic-form/README.md) — formulário dinâmico base usado internamente
