350 lines
9.0 KiB
JavaScript
350 lines
9.0 KiB
JavaScript
/**
|
|
* 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!');
|
|
};
|