@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,375 @@
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
+ */ 'use client';
17
+ import { _ as _extends } from "@swc/helpers/_/_extends";
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
+ import * as Aglyn from "@aglyn/aglyn";
20
+ import { AppLink, CardDisplay } from "@aglyn/shared-ui-jsx";
21
+ import { percent, Section } from "@aglyn/shared-ui-jsx/components/measured-figures.component";
22
+ import { ceilingedWindow } from "@aglyn/tenant-feature-instance/hooks/host-collection-queries";
23
+ import { Alert, Button, Stack, Typography } from "@mui/material";
24
+ import { collection, getCountFromServer, getDocs, limit, orderBy, query, where } from "firebase/firestore";
25
+ import { useMemo } from "react";
26
+ import { useFirestore } from "@aglyn/tenant-feature-instance";
27
+ import { useCrmOrgMount } from "../../hooks/use-crm-org-mount.js";
28
+ import { ReportBreakdown } from "./report-breakdown.js";
29
+ import { ReportExport } from "./report-export.js";
30
+ import { plural, reportFilename } from "./report-format.js";
31
+ import { reportCacheKey } from "./report-scope.js";
32
+ import { ReportStatTile } from "./report-stat-tile.js";
33
+ import { useAggregateRead, useWindowRead } from "./use-aggregate-read.js";
34
+ /**
35
+ * How many of the period's leads the funnel is placed from — the Leads
36
+ * section's own window, over the period rather than over everything.
37
+ *
38
+ * The captured count is a server aggregate and never meets this bound; the
39
+ * funnel needs each lead's status and reason, so it reads the period's
40
+ * newest two hundred and says when there were more. At the organization
41
+ * level the bound is PER SITE (AGL-2634): each site's window is its own,
42
+ * and a site with a thousand leads must not crowd out a site with ten.
43
+ */ export const LEAD_CEILING = 200;
44
+ /** How many reasons the bar list draws; the rest are counted beneath it. */ const REASONS_SHOWN = 8;
45
+ /** The CSV's columns: one file for both the statuses and the reasons. */ const COLUMNS = [
46
+ 'Kind',
47
+ 'Label',
48
+ 'Count',
49
+ 'Share'
50
+ ];
51
+ const LEAD_FUNNEL_HELP = Aglyn.pluginDocsHelp('crmReports', {
52
+ anchor: '#lead-funnel',
53
+ excerpt: 'Of the leads this site captured in the period, how many are ' + 'still new, being worked, qualified or unqualified — and the ' + 'reasons the unqualified ones were closed. Placed by when each ' + 'lead was first seen.'
54
+ });
55
+ /** One site's leads first seen in a range — a single-field range, no composite index. */ function leadsBetween(firestore, hostId, from, to) {
56
+ return query(collection(firestore, 'hosts', hostId, 'leads'), where('firstSeenAtMs', '>=', from), where('firstSeenAtMs', '<', to));
57
+ }
58
+ const countOf = (target)=>getCountFromServer(target).then((snapshot)=>snapshot.data().count);
59
+ /**
60
+ * The lead funnel, at whichever level the report is mounted (AGL-2624,
61
+ * AGL-2630, AGL-2634).
62
+ *
63
+ * Under a site: that site. At the organization level: every site the
64
+ * mount lists, one window each, totaled — the org hub's reports total
65
+ * every site, and the leads are no exception now that the fan-out is
66
+ * bounded by the org's site list. With no sites to read the card says so
67
+ * instead of guessing.
68
+ */ export function LeadFunnelCard(props) {
69
+ const { report, hostId } = props;
70
+ const mount = useCrmOrgMount();
71
+ if (hostId) return /*#__PURE__*/ _jsx(SiteLeadFunnelCard, {
72
+ report: report,
73
+ hostId: hostId
74
+ });
75
+ if (mount && (!mount.hostsReady || mount.hosts.length > 0)) {
76
+ return /*#__PURE__*/ _jsx(OrgLeadFunnelCard, {
77
+ report: report
78
+ });
79
+ }
80
+ return /*#__PURE__*/ _jsx(CardDisplay, {
81
+ header: 'Lead funnel',
82
+ help: LEAD_FUNNEL_HELP,
83
+ contentGutterX: true,
84
+ contentGutterY: true,
85
+ children: /*#__PURE__*/ _jsx(Typography, {
86
+ variant: "body2",
87
+ color: "text.secondary",
88
+ children: mount ? 'Leads live under a site, and this organization has no sites yet.' : 'Leads live under a site, and this report is mounted under none.'
89
+ })
90
+ });
91
+ }
92
+ /**
93
+ * The lead funnel (AGL-2624): of the leads this site captured in the
94
+ * period, how many are still new, being worked, qualified or unqualified —
95
+ * and why the unqualified ones were closed.
96
+ *
97
+ * A cohort by first sighting, followed to where each lead stands now,
98
+ * because that is the question a period asks of leads — "what became of
99
+ * the ones we got" — and because a lead's status has no history on the
100
+ * document: only its current value. The window is a range on
101
+ * `firstSeenAtMs`, which the capture door stamps once on creation and
102
+ * never again, so a returning visitor's second form is not a second lead
103
+ * in a second period. A single-field range needs no composite index.
104
+ *
105
+ * Read directly off `hosts/{hostId}/leads` under the site's own rules —
106
+ * any member of the site may read it — the way the Leads section reads
107
+ * it, so the funnel and the list can never disagree about who may see a
108
+ * lead.
109
+ */ function SiteLeadFunnelCard(props) {
110
+ const { report, hostId } = props;
111
+ const { range } = report;
112
+ const firestore = useFirestore();
113
+ const captured = useAggregateRead(()=>Promise.all([
114
+ countOf(leadsBetween(firestore, hostId, range.from, range.to)),
115
+ countOf(leadsBetween(firestore, hostId, range.previousFrom, range.previousTo))
116
+ ]).then(([current, previous])=>({
117
+ current,
118
+ previous
119
+ })), [
120
+ firestore,
121
+ hostId,
122
+ range
123
+ ], {
124
+ cacheKey: reportCacheKey(report, `leads:counts:${hostId}`)
125
+ });
126
+ const window = useWindowRead(()=>query(leadsBetween(firestore, hostId, range.from, range.to), orderBy('firstSeenAtMs', 'desc'), limit(LEAD_CEILING + 1)), LEAD_CEILING, [
127
+ firestore,
128
+ hostId,
129
+ range
130
+ ], {
131
+ cacheKey: reportCacheKey(report, `leads:window:${hostId}`)
132
+ });
133
+ const figures = captured.value;
134
+ const sampled = window.status === 'success' && (window.truncated || figures !== null && figures.current > window.rows.length);
135
+ return /*#__PURE__*/ _jsx(LeadFunnelBody, {
136
+ report: report,
137
+ captured: captured,
138
+ window: window,
139
+ caption: sampled ? `Placed from the ${window.rows.length.toLocaleString()} most recently captured leads` + (figures !== null ? ` of ${figures.current.toLocaleString()}` : '') + ' in the period; the captured tile is counted on the server.' : undefined,
140
+ errorText: 'This site’s leads could not be read.'
141
+ });
142
+ }
143
+ SiteLeadFunnelCard.displayName = 'SiteLeadFunnelCard';
144
+ /**
145
+ * THE CROSS-SITE FUNNEL (AGL-2634): every site of the organization, one
146
+ * window each, totaled.
147
+ *
148
+ * The counts are one server aggregate per site per period, summed. The
149
+ * windows are one bounded read per site — the site card's own query, the
150
+ * same ceiling — merged newest-seen first and NOT cut again: the funnel
151
+ * is a placement of leads by status, and cutting the merged list would
152
+ * place a busy site's leads and drop a quiet site's. What the ceiling
153
+ * bounds is the read per site, and the caption says so when any site had
154
+ * more than its window. Held until the mount's site list has settled, so
155
+ * a first round against a partial list is not answered and remembered.
156
+ */ function OrgLeadFunnelCard(props) {
157
+ var _ref, _ref1;
158
+ const { report } = props;
159
+ const { range } = report;
160
+ const firestore = useFirestore();
161
+ const mount = useCrmOrgMount();
162
+ const hostIds = useMemo(()=>(mount == null ? void 0 : mount.hostsReady) ? mount.hosts.map((host)=>host.id) : null, [
163
+ mount
164
+ ]);
165
+ const key = (_ref = hostIds == null ? void 0 : hostIds.join('\n')) != null ? _ref : '';
166
+ const captured = useAggregateRead(()=>hostIds ? Promise.all(hostIds.map((hostId)=>Promise.all([
167
+ countOf(leadsBetween(firestore, hostId, range.from, range.to)),
168
+ countOf(leadsBetween(firestore, hostId, range.previousFrom, range.previousTo))
169
+ ]))).then((pairs)=>pairs.reduce((sum, [current, previous])=>({
170
+ current: sum.current + current,
171
+ previous: sum.previous + previous
172
+ }), {
173
+ current: 0,
174
+ previous: 0
175
+ })) : null, [
176
+ firestore,
177
+ key,
178
+ range
179
+ ], {
180
+ cacheKey: reportCacheKey(report, `leads:counts:org:${key}`)
181
+ });
182
+ const merged = useAggregateRead(()=>hostIds ? Promise.all(hostIds.map((hostId)=>getDocs(query(leadsBetween(firestore, hostId, range.from, range.to), orderBy('firstSeenAtMs', 'desc'), limit(LEAD_CEILING + 1))).then((snapshot)=>ceilingedWindow(snapshot.docs.map((document)=>_extends({}, document.data(), {
183
+ $id: `${hostId}/${document.id}`
184
+ })), LEAD_CEILING)))).then((windows)=>({
185
+ rows: windows.flatMap((window)=>window.rows).sort((a, b)=>{
186
+ var _b_firstSeenAtMs, _a_firstSeenAtMs;
187
+ return Number((_b_firstSeenAtMs = b['firstSeenAtMs']) != null ? _b_firstSeenAtMs : 0) - Number((_a_firstSeenAtMs = a['firstSeenAtMs']) != null ? _a_firstSeenAtMs : 0);
188
+ }),
189
+ truncated: windows.some((window)=>window.truncated)
190
+ })) : null, [
191
+ firestore,
192
+ key,
193
+ range
194
+ ], {
195
+ cacheKey: reportCacheKey(report, `leads:window:org:${key}`)
196
+ });
197
+ const window = useMemo(()=>{
198
+ var _ref, _ref1;
199
+ var _merged_value, _merged_value1;
200
+ return {
201
+ rows: (_ref = (_merged_value = merged.value) == null ? void 0 : _merged_value.rows) != null ? _ref : [],
202
+ truncated: (_ref1 = (_merged_value1 = merged.value) == null ? void 0 : _merged_value1.truncated) != null ? _ref1 : false,
203
+ status: merged.status
204
+ };
205
+ }, [
206
+ merged
207
+ ]);
208
+ const sites = (_ref1 = hostIds == null ? void 0 : hostIds.length) != null ? _ref1 : 0;
209
+ const figures = captured.value;
210
+ const sampled = window.status === 'success' && (window.truncated || figures !== null && figures.current > window.rows.length);
211
+ return /*#__PURE__*/ _jsx(LeadFunnelBody, {
212
+ report: report,
213
+ subheader: `Every site (${sites.toLocaleString()})`,
214
+ captured: captured,
215
+ window: window,
216
+ caption: sampled ? `Placed from the ${window.rows.length.toLocaleString()} most recently captured leads` + ` across ${plural(sites, 'site')} — at most ${LEAD_CEILING.toLocaleString()} per site` + (figures !== null ? ` — of ${figures.current.toLocaleString()}` : '') + ' in the period; the captured tile is counted on the server.' : undefined,
217
+ errorText: 'Some site’s leads could not be read.'
218
+ });
219
+ }
220
+ OrgLeadFunnelCard.displayName = 'OrgLeadFunnelCard';
221
+ /**
222
+ * The funnel as drawn, whichever level fed it: four tiles, the statuses,
223
+ * the reasons, the export. Pure over the two reads.
224
+ */ function LeadFunnelBody(props) {
225
+ const { report, subheader, captured, window, caption, errorText } = props;
226
+ const { period, routes } = report;
227
+ const status = window.status;
228
+ const funnel = useMemo(()=>Aglyn.leadFunnel(window.rows), [
229
+ window
230
+ ]);
231
+ const read = status === 'success';
232
+ const figures = captured.value;
233
+ const share = (count, of)=>of > 0 ? percent(count / of) : null;
234
+ const reasons = funnel.reasons.slice(0, REASONS_SHOWN);
235
+ const moreReasons = funnel.reasons.length - reasons.length;
236
+ return /*#__PURE__*/ _jsx(CardDisplay, {
237
+ header: 'Lead funnel',
238
+ subheader: subheader,
239
+ help: LEAD_FUNNEL_HELP,
240
+ contentGutterX: true,
241
+ contentGutterY: true,
242
+ HeaderProps: {
243
+ action: /*#__PURE__*/ _jsx(Button, _extends({
244
+ component: AppLink
245
+ }, {
246
+ componentVariant: 'naked',
247
+ nativeButton: false
248
+ }, {
249
+ href: routes.section('leads'),
250
+ size: "small",
251
+ color: "primary",
252
+ children: 'Open leads'
253
+ }))
254
+ },
255
+ children: /*#__PURE__*/ _jsxs(Stack, {
256
+ spacing: 2,
257
+ children: [
258
+ /*#__PURE__*/ _jsxs(Stack, {
259
+ direction: "row",
260
+ spacing: 3,
261
+ sx: {
262
+ flexWrap: 'wrap'
263
+ },
264
+ children: [
265
+ /*#__PURE__*/ _jsx(ReportStatTile, {
266
+ label: 'Leads captured',
267
+ value: figures ? figures.current.toLocaleString() : null,
268
+ deltaPct: figures ? Aglyn.deltaPercent(figures.current, figures.previous) : null,
269
+ note: 'first seen in the period',
270
+ href: routes.section('leads')
271
+ }),
272
+ /*#__PURE__*/ _jsx(ReportStatTile, {
273
+ label: 'Qualified',
274
+ value: read ? funnel.byStatus.qualified.toLocaleString() : null,
275
+ note: funnel.qualifiedRate === null ? read ? 'nobody captured in the period' : undefined : `${percent(funnel.qualifiedRate)} of those captured`
276
+ }),
277
+ /*#__PURE__*/ _jsx(ReportStatTile, {
278
+ label: 'Unqualified',
279
+ value: read ? funnel.byStatus.unqualified.toLocaleString() : null,
280
+ note: funnel.unqualifiedRate === null ? undefined : `${percent(funnel.unqualifiedRate)} of those captured`,
281
+ riseIsGood: false
282
+ }),
283
+ /*#__PURE__*/ _jsx(ReportStatTile, {
284
+ label: 'Still open',
285
+ value: read ? funnel.open.toLocaleString() : null,
286
+ note: 'new or being worked',
287
+ href: routes.section('leads')
288
+ })
289
+ ]
290
+ }),
291
+ captured.status === 'error' || status === 'error' ? /*#__PURE__*/ _jsx(Alert, {
292
+ severity: "warning",
293
+ children: errorText
294
+ }) : null,
295
+ /*#__PURE__*/ _jsxs(Section, {
296
+ title: 'Where they stand',
297
+ children: [
298
+ /*#__PURE__*/ _jsx(ReportBreakdown, {
299
+ rows: Aglyn.CRM_LEAD_STATUSES.map((leadStatus)=>{
300
+ var _share;
301
+ return {
302
+ key: leadStatus,
303
+ label: Aglyn.CRM_LEAD_STATUS_LABELS[leadStatus],
304
+ value: funnel.byStatus[leadStatus],
305
+ note: (_share = share(funnel.byStatus[leadStatus], funnel.total)) != null ? _share : undefined,
306
+ color: leadStatus === 'qualified' ? 'success.main' : leadStatus === 'unqualified' ? 'warning.main' : undefined
307
+ };
308
+ }),
309
+ emptyText: ''
310
+ }),
311
+ read && !funnel.total ? /*#__PURE__*/ _jsx(Typography, {
312
+ variant: "body2",
313
+ color: "text.secondary",
314
+ children: 'No leads captured in this period.'
315
+ }) : null
316
+ ]
317
+ }),
318
+ /*#__PURE__*/ _jsxs(Section, {
319
+ title: 'Why leads were unqualified',
320
+ children: [
321
+ /*#__PURE__*/ _jsx(ReportBreakdown, {
322
+ rows: reasons.map((reason)=>{
323
+ var _share;
324
+ return {
325
+ key: reason.key,
326
+ label: reason.label,
327
+ value: reason.count,
328
+ note: (_share = share(reason.count, funnel.byStatus.unqualified)) != null ? _share : undefined,
329
+ color: 'warning.main'
330
+ };
331
+ }),
332
+ emptyText: status === 'loading' ? 'Reading…' : 'No lead was unqualified in this period.'
333
+ }),
334
+ moreReasons > 0 ? /*#__PURE__*/ _jsx(Typography, {
335
+ variant: "caption",
336
+ color: "text.secondary",
337
+ children: `And ${plural(moreReasons, 'other reason')}, each given once or twice.`
338
+ }) : null
339
+ ]
340
+ }),
341
+ /*#__PURE__*/ _jsx(ReportExport, {
342
+ filename: reportFilename('lead-funnel', period),
343
+ columns: COLUMNS,
344
+ rows: ()=>[
345
+ ...Aglyn.CRM_LEAD_STATUSES.map((leadStatus)=>{
346
+ var _share;
347
+ return [
348
+ 'Status',
349
+ Aglyn.CRM_LEAD_STATUS_LABELS[leadStatus],
350
+ funnel.byStatus[leadStatus],
351
+ (_share = share(funnel.byStatus[leadStatus], funnel.total)) != null ? _share : ''
352
+ ];
353
+ }),
354
+ ...funnel.reasons.map((reason)=>{
355
+ var _share;
356
+ return [
357
+ 'Unqualified reason',
358
+ reason.label,
359
+ reason.count,
360
+ (_share = share(reason.count, funnel.byStatus.unqualified)) != null ? _share : ''
361
+ ];
362
+ })
363
+ ],
364
+ disabled: !read || !funnel.total,
365
+ caption: caption
366
+ })
367
+ ]
368
+ })
369
+ });
370
+ }
371
+ LeadFunnelBody.displayName = 'LeadFunnelBody';
372
+ LeadFunnelCard.displayName = 'LeadFunnelCard';
373
+ export default LeadFunnelCard;
374
+
375
+ //# sourceMappingURL=lead-funnel-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../libs/plugins/crm/src/lib/components/reports/lead-funnel-card.tsx"],"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'use client'\n\nimport * as Aglyn from '@aglyn/aglyn'\nimport { AppLink, CardDisplay } from '@aglyn/shared-ui-jsx'\nimport {\n percent,\n Section,\n} from '@aglyn/shared-ui-jsx/components/measured-figures.component'\nimport { ceilingedWindow } from '@aglyn/tenant-feature-instance/hooks/host-collection-queries'\nimport { Alert, Button, Stack, Typography } from '@mui/material'\nimport {\n collection,\n type Firestore,\n getCountFromServer,\n getDocs,\n limit,\n orderBy,\n query,\n where,\n} from 'firebase/firestore'\nimport { useMemo } from 'react'\nimport { useFirestore } from '@aglyn/tenant-feature-instance'\nimport { useCrmOrgMount } from '../../hooks/use-crm-org-mount'\nimport { ReportBreakdown } from './report-breakdown'\nimport { ReportExport } from './report-export'\nimport { plural, reportFilename } from './report-format'\nimport { type CrmReportScope, reportCacheKey } from './report-scope'\nimport { ReportStatTile } from './report-stat-tile'\nimport {\n type AggregateRead,\n useAggregateRead,\n useWindowRead,\n type WindowRead,\n} from './use-aggregate-read'\n\n/**\n * How many of the period's leads the funnel is placed from — the Leads\n * section's own window, over the period rather than over everything.\n *\n * The captured count is a server aggregate and never meets this bound; the\n * funnel needs each lead's status and reason, so it reads the period's\n * newest two hundred and says when there were more. At the organization\n * level the bound is PER SITE (AGL-2634): each site's window is its own,\n * and a site with a thousand leads must not crowd out a site with ten.\n */\nexport const LEAD_CEILING = 200\n/** How many reasons the bar list draws; the rest are counted beneath it. */\nconst REASONS_SHOWN = 8\n\n/** The CSV's columns: one file for both the statuses and the reasons. */\nconst COLUMNS = ['Kind', 'Label', 'Count', 'Share'] as const\n\ntype LeadRow = Record<string, unknown> & Aglyn.CrmLeadFields & { $id: string }\n\n/** The period's captured count, and the previous period's for the delta. */\ninterface CapturedFigures {\n current: number\n previous: number\n}\n\nexport interface LeadFunnelCardProps {\n report: CrmReportScope\n /**\n * The site whose leads are placed. A lead lives under its host, not the\n * org — `hosts/{hostId}/leads`, private by path, no `visibleTo` — so the\n * report's org scope cannot reach it and the card is told the site. At\n * the organization level `null` (AGL-2630): the card then reads every\n * site the mount lists, one window each (AGL-2634).\n */\n hostId: string | null\n}\n\nconst LEAD_FUNNEL_HELP = Aglyn.pluginDocsHelp('crmReports', {\n anchor: '#lead-funnel',\n excerpt:\n 'Of the leads this site captured in the period, how many are ' +\n 'still new, being worked, qualified or unqualified — and the ' +\n 'reasons the unqualified ones were closed. Placed by when each ' +\n 'lead was first seen.',\n})\n\n/** One site's leads first seen in a range — a single-field range, no composite index. */\nfunction leadsBetween(firestore: Firestore, hostId: string, from: number, to: number) {\n return query(\n collection(firestore, 'hosts', hostId, 'leads'),\n where('firstSeenAtMs', '>=', from),\n where('firstSeenAtMs', '<', to),\n )\n}\n\nconst countOf = (target: ReturnType<typeof query>) =>\n getCountFromServer(target).then((snapshot) => snapshot.data().count)\n\n/**\n * The lead funnel, at whichever level the report is mounted (AGL-2624,\n * AGL-2630, AGL-2634).\n *\n * Under a site: that site. At the organization level: every site the\n * mount lists, one window each, totaled — the org hub's reports total\n * every site, and the leads are no exception now that the fan-out is\n * bounded by the org's site list. With no sites to read the card says so\n * instead of guessing.\n */\nexport function LeadFunnelCard(props: LeadFunnelCardProps) {\n const { report, hostId } = props\n const mount = useCrmOrgMount()\n if (hostId) return <SiteLeadFunnelCard report={report} hostId={hostId} />\n if (mount && (!mount.hostsReady || mount.hosts.length > 0)) {\n return <OrgLeadFunnelCard report={report} />\n }\n return (\n <CardDisplay header={'Lead funnel'} help={LEAD_FUNNEL_HELP} contentGutterX contentGutterY>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {mount\n ? 'Leads live under a site, and this organization has no sites yet.'\n : 'Leads live under a site, and this report is mounted under none.'}\n </Typography>\n </CardDisplay>\n )\n}\n\n/**\n * The lead funnel (AGL-2624): of the leads this site captured in the\n * period, how many are still new, being worked, qualified or unqualified —\n * and why the unqualified ones were closed.\n *\n * A cohort by first sighting, followed to where each lead stands now,\n * because that is the question a period asks of leads — \"what became of\n * the ones we got\" — and because a lead's status has no history on the\n * document: only its current value. The window is a range on\n * `firstSeenAtMs`, which the capture door stamps once on creation and\n * never again, so a returning visitor's second form is not a second lead\n * in a second period. A single-field range needs no composite index.\n *\n * Read directly off `hosts/{hostId}/leads` under the site's own rules —\n * any member of the site may read it — the way the Leads section reads\n * it, so the funnel and the list can never disagree about who may see a\n * lead.\n */\nfunction SiteLeadFunnelCard(props: { report: CrmReportScope; hostId: string }) {\n const { report, hostId } = props\n const { range } = report\n const firestore = useFirestore()\n\n const captured = useAggregateRead<CapturedFigures>(\n () =>\n Promise.all([\n countOf(leadsBetween(firestore, hostId, range.from, range.to)),\n countOf(leadsBetween(firestore, hostId, range.previousFrom, range.previousTo)),\n ]).then(([current, previous]) => ({ current, previous })),\n [firestore, hostId, range],\n { cacheKey: reportCacheKey(report, `leads:counts:${hostId}`) },\n )\n const window = useWindowRead<LeadRow>(\n () =>\n query(\n leadsBetween(firestore, hostId, range.from, range.to),\n orderBy('firstSeenAtMs', 'desc'),\n limit(LEAD_CEILING + 1),\n ),\n LEAD_CEILING,\n [firestore, hostId, range],\n { cacheKey: reportCacheKey(report, `leads:window:${hostId}`) },\n )\n const figures = captured.value\n const sampled =\n window.status === 'success' &&\n (window.truncated || (figures !== null && figures.current > window.rows.length))\n return (\n <LeadFunnelBody\n report={report}\n captured={captured}\n window={window}\n caption={\n sampled\n ? `Placed from the ${window.rows.length.toLocaleString()} most recently captured leads` +\n (figures !== null ? ` of ${figures.current.toLocaleString()}` : '') +\n ' in the period; the captured tile is counted on the server.'\n : undefined\n }\n errorText={'This site’s leads could not be read.'}\n />\n )\n}\nSiteLeadFunnelCard.displayName = 'SiteLeadFunnelCard'\n\n/**\n * THE CROSS-SITE FUNNEL (AGL-2634): every site of the organization, one\n * window each, totaled.\n *\n * The counts are one server aggregate per site per period, summed. The\n * windows are one bounded read per site — the site card's own query, the\n * same ceiling — merged newest-seen first and NOT cut again: the funnel\n * is a placement of leads by status, and cutting the merged list would\n * place a busy site's leads and drop a quiet site's. What the ceiling\n * bounds is the read per site, and the caption says so when any site had\n * more than its window. Held until the mount's site list has settled, so\n * a first round against a partial list is not answered and remembered.\n */\nfunction OrgLeadFunnelCard(props: { report: CrmReportScope }) {\n const { report } = props\n const { range } = report\n const firestore = useFirestore()\n const mount = useCrmOrgMount()\n const hostIds = useMemo(\n () => (mount?.hostsReady ? mount.hosts.map((host) => host.id) : null),\n [mount],\n )\n const key = hostIds?.join('\\n') ?? ''\n\n const captured = useAggregateRead<CapturedFigures>(\n () =>\n hostIds\n ? Promise.all(\n hostIds.map((hostId) =>\n Promise.all([\n countOf(leadsBetween(firestore, hostId, range.from, range.to)),\n countOf(leadsBetween(firestore, hostId, range.previousFrom, range.previousTo)),\n ]),\n ),\n ).then((pairs) =>\n pairs.reduce(\n (sum, [current, previous]) => ({\n current: sum.current + current,\n previous: sum.previous + previous,\n }),\n { current: 0, previous: 0 },\n ),\n )\n : null,\n [firestore, key, range],\n { cacheKey: reportCacheKey(report, `leads:counts:org:${key}`) },\n )\n const merged = useAggregateRead<{ rows: LeadRow[]; truncated: boolean }>(\n () =>\n hostIds\n ? Promise.all(\n hostIds.map((hostId) =>\n getDocs(\n query(\n leadsBetween(firestore, hostId, range.from, range.to),\n orderBy('firstSeenAtMs', 'desc'),\n limit(LEAD_CEILING + 1),\n ),\n ).then((snapshot) =>\n ceilingedWindow(\n snapshot.docs.map(\n (document) =>\n ({ ...document.data(), $id: `${hostId}/${document.id}` }) as unknown as LeadRow,\n ),\n LEAD_CEILING,\n ),\n ),\n ),\n ).then((windows) => ({\n rows: windows\n .flatMap((window) => window.rows)\n .sort(\n (a, b) =>\n Number(b['firstSeenAtMs'] ?? 0) - Number(a['firstSeenAtMs'] ?? 0),\n ),\n truncated: windows.some((window) => window.truncated),\n }))\n : null,\n [firestore, key, range],\n { cacheKey: reportCacheKey(report, `leads:window:org:${key}`) },\n )\n const window = useMemo<WindowRead<LeadRow>>(\n () => ({\n rows: merged.value?.rows ?? [],\n truncated: merged.value?.truncated ?? false,\n status: merged.status,\n }),\n [merged],\n )\n const sites = hostIds?.length ?? 0\n const figures = captured.value\n const sampled =\n window.status === 'success' &&\n (window.truncated || (figures !== null && figures.current > window.rows.length))\n return (\n <LeadFunnelBody\n report={report}\n subheader={`Every site (${sites.toLocaleString()})`}\n captured={captured}\n window={window}\n caption={\n sampled\n ? `Placed from the ${window.rows.length.toLocaleString()} most recently captured leads` +\n ` across ${plural(sites, 'site')} — at most ${LEAD_CEILING.toLocaleString()} per site` +\n (figures !== null ? ` — of ${figures.current.toLocaleString()}` : '') +\n ' in the period; the captured tile is counted on the server.'\n : undefined\n }\n errorText={'Some site’s leads could not be read.'}\n />\n )\n}\nOrgLeadFunnelCard.displayName = 'OrgLeadFunnelCard'\n\n/**\n * The funnel as drawn, whichever level fed it: four tiles, the statuses,\n * the reasons, the export. Pure over the two reads.\n */\nfunction LeadFunnelBody(props: {\n report: CrmReportScope\n subheader?: string\n captured: AggregateRead<CapturedFigures>\n window: WindowRead<LeadRow>\n caption?: string\n errorText: string\n}) {\n const { report, subheader, captured, window, caption, errorText } = props\n const { period, routes } = report\n const status = window.status\n\n const funnel = useMemo(() => Aglyn.leadFunnel(window.rows), [window])\n const read = status === 'success'\n const figures = captured.value\n const share = (count: number, of: number): string | null =>\n of > 0 ? percent(count / of) : null\n const reasons = funnel.reasons.slice(0, REASONS_SHOWN)\n const moreReasons = funnel.reasons.length - reasons.length\n\n return (\n <CardDisplay\n header={'Lead funnel'}\n subheader={subheader}\n help={LEAD_FUNNEL_HELP}\n contentGutterX\n contentGutterY\n HeaderProps={{\n action: (\n <Button\n component={AppLink as any}\n {...({ componentVariant: 'naked', nativeButton: false } as any)}\n href={routes.section('leads')}\n size=\"small\"\n color=\"primary\"\n >\n {'Open leads'}\n </Button>\n ),\n }}\n >\n <Stack spacing={2}>\n <Stack direction=\"row\" spacing={3} sx={{ flexWrap: 'wrap' }}>\n <ReportStatTile\n label={'Leads captured'}\n value={figures ? figures.current.toLocaleString() : null}\n deltaPct={figures ? Aglyn.deltaPercent(figures.current, figures.previous) : null}\n note={'first seen in the period'}\n href={routes.section('leads')}\n />\n <ReportStatTile\n label={'Qualified'}\n value={read ? funnel.byStatus.qualified.toLocaleString() : null}\n note={\n funnel.qualifiedRate === null\n ? read\n ? 'nobody captured in the period'\n : undefined\n : `${percent(funnel.qualifiedRate)} of those captured`\n }\n />\n <ReportStatTile\n label={'Unqualified'}\n value={read ? funnel.byStatus.unqualified.toLocaleString() : null}\n note={\n funnel.unqualifiedRate === null\n ? undefined\n : `${percent(funnel.unqualifiedRate)} of those captured`\n }\n riseIsGood={false}\n />\n <ReportStatTile\n label={'Still open'}\n value={read ? funnel.open.toLocaleString() : null}\n note={'new or being worked'}\n href={routes.section('leads')}\n />\n </Stack>\n {captured.status === 'error' || status === 'error' ? (\n <Alert severity=\"warning\">{errorText}</Alert>\n ) : null}\n <Section title={'Where they stand'}>\n <ReportBreakdown\n rows={Aglyn.CRM_LEAD_STATUSES.map((leadStatus) => ({\n key: leadStatus,\n label: Aglyn.CRM_LEAD_STATUS_LABELS[leadStatus],\n value: funnel.byStatus[leadStatus],\n note: share(funnel.byStatus[leadStatus], funnel.total) ?? undefined,\n color:\n leadStatus === 'qualified'\n ? 'success.main'\n : leadStatus === 'unqualified'\n ? 'warning.main'\n : undefined,\n }))}\n emptyText={''}\n />\n {read && !funnel.total ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No leads captured in this period.'}\n </Typography>\n ) : null}\n </Section>\n <Section title={'Why leads were unqualified'}>\n <ReportBreakdown\n rows={reasons.map((reason) => ({\n key: reason.key,\n label: reason.label,\n value: reason.count,\n note: share(reason.count, funnel.byStatus.unqualified) ?? undefined,\n color: 'warning.main',\n }))}\n emptyText={\n status === 'loading' ? 'Reading…' : 'No lead was unqualified in this period.'\n }\n />\n {moreReasons > 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`And ${plural(moreReasons, 'other reason')}, each given once or twice.`}\n </Typography>\n ) : null}\n </Section>\n <ReportExport\n filename={reportFilename('lead-funnel', period)}\n columns={COLUMNS}\n rows={() => [\n ...Aglyn.CRM_LEAD_STATUSES.map((leadStatus) => [\n 'Status',\n Aglyn.CRM_LEAD_STATUS_LABELS[leadStatus],\n funnel.byStatus[leadStatus],\n share(funnel.byStatus[leadStatus], funnel.total) ?? '',\n ]),\n ...funnel.reasons.map((reason) => [\n 'Unqualified reason',\n reason.label,\n reason.count,\n share(reason.count, funnel.byStatus.unqualified) ?? '',\n ]),\n ]}\n disabled={!read || !funnel.total}\n caption={caption}\n />\n </Stack>\n </CardDisplay>\n )\n}\nLeadFunnelBody.displayName = 'LeadFunnelBody'\nLeadFunnelCard.displayName = 'LeadFunnelCard'\n\nexport default LeadFunnelCard\n"],"names":["Aglyn","AppLink","CardDisplay","percent","Section","ceilingedWindow","Alert","Button","Stack","Typography","collection","getCountFromServer","getDocs","limit","orderBy","query","where","useMemo","useFirestore","useCrmOrgMount","ReportBreakdown","ReportExport","plural","reportFilename","reportCacheKey","ReportStatTile","useAggregateRead","useWindowRead","LEAD_CEILING","REASONS_SHOWN","COLUMNS","LEAD_FUNNEL_HELP","pluginDocsHelp","anchor","excerpt","leadsBetween","firestore","hostId","from","to","countOf","target","then","snapshot","data","count","LeadFunnelCard","props","report","mount","SiteLeadFunnelCard","hostsReady","hosts","length","OrgLeadFunnelCard","header","help","contentGutterX","contentGutterY","variant","color","range","captured","Promise","all","previousFrom","previousTo","current","previous","cacheKey","window","figures","value","sampled","status","truncated","rows","LeadFunnelBody","caption","toLocaleString","undefined","errorText","displayName","hostIds","map","host","id","key","join","pairs","reduce","sum","merged","docs","document","$id","windows","flatMap","sort","a","b","Number","some","sites","subheader","period","routes","funnel","leadFunnel","read","share","of","reasons","slice","moreReasons","HeaderProps","action","component","componentVariant","nativeButton","href","section","size","spacing","direction","sx","flexWrap","label","deltaPct","deltaPercent","note","byStatus","qualified","qualifiedRate","unqualified","unqualifiedRate","riseIsGood","open","severity","title","CRM_LEAD_STATUSES","leadStatus","CRM_LEAD_STATUS_LABELS","total","emptyText","reason","filename","columns","disabled"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type CrmReportScope } from './report-scope';
2
+ export interface PipelineCardProps {
3
+ report: CrmReportScope;
4
+ }
5
+ /**
6
+ * The open pipeline: how many deals, what they add up to, what they are
7
+ * worth at their stage odds, where they sit, and the largest of them
8
+ * (AGL-2604).
9
+ *
10
+ * Not period-scoped, deliberately. A pipeline is a stock, not a flow — what
11
+ * is open NOW — and a "pipeline over the last 30 days" would be a report on
12
+ * deals created in a window, which is a different question with a different
13
+ * answer. The period picker governs the cards that measure flows.
14
+ */
15
+ export declare function PipelineCard(props: PipelineCardProps): import("react").JSX.Element;
16
+ export declare namespace PipelineCard {
17
+ var displayName: string;
18
+ }
19
+ export default PipelineCard;