![]() |
VOOZH | about |
dotnet add package Cayaqui.Metadata --version 0.3.8
NuGet\Install-Package Cayaqui.Metadata -Version 0.3.8
<PackageReference Include="Cayaqui.Metadata" Version="0.3.8" />
<PackageVersion Include="Cayaqui.Metadata" Version="0.3.8" />Directory.Packages.props
<PackageReference Include="Cayaqui.Metadata" />Project file
paket add Cayaqui.Metadata --version 0.3.8
#r "nuget: Cayaqui.Metadata, 0.3.8"
#:package Cayaqui.Metadata@0.3.8
#addin nuget:?package=Cayaqui.Metadata&version=0.3.8Install as a Cake Addin
#tool nuget:?package=Cayaqui.Metadata&version=0.3.8Install as a Cake Tool
Zero-dependency attributes + resolver para decorar DTOs con metadata consumida por web grids, Cayaqui.Reports y Cayaqui.ExcelImport. Un solo decorado → tres usos consistentes.
Distribución propietaria — requiere contrato comercial con Cayaqui. Ver
LICENSE.txt.
Cayaqui.Metadata.Resolver (BREAKING)El resolver y sus tipos asociados se movieron de Cayaqui.Metadata a Cayaqui.Metadata.Resolver
(consistencia carpeta↔namespace). Afecta IExtendedPropertyResolver, ExtendedPropertyResolver,
PropertyMetadata.
// antes
using Cayaqui.Metadata;
// ahora (para los tipos del resolver)
using Cayaqui.Metadata.Resolver;
Los atributos ([Display], [GridWidth], [GridFormat], [Money], [Wbs], …) permanecen en
Cayaqui.Metadata. Sin cambios de comportamiento — corrige la divergencia entre el source y el
binario 0.19.0 publicado (que aún tenía estos tipos en el namespace raíz).
Two new optional attributes for CayaquiAutoGrid column control:
public class BudgetDto
{
[Label("Código WBS"), GridWidth("120")] public string WbsCode { get; set; }
[Label("CPI"), GridWidth("80"), GridFormat("N2")] public decimal Cpi { get; set; }
[Label("Descripción"), GridWidth("25%")] public string? Name { get; set; }
}
[GridWidth(string)] — column width as px string ("120") or CSS value ("25%"). Read via PropertyMetadata.GridWidthString. Takes precedence over [ColumnWidth(int)].[GridFormat(string)] — custom number format applied by IExtendedPropertyResolver.Format() when no other format attribute is present. Accepts any .NET format string ("N2", "P1", "#,##0.00").Both attributes are additive — no breaking changes.
IExtendedPropertyResolver.Format() ahora resuelve [Display(Name="…")] para valores enum (antes devolvía el identifier C# directo). Esto hace que los componentes de Cayaqui.Components (CayaquiAutoGrid, CayaquiAutoBadge, CayaquiAutoForm read-only) y los renderers de Cayaqui.Reports muestren labels localizados.
public enum Status
{
[Display(Name = "Aprobado")] Approved,
[Display(Name = "Rechazado")] Rejected,
}
resolver.Format(Status.Approved, typeof(Row), nameof(Row.Status));
// → "Aprobado" (era "Approved" en 0.3.x)
Cambio aditivo: enums sin [Display] siguen devolviendo value.ToString(). Limitación: enums [Flags] con combinación bit-OR caen al ToString() de .NET ("A, B, C" con identifiers C#) — resolución bit-a-bit es follow-up.
Bug fix idempotencia DI: AddCayaquiMetadata() y los demás AddCayaquiX() usan ahora TryAddSingleton/TryAddScoped. Múltiples llamadas (que ocurren cuando otros helpers como AddCayaquiComponents() lo invocan internamente) no duplican los registros.
Nuevo helper público: EnumExtensions.GetDisplayName() para uso fuera del resolver (charts, chips, código manual).
dotnet add package Cayaqui.Metadata
builder.Services.AddCayaquiMetadata(); // registra IExtendedPropertyResolver singleton
public sealed class ControlAccountDto
{
[Label("Código CA")] [Wbs] [UpperCase]
[NotEmpty] [MaxLength(20)] [RegularExpression(@"^[A-Z]{2,3}-\d{3,}$")]
[ImportAlias("Code", "Control Account")]
public string Code { get; set; } = "";
[Currency("USD", 2)] [Money] [Align(TextAlign.Right)] [ColumnWidth(140)]
public decimal Bac { get; set; }
[Percentage(1)] [EvmIndicator(EvmKind.Cpi)] [EvmBand(green: 0.97, yellow: 0.90)]
public decimal Cpi { get; set; }
[Date("dd-MMM-yy")] [Schedule]
public DateTime ControlDate { get; set; }
[Badge] // reads colors from BadgeEnum values
public ProjectStatus Status { get; set; }
[Mask(MaskKind.Email, visibleChars: 1)] [Tooltip("Owner email (masked)")]
public string Owner { get; set; } = "";
[Hidden]
public Guid InternalId { get; set; }
[ImportAlias("SPI", "Schedule Performance Index")]
[ImportCulture("es-CL")]
public decimal Spi { get; set; }
}
public enum ProjectStatus
{
[BadgeColor(BadgeKind.Neutral)] Draft,
[BadgeColor(BadgeKind.Info)] InReview,
[BadgeColor(BadgeKind.Success)] Approved,
[BadgeColor(BadgeKind.Warning)] OnHold,
[BadgeColor(BadgeKind.Error)] Cancelled
}
[Label("text")] — override (reuse [Display(Name)] si existe)[Tooltip("text")] — tooltip específico[Placeholder("text")] — placeholder input Blazor[Display(Name, Description, Order, GroupName)] de DataAnnotations[Currency("USD", 2)] — "USD 1,234.56"[Percentage(1)] — 0.756 → "75.6%"[Date("dd-MMM-yy")] — formato custom[Integer(thousands: true)] — "1,234,567"[DecimalFormat(decimals: 4)][Duration(DurationUnit.Days)] — "5d", "3h", "15m"[UpperCase] · [LowerCase] · [TitleCase][Mask(MaskKind.Email, visibleChars: 1)] → "a********@cayaqui.com"[Mask(MaskKind.Email, visibleChars: 3)] → "ale******@cayaqui.com"[Mask(MaskKind.LastChars, visibleChars: 4)] → "******7890"[Truncate(30)][Align(TextAlign.Right)][ColumnWidth(150)][VisibleIn(RenderTargets.Web | RenderTargets.Report)][Hidden] — shortcut de [VisibleIn(None)][ReadOnlyDisplay][Badge(BadgeKind.Success)] — fijo[Badge] + [BadgeColor(...)] en cada valor del enum — mapeado por valor[UserColumn] — marca una prop string como nombre de usuario para que CayaquiAutoGrid la renderice como <UserChip>. Opcionales:
AvatarSource = "SiblingProp" — prop hermana con la URL del avatar.RoleSource = "SiblingProp" — prop hermana con el rol/cargo.public sealed record AuditRow(
string Action,
[property: UserColumn(AvatarSource = "PerformedByAvatar", RoleSource = "PerformedByRole")]
string PerformedByName,
string? PerformedByAvatar,
string? PerformedByRole);
Cayaqui.Components 0.24+ consume este atributo automáticamente.
[NotEmpty] — [Required(AllowEmptyStrings = false)][Min(0)] / [Max(100)] — sugar sobre [Range][Required], [MaxLength], [MinLength], [Range], [RegularExpression], [EmailAddress], [Phone], [Url][EvmIndicator(EvmKind.Cpi)] — renderer aplica íconos/colores contextuales[EvmBand(green: 0.95, yellow: 0.85)] — thresholds semaforo configurables[Wbs] · [Cbs] · [Schedule] · [Money] — markers semánticos[ImportAlias("CPI", "Cost Performance Index")] — multi-header match[ImportIgnore][ImportDefault(0)][ImportCulture("es-CL")] — parsing locale[ImportColumn(3)] — opt-in por posición[ImportTrim(false)] — default true[ImportRegex(@"^[A-Z]+-\d+$")]public interface IExtendedPropertyResolver
{
PropertyMetadata? Get(Type dtoType, string propertyName);
IReadOnlyList<PropertyMetadata> GetAll(Type dtoType);
/// <summary>
/// Filtra GetAll() por <see cref="RenderTargets"/> visible (Web | Report |
/// Excel). Usado por CayaquiAutoGrid/CayaquiAutoForm para descartar props
/// con [VisibleIn] que excluya el target actual.
/// </summary>
IReadOnlyList<PropertyMetadata> GetVisibleProperties(Type dtoType, RenderTargets target);
string? Format(object? value, Type dtoType, string propertyName, CultureInfo? culture = null);
bool TryParse(string? text, Type dtoType, string propertyName, CultureInfo? culture, out object? value);
}
RenderTargets es un enum bandera (en Cayaqui.Metadata/Models/Enums.cs):
[Flags]
public enum RenderTargets
{
None = 0,
Web = 1 << 0, // grids, forms, modals en Blazor
Report = 1 << 1, // PDF/Word/PPT vía Cayaqui.Reports
Excel = 1 << 2, // export a XLSX vía Cayaqui.ExcelExport
All = Web | Report | Excel,
}
Helper público adicional (v0.4.0+):
namespace Cayaqui.Metadata;
public static class EnumExtensions
{
/// Devuelve [Display(Name)] del miembro del enum, fallback a ToString().
public static string GetDisplayName(this Enum value);
}
Cache por Type en primer acceso, thread-safe.
Microsoft.Extensions.DependencyInjection.Abstractions para el extension method, que es BCL+)| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 5 NuGet packages that depend on Cayaqui.Metadata:
| Package | Downloads |
|---|---|
|
Cayaqui.Storage
Generic storage service for .NET 10 with pluggable providers (Azure Blob Storage, Local File System). Includes streaming upload/download, SAS/file URL generation, container/key model and DI options pattern. Proprietary — requires a commercial agreement with Cayaqui. |
|
|
Cayaqui.ExcelImport
Reads .xlsx files and materializes strongly-typed DTOs using the attributes from Cayaqui.Metadata (ImportAlias, ImportColumn, ImportCulture, ImportDefault, ImportTrim, ImportRegex) plus resolver-based TryParse. Uses Syncfusion XlsIO for spreadsheet access. Proprietary — requires a commercial agreement with Cayaqui. |
|
|
Cayaqui.Components
Design system and EVM/EPC reusable components (KPI strip, gauges CPI/SPI/PF, S-curves, Gantt, WBS tree grid, R9C, risk heatmap, change orders, purchase orders, engineering deliverables, lookahead grid) for .NET 10 Blazor WebApp (Interactive Server) on top of Syncfusion.Blazor. Proprietary — requires a commercial agreement with Cayaqui. |
|
|
Cayaqui.ExcelExport
Exports strongly-typed collections of DTOs to .xlsx using the attributes from Cayaqui.Metadata: Label for headers, Currency/Percentage/Date for cell formats, Align/ColumnWidth for layout, VisibleIn/Hidden for visibility, Order for column order, Badge for cell background color. Uses Syncfusion XlsIO. Proprietary — requires a commercial agreement with Cayaqui. |
|
|
Cayaqui.WordExport
Programmatic Word document sections for EVM reporting. Each IWordDocSection adds a section to a Syncfusion.DocIO WordDocument. Pairs with Cayaqui.PptExport, Cayaqui.ExcelExport, and Cayaqui.ReportModels. |
This package is not used by any popular GitHub repositories.
v0.20.0 — BREAKING (namespace): el resolver se movió de `Cayaqui.Metadata` a `Cayaqui.Metadata.Resolver` por consistencia carpeta↔namespace. Tipos afectados: `IExtendedPropertyResolver`, `ExtendedPropertyResolver`, `PropertyMetadata`. Consumers deben actualizar `using Cayaqui.Metadata;` → `using Cayaqui.Metadata.Resolver;` para esos tipos (los atributos `[Display]`, `[GridWidth]`, etc. siguen en `Cayaqui.Metadata`). El binario 0.19.0 publicado tenía estos tipos en el namespace viejo; esta versión corrige la divergencia source↔nuget. Sin cambios de comportamiento.
v0.19.0 — Nuevos atributos de grid: [GridWidth(string)] para ancho de columna (px o %) y [GridFormat(string)] para formato de número custom ("N2", "P1", etc.) en MpsAutoGrid. Ambos opcionales, backward-compatible. ExtendedPropertyResolver los expone en PropertyMetadata.GridWidthString y .GridFormatString.