/** * Example seed data for Contact object with UI metadata * Run this after creating the object definition */ exports.seed = async function(knex) { // Get or create the Contact object const [contactObj] = await knex('object_definitions') .where({ api_name: 'Contact' }) .select('id'); if (!contactObj) { console.log('Contact object not found. Please create it first.'); return; } // Define fields with UI metadata const fields = [ { object_definition_id: contactObj.id, api_name: 'firstName', label: 'First Name', type: 'text', is_required: true, is_system: false, is_custom: false, display_order: 1, ui_metadata: { placeholder: 'Enter first name', helpText: 'The contact\'s given name', showOnList: true, showOnDetail: true, showOnEdit: true, sortable: true, validationRules: [ { type: 'min', value: 2, message: 'First name must be at least 2 characters' }, { type: 'max', value: 50, message: 'First name cannot exceed 50 characters' } ] } }, { object_definition_id: contactObj.id, api_name: 'lastName', label: 'Last Name', type: 'text', is_required: true, is_system: false, is_custom: false, display_order: 2, ui_metadata: { placeholder: 'Enter last name', helpText: 'The contact\'s family name', showOnList: true, showOnDetail: true, showOnEdit: true, sortable: true, validationRules: [ { type: 'min', value: 2, message: 'Last name must be at least 2 characters' }, { type: 'max', value: 50, message: 'Last name cannot exceed 50 characters' } ] } }, { object_definition_id: contactObj.id, api_name: 'email', label: 'Email', type: 'email', is_required: true, is_unique: true, is_system: false, is_custom: false, display_order: 3, ui_metadata: { placeholder: 'email@example.com', helpText: 'Primary email address', showOnList: true, showOnDetail: true, showOnEdit: true, sortable: true, validationRules: [ { type: 'email', message: 'Please enter a valid email address' } ] } }, { object_definition_id: contactObj.id, api_name: 'phone', label: 'Phone', type: 'text', is_required: false, is_system: false, is_custom: false, display_order: 4, ui_metadata: { placeholder: '+1 (555) 000-0000', helpText: 'Primary phone number', showOnList: true, showOnDetail: true, showOnEdit: true, sortable: false, validationRules: [ { type: 'pattern', value: '^\\+?[0-9\\s\\-\\(\\)]+$', message: 'Please enter a valid phone number' } ] } }, { object_definition_id: contactObj.id, api_name: 'company', label: 'Company', type: 'text', is_required: false, is_system: false, is_custom: false, display_order: 5, ui_metadata: { placeholder: 'Company name', helpText: 'The organization this contact works for', showOnList: true, showOnDetail: true, showOnEdit: true, sortable: true } }, { object_definition_id: contactObj.id, api_name: 'jobTitle', label: 'Job Title', type: 'text', is_required: false, is_system: false, is_custom: false, display_order: 6, ui_metadata: { placeholder: 'e.g., Senior Manager', showOnList: false, showOnDetail: true, showOnEdit: true, sortable: false } }, { object_definition_id: contactObj.id, api_name: 'status', label: 'Status', type: 'picklist', is_required: true, is_system: false, is_custom: false, display_order: 7, default_value: 'active', ui_metadata: { showOnList: true, showOnDetail: true, showOnEdit: true, sortable: true, options: [ { label: 'Active', value: 'active' }, { label: 'Inactive', value: 'inactive' }, { label: 'Pending', value: 'pending' }, { label: 'Archived', value: 'archived' } ] } }, { object_definition_id: contactObj.id, api_name: 'leadSource', label: 'Lead Source', type: 'picklist', is_required: false, is_system: false, is_custom: false, display_order: 8, ui_metadata: { placeholder: 'Select lead source', showOnList: false, showOnDetail: true, showOnEdit: true, sortable: true, options: [ { label: 'Website', value: 'website' }, { label: 'Referral', value: 'referral' }, { label: 'Social Media', value: 'social' }, { label: 'Conference', value: 'conference' }, { label: 'Cold Call', value: 'cold_call' }, { label: 'Other', value: 'other' } ] } }, { object_definition_id: contactObj.id, api_name: 'isVip', label: 'VIP Customer', type: 'boolean', is_required: false, is_system: false, is_custom: false, display_order: 9, default_value: 'false', ui_metadata: { helpText: 'Mark as VIP for priority support', showOnList: true, showOnDetail: true, showOnEdit: true, sortable: true } }, { object_definition_id: contactObj.id, api_name: 'birthDate', label: 'Birth Date', type: 'date', is_required: false, is_system: false, is_custom: false, display_order: 10, ui_metadata: { showOnList: false, showOnDetail: true, showOnEdit: true, sortable: true, format: 'yyyy-MM-dd' } }, { object_definition_id: contactObj.id, api_name: 'website', label: 'Website', type: 'url', is_required: false, is_system: false, is_custom: false, display_order: 11, ui_metadata: { placeholder: 'https://example.com', showOnList: false, showOnDetail: true, showOnEdit: true, sortable: false, validationRules: [ { type: 'url', message: 'Please enter a valid URL starting with http:// or https://' } ] } }, { object_definition_id: contactObj.id, api_name: 'mailingAddress', label: 'Mailing Address', type: 'textarea', is_required: false, is_system: false, is_custom: false, display_order: 12, ui_metadata: { placeholder: 'Enter full mailing address', rows: 3, showOnList: false, showOnDetail: true, showOnEdit: true, sortable: false } }, { object_definition_id: contactObj.id, api_name: 'notes', label: 'Notes', type: 'textarea', is_required: false, is_system: false, is_custom: false, display_order: 13, ui_metadata: { placeholder: 'Additional notes about this contact...', rows: 5, showOnList: false, showOnDetail: true, showOnEdit: true, sortable: false } }, { object_definition_id: contactObj.id, api_name: 'annualRevenue', label: 'Annual Revenue', type: 'currency', is_required: false, is_system: false, is_custom: false, display_order: 14, ui_metadata: { prefix: '$', step: 0.01, min: 0, showOnList: false, showOnDetail: true, showOnEdit: true, sortable: true } }, { object_definition_id: contactObj.id, api_name: 'numberOfEmployees', label: 'Number of Employees', type: 'integer', is_required: false, is_system: false, is_custom: false, display_order: 15, ui_metadata: { min: 1, step: 1, showOnList: false, showOnDetail: true, showOnEdit: true, sortable: true } } ]; // Insert or update fields for (const field of fields) { const existing = await knex('field_definitions') .where({ object_definition_id: field.object_definition_id, api_name: field.api_name }) .first(); if (existing) { await knex('field_definitions') .where({ id: existing.id }) .update({ ...field, ui_metadata: JSON.stringify(field.ui_metadata), updated_at: knex.fn.now() }); console.log(`Updated field: ${field.api_name}`); } else { await knex('field_definitions').insert({ ...field, ui_metadata: JSON.stringify(field.ui_metadata), created_at: knex.fn.now(), updated_at: knex.fn.now() }); console.log(`Created field: ${field.api_name}`); } } console.log('Contact fields seeded successfully!'); };