{
  "$schema": "https://ai.syncfusion.com/schema/registry-item.json",
  "name": "grid-default",
  "framework": "blazor",
  "type": "registry:component",
  "component": "Grid",
  "variant": "default",
  "dependencies": [
    "Syncfusion.Blazor.Grids"
  ],
  "description": "Paginated transactions grid displays formatted amounts, payment options, status badges, and a template for completion dates.",
  "meta": {
    "essentialStudioRelease": "2026 Volume 2 (v34.1.29)",
    "license": "commercial-or-community",
    "licenseNote": "The Syncfusion package is licensed. The composition in this file is source you own and edit. See https://ai.syncfusion.com/licensing.md",
    "requiresLicenseKey": true,
    "requiresServerEndpoint": false,
    "platformIndex": "https://ai.syncfusion.com/blazor/llms.txt",
    "skillPack": "syncfusion/blazor-ui-components-skills",
    "docs": "https://ai.syncfusion.com/gallery/blazor/grid-default.md"
  },
  "files": [
    {
      "target": "src/components/grid-default/DataSource.cs",
      "content": "using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\n\nnamespace BlazorDemos.Pages.Grid.TransactionDataNameSpace\n{\n    /// <summary>\n    /// Strongly typed payment method types for transactions.\n    /// </summary>\n    public enum PaymentMethodType\n    {\n        /// <summary>Payment via credit or debit card.</summary>\n        [Display(Name = \"Credit Card\")]\n        CreditCard,\n\n        /// <summary>Payment via debit card.</summary>\n        [Display(Name = \"Debit Card\")]\n        DebitCard,\n\n        /// <summary>Payment via PayPal digital wallet.</summary>\n        PayPal,\n\n        /// <summary>Payment via cheque instrument.</summary>\n        Cheque,\n\n        /// <summary>Payment via UPI (Unified Payments Interface).</summary>\n        UPI,\n\n        /// <summary>Payment via net banking facility.</summary>\n        NetBanking,\n\n        /// <summary>Payment in physical cash.</summary>\n        Cash\n    }\n\n    /// <summary>\n    /// Strongly typed transaction states used across the model and generator.\n    /// </summary>\n    public enum TransactionStatus\n    {\n        /// <summary>Transaction completed successfully.</summary>\n        Completed,\n\n        /// <summary>Transaction is pending approval or processing.</summary>\n        Pending,\n\n        /// <summary>Transaction failed due to error or rejection.</summary>\n        Failed,\n\n        /// <summary>Transaction is currently being processed.</summary>\n        Processing,\n\n        /// <summary>Transaction has been refunded.</summary>\n        Refunded\n    }\n\n    /// <summary>\n    /// Represents a transaction entry that appears in the Blazor DataGrid.\n    /// </summary>\n    public class TransactionRecord\n    {\n        /// <summary>Unique identifier for the transaction (pattern: TRX-YYYYMMDD-####).</summary>\n        public string TransactionId { get; set; } = string.Empty;\n\n        /// <summary>buyer or business name associated with the transaction.</summary>\n        public string BuyerName { get; set; } = string.Empty;\n\n        /// <summary>Invoice identifier related to the transaction.</summary>\n        public string InvoiceNumber { get; set; } = string.Empty;\n\n        /// <summary>Brief description of the transaction purpose or category.</summary>\n        public string Description { get; set; } = string.Empty;\n\n        /// <summary>Total monetary amount for the transaction.</summary>\n        public double? TotalAmount { get; set; }\n\n        /// <summary>Payment method used for the transaction.</summary>\n        public PaymentMethodType PaymentOptions { get; set; }\n\n        /// <summary>Timestamp when the transaction was initiated or created.</summary>\n        public DateTime? CreatedOn { get; set; }\n\n        /// <summary>Timestamp when the transaction reached a terminal state. Null for pending transactions.</summary>\n        public DateTime? CompletedOn { get; set; }\n\n        /// <summary>Current state of the transaction (Completed, Pending, Failed, Processing, Refunded).</summary>\n        public TransactionStatus Status { get; set; } = TransactionStatus.Pending;\n    }\n\n    /// <summary>\n    /// Provides deterministic, realistic transaction data for demos and samples.\n    /// </summary>\n    public static class TransactionData\n    {\n        /// <summary>Synthetic buyer names for data seeding.</summary>\n        private static readonly string[] BuyerNames = new[]\n        {\n            \"Acme Industries\", \"Brightline Retail\", \"Cedar Consulting\", \"Delta Logistics\", \"Evergreen Health\",\n            \"Fountain Media\", \"Grove Construction\", \"Harbor Finance\", \"Iris Technologies\", \"Juniper Foods\",\n            \"Keaton Manufacturing\", \"Lumen Energy\", \"Marlin Services\", \"Nimbus Travel\", \"Orchid Education\",\n            \"Pioneer Real Estate\", \"Quarry Supplies\", \"Ridge Automotive\", \"Summit Insurance\", \"Trinity Apparel\",\n            \"Union Hardware\", \"Valley Farms\", \"Westbridge Labs\", \"Yellowstone Hospitality\", \"Zenith Electronics\",\n            \"Alpha Solutions\", \"Beta Networks\", \"Gamma Consulting\", \"Delta Systems\", \"Epsilon Trading\"\n        };\n\n        /// <summary>Representative descriptions for transaction types.</summary>\n        private static readonly string[] TransactionDescriptions = new[]\n        {\n            \"Invoice Payment - Services\", \"Monthly Subscription Renewal\", \"One-time Setup Fee\", \"Software License Purchase\",\n            \"Hardware Purchase\", \"Refund - Order Processed\", \"Chargeback Reversal\", \"Tax Adjustment\", \"Consulting Fee\",\n            \"Maintenance Contract\", \"Training Session\", \"Advertising Campaign\", \"Event Sponsorship\", \"Deposit Received\",\n            \"Final Settlement\", \"Invoice Correction\", \"Reimbursement - Travel\", \"Commission Payout\", \"Interest Charge\",\n            \"Bank Fees\", \"Currency Conversion\", \"Retention Payment\", \"Warranty Claim\", \"Professional Services\",\n            \"Equipment Rental\", \"Utility Bills\", \"Insurance Premium\", \"License Renewal\", \"Support Plan\"\n        };\n\n        /// <summary>Available payment methods.</summary>\n        private static readonly string[] PaymentMethods = new[]\n        {\n            \"Credit Card\", \"Debit Card\", \"PayPal\", \"Cheque\", \"UPI\", \"NetBanking\", \"Cash\"\n        };\n\n        /// <summary>Supported transaction statuses.</summary>\n        private static readonly TransactionStatus[] TransactionStatuses = new[]\n        {\n            TransactionStatus.Completed,\n            TransactionStatus.Pending,\n            TransactionStatus.Failed,\n            TransactionStatus.Processing,\n            TransactionStatus.Refunded\n        };\n\n        /// <summary>Generates a deterministic list of 10 transaction records with realistic data.</summary>\n        /// <returns>List of populated TransactionRecord instances.</returns>\n        public static IReadOnlyList<TransactionRecord> GetAllRecords()\n        {\n            var records = new List<TransactionRecord>(10);\n            var baseDate = new DateTime(2025, 12, 01, 08, 00, 00);\n            TransactionStatus? previousStatus = null;\n            PaymentMethodType? previousPayment = null;\n\n            for (int i = 0; i < 10; i++)\n            {\n                int row = i + 1;\n                \n                // Calculate deterministic indices for data selection\n                int buyerIndex = (i * 17 + 5) % BuyerNames.Length;\n                int descriptionIndex = (i * 7) % TransactionDescriptions.Length;\n                int paymentIndex = (i * 3) % PaymentMethods.Length;\n                int statusIndex = (i * 5 + i / 7 + 2) % TransactionStatuses.Length;\n\n                // Select buyer, description, and payment method from arrays\n                string buyerName = BuyerNames[buyerIndex];\n                string description = TransactionDescriptions[descriptionIndex];\n                PaymentMethodType paymentMethod = (PaymentMethodType)paymentIndex;\n\n                // Avoid consecutive identical payment methods\n                if (previousPayment.HasValue && paymentMethod == previousPayment.Value)\n                {\n                    paymentMethod = (PaymentMethodType)((paymentIndex + 1) % PaymentMethods.Length);\n                }\n                previousPayment = paymentMethod;\n\n                // Select transaction status\n                TransactionStatus status = TransactionStatuses[statusIndex];\n                \n                // Cash payments always complete immediately\n                if (paymentMethod == PaymentMethodType.Cash)\n                {\n                    status = TransactionStatus.Completed;\n                }\n                // Avoid consecutive identical statuses\n                else if (previousStatus.HasValue && status == previousStatus.Value)\n                {\n                    status = TransactionStatuses[(statusIndex + 1) % TransactionStatuses.Length];\n                }\n                previousStatus = status;\n\n                // Calculate amount based on transaction description category\n                double totalAmount = GetTransactionAmount(description, i);\n\n                // Distribute dates across 88 days with time variation\n                int daysOffset = (i * 3) % 88;\n                DateTime createdOn = baseDate.AddDays(daysOffset).AddMinutes((i * 5) % 1440);\n\n                // Set completion date based on status\n                DateTime? completedOn = null;\n                if (status == TransactionStatus.Completed || status == TransactionStatus.Failed)\n                {\n                    // Completed/Failed transactions finish within 5-10 minutes\n                    int timeDelta = (i * 3 % 6) + 5;\n                    completedOn = createdOn.AddMinutes(timeDelta);\n                }\n                else if (status == TransactionStatus.Refunded)\n                {\n                    // Refunded transactions complete after 24 hours\n                    completedOn = createdOn.AddHours(24);\n                }\n\n                records.Add(new TransactionRecord\n                {\n                    TransactionId = $\"TRX-{createdOn:yyyyMMdd}-{row:D4}\",\n                    BuyerName = buyerName,\n                    InvoiceNumber = $\"INV-{createdOn:yyyy}-{row:D4}\",\n                    Description = description,\n                    TotalAmount = totalAmount,\n                    PaymentOptions = paymentMethod,\n                    CreatedOn = createdOn,\n                    CompletedOn = completedOn,\n                    Status = status\n                });\n            }\n\n            return records;\n        }\n\n        /// <summary>Returns a realistic transaction amount based on description and seed index.</summary>\n        /// <param name=\"description\">Transaction description for category-based logic.</param>\n        /// <param name=\"seed\">Deterministic seed value (row index).</param>\n        /// <returns>Rounded monetary amount.</returns>\n        private static double GetTransactionAmount(string description, int seed)\n        {\n            // Default amount when no category matches\n            double baseAmount = 1200.0 + ((seed * 23) % 9000);\n\n            // Return category-specific amount based on description keywords\n            return description switch\n            {\n                // Low recurring fees (~$300-800)\n                string s when s.Contains(\"Subscription\", StringComparison.Ordinal) || s.Contains(\"Monthly\", StringComparison.Ordinal)\n                    => Math.Round(299.99d + (seed % 500), 2),\n\n                // High-value hardware purchases (~$2,500-10,000)\n                string s when s.Contains(\"Hardware\", StringComparison.Ordinal) || s.Contains(\"Equipment\", StringComparison.Ordinal)\n                    => Math.Round(2500.0d + (seed % 7500), 2),\n\n                // Professional service fees (~$1,500-10,000)\n                string s when s.Contains(\"Consulting\", StringComparison.Ordinal) || s.Contains(\"Professional\", StringComparison.Ordinal)\n                    => Math.Round(1500.0d + (seed % 8500), 2),\n\n                // Refund amounts (~$100-5,100)\n                string s when s.Contains(\"Refund\", StringComparison.Ordinal)\n                    => Math.Round(100.0d + (seed % 5000), 2),\n\n                // Tax adjustments (~$500-3,500)\n                string s when s.Contains(\"Tax\", StringComparison.Ordinal)\n                    => Math.Round(500.0d + (seed % 3000), 2),\n\n                // Insurance premiums (~$750-4,750)\n                string s when s.Contains(\"Insurance\", StringComparison.Ordinal) || s.Contains(\"Premium\", StringComparison.Ordinal)\n                    => Math.Round(750.0d + (seed % 4000), 2),\n\n                // License renewal fees (~$400-3,400)\n                string s when s.Contains(\"License\", StringComparison.Ordinal)\n                    => Math.Round(400.0d + (seed % 3000), 2),\n\n                // Training/workshop fees (~$800-3,300)\n                string s when s.Contains(\"Training\", StringComparison.Ordinal)\n                    => Math.Round(800.0d + (seed % 2500), 2),\n\n                // Cloud and support services (~$250-1,750)\n                string s when s.Contains(\"Cloud\", StringComparison.Ordinal) || s.Contains(\"Support\", StringComparison.Ordinal)\n                    => Math.Round(250.0d + (seed % 1500), 2),\n\n                // Default: use base amount\n                _ => Math.Round(baseAmount, 2)\n            };\n        }\n    }\n}"
    },
    {
      "target": "src/components/grid-default/Grid.razor",
      "content": "@page \"/datagrid/default-functionalities\"\n@using Syncfusion.Blazor.Grids\n@using BlazorDemos.Pages.Grid.TransactionDataNameSpace\n\n<div class=\"col-lg-12 control-section\">\n    <div class=\"content-wrapper\">\n        <div class=\"row\">\n            <SfGrid DataSource=\"@GridData\" AllowPaging=\"true\">\n                <GridColumns>\n                    <GridColumn Field=@nameof(TransactionRecord.TransactionId) HeaderText=\"Transaction Id\" Type=\"ColumnType.String\" TextAlign=\"TextAlign.Right\" Width=\"180\"></GridColumn>\n                    <GridColumn Field=@nameof(TransactionRecord.BuyerName) HeaderText=\"Buyer Name\" Type=\"ColumnType.String\" Width=\"200\"></GridColumn>\n                    <GridColumn Field=@nameof(TransactionRecord.InvoiceNumber) HeaderText=\"Invoice Number\" Type=\"ColumnType.String\" Width=\"150\"></GridColumn>\n                    <GridColumn Field=@nameof(TransactionRecord.Description) HeaderText=\"Description\" Type=\"ColumnType.String\" Width=\"250\"></GridColumn>\n                    <GridColumn Field=@nameof(TransactionRecord.TotalAmount) HeaderText=\"Total Amount\" Format=\"C2\" TextAlign=\"TextAlign.Right\" Type=\"ColumnType.Double\" Width=\"150\"></GridColumn>\n                    <GridColumn Field=@nameof(TransactionRecord.PaymentOptions) HeaderText=\"Payment Options\" Type=\"ColumnType.String\" Width=\"180\"> </GridColumn>\n                    <GridColumn Field=@nameof(TransactionRecord.CreatedOn) HeaderText=\"Created On\" Format=\"MM/dd/yyyy hh:mm tt\" Type=\"ColumnType.DateTime\" TextAlign=\"TextAlign.Right\" Width=\"180\"></GridColumn>\n                    <GridColumn Field=@nameof(TransactionRecord.CompletedOn) HeaderText=\"Completed On\" Type=\"ColumnType.DateTime\" TextAlign=\"TextAlign.Right\" Width=\"180\">\n                        <Template>\n                            @{\n                                // Extract transaction record from grid context\n                                var record = context as TransactionRecord;\n                                // Check if transaction is still pending\n                                bool isPending = record?.Status == TransactionStatus.Pending;\n                                // Show placeholder for pending or null completion dates\n                                if (isPending)\n                                {\n                                    <span class=\"placeholder\">—</span>\n                                }\n                                // Display completion date if available\n                                else if (record?.CompletedOn is DateTime completedDate)\n                                {\n                                    <span>@completedDate.ToString(\"MM/dd/yyyy hh:mm tt\")</span>\n                                }\n                                // Show placeholder if no completion date\n                                else\n                                {\n                                    <span class=\"placeholder\">—</span>\n                                }\n                            }\n                        </Template>\n                    </GridColumn>\n                    <GridColumn Field=@nameof(TransactionRecord.Status) HeaderText=\"Status\" Type=\"ColumnType.String\" Width=\"120\">\n                        <Template>\n                            @{\n                                // Extract transaction record from grid context\n                                var record = context as TransactionRecord;\n                                // Cash payments always display as Completed, others show actual status\n                                var displayStatus = record?.PaymentOptions == PaymentMethodType.Cash\n                                ? TransactionStatus.Completed\n                                : record?.Status;\n                                // Select CSS class based on status value\n                                var statusClass = displayStatus switch\n                                {\n                                    TransactionStatus.Completed => \"status-completed\",\n                                    TransactionStatus.Failed => \"status-failed\",\n                                    TransactionStatus.Pending => \"status-pending\",\n                                    TransactionStatus.Processing => \"status-processing\",\n                                    TransactionStatus.Refunded => \"status-refunded\",\n                                    _ => \"status-default\"\n                                };\n                            }\n                            <!-- Display status as styled badge -->\n                            <span class=\"status-badge @statusClass\">@displayStatus</span>\n                        </Template>\n                    </GridColumn>\n                </GridColumns>\n            </SfGrid>\n        </div>\n    </div>\n</div>\n@code {\n    /// <summary>Collection of transaction records bound to the grid.</summary>\n    public List<TransactionRecord>? GridData { get; set; }\n    /// <summary>Initialize grid with transaction records when component loads.</summary>\n    protected override void OnInitialized()\n    {\n        // Load predefined transaction records from data source\n        GridData = TransactionData.GetAllRecords().ToList();\n    }\n}"
    }
  ]
}