@aglyn/plugins-crm 1.0.0-beta.143

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 (669) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +7 -0
  3. package/package.json +57 -0
  4. package/src/index.d.ts +21 -0
  5. package/src/index.js +29 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/components/activity-list.d.ts +98 -0
  8. package/src/lib/components/activity-list.js +321 -0
  9. package/src/lib/components/activity-list.js.map +1 -0
  10. package/src/lib/components/activity-queries.d.ts +117 -0
  11. package/src/lib/components/activity-queries.js +198 -0
  12. package/src/lib/components/activity-queries.js.map +1 -0
  13. package/src/lib/components/add-to-list-button.d.ts +25 -0
  14. package/src/lib/components/add-to-list-button.js +64 -0
  15. package/src/lib/components/add-to-list-button.js.map +1 -0
  16. package/src/lib/components/add-to-list-dialog.d.ts +24 -0
  17. package/src/lib/components/add-to-list-dialog.js +327 -0
  18. package/src/lib/components/add-to-list-dialog.js.map +1 -0
  19. package/src/lib/components/assignment-rule-drawer.d.ts +43 -0
  20. package/src/lib/components/assignment-rule-drawer.js +293 -0
  21. package/src/lib/components/assignment-rule-drawer.js.map +1 -0
  22. package/src/lib/components/companies-bulk-bar.d.ts +29 -0
  23. package/src/lib/components/companies-bulk-bar.js +274 -0
  24. package/src/lib/components/companies-bulk-bar.js.map +1 -0
  25. package/src/lib/components/companies-section.d.ts +54 -0
  26. package/src/lib/components/companies-section.js +522 -0
  27. package/src/lib/components/companies-section.js.map +1 -0
  28. package/src/lib/components/company-contacts-card.d.ts +49 -0
  29. package/src/lib/components/company-contacts-card.js +435 -0
  30. package/src/lib/components/company-contacts-card.js.map +1 -0
  31. package/src/lib/components/company-deals-card.d.ts +20 -0
  32. package/src/lib/components/company-deals-card.js +38 -0
  33. package/src/lib/components/company-deals-card.js.map +1 -0
  34. package/src/lib/components/company-detail-page.d.ts +20 -0
  35. package/src/lib/components/company-detail-page.js +165 -0
  36. package/src/lib/components/company-detail-page.js.map +1 -0
  37. package/src/lib/components/company-edit-drawer.d.ts +65 -0
  38. package/src/lib/components/company-edit-drawer.js +433 -0
  39. package/src/lib/components/company-edit-drawer.js.map +1 -0
  40. package/src/lib/components/company-import-drawer.d.ts +42 -0
  41. package/src/lib/components/company-import-drawer.js +99 -0
  42. package/src/lib/components/company-import-drawer.js.map +1 -0
  43. package/src/lib/components/company-picker.d.ts +127 -0
  44. package/src/lib/components/company-picker.js +323 -0
  45. package/src/lib/components/company-picker.js.map +1 -0
  46. package/src/lib/components/company-properties-card.d.ts +47 -0
  47. package/src/lib/components/company-properties-card.js +289 -0
  48. package/src/lib/components/company-properties-card.js.map +1 -0
  49. package/src/lib/components/contact-address-fields.d.ts +29 -0
  50. package/src/lib/components/contact-address-fields.js +149 -0
  51. package/src/lib/components/contact-address-fields.js.map +1 -0
  52. package/src/lib/components/contact-associations-card.d.ts +72 -0
  53. package/src/lib/components/contact-associations-card.js +296 -0
  54. package/src/lib/components/contact-associations-card.js.map +1 -0
  55. package/src/lib/components/contact-custom-columns.d.ts +38 -0
  56. package/src/lib/components/contact-custom-columns.js +102 -0
  57. package/src/lib/components/contact-custom-columns.js.map +1 -0
  58. package/src/lib/components/contact-custom-fields-card.d.ts +39 -0
  59. package/src/lib/components/contact-custom-fields-card.js +204 -0
  60. package/src/lib/components/contact-custom-fields-card.js.map +1 -0
  61. package/src/lib/components/contact-deals-card.d.ts +20 -0
  62. package/src/lib/components/contact-deals-card.js +38 -0
  63. package/src/lib/components/contact-deals-card.js.map +1 -0
  64. package/src/lib/components/contact-detail-page.d.ts +46 -0
  65. package/src/lib/components/contact-detail-page.js +535 -0
  66. package/src/lib/components/contact-detail-page.js.map +1 -0
  67. package/src/lib/components/contact-duplicates-card.d.ts +42 -0
  68. package/src/lib/components/contact-duplicates-card.js +167 -0
  69. package/src/lib/components/contact-duplicates-card.js.map +1 -0
  70. package/src/lib/components/contact-field-drawer.d.ts +64 -0
  71. package/src/lib/components/contact-field-drawer.js +251 -0
  72. package/src/lib/components/contact-field-drawer.js.map +1 -0
  73. package/src/lib/components/contact-import-drawer.d.ts +46 -0
  74. package/src/lib/components/contact-import-drawer.js +149 -0
  75. package/src/lib/components/contact-import-drawer.js.map +1 -0
  76. package/src/lib/components/contact-known-by-card.d.ts +39 -0
  77. package/src/lib/components/contact-known-by-card.js +142 -0
  78. package/src/lib/components/contact-known-by-card.js.map +1 -0
  79. package/src/lib/components/contact-list-columns.d.ts +53 -0
  80. package/src/lib/components/contact-list-columns.js +288 -0
  81. package/src/lib/components/contact-list-columns.js.map +1 -0
  82. package/src/lib/components/contact-merge-dialog.d.ts +79 -0
  83. package/src/lib/components/contact-merge-dialog.js +405 -0
  84. package/src/lib/components/contact-merge-dialog.js.map +1 -0
  85. package/src/lib/components/contact-properties-card.d.ts +89 -0
  86. package/src/lib/components/contact-properties-card.js +492 -0
  87. package/src/lib/components/contact-properties-card.js.map +1 -0
  88. package/src/lib/components/contact-timeline-card.d.ts +68 -0
  89. package/src/lib/components/contact-timeline-card.js +435 -0
  90. package/src/lib/components/contact-timeline-card.js.map +1 -0
  91. package/src/lib/components/contacts-bulk-bar.d.ts +91 -0
  92. package/src/lib/components/contacts-bulk-bar.js +493 -0
  93. package/src/lib/components/contacts-bulk-bar.js.map +1 -0
  94. package/src/lib/components/contacts-section.d.ts +26 -0
  95. package/src/lib/components/contacts-section.js +1025 -0
  96. package/src/lib/components/contacts-section.js.map +1 -0
  97. package/src/lib/components/copy-capture-address-button.d.ts +33 -0
  98. package/src/lib/components/copy-capture-address-button.js +60 -0
  99. package/src/lib/components/copy-capture-address-button.js.map +1 -0
  100. package/src/lib/components/crm-attribution-zone.d.ts +38 -0
  101. package/src/lib/components/crm-attribution-zone.js +36 -0
  102. package/src/lib/components/crm-attribution-zone.js.map +1 -0
  103. package/src/lib/components/crm-booking-zone.d.ts +61 -0
  104. package/src/lib/components/crm-booking-zone.js +50 -0
  105. package/src/lib/components/crm-booking-zone.js.map +1 -0
  106. package/src/lib/components/crm-bulk-bar-frame.d.ts +47 -0
  107. package/src/lib/components/crm-bulk-bar-frame.js +137 -0
  108. package/src/lib/components/crm-bulk-bar-frame.js.map +1 -0
  109. package/src/lib/components/crm-call-actions.d.ts +65 -0
  110. package/src/lib/components/crm-call-actions.js +110 -0
  111. package/src/lib/components/crm-call-actions.js.map +1 -0
  112. package/src/lib/components/crm-column-menu.d.ts +21 -0
  113. package/src/lib/components/crm-column-menu.js +103 -0
  114. package/src/lib/components/crm-column-menu.js.map +1 -0
  115. package/src/lib/components/crm-console-page.d.ts +19 -0
  116. package/src/lib/components/crm-console-page.js +151 -0
  117. package/src/lib/components/crm-console-page.js.map +1 -0
  118. package/src/lib/components/crm-console-sections.d.ts +52 -0
  119. package/src/lib/components/crm-console-sections.js +83 -0
  120. package/src/lib/components/crm-console-sections.js.map +1 -0
  121. package/src/lib/components/crm-custom-field-control.d.ts +26 -0
  122. package/src/lib/components/crm-custom-field-control.js +131 -0
  123. package/src/lib/components/crm-custom-field-control.js.map +1 -0
  124. package/src/lib/components/crm-email-template-tools.d.ts +69 -0
  125. package/src/lib/components/crm-email-template-tools.js +240 -0
  126. package/src/lib/components/crm-email-template-tools.js.map +1 -0
  127. package/src/lib/components/crm-export-all-button.d.ts +39 -0
  128. package/src/lib/components/crm-export-all-button.js +98 -0
  129. package/src/lib/components/crm-export-all-button.js.map +1 -0
  130. package/src/lib/components/crm-filter-bar.d.ts +53 -0
  131. package/src/lib/components/crm-filter-bar.js +294 -0
  132. package/src/lib/components/crm-filter-bar.js.map +1 -0
  133. package/src/lib/components/crm-glance-card.d.ts +54 -0
  134. package/src/lib/components/crm-glance-card.js +219 -0
  135. package/src/lib/components/crm-glance-card.js.map +1 -0
  136. package/src/lib/components/crm-next-activity-column.d.ts +35 -0
  137. package/src/lib/components/crm-next-activity-column.js +100 -0
  138. package/src/lib/components/crm-next-activity-column.js.map +1 -0
  139. package/src/lib/components/crm-record-header.d.ts +97 -0
  140. package/src/lib/components/crm-record-header.js +160 -0
  141. package/src/lib/components/crm-record-header.js.map +1 -0
  142. package/src/lib/components/crm-record-insights-zone.d.ts +50 -0
  143. package/src/lib/components/crm-record-insights-zone.js +169 -0
  144. package/src/lib/components/crm-record-insights-zone.js.map +1 -0
  145. package/src/lib/components/crm-record-picker.d.ts +42 -0
  146. package/src/lib/components/crm-record-picker.js +104 -0
  147. package/src/lib/components/crm-record-picker.js.map +1 -0
  148. package/src/lib/components/crm-send-email-button.d.ts +39 -0
  149. package/src/lib/components/crm-send-email-button.js +81 -0
  150. package/src/lib/components/crm-send-email-button.js.map +1 -0
  151. package/src/lib/components/crm-send-email-dialog.d.ts +61 -0
  152. package/src/lib/components/crm-send-email-dialog.js +851 -0
  153. package/src/lib/components/crm-send-email-dialog.js.map +1 -0
  154. package/src/lib/components/crm-site-picker.d.ts +61 -0
  155. package/src/lib/components/crm-site-picker.js +99 -0
  156. package/src/lib/components/crm-site-picker.js.map +1 -0
  157. package/src/lib/components/crm-suite-lock.d.ts +29 -0
  158. package/src/lib/components/crm-suite-lock.js +114 -0
  159. package/src/lib/components/crm-suite-lock.js.map +1 -0
  160. package/src/lib/components/crm-tasks-due-card.d.ts +42 -0
  161. package/src/lib/components/crm-tasks-due-card.js +225 -0
  162. package/src/lib/components/crm-tasks-due-card.js.map +1 -0
  163. package/src/lib/components/crm-views-control.d.ts +65 -0
  164. package/src/lib/components/crm-views-control.js +518 -0
  165. package/src/lib/components/crm-views-control.js.map +1 -0
  166. package/src/lib/components/csv-import-drawer.d.ts +132 -0
  167. package/src/lib/components/csv-import-drawer.js +746 -0
  168. package/src/lib/components/csv-import-drawer.js.map +1 -0
  169. package/src/lib/components/deal-board.d.ts +70 -0
  170. package/src/lib/components/deal-board.js +478 -0
  171. package/src/lib/components/deal-board.js.map +1 -0
  172. package/src/lib/components/deal-detail-page.d.ts +18 -0
  173. package/src/lib/components/deal-detail-page.js +323 -0
  174. package/src/lib/components/deal-detail-page.js.map +1 -0
  175. package/src/lib/components/deal-edit-drawer.d.ts +59 -0
  176. package/src/lib/components/deal-edit-drawer.js +640 -0
  177. package/src/lib/components/deal-edit-drawer.js.map +1 -0
  178. package/src/lib/components/deal-import-drawer.d.ts +24 -0
  179. package/src/lib/components/deal-import-drawer.js +83 -0
  180. package/src/lib/components/deal-import-drawer.js.map +1 -0
  181. package/src/lib/components/deal-products-card.d.ts +48 -0
  182. package/src/lib/components/deal-products-card.js +614 -0
  183. package/src/lib/components/deal-products-card.js.map +1 -0
  184. package/src/lib/components/deal-properties-card.d.ts +29 -0
  185. package/src/lib/components/deal-properties-card.js +144 -0
  186. package/src/lib/components/deal-properties-card.js.map +1 -0
  187. package/src/lib/components/deal-stage-card.d.ts +24 -0
  188. package/src/lib/components/deal-stage-card.js +199 -0
  189. package/src/lib/components/deal-stage-card.js.map +1 -0
  190. package/src/lib/components/deals-bulk-bar.d.ts +31 -0
  191. package/src/lib/components/deals-bulk-bar.js +340 -0
  192. package/src/lib/components/deals-bulk-bar.js.map +1 -0
  193. package/src/lib/components/deals-section.d.ts +49 -0
  194. package/src/lib/components/deals-section.js +767 -0
  195. package/src/lib/components/deals-section.js.map +1 -0
  196. package/src/lib/components/email-capture-card.d.ts +42 -0
  197. package/src/lib/components/email-capture-card.js +134 -0
  198. package/src/lib/components/email-capture-card.js.map +1 -0
  199. package/src/lib/components/email-template-drawer.d.ts +33 -0
  200. package/src/lib/components/email-template-drawer.js +209 -0
  201. package/src/lib/components/email-template-drawer.js.map +1 -0
  202. package/src/lib/components/email-templates-card.d.ts +33 -0
  203. package/src/lib/components/email-templates-card.js +370 -0
  204. package/src/lib/components/email-templates-card.js.map +1 -0
  205. package/src/lib/components/erase-person-action.d.ts +92 -0
  206. package/src/lib/components/erase-person-action.js +261 -0
  207. package/src/lib/components/erase-person-action.js.map +1 -0
  208. package/src/lib/components/fields-section.d.ts +37 -0
  209. package/src/lib/components/fields-section.js +641 -0
  210. package/src/lib/components/fields-section.js.map +1 -0
  211. package/src/lib/components/form-contact-fields-card.d.ts +46 -0
  212. package/src/lib/components/form-contact-fields-card.js +253 -0
  213. package/src/lib/components/form-contact-fields-card.js.map +1 -0
  214. package/src/lib/components/insert-link-at-caret.d.ts +28 -0
  215. package/src/lib/components/insert-link-at-caret.js +37 -0
  216. package/src/lib/components/insert-link-at-caret.js.map +1 -0
  217. package/src/lib/components/lead-convert-dialog.d.ts +32 -0
  218. package/src/lib/components/lead-convert-dialog.js +493 -0
  219. package/src/lib/components/lead-convert-dialog.js.map +1 -0
  220. package/src/lib/components/lead-detail-page.d.ts +16 -0
  221. package/src/lib/components/lead-detail-page.js +163 -0
  222. package/src/lib/components/lead-detail-page.js.map +1 -0
  223. package/src/lib/components/lead-history-card.d.ts +32 -0
  224. package/src/lib/components/lead-history-card.js +165 -0
  225. package/src/lib/components/lead-history-card.js.map +1 -0
  226. package/src/lib/components/lead-import-drawer.d.ts +24 -0
  227. package/src/lib/components/lead-import-drawer.js +95 -0
  228. package/src/lib/components/lead-import-drawer.js.map +1 -0
  229. package/src/lib/components/lead-owner-select.d.ts +35 -0
  230. package/src/lib/components/lead-owner-select.js +91 -0
  231. package/src/lib/components/lead-owner-select.js.map +1 -0
  232. package/src/lib/components/lead-properties-card.d.ts +61 -0
  233. package/src/lib/components/lead-properties-card.js +395 -0
  234. package/src/lib/components/lead-properties-card.js.map +1 -0
  235. package/src/lib/components/lead-status-chip.d.ts +12 -0
  236. package/src/lib/components/lead-status-chip.js +43 -0
  237. package/src/lib/components/lead-status-chip.js.map +1 -0
  238. package/src/lib/components/lead-surfaces-note.d.ts +126 -0
  239. package/src/lib/components/lead-surfaces-note.js +262 -0
  240. package/src/lib/components/lead-surfaces-note.js.map +1 -0
  241. package/src/lib/components/lead-unqualify-dialog.d.ts +24 -0
  242. package/src/lib/components/lead-unqualify-dialog.js +125 -0
  243. package/src/lib/components/lead-unqualify-dialog.js.map +1 -0
  244. package/src/lib/components/leads-bulk-bar.d.ts +58 -0
  245. package/src/lib/components/leads-bulk-bar.js +307 -0
  246. package/src/lib/components/leads-bulk-bar.js.map +1 -0
  247. package/src/lib/components/leads-section.d.ts +23 -0
  248. package/src/lib/components/leads-section.js +664 -0
  249. package/src/lib/components/leads-section.js.map +1 -0
  250. package/src/lib/components/linked-deals-card.d.ts +32 -0
  251. package/src/lib/components/linked-deals-card.js +163 -0
  252. package/src/lib/components/linked-deals-card.js.map +1 -0
  253. package/src/lib/components/log-activity-dialog.d.ts +60 -0
  254. package/src/lib/components/log-activity-dialog.js +368 -0
  255. package/src/lib/components/log-activity-dialog.js.map +1 -0
  256. package/src/lib/components/lost-reason-dialog.d.ts +26 -0
  257. package/src/lib/components/lost-reason-dialog.js +95 -0
  258. package/src/lib/components/lost-reason-dialog.js.map +1 -0
  259. package/src/lib/components/new-contact-drawer.d.ts +78 -0
  260. package/src/lib/components/new-contact-drawer.js +343 -0
  261. package/src/lib/components/new-contact-drawer.js.map +1 -0
  262. package/src/lib/components/org-lead-surfaces-note.d.ts +57 -0
  263. package/src/lib/components/org-lead-surfaces-note.js +172 -0
  264. package/src/lib/components/org-lead-surfaces-note.js.map +1 -0
  265. package/src/lib/components/owner-avatar.d.ts +18 -0
  266. package/src/lib/components/owner-avatar.js +61 -0
  267. package/src/lib/components/owner-avatar.js.map +1 -0
  268. package/src/lib/components/pipeline-stages-dialog.d.ts +43 -0
  269. package/src/lib/components/pipeline-stages-dialog.js +339 -0
  270. package/src/lib/components/pipeline-stages-dialog.js.map +1 -0
  271. package/src/lib/components/pipelines-dialog.d.ts +55 -0
  272. package/src/lib/components/pipelines-dialog.js +517 -0
  273. package/src/lib/components/pipelines-dialog.js.map +1 -0
  274. package/src/lib/components/recent-activity-feed.d.ts +39 -0
  275. package/src/lib/components/recent-activity-feed.js +103 -0
  276. package/src/lib/components/recent-activity-feed.js.map +1 -0
  277. package/src/lib/components/recipes-card.d.ts +39 -0
  278. package/src/lib/components/recipes-card.js +485 -0
  279. package/src/lib/components/recipes-card.js.map +1 -0
  280. package/src/lib/components/record-activity-card.d.ts +26 -0
  281. package/src/lib/components/record-activity-card.js +121 -0
  282. package/src/lib/components/record-activity-card.js.map +1 -0
  283. package/src/lib/components/record-files-card.d.ts +67 -0
  284. package/src/lib/components/record-files-card.js +290 -0
  285. package/src/lib/components/record-files-card.js.map +1 -0
  286. package/src/lib/components/record-tasks-card.d.ts +32 -0
  287. package/src/lib/components/record-tasks-card.js +306 -0
  288. package/src/lib/components/record-tasks-card.js.map +1 -0
  289. package/src/lib/components/reports/activity-card.d.ts +57 -0
  290. package/src/lib/components/reports/activity-card.js +281 -0
  291. package/src/lib/components/reports/activity-card.js.map +1 -0
  292. package/src/lib/components/reports/closed-deals-card.d.ts +20 -0
  293. package/src/lib/components/reports/closed-deals-card.js +194 -0
  294. package/src/lib/components/reports/closed-deals-card.js.map +1 -0
  295. package/src/lib/components/reports/contacts-mix-card.d.ts +27 -0
  296. package/src/lib/components/reports/contacts-mix-card.js +161 -0
  297. package/src/lib/components/reports/contacts-mix-card.js.map +1 -0
  298. package/src/lib/components/reports/contacts-trend-card.d.ts +31 -0
  299. package/src/lib/components/reports/contacts-trend-card.js +144 -0
  300. package/src/lib/components/reports/contacts-trend-card.js.map +1 -0
  301. package/src/lib/components/reports/forecast-card.d.ts +22 -0
  302. package/src/lib/components/reports/forecast-card.js +251 -0
  303. package/src/lib/components/reports/forecast-card.js.map +1 -0
  304. package/src/lib/components/reports/lead-counts.d.ts +32 -0
  305. package/src/lib/components/reports/lead-counts.js +44 -0
  306. package/src/lib/components/reports/lead-counts.js.map +1 -0
  307. package/src/lib/components/reports/lead-funnel-card.d.ts +38 -0
  308. package/src/lib/components/reports/lead-funnel-card.js +375 -0
  309. package/src/lib/components/reports/lead-funnel-card.js.map +1 -0
  310. package/src/lib/components/reports/pipeline-card.d.ts +19 -0
  311. package/src/lib/components/reports/pipeline-card.js +338 -0
  312. package/src/lib/components/reports/pipeline-card.js.map +1 -0
  313. package/src/lib/components/reports/report-bar-chart.d.ts +39 -0
  314. package/src/lib/components/reports/report-bar-chart.js +133 -0
  315. package/src/lib/components/reports/report-bar-chart.js.map +1 -0
  316. package/src/lib/components/reports/report-breakdown.d.ts +32 -0
  317. package/src/lib/components/reports/report-breakdown.js +105 -0
  318. package/src/lib/components/reports/report-breakdown.js.map +1 -0
  319. package/src/lib/components/reports/report-export.d.ts +37 -0
  320. package/src/lib/components/reports/report-export.js +66 -0
  321. package/src/lib/components/reports/report-export.js.map +1 -0
  322. package/src/lib/components/reports/report-format.d.ts +36 -0
  323. package/src/lib/components/reports/report-format.js +43 -0
  324. package/src/lib/components/reports/report-format.js.map +1 -0
  325. package/src/lib/components/reports/report-scope.d.ts +81 -0
  326. package/src/lib/components/reports/report-scope.js +58 -0
  327. package/src/lib/components/reports/report-scope.js.map +1 -0
  328. package/src/lib/components/reports/report-stat-tile.d.ts +47 -0
  329. package/src/lib/components/reports/report-stat-tile.js +96 -0
  330. package/src/lib/components/reports/report-stat-tile.js.map +1 -0
  331. package/src/lib/components/reports/source-conversion-card.d.ts +28 -0
  332. package/src/lib/components/reports/source-conversion-card.js +205 -0
  333. package/src/lib/components/reports/source-conversion-card.js.map +1 -0
  334. package/src/lib/components/reports/tasks-card.d.ts +26 -0
  335. package/src/lib/components/reports/tasks-card.js +279 -0
  336. package/src/lib/components/reports/tasks-card.js.map +1 -0
  337. package/src/lib/components/reports/use-aggregate-read.d.ts +99 -0
  338. package/src/lib/components/reports/use-aggregate-read.js +195 -0
  339. package/src/lib/components/reports/use-aggregate-read.js.map +1 -0
  340. package/src/lib/components/reports/won-lost-by-owner-card.d.ts +30 -0
  341. package/src/lib/components/reports/won-lost-by-owner-card.js +168 -0
  342. package/src/lib/components/reports/won-lost-by-owner-card.js.map +1 -0
  343. package/src/lib/components/reports-section.d.ts +42 -0
  344. package/src/lib/components/reports-section.js +308 -0
  345. package/src/lib/components/reports-section.js.map +1 -0
  346. package/src/lib/components/sending-addresses-card.d.ts +49 -0
  347. package/src/lib/components/sending-addresses-card.js +262 -0
  348. package/src/lib/components/sending-addresses-card.js.map +1 -0
  349. package/src/lib/components/settings-section.d.ts +151 -0
  350. package/src/lib/components/settings-section.js +783 -0
  351. package/src/lib/components/settings-section.js.map +1 -0
  352. package/src/lib/components/task-cells.d.ts +51 -0
  353. package/src/lib/components/task-cells.js +139 -0
  354. package/src/lib/components/task-cells.js.map +1 -0
  355. package/src/lib/components/task-edit-drawer.d.ts +53 -0
  356. package/src/lib/components/task-edit-drawer.js +483 -0
  357. package/src/lib/components/task-edit-drawer.js.map +1 -0
  358. package/src/lib/components/task-import-drawer.d.ts +24 -0
  359. package/src/lib/components/task-import-drawer.js +82 -0
  360. package/src/lib/components/task-import-drawer.js.map +1 -0
  361. package/src/lib/components/task-snooze-menu.d.ts +65 -0
  362. package/src/lib/components/task-snooze-menu.js +207 -0
  363. package/src/lib/components/task-snooze-menu.js.map +1 -0
  364. package/src/lib/components/tasks-bulk-bar.d.ts +25 -0
  365. package/src/lib/components/tasks-bulk-bar.js +348 -0
  366. package/src/lib/components/tasks-bulk-bar.js.map +1 -0
  367. package/src/lib/components/tasks-calendar.d.ts +38 -0
  368. package/src/lib/components/tasks-calendar.js +228 -0
  369. package/src/lib/components/tasks-calendar.js.map +1 -0
  370. package/src/lib/components/tasks-section.d.ts +27 -0
  371. package/src/lib/components/tasks-section.js +579 -0
  372. package/src/lib/components/tasks-section.js.map +1 -0
  373. package/src/lib/components/use-contact-campaign-emails.d.ts +32 -0
  374. package/src/lib/components/use-contact-campaign-emails.js +83 -0
  375. package/src/lib/components/use-contact-campaign-emails.js.map +1 -0
  376. package/src/lib/components/use-crm-api.d.ts +44 -0
  377. package/src/lib/components/use-crm-api.js +84 -0
  378. package/src/lib/components/use-crm-api.js.map +1 -0
  379. package/src/lib/components/use-crm-inbound-address.d.ts +60 -0
  380. package/src/lib/components/use-crm-inbound-address.js +124 -0
  381. package/src/lib/components/use-crm-inbound-address.js.map +1 -0
  382. package/src/lib/components/use-emails-hub-path.d.ts +24 -0
  383. package/src/lib/components/use-emails-hub-path.js +59 -0
  384. package/src/lib/components/use-emails-hub-path.js.map +1 -0
  385. package/src/lib/components/use-member-email-aliases.d.ts +54 -0
  386. package/src/lib/components/use-member-email-aliases.js +186 -0
  387. package/src/lib/components/use-member-email-aliases.js.map +1 -0
  388. package/src/lib/components/use-org-members.d.ts +40 -0
  389. package/src/lib/components/use-org-members.js +100 -0
  390. package/src/lib/components/use-org-members.js.map +1 -0
  391. package/src/lib/constants/api-routes.d.ts +109 -0
  392. package/src/lib/constants/api-routes.js +74 -0
  393. package/src/lib/constants/api-routes.js.map +1 -0
  394. package/src/lib/constants/bundle-common.d.ts +14 -0
  395. package/src/lib/constants/bundle-common.js +14 -0
  396. package/src/lib/constants/bundle-common.js.map +1 -0
  397. package/src/lib/constants/company-filters.d.ts +18 -0
  398. package/src/lib/constants/company-filters.js +51 -0
  399. package/src/lib/constants/company-filters.js.map +1 -0
  400. package/src/lib/constants/contact-filters.d.ts +38 -0
  401. package/src/lib/constants/contact-filters.js +294 -0
  402. package/src/lib/constants/contact-filters.js.map +1 -0
  403. package/src/lib/hooks/use-contact-field-definitions.d.ts +48 -0
  404. package/src/lib/hooks/use-contact-field-definitions.js +72 -0
  405. package/src/lib/hooks/use-contact-field-definitions.js.map +1 -0
  406. package/src/lib/hooks/use-contact-update.d.ts +25 -0
  407. package/src/lib/hooks/use-contact-update.js +80 -0
  408. package/src/lib/hooks/use-contact-update.js.map +1 -0
  409. package/src/lib/hooks/use-crm-activity-logger.d.ts +73 -0
  410. package/src/lib/hooks/use-crm-activity-logger.js +101 -0
  411. package/src/lib/hooks/use-crm-activity-logger.js.map +1 -0
  412. package/src/lib/hooks/use-crm-bulk-apply.d.ts +52 -0
  413. package/src/lib/hooks/use-crm-bulk-apply.js +112 -0
  414. package/src/lib/hooks/use-crm-bulk-apply.js.map +1 -0
  415. package/src/lib/hooks/use-crm-default-view.d.ts +24 -0
  416. package/src/lib/hooks/use-crm-default-view.js +64 -0
  417. package/src/lib/hooks/use-crm-default-view.js.map +1 -0
  418. package/src/lib/hooks/use-crm-email-templates.d.ts +59 -0
  419. package/src/lib/hooks/use-crm-email-templates.js +103 -0
  420. package/src/lib/hooks/use-crm-email-templates.js.map +1 -0
  421. package/src/lib/hooks/use-crm-hub-path.d.ts +29 -0
  422. package/src/lib/hooks/use-crm-hub-path.js +41 -0
  423. package/src/lib/hooks/use-crm-hub-path.js.map +1 -0
  424. package/src/lib/hooks/use-crm-org-mount.d.ts +97 -0
  425. package/src/lib/hooks/use-crm-org-mount.js +215 -0
  426. package/src/lib/hooks/use-crm-org-mount.js.map +1 -0
  427. package/src/lib/hooks/use-crm-record-names.d.ts +52 -0
  428. package/src/lib/hooks/use-crm-record-names.js +126 -0
  429. package/src/lib/hooks/use-crm-record-names.js.map +1 -0
  430. package/src/lib/hooks/use-crm-records-quota.d.ts +68 -0
  431. package/src/lib/hooks/use-crm-records-quota.js +118 -0
  432. package/src/lib/hooks/use-crm-records-quota.js.map +1 -0
  433. package/src/lib/hooks/use-crm-saved-view.d.ts +96 -0
  434. package/src/lib/hooks/use-crm-saved-view.js +329 -0
  435. package/src/lib/hooks/use-crm-saved-view.js.map +1 -0
  436. package/src/lib/hooks/use-crm-scope.d.ts +117 -0
  437. package/src/lib/hooks/use-crm-scope.js +147 -0
  438. package/src/lib/hooks/use-crm-scope.js.map +1 -0
  439. package/src/lib/hooks/use-crm-tasks.d.ts +85 -0
  440. package/src/lib/hooks/use-crm-tasks.js +153 -0
  441. package/src/lib/hooks/use-crm-tasks.js.map +1 -0
  442. package/src/lib/hooks/use-crm-view-grid.d.ts +55 -0
  443. package/src/lib/hooks/use-crm-view-grid.js +170 -0
  444. package/src/lib/hooks/use-crm-view-grid.js.map +1 -0
  445. package/src/lib/hooks/use-crm-views.d.ts +42 -0
  446. package/src/lib/hooks/use-crm-views.js +84 -0
  447. package/src/lib/hooks/use-crm-views.js.map +1 -0
  448. package/src/lib/hooks/use-deal-stage-api.d.ts +69 -0
  449. package/src/lib/hooks/use-deal-stage-api.js +78 -0
  450. package/src/lib/hooks/use-deal-stage-api.js.map +1 -0
  451. package/src/lib/hooks/use-deals.d.ts +47 -0
  452. package/src/lib/hooks/use-deals.js +105 -0
  453. package/src/lib/hooks/use-deals.js.map +1 -0
  454. package/src/lib/hooks/use-org-leads.d.ts +53 -0
  455. package/src/lib/hooks/use-org-leads.js +114 -0
  456. package/src/lib/hooks/use-org-leads.js.map +1 -0
  457. package/src/lib/hooks/use-org-member-directory.d.ts +36 -0
  458. package/src/lib/hooks/use-org-member-directory.js +116 -0
  459. package/src/lib/hooks/use-org-member-directory.js.map +1 -0
  460. package/src/lib/hooks/use-org-member-options.d.ts +38 -0
  461. package/src/lib/hooks/use-org-member-options.js +131 -0
  462. package/src/lib/hooks/use-org-member-options.js.map +1 -0
  463. package/src/lib/hooks/use-pipeline.d.ts +71 -0
  464. package/src/lib/hooks/use-pipeline.js +159 -0
  465. package/src/lib/hooks/use-pipeline.js.map +1 -0
  466. package/src/lib/model/companies-bulk-writes.d.ts +40 -0
  467. package/src/lib/model/companies-bulk-writes.js +103 -0
  468. package/src/lib/model/companies-bulk-writes.js.map +1 -0
  469. package/src/lib/model/companies-csv.d.ts +36 -0
  470. package/src/lib/model/companies-csv.js +38 -0
  471. package/src/lib/model/companies-csv.js.map +1 -0
  472. package/src/lib/model/companies.d.ts +99 -0
  473. package/src/lib/model/companies.js +168 -0
  474. package/src/lib/model/companies.js.map +1 -0
  475. package/src/lib/model/company-delete-route.d.ts +43 -0
  476. package/src/lib/model/company-delete-route.js +31 -0
  477. package/src/lib/model/company-delete-route.js.map +1 -0
  478. package/src/lib/model/company-delete.d.ts +42 -0
  479. package/src/lib/model/company-delete.js +52 -0
  480. package/src/lib/model/company-delete.js.map +1 -0
  481. package/src/lib/model/contact-duplicates.d.ts +58 -0
  482. package/src/lib/model/contact-duplicates.js +67 -0
  483. package/src/lib/model/contact-duplicates.js.map +1 -0
  484. package/src/lib/model/contact-record.d.ts +113 -0
  485. package/src/lib/model/contact-record.js +70 -0
  486. package/src/lib/model/contact-record.js.map +1 -0
  487. package/src/lib/model/contact-update.d.ts +93 -0
  488. package/src/lib/model/contact-update.js +50 -0
  489. package/src/lib/model/contact-update.js.map +1 -0
  490. package/src/lib/model/contacts-bulk-writes.d.ts +173 -0
  491. package/src/lib/model/contacts-bulk-writes.js +196 -0
  492. package/src/lib/model/contacts-bulk-writes.js.map +1 -0
  493. package/src/lib/model/contacts-csv.d.ts +54 -0
  494. package/src/lib/model/contacts-csv.js +67 -0
  495. package/src/lib/model/contacts-csv.js.map +1 -0
  496. package/src/lib/model/contacts-list-seed.d.ts +51 -0
  497. package/src/lib/model/contacts-list-seed.js +63 -0
  498. package/src/lib/model/contacts-list-seed.js.map +1 -0
  499. package/src/lib/model/crm-activity-report.d.ts +27 -0
  500. package/src/lib/model/crm-activity-report.js +56 -0
  501. package/src/lib/model/crm-activity-report.js.map +1 -0
  502. package/src/lib/model/crm-api.d.ts +49 -0
  503. package/src/lib/model/crm-api.js +47 -0
  504. package/src/lib/model/crm-api.js.map +1 -0
  505. package/src/lib/model/crm-bulk-writes.d.ts +147 -0
  506. package/src/lib/model/crm-bulk-writes.js +207 -0
  507. package/src/lib/model/crm-bulk-writes.js.map +1 -0
  508. package/src/lib/model/crm-company-import.d.ts +154 -0
  509. package/src/lib/model/crm-company-import.js +331 -0
  510. package/src/lib/model/crm-company-import.js.map +1 -0
  511. package/src/lib/model/crm-custom-draft.d.ts +62 -0
  512. package/src/lib/model/crm-custom-draft.js +67 -0
  513. package/src/lib/model/crm-custom-draft.js.map +1 -0
  514. package/src/lib/model/crm-deal-import.d.ts +112 -0
  515. package/src/lib/model/crm-deal-import.js +263 -0
  516. package/src/lib/model/crm-deal-import.js.map +1 -0
  517. package/src/lib/model/crm-import.d.ts +244 -0
  518. package/src/lib/model/crm-import.js +466 -0
  519. package/src/lib/model/crm-import.js.map +1 -0
  520. package/src/lib/model/crm-lead-import.d.ts +105 -0
  521. package/src/lib/model/crm-lead-import.js +255 -0
  522. package/src/lib/model/crm-lead-import.js.map +1 -0
  523. package/src/lib/model/crm-record-routes.d.ts +21 -0
  524. package/src/lib/model/crm-record-routes.js +70 -0
  525. package/src/lib/model/crm-record-routes.js.map +1 -0
  526. package/src/lib/model/crm-routes.d.ts +101 -0
  527. package/src/lib/model/crm-routes.js +92 -0
  528. package/src/lib/model/crm-routes.js.map +1 -0
  529. package/src/lib/model/crm-task-import.d.ts +94 -0
  530. package/src/lib/model/crm-task-import.js +275 -0
  531. package/src/lib/model/crm-task-import.js.map +1 -0
  532. package/src/lib/model/crm-view-param.d.ts +43 -0
  533. package/src/lib/model/crm-view-param.js +49 -0
  534. package/src/lib/model/crm-view-param.js.map +1 -0
  535. package/src/lib/model/deal-board-model.d.ts +241 -0
  536. package/src/lib/model/deal-board-model.js +439 -0
  537. package/src/lib/model/deal-board-model.js.map +1 -0
  538. package/src/lib/model/deal-form-model.d.ts +114 -0
  539. package/src/lib/model/deal-form-model.js +218 -0
  540. package/src/lib/model/deal-form-model.js.map +1 -0
  541. package/src/lib/model/deals-csv.d.ts +32 -0
  542. package/src/lib/model/deals-csv.js +37 -0
  543. package/src/lib/model/deals-csv.js.map +1 -0
  544. package/src/lib/model/import-column-shapes.d.ts +36 -0
  545. package/src/lib/model/import-column-shapes.js +76 -0
  546. package/src/lib/model/import-column-shapes.js.map +1 -0
  547. package/src/lib/model/lead-company-suggestion.d.ts +61 -0
  548. package/src/lib/model/lead-company-suggestion.js +65 -0
  549. package/src/lib/model/lead-company-suggestion.js.map +1 -0
  550. package/src/lib/model/lead-filters.d.ts +29 -0
  551. package/src/lib/model/lead-filters.js +39 -0
  552. package/src/lib/model/lead-filters.js.map +1 -0
  553. package/src/lib/model/lead-surfaces.d.ts +58 -0
  554. package/src/lib/model/lead-surfaces.js +67 -0
  555. package/src/lib/model/lead-surfaces.js.map +1 -0
  556. package/src/lib/model/leads-csv.d.ts +40 -0
  557. package/src/lib/model/leads-csv.js +40 -0
  558. package/src/lib/model/leads-csv.js.map +1 -0
  559. package/src/lib/model/next-activity-api.d.ts +31 -0
  560. package/src/lib/model/next-activity-api.js +57 -0
  561. package/src/lib/model/next-activity-api.js.map +1 -0
  562. package/src/lib/model/next-activity.d.ts +64 -0
  563. package/src/lib/model/next-activity.js +47 -0
  564. package/src/lib/model/next-activity.js.map +1 -0
  565. package/src/lib/model/person-key-web.d.ts +43 -0
  566. package/src/lib/model/person-key-web.js +52 -0
  567. package/src/lib/model/person-key-web.js.map +1 -0
  568. package/src/lib/model/record-facts.d.ts +282 -0
  569. package/src/lib/model/record-facts.js +434 -0
  570. package/src/lib/model/record-facts.js.map +1 -0
  571. package/src/lib/model/task-api.d.ts +28 -0
  572. package/src/lib/model/task-api.js +57 -0
  573. package/src/lib/model/task-api.js.map +1 -0
  574. package/src/lib/model/task-calendar.d.ts +108 -0
  575. package/src/lib/model/task-calendar.js +139 -0
  576. package/src/lib/model/task-calendar.js.map +1 -0
  577. package/src/lib/model/task-routes.d.ts +177 -0
  578. package/src/lib/model/task-routes.js +197 -0
  579. package/src/lib/model/task-routes.js.map +1 -0
  580. package/src/lib/model/task-scope.d.ts +45 -0
  581. package/src/lib/model/task-scope.js +51 -0
  582. package/src/lib/model/task-scope.js.map +1 -0
  583. package/src/lib/model/task-views.d.ts +149 -0
  584. package/src/lib/model/task-views.js +286 -0
  585. package/src/lib/model/task-views.js.map +1 -0
  586. package/src/lib/model/tasks-csv.d.ts +28 -0
  587. package/src/lib/model/tasks-csv.js +28 -0
  588. package/src/lib/model/tasks-csv.js.map +1 -0
  589. package/src/lib/plugin.d.ts +32 -0
  590. package/src/lib/plugin.js +208 -0
  591. package/src/lib/plugin.js.map +1 -0
  592. package/src/lib/server/companies-import.d.ts +57 -0
  593. package/src/lib/server/companies-import.js +242 -0
  594. package/src/lib/server/companies-import.js.map +1 -0
  595. package/src/lib/server/company-delete.d.ts +59 -0
  596. package/src/lib/server/company-delete.js +146 -0
  597. package/src/lib/server/company-delete.js.map +1 -0
  598. package/src/lib/server/contact-email-history.d.ts +82 -0
  599. package/src/lib/server/contact-email-history.js +264 -0
  600. package/src/lib/server/contact-email-history.js.map +1 -0
  601. package/src/lib/server/contact-profile.d.ts +41 -0
  602. package/src/lib/server/contact-profile.js +45 -0
  603. package/src/lib/server/contact-profile.js.map +1 -0
  604. package/src/lib/server/contact-update.d.ts +92 -0
  605. package/src/lib/server/contact-update.js +512 -0
  606. package/src/lib/server/contact-update.js.map +1 -0
  607. package/src/lib/server/contacts-import.d.ts +73 -0
  608. package/src/lib/server/contacts-import.js +263 -0
  609. package/src/lib/server/contacts-import.js.map +1 -0
  610. package/src/lib/server/contacts-merge.d.ts +86 -0
  611. package/src/lib/server/contacts-merge.js +206 -0
  612. package/src/lib/server/contacts-merge.js.map +1 -0
  613. package/src/lib/server/deals-import.d.ts +76 -0
  614. package/src/lib/server/deals-import.js +246 -0
  615. package/src/lib/server/deals-import.js.map +1 -0
  616. package/src/lib/server/email-send.d.ts +119 -0
  617. package/src/lib/server/email-send.js +667 -0
  618. package/src/lib/server/email-send.js.map +1 -0
  619. package/src/lib/server/email-template-duplicate.d.ts +19 -0
  620. package/src/lib/server/email-template-duplicate.js +206 -0
  621. package/src/lib/server/email-template-duplicate.js.map +1 -0
  622. package/src/lib/server/erase-person.d.ts +108 -0
  623. package/src/lib/server/erase-person.js +309 -0
  624. package/src/lib/server/erase-person.js.map +1 -0
  625. package/src/lib/server/import-context.d.ts +85 -0
  626. package/src/lib/server/import-context.js +181 -0
  627. package/src/lib/server/import-context.js.map +1 -0
  628. package/src/lib/server/inbound-address.d.ts +61 -0
  629. package/src/lib/server/inbound-address.js +188 -0
  630. package/src/lib/server/inbound-address.js.map +1 -0
  631. package/src/lib/server/lead-convert.d.ts +78 -0
  632. package/src/lib/server/lead-convert.js +250 -0
  633. package/src/lib/server/lead-convert.js.map +1 -0
  634. package/src/lib/server/leads-import.d.ts +84 -0
  635. package/src/lib/server/leads-import.js +261 -0
  636. package/src/lib/server/leads-import.js.map +1 -0
  637. package/src/lib/server/next-activity-routes.d.ts +33 -0
  638. package/src/lib/server/next-activity-routes.js +110 -0
  639. package/src/lib/server/next-activity-routes.js.map +1 -0
  640. package/src/lib/server/org-activity.d.ts +61 -0
  641. package/src/lib/server/org-activity.js +120 -0
  642. package/src/lib/server/org-activity.js.map +1 -0
  643. package/src/lib/server/org-caller.d.ts +110 -0
  644. package/src/lib/server/org-caller.js +154 -0
  645. package/src/lib/server/org-caller.js.map +1 -0
  646. package/src/lib/server/recipe-routes.d.ts +75 -0
  647. package/src/lib/server/recipe-routes.js +442 -0
  648. package/src/lib/server/recipe-routes.js.map +1 -0
  649. package/src/lib/server/record-facts.d.ts +65 -0
  650. package/src/lib/server/record-facts.js +337 -0
  651. package/src/lib/server/record-facts.js.map +1 -0
  652. package/src/lib/server/record-timeline.d.ts +51 -0
  653. package/src/lib/server/record-timeline.js +215 -0
  654. package/src/lib/server/record-timeline.js.map +1 -0
  655. package/src/lib/server/suite-gate.d.ts +42 -0
  656. package/src/lib/server/suite-gate.js +87 -0
  657. package/src/lib/server/suite-gate.js.map +1 -0
  658. package/src/lib/server/task-routes.d.ts +132 -0
  659. package/src/lib/server/task-routes.js +699 -0
  660. package/src/lib/server/task-routes.js.map +1 -0
  661. package/src/lib/server/tasks-import.d.ts +54 -0
  662. package/src/lib/server/tasks-import.js +157 -0
  663. package/src/lib/server/tasks-import.js.map +1 -0
  664. package/src/lib/server-deal-stage.d.ts +88 -0
  665. package/src/lib/server-deal-stage.js +316 -0
  666. package/src/lib/server-deal-stage.js.map +1 -0
  667. package/src/lib/server.d.ts +149 -0
  668. package/src/lib/server.js +615 -0
  669. package/src/lib/server.js.map +1 -0
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /**
17
+ * WHAT A FILE'S COLUMN HOLDS, WITHOUT SAYING WHAT IS IN IT (AGL-2917).
18
+ *
19
+ * The import drawer's `importMapping` zone tells a widget each column's header
20
+ * and one word for its values — an email address, a phone number, a date —
21
+ * and never a cell. The word is read here, in the browser, from the rows the
22
+ * drawer already parsed, so a widget that asks a model to match the columns
23
+ * has nothing of the file's people to pass on.
24
+ */ /** Non-empty cells a column's shape is read from. */ export const IMPORT_SHAPE_SAMPLE = 50;
25
+ /** Rows a column's cells are looked for in; past these a file says nothing new about its shape. */ export const IMPORT_SHAPE_ROWS = 500;
26
+ /** The share of those cells that must agree for a column to take a shape. */ export const IMPORT_SHAPE_AGREEMENT = 0.8;
27
+ const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
28
+ const YES_NO = /^(?:yes|no|y|n|true|false|opted in|opted out|subscribed|unsubscribed)$/i;
29
+ const NUMBER = /^[-+]?[$€£¥]?\s?(?:\d{1,3}(?:,\d{3})+|\d+)(?:\.\d+)?%?$/;
30
+ const DATE = /^(?:\d{4}-\d{1,2}-\d{1,2}(?:[T ][\d:.]+(?:Z|[+-]\d{2}:?\d{2})?)?|\d{1,2}[/.-]\d{1,2}[/.-]\d{2,4}|(?:\d{1,2}\s+)?(?:jan|feb|mar|apr|may|jun|jul|aug|sep|sept|oct|nov|dec)[a-z]*\.?\s+\d{1,2}(?:st|nd|rd|th)?,?\s+\d{4})$/i;
31
+ const PHONE = /^\+?[\d\s().-]{7,}$/;
32
+ const URL = /^(?:https?:\/\/)?(?:[\w-]+\.)+[a-z]{2,}(?:[/?#]\S*)?$/i;
33
+ const SHAPES = [
34
+ [
35
+ 'email',
36
+ (value)=>EMAIL.test(value)
37
+ ],
38
+ [
39
+ 'yes-no',
40
+ (value)=>YES_NO.test(value)
41
+ ],
42
+ [
43
+ 'date',
44
+ (value)=>DATE.test(value)
45
+ ],
46
+ [
47
+ 'number',
48
+ (value)=>NUMBER.test(value)
49
+ ],
50
+ [
51
+ 'phone',
52
+ (value)=>PHONE.test(value) && value.replace(/\D/g, '').length >= 7
53
+ ],
54
+ [
55
+ 'url',
56
+ (value)=>URL.test(value)
57
+ ]
58
+ ];
59
+ /** One column's shape, from its cells: the first shape most of them agree on, else `text`. */ export function importColumnShape(cells) {
60
+ const values = cells.map((cell)=>String(cell != null ? cell : '').trim()).filter(Boolean).slice(0, IMPORT_SHAPE_SAMPLE);
61
+ if (!values.length) return 'empty';
62
+ for (const [shape, test] of SHAPES){
63
+ const agreeing = values.filter(test).length;
64
+ if (agreeing / values.length >= IMPORT_SHAPE_AGREEMENT) return shape;
65
+ }
66
+ return 'text';
67
+ }
68
+ /** Every column of a parsed file: its header, and the shape of what the rows under it hold. */ export function importColumns(headers, rows) {
69
+ const sample = rows.slice(0, IMPORT_SHAPE_ROWS);
70
+ return headers.map((header, index)=>({
71
+ header: String(header != null ? header : '').trim(),
72
+ shape: importColumnShape(sample.map((row)=>row[index]))
73
+ }));
74
+ }
75
+
76
+ //# sourceMappingURL=import-column-shapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/import-column-shapes.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ConsoleImportColumn,\n ConsoleImportColumnShape,\n} from '@aglyn/aglyn/plugin-manager/record-zone-props'\n\n/**\n * WHAT A FILE'S COLUMN HOLDS, WITHOUT SAYING WHAT IS IN IT (AGL-2917).\n *\n * The import drawer's `importMapping` zone tells a widget each column's header\n * and one word for its values — an email address, a phone number, a date —\n * and never a cell. The word is read here, in the browser, from the rows the\n * drawer already parsed, so a widget that asks a model to match the columns\n * has nothing of the file's people to pass on.\n */\n\n/** Non-empty cells a column's shape is read from. */\nexport const IMPORT_SHAPE_SAMPLE = 50\n\n/** Rows a column's cells are looked for in; past these a file says nothing new about its shape. */\nexport const IMPORT_SHAPE_ROWS = 500\n\n/** The share of those cells that must agree for a column to take a shape. */\nexport const IMPORT_SHAPE_AGREEMENT = 0.8\n\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\nconst YES_NO = /^(?:yes|no|y|n|true|false|opted in|opted out|subscribed|unsubscribed)$/i\nconst NUMBER = /^[-+]?[$€£¥]?\\s?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?%?$/\nconst DATE =\n /^(?:\\d{4}-\\d{1,2}-\\d{1,2}(?:[T ][\\d:.]+(?:Z|[+-]\\d{2}:?\\d{2})?)?|\\d{1,2}[/.-]\\d{1,2}[/.-]\\d{2,4}|(?:\\d{1,2}\\s+)?(?:jan|feb|mar|apr|may|jun|jul|aug|sep|sept|oct|nov|dec)[a-z]*\\.?\\s+\\d{1,2}(?:st|nd|rd|th)?,?\\s+\\d{4})$/i\nconst PHONE = /^\\+?[\\d\\s().-]{7,}$/\nconst URL = /^(?:https?:\\/\\/)?(?:[\\w-]+\\.)+[a-z]{2,}(?:[/?#]\\S*)?$/i\n\nconst SHAPES: ReadonlyArray<[ConsoleImportColumnShape, (value: string) => boolean]> = [\n ['email', (value) => EMAIL.test(value)],\n ['yes-no', (value) => YES_NO.test(value)],\n ['date', (value) => DATE.test(value)],\n ['number', (value) => NUMBER.test(value)],\n ['phone', (value) => PHONE.test(value) && value.replace(/\\D/g, '').length >= 7],\n ['url', (value) => URL.test(value)],\n]\n\n/** One column's shape, from its cells: the first shape most of them agree on, else `text`. */\nexport function importColumnShape(cells: readonly unknown[]): ConsoleImportColumnShape {\n const values = cells\n .map((cell) => String(cell ?? '').trim())\n .filter(Boolean)\n .slice(0, IMPORT_SHAPE_SAMPLE)\n if (!values.length) return 'empty'\n for (const [shape, test] of SHAPES) {\n const agreeing = values.filter(test).length\n if (agreeing / values.length >= IMPORT_SHAPE_AGREEMENT) return shape\n }\n return 'text'\n}\n\n/** Every column of a parsed file: its header, and the shape of what the rows under it hold. */\nexport function importColumns(\n headers: readonly string[],\n rows: ReadonlyArray<readonly unknown[]>,\n): ConsoleImportColumn[] {\n const sample = rows.slice(0, IMPORT_SHAPE_ROWS)\n return headers.map((header, index) => ({\n header: String(header ?? '').trim(),\n shape: importColumnShape(sample.map((row) => row[index])),\n }))\n}\n"],"names":["IMPORT_SHAPE_SAMPLE","IMPORT_SHAPE_ROWS","IMPORT_SHAPE_AGREEMENT","EMAIL","YES_NO","NUMBER","DATE","PHONE","URL","SHAPES","value","test","replace","length","importColumnShape","cells","values","map","cell","String","trim","filter","Boolean","slice","shape","agreeing","importColumns","headers","rows","sample","header","index","row"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAOD;;;;;;;;CAQC,GAED,mDAAmD,GACnD,OAAO,MAAMA,sBAAsB,GAAE;AAErC,iGAAiG,GACjG,OAAO,MAAMC,oBAAoB,IAAG;AAEpC,2EAA2E,GAC3E,OAAO,MAAMC,yBAAyB,IAAG;AAEzC,MAAMC,QAAQ;AACd,MAAMC,SAAS;AACf,MAAMC,SAAS;AACf,MAAMC,OACJ;AACF,MAAMC,QAAQ;AACd,MAAMC,MAAM;AAEZ,MAAMC,SAAgF;IACpF;QAAC;QAAS,CAACC,QAAUP,MAAMQ,IAAI,CAACD;KAAO;IACvC;QAAC;QAAU,CAACA,QAAUN,OAAOO,IAAI,CAACD;KAAO;IACzC;QAAC;QAAQ,CAACA,QAAUJ,KAAKK,IAAI,CAACD;KAAO;IACrC;QAAC;QAAU,CAACA,QAAUL,OAAOM,IAAI,CAACD;KAAO;IACzC;QAAC;QAAS,CAACA,QAAUH,MAAMI,IAAI,CAACD,UAAUA,MAAME,OAAO,CAAC,OAAO,IAAIC,MAAM,IAAI;KAAE;IAC/E;QAAC;QAAO,CAACH,QAAUF,IAAIG,IAAI,CAACD;KAAO;CACpC;AAED,4FAA4F,GAC5F,OAAO,SAASI,kBAAkBC,KAAyB;IACzD,MAAMC,SAASD,MACZE,GAAG,CAAC,CAACC,OAASC,OAAOD,eAAAA,OAAQ,IAAIE,IAAI,IACrCC,MAAM,CAACC,SACPC,KAAK,CAAC,GAAGvB;IACZ,IAAI,CAACgB,OAAOH,MAAM,EAAE,OAAO;IAC3B,KAAK,MAAM,CAACW,OAAOb,KAAK,IAAIF,OAAQ;QAClC,MAAMgB,WAAWT,OAAOK,MAAM,CAACV,MAAME,MAAM;QAC3C,IAAIY,WAAWT,OAAOH,MAAM,IAAIX,wBAAwB,OAAOsB;IACjE;IACA,OAAO;AACT;AAEA,6FAA6F,GAC7F,OAAO,SAASE,cACdC,OAA0B,EAC1BC,IAAuC;IAEvC,MAAMC,SAASD,KAAKL,KAAK,CAAC,GAAGtB;IAC7B,OAAO0B,QAAQV,GAAG,CAAC,CAACa,QAAQC,QAAW,CAAA;YACrCD,QAAQX,OAAOW,iBAAAA,SAAU,IAAIV,IAAI;YACjCI,OAAOV,kBAAkBe,OAAOZ,GAAG,CAAC,CAACe,MAAQA,GAAG,CAACD,MAAM;QACzD,CAAA;AACF"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /** What the convert dialog should propose for the company step. */
18
+ export type CompanySuggestion =
19
+ /** A public mailbox or a malformed address implies no company. */
20
+ {
21
+ mode: 'none';
22
+ }
23
+ /** The org already has a company at this domain the caller can see. */
24
+ | {
25
+ mode: 'existing';
26
+ companyId: string;
27
+ }
28
+ /** No company at this domain yet — propose creating one. */
29
+ | {
30
+ mode: 'new';
31
+ name: string;
32
+ domain: string;
33
+ };
34
+ /**
35
+ * The company a lead's address implies, matched against the companies the
36
+ * caller can already see (AGL-2608).
37
+ *
38
+ * The email domain is the one fact about a company a capture carries, and
39
+ * `companyDomainForEmail` already refuses the public mailboxes, so a lead at
40
+ * `gmail.com` proposes nothing rather than a phantom account. A match on a
41
+ * loaded company wins over creating one: two contacts at one business should
42
+ * land under one company, and the dialog's job is to make that the default
43
+ * click rather than a lookup the converter has to remember to do.
44
+ *
45
+ * The proposed name is `companyNameForDomain`'s — the domain's first label
46
+ * with a capital, `acme.com` → `Acme` — the same name the capture door gives
47
+ * a company it mints on its own, so a company proposed here and one created
48
+ * by a capture at the same domain start out called the same thing. A
49
+ * starting point the converter edits, not a claim about what the business
50
+ * is called.
51
+ */
52
+ export declare function suggestCompanyForLead(email: unknown, companies: ReadonlyArray<{
53
+ $id: string;
54
+ domain?: unknown;
55
+ }>): CompanySuggestion;
56
+ /**
57
+ * A typed dollar amount as cents, `null` for an empty field, and `undefined`
58
+ * for something that is not an amount — the three answers a form has to tell
59
+ * apart: nothing entered, a number entered, and a mistake to point at.
60
+ */
61
+ export declare function dollarsToCents(input: string): number | null | undefined;
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { companyDomainForEmail, companyNameForDomain } from "@aglyn/aglyn";
17
+ /**
18
+ * The company a lead's address implies, matched against the companies the
19
+ * caller can already see (AGL-2608).
20
+ *
21
+ * The email domain is the one fact about a company a capture carries, and
22
+ * `companyDomainForEmail` already refuses the public mailboxes, so a lead at
23
+ * `gmail.com` proposes nothing rather than a phantom account. A match on a
24
+ * loaded company wins over creating one: two contacts at one business should
25
+ * land under one company, and the dialog's job is to make that the default
26
+ * click rather than a lookup the converter has to remember to do.
27
+ *
28
+ * The proposed name is `companyNameForDomain`'s — the domain's first label
29
+ * with a capital, `acme.com` → `Acme` — the same name the capture door gives
30
+ * a company it mints on its own, so a company proposed here and one created
31
+ * by a capture at the same domain start out called the same thing. A
32
+ * starting point the converter edits, not a claim about what the business
33
+ * is called.
34
+ */ export function suggestCompanyForLead(email, companies) {
35
+ const domain = companyDomainForEmail(email);
36
+ if (!domain) return {
37
+ mode: 'none'
38
+ };
39
+ const existing = companies.find((company)=>{
40
+ var _company_domain;
41
+ return String((_company_domain = company.domain) != null ? _company_domain : '').toLowerCase() === domain;
42
+ });
43
+ if (existing) return {
44
+ mode: 'existing',
45
+ companyId: existing.$id
46
+ };
47
+ return {
48
+ mode: 'new',
49
+ name: companyNameForDomain(domain),
50
+ domain
51
+ };
52
+ }
53
+ /**
54
+ * A typed dollar amount as cents, `null` for an empty field, and `undefined`
55
+ * for something that is not an amount — the three answers a form has to tell
56
+ * apart: nothing entered, a number entered, and a mistake to point at.
57
+ */ export function dollarsToCents(input) {
58
+ const cleaned = input.replace(/[,$\s]/g, '');
59
+ if (!cleaned) return null;
60
+ const dollars = Number(cleaned);
61
+ if (!Number.isFinite(dollars) || dollars < 0) return undefined;
62
+ return Math.round(dollars * 100);
63
+ }
64
+
65
+ //# sourceMappingURL=lead-company-suggestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/lead-company-suggestion.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { companyDomainForEmail, companyNameForDomain } from '@aglyn/aglyn'\n\n/** What the convert dialog should propose for the company step. */\nexport type CompanySuggestion =\n /** A public mailbox or a malformed address implies no company. */\n | { mode: 'none' }\n /** The org already has a company at this domain the caller can see. */\n | { mode: 'existing'; companyId: string }\n /** No company at this domain yet — propose creating one. */\n | { mode: 'new'; name: string; domain: string }\n\n/**\n * The company a lead's address implies, matched against the companies the\n * caller can already see (AGL-2608).\n *\n * The email domain is the one fact about a company a capture carries, and\n * `companyDomainForEmail` already refuses the public mailboxes, so a lead at\n * `gmail.com` proposes nothing rather than a phantom account. A match on a\n * loaded company wins over creating one: two contacts at one business should\n * land under one company, and the dialog's job is to make that the default\n * click rather than a lookup the converter has to remember to do.\n *\n * The proposed name is `companyNameForDomain`'s — the domain's first label\n * with a capital, `acme.com` → `Acme` — the same name the capture door gives\n * a company it mints on its own, so a company proposed here and one created\n * by a capture at the same domain start out called the same thing. A\n * starting point the converter edits, not a claim about what the business\n * is called.\n */\nexport function suggestCompanyForLead(\n email: unknown,\n companies: ReadonlyArray<{ $id: string; domain?: unknown }>,\n): CompanySuggestion {\n const domain = companyDomainForEmail(email)\n if (!domain) return { mode: 'none' }\n const existing = companies.find(\n (company) => String(company.domain ?? '').toLowerCase() === domain,\n )\n if (existing) return { mode: 'existing', companyId: existing.$id }\n return { mode: 'new', name: companyNameForDomain(domain), domain }\n}\n\n/**\n * A typed dollar amount as cents, `null` for an empty field, and `undefined`\n * for something that is not an amount — the three answers a form has to tell\n * apart: nothing entered, a number entered, and a mistake to point at.\n */\nexport function dollarsToCents(input: string): number | null | undefined {\n const cleaned = input.replace(/[,$\\s]/g, '')\n if (!cleaned) return null\n const dollars = Number(cleaned)\n if (!Number.isFinite(dollars) || dollars < 0) return undefined\n return Math.round(dollars * 100)\n}\n"],"names":["companyDomainForEmail","companyNameForDomain","suggestCompanyForLead","email","companies","domain","mode","existing","find","company","String","toLowerCase","companyId","$id","name","dollarsToCents","input","cleaned","replace","dollars","Number","isFinite","undefined","Math","round"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,qBAAqB,EAAEC,oBAAoB,QAAQ,eAAc;AAW1E;;;;;;;;;;;;;;;;;CAiBC,GACD,OAAO,SAASC,sBACdC,KAAc,EACdC,SAA2D;IAE3D,MAAMC,SAASL,sBAAsBG;IACrC,IAAI,CAACE,QAAQ,OAAO;QAAEC,MAAM;IAAO;IACnC,MAAMC,WAAWH,UAAUI,IAAI,CAC7B,CAACC;YAAmBA;eAAPC,QAAOD,kBAAAA,QAAQJ,MAAM,YAAdI,kBAAkB,IAAIE,WAAW,OAAON;;IAE9D,IAAIE,UAAU,OAAO;QAAED,MAAM;QAAYM,WAAWL,SAASM,GAAG;IAAC;IACjE,OAAO;QAAEP,MAAM;QAAOQ,MAAMb,qBAAqBI;QAASA;IAAO;AACnE;AAEA;;;;CAIC,GACD,OAAO,SAASU,eAAeC,KAAa;IAC1C,MAAMC,UAAUD,MAAME,OAAO,CAAC,WAAW;IACzC,IAAI,CAACD,SAAS,OAAO;IACrB,MAAME,UAAUC,OAAOH;IACvB,IAAI,CAACG,OAAOC,QAAQ,CAACF,YAAYA,UAAU,GAAG,OAAOG;IACrD,OAAOC,KAAKC,KAAK,CAACL,UAAU;AAC9B"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { type CrmLeadFields, type CrmLeadStatus } from '@aglyn/aglyn';
18
+ /**
19
+ * What the Leads section's `Show` control offers (AGL-2608): the two
20
+ * aggregate views and each status on its own. `open` is the default — the
21
+ * list opens on the work — and it is the one view a Firestore query cannot
22
+ * express, because a lead nobody has touched carries no status field at all;
23
+ * see the section for why the filter runs over a loaded window.
24
+ */
25
+ export type LeadFilter = 'open' | 'all' | CrmLeadStatus;
26
+ export declare const LEAD_FILTERS: readonly LeadFilter[];
27
+ export declare const LEAD_FILTER_LABELS: Record<LeadFilter, string>;
28
+ /** Whether a lead belongs in a filter's view. An absent status is `new`. */
29
+ export declare function leadMatchesFilter(lead: Pick<CrmLeadFields, 'status'>, filter: LeadFilter): boolean;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { CRM_LEAD_STATUS_LABELS, crmLeadStatus, isCrmLeadOpen } from "@aglyn/aglyn";
17
+ export const LEAD_FILTERS = [
18
+ 'open',
19
+ 'new',
20
+ 'working',
21
+ 'qualified',
22
+ 'unqualified',
23
+ 'all'
24
+ ];
25
+ export const LEAD_FILTER_LABELS = {
26
+ open: 'Open',
27
+ all: 'All',
28
+ new: CRM_LEAD_STATUS_LABELS.new,
29
+ working: CRM_LEAD_STATUS_LABELS.working,
30
+ qualified: CRM_LEAD_STATUS_LABELS.qualified,
31
+ unqualified: CRM_LEAD_STATUS_LABELS.unqualified
32
+ };
33
+ /** Whether a lead belongs in a filter's view. An absent status is `new`. */ export function leadMatchesFilter(lead, filter) {
34
+ if (filter === 'all') return true;
35
+ if (filter === 'open') return isCrmLeadOpen(lead);
36
+ return crmLeadStatus(lead) === filter;
37
+ }
38
+
39
+ //# sourceMappingURL=lead-filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/lead-filters.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n CRM_LEAD_STATUS_LABELS,\n type CrmLeadFields,\n type CrmLeadStatus,\n crmLeadStatus,\n isCrmLeadOpen,\n} from '@aglyn/aglyn'\n\n/**\n * What the Leads section's `Show` control offers (AGL-2608): the two\n * aggregate views and each status on its own. `open` is the default — the\n * list opens on the work — and it is the one view a Firestore query cannot\n * express, because a lead nobody has touched carries no status field at all;\n * see the section for why the filter runs over a loaded window.\n */\nexport type LeadFilter = 'open' | 'all' | CrmLeadStatus\n\nexport const LEAD_FILTERS: readonly LeadFilter[] = [\n 'open',\n 'new',\n 'working',\n 'qualified',\n 'unqualified',\n 'all',\n]\n\nexport const LEAD_FILTER_LABELS: Record<LeadFilter, string> = {\n open: 'Open',\n all: 'All',\n new: CRM_LEAD_STATUS_LABELS.new,\n working: CRM_LEAD_STATUS_LABELS.working,\n qualified: CRM_LEAD_STATUS_LABELS.qualified,\n unqualified: CRM_LEAD_STATUS_LABELS.unqualified,\n}\n\n/** Whether a lead belongs in a filter's view. An absent status is `new`. */\nexport function leadMatchesFilter(\n lead: Pick<CrmLeadFields, 'status'>,\n filter: LeadFilter,\n): boolean {\n if (filter === 'all') return true\n if (filter === 'open') return isCrmLeadOpen(lead)\n return crmLeadStatus(lead) === filter\n}\n"],"names":["CRM_LEAD_STATUS_LABELS","crmLeadStatus","isCrmLeadOpen","LEAD_FILTERS","LEAD_FILTER_LABELS","open","all","new","working","qualified","unqualified","leadMatchesFilter","lead","filter"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SACEA,sBAAsB,EAGtBC,aAAa,EACbC,aAAa,QACR,eAAc;AAWrB,OAAO,MAAMC,eAAsC;IACjD;IACA;IACA;IACA;IACA;IACA;CACD,CAAA;AAED,OAAO,MAAMC,qBAAiD;IAC5DC,MAAM;IACNC,KAAK;IACLC,KAAKP,uBAAuBO,GAAG;IAC/BC,SAASR,uBAAuBQ,OAAO;IACvCC,WAAWT,uBAAuBS,SAAS;IAC3CC,aAAaV,uBAAuBU,WAAW;AACjD,EAAC;AAED,0EAA0E,GAC1E,OAAO,SAASC,kBACdC,IAAmC,EACnCC,MAAkB;IAElB,IAAIA,WAAW,OAAO,OAAO;IAC7B,IAAIA,WAAW,QAAQ,OAAOX,cAAcU;IAC5C,OAAOX,cAAcW,UAAUC;AACjC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * How many forms the Leads section reads to say which of them create leads.
19
+ *
20
+ * A read WINDOW, and one more than the window is read so the caption can say
21
+ * "and more" as a fact. The Inbox's form picker draws the same window from
22
+ * the same collection.
23
+ */
24
+ export declare const LEAD_SURFACE_FORMS_WINDOW = 50;
25
+ /** Why a form cannot be made a lead surface, in the author's terms. */
26
+ export declare const LEAD_ROUTING_NEEDS_EMAIL_FIELD: string;
27
+ export declare const LEAD_ROUTING_NEEDS_CONSENT_FIELD: string;
28
+ /** One of the site's forms, as the Leads section describes it. */
29
+ export interface LeadSurfaceForm {
30
+ $id: string;
31
+ displayName: string;
32
+ /** `routing.lead` is on: every submission with an address files a lead. */
33
+ routed: boolean;
34
+ /** Whether routing may be turned on — the two preconditions the publish check applies. */
35
+ canRoute: boolean;
36
+ /** Why it may not, when it may not: the first gate the publish check would refuse on. */
37
+ blocker: string | null;
38
+ }
39
+ /**
40
+ * The site's forms, sorted, each with its lead-routing verdict (AGL-2612).
41
+ *
42
+ * The Leads section answers "what creates a lead here?" — sign-ups and
43
+ * bookings always do, and a form does only when its author declared
44
+ * `routing.lead`. Nothing in the CRM said which forms had, so the
45
+ * relationship between the Leads list and the Contacts list was invisible:
46
+ * a form's captures landed in Contacts at stage Lead and in Leads only if
47
+ * somebody had flipped a switch on the form's own page.
48
+ *
49
+ * Pure over the raw documents so the verdict is testable without a
50
+ * listener. An archived form is left out: it collects nothing, so whether
51
+ * it would route is not a fact about the site. The preconditions are
52
+ * `formFieldsCanYieldAnEmail` and `formFieldsCaptureConsent`, the checks
53
+ * `checkFormContract` runs at publish, so a switch this section offers is
54
+ * one the publish would honor.
55
+ */
56
+ export declare function leadSurfaceForms(docs: ReadonlyArray<Record<string, unknown> & {
57
+ $id: string;
58
+ }>): LeadSurfaceForm[];
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { formFieldsCanYieldAnEmail, formFieldsCaptureConsent } from "@aglyn/aglyn";
17
+ /**
18
+ * How many forms the Leads section reads to say which of them create leads.
19
+ *
20
+ * A read WINDOW, and one more than the window is read so the caption can say
21
+ * "and more" as a fact. The Inbox's form picker draws the same window from
22
+ * the same collection.
23
+ */ export const LEAD_SURFACE_FORMS_WINDOW = 50;
24
+ /** Why a form cannot be made a lead surface, in the author's terms. */ export const LEAD_ROUTING_NEEDS_EMAIL_FIELD = 'This form has no email field, so a submission could not key a lead. ' + 'Add one in the besigner first.';
25
+ export const LEAD_ROUTING_NEEDS_CONSENT_FIELD = 'This form records no consent, so every lead it filed would be one the ' + 'team cannot email. Name a marketing consent field on its page first.';
26
+ /**
27
+ * The site's forms, sorted, each with its lead-routing verdict (AGL-2612).
28
+ *
29
+ * The Leads section answers "what creates a lead here?" — sign-ups and
30
+ * bookings always do, and a form does only when its author declared
31
+ * `routing.lead`. Nothing in the CRM said which forms had, so the
32
+ * relationship between the Leads list and the Contacts list was invisible:
33
+ * a form's captures landed in Contacts at stage Lead and in Leads only if
34
+ * somebody had flipped a switch on the form's own page.
35
+ *
36
+ * Pure over the raw documents so the verdict is testable without a
37
+ * listener. An archived form is left out: it collects nothing, so whether
38
+ * it would route is not a fact about the site. The preconditions are
39
+ * `formFieldsCanYieldAnEmail` and `formFieldsCaptureConsent`, the checks
40
+ * `checkFormContract` runs at publish, so a switch this section offers is
41
+ * one the publish would honor.
42
+ */ export function leadSurfaceForms(docs) {
43
+ return docs.filter((form)=>!form['archivedAt']).map((form)=>{
44
+ var _form_routing, _form_consentFieldName, _form_displayName;
45
+ const fields = Array.isArray(form['fields']) ? form['fields'].filter((field)=>field && typeof field === 'object').map((field)=>{
46
+ var _field_fieldName, _field_fieldType;
47
+ return {
48
+ fieldName: String((_field_fieldName = field['fieldName']) != null ? _field_fieldName : ''),
49
+ fieldType: String((_field_fieldType = field['fieldType']) != null ? _field_fieldType : 'text')
50
+ };
51
+ }) : [];
52
+ const routing = (_form_routing = form['routing']) != null ? _form_routing : {};
53
+ const consentFieldName = String((_form_consentFieldName = form['consentFieldName']) != null ? _form_consentFieldName : '').trim();
54
+ // In the order the publish check decides them: no address means no
55
+ // lead at all, so consent is not the question until a field exists.
56
+ const blocker = !formFieldsCanYieldAnEmail(fields) ? LEAD_ROUTING_NEEDS_EMAIL_FIELD : !formFieldsCaptureConsent(fields, consentFieldName) ? LEAD_ROUTING_NEEDS_CONSENT_FIELD : null;
57
+ return {
58
+ $id: form.$id,
59
+ displayName: String((_form_displayName = form['displayName']) != null ? _form_displayName : '').trim() || form.$id,
60
+ routed: routing['lead'] === true,
61
+ canRoute: blocker === null,
62
+ blocker
63
+ };
64
+ }).sort((a, b)=>a.displayName.localeCompare(b.displayName));
65
+ }
66
+
67
+ //# sourceMappingURL=lead-surfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/lead-surfaces.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { formFieldsCanYieldAnEmail, formFieldsCaptureConsent } from '@aglyn/aglyn'\n\n/**\n * How many forms the Leads section reads to say which of them create leads.\n *\n * A read WINDOW, and one more than the window is read so the caption can say\n * \"and more\" as a fact. The Inbox's form picker draws the same window from\n * the same collection.\n */\nexport const LEAD_SURFACE_FORMS_WINDOW = 50\n\n/** Why a form cannot be made a lead surface, in the author's terms. */\nexport const LEAD_ROUTING_NEEDS_EMAIL_FIELD =\n 'This form has no email field, so a submission could not key a lead. ' +\n 'Add one in the besigner first.'\nexport const LEAD_ROUTING_NEEDS_CONSENT_FIELD =\n 'This form records no consent, so every lead it filed would be one the ' +\n 'team cannot email. Name a marketing consent field on its page first.'\n\n/** One of the site's forms, as the Leads section describes it. */\nexport interface LeadSurfaceForm {\n $id: string\n displayName: string\n /** `routing.lead` is on: every submission with an address files a lead. */\n routed: boolean\n /** Whether routing may be turned on — the two preconditions the publish check applies. */\n canRoute: boolean\n /** Why it may not, when it may not: the first gate the publish check would refuse on. */\n blocker: string | null\n}\n\n/**\n * The site's forms, sorted, each with its lead-routing verdict (AGL-2612).\n *\n * The Leads section answers \"what creates a lead here?\" — sign-ups and\n * bookings always do, and a form does only when its author declared\n * `routing.lead`. Nothing in the CRM said which forms had, so the\n * relationship between the Leads list and the Contacts list was invisible:\n * a form's captures landed in Contacts at stage Lead and in Leads only if\n * somebody had flipped a switch on the form's own page.\n *\n * Pure over the raw documents so the verdict is testable without a\n * listener. An archived form is left out: it collects nothing, so whether\n * it would route is not a fact about the site. The preconditions are\n * `formFieldsCanYieldAnEmail` and `formFieldsCaptureConsent`, the checks\n * `checkFormContract` runs at publish, so a switch this section offers is\n * one the publish would honor.\n */\nexport function leadSurfaceForms(\n docs: ReadonlyArray<Record<string, unknown> & { $id: string }>,\n): LeadSurfaceForm[] {\n return docs\n .filter((form) => !form['archivedAt'])\n .map((form) => {\n const fields = Array.isArray(form['fields'])\n ? (form['fields'] as Array<Record<string, unknown>>)\n .filter((field) => field && typeof field === 'object')\n .map((field) => ({\n fieldName: String(field['fieldName'] ?? ''),\n fieldType: String(field['fieldType'] ?? 'text'),\n }))\n : []\n const routing = (form['routing'] ?? {}) as Record<string, unknown>\n const consentFieldName = String(form['consentFieldName'] ?? '').trim()\n // In the order the publish check decides them: no address means no\n // lead at all, so consent is not the question until a field exists.\n const blocker = !formFieldsCanYieldAnEmail(fields)\n ? LEAD_ROUTING_NEEDS_EMAIL_FIELD\n : !formFieldsCaptureConsent(fields, consentFieldName)\n ? LEAD_ROUTING_NEEDS_CONSENT_FIELD\n : null\n return {\n $id: form.$id,\n displayName: String(form['displayName'] ?? '').trim() || form.$id,\n routed: routing['lead'] === true,\n canRoute: blocker === null,\n blocker,\n }\n })\n .sort((a, b) => a.displayName.localeCompare(b.displayName))\n}\n"],"names":["formFieldsCanYieldAnEmail","formFieldsCaptureConsent","LEAD_SURFACE_FORMS_WINDOW","LEAD_ROUTING_NEEDS_EMAIL_FIELD","LEAD_ROUTING_NEEDS_CONSENT_FIELD","leadSurfaceForms","docs","filter","form","map","fields","Array","isArray","field","fieldName","String","fieldType","routing","consentFieldName","trim","blocker","$id","displayName","routed","canRoute","sort","a","b","localeCompare"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,yBAAyB,EAAEC,wBAAwB,QAAQ,eAAc;AAElF;;;;;;CAMC,GACD,OAAO,MAAMC,4BAA4B,GAAE;AAE3C,qEAAqE,GACrE,OAAO,MAAMC,iCACX,yEACA,iCAAgC;AAClC,OAAO,MAAMC,mCACX,2EACA,uEAAsE;AAcxE;;;;;;;;;;;;;;;;CAgBC,GACD,OAAO,SAASC,iBACdC,IAA8D;IAE9D,OAAOA,KACJC,MAAM,CAAC,CAACC,OAAS,CAACA,IAAI,CAAC,aAAa,EACpCC,GAAG,CAAC,CAACD;YASaA,eACeA,wBAUVA;QAnBtB,MAAME,SAASC,MAAMC,OAAO,CAACJ,IAAI,CAAC,SAAS,IACvC,AAACA,IAAI,CAAC,SAAS,CACZD,MAAM,CAAC,CAACM,QAAUA,SAAS,OAAOA,UAAU,UAC5CJ,GAAG,CAAC,CAACI;gBACcA,kBACAA;mBAFH;gBACfC,WAAWC,QAAOF,mBAAAA,KAAK,CAAC,YAAY,YAAlBA,mBAAsB;gBACxCG,WAAWD,QAAOF,mBAAAA,KAAK,CAAC,YAAY,YAAlBA,mBAAsB;YAC1C;aACF,EAAE;QACN,MAAMI,WAAWT,gBAAAA,IAAI,CAAC,UAAU,YAAfA,gBAAmB,CAAC;QACrC,MAAMU,mBAAmBH,QAAOP,yBAAAA,IAAI,CAAC,mBAAmB,YAAxBA,yBAA4B,IAAIW,IAAI;QACpE,mEAAmE;QACnE,oEAAoE;QACpE,MAAMC,UAAU,CAACpB,0BAA0BU,UACvCP,iCACA,CAACF,yBAAyBS,QAAQQ,oBAChCd,mCACA;QACN,OAAO;YACLiB,KAAKb,KAAKa,GAAG;YACbC,aAAaP,QAAOP,oBAAAA,IAAI,CAAC,cAAc,YAAnBA,oBAAuB,IAAIW,IAAI,MAAMX,KAAKa,GAAG;YACjEE,QAAQN,OAAO,CAAC,OAAO,KAAK;YAC5BO,UAAUJ,YAAY;YACtBA;QACF;IACF,GACCK,IAAI,CAAC,CAACC,GAAGC,IAAMD,EAAEJ,WAAW,CAACM,aAAa,CAACD,EAAEL,WAAW;AAC7D"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * The leads CSV — one file from the Leads section's Export button and the
19
+ * bulk bar's (AGL-2662).
20
+ *
21
+ * A lead is a capture the CRM has annotated: what the door wrote (the
22
+ * address, the name, every surface that met the person, when, how often)
23
+ * and what the team wrote on top (a status, an owner, a reason, notes).
24
+ * The file carries both. The status is written by its LABEL and an absent
25
+ * one as `New`, the way the list reads it, and the owner by ADDRESS rather
26
+ * than uid, the way every other CRM file writes one. The sources are joined
27
+ * with `|` as the contacts file joins its multi-valued cells.
28
+ *
29
+ * At the organization level the same file gains a `Site` column, because a
30
+ * row there is some site's lead and the file must say which; under a site
31
+ * every row is the site's own and the column is not written.
32
+ *
33
+ * The header is written to READ well rather than to round-trip, and the
34
+ * import (`lead-import-drawer.tsx`) is built to that header rather than the
35
+ * other way round: it maps the columns a file may set — the address, the
36
+ * name, and the team's status, owner, reason and notes — and leaves the
37
+ * capture door's own record (the sources, the two timestamps, the capture
38
+ * count) and the conversion's stamp on "Do not import".
39
+ */
40
+ export { LEAD_CSV_COLUMNS, leadCsvHeader, leadsCsv, type LeadCsvOptions, type LeadCsvRow, } from '@aglyn/aglyn';
@@ -0,0 +1,40 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /**
17
+ * The leads CSV — one file from the Leads section's Export button and the
18
+ * bulk bar's (AGL-2662).
19
+ *
20
+ * A lead is a capture the CRM has annotated: what the door wrote (the
21
+ * address, the name, every surface that met the person, when, how often)
22
+ * and what the team wrote on top (a status, an owner, a reason, notes).
23
+ * The file carries both. The status is written by its LABEL and an absent
24
+ * one as `New`, the way the list reads it, and the owner by ADDRESS rather
25
+ * than uid, the way every other CRM file writes one. The sources are joined
26
+ * with `|` as the contacts file joins its multi-valued cells.
27
+ *
28
+ * At the organization level the same file gains a `Site` column, because a
29
+ * row there is some site's lead and the file must say which; under a site
30
+ * every row is the site's own and the column is not written.
31
+ *
32
+ * The header is written to READ well rather than to round-trip, and the
33
+ * import (`lead-import-drawer.tsx`) is built to that header rather than the
34
+ * other way round: it maps the columns a file may set — the address, the
35
+ * name, and the team's status, owner, reason and notes — and leaves the
36
+ * capture door's own record (the sources, the two timestamps, the capture
37
+ * count) and the conversion's stamp on "Do not import".
38
+ */ /* The writer moved to `@aglyn/aglyn` under AGL-2662 — see `deals-csv.ts`. */ export { LEAD_CSV_COLUMNS, leadCsvHeader, leadsCsv } from "@aglyn/aglyn";
39
+
40
+ //# sourceMappingURL=leads-csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/leads-csv.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The leads CSV — one file from the Leads section's Export button and the\n * bulk bar's (AGL-2662).\n *\n * A lead is a capture the CRM has annotated: what the door wrote (the\n * address, the name, every surface that met the person, when, how often)\n * and what the team wrote on top (a status, an owner, a reason, notes).\n * The file carries both. The status is written by its LABEL and an absent\n * one as `New`, the way the list reads it, and the owner by ADDRESS rather\n * than uid, the way every other CRM file writes one. The sources are joined\n * with `|` as the contacts file joins its multi-valued cells.\n *\n * At the organization level the same file gains a `Site` column, because a\n * row there is some site's lead and the file must say which; under a site\n * every row is the site's own and the column is not written.\n *\n * The header is written to READ well rather than to round-trip, and the\n * import (`lead-import-drawer.tsx`) is built to that header rather than the\n * other way round: it maps the columns a file may set — the address, the\n * name, and the team's status, owner, reason and notes — and leaves the\n * capture door's own record (the sources, the two timestamps, the capture\n * count) and the conversion's stamp on \"Do not import\".\n */\n\n/* The writer moved to `@aglyn/aglyn` under AGL-2662 — see `deals-csv.ts`. */\nexport {\n LEAD_CSV_COLUMNS,\n leadCsvHeader,\n leadsCsv,\n type LeadCsvOptions,\n type LeadCsvRow,\n} from '@aglyn/aglyn'\n"],"names":["LEAD_CSV_COLUMNS","leadCsvHeader","leadsCsv"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;CAsBC,GAED,2EAA2E,GAC3E,SACEA,gBAAgB,EAChBC,aAAa,EACbC,QAAQ,QAGH,eAAc"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { type MaybeTokenSource } from '@aglyn/shared-util-http/authorized-token';
18
+ import { type CrmNextActivityResponse } from './next-activity';
19
+ import type { CrmTaskRouteScope } from './task-routes';
20
+ /**
21
+ * After a client-direct task write: recompute for the records the tasks
22
+ * named. Never throws — see the header — and does nothing for a task that
23
+ * names no record or a surface with no scope to call with.
24
+ */
25
+ export declare function refreshCrmNextActivity(user: MaybeTokenSource, scope: CrmTaskRouteScope | null, tasks: readonly {
26
+ contactId?: string | null;
27
+ companyId?: string | null;
28
+ dealId?: string | null;
29
+ }[]): Promise<void>;
30
+ /** The Fields section's maintenance action: the whole organization. Throws on refusal. */
31
+ export declare function recomputeAllCrmNextActivity(user: MaybeTokenSource, scope: CrmTaskRouteScope): Promise<CrmNextActivityResponse>;
@@ -0,0 +1,57 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
18
+ import { CRM_NEXT_ACTIVITY_LINKS_MAX, crmNextActivityRouteUrl, nextActivityRequestLinks } from "./next-activity.js";
19
+ /**
20
+ * The browser's side of the next-activity route (AGL-2661), through
21
+ * `authorizedFetch` the way `task-api.ts` reaches the task routes.
22
+ */ async function post(user, body) {
23
+ const response = await authorizedFetch(user, crmNextActivityRouteUrl(), {
24
+ method: 'POST',
25
+ headers: {
26
+ 'Content-Type': 'application/json'
27
+ },
28
+ body: JSON.stringify(body)
29
+ });
30
+ const payload = await response.json().catch(()=>({}));
31
+ if (!response.ok) {
32
+ throw new Error((payload == null ? void 0 : payload.error) || `The request was refused (${response.status}).`);
33
+ }
34
+ return payload;
35
+ }
36
+ /**
37
+ * After a client-direct task write: recompute for the records the tasks
38
+ * named. Never throws — see the header — and does nothing for a task that
39
+ * names no record or a surface with no scope to call with.
40
+ */ export async function refreshCrmNextActivity(user, scope, tasks) {
41
+ const links = nextActivityRequestLinks(tasks).filter((link)=>Object.keys(link).length > 0);
42
+ if (!scope || !links.length) return;
43
+ try {
44
+ await post(user, _extends({}, scope, {
45
+ links: links.slice(0, CRM_NEXT_ACTIVITY_LINKS_MAX)
46
+ }));
47
+ } catch (error) {
48
+ console.warn('[crm] next activity was not refreshed', error);
49
+ }
50
+ }
51
+ /** The Fields section's maintenance action: the whole organization. Throws on refusal. */ export function recomputeAllCrmNextActivity(user, scope) {
52
+ return post(user, _extends({}, scope, {
53
+ all: true
54
+ }));
55
+ }
56
+
57
+ //# sourceMappingURL=next-activity-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/next-activity-api.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n authorizedFetch,\n type MaybeTokenSource,\n} from '@aglyn/shared-util-http/authorized-token'\nimport {\n CRM_NEXT_ACTIVITY_LINKS_MAX,\n type CrmNextActivityRequest,\n type CrmNextActivityResponse,\n crmNextActivityRouteUrl,\n nextActivityRequestLinks,\n} from './next-activity'\nimport type { CrmTaskRouteScope } from './task-routes'\n\n/**\n * The browser's side of the next-activity route (AGL-2661), through\n * `authorizedFetch` the way `task-api.ts` reaches the task routes.\n */\nasync function post(user: MaybeTokenSource, body: CrmNextActivityRequest): Promise<CrmNextActivityResponse> {\n const response = await authorizedFetch(user, crmNextActivityRouteUrl(), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n const payload = (await response.json().catch(() => ({}))) as { error?: string }\n if (!response.ok) {\n throw new Error(payload?.error || `The request was refused (${response.status}).`)\n }\n return payload as CrmNextActivityResponse\n}\n\n/**\n * After a client-direct task write: recompute for the records the tasks\n * named. Never throws — see the header — and does nothing for a task that\n * names no record or a surface with no scope to call with.\n */\nexport async function refreshCrmNextActivity(\n user: MaybeTokenSource,\n scope: CrmTaskRouteScope | null,\n tasks: readonly { contactId?: string | null; companyId?: string | null; dealId?: string | null }[],\n): Promise<void> {\n const links = nextActivityRequestLinks(tasks).filter((link) => Object.keys(link).length > 0)\n if (!scope || !links.length) return\n try {\n await post(user, { ...scope, links: links.slice(0, CRM_NEXT_ACTIVITY_LINKS_MAX) })\n } catch (error) {\n console.warn('[crm] next activity was not refreshed', error)\n }\n}\n\n/** The Fields section's maintenance action: the whole organization. Throws on refusal. */\nexport function recomputeAllCrmNextActivity(\n user: MaybeTokenSource,\n scope: CrmTaskRouteScope,\n): Promise<CrmNextActivityResponse> {\n return post(user, { ...scope, all: true })\n}\n"],"names":["authorizedFetch","CRM_NEXT_ACTIVITY_LINKS_MAX","crmNextActivityRouteUrl","nextActivityRequestLinks","post","user","body","response","method","headers","JSON","stringify","payload","json","catch","ok","Error","error","status","refreshCrmNextActivity","scope","tasks","links","filter","link","Object","keys","length","slice","console","warn","recomputeAllCrmNextActivity","all"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED,SACEA,eAAe,QAEV,2CAA0C;AACjD,SACEC,2BAA2B,EAG3BC,uBAAuB,EACvBC,wBAAwB,QACnB,qBAAiB;AAGxB;;;CAGC,GACD,eAAeC,KAAKC,IAAsB,EAAEC,IAA4B;IACtE,MAAMC,WAAW,MAAMP,gBAAgBK,MAAMH,2BAA2B;QACtEM,QAAQ;QACRC,SAAS;YAAE,gBAAgB;QAAmB;QAC9CH,MAAMI,KAAKC,SAAS,CAACL;IACvB;IACA,MAAMM,UAAW,MAAML,SAASM,IAAI,GAAGC,KAAK,CAAC,IAAO,CAAA,CAAC,CAAA;IACrD,IAAI,CAACP,SAASQ,EAAE,EAAE;QAChB,MAAM,IAAIC,MAAMJ,CAAAA,2BAAAA,QAASK,KAAK,KAAI,CAAC,yBAAyB,EAAEV,SAASW,MAAM,CAAC,EAAE,CAAC;IACnF;IACA,OAAON;AACT;AAEA;;;;CAIC,GACD,OAAO,eAAeO,uBACpBd,IAAsB,EACtBe,KAA+B,EAC/BC,KAAkG;IAElG,MAAMC,QAAQnB,yBAAyBkB,OAAOE,MAAM,CAAC,CAACC,OAASC,OAAOC,IAAI,CAACF,MAAMG,MAAM,GAAG;IAC1F,IAAI,CAACP,SAAS,CAACE,MAAMK,MAAM,EAAE;IAC7B,IAAI;QACF,MAAMvB,KAAKC,MAAM,aAAKe;YAAOE,OAAOA,MAAMM,KAAK,CAAC,GAAG3B;;IACrD,EAAE,OAAOgB,OAAO;QACdY,QAAQC,IAAI,CAAC,yCAAyCb;IACxD;AACF;AAEA,wFAAwF,GACxF,OAAO,SAASc,4BACd1B,IAAsB,EACtBe,KAAwB;IAExB,OAAOhB,KAAKC,MAAM,aAAKe;QAAOY,KAAK;;AACrC"}