Added auth functionality, initial work with views and field types
This commit is contained in:
349
backend/seeds/example_contact_fields_with_ui_metadata.js
Normal file
349
backend/seeds/example_contact_fields_with_ui_metadata.js
Normal file
@@ -0,0 +1,349 @@
|
||||
/**
|
||||
* 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!');
|
||||
};
|
||||
Reference in New Issue
Block a user