Fields
AutoNumber Field
Read-only auto-generated sequence number
The AutoNumber Field component displays auto-generated sequence numbers. This is a read-only field where the value is automatically generated by the backend when records are created.
Basic Usage
Basic AutoNumber
{
"type": "auto_number",
"name": "order_number",
"label": "Order Number",
"readonly": true,
"value": "ORD-0001"
}Custom Format
Invoice Number Format
{
"type": "auto_number",
"name": "invoice_id",
"label": "Invoice ID",
"format": "INV-{0000}",
"readonly": true,
"value": "INV-1234"
}Date-Based Format
Date-Based Ticket ID
{
"type": "auto_number",
"name": "ticket_id",
"label": "Ticket ID",
"format": "TKT-{YYYY}{MM}-{0000}",
"readonly": true,
"value": "TKT-202403-0567"
}Field Schema
interface AutoNumberFieldSchema {
type: 'auto_number';
name: string; // Field name/ID
label?: string; // Field label
value?: string | number; // Generated value (read-only)
readonly: true; // Always read-only
className?: string; // Additional CSS classes
// AutoNumber Configuration
format?: string; // Number format template
starting_number?: number; // Starting sequence number
}Format Templates
Common format patterns:
Simple Sequential
format: '{0000}' // 0001, 0002, 0003...
format: '{00000}' // 00001, 00002, 00003...With Prefix
format: 'ORD-{0000}' // ORD-0001, ORD-0002...
format: 'INV-{00000}' // INV-00001, INV-00002...
format: 'CUST-{000}' // CUST-001, CUST-002...Date-Based
format: '{YYYY}-{0000}' // 2024-0001, 2024-0002...
format: '{YY}{MM}-{000}' // 2403-001, 2403-002...
format: 'ORD-{YYYYMMDD}-{00}' // ORD-20240315-01...Mixed Format
format: 'PO-{YYYY}-{MM}-{0000}' // PO-2024-03-0001
format: '{YY}Q{Q}-{000}' // 24Q1-001, 24Q1-002...Format Placeholders
{0},{00},{000}, etc. - Sequential number with padding{YYYY}- Four-digit year (2024){YY}- Two-digit year (24){MM}- Two-digit month (03){DD}- Two-digit day (15){Q}- Quarter (1-4)
Backend Implementation
AutoNumber values are generated on record creation:
const generateAutoNumber = (format: string, sequence: number) => {
const now = new Date();
return format
.replace('{YYYY}', now.getFullYear().toString())
.replace('{YY}', now.getFullYear().toString().slice(-2))
.replace('{MM}', (now.getMonth() + 1).toString().padStart(2, '0'))
.replace('{DD}', now.getDate().toString().padStart(2, '0'))
.replace('{Q}', Math.ceil((now.getMonth() + 1) / 3).toString())
.replace(/\{0+\}/, (match) => {
const padding = match.length - 2;
return sequence.toString().padStart(padding, '0');
});
};
// Example usage
generateAutoNumber('ORD-{YYYY}-{0000}', 42);
// Returns: "ORD-2024-0042"Sequence Management
The backend maintains sequence counters:
interface SequenceCounter {
object: string; // Object name
field: string; // Field name
current_value: number; // Current sequence number
prefix?: string; // Optional prefix for partitioning
}
// Increment sequence atomically
const getNextSequence = async (object: string, field: string) => {
return await db.transaction(async (tx) => {
const counter = await tx.findOne('sequences', { object, field });
const nextValue = (counter?.current_value || 0) + 1;
await tx.upsert('sequences', { object, field }, { current_value: nextValue });
return nextValue;
});
};Use Cases
- Order Management: Order numbers, PO numbers
- Invoicing: Invoice IDs, receipt numbers
- Ticketing: Support ticket IDs, case numbers
- Customer Management: Customer IDs, account numbers
- Inventory: SKU numbers, serial numbers
- Document Management: Document IDs, revision numbers
Best Practices
- Choose appropriate padding: Use enough digits for expected volume
- Include year for long-running systems: Helps with archival and partitioning
- Use meaningful prefixes: Makes numbers self-documenting
- Don't expose internal IDs: Use auto-numbers for user-facing identifiers
- Consider reset policies: Decide if/when sequences reset (yearly, monthly, etc.)