@ebowwa/crm 0.1.0

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 (187) hide show
  1. package/README.md +174 -0
  2. package/dist/cli/commands/activities.d.ts +11 -0
  3. package/dist/cli/commands/activities.d.ts.map +1 -0
  4. package/dist/cli/commands/activities.js +427 -0
  5. package/dist/cli/commands/activities.js.map +1 -0
  6. package/dist/cli/commands/contacts.d.ts +11 -0
  7. package/dist/cli/commands/contacts.d.ts.map +1 -0
  8. package/dist/cli/commands/contacts.js +458 -0
  9. package/dist/cli/commands/contacts.js.map +1 -0
  10. package/dist/cli/commands/deals.d.ts +11 -0
  11. package/dist/cli/commands/deals.d.ts.map +1 -0
  12. package/dist/cli/commands/deals.js +498 -0
  13. package/dist/cli/commands/deals.js.map +1 -0
  14. package/dist/cli/commands/media.d.ts +11 -0
  15. package/dist/cli/commands/media.d.ts.map +1 -0
  16. package/dist/cli/commands/media.js +417 -0
  17. package/dist/cli/commands/media.js.map +1 -0
  18. package/dist/cli/commands/search.d.ts +11 -0
  19. package/dist/cli/commands/search.d.ts.map +1 -0
  20. package/dist/cli/commands/search.js +346 -0
  21. package/dist/cli/commands/search.js.map +1 -0
  22. package/dist/cli/index.d.ts +13 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +173 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/cli/repl.d.ts +15 -0
  27. package/dist/cli/repl.d.ts.map +1 -0
  28. package/dist/cli/repl.js +318 -0
  29. package/dist/cli/repl.js.map +1 -0
  30. package/dist/cli/utils/config.d.ts +91 -0
  31. package/dist/cli/utils/config.d.ts.map +1 -0
  32. package/dist/cli/utils/config.js +212 -0
  33. package/dist/cli/utils/config.js.map +1 -0
  34. package/dist/cli/utils/output.d.ts +136 -0
  35. package/dist/cli/utils/output.d.ts.map +1 -0
  36. package/dist/cli/utils/output.js +323 -0
  37. package/dist/cli/utils/output.js.map +1 -0
  38. package/dist/cli/utils/prompt.d.ts +81 -0
  39. package/dist/cli/utils/prompt.d.ts.map +1 -0
  40. package/dist/cli/utils/prompt.js +341 -0
  41. package/dist/cli/utils/prompt.js.map +1 -0
  42. package/dist/cli.d.ts +3 -0
  43. package/dist/cli.d.ts.map +1 -0
  44. package/dist/cli.js +8 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/core/index.d.ts +6 -0
  47. package/dist/core/index.d.ts.map +1 -0
  48. package/dist/core/index.js +32 -0
  49. package/dist/core/index.js.map +1 -0
  50. package/dist/core/schemas.d.ts +3050 -0
  51. package/dist/core/schemas.d.ts.map +1 -0
  52. package/dist/core/schemas.js +667 -0
  53. package/dist/core/schemas.js.map +1 -0
  54. package/dist/core/types.d.ts +597 -0
  55. package/dist/core/types.d.ts.map +1 -0
  56. package/dist/core/types.js +8 -0
  57. package/dist/core/types.js.map +1 -0
  58. package/dist/index.d.ts +7 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +8 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/mcp/index.d.ts +14 -0
  63. package/dist/mcp/index.d.ts.map +1 -0
  64. package/dist/mcp/index.js +11 -0
  65. package/dist/mcp/index.js.map +1 -0
  66. package/dist/mcp/server.d.ts +13 -0
  67. package/dist/mcp/server.d.ts.map +1 -0
  68. package/dist/mcp/server.js +18 -0
  69. package/dist/mcp/server.js.map +1 -0
  70. package/dist/mcp/storage/client.d.ts +109 -0
  71. package/dist/mcp/storage/client.d.ts.map +1 -0
  72. package/dist/mcp/storage/client.js +355 -0
  73. package/dist/mcp/storage/client.js.map +1 -0
  74. package/dist/mcp/storage/index.d.ts +7 -0
  75. package/dist/mcp/storage/index.d.ts.map +1 -0
  76. package/dist/mcp/storage/index.js +6 -0
  77. package/dist/mcp/storage/index.js.map +1 -0
  78. package/dist/mcp/storage/types.d.ts +44 -0
  79. package/dist/mcp/storage/types.d.ts.map +1 -0
  80. package/dist/mcp/storage/types.js +35 -0
  81. package/dist/mcp/storage/types.js.map +1 -0
  82. package/dist/mcp/tools/definitions.d.ts +16 -0
  83. package/dist/mcp/tools/definitions.d.ts.map +1 -0
  84. package/dist/mcp/tools/definitions.js +914 -0
  85. package/dist/mcp/tools/definitions.js.map +1 -0
  86. package/dist/mcp/tools/handlers.d.ts +50 -0
  87. package/dist/mcp/tools/handlers.d.ts.map +1 -0
  88. package/dist/mcp/tools/handlers.js +760 -0
  89. package/dist/mcp/tools/handlers.js.map +1 -0
  90. package/dist/mcp/tools/index.d.ts +7 -0
  91. package/dist/mcp/tools/index.d.ts.map +1 -0
  92. package/dist/mcp/tools/index.js +6 -0
  93. package/dist/mcp/tools/index.js.map +1 -0
  94. package/dist/mcp/tools/types.d.ts +314 -0
  95. package/dist/mcp/tools/types.d.ts.map +1 -0
  96. package/dist/mcp/tools/types.js +5 -0
  97. package/dist/mcp/tools/types.js.map +1 -0
  98. package/dist/mcp/transports/stdio.d.ts +27 -0
  99. package/dist/mcp/transports/stdio.d.ts.map +1 -0
  100. package/dist/mcp/transports/stdio.js +237 -0
  101. package/dist/mcp/transports/stdio.js.map +1 -0
  102. package/dist/telemetry/index.d.ts +58 -0
  103. package/dist/telemetry/index.d.ts.map +1 -0
  104. package/dist/telemetry/index.js +109 -0
  105. package/dist/telemetry/index.js.map +1 -0
  106. package/dist/telemetry/logger.d.ts +116 -0
  107. package/dist/telemetry/logger.d.ts.map +1 -0
  108. package/dist/telemetry/logger.js +256 -0
  109. package/dist/telemetry/logger.js.map +1 -0
  110. package/dist/telemetry/metrics.d.ts +115 -0
  111. package/dist/telemetry/metrics.d.ts.map +1 -0
  112. package/dist/telemetry/metrics.js +292 -0
  113. package/dist/telemetry/metrics.js.map +1 -0
  114. package/dist/telemetry/tracer.d.ts +227 -0
  115. package/dist/telemetry/tracer.d.ts.map +1 -0
  116. package/dist/telemetry/tracer.js +355 -0
  117. package/dist/telemetry/tracer.js.map +1 -0
  118. package/dist/web/app.d.ts +2 -0
  119. package/dist/web/app.d.ts.map +1 -0
  120. package/dist/web/app.js +115 -0
  121. package/dist/web/app.js.map +1 -0
  122. package/dist/web/components/ContactList.d.ts +3 -0
  123. package/dist/web/components/ContactList.d.ts.map +1 -0
  124. package/dist/web/components/ContactList.js +262 -0
  125. package/dist/web/components/ContactList.js.map +1 -0
  126. package/dist/web/components/Dashboard.d.ts +3 -0
  127. package/dist/web/components/Dashboard.d.ts.map +1 -0
  128. package/dist/web/components/Dashboard.js +158 -0
  129. package/dist/web/components/Dashboard.js.map +1 -0
  130. package/dist/web/components/DealPipeline.d.ts +3 -0
  131. package/dist/web/components/DealPipeline.d.ts.map +1 -0
  132. package/dist/web/components/DealPipeline.js +306 -0
  133. package/dist/web/components/DealPipeline.js.map +1 -0
  134. package/dist/web/index.d.ts +2 -0
  135. package/dist/web/index.d.ts.map +1 -0
  136. package/dist/web/index.js +269 -0
  137. package/dist/web/index.js.map +1 -0
  138. package/dist/web/types.d.ts +75 -0
  139. package/dist/web/types.d.ts.map +1 -0
  140. package/dist/web/types.js +3 -0
  141. package/dist/web/types.js.map +1 -0
  142. package/native/index.d.ts +571 -0
  143. package/native/index.js +687 -0
  144. package/package.json +105 -0
  145. package/src/cli/commands/activities.ts +543 -0
  146. package/src/cli/commands/contacts.ts +563 -0
  147. package/src/cli/commands/deals.ts +637 -0
  148. package/src/cli/commands/media.ts +521 -0
  149. package/src/cli/commands/search.ts +426 -0
  150. package/src/cli/index.ts +203 -0
  151. package/src/cli/repl.ts +379 -0
  152. package/src/cli/utils/config.ts +299 -0
  153. package/src/cli/utils/output.ts +386 -0
  154. package/src/cli/utils/prompt.ts +444 -0
  155. package/src/cli.ts +11 -0
  156. package/src/core/index.ts +184 -0
  157. package/src/core/schemas.ts +770 -0
  158. package/src/core/types.ts +969 -0
  159. package/src/index.ts +8 -0
  160. package/src/mcp/index.ts +17 -0
  161. package/src/mcp/server.ts +26 -0
  162. package/src/mcp/storage/client.ts +408 -0
  163. package/src/mcp/storage/index.ts +7 -0
  164. package/src/mcp/storage/types.ts +72 -0
  165. package/src/mcp/tools/definitions.ts +961 -0
  166. package/src/mcp/tools/handlers.ts +805 -0
  167. package/src/mcp/tools/index.ts +7 -0
  168. package/src/mcp/tools/types.ts +390 -0
  169. package/src/mcp/transports/stdio.ts +225 -0
  170. package/src/telemetry/index.ts +131 -0
  171. package/src/telemetry/logger.ts +318 -0
  172. package/src/telemetry/metrics.ts +393 -0
  173. package/src/telemetry/tracer.ts +487 -0
  174. package/src/web/api/activities.ts +41 -0
  175. package/src/web/api/contacts.ts +114 -0
  176. package/src/web/api/deals.ts +108 -0
  177. package/src/web/api/media.ts +98 -0
  178. package/src/web/app.tsx +143 -0
  179. package/src/web/components/ActivityFeed.tsx +195 -0
  180. package/src/web/components/ContactList.tsx +340 -0
  181. package/src/web/components/Dashboard.tsx +214 -0
  182. package/src/web/components/DealPipeline.tsx +405 -0
  183. package/src/web/components/MediaGallery.tsx +334 -0
  184. package/src/web/index.html +14 -0
  185. package/src/web/index.ts +326 -0
  186. package/src/web/styles/main.css +180 -0
  187. package/src/web/types.ts +311 -0
@@ -0,0 +1,115 @@
1
+ import React, { useState, useEffect, useCallback } from 'react';
2
+ import { createRoot } from 'react-dom/client';
3
+ import Dashboard from './components/Dashboard';
4
+ import ContactList from './components/ContactList';
5
+ import DealPipeline from './components/DealPipeline';
6
+ import ActivityFeed from './components/ActivityFeed';
7
+ import MediaGallery from './components/MediaGallery';
8
+ function App() {
9
+ const [activeTab, setActiveTab] = useState('dashboard');
10
+ const [ws, setWs] = useState(null);
11
+ const [isConnected, setIsConnected] = useState(false);
12
+ const [notifications, setNotifications] = useState([]);
13
+ // WebSocket connection
14
+ useEffect(() => {
15
+ const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
16
+ const wsUrl = `${protocol}//${window.location.host}/ws`;
17
+ const websocket = new WebSocket(wsUrl);
18
+ websocket.onopen = () => {
19
+ setIsConnected(true);
20
+ console.log('WebSocket connected');
21
+ };
22
+ websocket.onmessage = (event) => {
23
+ const message = JSON.parse(event.data);
24
+ console.log('WebSocket message:', message);
25
+ if (message.type === 'activity') {
26
+ addNotification('New activity update');
27
+ }
28
+ else if (message.type === 'deal_update') {
29
+ addNotification('Deal updated');
30
+ }
31
+ else if (message.type === 'contact_update') {
32
+ addNotification('Contact updated');
33
+ }
34
+ };
35
+ websocket.onclose = () => {
36
+ setIsConnected(false);
37
+ console.log('WebSocket disconnected');
38
+ };
39
+ websocket.onerror = (error) => {
40
+ console.error('WebSocket error:', error);
41
+ };
42
+ setWs(websocket);
43
+ return () => {
44
+ websocket.close();
45
+ };
46
+ }, []);
47
+ const addNotification = useCallback((message) => {
48
+ setNotifications(prev => [...prev, message]);
49
+ setTimeout(() => {
50
+ setNotifications(prev => prev.slice(1));
51
+ }, 3000);
52
+ }, []);
53
+ const tabs = [
54
+ { id: 'dashboard', label: 'Dashboard', icon: '📊' },
55
+ { id: 'contacts', label: 'Contacts', icon: '👥' },
56
+ { id: 'deals', label: 'Deals', icon: '💼' },
57
+ { id: 'activity', label: 'Activity', icon: '📝' },
58
+ { id: 'media', label: 'Media', icon: '🖼️' },
59
+ ];
60
+ return (<div className="min-h-screen bg-gray-900 text-gray-100">
61
+ {/* Header */}
62
+ <header className="bg-gray-800 border-b border-gray-700 px-6 py-4">
63
+ <div className="flex items-center justify-between">
64
+ <div className="flex items-center gap-4">
65
+ <h1 className="text-2xl font-bold text-indigo-400">CRM Dashboard</h1>
66
+ <div className="flex items-center gap-2">
67
+ <div className={`w-2 h-2 rounded-full ${isConnected ? 'bg-green-500' : 'bg-red-500'}`}/>
68
+ <span className="text-sm text-gray-400">
69
+ {isConnected ? 'Connected' : 'Disconnected'}
70
+ </span>
71
+ </div>
72
+ </div>
73
+ <div className="flex items-center gap-4">
74
+ <button className="px-4 py-2 bg-gray-700 rounded-lg hover:bg-gray-600 transition-colors">
75
+ Settings
76
+ </button>
77
+ </div>
78
+ </div>
79
+ </header>
80
+
81
+ {/* Navigation */}
82
+ <nav className="bg-gray-800 border-b border-gray-700">
83
+ <div className="flex px-6">
84
+ {tabs.map(tab => (<button key={tab.id} onClick={() => setActiveTab(tab.id)} className={`px-6 py-4 flex items-center gap-2 border-b-2 transition-colors ${activeTab === tab.id
85
+ ? 'border-indigo-500 text-indigo-400'
86
+ : 'border-transparent text-gray-400 hover:text-gray-200'}`}>
87
+ <span>{tab.icon}</span>
88
+ <span>{tab.label}</span>
89
+ </button>))}
90
+ </div>
91
+ </nav>
92
+
93
+ {/* Main Content */}
94
+ <main className="p-6">
95
+ {activeTab === 'dashboard' && <Dashboard />}
96
+ {activeTab === 'contacts' && <ContactList />}
97
+ {activeTab === 'deals' && <DealPipeline />}
98
+ {activeTab === 'activity' && <ActivityFeed />}
99
+ {activeTab === 'media' && <MediaGallery />}
100
+ </main>
101
+
102
+ {/* Notifications */}
103
+ <div className="fixed bottom-4 right-4 space-y-2 z-50">
104
+ {notifications.map((notification, index) => (<div key={index} className="bg-gray-800 border border-gray-700 rounded-lg px-4 py-3 shadow-lg animate-slide-in">
105
+ <p className="text-sm">{notification}</p>
106
+ </div>))}
107
+ </div>
108
+ </div>);
109
+ }
110
+ const container = document.getElementById('root');
111
+ if (container) {
112
+ const root = createRoot(container);
113
+ root.render(<App />);
114
+ }
115
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/web/app.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export default function ContactList(): React.JSX.Element;
3
+ //# sourceMappingURL=ContactList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContactList.d.ts","sourceRoot":"","sources":["../../../src/web/components/ContactList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAUnD,MAAM,CAAC,OAAO,UAAU,WAAW,sBAyUlC"}
@@ -0,0 +1,262 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ const statusColors = {
3
+ lead: 'crm-tag-info',
4
+ prospect: 'crm-tag-warning',
5
+ customer: 'crm-tag-success',
6
+ churned: 'crm-tag-danger',
7
+ };
8
+ export default function ContactList() {
9
+ const [contacts, setContacts] = useState([]);
10
+ const [loading, setLoading] = useState(true);
11
+ const [search, setSearch] = useState('');
12
+ const [statusFilter, setStatusFilter] = useState('');
13
+ const [showModal, setShowModal] = useState(false);
14
+ const [selectedContact, setSelectedContact] = useState(null);
15
+ const [formData, setFormData] = useState({
16
+ name: '',
17
+ email: '',
18
+ phone: '',
19
+ company: '',
20
+ title: '',
21
+ status: 'lead',
22
+ tags: [],
23
+ notes: '',
24
+ });
25
+ const fetchContacts = async () => {
26
+ try {
27
+ const params = new URLSearchParams();
28
+ if (search)
29
+ params.set('search', search);
30
+ if (statusFilter)
31
+ params.set('status', statusFilter);
32
+ const response = await fetch(`/api/contacts?${params}`);
33
+ const data = await response.json();
34
+ if (data.success) {
35
+ setContacts(data.data || []);
36
+ }
37
+ }
38
+ catch (error) {
39
+ console.error('Failed to fetch contacts:', error);
40
+ }
41
+ finally {
42
+ setLoading(false);
43
+ }
44
+ };
45
+ useEffect(() => {
46
+ fetchContacts();
47
+ }, [search, statusFilter]);
48
+ const handleCreate = () => {
49
+ setSelectedContact(null);
50
+ setFormData({
51
+ name: '',
52
+ email: '',
53
+ phone: '',
54
+ company: '',
55
+ title: '',
56
+ status: 'lead',
57
+ tags: [],
58
+ notes: '',
59
+ });
60
+ setShowModal(true);
61
+ };
62
+ const handleEdit = (contact) => {
63
+ setSelectedContact(contact);
64
+ setFormData({
65
+ name: contact.name,
66
+ email: contact.email,
67
+ phone: contact.phone || '',
68
+ company: contact.company || '',
69
+ title: contact.title || '',
70
+ status: contact.status,
71
+ tags: contact.tags,
72
+ notes: contact.notes || '',
73
+ });
74
+ setShowModal(true);
75
+ };
76
+ const handleDelete = async (id) => {
77
+ if (!confirm('Are you sure you want to delete this contact?'))
78
+ return;
79
+ try {
80
+ await fetch(`/api/contacts/${id}`, { method: 'DELETE' });
81
+ setContacts(contacts.filter(c => c.id !== id));
82
+ }
83
+ catch (error) {
84
+ console.error('Failed to delete contact:', error);
85
+ }
86
+ };
87
+ const handleSubmit = async (e) => {
88
+ e.preventDefault();
89
+ try {
90
+ const url = selectedContact
91
+ ? `/api/contacts/${selectedContact.id}`
92
+ : '/api/contacts';
93
+ const method = selectedContact ? 'PUT' : 'POST';
94
+ const response = await fetch(url, {
95
+ method,
96
+ headers: { 'Content-Type': 'application/json' },
97
+ body: JSON.stringify(formData),
98
+ });
99
+ const data = await response.json();
100
+ if (data.success && data.data) {
101
+ if (selectedContact) {
102
+ setContacts(contacts.map(c => c.id === data.data.id ? data.data : c));
103
+ }
104
+ else {
105
+ setContacts([data.data, ...contacts]);
106
+ }
107
+ setShowModal(false);
108
+ }
109
+ }
110
+ catch (error) {
111
+ console.error('Failed to save contact:', error);
112
+ }
113
+ };
114
+ if (loading) {
115
+ return (<div className="flex items-center justify-center h-64">
116
+ <div className="crm-spinner"/>
117
+ </div>);
118
+ }
119
+ return (<div className="space-y-6">
120
+ {/* Header */}
121
+ <div className="flex items-center justify-between">
122
+ <div>
123
+ <h2 className="text-2xl font-bold">Contacts</h2>
124
+ <p className="text-gray-400">{contacts.length} total contacts</p>
125
+ </div>
126
+ <button onClick={handleCreate} className="crm-btn crm-btn-primary">
127
+ + Add Contact
128
+ </button>
129
+ </div>
130
+
131
+ {/* Filters */}
132
+ <div className="flex gap-4">
133
+ <div className="flex-1">
134
+ <input type="text" placeholder="Search contacts..." value={search} onChange={(e) => setSearch(e.target.value)} className="crm-input"/>
135
+ </div>
136
+ <select value={statusFilter} onChange={(e) => setStatusFilter(e.target.value)} className="crm-input w-48">
137
+ <option value="">All Statuses</option>
138
+ <option value="lead">Lead</option>
139
+ <option value="prospect">Prospect</option>
140
+ <option value="customer">Customer</option>
141
+ <option value="churned">Churned</option>
142
+ </select>
143
+ </div>
144
+
145
+ {/* Contact Table */}
146
+ <div className="bg-gray-800 rounded-xl border border-gray-700 overflow-hidden">
147
+ <table className="w-full">
148
+ <thead className="bg-gray-700/50">
149
+ <tr>
150
+ <th className="text-left px-4 py-3 text-sm font-medium text-gray-400">Name</th>
151
+ <th className="text-left px-4 py-3 text-sm font-medium text-gray-400">Email</th>
152
+ <th className="text-left px-4 py-3 text-sm font-medium text-gray-400">Company</th>
153
+ <th className="text-left px-4 py-3 text-sm font-medium text-gray-400">Status</th>
154
+ <th className="text-right px-4 py-3 text-sm font-medium text-gray-400">Actions</th>
155
+ </tr>
156
+ </thead>
157
+ <tbody className="divide-y divide-gray-700">
158
+ {contacts.length === 0 ? (<tr>
159
+ <td colSpan={5} className="text-center py-12 text-gray-400">
160
+ No contacts found
161
+ </td>
162
+ </tr>) : (contacts.map(contact => (<tr key={contact.id} className="hover:bg-gray-700/30 transition-colors">
163
+ <td className="px-4 py-3">
164
+ <div>
165
+ <p className="font-medium">{contact.name}</p>
166
+ {contact.title && (<p className="text-sm text-gray-400">{contact.title}</p>)}
167
+ </div>
168
+ </td>
169
+ <td className="px-4 py-3 text-gray-300">{contact.email}</td>
170
+ <td className="px-4 py-3 text-gray-300">{contact.company || '-'}</td>
171
+ <td className="px-4 py-3">
172
+ <span className={`crm-tag ${statusColors[contact.status]}`}>
173
+ {contact.status}
174
+ </span>
175
+ </td>
176
+ <td className="px-4 py-3">
177
+ <div className="flex justify-end gap-2">
178
+ <button onClick={() => handleEdit(contact)} className="px-3 py-1 text-sm bg-gray-700 hover:bg-gray-600 rounded transition-colors">
179
+ Edit
180
+ </button>
181
+ <button onClick={() => handleDelete(contact.id)} className="px-3 py-1 text-sm bg-red-900/50 hover:bg-red-800/50 text-red-400 rounded transition-colors">
182
+ Delete
183
+ </button>
184
+ </div>
185
+ </td>
186
+ </tr>)))}
187
+ </tbody>
188
+ </table>
189
+ </div>
190
+
191
+ {/* Modal */}
192
+ {showModal && (<div className="crm-modal-backdrop" onClick={() => setShowModal(false)}>
193
+ <div className="crm-modal" onClick={(e) => e.stopPropagation()}>
194
+ <h3 className="text-xl font-bold mb-4">
195
+ {selectedContact ? 'Edit Contact' : 'Add Contact'}
196
+ </h3>
197
+ <form onSubmit={handleSubmit} className="space-y-4">
198
+ <div>
199
+ <label className="block text-sm font-medium text-gray-400 mb-1">
200
+ Name *
201
+ </label>
202
+ <input type="text" required value={formData.name} onChange={(e) => setFormData({ ...formData, name: e.target.value })} className="crm-input"/>
203
+ </div>
204
+ <div>
205
+ <label className="block text-sm font-medium text-gray-400 mb-1">
206
+ Email *
207
+ </label>
208
+ <input type="email" required value={formData.email} onChange={(e) => setFormData({ ...formData, email: e.target.value })} className="crm-input"/>
209
+ </div>
210
+ <div className="grid grid-cols-2 gap-4">
211
+ <div>
212
+ <label className="block text-sm font-medium text-gray-400 mb-1">
213
+ Phone
214
+ </label>
215
+ <input type="tel" value={formData.phone} onChange={(e) => setFormData({ ...formData, phone: e.target.value })} className="crm-input"/>
216
+ </div>
217
+ <div>
218
+ <label className="block text-sm font-medium text-gray-400 mb-1">
219
+ Status
220
+ </label>
221
+ <select value={formData.status} onChange={(e) => setFormData({ ...formData, status: e.target.value })} className="crm-input">
222
+ <option value="lead">Lead</option>
223
+ <option value="prospect">Prospect</option>
224
+ <option value="customer">Customer</option>
225
+ <option value="churned">Churned</option>
226
+ </select>
227
+ </div>
228
+ </div>
229
+ <div className="grid grid-cols-2 gap-4">
230
+ <div>
231
+ <label className="block text-sm font-medium text-gray-400 mb-1">
232
+ Company
233
+ </label>
234
+ <input type="text" value={formData.company} onChange={(e) => setFormData({ ...formData, company: e.target.value })} className="crm-input"/>
235
+ </div>
236
+ <div>
237
+ <label className="block text-sm font-medium text-gray-400 mb-1">
238
+ Title
239
+ </label>
240
+ <input type="text" value={formData.title} onChange={(e) => setFormData({ ...formData, title: e.target.value })} className="crm-input"/>
241
+ </div>
242
+ </div>
243
+ <div>
244
+ <label className="block text-sm font-medium text-gray-400 mb-1">
245
+ Notes
246
+ </label>
247
+ <textarea value={formData.notes} onChange={(e) => setFormData({ ...formData, notes: e.target.value })} className="crm-input h-24 resize-none"/>
248
+ </div>
249
+ <div className="flex gap-3 pt-4">
250
+ <button type="submit" className="crm-btn crm-btn-primary flex-1">
251
+ {selectedContact ? 'Update' : 'Create'}
252
+ </button>
253
+ <button type="button" onClick={() => setShowModal(false)} className="crm-btn crm-btn-secondary flex-1">
254
+ Cancel
255
+ </button>
256
+ </div>
257
+ </form>
258
+ </div>
259
+ </div>)}
260
+ </div>);
261
+ }
262
+ //# sourceMappingURL=ContactList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContactList.js","sourceRoot":"","sources":["../../../src/web/components/ContactList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export default function Dashboard(): React.JSX.Element;
3
+ //# sourceMappingURL=Dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard.d.ts","sourceRoot":"","sources":["../../../src/web/components/Dashboard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA8BnD,MAAM,CAAC,OAAO,UAAU,SAAS,sBAuLhC"}
@@ -0,0 +1,158 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ function StatCard({ title, value, change, icon, color }) {
3
+ return (<div className="crm-card">
4
+ <div className="flex items-center justify-between">
5
+ <div>
6
+ <p className="text-gray-400 text-sm">{title}</p>
7
+ <p className="text-3xl font-bold mt-1">{value}</p>
8
+ {change && (<p className={`text-sm mt-1 ${change.startsWith('+') ? 'text-green-400' : 'text-red-400'}`}>
9
+ {change}
10
+ </p>)}
11
+ </div>
12
+ <div className={`text-4xl ${color}`}>{icon}</div>
13
+ </div>
14
+ </div>);
15
+ }
16
+ export default function Dashboard() {
17
+ const [stats, setStats] = useState(null);
18
+ const [recentActivities, setRecentActivities] = useState([]);
19
+ const [topDeals, setTopDeals] = useState([]);
20
+ const [loading, setLoading] = useState(true);
21
+ useEffect(() => {
22
+ async function fetchData() {
23
+ try {
24
+ const [statsRes, activitiesRes, dealsRes] = await Promise.all([
25
+ fetch('/api/dashboard/stats'),
26
+ fetch('/api/activities?limit=5'),
27
+ fetch('/api/deals'),
28
+ ]);
29
+ const statsData = await statsRes.json();
30
+ const activitiesData = await activitiesRes.json();
31
+ const dealsData = await dealsRes.json();
32
+ if (statsData.success)
33
+ setStats(statsData.data);
34
+ if (activitiesData.success)
35
+ setRecentActivities(activitiesData.data);
36
+ if (dealsData.success) {
37
+ const sorted = dealsData.data
38
+ .filter((d) => !d.stage.startsWith('closed_'))
39
+ .sort((a, b) => b.value - a.value)
40
+ .slice(0, 5);
41
+ setTopDeals(sorted);
42
+ }
43
+ }
44
+ catch (error) {
45
+ console.error('Failed to fetch dashboard data:', error);
46
+ }
47
+ finally {
48
+ setLoading(false);
49
+ }
50
+ }
51
+ fetchData();
52
+ }, []);
53
+ if (loading) {
54
+ return (<div className="flex items-center justify-center h-64">
55
+ <div className="crm-spinner"/>
56
+ </div>);
57
+ }
58
+ const formatCurrency = (value) => {
59
+ return new Intl.NumberFormat('en-US', {
60
+ style: 'currency',
61
+ currency: 'USD',
62
+ minimumFractionDigits: 0,
63
+ maximumFractionDigits: 0,
64
+ }).format(value);
65
+ };
66
+ return (<div className="space-y-6">
67
+ {/* Stats Grid */}
68
+ <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
69
+ <StatCard title="Total Contacts" value={stats?.totalContacts || 0} icon="👥" color="text-blue-400"/>
70
+ <StatCard title="Active Deals" value={stats?.activeDeals || 0} icon="💼" color="text-indigo-400"/>
71
+ <StatCard title="Pipeline Value" value={formatCurrency(stats?.pipelineValue || 0)} icon="📈" color="text-green-400"/>
72
+ <StatCard title="Won This Month" value={formatCurrency(stats?.wonThisMonth || 0)} change="+12%" icon="🏆" color="text-yellow-400"/>
73
+ </div>
74
+
75
+ {/* Secondary Stats */}
76
+ <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
77
+ <div className="crm-card">
78
+ <h3 className="text-lg font-semibold mb-4">Activities Today</h3>
79
+ <div className="flex items-center justify-between">
80
+ <span className="text-4xl font-bold text-indigo-400">
81
+ {stats?.activitiesToday || 0}
82
+ </span>
83
+ <div className="text-right">
84
+ <p className="text-sm text-gray-400">vs yesterday</p>
85
+ <p className="text-green-400">+5</p>
86
+ </div>
87
+ </div>
88
+ </div>
89
+
90
+ <div className="crm-card">
91
+ <h3 className="text-lg font-semibold mb-4">Conversion Rate</h3>
92
+ <div className="flex items-center justify-between">
93
+ <span className="text-4xl font-bold text-green-400">
94
+ {(stats?.conversionRate || 0).toFixed(1)}%
95
+ </span>
96
+ <div className="text-right">
97
+ <p className="text-sm text-gray-400">30-day avg</p>
98
+ <p className="text-green-400">+2.3%</p>
99
+ </div>
100
+ </div>
101
+ </div>
102
+
103
+ <div className="crm-card">
104
+ <h3 className="text-lg font-semibold mb-4">Quick Actions</h3>
105
+ <div className="flex gap-2">
106
+ <button className="crm-btn crm-btn-primary flex-1">
107
+ + Contact
108
+ </button>
109
+ <button className="crm-btn crm-btn-secondary flex-1">
110
+ + Deal
111
+ </button>
112
+ </div>
113
+ </div>
114
+ </div>
115
+
116
+ {/* Recent Activity & Top Deals */}
117
+ <div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
118
+ {/* Recent Activities */}
119
+ <div className="crm-card">
120
+ <h3 className="text-lg font-semibold mb-4">Recent Activities</h3>
121
+ <div className="space-y-3">
122
+ {recentActivities.length === 0 ? (<p className="text-gray-400 text-center py-8">No recent activities</p>) : (recentActivities.map(activity => (<div key={activity.id} className="activity-item">
123
+ <div className={`activity-dot ${activity.type === 'deal' ? 'bg-green-500' :
124
+ activity.type === 'contact' ? 'bg-blue-500' :
125
+ 'bg-gray-500'}`}/>
126
+ <div className="flex-1">
127
+ <p className="text-sm">{activity.description}</p>
128
+ <p className="text-xs text-gray-500 mt-1">
129
+ {new Date(activity.timestamp).toLocaleString()}
130
+ </p>
131
+ </div>
132
+ </div>)))}
133
+ </div>
134
+ </div>
135
+
136
+ {/* Top Deals */}
137
+ <div className="crm-card">
138
+ <h3 className="text-lg font-semibold mb-4">Top Deals</h3>
139
+ <div className="space-y-3">
140
+ {topDeals.length === 0 ? (<p className="text-gray-400 text-center py-8">No active deals</p>) : (topDeals.map((deal, index) => (<div key={deal.id} className="flex items-center gap-4 p-3 bg-gray-700/50 rounded-lg">
141
+ <span className="text-lg font-bold text-gray-500">#{index + 1}</span>
142
+ <div className="flex-1">
143
+ <p className="font-medium">{deal.title}</p>
144
+ <p className="text-sm text-gray-400">{deal.stage}</p>
145
+ </div>
146
+ <div className="text-right">
147
+ <p className="font-bold text-green-400">
148
+ {formatCurrency(deal.value)}
149
+ </p>
150
+ <p className="text-xs text-gray-500">{deal.probability}% prob</p>
151
+ </div>
152
+ </div>)))}
153
+ </div>
154
+ </div>
155
+ </div>
156
+ </div>);
157
+ }
158
+ //# sourceMappingURL=Dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../../src/web/components/Dashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export default function DealPipeline(): React.JSX.Element;
3
+ //# sourceMappingURL=DealPipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DealPipeline.d.ts","sourceRoot":"","sources":["../../../src/web/components/DealPipeline.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA0BnD,MAAM,CAAC,OAAO,UAAU,YAAY,sBA0XnC"}