realtimex-crm 0.1.2

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 (468) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +104 -0
  3. package/dist/assets/DealList-DqDrFeDV.js +59 -0
  4. package/dist/assets/DealList-DqDrFeDV.js.map +1 -0
  5. package/dist/assets/index-BiQoGq1P.css +1 -0
  6. package/dist/assets/index-CDIy4x-0.js +152 -0
  7. package/dist/assets/index-CDIy4x-0.js.map +1 -0
  8. package/dist/auth-callback.html +140 -0
  9. package/dist/favicon.ico +0 -0
  10. package/dist/img/adding-users.png +0 -0
  11. package/dist/img/empty.svg +42 -0
  12. package/dist/index.html +1 -0
  13. package/dist/logo192.png +0 -0
  14. package/dist/logo512.png +0 -0
  15. package/dist/logos/0.png +0 -0
  16. package/dist/logos/1.png +0 -0
  17. package/dist/logos/10.png +0 -0
  18. package/dist/logos/11.png +0 -0
  19. package/dist/logos/12.png +0 -0
  20. package/dist/logos/13.png +0 -0
  21. package/dist/logos/14.png +0 -0
  22. package/dist/logos/15.png +0 -0
  23. package/dist/logos/16.png +0 -0
  24. package/dist/logos/17.png +0 -0
  25. package/dist/logos/18.png +0 -0
  26. package/dist/logos/19.png +0 -0
  27. package/dist/logos/2.png +0 -0
  28. package/dist/logos/20.png +0 -0
  29. package/dist/logos/21.png +0 -0
  30. package/dist/logos/22.png +0 -0
  31. package/dist/logos/23.png +0 -0
  32. package/dist/logos/24.png +0 -0
  33. package/dist/logos/25.png +0 -0
  34. package/dist/logos/26.png +0 -0
  35. package/dist/logos/27.png +0 -0
  36. package/dist/logos/28.png +0 -0
  37. package/dist/logos/29.png +0 -0
  38. package/dist/logos/3.png +0 -0
  39. package/dist/logos/30.png +0 -0
  40. package/dist/logos/31.png +0 -0
  41. package/dist/logos/32.png +0 -0
  42. package/dist/logos/33.png +0 -0
  43. package/dist/logos/34.png +0 -0
  44. package/dist/logos/35.png +0 -0
  45. package/dist/logos/36.png +0 -0
  46. package/dist/logos/37.png +0 -0
  47. package/dist/logos/38.png +0 -0
  48. package/dist/logos/39.png +0 -0
  49. package/dist/logos/4.png +0 -0
  50. package/dist/logos/40.png +0 -0
  51. package/dist/logos/41.png +0 -0
  52. package/dist/logos/42.png +0 -0
  53. package/dist/logos/43.png +0 -0
  54. package/dist/logos/44.png +0 -0
  55. package/dist/logos/45.png +0 -0
  56. package/dist/logos/46.png +0 -0
  57. package/dist/logos/47.png +0 -0
  58. package/dist/logos/48.png +0 -0
  59. package/dist/logos/49.png +0 -0
  60. package/dist/logos/5.png +0 -0
  61. package/dist/logos/50.png +0 -0
  62. package/dist/logos/51.png +0 -0
  63. package/dist/logos/52.png +0 -0
  64. package/dist/logos/53.png +0 -0
  65. package/dist/logos/54.png +0 -0
  66. package/dist/logos/55.png +0 -0
  67. package/dist/logos/6.png +0 -0
  68. package/dist/logos/7.png +0 -0
  69. package/dist/logos/8.png +0 -0
  70. package/dist/logos/9.png +0 -0
  71. package/dist/logos/Readme.md +1 -0
  72. package/dist/logos/logo_atomic_crm.svg +14 -0
  73. package/dist/logos/logo_atomic_crm_dark.svg +14 -0
  74. package/dist/logos/logo_atomic_crm_light.svg +14 -0
  75. package/dist/manifest.json +25 -0
  76. package/dist/robots.txt +3 -0
  77. package/dist/stats.html +4949 -0
  78. package/package.json +152 -0
  79. package/public/auth-callback.html +140 -0
  80. package/public/favicon.ico +0 -0
  81. package/public/img/adding-users.png +0 -0
  82. package/public/img/empty.svg +42 -0
  83. package/public/logo192.png +0 -0
  84. package/public/logo512.png +0 -0
  85. package/public/logos/0.png +0 -0
  86. package/public/logos/1.png +0 -0
  87. package/public/logos/10.png +0 -0
  88. package/public/logos/11.png +0 -0
  89. package/public/logos/12.png +0 -0
  90. package/public/logos/13.png +0 -0
  91. package/public/logos/14.png +0 -0
  92. package/public/logos/15.png +0 -0
  93. package/public/logos/16.png +0 -0
  94. package/public/logos/17.png +0 -0
  95. package/public/logos/18.png +0 -0
  96. package/public/logos/19.png +0 -0
  97. package/public/logos/2.png +0 -0
  98. package/public/logos/20.png +0 -0
  99. package/public/logos/21.png +0 -0
  100. package/public/logos/22.png +0 -0
  101. package/public/logos/23.png +0 -0
  102. package/public/logos/24.png +0 -0
  103. package/public/logos/25.png +0 -0
  104. package/public/logos/26.png +0 -0
  105. package/public/logos/27.png +0 -0
  106. package/public/logos/28.png +0 -0
  107. package/public/logos/29.png +0 -0
  108. package/public/logos/3.png +0 -0
  109. package/public/logos/30.png +0 -0
  110. package/public/logos/31.png +0 -0
  111. package/public/logos/32.png +0 -0
  112. package/public/logos/33.png +0 -0
  113. package/public/logos/34.png +0 -0
  114. package/public/logos/35.png +0 -0
  115. package/public/logos/36.png +0 -0
  116. package/public/logos/37.png +0 -0
  117. package/public/logos/38.png +0 -0
  118. package/public/logos/39.png +0 -0
  119. package/public/logos/4.png +0 -0
  120. package/public/logos/40.png +0 -0
  121. package/public/logos/41.png +0 -0
  122. package/public/logos/42.png +0 -0
  123. package/public/logos/43.png +0 -0
  124. package/public/logos/44.png +0 -0
  125. package/public/logos/45.png +0 -0
  126. package/public/logos/46.png +0 -0
  127. package/public/logos/47.png +0 -0
  128. package/public/logos/48.png +0 -0
  129. package/public/logos/49.png +0 -0
  130. package/public/logos/5.png +0 -0
  131. package/public/logos/50.png +0 -0
  132. package/public/logos/51.png +0 -0
  133. package/public/logos/52.png +0 -0
  134. package/public/logos/53.png +0 -0
  135. package/public/logos/54.png +0 -0
  136. package/public/logos/55.png +0 -0
  137. package/public/logos/6.png +0 -0
  138. package/public/logos/7.png +0 -0
  139. package/public/logos/8.png +0 -0
  140. package/public/logos/9.png +0 -0
  141. package/public/logos/Readme.md +1 -0
  142. package/public/logos/logo_atomic_crm.svg +14 -0
  143. package/public/logos/logo_atomic_crm_dark.svg +14 -0
  144. package/public/logos/logo_atomic_crm_light.svg +14 -0
  145. package/public/manifest.json +25 -0
  146. package/public/robots.txt +3 -0
  147. package/src/App.css +42 -0
  148. package/src/App.tsx +58 -0
  149. package/src/assets/react.svg +1 -0
  150. package/src/components/admin/Readme.md +40 -0
  151. package/src/components/admin/admin.tsx +132 -0
  152. package/src/components/admin/app-sidebar.tsx +166 -0
  153. package/src/components/admin/array-field.tsx +59 -0
  154. package/src/components/admin/array-input.tsx +201 -0
  155. package/src/components/admin/authentication.tsx +86 -0
  156. package/src/components/admin/autocomplete-array-input.tsx +254 -0
  157. package/src/components/admin/autocomplete-input.tsx +296 -0
  158. package/src/components/admin/badge-field.tsx +65 -0
  159. package/src/components/admin/boolean-input.tsx +116 -0
  160. package/src/components/admin/breadcrumb.tsx +135 -0
  161. package/src/components/admin/bulk-actions-toolbar.tsx +83 -0
  162. package/src/components/admin/bulk-delete-button.tsx +70 -0
  163. package/src/components/admin/bulk-export-button.tsx +76 -0
  164. package/src/components/admin/cancel-button.tsx +46 -0
  165. package/src/components/admin/columns-button.tsx +345 -0
  166. package/src/components/admin/confirm.tsx +166 -0
  167. package/src/components/admin/count.tsx +94 -0
  168. package/src/components/admin/create-button.tsx +58 -0
  169. package/src/components/admin/create.tsx +132 -0
  170. package/src/components/admin/data-table.tsx +520 -0
  171. package/src/components/admin/date-field.tsx +136 -0
  172. package/src/components/admin/date-input.tsx +317 -0
  173. package/src/components/admin/date-time-input.tsx +331 -0
  174. package/src/components/admin/delete-button.tsx +113 -0
  175. package/src/components/admin/edit-button.tsx +64 -0
  176. package/src/components/admin/edit-guesser.tsx +157 -0
  177. package/src/components/admin/edit.tsx +152 -0
  178. package/src/components/admin/email-field.tsx +74 -0
  179. package/src/components/admin/error.tsx +111 -0
  180. package/src/components/admin/export-button.tsx +126 -0
  181. package/src/components/admin/field-toggle.tsx +164 -0
  182. package/src/components/admin/file-field.tsx +123 -0
  183. package/src/components/admin/file-input.tsx +361 -0
  184. package/src/components/admin/filter-form.tsx +510 -0
  185. package/src/components/admin/form.tsx +312 -0
  186. package/src/components/admin/icon-button-with-tooltip.tsx +85 -0
  187. package/src/components/admin/index.ts +73 -0
  188. package/src/components/admin/input-helper-text.tsx +29 -0
  189. package/src/components/admin/layout.tsx +69 -0
  190. package/src/components/admin/list-guesser.tsx +239 -0
  191. package/src/components/admin/list-pagination.tsx +247 -0
  192. package/src/components/admin/list.tsx +178 -0
  193. package/src/components/admin/loading.tsx +40 -0
  194. package/src/components/admin/locales-menu-button.tsx +60 -0
  195. package/src/components/admin/login-page.tsx +104 -0
  196. package/src/components/admin/notification.tsx +114 -0
  197. package/src/components/admin/number-field.tsx +84 -0
  198. package/src/components/admin/number-input.tsx +124 -0
  199. package/src/components/admin/radio-button-group-input.tsx +184 -0
  200. package/src/components/admin/ready.tsx +55 -0
  201. package/src/components/admin/record-field.tsx +132 -0
  202. package/src/components/admin/reference-array-field.tsx +152 -0
  203. package/src/components/admin/reference-array-input.tsx +68 -0
  204. package/src/components/admin/reference-field.tsx +153 -0
  205. package/src/components/admin/reference-input.tsx +46 -0
  206. package/src/components/admin/reference-many-count.tsx +92 -0
  207. package/src/components/admin/reference-many-field.tsx +132 -0
  208. package/src/components/admin/refresh-button.tsx +31 -0
  209. package/src/components/admin/saved-queries.tsx +174 -0
  210. package/src/components/admin/search-input.tsx +57 -0
  211. package/src/components/admin/select-field.tsx +111 -0
  212. package/src/components/admin/select-input.tsx +323 -0
  213. package/src/components/admin/show-button.tsx +57 -0
  214. package/src/components/admin/show-guesser.tsx +215 -0
  215. package/src/components/admin/show.tsx +184 -0
  216. package/src/components/admin/simple-form-iterator.tsx +582 -0
  217. package/src/components/admin/simple-form.tsx +95 -0
  218. package/src/components/admin/simple-show-layout.tsx +8 -0
  219. package/src/components/admin/single-field-list.tsx +67 -0
  220. package/src/components/admin/sort-button.tsx +152 -0
  221. package/src/components/admin/spinner.tsx +46 -0
  222. package/src/components/admin/text-field.tsx +60 -0
  223. package/src/components/admin/text-input.tsx +77 -0
  224. package/src/components/admin/theme-mode-toggle.tsx +48 -0
  225. package/src/components/admin/theme-provider.tsx +74 -0
  226. package/src/components/admin/toggle-filter-button.tsx +77 -0
  227. package/src/components/admin/url-field.tsx +83 -0
  228. package/src/components/admin/user-menu.tsx +84 -0
  229. package/src/components/atomic-crm/activity/ActivityLog.tsx +54 -0
  230. package/src/components/atomic-crm/activity/ActivityLogCompanyCreated.tsx +50 -0
  231. package/src/components/atomic-crm/activity/ActivityLogContactCreated.tsx +42 -0
  232. package/src/components/atomic-crm/activity/ActivityLogContactNoteCreated.tsx +71 -0
  233. package/src/components/atomic-crm/activity/ActivityLogContext.tsx +11 -0
  234. package/src/components/atomic-crm/activity/ActivityLogDealCreated.tsx +41 -0
  235. package/src/components/atomic-crm/activity/ActivityLogDealNoteCreated.tsx +84 -0
  236. package/src/components/atomic-crm/activity/ActivityLogIterator.tsx +80 -0
  237. package/src/components/atomic-crm/activity/ActivityLogNote.tsx +36 -0
  238. package/src/components/atomic-crm/companies/AutocompleteCompanyInput.tsx +43 -0
  239. package/src/components/atomic-crm/companies/CompanyAside.tsx +207 -0
  240. package/src/components/atomic-crm/companies/CompanyAvatar.tsx +29 -0
  241. package/src/components/atomic-crm/companies/CompanyCard.tsx +88 -0
  242. package/src/components/atomic-crm/companies/CompanyCreate.tsx +41 -0
  243. package/src/components/atomic-crm/companies/CompanyEdit.tsx +33 -0
  244. package/src/components/atomic-crm/companies/CompanyEmpty.tsx +26 -0
  245. package/src/components/atomic-crm/companies/CompanyInputs.tsx +160 -0
  246. package/src/components/atomic-crm/companies/CompanyList.tsx +54 -0
  247. package/src/components/atomic-crm/companies/CompanyListFilter.tsx +55 -0
  248. package/src/components/atomic-crm/companies/CompanyShow.tsx +241 -0
  249. package/src/components/atomic-crm/companies/GridList.tsx +46 -0
  250. package/src/components/atomic-crm/companies/index.ts +11 -0
  251. package/src/components/atomic-crm/companies/sizes.ts +7 -0
  252. package/src/components/atomic-crm/consts.ts +5 -0
  253. package/src/components/atomic-crm/contacts/Avatar.tsx +40 -0
  254. package/src/components/atomic-crm/contacts/ContactAside.tsx +187 -0
  255. package/src/components/atomic-crm/contacts/ContactCreate.tsx +34 -0
  256. package/src/components/atomic-crm/contacts/ContactEdit.tsx +32 -0
  257. package/src/components/atomic-crm/contacts/ContactEmpty.tsx +28 -0
  258. package/src/components/atomic-crm/contacts/ContactImportButton.tsx +213 -0
  259. package/src/components/atomic-crm/contacts/ContactInputs.tsx +209 -0
  260. package/src/components/atomic-crm/contacts/ContactList.tsx +116 -0
  261. package/src/components/atomic-crm/contacts/ContactListContent.tsx +107 -0
  262. package/src/components/atomic-crm/contacts/ContactListFilter.tsx +126 -0
  263. package/src/components/atomic-crm/contacts/ContactMergeButton.tsx +263 -0
  264. package/src/components/atomic-crm/contacts/ContactShow.tsx +76 -0
  265. package/src/components/atomic-crm/contacts/ExportVCardButton.tsx +79 -0
  266. package/src/components/atomic-crm/contacts/TagsList.tsx +33 -0
  267. package/src/components/atomic-crm/contacts/TagsListEdit.tsx +155 -0
  268. package/src/components/atomic-crm/contacts/contacts_export.csv +3 -0
  269. package/src/components/atomic-crm/contacts/exportToVCard.ts +104 -0
  270. package/src/components/atomic-crm/contacts/index.tsx +14 -0
  271. package/src/components/atomic-crm/contacts/useContactImport.tsx +206 -0
  272. package/src/components/atomic-crm/dashboard/Dashboard.tsx +66 -0
  273. package/src/components/atomic-crm/dashboard/DashboardActivityLog.tsx +22 -0
  274. package/src/components/atomic-crm/dashboard/DashboardStepper.tsx +72 -0
  275. package/src/components/atomic-crm/dashboard/DealsChart.tsx +202 -0
  276. package/src/components/atomic-crm/dashboard/DealsPipeline.tsx +90 -0
  277. package/src/components/atomic-crm/dashboard/HotContacts.tsx +92 -0
  278. package/src/components/atomic-crm/dashboard/LatestNotes.tsx +116 -0
  279. package/src/components/atomic-crm/dashboard/TasksList.tsx +69 -0
  280. package/src/components/atomic-crm/dashboard/TasksListEmpty.tsx +22 -0
  281. package/src/components/atomic-crm/dashboard/TasksListFilter.tsx +72 -0
  282. package/src/components/atomic-crm/dashboard/Welcome.tsx +41 -0
  283. package/src/components/atomic-crm/deals/ContactList.tsx +31 -0
  284. package/src/components/atomic-crm/deals/DealArchivedList.tsx +105 -0
  285. package/src/components/atomic-crm/deals/DealCard.tsx +78 -0
  286. package/src/components/atomic-crm/deals/DealColumn.tsx +52 -0
  287. package/src/components/atomic-crm/deals/DealCreate.tsx +95 -0
  288. package/src/components/atomic-crm/deals/DealEdit.tsx +81 -0
  289. package/src/components/atomic-crm/deals/DealEmpty.tsx +63 -0
  290. package/src/components/atomic-crm/deals/DealInputs.tsx +103 -0
  291. package/src/components/atomic-crm/deals/DealList.tsx +95 -0
  292. package/src/components/atomic-crm/deals/DealListContent.tsx +245 -0
  293. package/src/components/atomic-crm/deals/DealShow.tsx +260 -0
  294. package/src/components/atomic-crm/deals/OnlyMineInput.tsx +30 -0
  295. package/src/components/atomic-crm/deals/deal.ts +5 -0
  296. package/src/components/atomic-crm/deals/dealUtils.ts +26 -0
  297. package/src/components/atomic-crm/deals/index.ts +6 -0
  298. package/src/components/atomic-crm/deals/stages.ts +28 -0
  299. package/src/components/atomic-crm/filters/FilterCategory.tsx +20 -0
  300. package/src/components/atomic-crm/layout/FormToolbar.tsx +12 -0
  301. package/src/components/atomic-crm/layout/Header.tsx +134 -0
  302. package/src/components/atomic-crm/layout/Layout.tsx +21 -0
  303. package/src/components/atomic-crm/layout/TopToolbar.tsx +24 -0
  304. package/src/components/atomic-crm/login/LoginSkeleton.tsx +18 -0
  305. package/src/components/atomic-crm/login/SignupPage.tsx +150 -0
  306. package/src/components/atomic-crm/login/StartPage.tsx +27 -0
  307. package/src/components/atomic-crm/misc/AsideSection.tsx +21 -0
  308. package/src/components/atomic-crm/misc/ContactOption.tsx +26 -0
  309. package/src/components/atomic-crm/misc/ImageEditorField.tsx +206 -0
  310. package/src/components/atomic-crm/misc/RelativeDate.tsx +5 -0
  311. package/src/components/atomic-crm/misc/Status.tsx +28 -0
  312. package/src/components/atomic-crm/misc/fetchWithTimeout.ts +19 -0
  313. package/src/components/atomic-crm/misc/isLinkedInUrl.ts +15 -0
  314. package/src/components/atomic-crm/misc/unsupportedDomains.const.ts +105 -0
  315. package/src/components/atomic-crm/misc/useAppBarHeight.ts +9 -0
  316. package/src/components/atomic-crm/misc/usePapaParse.tsx +144 -0
  317. package/src/components/atomic-crm/notes/Note.tsx +187 -0
  318. package/src/components/atomic-crm/notes/NoteAttachments.tsx +56 -0
  319. package/src/components/atomic-crm/notes/NoteCreate.tsx +112 -0
  320. package/src/components/atomic-crm/notes/NoteInputs.tsx +92 -0
  321. package/src/components/atomic-crm/notes/NotesIterator.tsx +37 -0
  322. package/src/components/atomic-crm/notes/StatusSelector.tsx +39 -0
  323. package/src/components/atomic-crm/notes/index.ts +3 -0
  324. package/src/components/atomic-crm/notes/utils.ts +13 -0
  325. package/src/components/atomic-crm/providers/commons/activity.ts +174 -0
  326. package/src/components/atomic-crm/providers/commons/canAccess.ts +26 -0
  327. package/src/components/atomic-crm/providers/commons/getCompanyAvatar.spec.ts +20 -0
  328. package/src/components/atomic-crm/providers/commons/getCompanyAvatar.ts +21 -0
  329. package/src/components/atomic-crm/providers/commons/getContactAvatar.spec.ts +80 -0
  330. package/src/components/atomic-crm/providers/commons/getContactAvatar.ts +70 -0
  331. package/src/components/atomic-crm/providers/commons/mergeContacts.ts +185 -0
  332. package/src/components/atomic-crm/providers/fakerest/authProvider.ts +74 -0
  333. package/src/components/atomic-crm/providers/fakerest/dataGenerator/companies.ts +53 -0
  334. package/src/components/atomic-crm/providers/fakerest/dataGenerator/contactNotes.ts +25 -0
  335. package/src/components/atomic-crm/providers/fakerest/dataGenerator/contacts.ts +103 -0
  336. package/src/components/atomic-crm/providers/fakerest/dataGenerator/dealNotes.ts +19 -0
  337. package/src/components/atomic-crm/providers/fakerest/dataGenerator/deals.ts +53 -0
  338. package/src/components/atomic-crm/providers/fakerest/dataGenerator/finalize.ts +10 -0
  339. package/src/components/atomic-crm/providers/fakerest/dataGenerator/index.ts +25 -0
  340. package/src/components/atomic-crm/providers/fakerest/dataGenerator/sales.ts +37 -0
  341. package/src/components/atomic-crm/providers/fakerest/dataGenerator/tags.ts +14 -0
  342. package/src/components/atomic-crm/providers/fakerest/dataGenerator/tasks.ts +55 -0
  343. package/src/components/atomic-crm/providers/fakerest/dataGenerator/types.ts +21 -0
  344. package/src/components/atomic-crm/providers/fakerest/dataGenerator/utils.ts +28 -0
  345. package/src/components/atomic-crm/providers/fakerest/dataProvider.ts +518 -0
  346. package/src/components/atomic-crm/providers/fakerest/index.ts +2 -0
  347. package/src/components/atomic-crm/providers/fakerest/internal/listParser.ts +48 -0
  348. package/src/components/atomic-crm/providers/fakerest/internal/supabaseAdapter.spec.ts +721 -0
  349. package/src/components/atomic-crm/providers/fakerest/internal/supabaseAdapter.ts +49 -0
  350. package/src/components/atomic-crm/providers/fakerest/internal/transformContainsFilter.spec.ts +35 -0
  351. package/src/components/atomic-crm/providers/fakerest/internal/transformContainsFilter.ts +17 -0
  352. package/src/components/atomic-crm/providers/fakerest/internal/transformFilter.ts +57 -0
  353. package/src/components/atomic-crm/providers/fakerest/internal/transformInFilter.spec.ts +32 -0
  354. package/src/components/atomic-crm/providers/fakerest/internal/transformInFilter.ts +17 -0
  355. package/src/components/atomic-crm/providers/fakerest/internal/transformOrFilter.spec.ts +23 -0
  356. package/src/components/atomic-crm/providers/fakerest/internal/transformOrFilter.ts +17 -0
  357. package/src/components/atomic-crm/providers/supabase/authProvider.ts +121 -0
  358. package/src/components/atomic-crm/providers/supabase/dataProvider.ts +407 -0
  359. package/src/components/atomic-crm/providers/supabase/index.ts +2 -0
  360. package/src/components/atomic-crm/providers/supabase/supabase.ts +34 -0
  361. package/src/components/atomic-crm/providers/types.ts +1 -0
  362. package/src/components/atomic-crm/root/CRM.tsx +167 -0
  363. package/src/components/atomic-crm/root/ConfigurationContext.tsx +80 -0
  364. package/src/components/atomic-crm/root/defaultConfiguration.ts +64 -0
  365. package/src/components/atomic-crm/root/i18nProvider.tsx +25 -0
  366. package/src/components/atomic-crm/sales/SaleName.tsx +13 -0
  367. package/src/components/atomic-crm/sales/SalesCreate.tsx +51 -0
  368. package/src/components/atomic-crm/sales/SalesEdit.tsx +82 -0
  369. package/src/components/atomic-crm/sales/SalesInputs.tsx +31 -0
  370. package/src/components/atomic-crm/sales/SalesList.tsx +62 -0
  371. package/src/components/atomic-crm/sales/index.ts +12 -0
  372. package/src/components/atomic-crm/settings/DatabaseSettings.tsx +169 -0
  373. package/src/components/atomic-crm/settings/SettingsPage.tsx +259 -0
  374. package/src/components/atomic-crm/setup/SupabaseSetupWizard.tsx +215 -0
  375. package/src/components/atomic-crm/simple-list/ListNoResults.tsx +53 -0
  376. package/src/components/atomic-crm/simple-list/ListPlaceholder.tsx +9 -0
  377. package/src/components/atomic-crm/simple-list/SimpleList.tsx +245 -0
  378. package/src/components/atomic-crm/simple-list/SimpleListItem.tsx +138 -0
  379. package/src/components/atomic-crm/simple-list/SimpleListLoading.tsx +60 -0
  380. package/src/components/atomic-crm/tags/RoundButton.tsx +10 -0
  381. package/src/components/atomic-crm/tags/TagChip.tsx +45 -0
  382. package/src/components/atomic-crm/tags/TagCreateModal.tsx +39 -0
  383. package/src/components/atomic-crm/tags/TagDialog.tsx +118 -0
  384. package/src/components/atomic-crm/tags/TagEditModal.tsx +42 -0
  385. package/src/components/atomic-crm/tags/colors.ts +12 -0
  386. package/src/components/atomic-crm/tasks/AddTask.tsx +191 -0
  387. package/src/components/atomic-crm/tasks/Task.tsx +184 -0
  388. package/src/components/atomic-crm/tasks/TaskEdit.tsx +96 -0
  389. package/src/components/atomic-crm/tasks/TasksIterator.tsx +30 -0
  390. package/src/components/atomic-crm/types.ts +226 -0
  391. package/src/components/supabase/forgot-password-page.tsx +86 -0
  392. package/src/components/supabase/layout.tsx +27 -0
  393. package/src/components/supabase/set-password-page.tsx +119 -0
  394. package/src/components/ui/README.md +34 -0
  395. package/src/components/ui/accordion.tsx +64 -0
  396. package/src/components/ui/alert.tsx +66 -0
  397. package/src/components/ui/avatar.tsx +99 -0
  398. package/src/components/ui/badge.tsx +46 -0
  399. package/src/components/ui/breadcrumb.tsx +109 -0
  400. package/src/components/ui/button.tsx +59 -0
  401. package/src/components/ui/card.tsx +92 -0
  402. package/src/components/ui/checkbox.tsx +30 -0
  403. package/src/components/ui/command.tsx +175 -0
  404. package/src/components/ui/dialog.tsx +133 -0
  405. package/src/components/ui/drawer.tsx +133 -0
  406. package/src/components/ui/dropdown-menu.tsx +255 -0
  407. package/src/components/ui/input.tsx +21 -0
  408. package/src/components/ui/label.tsx +24 -0
  409. package/src/components/ui/navigation-menu.tsx +168 -0
  410. package/src/components/ui/pagination.tsx +127 -0
  411. package/src/components/ui/popover.tsx +46 -0
  412. package/src/components/ui/progress.tsx +29 -0
  413. package/src/components/ui/radio-group.tsx +43 -0
  414. package/src/components/ui/select.tsx +183 -0
  415. package/src/components/ui/separator.tsx +26 -0
  416. package/src/components/ui/sheet.tsx +137 -0
  417. package/src/components/ui/sidebar.tsx +724 -0
  418. package/src/components/ui/skeleton.tsx +13 -0
  419. package/src/components/ui/sonner.tsx +38 -0
  420. package/src/components/ui/spinner.tsx +51 -0
  421. package/src/components/ui/switch.tsx +29 -0
  422. package/src/components/ui/table.tsx +114 -0
  423. package/src/components/ui/tabs.tsx +64 -0
  424. package/src/components/ui/textarea.tsx +18 -0
  425. package/src/components/ui/tooltip.tsx +61 -0
  426. package/src/hooks/saved-queries.tsx +67 -0
  427. package/src/hooks/simple-form-iterator-context.tsx +70 -0
  428. package/src/hooks/use-mobile.ts +21 -0
  429. package/src/hooks/useBulkExport.tsx +61 -0
  430. package/src/hooks/useSupportCreateSuggestion.tsx +188 -0
  431. package/src/hooks/user-menu-context.tsx +24 -0
  432. package/src/index.css +170 -0
  433. package/src/lib/field.type.ts +22 -0
  434. package/src/lib/genericMemo.ts +18 -0
  435. package/src/lib/i18nProvider.ts +9 -0
  436. package/src/lib/sanitizeInputRestProps.ts +46 -0
  437. package/src/lib/supabase-config.ts +123 -0
  438. package/src/lib/utils.ts +6 -0
  439. package/src/main.tsx +10 -0
  440. package/src/setupTests.js +5 -0
  441. package/src/vite-env.d.ts +1 -0
  442. package/supabase/config.toml +157 -0
  443. package/supabase/functions/.env.development +7 -0
  444. package/supabase/functions/_shared/db.ts +187 -0
  445. package/supabase/functions/_shared/supabaseAdmin.ts +13 -0
  446. package/supabase/functions/_shared/utils.ts +13 -0
  447. package/supabase/functions/mergeContacts/index.ts +215 -0
  448. package/supabase/functions/postmark/addNoteToContact.ts +129 -0
  449. package/supabase/functions/postmark/extractMailContactData.ts +41 -0
  450. package/supabase/functions/postmark/getExpectedAuthorization.ts +4 -0
  451. package/supabase/functions/postmark/getNoteContent.ts +6 -0
  452. package/supabase/functions/postmark/index.ts +210 -0
  453. package/supabase/functions/updatePassword/index.ts +50 -0
  454. package/supabase/functions/users/index.ts +206 -0
  455. package/supabase/migrations/20240730075029_init_db.sql +600 -0
  456. package/supabase/migrations/20240730075425_init_triggers.sql +57 -0
  457. package/supabase/migrations/20240806124555_task_sales_id.sql +1 -0
  458. package/supabase/migrations/20240807082449_remove-aquisition.sql +20 -0
  459. package/supabase/migrations/20240808141826_init_state_configure.sql +9 -0
  460. package/supabase/migrations/20240813084010_tags_policy.sql +18 -0
  461. package/supabase/migrations/20241104153231_sales_policies.sql +7 -0
  462. package/supabase/migrations/20250109152531_email_jsonb.sql +43 -0
  463. package/supabase/migrations/20250113132531_phone_jsonb.sql +67 -0
  464. package/supabase/migrations/20251204172855_merge_contacts_function.sql +153 -0
  465. package/supabase/migrations/20251204201317_drop_merge_contacts_function.sql +2 -0
  466. package/supabase/seed.sql +0 -0
  467. package/supabase/templates/invite.html +70 -0
  468. package/supabase/templates/recovery.html +75 -0
@@ -0,0 +1,18 @@
1
+ create policy "Enable delete for authenticated users only"
2
+ on "public"."tags"
3
+ as permissive
4
+ for delete
5
+ to authenticated
6
+ using (true);
7
+
8
+
9
+ create policy "Enable update for authenticated users only"
10
+ on "public"."tags"
11
+ as permissive
12
+ for update
13
+ to authenticated
14
+ using (true);
15
+
16
+
17
+
18
+
@@ -0,0 +1,7 @@
1
+ create schema if not exists "private";
2
+
3
+ set check_function_bodies = off;
4
+
5
+ drop policy "Enable insert for authenticated users only" on "public"."sales";
6
+
7
+ drop policy "Enable update for authenticated users only" on "public"."sales";
@@ -0,0 +1,43 @@
1
+ alter table contacts add column email_jsonb jsonb;
2
+
3
+ update contacts set email_jsonb = ('[{"email": "' || email || '", "type": "Other"}]')::jsonb;
4
+
5
+ drop view contacts_summary;
6
+
7
+ alter table contacts drop column email;
8
+
9
+ create view contacts_summary
10
+ as
11
+ select
12
+ co.id,
13
+ co.first_name,
14
+ co.last_name,
15
+ co.gender,
16
+ co.title,
17
+ co.email_jsonb,
18
+ jsonb_path_query_array(co.email_jsonb, '$[*].email')::text as email_fts,
19
+ co.phone_1_number,
20
+ co.phone_1_type,
21
+ co.phone_2_number,
22
+ co.phone_2_type,
23
+ co.background,
24
+ co.avatar,
25
+ co.first_seen,
26
+ co.last_seen,
27
+ co.has_newsletter,
28
+ co.status,
29
+ co.tags,
30
+ co.company_id,
31
+ co.sales_id,
32
+ co.linkedin_url,
33
+ c.name as company_name,
34
+ count(distinct t.id) as nb_tasks
35
+ from
36
+ contacts co
37
+ left join
38
+ tasks t on co.id = t.contact_id
39
+ left join
40
+ companies c on co.company_id = c.id
41
+ group by
42
+ co.id, c.name;
43
+
@@ -0,0 +1,67 @@
1
+ alter table contacts add column phone_jsonb jsonb;
2
+
3
+ update contacts set phone_jsonb =
4
+ concat(
5
+ '[',
6
+ case when phone_1_number is not null then
7
+ concat(
8
+ '{"number":"',
9
+ phone_1_number,
10
+ '","type":"',
11
+ phone_1_type,
12
+ '"}'
13
+ )
14
+ else null end,
15
+ case when phone_2_number is not null then
16
+ concat(
17
+ ',',
18
+ '{"number":"',
19
+ phone_2_number,
20
+ '","type":"',
21
+ phone_2_type,
22
+ '"}'
23
+ )
24
+ else null end,
25
+ ']'
26
+ )::jsonb;
27
+
28
+ drop view contacts_summary;
29
+
30
+ alter table contacts drop column phone_1_number;
31
+ alter table contacts drop column phone_1_type;
32
+ alter table contacts drop column phone_2_number;
33
+ alter table contacts drop column phone_2_type;
34
+
35
+ create view contacts_summary
36
+ as
37
+ select
38
+ co.id,
39
+ co.first_name,
40
+ co.last_name,
41
+ co.gender,
42
+ co.title,
43
+ co.email_jsonb,
44
+ jsonb_path_query_array(co.email_jsonb, '$[*].email')::text as email_fts,
45
+ co.phone_jsonb,
46
+ jsonb_path_query_array(co.phone_jsonb, '$[*].number')::text as phone_fts,
47
+ co.background,
48
+ co.avatar,
49
+ co.first_seen,
50
+ co.last_seen,
51
+ co.has_newsletter,
52
+ co.status,
53
+ co.tags,
54
+ co.company_id,
55
+ co.sales_id,
56
+ co.linkedin_url,
57
+ c.name as company_name,
58
+ count(distinct t.id) as nb_tasks
59
+ from
60
+ contacts co
61
+ left join
62
+ tasks t on co.id = t.contact_id
63
+ left join
64
+ companies c on co.company_id = c.id
65
+ group by
66
+ co.id, c.name;
67
+
@@ -0,0 +1,153 @@
1
+ -- Create function to merge contacts server-side with transaction support
2
+ CREATE OR REPLACE FUNCTION merge_contacts(loser_id bigint, winner_id bigint)
3
+ RETURNS bigint
4
+ LANGUAGE plpgsql
5
+ SECURITY INVOKER
6
+ AS $$
7
+ DECLARE
8
+ winner_contact contacts%ROWTYPE;
9
+ loser_contact contacts%ROWTYPE;
10
+ deal_record RECORD;
11
+ merged_emails jsonb;
12
+ merged_phones jsonb;
13
+ merged_tags bigint[];
14
+ winner_emails jsonb;
15
+ loser_emails jsonb;
16
+ winner_phones jsonb;
17
+ loser_phones jsonb;
18
+ email_map jsonb;
19
+ phone_map jsonb;
20
+ BEGIN
21
+ -- Fetch both contacts
22
+ SELECT * INTO winner_contact FROM contacts WHERE id = winner_id;
23
+ SELECT * INTO loser_contact FROM contacts WHERE id = loser_id;
24
+
25
+ IF winner_contact IS NULL OR loser_contact IS NULL THEN
26
+ RAISE EXCEPTION 'Contact not found';
27
+ END IF;
28
+
29
+ -- 1. Reassign tasks from loser to winner
30
+ UPDATE tasks SET contact_id = winner_id WHERE contact_id = loser_id;
31
+
32
+ -- 2. Reassign contact notes from loser to winner
33
+ UPDATE "contactNotes" SET contact_id = winner_id WHERE contact_id = loser_id;
34
+
35
+ -- 3. Update deals - replace loser with winner in contact_ids array
36
+ FOR deal_record IN
37
+ SELECT id, contact_ids
38
+ FROM deals
39
+ WHERE contact_ids @> ARRAY[loser_id]
40
+ LOOP
41
+ UPDATE deals
42
+ SET contact_ids = (
43
+ SELECT ARRAY(
44
+ SELECT DISTINCT unnest(
45
+ array_remove(deal_record.contact_ids, loser_id) || ARRAY[winner_id]
46
+ )
47
+ )
48
+ )
49
+ WHERE id = deal_record.id;
50
+ END LOOP;
51
+
52
+ -- 4. Merge contact data
53
+
54
+ -- Get email arrays
55
+ winner_emails := COALESCE(winner_contact.email_jsonb, '[]'::jsonb);
56
+ loser_emails := COALESCE(loser_contact.email_jsonb, '[]'::jsonb);
57
+
58
+ -- Merge emails with deduplication by email address
59
+ -- Build a map of email -> email object, then convert back to array
60
+ email_map := '{}'::jsonb;
61
+
62
+ -- Add winner emails to map
63
+ IF jsonb_array_length(winner_emails) > 0 THEN
64
+ FOR i IN 0..jsonb_array_length(winner_emails)-1 LOOP
65
+ email_map := email_map || jsonb_build_object(
66
+ winner_emails->i->>'email',
67
+ winner_emails->i
68
+ );
69
+ END LOOP;
70
+ END IF;
71
+
72
+ -- Add loser emails to map (won't overwrite existing keys)
73
+ IF jsonb_array_length(loser_emails) > 0 THEN
74
+ FOR i IN 0..jsonb_array_length(loser_emails)-1 LOOP
75
+ IF NOT email_map ? (loser_emails->i->>'email') THEN
76
+ email_map := email_map || jsonb_build_object(
77
+ loser_emails->i->>'email',
78
+ loser_emails->i
79
+ );
80
+ END IF;
81
+ END LOOP;
82
+ END IF;
83
+
84
+ -- Convert map back to array
85
+ merged_emails := (SELECT jsonb_agg(value) FROM jsonb_each(email_map));
86
+ merged_emails := COALESCE(merged_emails, '[]'::jsonb);
87
+
88
+ -- Get phone arrays
89
+ winner_phones := COALESCE(winner_contact.phone_jsonb, '[]'::jsonb);
90
+ loser_phones := COALESCE(loser_contact.phone_jsonb, '[]'::jsonb);
91
+
92
+ -- Merge phones with deduplication by number
93
+ phone_map := '{}'::jsonb;
94
+
95
+ -- Add winner phones to map
96
+ IF jsonb_array_length(winner_phones) > 0 THEN
97
+ FOR i IN 0..jsonb_array_length(winner_phones)-1 LOOP
98
+ phone_map := phone_map || jsonb_build_object(
99
+ winner_phones->i->>'number',
100
+ winner_phones->i
101
+ );
102
+ END LOOP;
103
+ END IF;
104
+
105
+ -- Add loser phones to map (won't overwrite existing keys)
106
+ IF jsonb_array_length(loser_phones) > 0 THEN
107
+ FOR i IN 0..jsonb_array_length(loser_phones)-1 LOOP
108
+ IF NOT phone_map ? (loser_phones->i->>'number') THEN
109
+ phone_map := phone_map || jsonb_build_object(
110
+ loser_phones->i->>'number',
111
+ loser_phones->i
112
+ );
113
+ END IF;
114
+ END LOOP;
115
+ END IF;
116
+
117
+ -- Convert map back to array
118
+ merged_phones := (SELECT jsonb_agg(value) FROM jsonb_each(phone_map));
119
+ merged_phones := COALESCE(merged_phones, '[]'::jsonb);
120
+
121
+ -- Merge tags (remove duplicates)
122
+ merged_tags := ARRAY(
123
+ SELECT DISTINCT unnest(
124
+ COALESCE(winner_contact.tags, ARRAY[]::bigint[]) ||
125
+ COALESCE(loser_contact.tags, ARRAY[]::bigint[])
126
+ )
127
+ );
128
+
129
+ -- 5. Update winner with merged data
130
+ UPDATE contacts SET
131
+ avatar = COALESCE(winner_contact.avatar, loser_contact.avatar),
132
+ gender = COALESCE(winner_contact.gender, loser_contact.gender),
133
+ first_name = COALESCE(winner_contact.first_name, loser_contact.first_name),
134
+ last_name = COALESCE(winner_contact.last_name, loser_contact.last_name),
135
+ title = COALESCE(winner_contact.title, loser_contact.title),
136
+ company_id = COALESCE(winner_contact.company_id, loser_contact.company_id),
137
+ email_jsonb = merged_emails,
138
+ phone_jsonb = merged_phones,
139
+ linkedin_url = COALESCE(winner_contact.linkedin_url, loser_contact.linkedin_url),
140
+ background = COALESCE(winner_contact.background, loser_contact.background),
141
+ has_newsletter = COALESCE(winner_contact.has_newsletter, loser_contact.has_newsletter),
142
+ first_seen = LEAST(COALESCE(winner_contact.first_seen, loser_contact.first_seen), COALESCE(loser_contact.first_seen, winner_contact.first_seen)),
143
+ last_seen = GREATEST(COALESCE(winner_contact.last_seen, loser_contact.last_seen), COALESCE(loser_contact.last_seen, winner_contact.last_seen)),
144
+ sales_id = COALESCE(winner_contact.sales_id, loser_contact.sales_id),
145
+ tags = merged_tags
146
+ WHERE id = winner_id;
147
+
148
+ -- 6. Delete loser contact
149
+ DELETE FROM contacts WHERE id = loser_id;
150
+
151
+ RETURN winner_id;
152
+ END;
153
+ $$;
@@ -0,0 +1,2 @@
1
+ -- Drop the merge_contacts function (reverting to edge function approach)
2
+ DROP FUNCTION IF EXISTS merge_contacts(bigint, bigint);
File without changes
@@ -0,0 +1,70 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <style>
5
+ body {
6
+ font-family: Arial, sans-serif;
7
+ background-color: #f4f4f4;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+ .container {
12
+ width: 100%;
13
+ max-width: 600px;
14
+ margin: 0 auto;
15
+ background-color: #ffffff;
16
+ padding: 20px;
17
+ border-radius: 8px;
18
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
19
+ }
20
+ .header {
21
+ text-align: center;
22
+ padding: 10px 0;
23
+ }
24
+ .header h2 {
25
+ margin: 0;
26
+ color: #333333;
27
+ }
28
+ .content {
29
+ padding: 20px;
30
+ line-height: 1.6;
31
+ color: #555555;
32
+ }
33
+ .content p {
34
+ margin: 0 0 10px;
35
+ }
36
+ .button {
37
+ display: block;
38
+ width: 200px;
39
+ margin: 20px auto;
40
+ padding: 10px;
41
+ text-align: center;
42
+ background-color: #007bff;
43
+ color: #ffffff !important;
44
+ text-decoration: none;
45
+ border-radius: 5px;
46
+ }
47
+ </style>
48
+ </head>
49
+ <body>
50
+ <div class="container">
51
+ <div class="header">
52
+ <h2>Confirm your account</h2>
53
+ </div>
54
+ <div class="content">
55
+ <p>Hello {{ .Data.first_name }},</p>
56
+ <p>
57
+ You've been invited to join Atomic CRM. To confirm your account and
58
+ choose your password, please click the link below.
59
+ </p>
60
+ <p>
61
+ <a href="{{ .ConfirmationURL }}auth-callback.html" class="button"
62
+ >Create my account</a
63
+ >
64
+ </p>
65
+ <p>See you soon!</p>
66
+ <p>The Atomic CRM team</p>
67
+ </div>
68
+ </div>
69
+ </body>
70
+ </html>
@@ -0,0 +1,75 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <style>
5
+ body {
6
+ font-family: Arial, sans-serif;
7
+ background-color: #f4f4f4;
8
+ margin: 0;
9
+ padding: 0;
10
+ }
11
+ .container {
12
+ width: 100%;
13
+ max-width: 600px;
14
+ margin: 0 auto;
15
+ background-color: #ffffff;
16
+ padding: 20px;
17
+ border-radius: 8px;
18
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
19
+ }
20
+ .header {
21
+ text-align: center;
22
+ padding: 10px 0;
23
+ }
24
+ .header h2 {
25
+ margin: 0;
26
+ color: #333333;
27
+ }
28
+ .content {
29
+ padding: 20px;
30
+ line-height: 1.6;
31
+ color: #555555;
32
+ }
33
+ .content p {
34
+ margin: 0 0 10px;
35
+ }
36
+ .button {
37
+ display: block;
38
+ width: 200px;
39
+ margin: 20px auto;
40
+ padding: 10px;
41
+ text-align: center;
42
+ background-color: #007bff;
43
+ color: #ffffff !important;
44
+ text-decoration: none;
45
+ border-radius: 5px;
46
+ }
47
+ </style>
48
+ </head>
49
+ <body>
50
+ <div class="container">
51
+ <div class="header">
52
+ <h2>Reset Your Atomic CRM Password</h2>
53
+ </div>
54
+ <div class="content">
55
+ <p>Hello,</p>
56
+ <p>
57
+ We've received a request to reset the password for the Atomic CRM
58
+ account associated with the email {{ .Email }}. No changes have been
59
+ made to your account yet.
60
+ </p>
61
+ <p>You can reset your password by clicking the button below.</p>
62
+ <p>
63
+ <a href="{{ .ConfirmationURL }}auth-callback.html" class="button"
64
+ >Reset your password</a
65
+ >
66
+ </p>
67
+ <p>
68
+ If you did not request a new password, please contact the Atomic CRM
69
+ administrator immediately.
70
+ </p>
71
+ <p>The Atomic CRM team</p>
72
+ </div>
73
+ </div>
74
+ </body>
75
+ </html>