@praxisui/files-upload 3.0.0-beta.8 → 3.0.0-beta.9
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.
|
@@ -6551,4 +6551,3 @@ const FILES_UPLOAD_AI_CAPABILITIES = {
|
|
|
6551
6551
|
*/
|
|
6552
6552
|
|
|
6553
6553
|
export { BulkUploadResultStatus, ErrorCode, ErrorMapperService, FILES_UPLOAD_AI_CAPABILITIES, FILES_UPLOAD_EN_US, FILES_UPLOAD_ERROR_MESSAGES, FILES_UPLOAD_PT_BR, FILES_UPLOAD_TEXTS, FilesApiClient, PRAXIS_FILES_UPLOAD_COMPONENT_METADATA, PdxFilesUploadFieldComponent, PraxisFilesUpload, PraxisFilesUploadConfigEditor, PresignedUploaderService, ScanStatus, TRANSLATE_LIKE, acceptValidator, createPraxisFilesUploadI18nConfig, getPrimaryErrorItem, isErrorEnvelope, maxBulkSizeValidator, maxFileSizeValidator, maxFilesPerBulkValidator, providePraxisFilesUploadI18n, providePraxisFilesUploadMetadata, resolvePraxisFilesUploadText };
|
|
6554
|
-
//# sourceMappingURL=praxisui-files-upload.mjs.map
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/files-upload",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.9",
|
|
4
4
|
"description": "File upload components and services for Praxis UI with presigned and direct strategies, quotas and rate-limit handling.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^20.0.0",
|
|
7
7
|
"@angular/cdk": "^20.0.0",
|
|
8
8
|
"@angular/core": "^20.0.0",
|
|
9
9
|
"@angular/material": "^20.0.0",
|
|
10
|
-
"@praxisui/core": "^3.0.0-beta.
|
|
11
|
-
"@praxisui/dynamic-fields": "^3.0.0-beta.
|
|
12
|
-
"@praxisui/settings-panel": "^3.0.0-beta.
|
|
10
|
+
"@praxisui/core": "^3.0.0-beta.9",
|
|
11
|
+
"@praxisui/dynamic-fields": "^3.0.0-beta.9",
|
|
12
|
+
"@praxisui/settings-panel": "^3.0.0-beta.9"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"tslib": "^2.3.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"praxisui-files-upload.mjs","sources":["../../../projects/praxis-files-upload/src/lib/types/Errors.ts","../../../projects/praxis-files-upload/src/lib/types/enums/ErrorCode.ts","../../../projects/praxis-files-upload/src/lib/types/enums/ScanStatus.ts","../../../projects/praxis-files-upload/src/lib/types/enums/BulkUploadResultStatus.ts","../../../projects/praxis-files-upload/src/lib/config/config.service.ts","../../../projects/praxis-files-upload/src/lib/config/use-effective-upload-config.ts","../../../projects/praxis-files-upload/src/lib/services/error-catalog.ts","../../../projects/praxis-files-upload/src/lib/i18n/files-upload.en.ts","../../../projects/praxis-files-upload/src/lib/i18n/files-upload.pt.ts","../../../projects/praxis-files-upload/src/lib/i18n/files-upload.i18n.ts","../../../projects/praxis-files-upload/src/lib/config/praxis-files-upload-config-editor.ts","../../../projects/praxis-files-upload/src/lib/validators/file-upload.validators.ts","../../../projects/praxis-files-upload/src/lib/services/drag-proximity.service.ts","../../../projects/praxis-files-upload/src/lib/services/files-api-client.service.ts","../../../projects/praxis-files-upload/src/lib/services/presigned-uploader.service.ts","../../../projects/praxis-files-upload/src/lib/services/error-mapper.service.ts","../../../projects/praxis-files-upload/src/lib/components/files-upload/praxis-files-upload.component.ts","../../../projects/praxis-files-upload/src/lib/components/files-upload-field/pdx-files-upload-field.component.ts","../../../projects/praxis-files-upload/src/lib/praxis-files-upload.metadata.ts","../../../projects/praxis-files-upload/src/lib/ai/files-upload-ai-capabilities.ts","../../../projects/praxis-files-upload/src/lib/index.ts","../../../projects/praxis-files-upload/src/praxisui-files-upload.ts"],"sourcesContent":["import { ApiErrorEnvelope, ApiErrorItem } from './Api';\n\n/** Standard error response shape. */\nexport type ErrorResponse = ApiErrorEnvelope;\n\n/**\n * Some bulk endpoints still return item errors in a flat shape\n * (`{ code, message, details }`) instead of the canonical envelope.\n */\nexport type ErrorLike = ErrorResponse | ApiErrorItem;\n\nfunction isStructuredErrorItem(value: unknown): value is ApiErrorItem {\n return !!value && typeof value === 'object' && 'code' in value && 'message' in value;\n}\n\nexport function isErrorEnvelope(value: unknown): value is ErrorResponse {\n return !!value && typeof value === 'object' && 'status' in value;\n}\n\n/** Resolves the primary structured error item from the backend error payload. */\nexport function getPrimaryErrorItem(\n error: ErrorLike | null | undefined,\n): ApiErrorItem | undefined {\n if (!error) {\n return undefined;\n }\n if (isStructuredErrorItem(error) && !isErrorEnvelope(error)) {\n return error;\n }\n if (!isErrorEnvelope(error)) {\n return undefined;\n }\n const structured = error.errors?.[0];\n if (structured) {\n return structured;\n }\n return undefined;\n}\n","export enum ErrorCode {\n INVALID_FILE_TYPE = 'INVALID_FILE_TYPE',\n FILE_TOO_LARGE = 'FILE_TOO_LARGE',\n NOT_FOUND = 'NOT_FOUND',\n UNAUTHORIZED = 'UNAUTHORIZED',\n RATE_LIMIT_EXCEEDED = 'RATE_LIMIT_EXCEEDED',\n INTERNAL_ERROR = 'INTERNAL_ERROR',\n QUOTA_EXCEEDED = 'QUOTA_EXCEEDED',\n SEC_VIRUS_DETECTED = 'SEC_VIRUS_DETECTED',\n SEC_MALICIOUS_CONTENT = 'SEC_MALICIOUS_CONTENT',\n SEC_DANGEROUS_TYPE = 'SEC_DANGEROUS_TYPE',\n FMT_MAGIC_MISMATCH = 'FMT_MAGIC_MISMATCH',\n FMT_CORRUPTED = 'FMT_CORRUPTED',\n FMT_UNSUPPORTED = 'FMT_UNSUPPORTED',\n SYS_STORAGE_ERROR = 'SYS_STORAGE_ERROR',\n SYS_SERVICE_DOWN = 'SYS_SERVICE_DOWN',\n SYS_RATE_LIMIT = 'SYS_RATE_LIMIT'\n}\n\n","export enum ScanStatus {\n PENDING = 'PENDING',\n SCANNING = 'SCANNING',\n CLEAN = 'CLEAN',\n INFECTED = 'INFECTED',\n FAILED = 'FAILED'\n}\n\n","/** Result status for each file in a bulk upload operation. */\nexport enum BulkUploadResultStatus {\n SUCCESS = 'SUCCESS',\n FAILED = 'FAILED'\n}\n\n","import { Injectable } from '@angular/core';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Observable, of, throwError } from 'rxjs';\nimport { map, catchError } from 'rxjs/operators';\nimport { EffectiveUploadConfig } from '../types/Config';\nimport { ApiSuccessEnvelope } from '../types';\n\ninterface CacheEntry {\n etag?: string;\n timestamp: number;\n data: EffectiveUploadConfig;\n}\n\n/**\n * Service responsible for retrieving the effective upload configuration\n * from the backend and caching it for a short period (60s).\n */\n@Injectable({ providedIn: 'root' })\nexport class ConfigService {\n private cache = new Map<string, CacheEntry>();\n\n constructor(private http: HttpClient) {}\n\n private buildCacheKey(\n baseUrl: string,\n headers: Record<string, string>,\n ): string {\n const headerKey = JSON.stringify(headers);\n return `${baseUrl}|${headerKey}`;\n }\n\n /**\n * Fetches the effective configuration from the server.\n * @param baseUrl Base URL for the files API (default: `/api/files`).\n * @param headersProvider Optional callback providing additional headers such as tenant/user.\n */\n getEffectiveConfig(\n baseUrl = '/api/files',\n headersProvider?: () => Record<string, string>,\n ): Observable<EffectiveUploadConfig> {\n const now = Date.now();\n const headersObj = headersProvider ? headersProvider() : {};\n const key = this.buildCacheKey(baseUrl, headersObj);\n const entry = this.cache.get(key);\n\n if (entry && now - entry.timestamp < 60_000) {\n return of(entry.data);\n }\n\n const url = `${baseUrl}/config`;\n if (entry?.etag) {\n headersObj['If-None-Match'] = entry.etag;\n }\n const headers = new HttpHeaders(headersObj);\n\n return this.http\n .get<ApiSuccessEnvelope<EffectiveUploadConfig>>(url, {\n observe: 'response',\n headers,\n })\n .pipe(\n map((resp) => {\n const etag = resp.headers.get('ETag') || undefined;\n if (resp.status === 304 && entry) {\n entry.timestamp = now;\n this.cache.set(key, entry);\n return entry.data;\n }\n const data = resp.body?.data as EffectiveUploadConfig;\n this.cache.set(key, { etag, data, timestamp: now });\n return data;\n }),\n catchError((err) => {\n // HttpClient trata 304 como erro; reaproveitamos cache existente\n if (err?.status === 304 && entry) {\n entry.timestamp = Date.now();\n this.cache.set(key, entry);\n return of(entry.data);\n }\n return throwError(() => err);\n }),\n );\n }\n}\n","import { inject, Signal, signal } from '@angular/core';\nimport { ConfigService } from './config.service';\nimport { EffectiveUploadConfig } from '../types/Config';\n\n/** State returned by {@link useEffectiveUploadConfig}. */\nexport interface EffectiveConfigState {\n loading: Signal<boolean>;\n data: Signal<EffectiveUploadConfig | undefined>;\n error: Signal<unknown | undefined>;\n context: Signal<Record<string, string> | undefined>;\n refetch: () => void;\n}\n\n/**\n * Angular composable that retrieves the effective upload configuration\n * and exposes reactive signals for template binding.\n */\nexport function useEffectiveUploadConfig(\n baseUrl?: string,\n headersProvider?: () => Record<string, string>,\n): EffectiveConfigState {\n const service = inject(ConfigService, { optional: true });\n const loading = signal<boolean>(!!service);\n const data = signal<EffectiveUploadConfig | undefined>(undefined);\n const error = signal<unknown | undefined>(undefined);\n const context = signal<Record<string, string> | undefined>(undefined);\n\n const fetch = () => {\n if (!service) {\n loading.set(false);\n return;\n }\n loading.set(true);\n const headers = headersProvider ? headersProvider() : undefined;\n context.set(headers);\n service\n .getEffectiveConfig(baseUrl, () => headers ?? {})\n .subscribe({\n next: (cfg) => {\n data.set(cfg);\n error.set(undefined);\n loading.set(false);\n },\n error: (err) => {\n error.set(err);\n loading.set(false);\n },\n });\n };\n\n if (service) fetch(); else loading.set(false);\n\n return { loading, data, error, context, refetch: fetch };\n}\n","// Catálogo central de erros e metadados de apresentação\nimport { ErrorCode } from '../types';\n\nexport type ErrorSeverity = 'info' | 'warn' | 'error';\nexport type ErrorCategory =\n | 'validacao'\n | 'seguranca'\n | 'armazenamento'\n | 'rede'\n | 'limites'\n | 'conflito'\n | 'config'\n | 'operacional';\nexport type ErrorPhase =\n | 'cliente'\n | 'pre-upload'\n | 'analise'\n | 'armazenamento'\n | 'pos-processo'\n | 'lote'\n | 'operacional';\n\nexport interface ErrorMeta {\n title: string;\n description?: string;\n userAction?: string;\n severity?: ErrorSeverity;\n category?: ErrorCategory;\n phase?: ErrorPhase;\n retriable?: boolean;\n docsLink?: string;\n}\n\n// Catálogo padrão por código (aceita string genérica para cobrir códigos não presentes no enum)\nconst DEFAULT_CATALOG: Record<string, ErrorMeta> = {\n [ErrorCode.FILE_TOO_LARGE]: {\n title: 'Arquivo muito grande',\n category: 'validacao',\n phase: 'pre-upload',\n severity: 'error',\n userAction: 'Reduza o tamanho ou aumente o limite permitido.',\n },\n [ErrorCode.INVALID_FILE_TYPE]: {\n title: 'Tipo de arquivo inválido',\n category: 'validacao',\n phase: 'pre-upload',\n severity: 'error',\n userAction: 'Ajuste a extensão/MIME conforme a política.',\n },\n [ErrorCode.FMT_UNSUPPORTED]: {\n title: 'Formato não suportado',\n category: 'validacao',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.FMT_MAGIC_MISMATCH]: {\n title: 'Conteúdo incompatível',\n category: 'validacao',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.FMT_CORRUPTED]: {\n title: 'Arquivo corrompido',\n category: 'validacao',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.SEC_DANGEROUS_TYPE]: {\n title: 'Tipo perigoso bloqueado',\n category: 'seguranca',\n phase: 'pre-upload',\n severity: 'error',\n },\n [ErrorCode.SEC_VIRUS_DETECTED]: {\n title: 'Vírus detectado',\n category: 'seguranca',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.SEC_MALICIOUS_CONTENT]: {\n title: 'Malware detectado',\n category: 'seguranca',\n phase: 'analise',\n severity: 'error',\n },\n [ErrorCode.SYS_STORAGE_ERROR]: {\n title: 'Erro de armazenamento',\n category: 'armazenamento',\n phase: 'armazenamento',\n severity: 'error',\n retriable: true,\n },\n [ErrorCode.RATE_LIMIT_EXCEEDED]: {\n title: 'Limite de taxa excedido',\n category: 'limites',\n phase: 'operacional',\n severity: 'warn',\n retriable: true,\n },\n [ErrorCode.SYS_RATE_LIMIT]: {\n title: 'Limite de requisições excedido',\n category: 'limites',\n phase: 'operacional',\n severity: 'warn',\n retriable: true,\n },\n [ErrorCode.QUOTA_EXCEEDED]: {\n title: 'Cota excedida',\n category: 'limites',\n phase: 'operacional',\n severity: 'warn',\n },\n [ErrorCode.INTERNAL_ERROR]: {\n title: 'Erro interno',\n category: 'operacional',\n phase: 'operacional',\n severity: 'error',\n retriable: true,\n },\n [ErrorCode.UNAUTHORIZED]: {\n title: 'Não autorizado',\n category: 'operacional',\n phase: 'operacional',\n severity: 'error',\n },\n [ErrorCode.NOT_FOUND]: {\n title: 'Não encontrado',\n category: 'operacional',\n phase: 'operacional',\n severity: 'warn',\n },\n\n // Alias de mensagens de config (strings do backend fora do enum)\n INVALID_TYPE: { title: 'Tipo de arquivo inválido', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n UNSUPPORTED_FILE_TYPE: { title: 'Tipo não suportado', category: 'validacao', phase: 'analise', severity: 'error' },\n MAGIC_NUMBER_MISMATCH: { title: 'Assinatura incompatível', category: 'validacao', phase: 'analise', severity: 'error' },\n CORRUPTED_FILE: { title: 'Arquivo corrompido', category: 'validacao', phase: 'analise', severity: 'error' },\n DANGEROUS_FILE_TYPE: { title: 'Tipo perigoso bloqueado', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n DANGEROUS_EXECUTABLE: { title: 'Executável bloqueado', category: 'seguranca', phase: 'analise', severity: 'error' },\n MALWARE_DETECTED: { title: 'Malware detectado', category: 'seguranca', phase: 'analise', severity: 'error' },\n VIRUS_DETECTED: { title: 'Vírus detectado', category: 'seguranca', phase: 'analise', severity: 'error' },\n FILE_STORE_ERROR: { title: 'Erro ao armazenar arquivo', category: 'armazenamento', phase: 'armazenamento', severity: 'error', retriable: true },\n FILE_STORAGE_FAILED: { title: 'Falha ao armazenar arquivo', category: 'armazenamento', phase: 'armazenamento', severity: 'error', retriable: true },\n VIRUS_SCAN_ERROR: { title: 'Erro no antivírus', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n VIRUS_SCAN_FAILED: { title: 'Antivírus falhou', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n VIRUS_SCAN_UNAVAILABLE: { title: 'Antivírus indisponível', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n IO_ERROR: { title: 'Erro de entrada/saída', category: 'rede', phase: 'operacional', severity: 'error', retriable: true },\n UPLOAD_TIMEOUT: { title: 'Tempo esgotado no upload', category: 'operacional', phase: 'operacional', severity: 'warn', retriable: true },\n BULK_UPLOAD_TIMEOUT: { title: 'Tempo esgotado no upload em lote', category: 'operacional', phase: 'lote', severity: 'warn', retriable: true },\n BULK_UPLOAD_CANCELLED: { title: 'Upload em lote cancelado', category: 'operacional', phase: 'lote', severity: 'warn' },\n MIME_TYPE_MISMATCH: { title: 'MIME não corresponde', category: 'validacao', phase: 'analise', severity: 'error' },\n FILE_STRUCTURE_ERROR: { title: 'Estrutura inválida', category: 'validacao', phase: 'analise', severity: 'error' },\n STRUCTURE_VALIDATION_FAILED: { title: 'Validação de estrutura falhou', category: 'validacao', phase: 'analise', severity: 'error' },\n EMPTY_FILE: { title: 'Arquivo vazio', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n INVALID_JSON_OPTIONS: { title: 'JSON de opções inválido', category: 'config', phase: 'operacional', severity: 'error' },\n OPCOES_JSON_INVALIDAS: { title: 'JSON de opções inválido', category: 'config', phase: 'operacional', severity: 'error', userAction: 'Corrija a sintaxe do JSON enviado no campo options.' },\n EMPTY_FILENAME: { title: 'Nome do arquivo obrigatório', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n FILE_ANALYSIS_ERROR: { title: 'Erro na análise do arquivo', category: 'operacional', phase: 'analise', severity: 'error', retriable: true },\n CONFIGURATION_ERROR: { title: 'Erro de configuração', category: 'config', phase: 'operacional', severity: 'error' },\n SECURITY_VIOLATION: { title: 'Violação de segurança', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n CONFLICT_POLICY_ERROR: { title: 'Erro de política de conflito', category: 'conflito', phase: 'operacional', severity: 'error' },\n CONFLICT_POLICY_SKIP: { title: 'Arquivo ignorado por política', category: 'conflito', phase: 'operacional', severity: 'info' },\n FILE_EXISTS: { title: 'Arquivo já existe', category: 'conflito', phase: 'operacional', severity: 'warn' },\n PATH_TRAVERSAL: { title: 'Path traversal detectado', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n INSUFFICIENT_STORAGE: { title: 'Sem espaço em disco', category: 'armazenamento', phase: 'armazenamento', severity: 'error' },\n SIGNATURE_MISMATCH: { title: 'Assinatura não corresponde', category: 'validacao', phase: 'analise', severity: 'error' },\n SUSPICIOUS_STRUCTURE: { title: 'Estrutura suspeita', category: 'seguranca', phase: 'analise', severity: 'warn' },\n INVALID_FILE_SIZE_CONFIG: { title: 'Configuração de tamanho inválida', category: 'config', phase: 'operacional', severity: 'error' },\n USER_CANCELLED: { title: 'Upload cancelado pelo usuário', category: 'operacional', phase: 'operacional', severity: 'info' },\n SYSTEM_POLICY_BLOCKED: { title: 'Bloqueado por política do sistema', category: 'operacional', phase: 'operacional', severity: 'error' },\n SUSPICIOUS_EXTENSION_BLOCKED: { title: 'Extensão suspeita bloqueada', category: 'seguranca', phase: 'pre-upload', severity: 'warn' },\n DANGEROUS_SCRIPT: { title: 'Script perigoso detectado', category: 'seguranca', phase: 'analise', severity: 'error' },\n BATCH_SIZE_EXCEEDED: { title: 'Quantidade por lote excedida', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n EMBEDDED_EXECUTABLE: { title: 'Executável incorporado', category: 'seguranca', phase: 'analise', severity: 'warn' },\n INVALID_PATH: { title: 'Caminho inválido', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n FAILED_TO_ANALYZE: { title: 'Falha ao analisar', category: 'operacional', phase: 'analise', severity: 'error', retriable: true },\n ZIP_BOMB_DETECTED: { title: 'Possível zip bomb', category: 'seguranca', phase: 'analise', severity: 'error' },\n UNKNOWN_ERROR: { title: 'Erro desconhecido', category: 'operacional', phase: 'operacional', severity: 'error', retriable: true },\n\n // Aliases PT-BR adicionais para os códigos específicos do backend\n ARQUIVO_VAZIO: { title: 'Arquivo vazio', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n ASSINATURA_INVALIDA: { title: 'Assinatura não corresponde', category: 'validacao', phase: 'analise', severity: 'error' },\n ARQUIVO_EXECUTAVEL_PERIGOSO: { title: 'Executável bloqueado', category: 'seguranca', phase: 'analise', severity: 'error' },\n SCRIPT_PERIGOSO: { title: 'Script perigoso detectado', category: 'seguranca', phase: 'analise', severity: 'error' },\n ARQUIVO_CORROMPIDO: { title: 'Arquivo corrompido', category: 'validacao', phase: 'analise', severity: 'error' },\n ESTRUTURA_SUSPEITA: { title: 'Estrutura suspeita', category: 'seguranca', phase: 'analise', severity: 'warn' },\n MAGIC_NUMBER_INCOMPATIVEL: { title: 'Assinatura incompatível', category: 'validacao', phase: 'analise', severity: 'error' },\n TIPO_ARQUIVO_PERIGOSO: { title: 'Tipo perigoso bloqueado', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n SCANNER_VIRUS_INDISPONIVEL: { title: 'Antivírus indisponível', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n EXTENSAO_SUSPEITA_BLOQUEADA: { title: 'Extensão suspeita bloqueada', category: 'seguranca', phase: 'pre-upload', severity: 'warn' },\n TIPO_NAO_SUPORTADO: { title: 'Tipo não suportado', category: 'validacao', phase: 'analise', severity: 'error' },\n NOME_ARQUIVO_INVALIDO: { title: 'Nome de arquivo inválido', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n TEMPO_ESGOTADO_UPLOAD: { title: 'Tempo esgotado no upload', category: 'operacional', phase: 'operacional', severity: 'warn', retriable: true },\n TEMPO_ESGOTADO_UPLOAD_LOTE: { title: 'Tempo esgotado no upload em lote', category: 'operacional', phase: 'lote', severity: 'warn', retriable: true },\n ERRO_IO: { title: 'Erro de entrada/saída', category: 'rede', phase: 'operacional', severity: 'error', retriable: true },\n ESPAÇO_INSUFICIENTE: { title: 'Sem espaço em disco', category: 'armazenamento', phase: 'armazenamento', severity: 'error' },\n UPLOAD_LOTE_CANCELADO: { title: 'Upload em lote cancelado', category: 'operacional', phase: 'lote', severity: 'warn' },\n UPLOAD_CANCELADO_USUARIO: { title: 'Upload cancelado pelo usuário', category: 'operacional', phase: 'operacional', severity: 'info' },\n TAMANHO_LOTE_EXCEDIDO: { title: 'Quantidade por lote excedida', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n TIPO_MIME_INCOMPATIVEL: { title: 'MIME não corresponde', category: 'validacao', phase: 'analise', severity: 'error' },\n VIOLACAO_SEGURANCA: { title: 'Violação de segurança', category: 'seguranca', phase: 'pre-upload', severity: 'error' },\n ERRO_DESCONHECIDO: { title: 'Erro interno do sistema', category: 'operacional', phase: 'operacional', severity: 'error' },\n BLOQUEADO_POLITICA_SISTEMA: { title: 'Bloqueado por política do sistema', category: 'operacional', phase: 'operacional', severity: 'error' },\n FALHA_ESCANEAMENTO_VIRUS: { title: 'Antivírus falhou', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n FALHA_VALIDACAO_ESTRUTURA: { title: 'Validação de estrutura falhou', category: 'validacao', phase: 'analise', severity: 'error' },\n CONFIGURACAO_TAMANHO_INVALIDA: { title: 'Configuração de tamanho inválida', category: 'config', phase: 'operacional', severity: 'error' },\n FALHA_ARMAZENAMENTO: { title: 'Falha ao armazenar arquivo', category: 'armazenamento', phase: 'armazenamento', severity: 'error', retriable: true },\n ERRO_ARMAZENAMENTO_ARQUIVO: { title: 'Erro ao armazenar arquivo', category: 'armazenamento', phase: 'armazenamento', severity: 'error', retriable: true },\n NOME_ARQUIVO_VAZIO: { title: 'Nome do arquivo obrigatório', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n ERRO_ANALISE_ARQUIVO: { title: 'Erro na análise do arquivo', category: 'operacional', phase: 'analise', severity: 'error', retriable: true },\n ERRO_ESTRUTURA_ARQUIVO: { title: 'Erro na estrutura do arquivo', category: 'validacao', phase: 'analise', severity: 'error' },\n CAMINHO_INVALIDO: { title: 'Caminho inválido', category: 'validacao', phase: 'pre-upload', severity: 'error' },\n ERRO_CONFIGURACAO: { title: 'Erro de configuração', category: 'config', phase: 'operacional', severity: 'error' },\n ERRO_ESCANEAMENTO_VIRUS: { title: 'Erro no antivírus', category: 'seguranca', phase: 'analise', severity: 'warn', retriable: true },\n FALHA_ANALISE_ARQUIVO: { title: 'Falha ao analisar', category: 'operacional', phase: 'analise', severity: 'error', retriable: true },\n ERRO_POLITICA_CONFLITO: { title: 'Erro de política de conflito', category: 'conflito', phase: 'operacional', severity: 'error' },\n POLITICA_CONFLITO_IGNORAR: { title: 'Arquivo ignorado por política', category: 'conflito', phase: 'operacional', severity: 'info' },\n};\n\nexport function getErrorMeta(code: string): ErrorMeta {\n return DEFAULT_CATALOG[code] ?? { title: code };\n}\n","export const FILES_UPLOAD_EN_US = {\n 'praxis.filesUpload.editor.summary.ariaLabel':\n 'Executive summary for the current configuration',\n 'praxis.filesUpload.editor.summary.title': 'Executive summary',\n 'praxis.filesUpload.editor.summary.intro':\n 'Review the operational impact here before going through all configuration groups.',\n 'praxis.filesUpload.editor.summary.strategy': 'Strategy',\n 'praxis.filesUpload.editor.summary.experience': 'Experience',\n 'praxis.filesUpload.editor.summary.limits': 'Limits',\n 'praxis.filesUpload.editor.summary.server': 'Server',\n 'praxis.filesUpload.editor.risks.title': 'Risks and attention points',\n 'praxis.filesUpload.editor.risks.none':\n 'No evident operational risk in the current configuration.',\n 'praxis.filesUpload.editor.tabs.behavior': 'Behavior',\n 'praxis.filesUpload.editor.tabs.interface': 'Interface',\n 'praxis.filesUpload.editor.tabs.validation': 'Validation',\n 'praxis.filesUpload.editor.tabs.messages': 'Messages',\n 'praxis.filesUpload.editor.tabs.server': 'Server',\n 'praxis.filesUpload.editor.tabs.json': 'JSON',\n 'praxis.filesUpload.editor.behavior.intro.title':\n 'Upload strategy and cadence',\n 'praxis.filesUpload.editor.behavior.intro.body':\n 'Define how the user starts the upload and how the batch behaves in terms of parallelism and retries.',\n 'praxis.filesUpload.editor.behavior.strategy.label': 'Upload strategy',\n 'praxis.filesUpload.editor.behavior.strategy.direct':\n 'Direct (standard HTTP)',\n 'praxis.filesUpload.editor.behavior.strategy.presign':\n 'Presigned URL (S3/GCS)',\n 'praxis.filesUpload.editor.behavior.strategy.auto':\n 'Automatic (tries presigned first and falls back to direct)',\n 'praxis.filesUpload.editor.behavior.strategy.hint':\n 'How files will be sent to the server.',\n 'praxis.filesUpload.editor.behavior.bulk.title':\n 'Configurable options — Batch',\n 'praxis.filesUpload.editor.behavior.bulk.note':\n 'Use parallelism and retries in moderation. In enterprise environments these controls affect throughput, perceived experience and backend load.',\n 'praxis.filesUpload.editor.behavior.bulk.parallel':\n 'Parallel uploads',\n 'praxis.filesUpload.editor.behavior.bulk.parallelHint':\n 'How many files to send at the same time.',\n 'praxis.filesUpload.editor.behavior.bulk.retryCount': 'Retry count',\n 'praxis.filesUpload.editor.behavior.bulk.retryCountHint':\n 'Automatic attempts in case of failure.',\n 'praxis.filesUpload.editor.behavior.bulk.retryBackoff':\n 'Retry interval (ms)',\n 'praxis.filesUpload.editor.behavior.bulk.retryBackoffHint':\n 'Wait time between attempts.',\n 'praxis.filesUpload.editor.interface.intro.title':\n 'Visible experience for the user',\n 'praxis.filesUpload.editor.interface.intro.body':\n 'Configure density, dropzone, metadata and list details. Prioritize operational clarity before enabling advanced capabilities.',\n 'praxis.filesUpload.editor.interface.section.title':\n 'Configurable options — Interface',\n 'praxis.filesUpload.editor.interface.section.note':\n 'This section controls the component ergonomics. Changes here affect discoverability, usage effort and upload completion rate.',\n 'praxis.filesUpload.editor.interface.showDropzone':\n 'Show drop area',\n 'praxis.filesUpload.editor.interface.showProgress':\n 'Show progress bar',\n 'praxis.filesUpload.editor.interface.showConflictPolicySelector':\n 'Allow choosing the conflict policy',\n 'praxis.filesUpload.editor.interface.manualUpload':\n 'Require clicking \"Upload\" (manual mode)',\n 'praxis.filesUpload.editor.interface.dense': 'Compact layout',\n 'praxis.filesUpload.editor.interface.accept':\n 'Allowed types (accept)',\n 'praxis.filesUpload.editor.shared.optionalTag': 'optional',\n 'praxis.filesUpload.editor.shared.csvOptional':\n 'Comma-separated list (optional).',\n 'praxis.filesUpload.editor.placeholders.accept': 'e.g.: pdf,jpg,png',\n 'praxis.filesUpload.editor.placeholders.detailsFields':\n 'e.g.: id,fileName,contentType',\n 'praxis.filesUpload.editor.placeholders.allowedExtensions':\n 'e.g.: pdf,docx,xlsx',\n 'praxis.filesUpload.editor.placeholders.acceptMimeTypes':\n 'e.g.: application/pdf,image/png',\n 'praxis.filesUpload.editor.placeholders.targetDirectory':\n 'e.g.: documents/invoices',\n 'praxis.filesUpload.editor.placeholders.successSingle':\n 'e.g.: File uploaded successfully',\n 'praxis.filesUpload.editor.placeholders.successBulk':\n 'e.g.: Upload completed',\n 'praxis.filesUpload.editor.placeholders.tenantValue':\n 'e.g.: demo-tenant',\n 'praxis.filesUpload.editor.placeholders.userValue': 'e.g.: 42',\n 'praxis.filesUpload.editor.interface.metadataForm':\n 'Show metadata form (JSON)',\n 'praxis.filesUpload.editor.interface.dropzone.title':\n 'Dropzone (proximity expansion)',\n 'praxis.filesUpload.editor.interface.dropzone.expandOnProximity':\n 'Expand when a file gets close during drag',\n 'praxis.filesUpload.editor.interface.dropzone.proximity':\n 'Proximity radius (px)',\n 'praxis.filesUpload.editor.interface.dropzone.mode':\n 'Expansion mode',\n 'praxis.filesUpload.editor.interface.dropzone.mode.overlay':\n 'Overlay (recommended)',\n 'praxis.filesUpload.editor.interface.dropzone.mode.inline': 'Inline',\n 'praxis.filesUpload.editor.interface.dropzone.height':\n 'Overlay height (px)',\n 'praxis.filesUpload.editor.interface.dropzone.debounce':\n 'Drag debounce (ms)',\n 'praxis.filesUpload.editor.interface.list.title':\n 'List and details',\n 'praxis.filesUpload.editor.interface.list.collapseAfter':\n 'Collapse after (items)',\n 'praxis.filesUpload.editor.interface.list.detailsMode':\n 'Details mode',\n 'praxis.filesUpload.editor.interface.list.detailsMode.auto':\n 'Automatic',\n 'praxis.filesUpload.editor.interface.list.detailsMode.card':\n 'Card (overlay)',\n 'praxis.filesUpload.editor.interface.list.detailsMode.sidesheet':\n 'Side-sheet',\n 'praxis.filesUpload.editor.interface.list.detailsWidth':\n 'Maximum card width (px)',\n 'praxis.filesUpload.editor.interface.list.showTechnical':\n 'Show technical details by default',\n 'praxis.filesUpload.editor.interface.list.detailsFields':\n 'Metadata fields (whitelist)',\n 'praxis.filesUpload.editor.interface.list.detailsFieldsHint':\n 'Comma-separated list; empty = all.',\n 'praxis.filesUpload.editor.interface.list.anchor': 'Overlay anchor',\n 'praxis.filesUpload.editor.interface.list.anchor.item': 'Item',\n 'praxis.filesUpload.editor.interface.list.anchor.field': 'Field',\n 'praxis.filesUpload.editor.validation.intro.title':\n 'Acceptance rules and operational behavior',\n 'praxis.filesUpload.editor.validation.intro.body':\n 'Separate local UX validation from effective backend rules. Review destructive options carefully.',\n 'praxis.filesUpload.editor.validation.local.title':\n 'Configurable options — Validation',\n 'praxis.filesUpload.editor.validation.local.note':\n 'Local limits improve immediate feedback, but do not replace the effective server policy.',\n 'praxis.filesUpload.editor.validation.local.maxFileSize':\n 'Maximum file size (bytes)',\n 'praxis.filesUpload.editor.validation.local.maxFileSizeHint':\n 'Client-side validation limit (optional).',\n 'praxis.filesUpload.editor.validation.local.maxFilesPerBulk':\n 'Max files per batch',\n 'praxis.filesUpload.editor.validation.local.maxBulkSize':\n 'Maximum batch size (bytes)',\n 'praxis.filesUpload.editor.validation.backend.title':\n 'Configurable options — Backend',\n 'praxis.filesUpload.editor.validation.backend.note':\n 'These options directly impact the server contract and operational governance. Treat changes here as policy decisions, not only UI changes.',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy':\n 'Conflict policy (default)',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.rename':\n 'Rename automatically',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.unique':\n 'Generate unique name',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.overwrite':\n 'Overwrite existing file',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.skip':\n 'Skip if already exists',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.error':\n 'Fail (error)',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicyHint':\n 'What to do when the file name already exists.',\n 'praxis.filesUpload.editor.validation.backend.overwriteWarn':\n 'Warning: OVERWRITE may replace existing files.',\n 'praxis.filesUpload.editor.validation.backend.strictValidation':\n 'Strict validation (backend)',\n 'praxis.filesUpload.editor.validation.backend.maxUploadSizeMb':\n 'Maximum size per file (MB)',\n 'praxis.filesUpload.editor.validation.backend.maxUploadSizeMbHint':\n 'Validated by the backend (1–500 MB).',\n 'praxis.filesUpload.editor.validation.backend.allowedExtensions':\n 'Allowed extensions',\n 'praxis.filesUpload.editor.validation.backend.acceptMimeTypes':\n 'Accepted MIME types',\n 'praxis.filesUpload.editor.validation.backend.targetDirectory':\n 'Target directory',\n 'praxis.filesUpload.editor.validation.backend.enableVirusScanning':\n 'Force antivirus (when available)',\n 'praxis.filesUpload.editor.validation.backend.virusWarn':\n 'May impact upload performance and latency.',\n 'praxis.filesUpload.editor.validation.quotas.title':\n 'Configurable options — Quotas (UI)',\n 'praxis.filesUpload.editor.validation.quotas.showWarnings':\n 'Show quota warnings',\n 'praxis.filesUpload.editor.validation.quotas.blockOnExceed':\n 'Block on quota exceed',\n 'praxis.filesUpload.editor.validation.rateLimit.title':\n 'Configurable options — Rate Limit (UI)',\n 'praxis.filesUpload.editor.validation.rateLimit.note':\n 'Prefer a small number of automatic retries. More attempts reduce immediate friction, but may hide real environment bottlenecks.',\n 'praxis.filesUpload.editor.validation.rateLimit.showBanner':\n 'Show banner when the limit is reached',\n 'praxis.filesUpload.editor.validation.rateLimit.autoRetry':\n 'Retry automatically',\n 'praxis.filesUpload.editor.validation.rateLimit.maxAutoRetry':\n 'Maximum automatic retries',\n 'praxis.filesUpload.editor.validation.rateLimit.baseBackoff':\n 'Base retry interval (ms)',\n 'praxis.filesUpload.editor.validation.batch.title':\n 'Configurable options — Batch execution',\n 'praxis.filesUpload.editor.validation.batch.failFast':\n 'Stop on the first error (fail-fast)',\n 'praxis.filesUpload.editor.messages.intro.title':\n 'Messages oriented to operations',\n 'praxis.filesUpload.editor.messages.intro.body':\n 'Adjust the text shown to the end user. Prioritize clarity, consistency and actionable language.',\n 'praxis.filesUpload.editor.messages.section.title':\n 'Configurable options — Messages (UI)',\n 'praxis.filesUpload.editor.messages.section.note':\n 'Short and objective messages work better in high-frequency contexts. Use this group to adapt the interface voice to your environment.',\n 'praxis.filesUpload.editor.messages.successSingle':\n 'Success (single)',\n 'praxis.filesUpload.editor.messages.successBulk':\n 'Success (batch)',\n 'praxis.filesUpload.editor.tabs.headers': 'Headers',\n 'praxis.filesUpload.editor.headers.intro.title':\n 'Tenant and user context',\n 'praxis.filesUpload.editor.headers.intro.body':\n 'Use headers to query the effective server configuration in the same context the component will use in production.',\n 'praxis.filesUpload.editor.headers.section.title':\n 'Configurable options — Headers (query)',\n 'praxis.filesUpload.editor.headers.tenantHeader':\n 'Tenant header',\n 'praxis.filesUpload.editor.headers.tenantValue':\n 'Tenant value',\n 'praxis.filesUpload.editor.headers.userHeader': 'User header',\n 'praxis.filesUpload.editor.headers.userValue': 'User value',\n 'praxis.filesUpload.editor.errors.INVALID_FILE_TYPE':\n 'Invalid file type',\n 'praxis.filesUpload.editor.errors.FILE_TOO_LARGE':\n 'File too large',\n 'praxis.filesUpload.editor.errors.NOT_FOUND': 'File not found',\n 'praxis.filesUpload.editor.errors.UNAUTHORIZED':\n 'Unauthorized access',\n 'praxis.filesUpload.editor.errors.RATE_LIMIT_EXCEEDED':\n 'Request limit exceeded',\n 'praxis.filesUpload.editor.errors.INTERNAL_ERROR':\n 'Internal server error',\n 'praxis.filesUpload.editor.errors.QUOTA_EXCEEDED':\n 'Upload quota exceeded',\n 'praxis.filesUpload.editor.errors.SEC_VIRUS_DETECTED':\n 'Virus detected in file',\n 'praxis.filesUpload.editor.errors.SEC_MALICIOUS_CONTENT':\n 'Malicious content detected',\n 'praxis.filesUpload.editor.errors.SEC_DANGEROUS_TYPE':\n 'Dangerous file type',\n 'praxis.filesUpload.editor.errors.FMT_MAGIC_MISMATCH':\n 'File content does not match type',\n 'praxis.filesUpload.editor.errors.FMT_CORRUPTED': 'Corrupted file',\n 'praxis.filesUpload.editor.errors.FMT_UNSUPPORTED':\n 'Unsupported format',\n 'praxis.filesUpload.editor.errors.SYS_STORAGE_ERROR':\n 'Storage error',\n 'praxis.filesUpload.editor.errors.SYS_SERVICE_DOWN':\n 'Service unavailable',\n 'praxis.filesUpload.editor.errors.SYS_RATE_LIMIT':\n 'System request limit exceeded',\n 'praxis.filesUpload.editor.server.summary.maxPerFile':\n 'Max per file (MB):',\n 'praxis.filesUpload.editor.server.summary.strictValidation':\n 'Strict validation:',\n 'praxis.filesUpload.editor.server.summary.antivirus': 'Antivirus:',\n 'praxis.filesUpload.editor.server.summary.conflictPolicy':\n 'Default name conflict:',\n 'praxis.filesUpload.editor.server.summary.mimeTypes':\n 'Accepted MIME types:',\n 'praxis.filesUpload.editor.server.summary.bulkFailFast':\n 'Default bulk fail-fast:',\n 'praxis.filesUpload.editor.server.summary.rateLimit': 'Rate limit:',\n 'praxis.filesUpload.editor.server.summary.quotas': 'Quotas:',\n 'praxis.filesUpload.editor.server.summary.server': 'Server:',\n 'praxis.filesUpload.editor.server.mutableOptionsText':\n 'The options above that can be changed via payload are: name conflict, strict validation, maximum size (MB), accepted extensions/MIME, target directory, antivirus, custom metadata and fail-fast (in bulk).',\n 'praxis.filesUpload.editor.server.intro.title':\n 'Effective contract returned by the backend',\n 'praxis.filesUpload.editor.server.intro.body':\n 'This tab is the source of truth for the active environment. Compare the server summary with what was configured in the previous forms.',\n 'praxis.filesUpload.editor.server.readonly': 'Server (read-only)',\n 'praxis.filesUpload.editor.server.reload': 'Reload from server',\n 'praxis.filesUpload.editor.server.baseUrlHint':\n 'Set baseUrl on the parent component to query /api/files/config.',\n 'praxis.filesUpload.editor.server.loading':\n 'Loading server configuration...',\n 'praxis.filesUpload.editor.server.loadError': 'Failed to load:',\n 'praxis.filesUpload.editor.server.summaryTitle':\n 'Active configuration summary',\n 'praxis.filesUpload.editor.server.viewJson': 'View JSON',\n 'praxis.filesUpload.editor.server.copyJson': 'Copy JSON',\n 'praxis.filesUpload.editor.server.mutableOptionsPrefix':\n 'The options above that can be changed via payload are:',\n 'praxis.filesUpload.editor.json.intro.title': 'Advanced mode',\n 'praxis.filesUpload.editor.json.intro.body':\n 'Edit the raw payload only when you need fine-grained control. Changes here require stricter review and validation.',\n 'praxis.filesUpload.editor.json.note':\n 'JSON is a low-level view of the configuration. Prefer the guided tabs whenever possible to reduce human error and keep the configuration auditable.',\n 'praxis.filesUpload.editor.snackbar.configCopied':\n 'Configuration copied',\n 'praxis.filesUpload.editor.snackbar.invalidJson': 'Invalid JSON',\n 'praxis.filesUpload.editor.json.invalid':\n 'Invalid JSON: check the syntax.',\n 'praxis.filesUpload.editor.summary.strategy.presign':\n 'Upload with presigned URL',\n 'praxis.filesUpload.editor.summary.strategy.auto':\n 'Automatic strategy selection',\n 'praxis.filesUpload.editor.summary.strategy.direct':\n 'Direct upload to backend',\n 'praxis.filesUpload.editor.summary.strategy.presignDetail':\n 'Depends on a presign endpoint and usually reduces direct load on the main server.',\n 'praxis.filesUpload.editor.summary.strategy.autoDetail':\n 'Tries presign first and falls back to the direct flow when needed.',\n 'praxis.filesUpload.editor.summary.strategy.directDetail':\n 'Simpler flow to integrate and diagnose in controlled environments.',\n 'praxis.filesUpload.editor.summary.experience.manual':\n 'Manual review before upload',\n 'praxis.filesUpload.editor.summary.experience.compact':\n 'Selection guided by compact field',\n 'praxis.filesUpload.editor.summary.experience.dropzone':\n 'Immediate upload with visible dropzone',\n 'praxis.filesUpload.editor.summary.experience.progressVisible':\n 'visible progress',\n 'praxis.filesUpload.editor.summary.experience.progressHidden':\n 'no progress bar',\n 'praxis.filesUpload.editor.summary.experience.conflictVisible':\n 'conflict selection available',\n 'praxis.filesUpload.editor.summary.experience.conflictHidden':\n 'conflict policy hidden',\n 'praxis.filesUpload.editor.summary.experience.metadataVisible':\n 'editable metadata in the UI',\n 'praxis.filesUpload.editor.summary.experience.metadataHidden':\n 'no extra form',\n 'praxis.filesUpload.editor.summary.limits.titleValue':\n '{maxFile} MB per file • {maxBulk} items per batch',\n 'praxis.filesUpload.editor.summary.limits.detailValue':\n '{parallel} parallel upload(s) • {mode}',\n 'praxis.filesUpload.editor.summary.limits.failFast':\n 'fail-fast enabled',\n 'praxis.filesUpload.editor.summary.limits.partialFailures':\n 'partial failures allowed',\n 'praxis.filesUpload.editor.summary.server.titleValue':\n 'Default conflict: {conflict}',\n 'praxis.filesUpload.editor.summary.server.detailValue':\n '{strict} • {virus}',\n 'praxis.filesUpload.editor.summary.server.strictOn':\n 'strict validation enabled',\n 'praxis.filesUpload.editor.summary.server.strictOff':\n 'strict validation disabled',\n 'praxis.filesUpload.editor.summary.server.virusOn':\n 'forced antivirus',\n 'praxis.filesUpload.editor.summary.server.virusOff':\n 'optional/inactive antivirus',\n 'praxis.filesUpload.editor.risks.overwrite.title':\n 'Overwrite enabled',\n 'praxis.filesUpload.editor.risks.overwrite.detail':\n 'Existing files may be silently replaced if the backend accepts the operation.',\n 'praxis.filesUpload.editor.risks.virus.title':\n 'Antivirus may increase latency',\n 'praxis.filesUpload.editor.risks.virus.detail':\n 'Forced scanning improves security, but may impact throughput and response time.',\n 'praxis.filesUpload.editor.risks.failFast.title':\n 'Batch stops on the first error',\n 'praxis.filesUpload.editor.risks.failFast.detail':\n 'Users may need to resend valid items when the first error interrupts the rest of the batch.',\n 'praxis.filesUpload.editor.risks.retry.title':\n 'Aggressive automatic retry',\n 'praxis.filesUpload.editor.risks.retry.detail':\n 'Too many automatic retries may increase perceived wait time and operational noise.',\n 'praxis.filesUpload.editor.risks.manual.title':\n 'Flow requires manual action',\n 'praxis.filesUpload.editor.risks.manual.detail':\n 'Suitable for review, but adds upload steps and may reduce completion rate in simple scenarios.',\n 'praxis.filesUpload.settingsAriaLabel': 'Open settings',\n 'praxis.filesUpload.dropzoneLabel': 'Drag files or',\n 'praxis.filesUpload.dropzoneButton': 'select',\n 'praxis.filesUpload.conflictPolicyLabel': 'Conflict policy',\n 'praxis.filesUpload.metadataLabel': 'Metadata (JSON)',\n 'praxis.filesUpload.progressAriaLabel': 'Upload progress',\n 'praxis.filesUpload.rateLimitBanner': 'Rate limit exceeded. Try again at',\n 'praxis.filesUpload.settingsTitle': 'Files Upload Configuration',\n 'praxis.filesUpload.statusSuccess': 'Uploaded',\n 'praxis.filesUpload.statusError': 'Error',\n 'praxis.filesUpload.invalidMetadata': 'Invalid metadata.',\n 'praxis.filesUpload.genericUploadError': 'File upload error.',\n 'praxis.filesUpload.acceptError': 'File type not allowed.',\n 'praxis.filesUpload.maxFileSizeError': 'File exceeds the maximum size.',\n 'praxis.filesUpload.maxFilesPerBulkError': 'Too many files selected.',\n 'praxis.filesUpload.maxBulkSizeError': 'Total files size exceeded.',\n 'praxis.filesUpload.serviceUnavailable': 'Upload service unavailable.',\n 'praxis.filesUpload.baseUrlMissing':\n 'Base URL not configured. Provide [baseUrl] to enable uploads.',\n 'praxis.filesUpload.selectFiles': 'Select file(s)',\n 'praxis.filesUpload.remove': 'Remove',\n 'praxis.filesUpload.moreActions': 'More actions',\n 'praxis.filesUpload.policySummaryAction': 'Information about upload policies',\n 'praxis.filesUpload.retry': 'Retry',\n 'praxis.filesUpload.download': 'Download',\n 'praxis.filesUpload.copyLink': 'Copy link',\n 'praxis.filesUpload.details': 'Details',\n 'praxis.filesUpload.detailsMetadata': 'Metadata',\n 'praxis.filesUpload.dropzoneHint':\n 'Drag and drop files here or click to select',\n 'praxis.filesUpload.dropzoneProximityHint': 'Drop here to upload',\n 'praxis.filesUpload.placeholder': 'Select or drop files…',\n 'praxis.filesUpload.partialUploadError':\n 'Partial upload completed with failures in part of the batch.',\n 'praxis.filesUpload.presignMetadataMissing':\n 'Presigned upload completed without file metadata.',\n 'praxis.filesUpload.fieldChipAria': 'Additional files selected',\n 'praxis.filesUpload.fieldPendingCountSuffix': 'file(s) selected',\n 'praxis.filesUpload.removePendingFile': 'Remove selected file',\n 'praxis.filesUpload.fieldPolicyTypes': 'Types',\n 'praxis.filesUpload.fieldPolicyMaxPerFile': 'Max/file',\n 'praxis.filesUpload.fieldPolicyMaxItems': 'Max/items',\n 'praxis.filesUpload.fieldPolicyNotConfigured': 'Not configured',\n 'praxis.filesUpload.sizeUnitBytes': 'Bytes',\n 'praxis.filesUpload.sizeUnitKB': 'KB',\n 'praxis.filesUpload.sizeUnitMB': 'MB',\n 'praxis.filesUpload.sizeUnitGB': 'GB',\n 'praxis.filesUpload.sizeUnitTB': 'TB',\n 'praxis.filesUpload.errors.INVALID_FILE_TYPE': 'Invalid file type.',\n 'praxis.filesUpload.errors.FILE_TOO_LARGE': 'File is too large.',\n 'praxis.filesUpload.errors.NOT_FOUND': 'File not found.',\n 'praxis.filesUpload.errors.UNAUTHORIZED': 'Unauthorized request.',\n 'praxis.filesUpload.errors.RATE_LIMIT_EXCEEDED': 'Request limit exceeded.',\n 'praxis.filesUpload.errors.INTERNAL_ERROR': 'Internal server error.',\n 'praxis.filesUpload.errors.QUOTA_EXCEEDED': 'Quota exceeded.',\n 'praxis.filesUpload.errors.SEC_VIRUS_DETECTED': 'Virus detected in file.',\n 'praxis.filesUpload.errors.SEC_MALICIOUS_CONTENT':\n 'Malicious content detected.',\n 'praxis.filesUpload.errors.SEC_DANGEROUS_TYPE': 'Dangerous file type.',\n 'praxis.filesUpload.errors.FMT_MAGIC_MISMATCH': 'File content does not match the declared format.',\n 'praxis.filesUpload.errors.FMT_CORRUPTED': 'Corrupted file.',\n 'praxis.filesUpload.errors.FMT_UNSUPPORTED': 'Unsupported file format.',\n 'praxis.filesUpload.errors.SYS_STORAGE_ERROR': 'Storage error.',\n 'praxis.filesUpload.errors.SYS_SERVICE_DOWN': 'Service unavailable.',\n 'praxis.filesUpload.errors.SYS_RATE_LIMIT': 'Request limit exceeded.',\n 'praxis.filesUpload.errors.ARQUIVO_MUITO_GRANDE': 'File is too large.',\n 'praxis.filesUpload.errors.TIPO_ARQUIVO_INVALIDO': 'Invalid file type.',\n 'praxis.filesUpload.errors.TIPO_MIDIA_NAO_SUPORTADO': 'Unsupported media type.',\n 'praxis.filesUpload.errors.CAMPO_OBRIGATORIO_AUSENTE': 'Required field is missing.',\n 'praxis.filesUpload.errors.OPCOES_JSON_INVALIDAS': 'Invalid JSON options.',\n 'praxis.filesUpload.errors.ARGUMENTO_INVALIDO': 'Invalid argument.',\n 'praxis.filesUpload.errors.NAO_AUTORIZADO': 'Authentication required.',\n 'praxis.filesUpload.errors.ERRO_INTERNO': 'Internal server error.',\n 'praxis.filesUpload.errors.LIMITE_TAXA_EXCEDIDO': 'Rate limit exceeded.',\n 'praxis.filesUpload.errors.COTA_EXCEDIDA': 'Quota exceeded.',\n 'praxis.filesUpload.errors.ARQUIVO_JA_EXISTE': 'File already exists.',\n 'praxis.filesUpload.errors.INVALID_JSON_OPTIONS': 'Invalid JSON options.',\n 'praxis.filesUpload.errors.EMPTY_FILENAME': 'File name is required.',\n 'praxis.filesUpload.errors.FILE_EXISTS': 'File already exists.',\n 'praxis.filesUpload.errors.PATH_TRAVERSAL': 'Path traversal detected.',\n 'praxis.filesUpload.errors.INSUFFICIENT_STORAGE': 'Insufficient storage.',\n 'praxis.filesUpload.errors.UPLOAD_TIMEOUT': 'Upload timed out.',\n 'praxis.filesUpload.errors.BULK_UPLOAD_TIMEOUT': 'Bulk upload timed out.',\n 'praxis.filesUpload.errors.BULK_UPLOAD_CANCELLED': 'Bulk upload cancelled.',\n 'praxis.filesUpload.errors.USER_CANCELLED': 'Upload cancelled by user.',\n 'praxis.filesUpload.errors.UNKNOWN_ERROR': 'Unknown error.',\n 'praxis.filesUpload.fieldPendingSummary': 'Files ready to upload',\n 'praxis.filesUpload.fieldSelectedSummary': 'Selected file',\n 'praxis.filesUpload.fieldSelectedPlural': 'files attached',\n 'praxis.filesUpload.fieldEmptySummary': 'No file selected',\n 'praxis.filesUpload.fieldErrorSummary': 'Fix the error to continue',\n 'praxis.filesUpload.fieldActionUpload': 'Upload selected files',\n 'praxis.filesUpload.fieldActionUploadShort': 'Upload',\n 'praxis.filesUpload.fieldActionCancel': 'Cancel current selection',\n 'praxis.filesUpload.fieldActionCancelShort': 'Cancel',\n 'praxis.filesUpload.fieldActionSelect': 'Select file(s)',\n 'praxis.filesUpload.fieldActionClear': 'Clear',\n 'praxis.filesUpload.fieldInfoAction': 'Information',\n 'praxis.filesUpload.fieldMoreActions': 'More actions',\n 'praxis.filesUpload.fieldPendingAriaSuffix': 'files ready to upload',\n 'praxis.filesUpload.selectedOverlayAriaLabel': 'Selected files',\n 'praxis.filesUpload.selectedOverlayTitle': 'Selected',\n 'praxis.filesUpload.bulkSummaryTotal': 'Total',\n 'praxis.filesUpload.bulkSummarySuccess': 'Success',\n 'praxis.filesUpload.bulkSummaryFailed': 'Failed',\n 'praxis.filesUpload.resultMetaIdLabel': 'ID',\n 'praxis.filesUpload.resultMetaTypeLabel': 'Type',\n 'praxis.filesUpload.resultMetaSizeLabel': 'Size',\n 'praxis.filesUpload.resultMetaUploadedAtLabel': 'Uploaded at',\n 'praxis.filesUpload.policySummaryAny': 'any',\n 'praxis.filesUpload.policySummaryNotConfigured': '—',\n 'praxis.filesUpload.policySummaryTypesLabel': 'Types',\n 'praxis.filesUpload.policySummaryMaxPerFileLabel': 'Max. per file',\n 'praxis.filesUpload.policySummaryQuantityLabel': 'Qty',\n 'praxis.filesUpload.showAll': 'Show all',\n 'praxis.filesUpload.showLess': 'Show less',\n};\n","export const FILES_UPLOAD_PT_BR = {\n 'praxis.filesUpload.editor.summary.ariaLabel':\n 'Resumo executivo da configuracao atual',\n 'praxis.filesUpload.editor.summary.title': 'Resumo executivo',\n 'praxis.filesUpload.editor.summary.intro':\n 'Revise aqui o impacto operacional antes de percorrer todos os grupos de configuracao.',\n 'praxis.filesUpload.editor.summary.strategy': 'Estrategia',\n 'praxis.filesUpload.editor.summary.experience': 'Experiencia',\n 'praxis.filesUpload.editor.summary.limits': 'Limites',\n 'praxis.filesUpload.editor.summary.server': 'Servidor',\n 'praxis.filesUpload.editor.risks.title': 'Riscos e atencao',\n 'praxis.filesUpload.editor.risks.none':\n 'Nenhum risco operacional evidente na configuracao atual.',\n 'praxis.filesUpload.editor.tabs.behavior': 'Comportamento',\n 'praxis.filesUpload.editor.tabs.interface': 'Interface',\n 'praxis.filesUpload.editor.tabs.validation': 'Validacoes',\n 'praxis.filesUpload.editor.tabs.messages': 'Mensagens',\n 'praxis.filesUpload.editor.tabs.server': 'Servidor',\n 'praxis.filesUpload.editor.tabs.json': 'JSON',\n 'praxis.filesUpload.editor.behavior.intro.title':\n 'Estrategia e cadencia do envio',\n 'praxis.filesUpload.editor.behavior.intro.body':\n 'Defina aqui como o usuario inicia o upload e como o lote se comporta em termos de paralelismo e retentativa.',\n 'praxis.filesUpload.editor.behavior.strategy.label': 'Estrategia de envio',\n 'praxis.filesUpload.editor.behavior.strategy.direct':\n 'Direto (HTTP padrao)',\n 'praxis.filesUpload.editor.behavior.strategy.presign':\n 'URL pre-assinada (S3/GCS)',\n 'praxis.filesUpload.editor.behavior.strategy.auto':\n 'Automatico (tenta pre-assinada e volta ao direto)',\n 'praxis.filesUpload.editor.behavior.strategy.hint':\n 'Como os arquivos serao enviados ao servidor.',\n 'praxis.filesUpload.editor.behavior.bulk.title':\n 'Opcoes configuraveis — Lote',\n 'praxis.filesUpload.editor.behavior.bulk.note':\n 'Use paralelismo e retries com moderacao. Em ambientes corporativos, esses controles afetam throughput, experiencia percebida e carga no backend.',\n 'praxis.filesUpload.editor.behavior.bulk.parallel':\n 'Uploads paralelos',\n 'praxis.filesUpload.editor.behavior.bulk.parallelHint':\n 'Quantos arquivos enviar ao mesmo tempo.',\n 'praxis.filesUpload.editor.behavior.bulk.retryCount':\n 'Numero de tentativas',\n 'praxis.filesUpload.editor.behavior.bulk.retryCountHint':\n 'Tentativas automaticas em caso de falha.',\n 'praxis.filesUpload.editor.behavior.bulk.retryBackoff':\n 'Intervalo entre tentativas (ms)',\n 'praxis.filesUpload.editor.behavior.bulk.retryBackoffHint':\n 'Tempo de espera entre tentativas.',\n 'praxis.filesUpload.editor.interface.intro.title':\n 'Experiencia visivel para o usuario',\n 'praxis.filesUpload.editor.interface.intro.body':\n 'Configure densidade, dropzone, metadados e detalhes da lista. Priorize clareza operacional antes de habilitar recursos avancados.',\n 'praxis.filesUpload.editor.interface.section.title':\n 'Opcoes configuraveis — Interface',\n 'praxis.filesUpload.editor.interface.section.note':\n 'Esta secao controla a ergonomia do componente. Mudancas aqui afetam descoberta, esforco de uso e taxa de conclusao do envio.',\n 'praxis.filesUpload.editor.interface.showDropzone':\n 'Exibir area de soltar',\n 'praxis.filesUpload.editor.interface.showProgress':\n 'Exibir barra de progresso',\n 'praxis.filesUpload.editor.interface.showConflictPolicySelector':\n 'Permitir escolher a politica de conflito',\n 'praxis.filesUpload.editor.interface.manualUpload':\n 'Exigir clique em \"Enviar\" (modo manual)',\n 'praxis.filesUpload.editor.interface.dense': 'Layout compacto',\n 'praxis.filesUpload.editor.interface.accept':\n 'Tipos permitidos (accept)',\n 'praxis.filesUpload.editor.shared.optionalTag': 'opcional',\n 'praxis.filesUpload.editor.shared.csvOptional':\n 'Lista separada por virgula (opcional).',\n 'praxis.filesUpload.editor.placeholders.accept': 'ex.: pdf,jpg,png',\n 'praxis.filesUpload.editor.placeholders.detailsFields':\n 'ex.: id,fileName,contentType',\n 'praxis.filesUpload.editor.placeholders.allowedExtensions':\n 'ex.: pdf,docx,xlsx',\n 'praxis.filesUpload.editor.placeholders.acceptMimeTypes':\n 'ex.: application/pdf,image/png',\n 'praxis.filesUpload.editor.placeholders.targetDirectory':\n 'ex.: documentos/notas',\n 'praxis.filesUpload.editor.placeholders.successSingle':\n 'ex.: Arquivo enviado com sucesso',\n 'praxis.filesUpload.editor.placeholders.successBulk':\n 'ex.: Upload concluido',\n 'praxis.filesUpload.editor.placeholders.tenantValue':\n 'ex.: demo-tenant',\n 'praxis.filesUpload.editor.placeholders.userValue': 'ex.: 42',\n 'praxis.filesUpload.editor.interface.metadataForm':\n 'Exibir formulario de metadados (JSON)',\n 'praxis.filesUpload.editor.interface.dropzone.title':\n 'Dropzone (expansao por proximidade)',\n 'praxis.filesUpload.editor.interface.dropzone.expandOnProximity':\n 'Expandir ao aproximar arquivo durante arraste',\n 'praxis.filesUpload.editor.interface.dropzone.proximity':\n 'Raio de proximidade (px)',\n 'praxis.filesUpload.editor.interface.dropzone.mode':\n 'Modo de expansao',\n 'praxis.filesUpload.editor.interface.dropzone.mode.overlay':\n 'Overlay (recomendado)',\n 'praxis.filesUpload.editor.interface.dropzone.mode.inline': 'Inline',\n 'praxis.filesUpload.editor.interface.dropzone.height':\n 'Altura do overlay (px)',\n 'praxis.filesUpload.editor.interface.dropzone.debounce':\n 'Debounce de arraste (ms)',\n 'praxis.filesUpload.editor.interface.list.title':\n 'Lista e detalhes',\n 'praxis.filesUpload.editor.interface.list.collapseAfter':\n 'Colapsar apos (itens)',\n 'praxis.filesUpload.editor.interface.list.detailsMode':\n 'Modo de detalhes',\n 'praxis.filesUpload.editor.interface.list.detailsMode.auto':\n 'Automatico',\n 'praxis.filesUpload.editor.interface.list.detailsMode.card':\n 'Card (overlay)',\n 'praxis.filesUpload.editor.interface.list.detailsMode.sidesheet':\n 'Side-sheet',\n 'praxis.filesUpload.editor.interface.list.detailsWidth':\n 'Largura maxima do card (px)',\n 'praxis.filesUpload.editor.interface.list.showTechnical':\n 'Mostrar detalhes tecnicos por padrao',\n 'praxis.filesUpload.editor.interface.list.detailsFields':\n 'Campos de metadados (whitelist)',\n 'praxis.filesUpload.editor.interface.list.detailsFieldsHint':\n 'Lista separada por virgula; vazio = todos.',\n 'praxis.filesUpload.editor.interface.list.anchor':\n 'Ancora do overlay',\n 'praxis.filesUpload.editor.interface.list.anchor.item': 'Item',\n 'praxis.filesUpload.editor.interface.list.anchor.field': 'Campo',\n 'praxis.filesUpload.editor.validation.intro.title':\n 'Regras de aceite e comportamento operacional',\n 'praxis.filesUpload.editor.validation.intro.body':\n 'Separe mentalmente o que e validacao de UX local do que e regra efetiva de backend. Revise com atencao as opcoes destrutivas.',\n 'praxis.filesUpload.editor.validation.local.title':\n 'Opcoes configuraveis — Validacoes',\n 'praxis.filesUpload.editor.validation.local.note':\n 'Limites locais melhoram feedback imediato, mas nao substituem a politica efetiva do servidor.',\n 'praxis.filesUpload.editor.validation.local.maxFileSize':\n 'Tamanho maximo do arquivo (bytes)',\n 'praxis.filesUpload.editor.validation.local.maxFileSizeHint':\n 'Limite de validacao no cliente (opcional).',\n 'praxis.filesUpload.editor.validation.local.maxFilesPerBulk':\n 'Max. arquivos por lote',\n 'praxis.filesUpload.editor.validation.local.maxBulkSize':\n 'Tamanho maximo do lote (bytes)',\n 'praxis.filesUpload.editor.validation.backend.title':\n 'Opcoes configuraveis — Backend',\n 'praxis.filesUpload.editor.validation.backend.note':\n 'Estas opcoes tem impacto direto no contrato com o servidor e em governanca operacional. Trate alteracoes aqui como decisao de politica, nao apenas de interface.',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy':\n 'Politica de conflito (padrao)',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.rename':\n 'Renomear automaticamente',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.unique':\n 'Gerar nome unico',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.overwrite':\n 'Sobrescrever arquivo existente',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.skip':\n 'Pular se ja existir',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicy.error':\n 'Falhar (erro)',\n 'praxis.filesUpload.editor.validation.backend.conflictPolicyHint':\n 'O que fazer quando o nome do arquivo ja existe.',\n 'praxis.filesUpload.editor.validation.backend.overwriteWarn':\n 'Atencao: OVERWRITE pode sobrescrever arquivos existentes.',\n 'praxis.filesUpload.editor.validation.backend.strictValidation':\n 'Validacao rigorosa (backend)',\n 'praxis.filesUpload.editor.validation.backend.maxUploadSizeMb':\n 'Tamanho max. por arquivo (MB)',\n 'praxis.filesUpload.editor.validation.backend.maxUploadSizeMbHint':\n 'Validado pelo backend (1–500 MB).',\n 'praxis.filesUpload.editor.validation.backend.allowedExtensions':\n 'Extensoes permitidas',\n 'praxis.filesUpload.editor.validation.backend.acceptMimeTypes':\n 'MIME types aceitos',\n 'praxis.filesUpload.editor.validation.backend.targetDirectory':\n 'Diretorio destino',\n 'praxis.filesUpload.editor.validation.backend.enableVirusScanning':\n 'Forcar antivirus (quando disponivel)',\n 'praxis.filesUpload.editor.validation.backend.virusWarn':\n 'Pode impactar desempenho e latencia de upload.',\n 'praxis.filesUpload.editor.validation.quotas.title':\n 'Opcoes configuraveis — Quotas (UI)',\n 'praxis.filesUpload.editor.validation.quotas.showWarnings':\n 'Exibir avisos de cota',\n 'praxis.filesUpload.editor.validation.quotas.blockOnExceed':\n 'Bloquear ao exceder cota',\n 'praxis.filesUpload.editor.validation.rateLimit.title':\n 'Opcoes configuraveis — Rate Limit (UI)',\n 'praxis.filesUpload.editor.validation.rateLimit.note':\n 'Prefira poucos retries automaticos. Mais tentativas aliviam atrito imediato, mas podem mascarar gargalos reais do ambiente.',\n 'praxis.filesUpload.editor.validation.rateLimit.showBanner':\n 'Exibir banner quando atingir o limite',\n 'praxis.filesUpload.editor.validation.rateLimit.autoRetry':\n 'Tentar novamente automaticamente',\n 'praxis.filesUpload.editor.validation.rateLimit.maxAutoRetry':\n 'Maximo de tentativas automaticas',\n 'praxis.filesUpload.editor.validation.rateLimit.baseBackoff':\n 'Intervalo base entre tentativas (ms)',\n 'praxis.filesUpload.editor.validation.batch.title':\n 'Opcoes configuraveis — Execucao do lote',\n 'praxis.filesUpload.editor.validation.batch.failFast':\n 'Parar no primeiro erro (fail-fast)',\n 'praxis.filesUpload.editor.messages.intro.title':\n 'Mensagens orientadas a operacao',\n 'praxis.filesUpload.editor.messages.intro.body':\n 'Ajuste o texto exibido ao usuario final. Priorize clareza, consistencia e linguagem acionavel.',\n 'praxis.filesUpload.editor.messages.section.title':\n 'Opcoes configuraveis — Mensagens (UI)',\n 'praxis.filesUpload.editor.messages.section.note':\n 'Mensagens curtas e objetivas funcionam melhor em contextos de alta frequencia. Use este grupo para adequar a voz da interface ao seu ambiente.',\n 'praxis.filesUpload.editor.messages.successSingle':\n 'Sucesso (individual)',\n 'praxis.filesUpload.editor.messages.successBulk':\n 'Sucesso (em lote)',\n 'praxis.filesUpload.editor.tabs.headers': 'Cabecalhos',\n 'praxis.filesUpload.editor.headers.intro.title':\n 'Contexto de tenant e usuario',\n 'praxis.filesUpload.editor.headers.intro.body':\n 'Use cabecalhos para consultar configuracao efetiva do servidor no mesmo contexto que o componente usara em producao.',\n 'praxis.filesUpload.editor.headers.section.title':\n 'Opcoes configuraveis — Cabecalhos (consulta)',\n 'praxis.filesUpload.editor.headers.tenantHeader':\n 'Cabecalho de tenant',\n 'praxis.filesUpload.editor.headers.tenantValue':\n 'Valor do tenant',\n 'praxis.filesUpload.editor.headers.userHeader':\n 'Cabecalho de usuario',\n 'praxis.filesUpload.editor.headers.userValue':\n 'Valor do usuario',\n 'praxis.filesUpload.editor.errors.INVALID_FILE_TYPE':\n 'Tipo de arquivo invalido',\n 'praxis.filesUpload.editor.errors.FILE_TOO_LARGE':\n 'Arquivo muito grande',\n 'praxis.filesUpload.editor.errors.NOT_FOUND':\n 'Arquivo nao encontrado',\n 'praxis.filesUpload.editor.errors.UNAUTHORIZED':\n 'Acesso nao autorizado',\n 'praxis.filesUpload.editor.errors.RATE_LIMIT_EXCEEDED':\n 'Limite de requisicoes excedido',\n 'praxis.filesUpload.editor.errors.INTERNAL_ERROR':\n 'Erro interno do servidor',\n 'praxis.filesUpload.editor.errors.QUOTA_EXCEEDED':\n 'Cota de upload excedida',\n 'praxis.filesUpload.editor.errors.SEC_VIRUS_DETECTED':\n 'Virus detectado no arquivo',\n 'praxis.filesUpload.editor.errors.SEC_MALICIOUS_CONTENT':\n 'Conteudo malicioso detectado',\n 'praxis.filesUpload.editor.errors.SEC_DANGEROUS_TYPE':\n 'Tipo de arquivo perigoso',\n 'praxis.filesUpload.editor.errors.FMT_MAGIC_MISMATCH':\n 'Conteudo do arquivo incompativel',\n 'praxis.filesUpload.editor.errors.FMT_CORRUPTED':\n 'Arquivo corrompido',\n 'praxis.filesUpload.editor.errors.FMT_UNSUPPORTED':\n 'Formato nao suportado',\n 'praxis.filesUpload.editor.errors.SYS_STORAGE_ERROR':\n 'Erro no armazenamento',\n 'praxis.filesUpload.editor.errors.SYS_SERVICE_DOWN':\n 'Servico indisponivel',\n 'praxis.filesUpload.editor.errors.SYS_RATE_LIMIT':\n 'Limite de requisicoes (sistema) excedido',\n 'praxis.filesUpload.editor.server.summary.maxPerFile':\n 'Max por arquivo (MB):',\n 'praxis.filesUpload.editor.server.summary.strictValidation':\n 'Validacao rigorosa:',\n 'praxis.filesUpload.editor.server.summary.antivirus':\n 'Antivirus:',\n 'praxis.filesUpload.editor.server.summary.conflictPolicy':\n 'Conflito de nome (padrao):',\n 'praxis.filesUpload.editor.server.summary.mimeTypes':\n 'MIME aceitos:',\n 'praxis.filesUpload.editor.server.summary.bulkFailFast':\n 'Bulk - fail-fast padrao:',\n 'praxis.filesUpload.editor.server.summary.rateLimit':\n 'Rate limit:',\n 'praxis.filesUpload.editor.server.summary.quotas': 'Quotas:',\n 'praxis.filesUpload.editor.server.summary.server': 'Servidor:',\n 'praxis.filesUpload.editor.server.mutableOptionsText':\n 'As opcoes acima que podem ser alteradas via payload sao: conflito de nome, validacao rigorosa, tamanho maximo (MB), extensoes/MIME aceitos, diretorio destino, antivirus, metadados personalizados e fail-fast (no bulk).',\n 'praxis.filesUpload.editor.server.intro.title':\n 'Contrato efetivo retornado pelo backend',\n 'praxis.filesUpload.editor.server.intro.body':\n 'Esta aba e a fonte de verdade do ambiente ativo. Compare o resumo do servidor com o que foi configurado nos formularios anteriores.',\n 'praxis.filesUpload.editor.server.readonly':\n 'Servidor (somente leitura)',\n 'praxis.filesUpload.editor.server.reload': 'Recarregar do servidor',\n 'praxis.filesUpload.editor.server.baseUrlHint':\n 'Defina a baseUrl no componente pai para consultar /api/files/config.',\n 'praxis.filesUpload.editor.server.loading':\n 'Carregando configuracao do servidor...',\n 'praxis.filesUpload.editor.server.loadError': 'Falha ao carregar:',\n 'praxis.filesUpload.editor.server.summaryTitle':\n 'Resumo da configuracao ativa',\n 'praxis.filesUpload.editor.server.viewJson': 'Ver JSON',\n 'praxis.filesUpload.editor.server.copyJson': 'Copiar JSON',\n 'praxis.filesUpload.editor.server.mutableOptionsPrefix':\n 'As opcoes acima que podem ser alteradas via payload sao:',\n 'praxis.filesUpload.editor.json.intro.title': 'Modo avancado',\n 'praxis.filesUpload.editor.json.intro.body':\n 'Edite o payload bruto apenas quando precisar de controle fino. Alteracoes aqui exigem mais rigor de revisao e validacao.',\n 'praxis.filesUpload.editor.json.note':\n 'O JSON e uma visao de baixo nivel da configuracao. Prefira as abas guiadas sempre que possivel para reduzir erro humano e manter a configuracao auditavel.',\n 'praxis.filesUpload.editor.snackbar.configCopied':\n 'Configuracao copiada',\n 'praxis.filesUpload.editor.snackbar.invalidJson': 'JSON invalido',\n 'praxis.filesUpload.editor.json.invalid':\n 'JSON invalido: verifique a sintaxe.',\n 'praxis.filesUpload.editor.summary.strategy.presign':\n 'Upload com URL pre-assinada',\n 'praxis.filesUpload.editor.summary.strategy.auto':\n 'Selecao automatica da estrategia',\n 'praxis.filesUpload.editor.summary.strategy.direct':\n 'Upload direto ao backend',\n 'praxis.filesUpload.editor.summary.strategy.presignDetail':\n 'Depende de endpoint de presign e costuma reduzir carga direta no servidor principal.',\n 'praxis.filesUpload.editor.summary.strategy.autoDetail':\n 'Tenta presign primeiro e volta ao fluxo direto quando necessario.',\n 'praxis.filesUpload.editor.summary.strategy.directDetail':\n 'Fluxo mais simples de integrar e diagnosticar em ambientes controlados.',\n 'praxis.filesUpload.editor.summary.experience.manual':\n 'Revisao manual antes do envio',\n 'praxis.filesUpload.editor.summary.experience.compact':\n 'Selecao orientada por campo compacto',\n 'praxis.filesUpload.editor.summary.experience.dropzone':\n 'Envio imediato com dropzone visivel',\n 'praxis.filesUpload.editor.summary.experience.progressVisible':\n 'progresso visivel',\n 'praxis.filesUpload.editor.summary.experience.progressHidden':\n 'sem barra de progresso',\n 'praxis.filesUpload.editor.summary.experience.conflictVisible':\n 'escolha de conflito disponivel',\n 'praxis.filesUpload.editor.summary.experience.conflictHidden':\n 'politica de conflito escondida',\n 'praxis.filesUpload.editor.summary.experience.metadataVisible':\n 'metadados editaveis na UI',\n 'praxis.filesUpload.editor.summary.experience.metadataHidden':\n 'sem formulario extra',\n 'praxis.filesUpload.editor.summary.limits.titleValue':\n '{maxFile} MB por arquivo • {maxBulk} itens por lote',\n 'praxis.filesUpload.editor.summary.limits.detailValue':\n '{parallel} upload(s) paralelos • {mode}',\n 'praxis.filesUpload.editor.summary.limits.failFast':\n 'fail-fast ativo',\n 'praxis.filesUpload.editor.summary.limits.partialFailures':\n 'falhas parciais permitidas',\n 'praxis.filesUpload.editor.summary.server.titleValue':\n 'Conflito padrao: {conflict}',\n 'praxis.filesUpload.editor.summary.server.detailValue':\n '{strict} • {virus}',\n 'praxis.filesUpload.editor.summary.server.strictOn':\n 'validacao rigorosa ligada',\n 'praxis.filesUpload.editor.summary.server.strictOff':\n 'validacao rigida desativada',\n 'praxis.filesUpload.editor.summary.server.virusOn':\n 'antivirus forcado',\n 'praxis.filesUpload.editor.summary.server.virusOff':\n 'antivirus opcional/inativo',\n 'praxis.filesUpload.editor.risks.overwrite.title':\n 'Sobrescrita habilitada',\n 'praxis.filesUpload.editor.risks.overwrite.detail':\n 'Arquivos existentes podem ser substituidos silenciosamente se o backend aceitar a operacao.',\n 'praxis.filesUpload.editor.risks.virus.title':\n 'Antivirus pode elevar latencia',\n 'praxis.filesUpload.editor.risks.virus.detail':\n 'Ativar varredura forcada melhora seguranca, mas pode impactar throughput e tempo de resposta.',\n 'praxis.filesUpload.editor.risks.failFast.title':\n 'Lote para no primeiro erro',\n 'praxis.filesUpload.editor.risks.failFast.detail':\n 'Usuarios podem precisar reenviar itens validos quando o primeiro erro interromper o restante do lote.',\n 'praxis.filesUpload.editor.risks.retry.title':\n 'Retry automatico agressivo',\n 'praxis.filesUpload.editor.risks.retry.detail':\n 'Muitas tentativas automaticas podem aumentar tempo de espera percebido e ruido operacional.',\n 'praxis.filesUpload.editor.risks.manual.title':\n 'Fluxo exige acao manual',\n 'praxis.filesUpload.editor.risks.manual.detail':\n 'Adequado para revisao, mas aumenta passos no envio e pode reduzir taxa de conclusao em cenarios simples.',\n 'praxis.filesUpload.settingsAriaLabel': 'Abrir configurações',\n 'praxis.filesUpload.dropzoneLabel': 'Arraste arquivos ou',\n 'praxis.filesUpload.dropzoneButton': 'selecionar',\n 'praxis.filesUpload.conflictPolicyLabel': 'Política de conflito',\n 'praxis.filesUpload.metadataLabel': 'Metadados (JSON)',\n 'praxis.filesUpload.progressAriaLabel': 'Progresso do upload',\n 'praxis.filesUpload.rateLimitBanner':\n 'Limite de requisições excedido. Tente novamente às',\n 'praxis.filesUpload.settingsTitle': 'Configuração de Upload de Arquivos',\n 'praxis.filesUpload.statusSuccess': 'Enviado',\n 'praxis.filesUpload.statusError': 'Erro',\n 'praxis.filesUpload.invalidMetadata': 'Metadados inválidos.',\n 'praxis.filesUpload.genericUploadError': 'Erro no envio de arquivo.',\n 'praxis.filesUpload.acceptError': 'Tipo de arquivo não permitido.',\n 'praxis.filesUpload.maxFileSizeError': 'Arquivo excede o tamanho máximo.',\n 'praxis.filesUpload.maxFilesPerBulkError': 'Quantidade de arquivos excedida.',\n 'praxis.filesUpload.maxBulkSizeError': 'Tamanho total dos arquivos excedido.',\n 'praxis.filesUpload.serviceUnavailable': 'Serviço de upload indisponível.',\n 'praxis.filesUpload.baseUrlMissing':\n 'Base URL não configurada. Informe [baseUrl] para habilitar o envio.',\n 'praxis.filesUpload.selectFiles': 'Selecionar arquivo(s)',\n 'praxis.filesUpload.remove': 'Remover',\n 'praxis.filesUpload.moreActions': 'Mais ações',\n 'praxis.filesUpload.policySummaryAction':\n 'Informações sobre políticas de upload',\n 'praxis.filesUpload.retry': 'Reenviar',\n 'praxis.filesUpload.download': 'Baixar',\n 'praxis.filesUpload.copyLink': 'Copiar link',\n 'praxis.filesUpload.details': 'Detalhes',\n 'praxis.filesUpload.detailsMetadata': 'Metadados',\n 'praxis.filesUpload.dropzoneHint':\n 'Arraste e solte arquivos aqui ou clique para selecionar',\n 'praxis.filesUpload.dropzoneProximityHint': 'Solte aqui para enviar',\n 'praxis.filesUpload.placeholder': 'Selecione ou solte arquivos…',\n 'praxis.filesUpload.partialUploadError':\n 'Upload parcial concluído com falhas em parte do lote.',\n 'praxis.filesUpload.presignMetadataMissing':\n 'Upload assinado concluído sem metadados do arquivo.',\n 'praxis.filesUpload.fieldChipAria': 'Arquivos adicionais selecionados',\n 'praxis.filesUpload.fieldPendingCountSuffix': 'arquivo(s) selecionado(s)',\n 'praxis.filesUpload.removePendingFile': 'Remover arquivo selecionado',\n 'praxis.filesUpload.fieldPolicyTypes': 'Tipos',\n 'praxis.filesUpload.fieldPolicyMaxPerFile': 'Máx/arquivo',\n 'praxis.filesUpload.fieldPolicyMaxItems': 'Máx/itens',\n 'praxis.filesUpload.fieldPolicyNotConfigured': 'Não configurado',\n 'praxis.filesUpload.sizeUnitBytes': 'Bytes',\n 'praxis.filesUpload.sizeUnitKB': 'KB',\n 'praxis.filesUpload.sizeUnitMB': 'MB',\n 'praxis.filesUpload.sizeUnitGB': 'GB',\n 'praxis.filesUpload.sizeUnitTB': 'TB',\n 'praxis.filesUpload.errors.INVALID_FILE_TYPE': 'Tipo de arquivo inválido.',\n 'praxis.filesUpload.errors.FILE_TOO_LARGE': 'Arquivo muito grande.',\n 'praxis.filesUpload.errors.NOT_FOUND': 'Arquivo não encontrado.',\n 'praxis.filesUpload.errors.UNAUTHORIZED': 'Requisição não autorizada.',\n 'praxis.filesUpload.errors.RATE_LIMIT_EXCEEDED':\n 'Limite de requisições excedido.',\n 'praxis.filesUpload.errors.INTERNAL_ERROR': 'Erro interno do servidor.',\n 'praxis.filesUpload.errors.QUOTA_EXCEEDED': 'Cota excedida.',\n 'praxis.filesUpload.errors.SEC_VIRUS_DETECTED': 'Vírus detectado no arquivo.',\n 'praxis.filesUpload.errors.SEC_MALICIOUS_CONTENT':\n 'Conteúdo malicioso detectado.',\n 'praxis.filesUpload.errors.SEC_DANGEROUS_TYPE': 'Tipo de arquivo perigoso.',\n 'praxis.filesUpload.errors.FMT_MAGIC_MISMATCH':\n 'Conteúdo do arquivo incompatível.',\n 'praxis.filesUpload.errors.FMT_CORRUPTED': 'Arquivo corrompido.',\n 'praxis.filesUpload.errors.FMT_UNSUPPORTED':\n 'Formato de arquivo não suportado.',\n 'praxis.filesUpload.errors.SYS_STORAGE_ERROR': 'Erro de armazenamento.',\n 'praxis.filesUpload.errors.SYS_SERVICE_DOWN': 'Serviço indisponível.',\n 'praxis.filesUpload.errors.SYS_RATE_LIMIT': 'Limite de requisições excedido.',\n // Aliases PT-BR do backend e códigos adicionais\n 'praxis.filesUpload.errors.ARQUIVO_MUITO_GRANDE': 'Arquivo muito grande.',\n 'praxis.filesUpload.errors.TIPO_ARQUIVO_INVALIDO': 'Tipo de arquivo inválido.',\n 'praxis.filesUpload.errors.TIPO_MIDIA_NAO_SUPORTADO': 'Tipo de mídia não suportado.',\n 'praxis.filesUpload.errors.CAMPO_OBRIGATORIO_AUSENTE': 'Campo obrigatório ausente.',\n 'praxis.filesUpload.errors.OPCOES_JSON_INVALIDAS': 'JSON de opções inválido.',\n 'praxis.filesUpload.errors.ARGUMENTO_INVALIDO': 'Argumento inválido.',\n 'praxis.filesUpload.errors.NAO_AUTORIZADO': 'Autenticação necessária.',\n 'praxis.filesUpload.errors.ERRO_INTERNO': 'Erro interno do servidor.',\n 'praxis.filesUpload.errors.LIMITE_TAXA_EXCEDIDO': 'Limite de taxa excedido.',\n 'praxis.filesUpload.errors.COTA_EXCEDIDA': 'Cota excedida.',\n 'praxis.filesUpload.errors.ARQUIVO_JA_EXISTE': 'Arquivo já existe.',\n // Outros possíveis códigos mapeados no catálogo\n 'praxis.filesUpload.errors.INVALID_JSON_OPTIONS': 'JSON de opções inválido.',\n 'praxis.filesUpload.errors.EMPTY_FILENAME': 'Nome do arquivo obrigatório.',\n 'praxis.filesUpload.errors.FILE_EXISTS': 'Arquivo já existe.',\n 'praxis.filesUpload.errors.PATH_TRAVERSAL': 'Path traversal detectado.',\n 'praxis.filesUpload.errors.INSUFFICIENT_STORAGE': 'Sem espaço em disco.',\n 'praxis.filesUpload.errors.UPLOAD_TIMEOUT': 'Tempo esgotado no upload.',\n 'praxis.filesUpload.errors.BULK_UPLOAD_TIMEOUT': 'Tempo esgotado no upload em lote.',\n 'praxis.filesUpload.errors.BULK_UPLOAD_CANCELLED': 'Upload em lote cancelado.',\n 'praxis.filesUpload.errors.USER_CANCELLED': 'Upload cancelado pelo usuário.',\n 'praxis.filesUpload.errors.UNKNOWN_ERROR': 'Erro desconhecido.',\n 'praxis.filesUpload.fieldPendingSummary': 'Arquivos prontos para envio',\n 'praxis.filesUpload.fieldSelectedSummary': 'Arquivo selecionado',\n 'praxis.filesUpload.fieldSelectedPlural': 'arquivos vinculados',\n 'praxis.filesUpload.fieldEmptySummary': 'Nenhum arquivo selecionado',\n 'praxis.filesUpload.fieldErrorSummary': 'Corrija o erro para continuar',\n 'praxis.filesUpload.fieldActionUpload': 'Enviar arquivos selecionados',\n 'praxis.filesUpload.fieldActionUploadShort': 'Enviar',\n 'praxis.filesUpload.fieldActionCancel': 'Cancelar seleção atual',\n 'praxis.filesUpload.fieldActionCancelShort': 'Cancelar',\n 'praxis.filesUpload.fieldActionSelect': 'Selecionar arquivo(s)',\n 'praxis.filesUpload.fieldActionClear': 'Limpar',\n 'praxis.filesUpload.fieldInfoAction': 'Informações',\n 'praxis.filesUpload.fieldMoreActions': 'Mais ações',\n 'praxis.filesUpload.fieldPendingAriaSuffix': 'arquivos prontos para envio',\n 'praxis.filesUpload.selectedOverlayAriaLabel': 'Arquivos selecionados',\n 'praxis.filesUpload.selectedOverlayTitle': 'Selecionados',\n 'praxis.filesUpload.bulkSummaryTotal': 'Total',\n 'praxis.filesUpload.bulkSummarySuccess': 'Sucesso',\n 'praxis.filesUpload.bulkSummaryFailed': 'Falhas',\n 'praxis.filesUpload.resultMetaIdLabel': 'ID',\n 'praxis.filesUpload.resultMetaTypeLabel': 'Tipo',\n 'praxis.filesUpload.resultMetaSizeLabel': 'Tamanho',\n 'praxis.filesUpload.resultMetaUploadedAtLabel': 'Enviado em',\n 'praxis.filesUpload.policySummaryAny': 'qualquer',\n 'praxis.filesUpload.policySummaryNotConfigured': '—',\n 'praxis.filesUpload.policySummaryTypesLabel': 'Tipos',\n 'praxis.filesUpload.policySummaryMaxPerFileLabel': 'Máx. por arquivo',\n 'praxis.filesUpload.policySummaryQuantityLabel': 'Qtde',\n 'praxis.filesUpload.showAll': 'Ver todos',\n 'praxis.filesUpload.showLess': 'Ver menos',\n};\n","import { InjectionToken } from '@angular/core';\nimport {\n PraxisI18nService,\n providePraxisI18n,\n type PraxisI18nConfig,\n type PraxisI18nDictionary,\n} from '@praxisui/core';\nimport { FILES_UPLOAD_EN_US } from './files-upload.en';\nimport { FILES_UPLOAD_PT_BR } from './files-upload.pt';\n\nexport interface PraxisFilesUploadI18nOptions {\n locale?: string;\n fallbackLocale?: string;\n dictionaries?: Record<string, PraxisI18nDictionary>;\n}\n\n/** @deprecated Use PraxisI18nService/providePraxisFilesUploadI18n instead. */\nexport interface FilesUploadTexts {\n [key: string]: string | undefined;\n settingsAriaLabel?: string;\n dropzoneLabel?: string;\n dropzoneButton?: string;\n conflictPolicyLabel?: string;\n metadataLabel?: string;\n progressAriaLabel?: string;\n rateLimitBanner?: string;\n}\n\n/** @deprecated Use PraxisI18nService/providePraxisFilesUploadI18n instead. */\nexport interface TranslateLike {\n t?(key: string, params?: unknown, fallback?: string): string;\n instant?(key: string): string;\n}\n\n/** @deprecated Transitional compatibility token. Prefer PraxisI18nService. */\nexport const FILES_UPLOAD_TEXTS = new InjectionToken<FilesUploadTexts>(\n 'FILES_UPLOAD_TEXTS',\n {\n providedIn: 'root',\n factory: () => ({\n settingsAriaLabel: 'Abrir configurações',\n dropzoneLabel: 'Arraste arquivos ou',\n dropzoneButton: 'selecionar',\n conflictPolicyLabel: 'Política de conflito',\n metadataLabel: 'Metadados (JSON)',\n progressAriaLabel: 'Progresso do upload',\n rateLimitBanner: 'Limite de requisições excedido. Tente novamente às',\n }),\n },\n);\n\n/** @deprecated Transitional compatibility token. Prefer PraxisI18nService. */\nexport const TRANSLATE_LIKE = new InjectionToken<TranslateLike>(\n 'TRANSLATE_LIKE',\n);\n\nexport function createPraxisFilesUploadI18nConfig(\n options: PraxisFilesUploadI18nOptions = {},\n): Partial<PraxisI18nConfig> {\n const dictionaries: Record<string, PraxisI18nDictionary> = {\n 'pt-BR': {\n ...FILES_UPLOAD_PT_BR,\n ...(options.dictionaries?.['pt-BR'] ?? {}),\n },\n 'en-US': {\n ...FILES_UPLOAD_EN_US,\n ...(options.dictionaries?.['en-US'] ?? {}),\n },\n };\n\n for (const [locale, dictionary] of Object.entries(options.dictionaries ?? {})) {\n if (locale === 'pt-BR' || locale === 'en-US') {\n continue;\n }\n dictionaries[locale] = {\n ...(dictionaries[locale] ?? {}),\n ...dictionary,\n };\n }\n\n return {\n locale: options.locale,\n fallbackLocale: options.fallbackLocale ?? 'pt-BR',\n dictionaries,\n };\n}\n\nexport function providePraxisFilesUploadI18n(\n options: PraxisFilesUploadI18nOptions = {},\n) {\n return providePraxisI18n(\n createPraxisFilesUploadI18nConfig(options) as PraxisI18nConfig,\n );\n}\n\nexport function resolvePraxisFilesUploadText(\n i18n: PraxisI18nService,\n key: string,\n fallback: string,\n legacyTexts?: FilesUploadTexts,\n legacyTranslate?: TranslateLike,\n): string {\n const namespacedKey = key.startsWith('praxis.filesUpload.')\n ? key\n : `praxis.filesUpload.${key}`;\n const coreTranslation = i18n.t(namespacedKey, undefined, '');\n if (coreTranslation) {\n return coreTranslation;\n }\n\n const legacyText = legacyTexts?.[key as keyof FilesUploadTexts];\n if (legacyText) {\n return legacyText;\n }\n\n const translatedByLegacyService =\n legacyTranslate?.t?.(namespacedKey, undefined, '') ||\n legacyTranslate?.t?.(key, undefined, '') ||\n resolveLegacyInstantTranslation(legacyTranslate, namespacedKey) ||\n resolveLegacyInstantTranslation(legacyTranslate, key);\n if (translatedByLegacyService) {\n return translatedByLegacyService;\n }\n\n return fallback;\n}\n\nfunction resolveLegacyInstantTranslation(\n legacyTranslate: TranslateLike | undefined,\n key: string,\n): string {\n const translated = legacyTranslate?.instant?.(key);\n return translated && translated !== key ? translated : '';\n}\n","import { Component, DestroyRef, Inject, OnInit, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n FormBuilder,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n} from '@angular/forms';\nimport { MatTabsModule } from '@angular/material/tabs';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatSelectModule } from '@angular/material/select';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatSnackBarModule, MatSnackBar } from '@angular/material/snack-bar';\nimport { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject, map, startWith, Observable } from 'rxjs';\nimport {\n SETTINGS_PANEL_DATA,\n SettingsValueProvider,\n} from '@praxisui/settings-panel';\nimport { FilesUploadConfig } from '../models';\nimport { ErrorCode } from '../types';\nimport { useEffectiveUploadConfig } from './use-effective-upload-config';\nimport { getErrorMeta } from '../services/error-catalog';\nimport {\n providePraxisFilesUploadI18n,\n resolvePraxisFilesUploadText,\n} from '../i18n/files-upload.i18n';\nimport { PraxisI18nService } from '@praxisui/core';\n\n@Component({\n selector: 'praxis-files-upload-config-editor',\n standalone: true,\n providers: [providePraxisFilesUploadI18n()],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatTabsModule,\n MatFormFieldModule,\n MatInputModule,\n MatCheckboxModule,\n MatSelectModule,\n MatButtonModule,\n MatIconModule,\n MatTooltipModule,\n MatSnackBarModule,\n FormsModule,\n ],\n styles: [\n `\n .editor-layout {\n display: grid;\n grid-template-columns: minmax(260px, 320px) minmax(0, 1fr);\n gap: 16px;\n align-items: start;\n }\n .summary-panel {\n position: sticky;\n top: 0;\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: 1px solid var(--pfx-surface-border, #d8d8d8);\n border-radius: 16px;\n background: linear-gradient(180deg, #fafbfc 0%, #ffffff 100%);\n }\n .summary-panel h3 {\n margin: 0;\n font-size: 1rem;\n font-weight: 600;\n }\n .summary-panel .summary-intro {\n margin: 0;\n color: rgba(0, 0, 0, 0.65);\n line-height: 1.4;\n font-size: 0.88rem;\n }\n .summary-grid {\n display: grid;\n gap: 10px;\n }\n .summary-card {\n padding: 12px;\n border-radius: 12px;\n background: #fff;\n border: 1px solid #e7e9ee;\n }\n .summary-card .eyebrow {\n display: block;\n margin-bottom: 4px;\n font-size: 0.72rem;\n font-weight: 700;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: #5f6b7a;\n }\n .summary-card strong {\n display: block;\n margin-bottom: 4px;\n font-size: 0.95rem;\n }\n .summary-card p {\n margin: 0;\n font-size: 0.85rem;\n line-height: 1.45;\n color: rgba(0, 0, 0, 0.72);\n }\n .risk-panel {\n padding: 12px;\n border-radius: 12px;\n background: #fff8e8;\n border: 1px solid #f0d29a;\n }\n .risk-panel.safe {\n background: #f4fbf6;\n border-color: #b8ddc1;\n }\n .risk-panel h4 {\n display: flex;\n align-items: center;\n gap: 6px;\n margin: 0 0 8px;\n font-size: 0.92rem;\n }\n .risk-list {\n display: grid;\n gap: 8px;\n }\n .risk-item {\n padding: 10px;\n border-radius: 10px;\n background: rgba(255, 255, 255, 0.72);\n }\n .risk-item strong {\n display: block;\n margin-bottom: 2px;\n font-size: 0.84rem;\n }\n .risk-item p,\n .risk-panel .safe-copy {\n margin: 0;\n font-size: 0.82rem;\n line-height: 1.4;\n color: rgba(0, 0, 0, 0.72);\n }\n .editor-main {\n min-width: 0;\n }\n .tab-panel {\n display: grid;\n gap: 16px;\n padding-top: 8px;\n }\n .tab-intro {\n padding: 16px 18px;\n border: 1px solid #e5e8ef;\n border-radius: 16px;\n background: linear-gradient(180deg, #ffffff 0%, #f7f9fc 100%);\n }\n .tab-intro h3 {\n margin: 0 0 6px;\n font-size: 1rem;\n font-weight: 600;\n }\n .tab-intro p {\n margin: 0;\n font-size: 0.9rem;\n line-height: 1.5;\n color: rgba(0, 0, 0, 0.72);\n }\n .config-section {\n padding: 18px;\n border: 1px solid #e5e8ef;\n border-radius: 16px;\n background: #fff;\n }\n .config-section + .config-section {\n margin-top: 0;\n }\n .section-note {\n margin: 0 0 16px;\n color: rgba(0, 0, 0, 0.7);\n font-size: 0.88rem;\n line-height: 1.45;\n }\n .advanced-note {\n padding: 14px 16px;\n border-radius: 14px;\n border: 1px solid #f0d29a;\n background: #fff8e8;\n color: rgba(0, 0, 0, 0.78);\n font-size: 0.88rem;\n line-height: 1.45;\n }\n .json-textarea {\n width: 100%;\n min-height: 280px;\n padding: 14px 16px;\n border-radius: 14px;\n border: 1px solid #d7dce5;\n background: #0f172a;\n color: #e5eefc;\n font: 500 0.84rem/1.55 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n resize: vertical;\n }\n .server-tab {\n display: grid;\n gap: 16px;\n }\n .toolbar {\n display: flex;\n align-items: center;\n gap: 12px;\n flex-wrap: wrap;\n }\n .summary {\n display: grid;\n gap: 8px;\n padding-left: 18px;\n }\n .summary li {\n line-height: 1.45;\n }\n details {\n margin-top: 12px;\n padding: 14px 16px;\n border: 1px solid #e5e8ef;\n border-radius: 14px;\n background: #fbfcfe;\n }\n details pre {\n white-space: pre-wrap;\n word-break: break-word;\n }\n @media (max-width: 1100px) {\n .editor-layout {\n grid-template-columns: 1fr;\n }\n .summary-panel {\n position: static;\n }\n }\n .help-icon-button {\n --mdc-icon-button-state-layer-size: 28px;\n --mdc-icon-button-icon-size: 18px;\n width: 28px;\n height: 28px;\n padding: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-right: -4px;\n }\n .help-icon-button mat-icon { font-size: 18px; width: 18px; height: 18px; }\n .mat-mdc-form-field-icon-suffix { align-self: center; }\n `,\n ],\n template: `\n <div class=\"editor-layout\">\n <aside class=\"summary-panel\" [attr.aria-label]=\"tx('editor.summary.ariaLabel', 'Executive summary for the current configuration')\">\n <h3>{{ tx('editor.summary.title', 'Executive summary') }}</h3>\n <p class=\"summary-intro\">\n {{ tx('editor.summary.intro', 'Review the operational impact here before going through all configuration groups.') }}\n </p>\n\n <div class=\"summary-grid\">\n <section class=\"summary-card\">\n <span class=\"eyebrow\">{{ tx('editor.summary.strategy', 'Strategy') }}</span>\n <strong>{{ summaryStrategyTitle }}</strong>\n <p>{{ summaryStrategyDetail }}</p>\n </section>\n\n <section class=\"summary-card\">\n <span class=\"eyebrow\">{{ tx('editor.summary.experience', 'Experience') }}</span>\n <strong>{{ summaryExperienceTitle }}</strong>\n <p>{{ summaryExperienceDetail }}</p>\n </section>\n\n <section class=\"summary-card\">\n <span class=\"eyebrow\">{{ tx('editor.summary.limits', 'Limits') }}</span>\n <strong>{{ summaryLimitsTitle }}</strong>\n <p>{{ summaryLimitsDetail }}</p>\n </section>\n\n <section class=\"summary-card\">\n <span class=\"eyebrow\">{{ tx('editor.summary.server', 'Server') }}</span>\n <strong>{{ summaryServerTitle }}</strong>\n <p>{{ summaryServerDetail }}</p>\n </section>\n </div>\n\n <section class=\"risk-panel\" [class.safe]=\"activeRisks.length === 0\">\n <h4>\n <mat-icon aria-hidden=\"true\">{{\n activeRisks.length === 0 ? 'verified' : 'warning'\n }}</mat-icon>\n {{ tx('editor.risks.title', 'Risks and attention points') }}\n </h4>\n <div *ngIf=\"activeRisks.length > 0; else noRiskState\" class=\"risk-list\">\n <article class=\"risk-item\" *ngFor=\"let risk of activeRisks\">\n <strong>{{ risk.title }}</strong>\n <p>{{ risk.detail }}</p>\n </article>\n </div>\n <ng-template #noRiskState>\n <p class=\"safe-copy\">\n {{ tx('editor.risks.none', 'No evident operational risk in the current configuration.') }}\n </p>\n </ng-template>\n </section>\n </aside>\n\n <div class=\"editor-main\">\n <mat-tab-group>\n <mat-tab [label]=\"tx('editor.tabs.behavior', 'Behavior')\">\n <div class=\"tab-panel\">\n <section class=\"tab-intro\">\n <h3>{{ tx('editor.behavior.intro.title', 'Upload strategy and cadence') }}</h3>\n <p>\n {{ tx('editor.behavior.intro.body', 'Define how the user starts the upload and how the batch behaves in terms of parallelism and retries.') }}\n </p>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"form\">\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.behavior.strategy.label', 'Upload strategy') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <mat-select formControlName=\"strategy\">\n <mat-option value=\"direct\">{{ tx('editor.behavior.strategy.direct', 'Direct (standard HTTP)') }}</mat-option>\n <mat-option value=\"presign\">{{ tx('editor.behavior.strategy.presign', 'Presigned URL (S3/GCS)') }}</mat-option>\n <mat-option value=\"auto\"\n >{{ tx('editor.behavior.strategy.auto', 'Automatic (tries presigned first and falls back to direct)') }}</mat-option\n >\n </mat-select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.behavior.strategy.hint', 'How files will be sent to the server.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n </form>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"bulkGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">build</mat-icon>\n {{ tx('editor.behavior.bulk.title', 'Configurable options — Batch') }}\n </h4>\n <p class=\"section-note\">\n {{ tx('editor.behavior.bulk.note', 'Use parallelism and retries in moderation. In enterprise environments these controls affect throughput, perceived experience and backend load.') }}\n </p>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.behavior.bulk.parallel', 'Parallel uploads') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"parallelUploads\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.behavior.bulk.parallelHint', 'How many files to send at the same time.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.behavior.bulk.retryCount', 'Retry count') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"retryCount\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.behavior.bulk.retryCountHint', 'Automatic attempts in case of failure.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.behavior.bulk.retryBackoff', 'Retry interval (ms)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"retryBackoffMs\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.behavior.bulk.retryBackoffHint', 'Wait time between attempts.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n </form>\n </section>\n </div>\n </mat-tab>\n <mat-tab [label]=\"tx('editor.tabs.interface', 'Interface')\">\n <div class=\"tab-panel\">\n <section class=\"tab-intro\">\n <h3>{{ tx('editor.interface.intro.title', 'Visible experience for the user') }}</h3>\n <p>\n {{ tx('editor.interface.intro.body', 'Configure density, dropzone, metadata and list details. Prioritize operational clarity before enabling advanced capabilities.') }}\n </p>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"uiGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n {{ tx('editor.interface.section.title', 'Configurable options — Interface') }}\n </h4>\n <p class=\"section-note\">\n {{ tx('editor.interface.section.note', 'This section controls the component ergonomics. Changes here affect discoverability, usage effort and upload completion rate.') }}\n </p>\n <mat-checkbox formControlName=\"showDropzone\"\n >{{ tx('editor.interface.showDropzone', 'Show drop area') }}</mat-checkbox\n >\n <mat-checkbox formControlName=\"showProgress\"\n >{{ tx('editor.interface.showProgress', 'Show progress bar') }}</mat-checkbox\n >\n <mat-checkbox formControlName=\"showConflictPolicySelector\"\n >{{ tx('editor.interface.showConflictPolicySelector', 'Allow choosing the conflict policy') }}</mat-checkbox\n >\n <mat-checkbox formControlName=\"manualUpload\"\n >{{ tx('editor.interface.manualUpload', 'Require clicking \"Upload\" (manual mode)') }}</mat-checkbox>\n <mat-checkbox formControlName=\"dense\">{{ tx('editor.interface.dense', 'Compact layout') }}</mat-checkbox>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.accept', 'Allowed types (accept)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input\n matInput\n formControlName=\"accept\"\n [placeholder]=\"tx('editor.placeholders.accept', 'e.g.: pdf,jpg,png')\"\n />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.shared.csvOptional', 'Comma-separated list (optional).')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n <mat-checkbox formControlName=\"showMetadataForm\"\n >{{ tx('editor.interface.metadataForm', 'Show metadata form (JSON)') }}</mat-checkbox\n >\n\n <!-- NOVO: Grupo Dropzone -->\n <fieldset [formGroup]=\"dropzoneGroup\" class=\"subgroup\">\n <legend>\n <mat-icon aria-hidden=\"true\">download</mat-icon>\n {{ tx('editor.interface.dropzone.title', 'Dropzone (proximity expansion)') }}\n </legend>\n <mat-checkbox formControlName=\"expandOnDragProximity\">\n {{ tx('editor.interface.dropzone.expandOnProximity', 'Expand when a file gets close during drag') }}\n </mat-checkbox>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.dropzone.proximity', 'Proximity radius (px)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"proximityPx\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.dropzone.mode', 'Expansion mode') }}</mat-label>\n <mat-select formControlName=\"expandMode\">\n <mat-option value=\"overlay\">{{ tx('editor.interface.dropzone.mode.overlay', 'Overlay (recommended)') }}</mat-option>\n <mat-option value=\"inline\">{{ tx('editor.interface.dropzone.mode.inline', 'Inline') }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.dropzone.height', 'Overlay height (px)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"expandHeight\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.dropzone.debounce', 'Drag debounce (ms)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"expandDebounceMs\" />\n </mat-form-field>\n </fieldset>\n\n <!-- NOVO: Grupo Lista/Detalhes -->\n <fieldset [formGroup]=\"listGroup\" class=\"subgroup\">\n <legend>\n <mat-icon aria-hidden=\"true\">view_list</mat-icon>\n {{ tx('editor.interface.list.title', 'List and details') }}\n </legend>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.list.collapseAfter', 'Collapse after (items)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"collapseAfter\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.list.detailsMode', 'Details mode') }}</mat-label>\n <mat-select formControlName=\"detailsMode\">\n <mat-option value=\"auto\">{{ tx('editor.interface.list.detailsMode.auto', 'Automatic') }}</mat-option>\n <mat-option value=\"card\">{{ tx('editor.interface.list.detailsMode.card', 'Card (overlay)') }}</mat-option>\n <mat-option value=\"sidesheet\">{{ tx('editor.interface.list.detailsMode.sidesheet', 'Side-sheet') }}</mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.list.detailsWidth', 'Maximum card width (px)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"detailsMaxWidth\" />\n </mat-form-field>\n <mat-checkbox formControlName=\"detailsShowTechnical\">\n {{ tx('editor.interface.list.showTechnical', 'Show technical details by default') }}\n </mat-checkbox>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.list.detailsFields', 'Metadata fields (whitelist)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput formControlName=\"detailsFields\" [placeholder]=\"tx('editor.placeholders.detailsFields', 'e.g.: id,fileName,contentType')\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.interface.list.detailsFieldsHint', 'Comma-separated list; empty = all.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.interface.list.anchor', 'Overlay anchor') }}</mat-label>\n <mat-select formControlName=\"detailsAnchor\">\n <mat-option value=\"item\">{{ tx('editor.interface.list.anchor.item', 'Item') }}</mat-option>\n <mat-option value=\"field\">{{ tx('editor.interface.list.anchor.field', 'Field') }}</mat-option>\n </mat-select>\n </mat-form-field>\n </fieldset>\n </form>\n </section>\n </div>\n </mat-tab>\n <mat-tab [label]=\"tx('editor.tabs.validation', 'Validation')\">\n <div class=\"tab-panel\">\n <section class=\"tab-intro\">\n <h3>{{ tx('editor.validation.intro.title', 'Acceptance rules and operational behavior') }}</h3>\n <p>\n {{ tx('editor.validation.intro.body', 'Separate local UX validation from effective backend rules. Review destructive options carefully.') }}\n </p>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"limitsGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">build</mat-icon>\n {{ tx('editor.validation.local.title', 'Configurable options — Validation') }}\n </h4>\n <p class=\"section-note\">\n {{ tx('editor.validation.local.note', 'Local limits improve immediate feedback, but do not replace the effective server policy.') }}\n </p>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.local.maxFileSize', 'Maximum file size (bytes)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxFileSizeBytes\" />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.validation.local.maxFileSizeHint', 'Client-side validation limit (optional).')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.local.maxFilesPerBulk', 'Max files per batch') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxFilesPerBulk\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.local.maxBulkSize', 'Maximum batch size (bytes)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxBulkSizeBytes\" />\n </mat-form-field>\n </form>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"optionsGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">tune</mat-icon>\n {{ tx('editor.validation.backend.title', 'Configurable options — Backend') }}\n </h4>\n <p class=\"section-note\">\n {{ tx('editor.validation.backend.note', 'These options directly impact the server contract and operational governance. Treat changes here as policy decisions, not only UI changes.') }}\n </p>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.backend.conflictPolicy', 'Conflict policy (default)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <mat-select formControlName=\"defaultConflictPolicy\">\n <mat-option value=\"RENAME\">{{ tx('editor.validation.backend.conflictPolicy.rename', 'Rename automatically') }}</mat-option>\n <mat-option value=\"MAKE_UNIQUE\">{{ tx('editor.validation.backend.conflictPolicy.unique', 'Generate unique name') }}</mat-option>\n <mat-option value=\"OVERWRITE\">{{ tx('editor.validation.backend.conflictPolicy.overwrite', 'Overwrite existing file') }}</mat-option>\n <mat-option value=\"SKIP\">{{ tx('editor.validation.backend.conflictPolicy.skip', 'Skip if already exists') }}</mat-option>\n <mat-option value=\"ERROR\">{{ tx('editor.validation.backend.conflictPolicy.error', 'Fail (error)') }}</mat-option>\n </mat-select>\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.validation.backend.conflictPolicyHint', 'What to do when the file name already exists.')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n <div class=\"warn\" *ngIf=\"optionsGroup.get('defaultConflictPolicy')?.value === 'OVERWRITE'\">\n <mat-icon color=\"warn\" aria-hidden=\"true\">warning</mat-icon>\n {{ tx('editor.validation.backend.overwriteWarn', 'Warning: OVERWRITE may replace existing files.') }}\n </div>\n </mat-form-field>\n <mat-checkbox formControlName=\"strictValidation\"\n >{{ tx('editor.validation.backend.strictValidation', 'Strict validation (backend)') }}</mat-checkbox\n >\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.backend.maxUploadSizeMb', 'Maximum size per file (MB)') }} <span class=\"req-tag\">mandatório</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxUploadSizeMb\" required />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.validation.backend.maxUploadSizeMbHint', 'Validated by the backend (1–500 MB).')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.backend.allowedExtensions', 'Allowed extensions') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input\n matInput\n formControlName=\"allowedExtensions\"\n [placeholder]=\"tx('editor.placeholders.allowedExtensions', 'e.g.: pdf,docx,xlsx')\"\n />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.shared.csvOptional', 'Comma-separated list (optional).')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.backend.acceptMimeTypes', 'Accepted MIME types') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input\n matInput\n formControlName=\"acceptMimeTypes\"\n [placeholder]=\"tx('editor.placeholders.acceptMimeTypes', 'e.g.: application/pdf,image/png')\"\n />\n <button\n mat-icon-button\n matSuffix\n class=\"help-icon-button\"\n type=\"button\"\n [matTooltip]=\"tx('editor.shared.csvOptional', 'Comma-separated list (optional).')\"\n matTooltipPosition=\"above\"\n >\n <mat-icon>help_outline</mat-icon>\n </button>\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.backend.targetDirectory', 'Target directory') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input\n matInput\n formControlName=\"targetDirectory\"\n [placeholder]=\"tx('editor.placeholders.targetDirectory', 'e.g.: documents/invoices')\"\n />\n </mat-form-field>\n <mat-checkbox formControlName=\"enableVirusScanning\">\n {{ tx('editor.validation.backend.enableVirusScanning', 'Force antivirus (when available)') }}\n </mat-checkbox>\n <div class=\"warn\" *ngIf=\"optionsGroup.get('enableVirusScanning')?.value === true\">\n <mat-icon color=\"warn\" aria-hidden=\"true\">warning</mat-icon>\n {{ tx('editor.validation.backend.virusWarn', 'May impact upload performance and latency.') }}\n </div>\n </form>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"quotasGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n {{ tx('editor.validation.quotas.title', 'Configurable options — Quotas (UI)') }}\n </h4>\n <mat-checkbox formControlName=\"showQuotaWarnings\"\n >{{ tx('editor.validation.quotas.showWarnings', 'Show quota warnings') }}</mat-checkbox\n >\n <mat-checkbox formControlName=\"blockOnExceed\"\n >{{ tx('editor.validation.quotas.blockOnExceed', 'Block on quota exceed') }}</mat-checkbox\n >\n </form>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"rateLimitGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n {{ tx('editor.validation.rateLimit.title', 'Configurable options — Rate Limit (UI)') }}\n </h4>\n <p class=\"section-note\">\n {{ tx('editor.validation.rateLimit.note', 'Prefer a small number of automatic retries. More attempts reduce immediate friction, but may hide real environment bottlenecks.') }}\n </p>\n <mat-checkbox formControlName=\"showBannerOn429\"\n >{{ tx('editor.validation.rateLimit.showBanner', 'Show banner when the limit is reached') }}</mat-checkbox\n >\n <mat-checkbox formControlName=\"autoRetryOn429\"\n >{{ tx('editor.validation.rateLimit.autoRetry', 'Retry automatically') }}</mat-checkbox\n >\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.rateLimit.maxAutoRetry', 'Maximum automatic retries') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"maxAutoRetry\" />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.validation.rateLimit.baseBackoff', 'Base retry interval (ms)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput type=\"number\" formControlName=\"baseBackoffMs\" />\n </mat-form-field>\n </form>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"bulkGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">bolt</mat-icon>\n {{ tx('editor.validation.batch.title', 'Configurable options — Batch execution') }}\n </h4>\n <mat-checkbox formControlName=\"failFast\"\n >{{ tx('editor.validation.batch.failFast', 'Stop on the first error (fail-fast)') }}</mat-checkbox\n >\n </form>\n </section>\n </div>\n </mat-tab>\n <mat-tab [label]=\"tx('editor.tabs.messages', 'Messages')\">\n <div class=\"tab-panel\">\n <section class=\"tab-intro\">\n <h3>{{ tx('editor.messages.intro.title', 'Messages oriented to operations') }}</h3>\n <p>\n {{ tx('editor.messages.intro.body', 'Adjust the text shown to the end user. Prioritize clarity, consistency and actionable language.') }}\n </p>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"messagesGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n {{ tx('editor.messages.section.title', 'Configurable options — Messages (UI)') }}\n </h4>\n <p class=\"section-note\">\n {{ tx('editor.messages.section.note', 'Short and objective messages work better in high-frequency contexts. Use this group to adapt the interface voice to your environment.') }}\n </p>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.messages.successSingle', 'Success (single)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input\n matInput\n formControlName=\"successSingle\"\n [placeholder]=\"tx('editor.placeholders.successSingle', 'e.g.: File uploaded successfully')\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.messages.successBulk', 'Success (batch)') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input\n matInput\n formControlName=\"successBulk\"\n [placeholder]=\"tx('editor.placeholders.successBulk', 'e.g.: Upload completed')\"\n />\n </mat-form-field>\n <div [formGroup]=\"errorsGroup\">\n <ng-container *ngFor=\"let e of errorEntries\">\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ e.label }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput [formControlName]=\"e.code\" />\n <mat-hint class=\"code-hint\">{{ e.code }}</mat-hint>\n </mat-form-field>\n </ng-container>\n </div>\n </form>\n </section>\n </div>\n </mat-tab>\n <mat-tab [label]=\"tx('editor.tabs.headers', 'Headers')\">\n <div class=\"tab-panel\">\n <section class=\"tab-intro\">\n <h3>{{ tx('editor.headers.intro.title', 'Tenant and user context') }}</h3>\n <p>\n {{ tx('editor.headers.intro.body', 'Use headers to query the effective server configuration in the same context the component will use in production.') }}\n </p>\n </section>\n <section class=\"config-section\">\n <form [formGroup]=\"headersGroup\">\n <h4 class=\"section-subtitle\">\n <mat-icon aria-hidden=\"true\">edit</mat-icon>\n {{ tx('editor.headers.section.title', 'Configurable options — Headers (query)') }}\n </h4>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.headers.tenantHeader', 'Tenant header') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input\n matInput\n formControlName=\"tenantHeader\"\n placeholder=\"X-Tenant-Id\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.headers.tenantValue', 'Tenant value') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input\n matInput\n formControlName=\"tenantValue\"\n [placeholder]=\"tx('editor.placeholders.tenantValue', 'e.g.: demo-tenant')\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.headers.userHeader', 'User header') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input\n matInput\n formControlName=\"userHeader\"\n placeholder=\"X-User-Id\"\n />\n </mat-form-field>\n <mat-form-field appearance=\"fill\">\n <mat-label>{{ tx('editor.headers.userValue', 'User value') }} <span class=\"opt-tag\">{{ tx('editor.shared.optionalTag', 'optional') }}</span></mat-label>\n <input matInput formControlName=\"userValue\" [placeholder]=\"tx('editor.placeholders.userValue', 'e.g.: 42')\" />\n </mat-form-field>\n </form>\n </section>\n </div>\n </mat-tab>\n <mat-tab [label]=\"tx('editor.tabs.server', 'Server')\">\n <div class=\"tab-panel\">\n <section class=\"tab-intro\">\n <h3>{{ tx('editor.server.intro.title', 'Effective contract returned by the backend') }}</h3>\n <p>\n {{ tx('editor.server.intro.body', 'This tab is the source of truth for the active environment. Compare the server summary with what was configured in the previous forms.') }}\n </p>\n </section>\n <section class=\"config-section\">\n <div class=\"server-tab\">\n <div class=\"toolbar\">\n <h4 class=\"section-subtitle ro\">\n <mat-icon aria-hidden=\"true\">info</mat-icon>\n {{ tx('editor.server.readonly', 'Server (read-only)') }}\n <span class=\"badge\">read-only</span>\n </h4>\n <button type=\"button\" (click)=\"refetchServerConfig()\">\n {{ tx('editor.server.reload', 'Reload from server') }}\n </button>\n <span class=\"hint\" *ngIf=\"!baseUrl\"\n >{{ tx('editor.server.baseUrlHint', 'Set baseUrl on the parent component to query /api/files/config.') }}</span\n >\n </div>\n <div *ngIf=\"serverLoading(); else serverLoaded\">\n {{ tx('editor.server.loading', 'Loading server configuration...') }}\n </div>\n <ng-template #serverLoaded>\n <div *ngIf=\"serverError(); else serverOk\" class=\"error\">\n {{ tx('editor.server.loadError', 'Failed to load:') }} {{ serverError() | json }}\n </div>\n <ng-template #serverOk>\n <section *ngIf=\"serverData() as _\">\n <h3>{{ tx('editor.server.summaryTitle', 'Active configuration summary') }}</h3>\n <ul class=\"summary\">\n <li>\n <strong>{{ tx('editor.server.summary.maxPerFile', 'Max per file (MB):') }}</strong>\n {{ serverData()?.options?.maxUploadSizeMb }}\n </li>\n <li>\n <strong>{{ tx('editor.server.summary.strictValidation', 'Strict validation:') }}</strong>\n {{ serverData()?.options?.strictValidation }}\n </li>\n <li>\n <strong>{{ tx('editor.server.summary.antivirus', 'Antivirus:') }}</strong>\n {{ serverData()?.options?.enableVirusScanning }}\n </li>\n <li>\n <strong>{{ tx('editor.server.summary.conflictPolicy', 'Default name conflict:') }}</strong>\n {{ serverData()?.options?.nameConflictPolicy }}\n </li>\n <li>\n <strong>{{ tx('editor.server.summary.mimeTypes', 'Accepted MIME types:') }}</strong>\n {{\n (serverData()?.options?.acceptMimeTypes || []).join(', ')\n }}\n </li>\n <li>\n <strong>{{ tx('editor.server.summary.bulkFailFast', 'Default bulk fail-fast:') }}</strong>\n {{ serverData()?.bulk?.failFastModeDefault }}\n </li>\n <li>\n <strong>{{ tx('editor.server.summary.rateLimit', 'Rate limit:') }}</strong>\n {{ serverData()?.rateLimit?.enabled }} ({{\n serverData()?.rateLimit?.perMinute\n }}/min, {{ serverData()?.rateLimit?.perHour }}/h)\n </li>\n <li>\n <strong>{{ tx('editor.server.summary.quotas', 'Quotas:') }}</strong> {{ serverData()?.quotas?.enabled }}\n </li>\n <li>\n <strong>{{ tx('editor.server.summary.server', 'Server:') }}</strong> v{{\n serverData()?.metadata?.version\n }}\n • {{ serverData()?.metadata?.locale }}\n </li>\n </ul>\n <details>\n <summary>{{ tx('editor.server.viewJson', 'View JSON') }}</summary>\n <button\n mat-icon-button\n [attr.aria-label]=\"tx('editor.server.copyJson', 'Copy JSON')\"\n (click)=\"copyServerConfig()\"\n type=\"button\"\n [title]=\"tx('editor.server.copyJson', 'Copy JSON')\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n <pre>{{ serverData() | json }}</pre>\n </details>\n <p class=\"note\">\n {{ tx('editor.server.mutableOptionsText', 'The options above that can be changed via payload are: name conflict, strict validation, maximum size (MB), accepted extensions/MIME, target directory, antivirus, custom metadata and fail-fast (in bulk).') }}\n </p>\n </section>\n </ng-template>\n </ng-template>\n </div>\n </section>\n </div>\n </mat-tab>\n <mat-tab [label]=\"tx('editor.tabs.json', 'JSON')\">\n <div class=\"tab-panel\">\n <section class=\"tab-intro\">\n <h3>{{ tx('editor.json.intro.title', 'Advanced mode') }}</h3>\n <p>\n {{ tx('editor.json.intro.body', 'Edit the raw payload only when you need fine-grained control. Changes here require stricter review and validation.') }}\n </p>\n </section>\n <div class=\"advanced-note\">\n {{ tx('editor.json.note', 'JSON is a low-level view of the configuration. Prefer the guided tabs whenever possible to reduce human error and keep the configuration auditable.') }}\n </div>\n <textarea\n class=\"json-textarea\"\n rows=\"10\"\n [ngModel]=\"form.value | json\"\n (ngModelChange)=\"onJsonChange($event)\"\n ></textarea>\n <div class=\"error\" *ngIf=\"jsonError\">{{ jsonError }}</div>\n </div>\n </mat-tab>\n </mat-tab-group>\n </div>\n </div>\n `,\n})\nexport class PraxisFilesUploadConfigEditor\n implements OnInit, SettingsValueProvider\n{\n private readonly i18n = inject(PraxisI18nService);\n form: FormGroup;\n\n // Integração com backend: baseUrl e sinais de configuração efetiva\n baseUrl?: string;\n private state!: ReturnType<typeof useEffectiveUploadConfig>;\n serverLoading = () => (this.state ? this.state.loading() : false);\n serverData = () => (this.state ? this.state.data() : undefined);\n serverError = () => (this.state ? this.state.error() : undefined);\n\n get uiGroup(): FormGroup {\n return this.form.get('ui') as FormGroup;\n }\n get dropzoneGroup(): FormGroup {\n return (this.form.get('ui') as FormGroup).get('dropzone') as FormGroup;\n }\n get listGroup(): FormGroup {\n return (this.form.get('ui') as FormGroup).get('list') as FormGroup;\n }\n get limitsGroup(): FormGroup {\n return this.form.get('limits') as FormGroup;\n }\n get optionsGroup(): FormGroup {\n return this.form.get('options') as FormGroup;\n }\n get quotasGroup(): FormGroup {\n return this.form.get('quotas') as FormGroup;\n }\n get rateLimitGroup(): FormGroup {\n return this.form.get('rateLimit') as FormGroup;\n }\n get bulkGroup(): FormGroup {\n return this.form.get('bulk') as FormGroup;\n }\n get messagesGroup(): FormGroup {\n return this.form.get('messages') as FormGroup;\n }\n get headersGroup(): FormGroup {\n return this.form.get('headers') as FormGroup;\n }\n get errorsGroup(): FormGroup {\n return this.messagesGroup.get('errors') as FormGroup;\n }\n\n errorCodes = Object.values(ErrorCode);\n errorEntries: Array<{ code: string; label: string }> = [];\n\n isDirty$ = new BehaviorSubject<boolean>(false);\n isValid$!: Observable<boolean>;\n isBusy$ = new BehaviorSubject<boolean>(false);\n jsonError: string | null = null;\n\n tx(key: string, fallback: string): string {\n return resolvePraxisFilesUploadText(this.i18n, key, fallback);\n }\n\n private getFriendlyErrorLabel(code: ErrorCode | string): string {\n const normalized = String(code);\n return this.tx(`editor.errors.${normalized}`, normalized);\n }\n\n constructor(\n private fb: FormBuilder,\n @Inject(SETTINGS_PANEL_DATA) private panelData: any,\n private snackBar: MatSnackBar,\n private destroyRef: DestroyRef,\n ) {\n this.form = this.fb.group({\n strategy: ['direct'],\n ui: this.fb.group({\n showDropzone: [true],\n showProgress: [true],\n showConflictPolicySelector: [true],\n manualUpload: [false],\n dense: [false],\n accept: [''],\n showMetadataForm: [false],\n // Grupos específicos de UI\n dropzone: this.fb.group({\n expandOnDragProximity: [true],\n proximityPx: [64],\n expandMode: ['overlay'],\n expandHeight: [200],\n expandDebounceMs: [120],\n }),\n list: this.fb.group({\n collapseAfter: [5],\n detailsMode: ['auto'],\n detailsMaxWidth: [480],\n detailsShowTechnical: [false],\n detailsFields: [''], // CSV na UI\n detailsAnchor: ['item'],\n }),\n }),\n limits: this.fb.group({\n maxFileSizeBytes: [null],\n maxFilesPerBulk: [null],\n maxBulkSizeBytes: [null],\n }),\n options: this.fb.group({\n defaultConflictPolicy: ['RENAME'],\n strictValidation: [true],\n maxUploadSizeMb: [50],\n allowedExtensions: [''],\n acceptMimeTypes: [''],\n targetDirectory: [''],\n enableVirusScanning: [false],\n }),\n bulk: this.fb.group({\n failFast: [false],\n parallelUploads: [1],\n retryCount: [0],\n retryBackoffMs: [0],\n }),\n quotas: this.fb.group({\n showQuotaWarnings: [false],\n blockOnExceed: [false],\n }),\n rateLimit: this.fb.group({\n autoRetryOn429: [false],\n showBannerOn429: [true],\n maxAutoRetry: [0],\n baseBackoffMs: [0],\n }),\n headers: this.fb.group({\n tenantHeader: ['X-Tenant-Id'],\n userHeader: ['X-User-Id'],\n // Valores usados nas consultas de configuração do servidor\n tenantValue: [''],\n userValue: [''],\n }),\n messages: this.fb.group({\n successSingle: [''],\n successBulk: [''],\n errors: this.fb.group({}),\n }),\n });\n\n this.errorEntries = this.errorCodes.map((code) => ({\n code,\n label: this.getFriendlyErrorLabel(code),\n }));\n\n const errorsGroup = this.errorsGroup;\n this.errorCodes.forEach((code) => {\n errorsGroup.addControl(code as string, this.fb.control(''));\n });\n\n this.isValid$ = this.form.statusChanges.pipe(\n map((s) => s === 'VALID'),\n startWith(this.form.valid),\n );\n\n // Definir baseUrl e inicializar hook em contexto de injeção\n this.baseUrl = this.panelData?.baseUrl ?? this.panelData?.__baseUrl;\n this.state = useEffectiveUploadConfig(this.baseUrl ?? '/api/files', () =>\n this.getHeadersForFetch(),\n );\n\n // Observa mudanças na configuração efetiva do servidor (em contexto de injeção)\n toObservable(this.state.data)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((cfg) => this.applyServerConfig(cfg));\n }\n\n ngOnInit(): void {\n // baseUrl opcional vinda do componente pai (Settings Panel inputs)\n // (já definida no construtor)\n\n if (this.panelData) {\n const patch = { ...this.panelData } as FilesUploadConfig;\n if (patch.ui?.accept) {\n patch.ui = { ...patch.ui, accept: patch.ui.accept.join(',') } as any;\n }\n // Normalizar lista de detalhes para CSV\n if (patch.ui?.list?.detailsFields) {\n patch.ui = {\n ...patch.ui,\n list: {\n ...(patch.ui.list as any),\n detailsFields: (patch.ui.list.detailsFields as string[]).join(','),\n } as any,\n } as any;\n }\n if (patch.options?.allowedExtensions) {\n patch.options = {\n ...patch.options,\n allowedExtensions: patch.options.allowedExtensions.join(','),\n } as any;\n }\n if (patch.options?.acceptMimeTypes) {\n patch.options = {\n ...patch.options,\n acceptMimeTypes: patch.options.acceptMimeTypes.join(','),\n } as any;\n }\n this.form.patchValue(patch);\n }\n\n // Sempre que cabeçalhos mudarem, atualiza contexto da consulta (e refaz fetch)\n this.headersGroup.valueChanges.subscribe(() => {\n this.state.refetch();\n });\n\n this.form.valueChanges.subscribe(() => this.isDirty$.next(true));\n }\n\n private applyServerConfig(cfg: any): void {\n if (!cfg) return;\n // Configuração efetiva do backend separada em validações locais, opções\n // de backend e execução de lote.\n const options = cfg.options ?? {};\n const bulk = cfg.bulk ?? {};\n\n // Validações locais alimentadas pelo backend\n this.limitsGroup.patchValue(\n {\n // Preencher máx. arquivos por lote a partir do backend\n maxFilesPerBulk:\n typeof bulk.maxFilesPerBatch === 'number'\n ? bulk.maxFilesPerBatch\n : null,\n },\n { emitEvent: false },\n );\n\n // Opções de backend (normalizar arrays em string CSV)\n const allowed = Array.isArray(options.allowedExtensions)\n ? options.allowedExtensions.join(',')\n : '';\n const mimes = Array.isArray(options.acceptMimeTypes)\n ? options.acceptMimeTypes.join(',')\n : '';\n this.optionsGroup.patchValue(\n {\n defaultConflictPolicy: options.nameConflictPolicy ?? null,\n strictValidation: options.strictValidation ?? null,\n maxUploadSizeMb: options.maxUploadSizeMb ?? null,\n allowedExtensions: allowed,\n acceptMimeTypes: mimes,\n targetDirectory: options.targetDirectory ?? '',\n enableVirusScanning: !!options.enableVirusScanning,\n },\n { emitEvent: false },\n );\n\n // Execução de lote\n this.bulkGroup.patchValue(\n {\n failFast: bulk.failFastModeDefault ?? false,\n parallelUploads:\n typeof bulk.maxConcurrentUploads === 'number'\n ? bulk.maxConcurrentUploads\n : 1,\n },\n { emitEvent: false },\n );\n\n // rate limit (somente leitura na UI)\n this.rateLimitGroup.patchValue(\n {\n // Mantemos flags de UI; os números vêm do servidor e são mostrados no resumo\n },\n { emitEvent: false },\n );\n\n // quotas (somente preferências de UI)\n this.quotasGroup.patchValue({}, { emitEvent: false });\n\n // Mensagens de erro do servidor\n const serverMessages: Record<string, string> = cfg.messages ?? {};\n const errorsGroup = this.errorsGroup;\n const alias: Record<string, ErrorCode> = {\n INVALID_TYPE: ErrorCode.INVALID_FILE_TYPE,\n UNSUPPORTED_FILE_TYPE: ErrorCode.FMT_UNSUPPORTED,\n MAGIC_NUMBER_MISMATCH: ErrorCode.FMT_MAGIC_MISMATCH,\n CORRUPTED_FILE: ErrorCode.FMT_CORRUPTED,\n FILE_TOO_LARGE: ErrorCode.FILE_TOO_LARGE,\n RATE_LIMIT_EXCEEDED: ErrorCode.RATE_LIMIT_EXCEEDED,\n QUOTA_EXCEEDED: ErrorCode.QUOTA_EXCEEDED,\n INTERNAL_ERROR: ErrorCode.INTERNAL_ERROR,\n UNKNOWN_ERROR: ErrorCode.INTERNAL_ERROR,\n MALWARE_DETECTED: ErrorCode.SEC_MALICIOUS_CONTENT,\n VIRUS_DETECTED: ErrorCode.SEC_VIRUS_DETECTED,\n DANGEROUS_FILE_TYPE: ErrorCode.SEC_DANGEROUS_TYPE,\n DANGEROUS_EXECUTABLE: ErrorCode.SEC_DANGEROUS_TYPE,\n FILE_STORE_ERROR: ErrorCode.SYS_STORAGE_ERROR,\n SYS_STORAGE_ERROR: ErrorCode.SYS_STORAGE_ERROR,\n };\n Object.keys(serverMessages).forEach((rawCode) => {\n const mapped = alias[rawCode] ?? (ErrorCode as any)[rawCode];\n const ctrlName = mapped ? String(mapped) : rawCode;\n if (!errorsGroup.get(ctrlName)) {\n errorsGroup.addControl(ctrlName, this.fb.control(''));\n }\n if (!this.errorEntries.some((e) => e.code === ctrlName)) {\n const meta = getErrorMeta(rawCode);\n const label = meta.title || ctrlName;\n this.errorEntries.push({ code: ctrlName, label });\n }\n errorsGroup\n .get(ctrlName)\n ?.patchValue(serverMessages[rawCode], { emitEvent: false });\n });\n }\n\n getSettingsValue(): FilesUploadConfig {\n const value = this.form.value as FilesUploadConfig;\n // accept (UI)\n const accept = this.uiGroup.get('accept')?.value as string;\n if (accept !== undefined) {\n value.ui = value.ui ?? {};\n value.ui.accept = accept\n .split(',')\n .map((s) => s.trim())\n .filter((s) => !!s);\n }\n // NOVO: detailsFields (UI)\n const df = (this.uiGroup.get('list') as FormGroup)?.get('detailsFields')\n ?.value as string;\n if (df !== undefined) {\n value.ui = value.ui ?? {};\n (value.ui as any).list = (value.ui as any).list ?? {};\n (value.ui as any).list.detailsFields = df\n .split(',')\n .map((s: string) => s.trim())\n .filter((s: string) => !!s);\n }\n // options.allowedExtensions\n const allowedExt = this.optionsGroup.get('allowedExtensions')\n ?.value as string;\n if (allowedExt !== undefined) {\n value.options = value.options ?? {};\n (value.options as any).allowedExtensions = allowedExt\n .split(',')\n .map((s) => s.trim())\n .filter((s) => !!s);\n }\n // options.acceptMimeTypes\n const mime = this.optionsGroup.get('acceptMimeTypes')?.value as string;\n if (mime !== undefined) {\n value.options = value.options ?? {};\n (value.options as any).acceptMimeTypes = mime\n .split(',')\n .map((s) => s.trim())\n .filter((s) => !!s);\n }\n return value;\n }\n\n copyServerConfig(): void {\n const data = this.serverData();\n if (!data) {\n return;\n }\n const json = JSON.stringify(data, null, 2);\n if (navigator?.clipboard?.writeText) {\n navigator.clipboard.writeText(json);\n this.snackBar.open(this.tx('editor.snackbar.configCopied', 'Configuration copied'), undefined, {\n duration: 2000,\n });\n }\n }\n\n onJsonChange(json: string): void {\n try {\n const parsed = JSON.parse(json);\n this.form.patchValue(parsed);\n this.jsonError = null;\n } catch {\n this.jsonError = this.tx(\n 'editor.json.invalid',\n 'Invalid JSON: check the syntax.',\n );\n this.snackBar.open(this.tx('editor.snackbar.invalidJson', 'Invalid JSON'), undefined, { duration: 2000 });\n }\n }\n\n private getHeadersForFetch(): Record<string, string> {\n const h = this.headersGroup.value as {\n tenantHeader: string;\n userHeader: string;\n tenantValue?: string;\n userValue?: string;\n };\n const headers: Record<string, string> = {};\n if (h?.tenantHeader && h?.tenantValue)\n headers[h.tenantHeader] = h.tenantValue;\n if (h?.userHeader && h?.userValue) headers[h.userHeader] = h.userValue;\n return headers;\n }\n\n refetchServerConfig(): void {\n this.state.refetch();\n }\n\n get summaryStrategyTitle(): string {\n const strategy = this.form.get('strategy')?.value;\n if (strategy === 'presign') {\n return this.tx(\n 'editor.summary.strategy.presign',\n 'Upload with presigned URL',\n );\n }\n if (strategy === 'auto') {\n return this.tx(\n 'editor.summary.strategy.auto',\n 'Automatic strategy selection',\n );\n }\n return this.tx('editor.summary.strategy.direct', 'Direct upload to backend');\n }\n\n get summaryStrategyDetail(): string {\n const strategy = this.form.get('strategy')?.value;\n if (strategy === 'presign') {\n return this.tx(\n 'editor.summary.strategy.presignDetail',\n 'Depends on a presign endpoint and usually reduces direct load on the main server.',\n );\n }\n if (strategy === 'auto') {\n return this.tx(\n 'editor.summary.strategy.autoDetail',\n 'Tries presign first and falls back to the direct flow when needed.',\n );\n }\n return this.tx(\n 'editor.summary.strategy.directDetail',\n 'Simpler flow to integrate and diagnose in controlled environments.',\n );\n }\n\n get summaryExperienceTitle(): string {\n const ui = this.uiGroup.value as any;\n if (ui?.manualUpload) {\n return this.tx(\n 'editor.summary.experience.manual',\n 'Manual review before upload',\n );\n }\n if (ui?.showDropzone === false) {\n return this.tx(\n 'editor.summary.experience.compact',\n 'Selection guided by compact field',\n );\n }\n return this.tx(\n 'editor.summary.experience.dropzone',\n 'Immediate upload with visible dropzone',\n );\n }\n\n get summaryExperienceDetail(): string {\n const ui = this.uiGroup.value as any;\n const tokens = [\n ui?.showProgress\n ? this.tx('editor.summary.experience.progressVisible', 'visible progress')\n : this.tx('editor.summary.experience.progressHidden', 'no progress bar'),\n ui?.showConflictPolicySelector\n ? this.tx(\n 'editor.summary.experience.conflictVisible',\n 'conflict selection available',\n )\n : this.tx(\n 'editor.summary.experience.conflictHidden',\n 'conflict policy hidden',\n ),\n ui?.showMetadataForm\n ? this.tx(\n 'editor.summary.experience.metadataVisible',\n 'editable metadata in the UI',\n )\n : this.tx(\n 'editor.summary.experience.metadataHidden',\n 'no extra form',\n ),\n ];\n return tokens.join(' • ');\n }\n\n get summaryLimitsTitle(): string {\n const maxFile = this.optionsGroup.get('maxUploadSizeMb')?.value;\n const maxBulk = this.limitsGroup.get('maxFilesPerBulk')?.value;\n return this.tx(\n 'editor.summary.limits.titleValue',\n '{maxFile} MB per file • {maxBulk} items per batch',\n )\n .replace('{maxFile}', String(maxFile || '—'))\n .replace('{maxBulk}', String(maxBulk || '—'));\n }\n\n get summaryLimitsDetail(): string {\n const parallel = this.bulkGroup.get('parallelUploads')?.value;\n const failFast = this.bulkGroup.get('failFast')?.value;\n return this.tx(\n 'editor.summary.limits.detailValue',\n '{parallel} parallel upload(s) • {mode}',\n )\n .replace('{parallel}', String(parallel || 1))\n .replace(\n '{mode}',\n failFast\n ? this.tx('editor.summary.limits.failFast', 'fail-fast enabled')\n : this.tx(\n 'editor.summary.limits.partialFailures',\n 'partial failures allowed',\n ),\n );\n }\n\n get summaryServerTitle(): string {\n const conflict = this.optionsGroup.get('defaultConflictPolicy')?.value || 'RENAME';\n return this.tx(\n 'editor.summary.server.titleValue',\n 'Default conflict: {conflict}',\n ).replace('{conflict}', String(conflict));\n }\n\n get summaryServerDetail(): string {\n const strict = this.optionsGroup.get('strictValidation')?.value;\n const virus = this.optionsGroup.get('enableVirusScanning')?.value;\n return this.tx(\n 'editor.summary.server.detailValue',\n '{strict} • {virus}',\n )\n .replace(\n '{strict}',\n strict\n ? this.tx(\n 'editor.summary.server.strictOn',\n 'strict validation enabled',\n )\n : this.tx(\n 'editor.summary.server.strictOff',\n 'strict validation disabled',\n ),\n )\n .replace(\n '{virus}',\n virus\n ? this.tx(\n 'editor.summary.server.virusOn',\n 'forced antivirus',\n )\n : this.tx(\n 'editor.summary.server.virusOff',\n 'optional/inactive antivirus',\n ),\n );\n }\n\n get activeRisks(): Array<{ title: string; detail: string }> {\n const risks: Array<{ title: string; detail: string }> = [];\n if (this.optionsGroup.get('defaultConflictPolicy')?.value === 'OVERWRITE') {\n risks.push({\n title: this.tx('editor.risks.overwrite.title', 'Overwrite enabled'),\n detail: this.tx(\n 'editor.risks.overwrite.detail',\n 'Existing files may be silently replaced if the backend accepts the operation.',\n ),\n });\n }\n if (this.optionsGroup.get('enableVirusScanning')?.value === true) {\n risks.push({\n title: this.tx(\n 'editor.risks.virus.title',\n 'Antivirus may increase latency',\n ),\n detail: this.tx(\n 'editor.risks.virus.detail',\n 'Forced scanning improves security, but may impact throughput and response time.',\n ),\n });\n }\n if (this.bulkGroup.get('failFast')?.value === true) {\n risks.push({\n title: this.tx(\n 'editor.risks.failFast.title',\n 'Batch stops on the first error',\n ),\n detail: this.tx(\n 'editor.risks.failFast.detail',\n 'Users may need to resend valid items when the first error interrupts the rest of the batch.',\n ),\n });\n }\n if ((this.rateLimitGroup.get('maxAutoRetry')?.value ?? 0) >= 5) {\n risks.push({\n title: this.tx(\n 'editor.risks.retry.title',\n 'Aggressive automatic retry',\n ),\n detail: this.tx(\n 'editor.risks.retry.detail',\n 'Too many automatic retries may increase perceived wait time and operational noise.',\n ),\n });\n }\n if (this.uiGroup.get('manualUpload')?.value === true) {\n risks.push({\n title: this.tx(\n 'editor.risks.manual.title',\n 'Flow requires manual action',\n ),\n detail: this.tx(\n 'editor.risks.manual.detail',\n 'Suitable for review, but adds upload steps and may reduce completion rate in simple scenarios.',\n ),\n });\n }\n return risks;\n }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nfunction toError(key: string, info: any): ValidationErrors {\n return { [key]: info } as ValidationErrors;\n}\n\nfunction ensureFiles(value: any): File[] {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nexport function acceptValidator(allowed: string[]): ValidatorFn {\n const normalized = (allowed || []).map((a) => a.toLowerCase());\n const acceptAll = normalized.includes('*');\n return (control: AbstractControl): ValidationErrors | null => {\n if (acceptAll) return null;\n const files = ensureFiles(control.value);\n if (!files.length) return null;\n const invalid = files.find((f) => {\n const type = (f as any).type ? String((f as any).type).toLowerCase() : '';\n const name = (f as any).name ? String((f as any).name).toLowerCase() : '';\n const ext = name.includes('.')\n ? name.substring(name.lastIndexOf('.'))\n : '';\n return !normalized.some((a) => {\n if (a.endsWith('/*')) {\n return type.startsWith(a.slice(0, -1));\n }\n if (a.startsWith('.')) {\n return ext === a;\n }\n return type === a;\n });\n });\n return invalid ? toError('accept', { allowed }) : null;\n };\n}\n\nexport function maxFileSizeValidator(maxBytes: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const files = ensureFiles(control.value);\n if (!files.length) return null;\n const tooBig = files.find((f) => (f as any).size > maxBytes);\n return tooBig ? toError('maxFileSize', { max: maxBytes }) : null;\n };\n}\n\nexport function maxFilesPerBulkValidator(maxFiles: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const files = ensureFiles(control.value);\n if (!files.length) return null;\n return files.length > maxFiles\n ? toError('maxFilesPerBulk', { max: maxFiles, actual: files.length })\n : null;\n };\n}\n\nexport function maxBulkSizeValidator(maxBytes: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const files = ensureFiles(control.value);\n if (!files.length) return null;\n const total = files.reduce((sum, f) => sum + ((f as any).size || 0), 0);\n return total > maxBytes\n ? toError('maxBulkSize', { max: maxBytes, actual: total })\n : null;\n };\n}\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\n\nexport interface DragPointer {\n x: number;\n y: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class DragProximityService implements OnDestroy {\n private draggingWithFiles$ = new BehaviorSubject<boolean>(false);\n private pointer$ = new BehaviorSubject<DragPointer>({ x: -9999, y: -9999 });\n private dragCounter = 0;\n\n constructor(private zone: NgZone) {\n this.zone.runOutsideAngular(() => {\n window.addEventListener('dragenter', this.onDragEnter, { passive: true });\n window.addEventListener('dragleave', this.onDragLeave, { passive: true });\n window.addEventListener('dragover', this.onDragOver, { passive: true });\n window.addEventListener('drop', this.onDrop, { passive: true });\n });\n }\n\n ngOnDestroy(): void {\n window.removeEventListener('dragenter', this.onDragEnter as any);\n window.removeEventListener('dragleave', this.onDragLeave as any);\n window.removeEventListener('dragover', this.onDragOver as any);\n window.removeEventListener('drop', this.onDrop as any);\n }\n\n isDraggingWithFiles(): Observable<boolean> {\n return this.draggingWithFiles$.asObservable();\n }\n\n pointer(): Observable<DragPointer> {\n return this.pointer$.asObservable();\n }\n\n withinProximity(rect: DOMRect, proximityPx: number, pt: DragPointer | null = null): boolean {\n const p = pt ?? this.pointer$.value;\n const left = rect.left - proximityPx;\n const top = rect.top - proximityPx;\n const right = rect.right + proximityPx;\n const bottom = rect.bottom + proximityPx;\n return p.x >= left && p.x <= right && p.y >= top && p.y <= bottom;\n }\n\n private onDragEnter = (e: DragEvent) => {\n this.dragCounter++;\n const hasFiles = !!e.dataTransfer && Array.from(e.dataTransfer.types || []).includes('Files');\n if (hasFiles) this.draggingWithFiles$.next(true);\n };\n\n private onDragLeave = (_e: DragEvent) => {\n this.dragCounter = Math.max(0, this.dragCounter - 1);\n if (this.dragCounter === 0) {\n this.draggingWithFiles$.next(false);\n this.pointer$.next({ x: -9999, y: -9999 });\n }\n };\n\n private onDragOver = (e: DragEvent) => {\n this.pointer$.next({ x: e.clientX, y: e.clientY });\n };\n\n private onDrop = (_e: DragEvent) => {\n this.dragCounter = 0;\n this.draggingWithFiles$.next(false);\n this.pointer$.next({ x: -9999, y: -9999 });\n };\n}\n\n","import { HttpClient, HttpEvent } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, retry } from 'rxjs';\n\nexport interface PresignResponse {\n uploadUrl: string;\n headers?: Record<string, string>;\n fields?: Record<string, string>;\n}\n\n/**\n * Options for a single file upload.\n */\nexport interface UploadOptions {\n /** Backend options JSON (FileUploadOptionsRecord), enviado no campo 'options'. */\n optionsJson?: string;\n /** Metadados por arquivo (serializado em 'metadata'). */\n metadata?: Record<string, unknown>;\n /** Política de conflito (serializada em 'conflictPolicy'). */\n conflictPolicy?: string;\n /** Número de tentativas de retry. */\n retryCount?: number;\n}\n\n/**\n * Represents a file for bulk uploads.\n */\nexport interface BulkUploadFile {\n file: File;\n metadata?: Record<string, unknown>;\n conflictPolicy?: string;\n}\n\n/**\n * Options applied to a bulk upload request.\n */\nexport interface BulkUploadOptions {\n /** Backend options JSON (FileUploadOptionsRecord), enviado no campo 'options'. */\n optionsJson?: string;\n /** Override direto do fail-fast do backend. */\n failFast?: boolean;\n /** Número de tentativas de retry. */\n retryCount?: number;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class FilesApiClient {\n constructor(private readonly http: HttpClient) {}\n\n /** Upload de um único arquivo com metadata/conflictPolicy e options JSON. */\n upload(\n baseUrl: string,\n file: File,\n options: UploadOptions = {},\n ): Observable<HttpEvent<unknown>> {\n const formData = new FormData();\n formData.append('file', file);\n if (options.optionsJson) formData.append('options', options.optionsJson);\n if (options.metadata) formData.append('metadata', JSON.stringify(options.metadata));\n if (options.conflictPolicy) formData.append('conflictPolicy', options.conflictPolicy);\n\n return this.http\n .post<unknown>(`${baseUrl}/upload`, formData, {\n reportProgress: true,\n observe: 'events',\n })\n .pipe(retry(options.retryCount ?? 0));\n }\n\n /** Upload múltiplo com arrays de metadata/conflictPolicy e options JSON. */\n bulkUpload(\n baseUrl: string,\n files: BulkUploadFile[],\n options: BulkUploadOptions = {},\n ): Observable<HttpEvent<unknown>> {\n const formData = new FormData();\n\n files.forEach((f) => {\n formData.append('files', f.file);\n });\n\n if (options.optionsJson) formData.append('options', options.optionsJson);\n\n if (options.failFast !== undefined) {\n formData.append('failFastMode', String(options.failFast));\n }\n\n // Arrays de metadata/políticas quando presentes\n const metas = files.map((f) => f.metadata ?? null);\n if (metas.some((m) => m !== null)) {\n formData.append('metadata', JSON.stringify(metas));\n }\n const policies = files.map((f) => f.conflictPolicy ?? null);\n if (policies.some((p) => p !== null)) {\n formData.append('conflictPolicy', JSON.stringify(policies));\n }\n\n return this.http\n .post<unknown>(`${baseUrl}/bulk`, formData, {\n reportProgress: true,\n observe: 'events',\n })\n .pipe(retry(options.retryCount ?? 0));\n }\n\n presign(baseUrl: string, fileName: string): Observable<PresignResponse> {\n // Backend: POST /upload/presign?filename=...\n const url = `${baseUrl}/upload/presign?filename=${encodeURIComponent(\n fileName,\n )}`;\n return this.http.post<PresignResponse>(url, null, { observe: 'body' });\n }\n}\n","import { HttpClient, HttpEvent } from '@angular/common/http';\nimport { Injectable } from '@angular/core';\nimport { Observable, retry } from 'rxjs';\nimport { PresignResponse, UploadOptions } from './files-api-client.service';\n\n@Injectable({ providedIn: 'root' })\nexport class PresignedUploaderService {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Uploads a file to a presigned URL and retries when configured.\n */\n upload(\n target: PresignResponse,\n file: File,\n options: UploadOptions = {},\n retryCount = 0,\n ): Observable<HttpEvent<unknown>> {\n const formData = new FormData();\n if (target.fields) {\n Object.entries(target.fields).forEach(([key, value]) => {\n formData.append(key, value);\n });\n }\n if (this.shouldAppendPraxisFields(target.uploadUrl)) {\n if (options.optionsJson) formData.append('options', options.optionsJson);\n if (options.metadata) {\n formData.append('metadata', JSON.stringify(options.metadata));\n }\n if (options.conflictPolicy) {\n formData.append('conflictPolicy', options.conflictPolicy);\n }\n }\n formData.append('file', file);\n return this.http\n .post<unknown>(target.uploadUrl, formData, {\n headers: target.headers,\n observe: 'events',\n reportProgress: true,\n withCredentials: false,\n })\n .pipe(retry(retryCount));\n }\n\n private shouldAppendPraxisFields(uploadUrl: string): boolean {\n if (!uploadUrl) return false;\n if (uploadUrl.startsWith('/')) return true;\n try {\n return new URL(uploadUrl, window.location.origin).origin === window.location.origin;\n } catch {\n return false;\n }\n }\n}\n","import { HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, InjectionToken, Optional } from '@angular/core';\nimport { PraxisI18nService } from '@praxisui/core';\nimport {\n resolvePraxisFilesUploadText,\n TRANSLATE_LIKE,\n type TranslateLike,\n} from '../i18n/files-upload.i18n';\nimport { ErrorLike, getPrimaryErrorItem, isErrorEnvelope } from '../types';\nimport { getErrorMeta } from './error-catalog';\n\nexport interface RateLimitInfo {\n limit: number;\n remaining: number;\n resetEpochSeconds: number;\n}\n\nexport interface MappedError {\n message: string;\n rateLimit?: RateLimitInfo;\n // metadados opcionais\n title?: string;\n severity?: 'info' | 'warn' | 'error';\n category?: string;\n phase?: string;\n userAction?: string;\n}\n\nexport const FILES_UPLOAD_ERROR_MESSAGES = new InjectionToken<\n Partial<Record<string, string>>\n>('FILES_UPLOAD_ERROR_MESSAGES');\n\nconst DEFAULT_MESSAGES: Record<string, string> = {\n INVALID_FILE_TYPE: 'Tipo de arquivo inválido.',\n FILE_TOO_LARGE: 'Arquivo muito grande.',\n NOT_FOUND: 'Arquivo não encontrado.',\n UNAUTHORIZED: 'Requisição não autorizada.',\n RATE_LIMIT_EXCEEDED: 'Limite de requisições excedido.',\n INTERNAL_ERROR: 'Erro interno do servidor.',\n QUOTA_EXCEEDED: 'Cota excedida.',\n SEC_VIRUS_DETECTED: 'Vírus detectado no arquivo.',\n SEC_MALICIOUS_CONTENT: 'Conteúdo malicioso detectado.',\n SEC_DANGEROUS_TYPE: 'Tipo de arquivo perigoso.',\n FMT_MAGIC_MISMATCH: 'Conteúdo do arquivo incompatível.',\n FMT_CORRUPTED: 'Arquivo corrompido.',\n FMT_UNSUPPORTED: 'Formato de arquivo não suportado.',\n SYS_STORAGE_ERROR: 'Erro de armazenamento.',\n SYS_SERVICE_DOWN: 'Serviço indisponível.',\n SYS_RATE_LIMIT: 'Limite de requisições excedido.',\n\n // aliases em português vindos do backend\n ARQUIVO_MUITO_GRANDE: 'Arquivo muito grande.',\n TIPO_ARQUIVO_INVALIDO: 'Tipo de arquivo inválido.',\n TIPO_MIDIA_NAO_SUPORTADO: 'Tipo de mídia não suportado.',\n CAMPO_OBRIGATORIO_AUSENTE: 'Campo obrigatório ausente.',\n OPCOES_JSON_INVALIDAS: 'JSON de opções inválido.',\n ARGUMENTO_INVALIDO: 'Argumento inválido.',\n NAO_AUTORIZADO: 'Autenticação necessária.',\n ERRO_INTERNO: 'Erro interno do servidor.',\n LIMITE_TAXA_EXCEDIDO: 'Limite de taxa excedido.',\n COTA_EXCEDIDA: 'Cota excedida.',\n ARQUIVO_JA_EXISTE: 'Arquivo já existe.',\n};\n\n@Injectable({ providedIn: 'root' })\nexport class ErrorMapperService {\n constructor(\n private readonly i18n: PraxisI18nService,\n @Optional()\n @Inject(FILES_UPLOAD_ERROR_MESSAGES)\n private readonly customMessages?: Partial<Record<string, string>>,\n @Optional()\n @Inject(TRANSLATE_LIKE)\n private readonly legacyTranslate?: TranslateLike,\n ) {}\n\n map(error: ErrorLike, headers?: HttpHeaders): MappedError {\n const primary = getPrimaryErrorItem(error);\n const code = String(primary?.code || 'UNKNOWN_ERROR');\n const translatedMessage = resolvePraxisFilesUploadText(\n this.i18n,\n `errors.${code}`,\n '',\n undefined,\n this.legacyTranslate,\n );\n const defaultMessage =\n DEFAULT_MESSAGES[code] ??\n primary?.message ??\n (isErrorEnvelope(error) ? error.message : undefined) ??\n 'Erro desconhecido.';\n const configuredMessage = this.customMessages?.[code];\n const message =\n configuredMessage ??\n (translatedMessage || defaultMessage);\n\n // metadados do catálogo\n const meta = getErrorMeta(code);\n const mapped: MappedError = {\n message,\n title: meta.title,\n severity: meta.severity,\n category: meta.category,\n phase: meta.phase,\n userAction: meta.userAction,\n };\n\n const isRateLimit =\n code === 'LIMITE_TAXA_EXCEDIDO' ||\n code === 'RATE_LIMIT_EXCEEDED' ||\n code === 'SYS_RATE_LIMIT';\n\n if (isRateLimit) {\n const limit = Number(headers?.get('X-RateLimit-Limit'));\n const remaining = Number(headers?.get('X-RateLimit-Remaining'));\n const resetEpochSeconds = Number(headers?.get('X-RateLimit-Reset'));\n if (\n !Number.isNaN(limit) &&\n !Number.isNaN(remaining) &&\n !Number.isNaN(resetEpochSeconds)\n ) {\n mapped.rateLimit = { limit, remaining, resetEpochSeconds };\n }\n }\n\n return mapped;\n }\n}\n","import {\n Component,\n EventEmitter,\n Inject,\n Input,\n OnInit,\n OnChanges,\n Optional,\n Output,\n ViewChild,\n ElementRef,\n AfterViewInit,\n OnDestroy,\n TemplateRef,\n ViewContainerRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n inject,\n} from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule, FormControl, ValidatorFn } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatMenuModule } from '@angular/material/menu';\nimport {\n HttpEvent,\n HttpEventType,\n HttpErrorResponse,\n HttpResponse,\n} from '@angular/common/http';\nimport {\n ASYNC_CONFIG_STORAGE,\n AsyncConfigStorage,\n PraxisI18nService,\n PraxisIconDirective,\n ComponentKeyService,\n} from '@praxisui/core';\nimport { SettingsPanelService } from '@praxisui/settings-panel';\nimport {\n ApiErrorItem,\n ErrorResponse,\n ErrorLike,\n FileMetadata,\n UploadResponse,\n BulkUploadResponseData,\n BulkUploadFileResult,\n BulkUploadResultStatus,\n ScanStatus,\n getPrimaryErrorItem,\n} from '../../types';\nimport { PraxisFilesUploadConfigEditor } from '../../config/praxis-files-upload-config-editor';\nimport {\n FilesApiClient,\n BulkUploadFile,\n UploadOptions,\n} from '../../services/files-api-client.service';\nimport { PresignedUploaderService } from '../../services/presigned-uploader.service';\nimport {\n ErrorMapperService,\n RateLimitInfo,\n} from '../../services/error-mapper.service';\nimport {\n FILES_UPLOAD_TEXTS,\n TRANSLATE_LIKE,\n providePraxisFilesUploadI18n,\n resolvePraxisFilesUploadText,\n type FilesUploadTexts,\n type TranslateLike,\n} from '../../i18n/files-upload.i18n';\nimport {\n acceptValidator,\n maxBulkSizeValidator,\n maxFileSizeValidator,\n maxFilesPerBulkValidator,\n} from '../../validators/file-upload.validators';\nimport { DragProximityService } from '../../services/drag-proximity.service';\nimport { Subscription, debounceTime, from, of } from 'rxjs';\nimport {\n catchError,\n concatMap,\n defaultIfEmpty,\n filter,\n map,\n take,\n tap,\n toArray,\n} from 'rxjs/operators';\n\nimport { FilesUploadConfig } from '../../models';\nimport { EffectiveUploadConfig } from '../../types';\nimport { ConfigService } from '../../config/config.service';\n\n// Novos imports CDK Overlay/Portal e Tooltip\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nlet nextPraxisFilesUploadA11yId = 0;\n\nexport type UploadStartEvent = {\n files: File[];\n mode: 'single' | 'bulk';\n strategy: 'direct' | 'presign' | 'auto';\n filesUploadId?: string;\n baseUrl?: string;\n};\n\nexport type UploadProgressEvent = {\n progress: number;\n loaded: number;\n total?: number;\n};\n\nexport type PendingFilesState = {\n files: File[];\n count: number;\n hasPending: boolean;\n};\n\nexport type FilesUploadReadyState = 'idle' | 'loading' | 'ready';\n\nexport type FilesUploadReadySource = 'local' | 'server' | 'fallback';\n\nexport type FilesUploadReadinessEvent = {\n state: FilesUploadReadyState;\n source: FilesUploadReadySource;\n filesUploadId?: string;\n baseUrl?: string;\n};\n\ntype FilesUploadResolvedTexts = {\n settingsAriaLabel: string;\n dropzoneLabel: string;\n dropzoneButton: string;\n conflictPolicyLabel: string;\n metadataLabel: string;\n progressAriaLabel: string;\n rateLimitBanner: string;\n};\n\n@Component({\n selector: 'praxis-files-upload',\n standalone: true,\n providers: [providePraxisFilesUploadI18n()],\n imports: [\n CommonModule,\n ReactiveFormsModule,\n MatButtonModule,\n MatIconModule,\n PraxisIconDirective,\n MatProgressBarModule,\n MatMenuModule,\n MatTooltipModule,\n ],\n styleUrl: './praxis-files-upload.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"praxis-files-upload\"\n [class.dense]=\"config?.ui?.dense\"\n [attr.data-files-upload-id]=\"a11yBaseId\"\n [attr.data-ready-state]=\"readinessState\"\n [attr.data-ready-source]=\"readinessSource\"\n [attr.aria-busy]=\"readinessState === 'loading' ? 'true' : 'false'\"\n #host\n >\n <!-- Proximity overlay inline (fallback quando expandMode === 'inline') -->\n <div\n class=\"proximity-overlay\"\n *ngIf=\"\n showProximityOverlay &&\n (config?.ui?.dropzone?.expandMode ?? 'overlay') === 'inline'\n \"\n [style.height.px]=\"config?.ui?.dropzone?.expandHeight ?? 200\"\n aria-hidden=\"true\"\n >\n <mat-icon class=\"dz-icon\" aria-hidden=\"true\" [praxisIcon]=\"'cloud_upload'\"></mat-icon>\n <p class=\"dz-title\">{{ texts.dropzoneLabel }}</p>\n <p class=\"dz-hint\">{{ t('dropzoneProximityHint', 'Solte aqui para enviar') }}</p>\n </div>\n <!-- Template do overlay de proximidade (renderizado via CDK Overlay) -->\n <ng-template #proximityOverlayTmpl>\n <div class=\"proximity-overlay\" aria-hidden=\"true\">\n <mat-icon class=\"dz-icon\" aria-hidden=\"true\" [praxisIcon]=\"'cloud_upload'\"></mat-icon>\n <p class=\"dz-title\">{{ texts.dropzoneLabel }}</p>\n <p class=\"dz-hint\">{{ t('dropzoneProximityHint', 'Solte aqui para enviar') }}</p>\n </div>\n </ng-template>\n\n <!-- Overlay de seleção (lista de arquivos selecionados + ações) -->\n <ng-container *ngIf=\"displayMode === 'full'\">\n <ng-template #selectedOverlayTmpl>\n <div\n class=\"selected-overlay\"\n role=\"region\"\n [attr.aria-labelledby]=\"selectedOverlayTitleId\"\n >\n <header class=\"sel-header\">\n <span class=\"title\" [id]=\"selectedOverlayTitleId\">{{ t('selectedOverlayTitle', 'Selecionados') }} ({{ pendingCount }})</span>\n <span class=\"spacer\"></span>\n <button\n mat-stroked-button\n color=\"primary\"\n (click)=\"submitPendingFiles()\"\n [disabled]=\"!baseUrl || isUploading\"\n >\n {{ t('fieldActionUploadShort', 'Enviar') }}\n </button>\n <button mat-button type=\"button\" (click)=\"resetPendingFiles()\">\n {{ t('fieldActionCancelShort', 'Cancelar') }}\n </button>\n </header>\n <ul class=\"sel-list\">\n <li *ngFor=\"let f of pendingFiles\" class=\"sel-item\">\n <mat-icon class=\"file-icon\" aria-hidden=\"true\"\n >insert_drive_file</mat-icon\n >\n <div class=\"info\">\n <div class=\"name\" [matTooltip]=\"displayFileName(f)\">\n {{ displayFileName(f) }}\n </div>\n <div class=\"meta\">\n {{ f.type || '—' }} • {{ formatBytes(f.size) }}\n </div>\n </div>\n <button\n mat-icon-button\n class=\"remove-btn\"\n [matTooltip]=\"t('remove', 'Remover')\"\n (click)=\"removePendingFile(f)\"\n [attr.aria-label]=\"pendingFileRemoveAriaLabel(f)\"\n >\n <mat-icon [praxisIcon]=\"'close'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n class=\"more-btn\"\n [matMenuTriggerFor]=\"fileMenu\"\n [matMenuTriggerData]=\"{ file: f }\"\n aria-haspopup=\"menu\"\n [matTooltip]=\"t('moreActions', 'Mais ações')\"\n [attr.aria-label]=\"pendingFileMoreActionsAriaLabel(f)\"\n >\n <mat-icon [praxisIcon]=\"'more_horiz'\"></mat-icon>\n </button>\n <mat-menu\n #fileMenu=\"matMenu\"\n xPosition=\"before\"\n yPosition=\"below\"\n >\n <button mat-menu-item (click)=\"onRetry(f)\">\n <mat-icon [praxisIcon]=\"'refresh'\"></mat-icon>\n <span>{{ t('retry', 'Reenviar') }}</span>\n </button>\n <button mat-menu-item (click)=\"onDownload(f)\">\n <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n <span>{{ t('download', 'Baixar') }}</span>\n </button>\n <button mat-menu-item (click)=\"onCopyLink(f)\">\n <mat-icon [praxisIcon]=\"'link'\"></mat-icon>\n <span>{{ t('copyLink', 'Copiar link') }}</span>\n </button>\n </mat-menu>\n </li>\n </ul>\n </div>\n </ng-template>\n </ng-container>\n\n <button\n type=\"button\"\n mat-icon-button\n class=\"settings-btn\"\n (click)=\"openSettings()\"\n [attr.aria-label]=\"texts.settingsAriaLabel\"\n *ngIf=\"enableCustomization\"\n >\n <mat-icon [praxisIcon]=\"'settings'\"></mat-icon>\n </button>\n <div\n class=\"rate-limit-banner\"\n *ngIf=\"rateLimit && config?.rateLimit?.showBannerOn429 !== false\"\n [id]=\"messageRegionId\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n {{ texts.rateLimitBanner }}\n {{ rateLimit.resetEpochSeconds * 1000 | date: 'shortTime' }}.\n </div>\n <div\n class=\"quota-banner\"\n *ngIf=\"quotaExceeded && config?.quotas?.showQuotaWarnings !== false\"\n [id]=\"messageRegionId\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {{ errorMessage }}\n </div>\n <div\n class=\"error\"\n *ngIf=\"errorMessage && !quotaExceeded\"\n [id]=\"messageRegionId\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n {{ errorMessage }}\n </div>\n <div\n class=\"error\"\n *ngIf=\"!baseUrl\"\n [id]=\"messageRegionId\"\n role=\"alert\"\n aria-live=\"assertive\"\n >\n {{ t('baseUrlMissing', 'Base URL not configured. Provide [baseUrl] to enable uploads.') }}\n </div>\n <div\n class=\"dropzone\"\n *ngIf=\"config?.ui?.showDropzone !== false\"\n role=\"group\"\n [class.dragover]=\"isDragging\"\n [class.disabled]=\"\n !baseUrl ||\n (quotaExceeded && config?.quotas?.blockOnExceed) ||\n isUploading\n \"\n [attr.aria-disabled]=\"\n !baseUrl ||\n (quotaExceeded && config?.quotas?.blockOnExceed) ||\n isUploading\n ? 'true'\n : 'false'\n \"\n [attr.aria-label]=\"texts.dropzoneLabel\"\n [attr.aria-describedby]=\"messageRegionId\"\n (drop)=\"onDrop($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n >\n <!-- Ações internas (ícones) -->\n <div class=\"field-actions\" aria-hidden=\"false\">\n <button\n mat-icon-button\n [matTooltip]=\"t('selectFiles', 'Select file(s)')\"\n [attr.aria-label]=\"selectFilesAriaLabel\"\n (click)=\"$event.stopPropagation(); openFile(fileInput)\"\n [disabled]=\"!baseUrl || isUploading\"\n >\n <mat-icon [praxisIcon]=\"'attach_file'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"policiesSummary\"\n [attr.aria-label]=\"policySummaryAriaLabel\"\n (click)=\"$event.stopPropagation()\"\n [disabled]=\"false\"\n >\n <mat-icon [praxisIcon]=\"'info'\"></mat-icon>\n </button>\n </div>\n\n <mat-icon class=\"dz-icon\" aria-hidden=\"true\" [praxisIcon]=\"'cloud_upload'\"></mat-icon>\n <p class=\"dz-title\">{{ texts.dropzoneLabel }}</p>\n <p class=\"dz-hint\">\n {{ t('dropzoneHint', 'Arraste e solte arquivos aqui ou clique para selecionar') }}\n </p>\n <button\n type=\"button\"\n mat-stroked-button\n [disabled]=\"!baseUrl || isUploading\"\n [attr.aria-describedby]=\"messageRegionId\"\n (click)=\"openFile(fileInput)\"\n >\n {{ texts.dropzoneButton }}\n </button>\n </div>\n\n <input\n type=\"file\"\n #fileInput\n (change)=\"onFilesSelected($event)\"\n [attr.multiple]=\"allowMultiple ? '' : null\"\n [accept]=\"acceptString\"\n hidden\n />\n\n <!-- Removido bloco pending-files: substituído por overlay de seleção -->\n\n <div\n class=\"conflict-policy\"\n *ngIf=\"config?.ui?.showConflictPolicySelector\"\n >\n <label [for]=\"conflictPolicyInputId\">{{ texts.conflictPolicyLabel }}</label>\n <select [id]=\"conflictPolicyInputId\" [formControl]=\"conflictPolicy\">\n <option *ngFor=\"let p of conflictPolicies\" [value]=\"p\">\n {{ p }}\n </option>\n </select>\n </div>\n\n <div class=\"metadata\" *ngIf=\"config?.ui?.showMetadataForm\">\n <label [for]=\"metadataInputId\">{{ texts.metadataLabel }}</label>\n <textarea [id]=\"metadataInputId\" [formControl]=\"metadata\"></textarea>\n <div class=\"error\" *ngIf=\"metadataError\">{{ metadataError }}</div>\n </div>\n\n <div\n class=\"progress\"\n *ngIf=\"showProgress\"\n [id]=\"progressRegionId\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <mat-progress-bar\n mode=\"determinate\"\n [value]=\"uploadProgressValue\"\n [attr.aria-label]=\"texts.progressAriaLabel\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuemax]=\"100\"\n [attr.aria-valuenow]=\"uploadProgressValue\"\n ></mat-progress-bar>\n <span class=\"sr-only\">{{ texts.progressAriaLabel }} {{ uploadProgressValue }}%</span>\n </div>\n\n <ul class=\"file-feedback\" *ngIf=\"hasUploadedFiles\">\n <li *ngFor=\"let f of uploadedFiles\">\n {{ f.fileName }} -\n {{\n f.success ? t('statusSuccess', 'Enviado') : t('statusError', 'Erro')\n }}\n </li>\n </ul>\n\n <section class=\"bulk-results\" *ngIf=\"hasLastResults\">\n <header class=\"bulk-summary\" *ngIf=\"lastStats\">\n <div class=\"stat\">\n <span class=\"label\">{{ t('bulkSummaryTotal', 'Total') }}</span>\n <span class=\"value\">{{ lastStats.total }}</span>\n </div>\n <div class=\"stat success\">\n <mat-icon [praxisIcon]=\"'check_circle'\"></mat-icon>\n <span class=\"label\">{{ t('bulkSummarySuccess', 'Sucesso') }}</span>\n <span class=\"value\">{{ lastStats.succeeded }}</span>\n </div>\n <div class=\"stat failed\">\n <mat-icon [praxisIcon]=\"'error'\"></mat-icon>\n <span class=\"label\">{{ t('bulkSummaryFailed', 'Falhas') }}</span>\n <span class=\"value\">{{ lastStats.failed }}</span>\n </div>\n </header>\n <ul class=\"results-list\">\n <li\n class=\"result-item\"\n *ngFor=\"let r of visibleResults\"\n [class.ok]=\"r.status === BulkUploadResultStatus.SUCCESS\"\n [class.err]=\"r.status === BulkUploadResultStatus.FAILED\"\n >\n <mat-icon class=\"status-icon\">{{\n r.status === BulkUploadResultStatus.SUCCESS\n ? 'check_circle'\n : 'error'\n }}</mat-icon>\n <div class=\"main\">\n <div class=\"title\">\n <span class=\"name\">{{ r.fileName }}</span>\n <span\n class=\"badge\"\n *ngIf=\"r.status === BulkUploadResultStatus.SUCCESS\"\n >{{ t('statusSuccess', 'Enviado') }}</span\n >\n <span\n class=\"badge err\"\n *ngIf=\"r.status === BulkUploadResultStatus.FAILED\"\n >{{ t('statusError', 'Erro') }}</span\n >\n </div>\n <div class=\"meta\" *ngIf=\"r.file\">\n <span *ngIf=\"r.file.id\"\n >{{ t('resultMetaIdLabel', 'ID') }}: {{ r.file.id }}</span\n >\n <span *ngIf=\"r.file.contentType\"\n >{{ t('resultMetaTypeLabel', 'Tipo') }}:\n {{ r.file.contentType }}</span\n >\n <span *ngIf=\"r.file.fileSize\"\n >{{ t('resultMetaSizeLabel', 'Tamanho') }}:\n {{ formatBytes(r.file.fileSize) }}</span\n >\n <span *ngIf=\"r.file.uploadedAt\"\n >{{ t('resultMetaUploadedAtLabel', 'Enviado em') }}:\n {{ r.file.uploadedAt | date: 'short' }}</span\n >\n </div>\n <div class=\"error\" *ngIf=\"r.error as e\">\n <span class=\"code\">{{ primaryErrorCode(e) }}</span>\n <ng-container *ngIf=\"mapErrorFull(e) as me\">\n <span class=\"title\" *ngIf=\"me.title\">{{ me.title }}:</span>\n <span class=\"msg\">{{ me.message }}</span>\n <span class=\"action\" *ngIf=\"me.userAction\">\n — {{ me.userAction }}</span\n >\n </ng-container>\n <span class=\"trace\" *ngIf=\"traceIdOf(e) as traceId\"\n >(trace {{ traceId }})</span\n >\n </div>\n <div class=\"extra\" *ngIf=\"r.file?.metadata as m\">\n <details (toggle)=\"onDetailsToggle($event, r)\">\n <summary>{{ t('detailsMetadata', 'Metadados') }}</summary>\n <pre>{{ m | json }}</pre>\n </details>\n </div>\n </div>\n <div class=\"item-actions\">\n <button\n mat-icon-button\n [matTooltip]=\"t('details', 'Detalhes')\"\n [attr.aria-label]=\"resultActionAriaLabel('details', 'Detalhes', r.fileName)\"\n (click)=\"toggleDetailsFor(r)\"\n >\n <mat-icon [praxisIcon]=\"'info'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"t('retry', 'Reenviar')\"\n [attr.aria-label]=\"resultActionAriaLabel('retry', 'Reenviar', r.fileName)\"\n (click)=\"onRetry(r)\"\n [disabled]=\"isUploading\"\n >\n <mat-icon [praxisIcon]=\"'refresh'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"t('download', 'Baixar')\"\n [attr.aria-label]=\"resultActionAriaLabel('download', 'Baixar', r.fileName)\"\n (click)=\"onDownload(r)\"\n [disabled]=\"r.status !== BulkUploadResultStatus.SUCCESS\"\n >\n <mat-icon [praxisIcon]=\"'download'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"t('copyLink', 'Copiar link')\"\n [attr.aria-label]=\"resultActionAriaLabel('copyLink', 'Copiar link', r.fileName)\"\n (click)=\"onCopyLink(r)\"\n [disabled]=\"r.status !== BulkUploadResultStatus.SUCCESS\"\n >\n <mat-icon [praxisIcon]=\"'link'\"></mat-icon>\n </button>\n <button\n mat-icon-button\n [matTooltip]=\"t('remove', 'Remover')\"\n [attr.aria-label]=\"resultActionAriaLabel('remove', 'Remover', r.fileName)\"\n (click)=\"removeResult(r)\"\n >\n <mat-icon [praxisIcon]=\"'close'\"></mat-icon>\n </button>\n </div>\n </li>\n </ul>\n <div\n class=\"list-footer\"\n *ngIf=\"\n !showAllResults &&\n lastResults &&\n lastResults.length > (config?.ui?.list?.collapseAfter ?? 0)\n \"\n >\n <button mat-button type=\"button\" (click)=\"showAllResults = true\">\n {{ t('showAll', 'Ver todos') }}\n </button>\n </div>\n <div\n class=\"list-footer\"\n *ngIf=\"\n showAllResults &&\n (config?.ui?.list?.collapseAfter ?? 0) > 0 &&\n lastResults &&\n lastResults.length > (config?.ui?.list?.collapseAfter ?? 0)\n \"\n >\n <button mat-button type=\"button\" (click)=\"showAllResults = false\">\n {{ t('showLess', 'Ver menos') }}\n </button>\n </div>\n </section>\n\n <ng-content></ng-content>\n </div>\n `,\n})\nexport class PraxisFilesUpload implements OnInit, OnChanges, AfterViewInit, OnDestroy {\n @Input() config: FilesUploadConfig | null = null;\n private _filesUploadId = '';\n @Input() set filesUploadId(value: string | null | undefined) {\n this._filesUploadId = value ?? '';\n }\n get filesUploadId(): string {\n return this._filesUploadId;\n }\n @Input() componentInstanceId?: string;\n @Input() baseUrl?: string;\n @Input() displayMode: 'full' | 'compact' = 'full';\n @Input() context: Record<string, unknown> | null = null;\n @Input() enableCustomization = false;\n\n @Output() uploadSuccess = new EventEmitter<FileMetadata>();\n @Output() bulkComplete = new EventEmitter<BulkUploadResponseData>();\n @Output() error = new EventEmitter<ErrorResponse>();\n @Output() rateLimited = new EventEmitter<RateLimitInfo>();\n @Output() uploadStart = new EventEmitter<UploadStartEvent>();\n @Output() uploadProgress = new EventEmitter<UploadProgressEvent>();\n // Novos outputs Sub-issue 4\n @Output() retry = new EventEmitter<BulkUploadFileResult>();\n @Output() download = new EventEmitter<BulkUploadFileResult>();\n @Output() copyLink = new EventEmitter<BulkUploadFileResult>();\n @Output() detailsOpened = new EventEmitter<BulkUploadFileResult>();\n @Output() detailsClosed = new EventEmitter<BulkUploadFileResult>();\n @Output() pendingStateChange = new EventEmitter<PendingFilesState>();\n @Output() proximityChange = new EventEmitter<boolean>();\n @Output() readinessChange = new EventEmitter<FilesUploadReadinessEvent>();\n\n @ViewChild('fileInput') private fileInput?: ElementRef<HTMLInputElement>;\n @ViewChild('host', { static: true })\n private hostRef?: ElementRef<HTMLElement>;\n @ViewChild('proximityOverlayTmpl') private overlayTmpl?: TemplateRef<any>;\n // Novo: template do overlay de seleção\n @ViewChild('selectedOverlayTmpl')\n private selectedOverlayTmpl?: TemplateRef<any>;\n\n conflictPolicies: Array<\n 'ERROR' | 'SKIP' | 'OVERWRITE' | 'MAKE_UNIQUE' | 'RENAME'\n > = ['RENAME', 'ERROR', 'OVERWRITE', 'SKIP', 'MAKE_UNIQUE'];\n conflictPolicy = new FormControl<string>('RENAME');\n uploadProgressValue = 0;\n allowMultiple = false;\n rateLimit: RateLimitInfo | null = null;\n quotaExceeded = false;\n errorMessage = '';\n acceptString = '';\n metadata = new FormControl('');\n uploadedFiles: Array<{ fileName: string; success: boolean }> = [];\n texts: FilesUploadResolvedTexts;\n\n // Estados para lista rica de resultados\n lastResults: BulkUploadFileResult[] | null = null;\n lastStats: { total: number; succeeded: number; failed: number } | null = null;\n\n // Expor enum no template\n BulkUploadResultStatus = BulkUploadResultStatus;\n\n private uploading = false;\n isDragging = false;\n private currentFiles: File[] = [];\n\n // Config efetiva do servidor para fallbacks\n private serverEffective?: EffectiveUploadConfig;\n readinessState: FilesUploadReadyState = 'idle';\n readinessSource: FilesUploadReadySource = 'local';\n\n // Proximidade/overlay\n showProximityOverlay = false;\n private proxSub?: Subscription;\n private proxPtrSub?: Subscription;\n private hostRect?: DOMRect;\n private draggingFiles = false;\n\n // CDK Overlay state\n private overlayRef?: OverlayRef;\n private escListener = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this.hideProximityOverlay();\n this.hideSelectedOverlay();\n }\n };\n private windowDropListener = (_e: DragEvent) => {\n this.hideProximityOverlay();\n };\n private windowDragEndListener = (_e: DragEvent) => {\n this.hideProximityOverlay();\n };\n\n // Novo: overlay para seleção\n private selectedOverlayRef?: OverlayRef;\n\n // Lista: colapso\n showAllResults = false;\n private initialized = false;\n private readonly generatedA11yId = `files-upload-${++nextPraxisFilesUploadA11yId}`;\n\n constructor(\n private settingsPanel: SettingsPanelService,\n private dragProx: DragProximityService,\n private overlay: Overlay,\n private viewContainerRef: ViewContainerRef,\n private cdr: ChangeDetectorRef,\n @Inject(ASYNC_CONFIG_STORAGE) private configStorage: AsyncConfigStorage,\n private i18n: PraxisI18nService,\n @Optional()\n @Inject(FILES_UPLOAD_TEXTS)\n private readonly legacyTexts?: FilesUploadTexts,\n @Optional()\n @Inject(TRANSLATE_LIKE)\n private readonly legacyTranslate?: TranslateLike,\n @Optional() private configService?: ConfigService,\n @Optional() private api?: FilesApiClient,\n @Optional() private presign?: PresignedUploaderService,\n @Optional() private errors?: ErrorMapperService,\n ) {\n this.texts = {\n settingsAriaLabel: '',\n dropzoneLabel: '',\n dropzoneButton: '',\n conflictPolicyLabel: '',\n metadataLabel: '',\n progressAriaLabel: '',\n rateLimitBanner: '',\n };\n }\n\n private readonly componentKeys = inject(ComponentKeyService);\n private readonly route = (() => { try { return inject(ActivatedRoute); } catch { return undefined as ActivatedRoute | undefined; } })();\n private warnedMissingId = false;\n\n private requireApiClient(): FilesApiClient {\n if (!this.api) {\n throw new Error('FilesApiClient is not available.');\n }\n return this.api;\n }\n\n private requireBaseUrl(): string {\n if (!this.baseUrl) {\n throw new Error(\n this.t(\n 'baseUrlMissing',\n 'Base URL não configurada. Informe [baseUrl] para habilitar o envio.',\n ),\n );\n }\n return this.baseUrl;\n }\n\n // Helpers de UI\n get showProgress(): boolean {\n return this.uploading;\n }\n // Getter público para binding existente\n get isUploading(): boolean {\n return this.uploading;\n }\n get hasUploadedFiles(): boolean {\n return this.uploadedFiles.length > 0;\n }\n get pendingFiles(): File[] {\n return this.currentFiles;\n }\n get pendingCount(): number {\n return this.currentFiles.length;\n }\n get a11yBaseId(): string {\n return this.filesUploadId || this.componentInstanceId || this.generatedA11yId;\n }\n get messageRegionId(): string {\n return `${this.a11yBaseId}-messages`;\n }\n get progressRegionId(): string {\n return `${this.a11yBaseId}-progress`;\n }\n get conflictPolicyInputId(): string {\n return `${this.a11yBaseId}-conflict-policy`;\n }\n get metadataInputId(): string {\n return `${this.a11yBaseId}-metadata`;\n }\n get selectedOverlayTitleId(): string {\n return `${this.a11yBaseId}-selected-title`;\n }\n get hasLastResults(): boolean {\n return Array.isArray(this.lastResults) && this.lastResults.length > 0;\n }\n\n // Abre o seletor de arquivo\n openFile(input: HTMLInputElement): void {\n if (!this.uploading) {\n input.click();\n }\n }\n\n // Expor método público para pais (wrapper) abrirem o seletor\n openFileDialog(): void {\n const el = this.fileInput?.nativeElement;\n if (el) this.openFile(el);\n }\n\n // Exibe nome de arquivo de forma segura\n displayFileName(f: any): string {\n return f && typeof f === 'object' && 'name' in f ? String(f.name) : '';\n }\n\n formatBytes(bytes: number | undefined | null): string {\n const b = typeof bytes === 'number' ? bytes : 0;\n if (b < 1024) {\n return `${b} ${this.t('sizeUnitBytes', 'Bytes')}`;\n }\n const units = [\n this.t('sizeUnitKB', 'KB'),\n this.t('sizeUnitMB', 'MB'),\n this.t('sizeUnitGB', 'GB'),\n this.t('sizeUnitTB', 'TB'),\n ];\n let v = b / 1024;\n let i = 0;\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024;\n i++;\n }\n return `${v.toFixed(1)} ${units[i]}`;\n }\n\n // Novo helper com metadados\n mapErrorFull(err: unknown) {\n if (!err) return { message: '' } as any;\n return this.errors ? this.errors.map(err as ErrorLike) : (err as any);\n }\n\n get metadataError(): string | null {\n if (!this.config?.ui?.showMetadataForm) return null;\n const val = this.metadata.value;\n if (!val) return null;\n try {\n JSON.parse(val);\n return null;\n } catch {\n return this.t('invalidMetadata', 'Metadados inválidos.');\n }\n }\n\n ngOnInit(): void {\n const key = this.storageKey();\n this.applyConfig(this.config ?? {});\n this.resolveTexts();\n this.loadServerEffectiveConfig();\n this.initialized = true;\n if (key) {\n this.configStorage.loadConfig<FilesUploadConfig>(key).pipe(take(1)).subscribe((stored) => {\n if (stored) {\n this.config = stored;\n this.applyConfig(this.config ?? {});\n this.resolveTexts();\n }\n });\n }\n }\n\n ngOnChanges(): void {\n this.applyConfig(this.config ?? {});\n this.resolveTexts();\n if (this.initialized) {\n this.loadServerEffectiveConfig();\n }\n }\n\n ngAfterViewInit(): void {\n // Calcular retângulo do host\n this.hostRect = this.hostRef?.nativeElement.getBoundingClientRect();\n // Atualizar em resize/scroll simples (MVP)\n window.addEventListener('resize', this.updateHostRect, { passive: true });\n window.addEventListener('scroll', this.updateHostRect, { passive: true });\n\n const debounceMs = this.config?.ui?.dropzone?.expandDebounceMs ?? 120;\n this.proxSub = this.dragProx\n .isDraggingWithFiles()\n .pipe(debounceTime(debounceMs))\n .subscribe((dragging) => {\n this.draggingFiles = dragging;\n this.evalProximity();\n });\n this.proxPtrSub = this.dragProx\n .pointer()\n .pipe(debounceTime(debounceMs))\n .subscribe(() => this.evalProximity());\n\n // Listeners globais para fechar overlay\n window.addEventListener('keydown', this.escListener, { passive: true });\n window.addEventListener('drop', this.windowDropListener, { passive: true });\n window.addEventListener('dragend', this.windowDragEndListener, {\n passive: true,\n });\n // Garantir que overlay de seleção sincronize se já houver arquivos pendentes\n this.manageSelectedOverlay();\n }\n\n ngOnDestroy(): void {\n window.removeEventListener('resize', this.updateHostRect as any);\n window.removeEventListener('scroll', this.updateHostRect as any);\n this.proxSub?.unsubscribe();\n this.proxPtrSub?.unsubscribe();\n window.removeEventListener('keydown', this.escListener as any);\n window.removeEventListener('drop', this.windowDropListener as any);\n window.removeEventListener('dragend', this.windowDragEndListener as any);\n this.disposeOverlay();\n this.disposeSelectedOverlay();\n }\n\n private updateHostRect = () => {\n this.hostRect = this.hostRef?.nativeElement.getBoundingClientRect();\n this.syncOverlayGeometry();\n };\n\n private evalProximity(): void {\n const oldValue = this.showProximityOverlay;\n let newValue = false;\n\n const cfg = this.config?.ui?.dropzone;\n const enabled = cfg?.expandOnDragProximity !== false; // default true\n const blocked =\n !this.baseUrl ||\n (this.quotaExceeded && this.config?.quotas?.blockOnExceed) ||\n this.isUploading;\n\n if (enabled && this.hostRect && !blocked) {\n const proxPx = cfg?.proximityPx ?? 64;\n const near = this.dragProx.withinProximity(this.hostRect, proxPx);\n newValue = this.draggingFiles && near;\n }\n\n this.showProximityOverlay = newValue;\n this.manageOverlay();\n\n if (oldValue !== this.showProximityOverlay) {\n this.proximityChange.emit(this.showProximityOverlay);\n }\n }\n\n private manageOverlay(): void {\n const mode = this.config?.ui?.dropzone?.expandMode ?? 'overlay';\n if (mode !== 'overlay') {\n this.disposeOverlay();\n return;\n }\n if (this.showProximityOverlay) {\n this.ensureOverlay();\n } else {\n this.disposeOverlay();\n }\n }\n\n private ensureOverlay(): void {\n if (this.overlayRef || !this.hostRef || !this.overlayTmpl) {\n this.syncOverlayGeometry();\n return;\n }\n const hostEl = this.hostRef.nativeElement;\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(hostEl)\n .withLockedPosition(true)\n .withPositions([\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]);\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false,\n panelClass: 'praxis-files-upload-overlay-panel',\n });\n\n this.syncOverlayGeometry();\n\n const portal = new TemplatePortal(this.overlayTmpl, this.viewContainerRef);\n this.overlayRef.attach(portal);\n }\n\n private syncOverlayGeometry(): void {\n if (!this.overlayRef || !this.hostRef) return;\n const rect = this.hostRef.nativeElement.getBoundingClientRect();\n const height = this.config?.ui?.dropzone?.expandHeight ?? 200;\n this.overlayRef.updateSize({ width: rect.width, height });\n try {\n this.overlayRef.updatePosition();\n } catch {}\n }\n\n private disposeOverlay(): void {\n if (this.overlayRef) {\n try {\n this.overlayRef.detach();\n } catch {}\n try {\n this.overlayRef.dispose();\n } catch {}\n this.overlayRef = undefined;\n }\n }\n\n // Novo: gerenciamento do overlay de seleção\n private manageSelectedOverlay(): void {\n if (!this.hostRef || !this.selectedOverlayTmpl) return;\n if (this.pendingCount > 0 && !this.isUploading) {\n this.ensureSelectedOverlay();\n } else {\n this.hideSelectedOverlay();\n }\n this.cdr.markForCheck();\n }\n\n private ensureSelectedOverlay(): void {\n if (!this.hostRef || !this.selectedOverlayTmpl) return;\n if (!this.selectedOverlayRef) {\n const hostEl = this.hostRef.nativeElement;\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(hostEl)\n .withLockedPosition(true)\n .withPositions([\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]);\n this.selectedOverlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: false,\n panelClass: 'praxis-files-selected-overlay-panel',\n });\n // Tamanho acompanha o host, altura auto com limite via CSS\n const rect = hostEl.getBoundingClientRect();\n this.selectedOverlayRef.updateSize({ width: rect.width });\n try {\n this.selectedOverlayRef.updatePosition();\n } catch {}\n\n const portal = new TemplatePortal(\n this.selectedOverlayTmpl,\n this.viewContainerRef,\n );\n this.selectedOverlayRef.attach(portal);\n } else {\n this.syncSelectedOverlayGeometry();\n }\n }\n\n private syncSelectedOverlayGeometry(): void {\n if (!this.selectedOverlayRef || !this.hostRef) return;\n const rect = this.hostRef.nativeElement.getBoundingClientRect();\n this.selectedOverlayRef.updateSize({ width: rect.width });\n try {\n this.selectedOverlayRef.updatePosition();\n } catch {}\n }\n\n private hideSelectedOverlay(): void {\n if (this.selectedOverlayRef) {\n try {\n this.selectedOverlayRef.detach();\n } catch {}\n try {\n this.selectedOverlayRef.dispose();\n } catch {}\n this.selectedOverlayRef = undefined;\n }\n }\n\n private disposeSelectedOverlay(): void {\n this.hideSelectedOverlay();\n }\n\n private hideProximityOverlay(): void {\n if (this.showProximityOverlay) {\n this.showProximityOverlay = false;\n this.manageOverlay();\n this.proximityChange.emit(false);\n }\n }\n\n // Helpers de configuração e armazenamento\n private resolveTexts(): void {\n this.texts = {\n settingsAriaLabel: this.t(\n 'settingsAriaLabel',\n 'Abrir configurações',\n ),\n dropzoneLabel: this.t('dropzoneLabel', 'Arraste arquivos ou'),\n dropzoneButton: this.t(\n 'dropzoneButton',\n 'selecionar',\n ),\n conflictPolicyLabel: this.t(\n 'conflictPolicyLabel',\n 'Política de conflito',\n ),\n metadataLabel: this.t('metadataLabel', 'Metadados (JSON)'),\n progressAriaLabel: this.t(\n 'progressAriaLabel',\n 'Progresso do upload',\n ),\n rateLimitBanner: this.t(\n 'rateLimitBanner',\n 'Limite de requisições excedido. Tente novamente às',\n ),\n };\n }\n\n t(key: string, fallback: string): string {\n return resolvePraxisFilesUploadText(\n this.i18n,\n key,\n fallback,\n this.legacyTexts,\n this.legacyTranslate,\n );\n }\n\n get selectFilesAriaLabel(): string {\n return this.t('selectFiles', 'Selecionar arquivo(s)');\n }\n\n get policySummaryAriaLabel(): string {\n return this.t('policySummaryAction', 'Informacoes sobre politicas de upload');\n }\n\n pendingFileRemoveAriaLabel(file: File): string {\n return `${this.t('removePendingFile', 'Remover arquivo selecionado')}: ${file.name}`;\n }\n\n pendingFileMoreActionsAriaLabel(file: File): string {\n return `${this.t('moreActions', 'Mais ações')}: ${file.name}`;\n }\n\n resultActionAriaLabel(\n actionKey: string,\n fallback: string,\n fileName: string,\n ): string {\n return `${this.t(actionKey, fallback)}: ${fileName}`;\n }\n\n openSettings(): void {\n if (!this.enableCustomization) return;\n const configCopy = JSON.parse(JSON.stringify(this.config ?? {}));\n const key = this.storageKey();\n const ref = this.settingsPanel.open({\n id: `files-upload.${key || this.filesUploadId || 'default'}`,\n title: this.t('settingsTitle', 'Configuração de Upload de Arquivos'),\n content: {\n component: PraxisFilesUploadConfigEditor,\n inputs: { ...configCopy, baseUrl: this.baseUrl },\n },\n });\n\n ref.applied$.subscribe((cfg: FilesUploadConfig) => this.applyConfig(cfg));\n ref.saved$.subscribe((cfg: FilesUploadConfig) => {\n if (key) {\n this.configStorage\n .saveConfig(key, cfg)\n .pipe(take(1))\n .subscribe({ error: () => {} });\n }\n this.applyConfig(cfg);\n });\n ref.reset$.subscribe(() => {\n this.applyConfig(this.config ?? {});\n });\n }\n\n private applyConfig(cfg: FilesUploadConfig): void {\n this.config = { ...cfg };\n this.conflictPolicy.setValue(\n (cfg.options?.defaultConflictPolicy ?? 'RENAME') as string,\n );\n this.allowMultiple = (cfg.limits?.maxFilesPerBulk ?? 1) > 1;\n const acc = cfg.ui?.accept ?? [];\n this.acceptString = acc.includes('*') ? '' : acc.join(',');\n }\n\n private loadServerEffectiveConfig(): void {\n if (!this.configService || !this.baseUrl) {\n this.setReadinessState('ready', 'local');\n return;\n }\n\n this.setReadinessState('loading', 'server');\n this.configService\n .getEffectiveConfig(this.baseUrl)\n .pipe(take(1))\n .subscribe({\n next: (cfg) => {\n this.serverEffective = cfg;\n this.setReadinessState('ready', 'server');\n },\n error: () => {\n // Fallback local segue válido quando a consulta de config falha.\n this.setReadinessState('ready', 'fallback');\n },\n });\n }\n\n private setReadinessState(\n state: FilesUploadReadyState,\n source: FilesUploadReadySource,\n ): void {\n this.readinessState = state;\n this.readinessSource = source;\n this.readinessChange.emit({\n state,\n source,\n filesUploadId: this.filesUploadId || undefined,\n baseUrl: this.baseUrl,\n });\n this.cdr.markForCheck();\n }\n\n private storageKey(): string | null {\n const id = this.componentKeyId();\n return id ? `files-upload-config:${id}` : null;\n }\n\n private componentKeyId(): string | null {\n const key = this.componentKeys.buildComponentId({\n componentType: 'praxis-files-upload',\n componentId: this.filesUploadId,\n instanceKey: this.componentInstanceId,\n componentRef: this,\n route: this.route,\n requireComponentId: true,\n });\n if (!key) this.warnMissingId();\n return key;\n }\n\n private warnMissingId(): void {\n if (this.warnedMissingId) return;\n this.warnedMissingId = true;\n console.warn('[PraxisFilesUpload] filesUploadId e necessario para persistencia de configuracao.');\n }\n\n onDragOver(evt: DragEvent): void {\n evt.preventDefault();\n this.isDragging = true;\n }\n\n onDragLeave(_evt: DragEvent): void {\n this.isDragging = false;\n }\n\n onDrop(evt: DragEvent): void {\n evt.preventDefault();\n this.isDragging = false;\n this.hideProximityOverlay();\n if (evt.dataTransfer?.files?.length) {\n const files = Array.from(evt.dataTransfer.files);\n if (this.config?.ui?.manualUpload) {\n this.currentFiles = files;\n this.manageSelectedOverlay();\n this.emitPendingState();\n } else {\n this.startUpload(files);\n }\n }\n }\n\n onFilesSelected(evt: Event): void {\n const input = evt.target as HTMLInputElement;\n if (input.files?.length) {\n const files = Array.from(input.files);\n if (this.config?.ui?.manualUpload) {\n this.currentFiles = files;\n this.manageSelectedOverlay();\n this.emitPendingState();\n } else {\n this.startUpload(files);\n }\n input.value = '';\n }\n }\n\n submitPendingFiles(): void {\n if (this.currentFiles.length) {\n this.hideSelectedOverlay();\n this.startUpload(this.currentFiles);\n }\n }\n\n resetPendingFiles(): void {\n this.currentFiles = [];\n this.emitPendingState();\n this.errorMessage = '';\n this.hideSelectedOverlay();\n }\n\n // Remoção individual dentro do overlay de seleção\n removePendingFile(file: File): void {\n this.currentFiles = this.currentFiles.filter((f) => f !== file);\n this.emitPendingState();\n this.manageSelectedOverlay();\n }\n\n private emitPendingState(): void {\n const files = [...this.currentFiles];\n this.pendingStateChange.emit({\n files,\n count: files.length,\n hasPending: files.length > 0,\n });\n }\n\n private startUpload(files: File[]): void {\n if (\n !this.baseUrl ||\n (this.quotaExceeded && this.config?.quotas?.blockOnExceed)\n ) {\n return;\n }\n if (!this.api) {\n this.errorMessage = this.t(\n 'serviceUnavailable',\n 'Serviço de upload indisponível.',\n );\n return;\n }\n this.errorMessage = '';\n // Limpa resultados anteriores\n this.lastResults = null;\n this.lastStats = null;\n\n if (!this.validateFiles(files)) {\n return;\n }\n this.uploading = true;\n this.uploadProgressValue = 0;\n this.rateLimit = null;\n this.uploadedFiles = [];\n this.currentFiles = files;\n this.hideSelectedOverlay();\n\n let metadataObj: Record<string, unknown> | undefined;\n if (this.config?.ui?.showMetadataForm && this.metadata.value) {\n try {\n metadataObj = JSON.parse(this.metadata.value);\n } catch {\n const map = this.config?.messages?.errors || {};\n this.errorMessage =\n map['metadata'] || this.t('invalidMetadata', 'Metadados inválidos.');\n this.error.emit({} as ErrorResponse);\n this.uploading = false;\n return;\n }\n }\n\n const optionsJson = this.buildOptionsJson(metadataObj);\n\n const strategy = this.config?.strategy ?? 'direct';\n this.uploadStart.emit({\n files,\n mode: files.length > 1 && this.allowMultiple ? 'bulk' : 'single',\n strategy,\n filesUploadId: this.filesUploadId || undefined,\n baseUrl: this.baseUrl,\n });\n if (files.length > 1 && this.allowMultiple) {\n this.uploadMultipleFiles(files, strategy, metadataObj, optionsJson);\n } else if (strategy === 'presign' || strategy === 'auto') {\n const file = files[0];\n if (!this.presign) {\n // Fallback para envio direto\n this.directUpload(file, {\n optionsJson,\n retryCount: this.config?.bulk?.retryCount,\n });\n return;\n }\n const api = this.requireApiClient();\n const baseUrl = this.requireBaseUrl();\n api.presign(baseUrl, file.name).subscribe({\n next: (target) => {\n const uploadOptions: UploadOptions = {\n optionsJson,\n metadata: metadataObj,\n conflictPolicy: this.conflictPolicy.value || 'RENAME',\n };\n this.presign!.upload(\n target,\n file,\n uploadOptions,\n this.config?.bulk?.retryCount ?? 0,\n ).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.Response) {\n const responseEvent = event as HttpResponse<\n UploadResponse | HttpResponse<UploadResponse> | null | undefined\n >;\n const response =\n responseEvent.body instanceof HttpResponse\n ? (responseEvent.body.body as UploadResponse | null | undefined)\n : (responseEvent.body as UploadResponse | null | undefined);\n const meta = this.mapUploadResponseToFileMetadata(response);\n if (meta?.id) {\n this.finishUpload(true, meta);\n } else {\n this.handleError(\n new Error('Presigned upload completed without file metadata.'),\n );\n }\n } else {\n this.handleProgress(event);\n }\n },\n error: (err) => {\n if (strategy === 'auto') {\n this.directUpload(file, {\n optionsJson,\n retryCount: this.config?.bulk?.retryCount,\n });\n } else {\n this.handleError(err);\n }\n },\n });\n },\n error: (err) => {\n if (strategy === 'auto') {\n this.directUpload(file, {\n optionsJson,\n retryCount: this.config?.bulk?.retryCount,\n });\n } else {\n this.handleError(err);\n }\n },\n });\n } else {\n const file = files[0];\n this.directUpload(file, {\n optionsJson,\n retryCount: this.config?.bulk?.retryCount,\n metadata: metadataObj,\n conflictPolicy: this.conflictPolicy.value || 'RENAME',\n });\n }\n }\n\n private directUpload(file: File, options: UploadOptions): void {\n const api = this.requireApiClient();\n const baseUrl = this.requireBaseUrl();\n api.upload(baseUrl, file, options).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.Response) {\n const resp = event.body as UploadResponse;\n const meta = this.mapUploadResponseToFileMetadata(resp);\n this.finishUpload(true, meta);\n } else {\n this.handleProgress(event);\n }\n },\n error: (err) => this.handleError(err),\n });\n }\n\n private uploadMultipleFiles(\n files: File[],\n strategy: 'direct' | 'presign' | 'auto',\n metadataObj: Record<string, unknown> | undefined,\n optionsJson: string | undefined,\n ): void {\n if (strategy === 'direct') {\n this.uploadMultipleFilesDirect(files, optionsJson, metadataObj);\n return;\n }\n\n from(files)\n .pipe(\n concatMap((file) =>\n this.uploadSingleFileByStrategy(file, strategy, metadataObj, optionsJson),\n ),\n toArray(),\n )\n .subscribe({\n next: (results) => {\n const responseData = this.buildBulkResponseData(results);\n this.bulkComplete.emit(responseData);\n this.lastResults = results.length ? results : null;\n this.lastStats = {\n total: responseData.totalProcessed,\n succeeded: responseData.totalSuccess,\n failed: responseData.totalFailed,\n };\n if (responseData.totalSuccess === 0 && responseData.totalFailed > 0) {\n const firstError = results.find((result) => result.error)?.error;\n const mappedError = firstError ? this.mapErrorFull(firstError) : null;\n this.errorMessage =\n mappedError?.message ||\n this.t('genericUploadError', 'Erro no envio de arquivo.');\n }\n this.finishUpload(true, undefined, results);\n },\n });\n }\n\n private uploadMultipleFilesDirect(\n files: File[],\n optionsJson: string | undefined,\n metadataObj: Record<string, unknown> | undefined,\n ): void {\n const api = this.requireApiClient();\n const baseUrl = this.requireBaseUrl();\n const policy = this.conflictPolicy.value || 'RENAME';\n const bulkFiles: BulkUploadFile[] = files.map((f) => ({\n file: f,\n metadata: metadataObj,\n conflictPolicy: policy,\n }));\n api.bulkUpload(baseUrl, bulkFiles, {\n optionsJson,\n failFast: this.config?.bulk?.failFast,\n retryCount: this.config?.bulk?.retryCount,\n }).subscribe({\n next: (event) => {\n if (event.type === HttpEventType.Response) {\n const responseData = (event.body as { data: BulkUploadResponseData }).data;\n this.bulkComplete.emit(responseData);\n const results = responseData.results;\n const stats = {\n total: responseData.totalProcessed,\n succeeded: responseData.totalSuccess,\n failed: responseData.totalFailed,\n };\n this.lastResults = results.length ? results : null;\n this.lastStats = stats;\n this.finishUpload(true, undefined, results);\n } else {\n this.handleProgress(event);\n }\n },\n error: (err) => this.handleError(err),\n });\n }\n\n private uploadSingleFileByStrategy(\n file: File,\n strategy: 'presign' | 'auto',\n metadataObj: Record<string, unknown> | undefined,\n optionsJson: string | undefined,\n ) {\n if (!this.presign) {\n return this.uploadSingleFileDirectResult(file, metadataObj, optionsJson);\n }\n const api = this.requireApiClient();\n const baseUrl = this.requireBaseUrl();\n\n const uploadOptions: UploadOptions = {\n optionsJson,\n metadata: metadataObj,\n conflictPolicy: this.conflictPolicy.value || 'RENAME',\n retryCount: this.config?.bulk?.retryCount,\n };\n\n return api\n .presign(baseUrl, file.name)\n .pipe(\n concatMap((target) =>\n this.presign!.upload(\n target,\n file,\n uploadOptions,\n this.config?.bulk?.retryCount ?? 0,\n ),\n ),\n tap((event) => {\n if (event.type !== HttpEventType.Response) {\n this.handleProgress(event);\n }\n }),\n filter((event) => event.type === HttpEventType.Response),\n take(1),\n map((event) => {\n const responseEvent = event as HttpResponse<\n UploadResponse | HttpResponse<UploadResponse> | null | undefined\n >;\n const meta = this.mapUploadResponseToFileMetadata(\n responseEvent.body instanceof HttpResponse\n ? (responseEvent.body.body as UploadResponse | null | undefined)\n : (responseEvent.body as UploadResponse | null | undefined),\n );\n if (!meta?.id) {\n return this.buildBulkFailureResult(\n file,\n this.createOperationalError(\n 'PRESIGN_METADATA_MISSING',\n this.t(\n 'presignMetadataMissing',\n 'Upload assinado concluído sem metadados do arquivo.',\n ),\n ),\n );\n }\n return this.buildBulkSuccessResult(file, meta);\n }),\n catchError((err) => {\n if (strategy === 'auto') {\n return this.uploadSingleFileDirectResult(file, metadataObj, optionsJson);\n }\n return of(this.buildBulkFailureResult(file, this.normalizeBulkError(err)));\n }),\n defaultIfEmpty(\n this.buildBulkFailureResult(\n file,\n this.createOperationalError(\n 'UPLOAD_RESPONSE_MISSING',\n this.t(\n 'genericUploadError',\n 'Erro no envio de arquivo.',\n ),\n ),\n ),\n ),\n );\n }\n\n private uploadSingleFileDirectResult(\n file: File,\n metadataObj: Record<string, unknown> | undefined,\n optionsJson: string | undefined,\n ) {\n const api = this.requireApiClient();\n const baseUrl = this.requireBaseUrl();\n return api\n .upload(baseUrl, file, {\n optionsJson,\n retryCount: this.config?.bulk?.retryCount,\n metadata: metadataObj,\n conflictPolicy: this.conflictPolicy.value || 'RENAME',\n })\n .pipe(\n tap((event) => {\n if (event.type !== HttpEventType.Response) {\n this.handleProgress(event);\n }\n }),\n filter((event) => event.type === HttpEventType.Response),\n take(1),\n map((event) => {\n const responseEvent = event as HttpResponse<\n UploadResponse | null | undefined\n >;\n const meta = this.mapUploadResponseToFileMetadata(\n responseEvent.body,\n );\n if (!meta?.id) {\n return this.buildBulkFailureResult(\n file,\n this.createOperationalError(\n 'UPLOAD_RESPONSE_MISSING',\n this.t(\n 'genericUploadError',\n 'Erro no envio de arquivo.',\n ),\n ),\n );\n }\n return this.buildBulkSuccessResult(file, meta);\n }),\n catchError((err) => of(this.buildBulkFailureResult(file, this.normalizeBulkError(err)))),\n defaultIfEmpty(\n this.buildBulkFailureResult(\n file,\n this.createOperationalError(\n 'UPLOAD_RESPONSE_MISSING',\n this.t(\n 'genericUploadError',\n 'Erro no envio de arquivo.',\n ),\n ),\n ),\n ),\n );\n }\n\n private buildBulkResponseData(\n results: BulkUploadFileResult[],\n ): BulkUploadResponseData {\n const totalSuccess = results.filter(\n (result) => result.status === BulkUploadResultStatus.SUCCESS,\n ).length;\n const totalFailed = results.length - totalSuccess;\n return {\n totalProcessed: results.length,\n totalSuccess,\n totalFailed,\n overallSuccess: totalFailed === 0,\n results,\n };\n }\n\n private buildBulkSuccessResult(\n file: File,\n meta: FileMetadata,\n ): BulkUploadFileResult {\n return {\n fileName: file.name,\n status: BulkUploadResultStatus.SUCCESS,\n file: meta,\n };\n }\n\n private buildBulkFailureResult(\n file: File,\n error: ErrorLike,\n ): BulkUploadFileResult {\n return {\n fileName: file.name,\n status: BulkUploadResultStatus.FAILED,\n error,\n };\n }\n\n private normalizeBulkError(err: unknown): ErrorLike {\n if (err instanceof HttpErrorResponse && err.error) {\n return err.error as ErrorLike;\n }\n return this.createOperationalError(\n 'UPLOAD_OPERATION_FAILED',\n this.t('genericUploadError', 'Erro no envio de arquivo.'),\n err,\n );\n }\n\n private createOperationalError(\n code: string,\n message: string,\n details?: unknown,\n ): ApiErrorItem {\n return {\n code,\n message,\n details,\n };\n }\n\n private normalizeErrorEnvelope(err: unknown): ErrorResponse {\n if (\n err &&\n typeof err === 'object' &&\n 'status' in err &&\n 'message' in err &&\n 'errors' in err\n ) {\n return err as ErrorResponse;\n }\n\n const message =\n err instanceof Error && err.message\n ? err.message\n : this.t('genericUploadError', 'Erro no envio de arquivo.');\n\n return {\n status: 'failure',\n message,\n errors: [\n this.createOperationalError(\n 'UPLOAD_OPERATION_FAILED',\n message,\n err,\n ),\n ],\n timestamp: new Date().toISOString(),\n };\n }\n\n private buildOptionsJson(\n customMeta?: Record<string, unknown>,\n ): string | undefined {\n const effective = this.serverEffective?.options;\n const nameConflictPolicy =\n this.conflictPolicy.value ||\n this.config?.options?.defaultConflictPolicy ||\n effective?.nameConflictPolicy ||\n 'RENAME';\n\n const limits = this.config?.limits ?? {};\n const advanced = this.config?.options ?? {};\n\n // Garantir maxUploadSizeMb positivo usando fallback do servidor ou default 50\n const maxUploadSizeMb =\n typeof advanced.maxUploadSizeMb === 'number'\n ? advanced.maxUploadSizeMb\n : typeof effective?.maxUploadSizeMb === 'number'\n ? effective?.maxUploadSizeMb\n : 50;\n\n const options: any = { nameConflictPolicy };\n\n if (typeof maxUploadSizeMb === 'number' && maxUploadSizeMb > 0) {\n options.maxUploadSizeMb = maxUploadSizeMb;\n }\n // strictValidation: fallback para server\n if (typeof advanced.strictValidation === 'boolean') {\n options.strictValidation = advanced.strictValidation;\n } else if (typeof effective?.strictValidation === 'boolean') {\n options.strictValidation = effective.strictValidation;\n }\n\n // Arrays/strings opcionais: usar config ou fallback do servidor quando disponível\n const allowed = advanced.allowedExtensions?.length\n ? advanced.allowedExtensions\n : effective?.allowedExtensions && effective.allowedExtensions.length\n ? effective.allowedExtensions\n : undefined;\n if (allowed) options.allowedExtensions = allowed;\n\n const mimes = advanced.acceptMimeTypes?.length\n ? advanced.acceptMimeTypes\n : effective?.acceptMimeTypes && effective.acceptMimeTypes.length\n ? effective.acceptMimeTypes\n : undefined;\n if (mimes) options.acceptMimeTypes = mimes;\n\n const targetDir = advanced.targetDirectory ?? effective?.targetDirectory;\n if (targetDir) options.targetDirectory = targetDir;\n\n if (typeof advanced.enableVirusScanning === 'boolean') {\n options.enableVirusScanning = advanced.enableVirusScanning;\n } else if (typeof effective?.enableVirusScanning === 'boolean') {\n options.enableVirusScanning = effective.enableVirusScanning;\n }\n\n // Mapear metadados para Map<String,String>\n if (customMeta && typeof customMeta === 'object') {\n const mapped: Record<string, string> = {};\n for (const [k, v] of Object.entries(customMeta)) {\n if (v === undefined || v === null) continue;\n const resolved = typeof v === 'string' ? this.resolveTemplateString(v) : v;\n mapped[k] = String(resolved as any);\n }\n if (Object.keys(mapped).length) options.customMetadata = mapped;\n }\n\n try {\n return JSON.stringify(options);\n } catch {\n return undefined;\n }\n }\n\n private handleProgress(event: HttpEvent<unknown>): void {\n if (event.type === HttpEventType.UploadProgress && event.total) {\n const progress = Math.round((event.loaded / event.total) * 100);\n this.uploadProgressValue = progress;\n this.uploadProgress.emit({\n progress,\n loaded: event.loaded,\n total: event.total,\n });\n }\n }\n\n private handleError(err: unknown): void {\n this.uploading = false;\n if (this.currentFiles.length) {\n this.uploadedFiles = this.currentFiles.map((f) => ({\n fileName: f.name,\n success: false,\n }));\n this.currentFiles = [];\n }\n if (err instanceof HttpErrorResponse && err.error) {\n const errorPayload = err.error as ErrorResponse;\n const mapped = this.errors?.map(errorPayload, err.headers) || (err.error as any);\n this.errorMessage =\n mapped.message ||\n this.t('genericUploadError', 'Erro no envio de arquivo.');\n if (mapped.rateLimit) {\n this.rateLimit = mapped.rateLimit;\n this.rateLimited.emit(mapped.rateLimit);\n }\n const primary = getPrimaryErrorItem(errorPayload);\n const code = String(primary?.code || '');\n if (code === 'QUOTA_EXCEEDED' || code === 'COTA_EXCEDIDA') {\n this.quotaExceeded = true;\n }\n this.error.emit(errorPayload);\n } else {\n const normalizedError = this.normalizeErrorEnvelope(err);\n this.errorMessage = normalizedError.message;\n this.error.emit(normalizedError);\n }\n }\n\n private finishUpload(\n success: boolean,\n meta?: FileMetadata,\n results?: BulkUploadFileResult[],\n ): void {\n this.uploading = false;\n this.uploadProgressValue = 100;\n if (success) {\n if (meta) {\n this.uploadedFiles.push({ fileName: meta.fileName, success: true });\n this.uploadSuccess.emit(meta);\n this.lastResults = [\n {\n fileName: meta.fileName,\n status: BulkUploadResultStatus.SUCCESS,\n file: meta,\n },\n ];\n this.lastStats = { total: 1, succeeded: 1, failed: 0 };\n }\n if (results) {\n for (const r of results) {\n if (r.status === BulkUploadResultStatus.SUCCESS) {\n this.uploadedFiles.push({ fileName: r.fileName, success: true });\n } else {\n this.uploadedFiles.push({ fileName: r.fileName, success: false });\n }\n }\n if (!this.lastStats) {\n const succeeded = results.filter(\n (r) => r.status === BulkUploadResultStatus.SUCCESS,\n ).length;\n const failed = results.length - succeeded;\n this.lastStats = { total: results.length, succeeded, failed };\n }\n if (!this.lastResults) {\n this.lastResults = results;\n }\n }\n } else {\n this.uploadedFiles = this.currentFiles.map((f) => ({\n fileName: f.name,\n success: false,\n }));\n }\n this.currentFiles = [];\n this.hideSelectedOverlay();\n this.cdr.markForCheck();\n }\n\n private mapUploadResponseToFileMetadata(\n resp: UploadResponse | null | undefined,\n ): FileMetadata | undefined {\n const payload = resp?.data;\n if (!payload) {\n return undefined;\n }\n return {\n id: payload.fileId || '',\n fileName: payload.originalFilename,\n contentType: payload.mimeType || '',\n fileSize: payload.fileSize,\n uploadedAt: payload.uploadTimestamp,\n tenantId: '',\n scanStatus: ScanStatus.PENDING,\n };\n }\n\n primaryErrorCode(error: ErrorLike | null | undefined): string {\n return getPrimaryErrorItem(error)?.code ?? 'UNKNOWN_ERROR';\n }\n\n traceIdOf(error: ErrorLike | null | undefined): string | undefined {\n if (!error || typeof error !== 'object' || !('traceId' in error)) {\n return undefined;\n }\n\n const traceId = error.traceId;\n return typeof traceId === 'string' ? traceId : undefined;\n }\n\n // Lista rica - helpers/ações\n get visibleResults(): BulkUploadFileResult[] {\n if (!this.lastResults) return [];\n const cap = this.config?.ui?.list?.collapseAfter ?? 0;\n if (this.showAllResults || cap <= 0) return this.lastResults;\n return this.lastResults.slice(0, cap);\n }\n\n // Função utilitária para conversão\n private fileToBulkUploadFileResult(file: File): BulkUploadFileResult {\n return {\n fileName: file.name,\n status: BulkUploadResultStatus.FAILED,\n file: {\n id: '',\n fileName: file.name,\n contentType: file.type,\n fileSize: file.size,\n uploadedAt: new Date().toISOString(),\n tenantId: '',\n scanStatus: ScanStatus.PENDING,\n metadata: {}\n }\n };\n }\n\n onRetry(file: File | BulkUploadFileResult) {\n const bulkFile = 'fileName' in file && 'status' in file ? file : this.fileToBulkUploadFileResult(file as File);\n this.retry.emit(bulkFile);\n }\n onDownload(file: File | BulkUploadFileResult) {\n const bulkFile = 'fileName' in file && 'status' in file ? file : this.fileToBulkUploadFileResult(file as File);\n this.download.emit(bulkFile);\n }\n onCopyLink(file: File | BulkUploadFileResult) {\n const bulkFile = 'fileName' in file && 'status' in file ? file : this.fileToBulkUploadFileResult(file as File);\n this.copyLink.emit(bulkFile);\n }\n removeResult(item: BulkUploadFileResult): void {\n if (!this.lastResults) return;\n const idx = this.lastResults.indexOf(item);\n if (idx >= 0)\n this.lastResults = this.lastResults.filter((_, i) => i !== idx);\n // Atualiza stats mínimas\n if (this.lastStats) {\n this.lastStats.total = Math.max(0, this.lastStats.total - 1);\n if (item.status === BulkUploadResultStatus.SUCCESS)\n this.lastStats.succeeded = Math.max(0, this.lastStats.succeeded - 1);\n if (item.status === BulkUploadResultStatus.FAILED)\n this.lastStats.failed = Math.max(0, this.lastStats.failed - 1);\n }\n }\n toggleDetailsFor(item: BulkUploadFileResult): void {\n // Emite aberto/fechado com base em presença de seção extra\n // Como usamos <details>, delegamos ao usuário abrir via UI.\n // Aqui apenas emitimos um evento de intenção.\n this.detailsOpened.emit(item);\n }\n onDetailsToggle(ev: Event, item: BulkUploadFileResult): void {\n const opened = (ev.target as HTMLDetailsElement)?.open;\n if (opened) this.detailsOpened.emit(item);\n else this.detailsClosed.emit(item);\n }\n\n private validateFiles(files: File[]): boolean {\n const validators: ValidatorFn[] = [];\n if (this.config?.ui?.accept?.length) {\n validators.push(acceptValidator(this.config.ui.accept));\n }\n if (this.config?.limits?.maxFileSizeBytes) {\n validators.push(\n maxFileSizeValidator(this.config.limits.maxFileSizeBytes),\n );\n }\n if (this.config?.limits?.maxFilesPerBulk) {\n validators.push(\n maxFilesPerBulkValidator(this.config.limits.maxFilesPerBulk),\n );\n }\n if (this.config?.limits?.maxBulkSizeBytes) {\n validators.push(\n maxBulkSizeValidator(this.config.limits.maxBulkSizeBytes),\n );\n }\n if (!validators.length) {\n return true;\n }\n\n const control = new FormControl(files, validators);\n if (control.invalid) {\n const errors = control.errors || {};\n const map = this.config?.messages?.errors || {};\n if (errors['accept']) {\n this.errorMessage =\n map['accept'] ||\n this.t('acceptError', 'Tipo de arquivo não permitido.');\n } else if (errors['maxFileSize']) {\n this.errorMessage =\n map['maxFileSize'] ||\n this.t('maxFileSizeError', 'Arquivo excede o tamanho máximo.');\n } else if (errors['maxFilesPerBulk']) {\n this.errorMessage =\n map['maxFilesPerBulk'] ||\n this.t('maxFilesPerBulkError', 'Quantidade de arquivos excedida.');\n } else if (errors['maxBulkSize']) {\n this.errorMessage =\n map['maxBulkSize'] ||\n this.t('maxBulkSizeError', 'Tamanho total dos arquivos excedido.');\n }\n this.error.emit(errors as any);\n return false;\n }\n return true;\n }\n\n // Resumo de políticas para tooltip do ícone de informações\n get policiesSummary(): string {\n const acc = this.config?.ui?.accept?.length\n ? this.config.ui.accept.join(', ')\n : this.acceptString || this.t('policySummaryAny', 'qualquer');\n const maxFile = this.config?.limits?.maxFileSizeBytes\n ? this.formatBytes(this.config.limits.maxFileSizeBytes)\n : this.t('policySummaryNotConfigured', '—');\n const maxCount =\n this.config?.limits?.maxFilesPerBulk ?? (this.allowMultiple ? 99 : 1);\n return `${this.t('policySummaryTypesLabel', 'Tipos')}: ${acc} • ${this.t('policySummaryMaxPerFileLabel', 'Máx. por arquivo')}: ${maxFile} • ${this.t('policySummaryQuantityLabel', 'Qtde')}: ${maxCount}`;\n }\n\n private resolveTemplateString(value: string): string {\n if (!this.context || !value.includes('${')) return value;\n return value.replace(/\\$\\{([^}]+)\\}/g, (_match, path) => {\n const resolved = this.resolveContextPath(this.context!, String(path).trim());\n return resolved === undefined || resolved === null ? '' : String(resolved);\n });\n }\n\n private resolveContextPath(context: Record<string, unknown>, path: string): unknown {\n if (!path) return undefined;\n return path.split('.').reduce<unknown>((acc, key) => {\n if (!acc || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, context);\n }\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n inject,\n ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ValidationErrors } from '@angular/forms';\n\nimport { SimpleBaseInputComponent } from '@praxisui/dynamic-fields';\nimport { PraxisI18nService } from '@praxisui/core';\nimport { FileMetadata, ErrorResponse, BulkUploadResponseData } from '../../types';\n\nimport { PraxisFilesUpload } from '../files-upload/praxis-files-upload.component';\nimport { PendingFilesState } from '../files-upload/praxis-files-upload.component';\nimport { FilesUploadConfig } from '../../models';\nimport { ErrorMapperService } from '../../services/error-mapper.service';\nimport {\n FILES_UPLOAD_TEXTS,\n TRANSLATE_LIKE,\n providePraxisFilesUploadI18n,\n resolvePraxisFilesUploadText,\n type FilesUploadTexts,\n type TranslateLike,\n} from '../../i18n/files-upload.i18n';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\n\n@Component({\n selector: 'pdx-material-files-upload',\n standalone: true,\n providers: [providePraxisFilesUploadI18n()],\n imports: [\n CommonModule,\n PraxisFilesUpload,\n MatIconModule,\n MatMenuModule,\n MatTooltipModule,\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n ],\n template: `\n <!-- Casca compacta tipo input -->\n <div class=\"pdx-upload-field-shell\"\n role=\"group\"\n [class.error]=\"showUploadError\"\n [class.disabled]=\"isShellDisabled()\"\n [class.proximity-active]=\"isProximityActive\"\n [attr.aria-busy]=\"isUploadingState()\"\n [attr.aria-invalid]=\"showUploadError\"\n [attr.aria-label]=\"shellAriaLabel\">\n <mat-icon class=\"prefix\" aria-hidden=\"true\">attach_file</mat-icon>\n <div class=\"content\">\n <!-- ESTADO 1: Sem arquivos pendentes -->\n <ng-container *ngIf=\"pendingFiles.length === 0\">\n <button\n type=\"button\"\n class=\"shell-main-btn\"\n [disabled]=\"isShellDisabled()\"\n [attr.aria-describedby]=\"componentId() + '-messages'\"\n (click)=\"openFromShell()\"\n >\n <span class=\"text-stack\">\n <span class=\"placeholder\" *ngIf=\"!lastFileName\">{{ t('placeholder','Selecione ou solte arquivos…') }}</span>\n <span class=\"value\" *ngIf=\"lastFileName\" [title]=\"lastFileName\">{{ lastFileName }}</span>\n <span class=\"meta\">{{ statusSummary }}</span>\n </span>\n <span class=\"chip\" *ngIf=\"batchCount > 1\" [attr.aria-label]=\"additionalFilesChipAriaLabel\">+{{ batchCount - 1 }}</span>\n </button>\n </ng-container>\n\n <!-- ESTADO 2: Com arquivos pendentes -->\n <ng-container *ngIf=\"pendingFiles.length > 0\">\n <button\n #pendingTrigger\n type=\"button\"\n class=\"pending-text-btn\"\n [attr.aria-describedby]=\"componentId() + '-messages'\"\n [attr.aria-controls]=\"pendingPanelId\"\n [attr.aria-expanded]=\"pendingPanelOpen\"\n cdkOverlayOrigin\n #pendingOverlayOrigin=\"cdkOverlayOrigin\"\n (click)=\"togglePendingPanel()\"\n (keydown)=\"onPendingTriggerKeydown($event)\"\n >\n <span class=\"text-stack\">\n <span class=\"value\">{{ pendingFiles.length }} {{ t('fieldPendingCountSuffix','file(s) selected') }}</span>\n <span class=\"meta\">{{ t('fieldPendingSummary','Arquivos prontos para envio') }}</span>\n </span>\n <mat-icon aria-hidden=\"true\">arrow_drop_down</mat-icon>\n </button>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"pendingOverlayOrigin\"\n [cdkConnectedOverlayOpen]=\"pendingPanelOpen\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayPositions]=\"pendingOverlayPositions\"\n (backdropClick)=\"closePendingPanel()\"\n (detach)=\"onPendingOverlayDetach()\"\n >\n <div\n #pendingPanel\n class=\"pending-files-overlay\"\n [id]=\"pendingPanelId\"\n role=\"list\"\n tabindex=\"-1\"\n [attr.aria-label]=\"t('fieldPendingSummary','Arquivos prontos para envio')\"\n (keydown)=\"onPendingPanelKeydown($event)\"\n >\n <div\n class=\"pending-file-item\"\n *ngFor=\"let file of pendingFiles\"\n role=\"listitem\"\n [attr.aria-label]=\"pendingFileSummary(file)\"\n >\n <div class=\"file-info\" [title]=\"file.name\">\n <span class=\"file-name\">{{ file.name }}</span>\n <span class=\"file-size\">({{ formatBytes(file.size) }})</span>\n </div>\n <span class=\"spacer\"></span>\n <button\n type=\"button\"\n mat-icon-button\n class=\"remove-pending-btn\"\n (click)=\"onRemovePendingFile(file, $event)\"\n [attr.aria-label]=\"t('removePendingFile','Remove selected file') + ': ' + file.name\"\n >\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </ng-template>\n </ng-container>\n </div>\n <div class=\"suffixes\">\n <!-- Ações para arquivos pendentes -->\n <ng-container *ngIf=\"pendingFiles.length > 0\">\n <button\n type=\"button\"\n class=\"action-btn primary\"\n [attr.aria-label]=\"t('fieldActionUpload','Enviar arquivos selecionados')\"\n (click)=\"onTriggerUpload(); $event.stopPropagation()\"\n >\n <mat-icon aria-hidden=\"true\">upload</mat-icon>\n <span>{{ t('fieldActionUploadShort','Enviar') }}</span>\n </button>\n <button\n type=\"button\"\n class=\"action-btn\"\n [attr.aria-label]=\"t('fieldActionCancel','Cancelar seleção atual')\"\n (click)=\"onClearSelection(); $event.stopPropagation()\"\n >\n <mat-icon aria-hidden=\"true\">cancel</mat-icon>\n <span>{{ t('fieldActionCancelShort','Cancelar') }}</span>\n </button>\n </ng-container>\n\n <!-- Ações padrão -->\n <button type=\"button\" class=\"icon-btn\" [attr.title]=\"t('fieldInfoAction','Informações')\" [attr.aria-label]=\"t('fieldInfoAction','Informações')\" (click)=\"$event.stopPropagation()\" [disabled]=\"isShellDisabled()\" [matTooltip]=\"policySummary\">\n <mat-icon>info</mat-icon>\n </button>\n <button type=\"button\" class=\"icon-btn\" [attr.title]=\"t('fieldMoreActions','Mais ações')\" [attr.aria-label]=\"t('fieldMoreActions','Mais ações')\" (click)=\"$event.stopPropagation()\" [disabled]=\"isShellDisabled()\" [matMenuTriggerFor]=\"moreMenu\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #moreMenu=\"matMenu\">\n <button mat-menu-item (click)=\"openFromShell()\">\n <mat-icon>upload_file</mat-icon>\n <span>{{ t('fieldActionSelect','Selecionar arquivo(s)') }}</span>\n </button>\n <button mat-menu-item (click)=\"onClear()\" [disabled]=\"!lastFileName && batchCount === 0\">\n <mat-icon>clear</mat-icon>\n <span>{{ t('fieldActionClear','Limpar') }}</span>\n </button>\n </mat-menu>\n </div>\n </div>\n\n <!-- Mensagens do campo (hint/erro) -->\n <div\n class=\"field-messages\"\n [id]=\"componentId() + '-messages'\"\n [attr.role]=\"showUploadError ? 'alert' : 'status'\"\n [attr.aria-live]=\"showUploadError ? 'assertive' : 'polite'\"\n >\n <div class=\"hint\" *ngIf=\"metadata()?.hint && !showUploadError\">{{ metadata()?.hint }}</div>\n <div class=\"hint\" *ngIf=\"!metadata()?.hint && !showUploadError\">{{ statusSummary }}</div>\n <div class=\"error\" *ngIf=\"showUploadError\">{{ uploadError || t('genericUploadError','Erro no envio de arquivo.') }}</div>\n </div>\n\n <!-- Componente principal de upload (agora para lógica, não para UI) -->\n <praxis-files-upload\n #uploader\n displayMode=\"compact\"\n style=\"display: none;\"\n [config]=\"config\"\n [filesUploadId]=\"componentId()\"\n [baseUrl]=\"baseUrl\"\n (uploadSuccess)=\"onUploadSuccess($event)\"\n (bulkComplete)=\"onBulkComplete($event)\"\n (error)=\"onUploadError($event)\"\n (proximityChange)=\"onProximityChange($event)\"\n (pendingStateChange)=\"handlePendingState($event)\"\n />\n `,\n styles: [\n `:host{position:relative}\n .pdx-upload-field-shell{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;border:1px solid var(--pfx-surface-border, #ccc);border-radius:8px;background:var(--pfx-surface, var(--md-sys-color-surface));color:var(--md-sys-color-on-surface);min-height:40px}\n .pdx-upload-field-shell:focus-within{outline:2px solid var(--md-sys-color-primary,#1976d2);outline-offset:2px;}\n .pdx-upload-field-shell.error{border-color:var(--md-sys-color-error,#b00020)}\n .pdx-upload-field-shell.disabled{opacity:.6;cursor:not-allowed}\n .pdx-upload-field-shell .prefix{color:var(--md-sys-color-primary,#1976d2)}\n .pdx-upload-field-shell .content{flex:1;min-width:0;display:flex;align-items:center;gap:.5rem}\n .pdx-upload-field-shell .shell-main-btn{display:flex;align-items:center;gap:.75rem;flex:1;min-width:0;padding:0;border:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}\n .pdx-upload-field-shell .shell-main-btn:disabled{cursor:not-allowed}\n .pdx-upload-field-shell .text-stack{display:flex;flex-direction:column;min-width:0;gap:.125rem}\n .pdx-upload-field-shell .placeholder{color: var(--md-sys-color-on-surface-variant)}\n .pdx-upload-field-shell .value{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n .pdx-upload-field-shell .meta{font-size:.78rem;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n .pdx-upload-field-shell .chip{font-size:.75rem;padding:0 .4rem;border-radius:999px;background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container)}\n .pdx-upload-field-shell .suffixes{display:flex;align-items:center;gap:.375rem}\n .pdx-upload-field-shell .action-btn{display:inline-flex;align-items:center;gap:.35rem;border:1px solid var(--pfx-surface-border, #ccc);background:transparent;padding:.35rem .6rem;border-radius:999px;cursor:pointer;color:var(--md-sys-color-on-surface);font:inherit}\n .pdx-upload-field-shell .action-btn.primary{background:var(--md-sys-color-primary);border-color:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}\n .pdx-upload-field-shell .action-btn mat-icon{font-size:18px;width:18px;height:18px}\n .pdx-upload-field-shell .icon-btn{border:0;background:transparent;padding:.25rem;border-radius:6px;cursor:pointer; color: var(--md-sys-color-on-surface-variant);}\n .pdx-upload-field-shell .icon-btn:hover{background:rgba(255,255,255,0.05)}\n .pdx-upload-field-shell.disabled .icon-btn,.pdx-upload-field-shell.disabled .action-btn{cursor:not-allowed}\n .field-messages{font-size:.82rem;margin-top:.25rem}\n .field-messages .hint{opacity:.8}\n .field-messages .error{color:var(--md-sys-color-error,#b00020)}\n .pending-text-btn{display:flex;align-items:center;gap:.5rem;background:0;border:0;color:var(--md-sys-color-on-surface);font-family:inherit;font-size:inherit;padding:0;margin:0;cursor:pointer;min-width:0;text-align:left}\n .pending-text-btn span, .pending-text-btn mat-icon { color: inherit; }\n .pending-files-overlay{display:flex;flex-direction:column;min-width:min(320px, calc(100vw - 32px));max-width:min(480px, calc(100vw - 32px));max-height:240px;overflow:auto;padding:.25rem 0;border:1px solid var(--pfx-surface-border, #ccc);border-radius:12px;background:var(--pfx-surface, var(--md-sys-color-surface));box-shadow:0 12px 30px rgba(0,0,0,.18);outline:none}\n .pending-file-item{display:flex;align-items:center;width:100%;gap:.5rem;padding:8px 16px;}\n .pending-file-item .file-info{flex:1;min-width:0;text-align:left;}\n .pending-file-item .file-name{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}\n .pending-file-item .file-size{font-size:.8rem;opacity:.7;}\n .pending-file-item .spacer{flex:1 1 auto}\n .pending-file-item .remove-pending-btn{color:var(--md-sys-color-on-surface-variant)}\n .pdx-upload-field-shell.proximity-active {\n border-style: dashed;\n border-color: var(--md-sys-color-primary);\n transform: scale(1.02);\n background: var(--md-sys-color-surface-container-low);\n transition: all 0.2s ease-in-out;\n }\n `\n ],\n host: {\n '[class]': 'componentCssClasses()',\n '[attr.data-field-type]': '\"files-upload\"',\n '[attr.data-field-name]': 'metadata()?.name',\n '[attr.data-component-id]': 'componentId()',\n },\n})\nexport class PdxFilesUploadFieldComponent extends SimpleBaseInputComponent {\n @Input() config: FilesUploadConfig | null = null;\n @Input() valueMode: 'metadata' | 'id' | 'metadata[]' | 'id[]' = 'metadata';\n @Input() baseUrl?: string;\n @Output() uploadSuccess = new EventEmitter<FileMetadata>();\n @Output() bulkComplete = new EventEmitter<BulkUploadResponseData>();\n @Output() error = new EventEmitter<unknown>();\n uploadError: string | null = null;\n\n @ViewChild('uploader') private uploader?: PraxisFilesUpload;\n @ViewChild('pendingTrigger') private pendingTrigger?: ElementRef<HTMLButtonElement>;\n @ViewChild('pendingPanel') private pendingPanel?: ElementRef<HTMLElement>;\n\n // Estado para UI de seleção manual\n public pendingFiles: File[] = [];\n public pendingPanelOpen = false;\n readonly pendingOverlayPositions = [\n {\n originX: 'start' as const,\n originY: 'bottom' as const,\n overlayX: 'start' as const,\n overlayY: 'top' as const,\n offsetY: 8,\n },\n {\n originX: 'start' as const,\n originY: 'top' as const,\n overlayX: 'start' as const,\n overlayY: 'bottom' as const,\n offsetY: -8,\n },\n ];\n\n // Ações para UI de seleção manual\n public onTriggerUpload(): void {\n this.closePendingPanel(false);\n this.uploader?.submitPendingFiles();\n }\n\n public onClearSelection(): void {\n this.closePendingPanel(false);\n this.uploader?.resetPendingFiles();\n }\n\n // Recebe o estado do componente filho\n public handlePendingState(state: PendingFilesState): void {\n this.pendingFiles = state.files;\n if (state.hasPending) {\n this.control().markAsTouched();\n } else {\n this.closePendingPanel(false);\n }\n }\n\n // Estado visual do campo compacto\n lastFileName: string | null = null;\n batchCount = 0;\n public isProximityActive = false;\n\n private readonly errors = inject(ErrorMapperService);\n private readonly filesUploadI18n = inject(PraxisI18nService);\n private readonly legacyTexts = inject<FilesUploadTexts | null>(\n FILES_UPLOAD_TEXTS,\n { optional: true },\n );\n private readonly legacyTranslate = inject<TranslateLike | null>(\n TRANSLATE_LIKE,\n { optional: true },\n );\n\n get showUploadError(): boolean {\n const c = this.control();\n return (\n !!this.uploadError &&\n c.touched &&\n (c.hasError('upload') || c.hasError('uploadPartial'))\n );\n }\n\n private resolveSingleValue(\n file: FileMetadata,\n ): FileMetadata | string | FileMetadata[] | string[] {\n if (this.valueMode === 'id') return file.id;\n if (this.valueMode === 'metadata[]') return [file];\n if (this.valueMode === 'id[]') return [file.id];\n return file;\n }\n\n private resolveBulkValue(files: FileMetadata[]): FileMetadata[] | string[] | FileMetadata | string | null {\n if (files.length === 0) return null;\n if (this.valueMode === 'metadata[]') return files;\n if (this.valueMode === 'id[]') return files.map((file) => file.id);\n return this.resolveSingleValue(files[0]);\n }\n\n private applyResolvedValue(file: FileMetadata): void {\n const value = this.resolveSingleValue(file);\n this.setValue(value as any);\n this.lastFileName = file.fileName || null;\n this.control().markAsTouched();\n this.control().markAsDirty();\n }\n\n private clearUploadState(): void {\n this.updateUploadValidationState();\n this.uploadError = null;\n }\n\n private applyUploadErrorState(\n message: string,\n validationKey: 'upload' | 'uploadPartial',\n ): void {\n this.updateUploadValidationState(validationKey);\n this.control().markAsTouched();\n this.control().markAsDirty();\n this.uploadError = message;\n }\n\n t(key: string, fallback: string): string {\n return resolvePraxisFilesUploadText(\n this.filesUploadI18n,\n key,\n fallback,\n this.legacyTexts ?? undefined,\n this.legacyTranslate ?? undefined,\n );\n }\n\n get additionalFilesChipAriaLabel(): string {\n const extraFiles = Math.max(this.batchCount - 1, 0);\n return `${extraFiles} ${this.t(\n 'fieldChipAria',\n 'arquivos adicionais selecionados',\n )}`;\n }\n\n onUploadSuccess(file: FileMetadata): void {\n this.applyResolvedValue(file);\n this.clearUploadState();\n this.batchCount = 1;\n this.uploadSuccess.emit(file);\n }\n\n onBulkComplete(data: BulkUploadResponseData): void {\n const results = data.results;\n const successfulResults = results.filter(\n (r: any) => r?.file?.id || r?.file?.fileName,\n );\n const failedResults = results.filter(\n (r: any) => !r?.file?.id && !r?.file?.fileName,\n );\n const successfulFiles = successfulResults\n .map((result: any) => result?.file as FileMetadata | undefined)\n .filter((file): file is FileMetadata => !!file);\n\n this.batchCount = successfulFiles.length;\n\n if (successfulFiles.length > 0) {\n const value = this.resolveBulkValue(successfulFiles);\n this.setValue(value as any);\n this.lastFileName = successfulFiles[0]?.fileName || null;\n }\n\n if (failedResults.length > 0) {\n this.applyUploadErrorState(\n this.t(\n 'partialUploadError',\n 'Upload parcial concluído com falhas em parte do lote.',\n ),\n 'uploadPartial',\n );\n } else if (successfulResults.length > 0) {\n this.clearUploadState();\n }\n\n this.bulkComplete.emit(data);\n }\n\n // When an error occurs, mark the control invalid and show message\n onUploadError(event: unknown): void {\n let message: string;\n if (\n event &&\n typeof event === 'object' &&\n ('code' in (event as any) ||\n 'errors' in (event as any) ||\n 'status' in (event as any))\n ) {\n message = this.errors.map(event as ErrorResponse).message;\n } else if (event && typeof (event as any).message === 'string') {\n message = (event as any).message;\n } else {\n message = this.t(\n 'genericUploadError',\n 'Erro no envio de arquivo.',\n );\n }\n\n this.applyUploadErrorState(message, 'upload');\n this.error.emit(event);\n }\n\n isShellDisabled(): boolean {\n try {\n return !!(this.control()?.disabled || this.uploader?.isUploading || !this.baseUrl);\n } catch { return false; }\n }\n\n isUploadingState(): boolean {\n return !!this.uploader?.isUploading;\n }\n\n get shellAriaLabel(): string {\n const base = this.lastFileName\n ? `${this.t('fieldSelectedSummary','Arquivo selecionado')}: ${this.lastFileName}`\n : this.t('placeholder','Selecione ou solte arquivos…');\n if (this.pendingFiles.length > 0) {\n return `${this.pendingFiles.length} ${this.t('fieldPendingAriaSuffix','arquivos prontos para envio')}`;\n }\n return `${base}. ${this.statusSummary}`;\n }\n\n get statusSummary(): string {\n if (this.showUploadError) {\n return this.t('fieldErrorSummary','Corrija o erro para continuar');\n }\n if (this.pendingFiles.length > 0) {\n return this.t('fieldPendingSummary','Arquivos prontos para envio');\n }\n if (this.batchCount > 1) {\n return `${this.batchCount} ${this.t('fieldSelectedPlural','arquivos vinculados')}`;\n }\n if (this.lastFileName) {\n return this.t('fieldSelectedSummary','Arquivo selecionado');\n }\n return this.t('fieldEmptySummary','Nenhum arquivo selecionado');\n }\n\n public onProximityChange(isActive: boolean): void {\n this.isProximityActive = isActive;\n }\n\n openFromShell(): void {\n if (this.isShellDisabled()) return;\n this.uploader?.openFileDialog();\n }\n\n get pendingPanelId(): string {\n return `${this.componentId()}-pending-panel`;\n }\n\n togglePendingPanel(): void {\n if (!this.pendingFiles.length) {\n this.closePendingPanel(false);\n return;\n }\n if (this.pendingPanelOpen) {\n this.closePendingPanel();\n return;\n }\n this.pendingPanelOpen = true;\n this.focusPendingPanelSoon();\n }\n\n closePendingPanel(restoreFocus = true): void {\n if (!this.pendingPanelOpen) {\n if (restoreFocus) {\n this.pendingTrigger?.nativeElement.focus();\n }\n return;\n }\n this.pendingPanelOpen = false;\n if (restoreFocus) {\n this.pendingTrigger?.nativeElement.focus();\n }\n }\n\n onPendingTriggerKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown' && this.pendingFiles.length > 0) {\n event.preventDefault();\n if (!this.pendingPanelOpen) {\n this.pendingPanelOpen = true;\n }\n this.focusPendingPanelSoon();\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closePendingPanel();\n }\n }\n\n onPendingPanelKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closePendingPanel();\n }\n }\n\n onPendingOverlayDetach(): void {\n if (this.pendingPanelOpen) {\n this.pendingPanelOpen = false;\n this.pendingTrigger?.nativeElement.focus();\n }\n }\n\n // Ações dos ícones (placeholders para próxima sub-issue)\n onOpenInfo(): void {}\n onOpenMenu(): void {}\n\n onClear(): void {\n this.lastFileName = null;\n this.batchCount = 0;\n this.uploadError = null;\n this.pendingFiles = [];\n this.uploader?.resetPendingFiles();\n try {\n this.setValue(null as any);\n const c = this.control();\n c.markAsPristine();\n c.markAsUntouched();\n this.updateUploadValidationState();\n } catch {}\n }\n\n get policySummary(): string {\n const accepts = this.config?.ui?.accept?.length\n ? this.config.ui.accept.join(', ')\n : this.t('fieldPolicyNotConfigured', 'Não configurado');\n const maxBytes = this.config?.limits?.maxFileSizeBytes;\n const maxPerFile = maxBytes\n ? this.formatBytes(maxBytes)\n : this.t('fieldPolicyNotConfigured', 'Não configurado');\n const maxItems = this.config?.limits?.maxFilesPerBulk ?? 1;\n return [\n `${this.t('fieldPolicyTypes', 'Tipos')}: ${accepts}`,\n `${this.t('fieldPolicyMaxPerFile', 'Máx/arquivo')}: ${maxPerFile}`,\n `${this.t('fieldPolicyMaxItems', 'Máx/itens')}: ${maxItems}`,\n ].join(' • ');\n }\n\n public onRemovePendingFile(file: File, event: MouseEvent): void {\n event.stopPropagation();\n this.uploader?.removePendingFile(file);\n }\n\n pendingFileSummary(file: File): string {\n return `${file.name} ${this.formatBytes(file.size)}`;\n }\n\n public formatBytes(bytes: number): string {\n if (bytes === 0) {\n return `0 ${this.t('sizeUnitBytes', 'Bytes')}`;\n }\n const k = 1024;\n const sizes = [\n this.t('sizeUnitBytes', 'Bytes'),\n this.t('sizeUnitKB', 'KB'),\n this.t('sizeUnitMB', 'MB'),\n this.t('sizeUnitGB', 'GB'),\n this.t('sizeUnitTB', 'TB'),\n ];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n private focusPendingPanelSoon(): void {\n setTimeout(() => {\n this.pendingPanel?.nativeElement.focus();\n });\n }\n\n private updateUploadValidationState(\n validationKey?: 'upload' | 'uploadPartial',\n ): void {\n const currentErrors = { ...(this.control().errors ?? {}) } as ValidationErrors;\n delete currentErrors.upload;\n delete currentErrors.uploadPartial;\n\n if (validationKey) {\n currentErrors[validationKey] = true;\n }\n\n this.control().setErrors(\n Object.keys(currentErrors).length ? currentErrors : null,\n );\n }\n}\n","import { ComponentDocMeta, ComponentMetadataRegistry } from '@praxisui/core';\nimport { ENVIRONMENT_INITIALIZER, Provider } from '@angular/core';\n\nimport { PraxisFilesUpload } from './components/files-upload/praxis-files-upload.component';\n\nexport const PRAXIS_FILES_UPLOAD_COMPONENT_METADATA: ComponentDocMeta = {\n id: 'praxis-files-upload',\n selector: 'praxis-files-upload',\n component: PraxisFilesUpload,\n\n friendlyName: 'Praxis Files Upload',\n description: 'Componente para upload de arquivos com suporte a configuracao dinamica, eventos e integracao com backend.',\n icon: 'upload_file',\n\n inputs: [\n {\n name: 'config',\n type: 'FilesUploadConfig',\n label: 'Configuracao',\n description: 'Configuracao do upload (tipos aceitos, limites, endpoints, comportamento).',\n },\n {\n name: 'filesUploadId',\n type: 'string',\n label: 'Upload ID',\n description: 'Identificador logico do upload para persistencia e rastreamento.',\n },\n {\n name: 'componentInstanceId',\n type: 'string',\n label: 'ID da instancia',\n description: 'Identificador opcional para diferenciar multiplas instancias na mesma tela.',\n },\n {\n name: 'baseUrl',\n type: 'string',\n label: 'Base URL',\n description: 'Base URL da API de arquivos.',\n },\n {\n name: 'displayMode',\n type: \"'full' | 'compact'\",\n default: 'full',\n label: 'Modo de exibicao',\n description: 'Define o modo de exibicao do componente.',\n },\n {\n name: 'context',\n type: 'Record<string, unknown>',\n label: 'Contexto',\n description: 'Contexto usado para resolver expressoes em metadados.',\n },\n {\n name: 'enableCustomization',\n type: 'boolean',\n default: false,\n label: 'Modo de customizacao',\n description: 'Habilita a UI de customizacao/configuracao no runtime.',\n },\n ],\n\n outputs: [\n {\n name: 'uploadSuccess',\n type: 'FileMetadata',\n label: 'Upload concluido',\n description: 'Disparado quando o upload e finalizado com sucesso.',\n },\n {\n name: 'bulkComplete',\n type: 'BulkUploadResponseData',\n label: 'Upload em lote concluido',\n description: 'Disparado quando o upload em lote e finalizado.',\n },\n {\n name: 'error',\n type: 'ErrorResponse',\n label: 'Erro no upload',\n description: 'Disparado quando ocorre erro durante o upload.',\n },\n {\n name: 'rateLimited',\n type: 'RateLimitInfo',\n label: 'Rate limit',\n description: 'Disparado quando ocorre rate limiting.',\n },\n {\n name: 'uploadStart',\n type: 'UploadStartEvent',\n label: 'Inicio do upload',\n description: 'Disparado quando o upload inicia com contexto do envio.',\n },\n {\n name: 'uploadProgress',\n type: 'UploadProgressEvent',\n label: 'Progresso',\n description: 'Disparado conforme o progresso de upload.',\n },\n {\n name: 'retry',\n type: 'BulkUploadFileResult',\n label: 'Reenvio',\n description: 'Disparado quando o usuario aciona reenvio.',\n },\n {\n name: 'download',\n type: 'BulkUploadFileResult',\n label: 'Download',\n description: 'Disparado quando o usuario solicita download.',\n },\n {\n name: 'copyLink',\n type: 'BulkUploadFileResult',\n label: 'Copiar link',\n description: 'Disparado quando o usuario copia o link.',\n },\n {\n name: 'detailsOpened',\n type: 'BulkUploadFileResult',\n label: 'Detalhes abertos',\n description: 'Disparado quando os detalhes do item sao abertos.',\n },\n {\n name: 'detailsClosed',\n type: 'BulkUploadFileResult',\n label: 'Detalhes fechados',\n description: 'Disparado quando os detalhes do item sao fechados.',\n },\n {\n name: 'pendingStateChange',\n type: 'PendingFilesState',\n label: 'Arquivos pendentes',\n description: 'Disparado quando o estado de selecao pendente muda.',\n },\n {\n name: 'proximityChange',\n type: 'boolean',\n label: 'Proximidade',\n description: 'Disparado quando muda o estado de proximidade do drag.',\n },\n ],\n actions: [\n {\n id: 'retry',\n label: 'Reenviar',\n icon: 'refresh',\n description: 'Emite evento de reenvio do item',\n emit: 'retry',\n payloadSchema: {\n type: 'object',\n properties: {\n fileName: { type: 'string', description: 'Nome do arquivo' },\n status: { type: 'string', description: 'Status do upload' },\n file: { type: 'object', description: 'Metadados do arquivo' },\n error: { type: 'object', description: 'Erro do upload' },\n },\n required: ['fileName', 'status'],\n example: { fileName: 'documento.pdf', status: 'failed' },\n },\n scope: 'context',\n },\n {\n id: 'download',\n label: 'Download',\n icon: 'file_download',\n description: 'Emite evento de download do item',\n emit: 'download',\n payloadSchema: {\n type: 'object',\n properties: {\n fileName: { type: 'string', description: 'Nome do arquivo' },\n status: { type: 'string', description: 'Status do upload' },\n file: { type: 'object', description: 'Metadados do arquivo' },\n error: { type: 'object', description: 'Erro do upload' },\n },\n required: ['fileName', 'status'],\n example: { fileName: 'documento.pdf', status: 'succeeded' },\n },\n scope: 'context',\n },\n {\n id: 'copy-link',\n label: 'Copiar link',\n icon: 'link',\n description: 'Emite evento ao copiar o link do item',\n emit: 'copyLink',\n payloadSchema: {\n type: 'object',\n properties: {\n fileName: { type: 'string', description: 'Nome do arquivo' },\n status: { type: 'string', description: 'Status do upload' },\n file: { type: 'object', description: 'Metadados do arquivo' },\n error: { type: 'object', description: 'Erro do upload' },\n },\n required: ['fileName', 'status'],\n example: { fileName: 'documento.pdf', status: 'succeeded' },\n },\n scope: 'context',\n },\n {\n id: 'details-opened',\n label: 'Abrir detalhes',\n icon: 'info',\n description: 'Emite evento ao abrir detalhes do item',\n emit: 'detailsOpened',\n payloadSchema: {\n type: 'object',\n properties: {\n fileName: { type: 'string', description: 'Nome do arquivo' },\n status: { type: 'string', description: 'Status do upload' },\n file: { type: 'object', description: 'Metadados do arquivo' },\n error: { type: 'object', description: 'Erro do upload' },\n },\n required: ['fileName', 'status'],\n example: { fileName: 'documento.pdf', status: 'succeeded' },\n },\n scope: 'context',\n },\n {\n id: 'details-closed',\n label: 'Fechar detalhes',\n icon: 'info_outline',\n description: 'Emite evento ao fechar detalhes do item',\n emit: 'detailsClosed',\n payloadSchema: {\n type: 'object',\n properties: {\n fileName: { type: 'string', description: 'Nome do arquivo' },\n status: { type: 'string', description: 'Status do upload' },\n file: { type: 'object', description: 'Metadados do arquivo' },\n error: { type: 'object', description: 'Erro do upload' },\n },\n required: ['fileName', 'status'],\n example: { fileName: 'documento.pdf', status: 'succeeded' },\n },\n scope: 'context',\n },\n ],\n\n tags: ['files', 'upload', 'widget', 'configurable'],\n lib: '@praxisui/files-upload',\n};\n\nexport function providePraxisFilesUploadMetadata(): Provider {\n return {\n provide: ENVIRONMENT_INITIALIZER,\n multi: true,\n useFactory: (registry: ComponentMetadataRegistry) => () => {\n registry.register(PRAXIS_FILES_UPLOAD_COMPONENT_METADATA);\n },\n deps: [ComponentMetadataRegistry],\n };\n}\n","/**\n * Capabilities catalog for FilesUploadConfig.\n * Paths follow FilesUploadConfig shape (patch merged at config root).\n */\n\nimport type {\n AiCapability,\n AiCapabilityCatalog,\n AiCapabilityCategory,\n AiValueKind,\n} from '@praxisui/core';\n\ndeclare module '@praxisui/core' {\n interface AiCapabilityCategoryMap {\n strategy: true;\n ui: true;\n limits: true;\n options: true;\n bulk: true;\n quotas: true;\n rateLimit: true;\n headers: true;\n messages: true;\n }\n}\n\nexport type CapabilityCategory = AiCapabilityCategory;\nexport type ValueKind = AiValueKind;\n\nexport interface Capability extends AiCapability {\n category: CapabilityCategory;\n}\n\nexport interface CapabilityCatalog extends AiCapabilityCatalog {\n capabilities: Capability[];\n}\n\nconst ENUMS: Record<string, Array<string | number>> = {\n strategy: ['direct', 'presign', 'auto'],\n dropzoneExpandMode: ['overlay', 'inline'],\n listDetailsMode: ['card', 'sidesheet', 'auto'],\n listDetailsAnchor: ['item', 'field'],\n conflictPolicy: ['ERROR', 'SKIP', 'OVERWRITE', 'MAKE_UNIQUE', 'RENAME'],\n};\n\nexport const FILES_UPLOAD_AI_CAPABILITIES: CapabilityCatalog = {\n version: 'v1.0',\n enums: ENUMS,\n targets: ['praxis-files-upload', 'files-upload-dropzone'],\n notes: [\n 'limits.maxFileSizeBytes and limits.maxBulkSizeBytes are bytes (e.g., 10485760 for 10MB).',\n 'options.allowedExtensions is enforced by backend validation; ui.accept is only a client hint.',\n 'Use options.defaultConflictPolicy to control name collisions on upload.',\n ],\n capabilities: [\n { path: 'strategy', category: 'strategy', valueKind: 'enum', allowedValues: ENUMS.strategy, description: 'Upload strategy.' },\n\n { path: 'ui', category: 'ui', valueKind: 'object', description: 'UI configuration.' },\n { path: 'ui.showDropzone', category: 'ui', valueKind: 'boolean', description: 'Show drag-and-drop dropzone.' },\n { path: 'ui.accept', category: 'ui', valueKind: 'array', description: 'Accept attribute hints (extensions or mime types).' },\n { path: 'ui.accept[]', category: 'ui', valueKind: 'string', description: 'Single accept entry.' },\n { path: 'ui.dense', category: 'ui', valueKind: 'boolean', description: 'Dense layout.' },\n { path: 'ui.showConflictPolicySelector', category: 'ui', valueKind: 'boolean', description: 'Show conflict policy selector.' },\n { path: 'ui.showMetadataForm', category: 'ui', valueKind: 'boolean', description: 'Show metadata form for each file.' },\n { path: 'ui.showProgress', category: 'ui', valueKind: 'boolean', description: 'Show progress UI.' },\n { path: 'ui.manualUpload', category: 'ui', valueKind: 'boolean', description: 'Require manual start for uploads.' },\n\n { path: 'ui.dropzone', category: 'ui', valueKind: 'object', description: 'Dropzone interaction options.' },\n { path: 'ui.dropzone.expandOnDragProximity', category: 'ui', valueKind: 'boolean', description: 'Expand dropzone on drag proximity.' },\n { path: 'ui.dropzone.proximityPx', category: 'ui', valueKind: 'number', description: 'Proximity radius in pixels.' },\n { path: 'ui.dropzone.expandMode', category: 'ui', valueKind: 'enum', allowedValues: ENUMS.dropzoneExpandMode, description: 'Dropzone expansion mode.' },\n { path: 'ui.dropzone.expandHeight', category: 'ui', valueKind: 'number', description: 'Expanded height (px).' },\n { path: 'ui.dropzone.expandDebounceMs', category: 'ui', valueKind: 'number', description: 'Drag debounce (ms).' },\n\n { path: 'ui.list', category: 'ui', valueKind: 'object', description: 'Uploaded files list options.' },\n { path: 'ui.list.collapseAfter', category: 'ui', valueKind: 'number', description: 'Collapse list after N items.' },\n { path: 'ui.list.detailsMode', category: 'ui', valueKind: 'enum', allowedValues: ENUMS.listDetailsMode, description: 'Details panel mode.' },\n { path: 'ui.list.detailsMaxWidth', category: 'ui', valueKind: 'number', description: 'Details panel max width (px).' },\n { path: 'ui.list.detailsShowTechnical', category: 'ui', valueKind: 'boolean', description: 'Show technical details by default.' },\n { path: 'ui.list.detailsFields', category: 'ui', valueKind: 'array', description: 'Allowed metadata fields to display.' },\n { path: 'ui.list.detailsFields[]', category: 'ui', valueKind: 'string', description: 'Single metadata field name.' },\n { path: 'ui.list.detailsAnchor', category: 'ui', valueKind: 'enum', allowedValues: ENUMS.listDetailsAnchor, description: 'Details overlay anchor.' },\n\n { path: 'limits', category: 'limits', valueKind: 'object', description: 'Upload limits.' },\n { path: 'limits.maxFileSizeBytes', category: 'limits', valueKind: 'number', description: 'Max file size (bytes).' },\n { path: 'limits.maxFilesPerBulk', category: 'limits', valueKind: 'number', description: 'Max files per bulk upload.' },\n { path: 'limits.maxBulkSizeBytes', category: 'limits', valueKind: 'number', description: 'Max bulk size (bytes).' },\n { path: 'options', category: 'options', valueKind: 'object', description: 'Backend options sent as JSON.' },\n { path: 'options.defaultConflictPolicy', category: 'options', valueKind: 'enum', allowedValues: ENUMS.conflictPolicy, description: 'Default conflict policy.' },\n { path: 'options.strictValidation', category: 'options', valueKind: 'boolean', description: 'Strict backend validation.' },\n { path: 'options.maxUploadSizeMb', category: 'options', valueKind: 'number', description: 'Max upload size in MB.' },\n { path: 'options.allowedExtensions', category: 'options', valueKind: 'array', description: 'Allowed file extensions.' },\n { path: 'options.allowedExtensions[]', category: 'options', valueKind: 'string', description: 'Single extension (e.g., pdf).' },\n { path: 'options.acceptMimeTypes', category: 'options', valueKind: 'array', description: 'Allowed mime types.' },\n { path: 'options.acceptMimeTypes[]', category: 'options', valueKind: 'string', description: 'Single mime type.' },\n { path: 'options.targetDirectory', category: 'options', valueKind: 'string', description: 'Target directory on backend.' },\n { path: 'options.enableVirusScanning', category: 'options', valueKind: 'boolean', description: 'Enable virus scanning.' },\n\n { path: 'bulk', category: 'bulk', valueKind: 'object', description: 'Bulk upload tuning.' },\n { path: 'bulk.failFast', category: 'bulk', valueKind: 'boolean', description: 'Abort on first error.' },\n { path: 'bulk.parallelUploads', category: 'bulk', valueKind: 'number', description: 'Parallel uploads count.' },\n { path: 'bulk.retryCount', category: 'bulk', valueKind: 'number', description: 'Retry count.' },\n { path: 'bulk.retryBackoffMs', category: 'bulk', valueKind: 'number', description: 'Retry backoff (ms).' },\n\n { path: 'quotas', category: 'quotas', valueKind: 'object', description: 'Quota UX behavior.' },\n { path: 'quotas.showQuotaWarnings', category: 'quotas', valueKind: 'boolean', description: 'Show quota warnings.' },\n { path: 'quotas.blockOnExceed', category: 'quotas', valueKind: 'boolean', description: 'Block uploads when exceeded.' },\n\n { path: 'rateLimit', category: 'rateLimit', valueKind: 'object', description: '429 handling.' },\n { path: 'rateLimit.autoRetryOn429', category: 'rateLimit', valueKind: 'boolean', description: 'Auto retry on 429.' },\n { path: 'rateLimit.showBannerOn429', category: 'rateLimit', valueKind: 'boolean', description: 'Show rate limit banner.' },\n { path: 'rateLimit.maxAutoRetry', category: 'rateLimit', valueKind: 'number', description: 'Max auto retry attempts.' },\n { path: 'rateLimit.baseBackoffMs', category: 'rateLimit', valueKind: 'number', description: 'Base backoff (ms).' },\n\n { path: 'headers', category: 'headers', valueKind: 'object', description: 'Header mapping for backend.' },\n { path: 'headers.tenantHeader', category: 'headers', valueKind: 'string', description: 'Tenant header name.' },\n { path: 'headers.userHeader', category: 'headers', valueKind: 'string', description: 'User header name.' },\n\n { path: 'messages', category: 'messages', valueKind: 'object', description: 'User-facing text overrides.' },\n { path: 'messages.successSingle', category: 'messages', valueKind: 'string', description: 'Single upload success message.' },\n { path: 'messages.successBulk', category: 'messages', valueKind: 'string', description: 'Bulk upload success message.' },\n { path: 'messages.errors', category: 'messages', valueKind: 'object', description: 'Error message map.' },\n { path: 'messages.errors.[code]', category: 'messages', valueKind: 'string', description: 'Message for a specific error code.' },\n ],\n};\n","// Export all public API from subdirectories\nexport * from './models';\nexport * from './components';\nexport * from './services';\nexport * from './validators';\nexport * from './config';\nexport * from './i18n';\nexport * from './types';\nexport * from './praxis-files-upload.metadata';\nexport * from './ai/files-upload-ai-capabilities';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["map","i1","i9","i11","i3","i2.DragProximityService","i4","i5.ConfigService","i6.FilesApiClient","i7.PresignedUploaderService","i8.ErrorMapperService","i10","i12","i15","i2"],"mappings":"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"}
|