@nextsparkjs/theme-crm 0.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CRM_PLAN.md +343 -0
  2. package/about.md +122 -0
  3. package/config/app.config.ts +185 -0
  4. package/config/billing.config.ts +187 -0
  5. package/config/dashboard.config.ts +372 -0
  6. package/config/dev.config.ts +55 -0
  7. package/config/features.config.ts +336 -0
  8. package/config/flows.config.ts +511 -0
  9. package/config/permissions.config.ts +297 -0
  10. package/config/theme.config.ts +111 -0
  11. package/entities/activities/activities.config.ts +61 -0
  12. package/entities/activities/activities.fields.ts +362 -0
  13. package/entities/activities/activities.service.ts +503 -0
  14. package/entities/activities/activities.types.ts +117 -0
  15. package/entities/activities/messages/en.json +123 -0
  16. package/entities/activities/messages/es.json +123 -0
  17. package/entities/activities/migrations/020_activities_table.sql +123 -0
  18. package/entities/activities/migrations/021_activities_metas.sql +114 -0
  19. package/entities/activities/migrations/022_activities_sample_data.sql +420 -0
  20. package/entities/campaigns/campaigns.config.ts +61 -0
  21. package/entities/campaigns/campaigns.fields.ts +413 -0
  22. package/entities/campaigns/campaigns.service.ts +426 -0
  23. package/entities/campaigns/campaigns.types.ts +124 -0
  24. package/entities/campaigns/messages/en.json +145 -0
  25. package/entities/campaigns/messages/es.json +145 -0
  26. package/entities/campaigns/migrations/001_campaigns_table.sql +127 -0
  27. package/entities/campaigns/migrations/002_campaigns_metas.sql +114 -0
  28. package/entities/campaigns/migrations/003_campaigns_sample_data.sql +364 -0
  29. package/entities/companies/companies.config.ts +61 -0
  30. package/entities/companies/companies.fields.ts +429 -0
  31. package/entities/companies/companies.service.ts +566 -0
  32. package/entities/companies/companies.types.ts +125 -0
  33. package/entities/companies/messages/en.json +146 -0
  34. package/entities/companies/messages/es.json +146 -0
  35. package/entities/companies/migrations/001_companies_table.sql +150 -0
  36. package/entities/companies/migrations/002_companies_metas.sql +114 -0
  37. package/entities/companies/migrations/003_companies_sample_data.sql +246 -0
  38. package/entities/contacts/contacts.config.ts +61 -0
  39. package/entities/contacts/contacts.fields.ts +359 -0
  40. package/entities/contacts/contacts.service.ts +509 -0
  41. package/entities/contacts/contacts.types.ts +108 -0
  42. package/entities/contacts/messages/en.json +117 -0
  43. package/entities/contacts/messages/es.json +117 -0
  44. package/entities/contacts/migrations/001_contacts_table.sql +134 -0
  45. package/entities/contacts/migrations/002_contacts_metas.sql +114 -0
  46. package/entities/contacts/migrations/003_contacts_sample_data.sql +421 -0
  47. package/entities/leads/leads.config.ts +61 -0
  48. package/entities/leads/leads.fields.ts +336 -0
  49. package/entities/leads/leads.service.ts +496 -0
  50. package/entities/leads/leads.types.ts +114 -0
  51. package/entities/leads/messages/en.json +132 -0
  52. package/entities/leads/messages/es.json +132 -0
  53. package/entities/leads/migrations/001_leads_table.sql +150 -0
  54. package/entities/leads/migrations/002_leads_metas.sql +120 -0
  55. package/entities/leads/migrations/003_leads_sample_data.sql +242 -0
  56. package/entities/notes/messages/en.json +114 -0
  57. package/entities/notes/messages/es.json +114 -0
  58. package/entities/notes/migrations/020_notes_table.sql +118 -0
  59. package/entities/notes/migrations/021_notes_metas.sql +114 -0
  60. package/entities/notes/migrations/022_notes_sample_data.sql +275 -0
  61. package/entities/notes/notes.config.ts +61 -0
  62. package/entities/notes/notes.fields.ts +283 -0
  63. package/entities/notes/notes.service.ts +320 -0
  64. package/entities/notes/notes.types.ts +102 -0
  65. package/entities/opportunities/messages/en.json +107 -0
  66. package/entities/opportunities/messages/es.json +107 -0
  67. package/entities/opportunities/migrations/010_opportunities_table.sql +145 -0
  68. package/entities/opportunities/migrations/011_opportunities_metas.sql +114 -0
  69. package/entities/opportunities/migrations/012_opportunities_sample_data.sql +438 -0
  70. package/entities/opportunities/opportunities.config.ts +61 -0
  71. package/entities/opportunities/opportunities.fields.ts +416 -0
  72. package/entities/opportunities/opportunities.service.ts +525 -0
  73. package/entities/opportunities/opportunities.types.ts +135 -0
  74. package/entities/pipelines/messages/en.json +115 -0
  75. package/entities/pipelines/messages/es.json +115 -0
  76. package/entities/pipelines/migrations/001_pipelines_table.sql +106 -0
  77. package/entities/pipelines/migrations/002_pipelines_metas.sql +114 -0
  78. package/entities/pipelines/migrations/003_pipelines_sample_data.sql +91 -0
  79. package/entities/pipelines/pipelines.config.ts +62 -0
  80. package/entities/pipelines/pipelines.fields.ts +193 -0
  81. package/entities/pipelines/pipelines.service.ts +383 -0
  82. package/entities/pipelines/pipelines.types.ts +78 -0
  83. package/entities/products/messages/en.json +135 -0
  84. package/entities/products/messages/es.json +135 -0
  85. package/entities/products/migrations/001_products_table.sql +117 -0
  86. package/entities/products/migrations/002_products_metas.sql +114 -0
  87. package/entities/products/migrations/003_products_sample_data.sql +247 -0
  88. package/entities/products/products.config.ts +62 -0
  89. package/entities/products/products.fields.ts +361 -0
  90. package/entities/products/products.service.ts +437 -0
  91. package/entities/products/products.types.ts +125 -0
  92. package/lib/crm-constants.ts +77 -0
  93. package/lib/crm-utils.ts +185 -0
  94. package/lib/selectors.ts +333 -0
  95. package/messages/en.json +131 -0
  96. package/messages/es.json +131 -0
  97. package/migrations/999_theme_sample_data.sql +473 -0
  98. package/package.json +18 -0
  99. package/pendings.md +205 -0
  100. package/permissions-matrix.md +216 -0
  101. package/styles/components.css +414 -0
  102. package/styles/crm-theme.css +358 -0
  103. package/styles/globals.css +576 -0
  104. package/styles/variables.css +111 -0
  105. package/templates/dashboard/(main)/activities/components/ActivityCard.tsx +169 -0
  106. package/templates/dashboard/(main)/activities/components/ActivityTimeline.tsx +165 -0
  107. package/templates/dashboard/(main)/activities/page.tsx +297 -0
  108. package/templates/dashboard/(main)/campaigns/page.tsx +373 -0
  109. package/templates/dashboard/(main)/companies/page.tsx +296 -0
  110. package/templates/dashboard/(main)/contacts/page.tsx +347 -0
  111. package/templates/dashboard/(main)/layout.tsx +98 -0
  112. package/templates/dashboard/(main)/leads/page.tsx +335 -0
  113. package/templates/dashboard/(main)/opportunities/[id]/edit/page.tsx +95 -0
  114. package/templates/dashboard/(main)/opportunities/create/page.tsx +94 -0
  115. package/templates/dashboard/(main)/opportunities/page.tsx +350 -0
  116. package/templates/dashboard/(main)/pipelines/[id]/edit/page.tsx +95 -0
  117. package/templates/dashboard/(main)/pipelines/[id]/page.tsx +143 -0
  118. package/templates/dashboard/(main)/pipelines/create/page.tsx +94 -0
  119. package/templates/dashboard/(main)/pipelines/page.tsx +234 -0
  120. package/templates/dashboard/(main)/products/[id]/edit/page.tsx +97 -0
  121. package/templates/dashboard/(main)/products/[id]/page.tsx +509 -0
  122. package/templates/dashboard/(main)/products/create/page.tsx +96 -0
  123. package/templates/dashboard/(main)/products/page.tsx +308 -0
  124. package/templates/shared/ActionButtons.tsx +41 -0
  125. package/templates/shared/CRMDashboard.tsx +519 -0
  126. package/templates/shared/CRMDataTable.tsx +441 -0
  127. package/templates/shared/CRMMetricCard.tsx +76 -0
  128. package/templates/shared/CRMMobileNav.tsx +172 -0
  129. package/templates/shared/CRMSidebar.tsx +346 -0
  130. package/templates/shared/CRMTopBar.tsx +265 -0
  131. package/templates/shared/DealCard.tsx +123 -0
  132. package/templates/shared/EntityCard.tsx +58 -0
  133. package/templates/shared/OpportunityForm.tsx +649 -0
  134. package/templates/shared/PipelineForm.tsx +367 -0
  135. package/templates/shared/PipelineKanban.tsx +194 -0
  136. package/templates/shared/QuickFilters.tsx +47 -0
  137. package/templates/shared/StageColumn.tsx +175 -0
  138. package/templates/shared/StageSelect.tsx +177 -0
  139. package/templates/shared/StagesRepeater.tsx +317 -0
  140. package/templates/shared/index.ts +9 -0
@@ -0,0 +1,246 @@
1
+ -- ============================================================================
2
+ -- Sample data for companies table - CRM Theme
3
+ -- Aligned with schema in 001_companies_table.sql
4
+ -- Uses users from 999_theme_sample_data.sql
5
+ -- ============================================================================
6
+
7
+ -- Clean existing companies data
8
+ DELETE FROM "companies" WHERE "teamId" = 'team-crm-company';
9
+
10
+ INSERT INTO "companies" (
11
+ id,
12
+ name,
13
+ "legalName",
14
+ "taxId",
15
+ website,
16
+ email,
17
+ phone,
18
+ industry,
19
+ type,
20
+ size,
21
+ "annualRevenue",
22
+ rating,
23
+ address,
24
+ city,
25
+ state,
26
+ country,
27
+ "postalCode",
28
+ logo,
29
+ linkedin,
30
+ "assignedTo",
31
+ "userId",
32
+ "teamId",
33
+ "createdAt",
34
+ "updatedAt"
35
+ ) VALUES
36
+ -- Technology Companies (Hot/Warm)
37
+ (
38
+ 'company-crm-001',
39
+ 'TechnoSoft Solutions',
40
+ 'TechnoSoft Solutions Inc.',
41
+ 'TS-2024-001',
42
+ 'https://technosoft.com',
43
+ 'info@technosoft.com',
44
+ '+1-555-0101',
45
+ 'Software Development',
46
+ 'customer',
47
+ '51-200',
48
+ 2500000.00,
49
+ 'hot',
50
+ '123 Innovation Drive',
51
+ 'San Francisco',
52
+ 'CA',
53
+ 'US',
54
+ '94105',
55
+ 'https://technosoft.com/logo.png',
56
+ 'https://linkedin.com/company/technosoft',
57
+ 'usr-crm-sales-mgr',
58
+ 'usr-crm-ceo',
59
+ 'team-crm-company',
60
+ NOW() - INTERVAL '45 days',
61
+ NOW() - INTERVAL '3 days'
62
+ ),
63
+ (
64
+ 'company-crm-002',
65
+ 'Global Manufacturing Corp',
66
+ 'Global Manufacturing Corporation',
67
+ 'GM-2024-002',
68
+ 'https://globalmanufacturing.com',
69
+ 'contact@globalmanufacturing.com',
70
+ '+1-555-0102',
71
+ 'Manufacturing',
72
+ 'customer',
73
+ '500+',
74
+ 15000000.00,
75
+ 'warm',
76
+ '456 Industrial Blvd',
77
+ 'Detroit',
78
+ 'MI',
79
+ 'US',
80
+ '48201',
81
+ 'https://globalmanufacturing.com/logo.png',
82
+ 'https://linkedin.com/company/global-manufacturing',
83
+ 'usr-crm-sales-rep',
84
+ 'usr-crm-sales-mgr',
85
+ 'team-crm-company',
86
+ NOW() - INTERVAL '120 days',
87
+ NOW() - INTERVAL '10 days'
88
+ ),
89
+ (
90
+ 'company-crm-003',
91
+ 'Healthcare Innovations Ltd',
92
+ 'Healthcare Innovations Limited',
93
+ 'HI-2024-003',
94
+ 'https://healthcareinnovations.com',
95
+ 'hello@healthcareinnovations.com',
96
+ '+1-555-0103',
97
+ 'Healthcare',
98
+ 'prospect',
99
+ '201-500',
100
+ 8500000.00,
101
+ 'hot',
102
+ '789 Medical Center Dr',
103
+ 'Boston',
104
+ 'MA',
105
+ 'US',
106
+ '02101',
107
+ 'https://healthcareinnovations.com/logo.png',
108
+ 'https://linkedin.com/company/healthcare-innovations',
109
+ 'usr-crm-sales-mgr',
110
+ 'usr-crm-ceo',
111
+ 'team-crm-company',
112
+ NOW() - INTERVAL '30 days',
113
+ NOW() - INTERVAL '2 days'
114
+ ),
115
+ (
116
+ 'company-crm-004',
117
+ 'FinanceFirst Bank',
118
+ 'FinanceFirst Banking Corporation',
119
+ 'FF-2024-004',
120
+ 'https://financefirst.com',
121
+ 'business@financefirst.com',
122
+ '+1-555-0104',
123
+ 'Financial Services',
124
+ 'customer',
125
+ '500+',
126
+ 45000000.00,
127
+ 'warm',
128
+ '321 Financial Plaza',
129
+ 'New York',
130
+ 'NY',
131
+ 'US',
132
+ '10001',
133
+ 'https://financefirst.com/logo.png',
134
+ 'https://linkedin.com/company/financefirst',
135
+ 'usr-crm-sales-rep',
136
+ 'usr-crm-ceo',
137
+ 'team-crm-company',
138
+ NOW() - INTERVAL '180 days',
139
+ NOW() - INTERVAL '15 days'
140
+ ),
141
+ (
142
+ 'company-crm-005',
143
+ 'EduTech Academy',
144
+ 'Educational Technology Academy Inc.',
145
+ 'ET-2024-005',
146
+ 'https://edutech-academy.com',
147
+ 'partnerships@edutech-academy.com',
148
+ '+1-555-0105',
149
+ 'Education Technology',
150
+ 'prospect',
151
+ '51-200',
152
+ 3200000.00,
153
+ 'hot',
154
+ '654 Learning Way',
155
+ 'Austin',
156
+ 'TX',
157
+ 'US',
158
+ '73301',
159
+ 'https://edutech-academy.com/logo.png',
160
+ 'https://linkedin.com/company/edutech-academy',
161
+ 'usr-crm-sales-rep',
162
+ 'usr-crm-sales-mgr',
163
+ 'team-crm-company',
164
+ NOW() - INTERVAL '25 days',
165
+ NOW() - INTERVAL '1 day'
166
+ ),
167
+ (
168
+ 'company-crm-006',
169
+ 'RetailMax Chain',
170
+ 'RetailMax Chain Stores LLC',
171
+ 'RM-2024-006',
172
+ 'https://retailmax.com',
173
+ 'corporate@retailmax.com',
174
+ '+1-555-0106',
175
+ 'Retail',
176
+ 'partner',
177
+ '500+',
178
+ 12000000.00,
179
+ 'warm',
180
+ '987 Commerce Street',
181
+ 'Chicago',
182
+ 'IL',
183
+ 'US',
184
+ '60601',
185
+ 'https://retailmax.com/logo.png',
186
+ 'https://linkedin.com/company/retailmax',
187
+ 'usr-crm-sales-mgr',
188
+ 'usr-crm-ceo',
189
+ 'team-crm-company',
190
+ NOW() - INTERVAL '90 days',
191
+ NOW() - INTERVAL '7 days'
192
+ ),
193
+
194
+ -- Smaller Companies (Prospects)
195
+ (
196
+ 'company-crm-007',
197
+ 'StartupTech Inc',
198
+ 'StartupTech Incorporated',
199
+ 'ST-2024-007',
200
+ 'https://startuptech.io',
201
+ 'founders@startuptech.io',
202
+ '+1-555-0107',
203
+ 'Technology Startup',
204
+ 'prospect',
205
+ '11-50',
206
+ 500000.00,
207
+ 'hot',
208
+ '159 Startup Lane',
209
+ 'Palo Alto',
210
+ 'CA',
211
+ 'US',
212
+ '94301',
213
+ 'https://startuptech.io/logo.png',
214
+ 'https://linkedin.com/company/startuptech',
215
+ 'usr-crm-sales-rep',
216
+ 'usr-crm-sales-rep',
217
+ 'team-crm-company',
218
+ NOW() - INTERVAL '15 days',
219
+ NOW() - INTERVAL '1 day'
220
+ ),
221
+ (
222
+ 'company-crm-008',
223
+ 'Local Consulting Group',
224
+ 'Local Consulting Group LLC',
225
+ 'LC-2024-008',
226
+ 'https://localconsulting.com',
227
+ 'info@localconsulting.com',
228
+ '+1-555-0108',
229
+ 'Management Consulting',
230
+ 'prospect',
231
+ '11-50',
232
+ 1200000.00,
233
+ 'warm',
234
+ '753 Business Park Dr',
235
+ 'Seattle',
236
+ 'WA',
237
+ 'US',
238
+ '98101',
239
+ 'https://localconsulting.com/logo.png',
240
+ 'https://linkedin.com/company/local-consulting',
241
+ 'usr-crm-sales-rep',
242
+ 'usr-crm-sales-mgr',
243
+ 'team-crm-company',
244
+ NOW() - INTERVAL '40 days',
245
+ NOW() - INTERVAL '5 days'
246
+ );
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Contacts Entity Configuration - CRM
3
+ *
4
+ * People contacts at companies.
5
+ * Updated with team support and granular permissions.
6
+ */
7
+
8
+ import { Users } from 'lucide-react'
9
+ import type { EntityConfig } from '@nextsparkjs/core/lib/entities/types'
10
+ import { contactsFields } from './contacts.fields'
11
+
12
+ export const contactsEntityConfig: EntityConfig = {
13
+ // ==========================================
14
+ // 1. BASIC IDENTIFICATION
15
+ // ==========================================
16
+ slug: 'contacts',
17
+ enabled: true,
18
+ names: {
19
+ singular: 'contact',
20
+ plural: 'Contacts'
21
+ },
22
+ icon: Users,
23
+
24
+ // ==========================================
25
+ // 2. ACCESS AND SCOPE CONFIGURATION
26
+ // ==========================================
27
+ access: {
28
+ public: false,
29
+ api: true,
30
+ metadata: true,
31
+ shared: true
32
+ },
33
+
34
+ // ==========================================
35
+ // 3. UI/UX FEATURES
36
+ // ==========================================
37
+ ui: {
38
+ dashboard: {
39
+ showInMenu: true,
40
+ showInTopbar: true
41
+ },
42
+ public: {
43
+ hasArchivePage: false,
44
+ hasSinglePage: false
45
+ },
46
+ features: {
47
+ searchable: true,
48
+ sortable: true,
49
+ filterable: true,
50
+ bulkOperations: true,
51
+ importExport: true
52
+ }
53
+ },
54
+
55
+ // ==========================================
56
+ // FIELDS
57
+ // ==========================================
58
+ fields: contactsFields,
59
+ }
60
+
61
+ export default contactsEntityConfig
@@ -0,0 +1,359 @@
1
+ /**
2
+ * Contacts Entity Fields Configuration
3
+ *
4
+ * Separated from main config according to new refactoring plan.
5
+ * Contains all field definitions for the contacts entity.
6
+ */
7
+
8
+ import type { EntityField } from '@nextsparkjs/core/lib/entities/types'
9
+
10
+ export const contactsFields: EntityField[] = [
11
+ {
12
+ name: 'firstName',
13
+ type: 'text',
14
+ required: true,
15
+ display: {
16
+ label: 'First Name',
17
+ description: 'Contact first name',
18
+ placeholder: 'Enter first name...',
19
+ showInList: true,
20
+ showInDetail: true,
21
+ showInForm: true,
22
+ order: 1,
23
+ columnWidth: 6,
24
+ },
25
+ api: {
26
+ searchable: true,
27
+ sortable: true,
28
+ readOnly: false,
29
+ },
30
+ },
31
+ {
32
+ name: 'lastName',
33
+ type: 'text',
34
+ required: true,
35
+ display: {
36
+ label: 'Last Name',
37
+ description: 'Contact last name',
38
+ placeholder: 'Enter last name...',
39
+ showInList: true,
40
+ showInDetail: true,
41
+ showInForm: true,
42
+ order: 2,
43
+ columnWidth: 6,
44
+ },
45
+ api: {
46
+ searchable: true,
47
+ sortable: true,
48
+ readOnly: false,
49
+ },
50
+ },
51
+ {
52
+ name: 'email',
53
+ type: 'email',
54
+ required: true,
55
+ display: {
56
+ label: 'Email',
57
+ description: 'Contact email address',
58
+ placeholder: 'Enter email address...',
59
+ showInList: true,
60
+ showInDetail: true,
61
+ showInForm: true,
62
+ order: 3,
63
+ columnWidth: 6,
64
+ },
65
+ api: {
66
+ searchable: true,
67
+ sortable: true,
68
+ readOnly: false,
69
+ },
70
+ },
71
+ {
72
+ name: 'phone',
73
+ type: 'text',
74
+ required: false,
75
+ display: {
76
+ label: 'Phone',
77
+ description: 'Office phone number',
78
+ placeholder: 'Enter phone number...',
79
+ showInList: true,
80
+ showInDetail: true,
81
+ showInForm: true,
82
+ order: 4,
83
+ columnWidth: 6,
84
+ },
85
+ api: {
86
+ searchable: true,
87
+ sortable: false,
88
+ readOnly: false,
89
+ },
90
+ },
91
+ {
92
+ name: 'mobile',
93
+ type: 'text',
94
+ required: false,
95
+ display: {
96
+ label: 'Mobile',
97
+ description: 'Mobile phone number',
98
+ placeholder: 'Enter mobile number...',
99
+ showInList: false,
100
+ showInDetail: true,
101
+ showInForm: true,
102
+ order: 5,
103
+ columnWidth: 6,
104
+ },
105
+ api: {
106
+ searchable: true,
107
+ sortable: false,
108
+ readOnly: false,
109
+ },
110
+ },
111
+ {
112
+ name: 'companyId',
113
+ type: 'relation',
114
+ required: false,
115
+ display: {
116
+ label: 'Company',
117
+ description: 'Associated company',
118
+ placeholder: 'Select company...',
119
+ showInList: true,
120
+ showInDetail: true,
121
+ showInForm: true,
122
+ order: 6,
123
+ columnWidth: 6,
124
+ },
125
+ api: {
126
+ searchable: false,
127
+ sortable: true,
128
+ readOnly: false,
129
+ },
130
+ relation: {
131
+ entity: 'companies',
132
+ titleField: 'name',
133
+ },
134
+ },
135
+ {
136
+ name: 'position',
137
+ type: 'text',
138
+ required: false,
139
+ display: {
140
+ label: 'Position',
141
+ description: 'Job position or title',
142
+ placeholder: 'Enter position...',
143
+ showInList: true,
144
+ showInDetail: true,
145
+ showInForm: true,
146
+ order: 7,
147
+ columnWidth: 6,
148
+ },
149
+ api: {
150
+ searchable: true,
151
+ sortable: true,
152
+ readOnly: false,
153
+ },
154
+ },
155
+ {
156
+ name: 'department',
157
+ type: 'text',
158
+ required: false,
159
+ display: {
160
+ label: 'Department',
161
+ description: 'Department in company',
162
+ placeholder: 'Enter department...',
163
+ showInList: false,
164
+ showInDetail: true,
165
+ showInForm: true,
166
+ order: 8,
167
+ columnWidth: 6,
168
+ },
169
+ api: {
170
+ searchable: true,
171
+ sortable: true,
172
+ readOnly: false,
173
+ },
174
+ },
175
+ {
176
+ name: 'isPrimary',
177
+ type: 'boolean',
178
+ required: false,
179
+ display: {
180
+ label: 'Primary Contact',
181
+ description: 'Is primary contact for company',
182
+ showInList: true,
183
+ showInDetail: true,
184
+ showInForm: true,
185
+ order: 9,
186
+ columnWidth: 4,
187
+ },
188
+ api: {
189
+ searchable: false,
190
+ sortable: true,
191
+ readOnly: false,
192
+ },
193
+ },
194
+ {
195
+ name: 'birthDate',
196
+ type: 'date',
197
+ required: false,
198
+ display: {
199
+ label: 'Birth Date',
200
+ description: 'Contact birth date',
201
+ placeholder: 'Select date...',
202
+ showInList: false,
203
+ showInDetail: true,
204
+ showInForm: true,
205
+ order: 10,
206
+ columnWidth: 4,
207
+ },
208
+ api: {
209
+ searchable: false,
210
+ sortable: true,
211
+ readOnly: false,
212
+ },
213
+ },
214
+ {
215
+ name: 'linkedin',
216
+ type: 'url',
217
+ required: false,
218
+ display: {
219
+ label: 'LinkedIn',
220
+ description: 'LinkedIn profile URL',
221
+ placeholder: 'https://linkedin.com/in/...',
222
+ showInList: false,
223
+ showInDetail: true,
224
+ showInForm: true,
225
+ order: 11,
226
+ columnWidth: 6,
227
+ },
228
+ api: {
229
+ searchable: false,
230
+ sortable: false,
231
+ readOnly: false,
232
+ },
233
+ },
234
+ {
235
+ name: 'twitter',
236
+ type: 'text',
237
+ required: false,
238
+ display: {
239
+ label: 'Twitter',
240
+ description: 'Twitter/X handle',
241
+ placeholder: '@username',
242
+ showInList: false,
243
+ showInDetail: true,
244
+ showInForm: true,
245
+ order: 12,
246
+ columnWidth: 6,
247
+ },
248
+ api: {
249
+ searchable: false,
250
+ sortable: false,
251
+ readOnly: false,
252
+ },
253
+ },
254
+ {
255
+ name: 'preferredChannel',
256
+ type: 'select',
257
+ required: false,
258
+ options: [
259
+ { value: 'email', label: 'Email' },
260
+ { value: 'phone', label: 'Phone' },
261
+ { value: 'whatsapp', label: 'WhatsApp' },
262
+ { value: 'linkedin', label: 'LinkedIn' },
263
+ { value: 'slack', label: 'Slack' },
264
+ { value: 'other', label: 'Other' },
265
+ ],
266
+ display: {
267
+ label: 'Preferred Channel',
268
+ description: 'Preferred communication channel',
269
+ placeholder: 'Select channel...',
270
+ showInList: false,
271
+ showInDetail: true,
272
+ showInForm: true,
273
+ order: 13,
274
+ columnWidth: 4,
275
+ },
276
+ api: {
277
+ searchable: false,
278
+ sortable: true,
279
+ readOnly: false,
280
+ },
281
+ },
282
+ {
283
+ name: 'timezone',
284
+ type: 'text',
285
+ required: false,
286
+ display: {
287
+ label: 'Timezone',
288
+ description: 'Contact timezone',
289
+ placeholder: 'UTC',
290
+ showInList: false,
291
+ showInDetail: true,
292
+ showInForm: true,
293
+ order: 14,
294
+ columnWidth: 4,
295
+ },
296
+ api: {
297
+ searchable: false,
298
+ sortable: false,
299
+ readOnly: false,
300
+ },
301
+ },
302
+ {
303
+ name: 'lastContactedAt',
304
+ type: 'datetime',
305
+ required: false,
306
+ display: {
307
+ label: 'Last Contacted',
308
+ description: 'Last time this contact was reached',
309
+ showInList: true,
310
+ showInDetail: true,
311
+ showInForm: false,
312
+ order: 15,
313
+ columnWidth: 4,
314
+ },
315
+ api: {
316
+ searchable: false,
317
+ sortable: true,
318
+ readOnly: true,
319
+ },
320
+ },
321
+ {
322
+ name: 'createdAt',
323
+ type: 'datetime',
324
+ required: false,
325
+ display: {
326
+ label: 'Created At',
327
+ description: 'When the contact was created',
328
+ showInList: true,
329
+ showInDetail: true,
330
+ showInForm: false,
331
+ order: 98,
332
+ columnWidth: 4,
333
+ },
334
+ api: {
335
+ searchable: false,
336
+ sortable: true,
337
+ readOnly: true,
338
+ },
339
+ },
340
+ {
341
+ name: 'updatedAt',
342
+ type: 'datetime',
343
+ required: false,
344
+ display: {
345
+ label: 'Updated At',
346
+ description: 'When the contact was last updated',
347
+ showInList: false,
348
+ showInDetail: true,
349
+ showInForm: false,
350
+ order: 99,
351
+ columnWidth: 4,
352
+ },
353
+ api: {
354
+ searchable: false,
355
+ sortable: true,
356
+ readOnly: true,
357
+ },
358
+ },
359
+ ]