@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,42 @@
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
+ * DELETING A COMPANY IS ONE REQUEST (AGL-2597; a route since AGL-2804, shared
19
+ * by the record page and the bulk bar since AGL-2621).
20
+ *
21
+ * Firestore does not cascade, so a delete unlinks every contact at the
22
+ * company before the company goes — and the unlink clears each holder's
23
+ * facet that named it, which is the server's to write. `crm/company-delete`
24
+ * runs the pass, bounded and honest past the bound; this module is the
25
+ * console's side of it.
26
+ */
27
+ import type { CrmApiResult, CrmApiRoute } from '../components/use-crm-api';
28
+ import type { CompanyDeleteOutcome } from './company-delete-route';
29
+ export { COMPANY_DETACH_LIMIT, type CompanyDeleteOutcome } from './company-delete-route';
30
+ /** The CRM API caller a surface already holds — `useCrmApi`'s. */
31
+ export type CrmApiCall = (route: CrmApiRoute, payload: Record<string, unknown>) => Promise<CrmApiResult>;
32
+ /**
33
+ * Delete one company through the route: the contacts unlinked, then the
34
+ * company — or, past the bound, a pass's worth unlinked and the company left
35
+ * standing. A refusal throws with the route's own sentence.
36
+ */
37
+ export declare function deleteCompanyThroughRoute(call: CrmApiCall, companyId: string): Promise<CompanyDeleteOutcome>;
38
+ /**
39
+ * What a failed delete says: the route's own sentence, which names the
40
+ * reason — a member scoped to particular sites is told why they cannot.
41
+ */
42
+ export declare function companyDeleteFailureMessage(error: unknown): string;
@@ -0,0 +1,52 @@
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
+ * DELETING A COMPANY IS ONE REQUEST (AGL-2597; a route since AGL-2804, shared
18
+ * by the record page and the bulk bar since AGL-2621).
19
+ *
20
+ * Firestore does not cascade, so a delete unlinks every contact at the
21
+ * company before the company goes — and the unlink clears each holder's
22
+ * facet that named it, which is the server's to write. `crm/company-delete`
23
+ * runs the pass, bounded and honest past the bound; this module is the
24
+ * console's side of it.
25
+ */ export { COMPANY_DETACH_LIMIT } from "./company-delete-route.js";
26
+ /**
27
+ * Delete one company through the route: the contacts unlinked, then the
28
+ * company — or, past the bound, a pass's worth unlinked and the company left
29
+ * standing. A refusal throws with the route's own sentence.
30
+ */ export async function deleteCompanyThroughRoute(call, companyId) {
31
+ var _payload_detached;
32
+ const { response, payload } = await call('company-delete', {
33
+ companyId
34
+ });
35
+ if (!response.ok) {
36
+ const error = payload['error'];
37
+ throw new Error(typeof error === 'string' && error ? error : `The company could not be deleted (${response.status}).`);
38
+ }
39
+ return {
40
+ deleted: payload['deleted'] === true,
41
+ detached: Number((_payload_detached = payload['detached']) != null ? _payload_detached : 0),
42
+ moreRemain: payload['moreRemain'] === true
43
+ };
44
+ }
45
+ /**
46
+ * What a failed delete says: the route's own sentence, which names the
47
+ * reason — a member scoped to particular sites is told why they cannot.
48
+ */ export function companyDeleteFailureMessage(error) {
49
+ return error instanceof Error && error.message ? error.message : 'An error has occurred';
50
+ }
51
+
52
+ //# sourceMappingURL=company-delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/company-delete.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 * DELETING A COMPANY IS ONE REQUEST (AGL-2597; a route since AGL-2804, shared\n * by the record page and the bulk bar since AGL-2621).\n *\n * Firestore does not cascade, so a delete unlinks every contact at the\n * company before the company goes — and the unlink clears each holder's\n * facet that named it, which is the server's to write. `crm/company-delete`\n * runs the pass, bounded and honest past the bound; this module is the\n * console's side of it.\n */\n\nimport type { CrmApiResult, CrmApiRoute } from '../components/use-crm-api'\nimport type { CompanyDeleteOutcome } from './company-delete-route'\n\nexport { COMPANY_DETACH_LIMIT, type CompanyDeleteOutcome } from './company-delete-route'\n\n/** The CRM API caller a surface already holds — `useCrmApi`'s. */\nexport type CrmApiCall = (\n route: CrmApiRoute,\n payload: Record<string, unknown>,\n) => Promise<CrmApiResult>\n\n/**\n * Delete one company through the route: the contacts unlinked, then the\n * company — or, past the bound, a pass's worth unlinked and the company left\n * standing. A refusal throws with the route's own sentence.\n */\nexport async function deleteCompanyThroughRoute(\n call: CrmApiCall,\n companyId: string,\n): Promise<CompanyDeleteOutcome> {\n const { response, payload } = await call('company-delete', { companyId })\n if (!response.ok) {\n const error = payload['error']\n throw new Error(\n typeof error === 'string' && error\n ? error\n : `The company could not be deleted (${response.status}).`,\n )\n }\n return {\n deleted: payload['deleted'] === true,\n detached: Number(payload['detached'] ?? 0),\n moreRemain: payload['moreRemain'] === true,\n }\n}\n\n/**\n * What a failed delete says: the route's own sentence, which names the\n * reason — a member scoped to particular sites is told why they cannot.\n */\nexport function companyDeleteFailureMessage(error: unknown): string {\n return error instanceof Error && error.message ? error.message : 'An error has occurred'\n}\n"],"names":["COMPANY_DETACH_LIMIT","deleteCompanyThroughRoute","call","companyId","payload","response","ok","error","Error","status","deleted","detached","Number","moreRemain","companyDeleteFailureMessage","message"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;CASC,GAKD,SAASA,oBAAoB,QAAmC,4BAAwB;AAQxF;;;;CAIC,GACD,OAAO,eAAeC,0BACpBC,IAAgB,EAChBC,SAAiB;QAaEC;IAXnB,MAAM,EAAEC,QAAQ,EAAED,OAAO,EAAE,GAAG,MAAMF,KAAK,kBAAkB;QAAEC;IAAU;IACvE,IAAI,CAACE,SAASC,EAAE,EAAE;QAChB,MAAMC,QAAQH,OAAO,CAAC,QAAQ;QAC9B,MAAM,IAAII,MACR,OAAOD,UAAU,YAAYA,QACzBA,QACA,CAAC,kCAAkC,EAAEF,SAASI,MAAM,CAAC,EAAE,CAAC;IAEhE;IACA,OAAO;QACLC,SAASN,OAAO,CAAC,UAAU,KAAK;QAChCO,UAAUC,QAAOR,oBAAAA,OAAO,CAAC,WAAW,YAAnBA,oBAAuB;QACxCS,YAAYT,OAAO,CAAC,aAAa,KAAK;IACxC;AACF;AAEA;;;CAGC,GACD,OAAO,SAASU,4BAA4BP,KAAc;IACxD,OAAOA,iBAAiBC,SAASD,MAAMQ,OAAO,GAAGR,MAAMQ,OAAO,GAAG;AACnE"}
@@ -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
+ * LIKELY DUPLICATES (AGL-2625): the rule, with no Firestore attached.
19
+ *
20
+ * Two records are likely one person when they share a name AND a phone
21
+ * number, or a name AND a company. A name alone is two people called Sam
22
+ * Lee; a phone alone is a household; either beside the same name is a
23
+ * person who filled in two forms from two addresses. The card runs ONE
24
+ * bounded query — same normalized name, among the contacts this viewer may
25
+ * list, on the index the list's own search uses — and applies this rule to
26
+ * the page, so no index has to be added for it.
27
+ *
28
+ * Read through the VIEWING group's facet, the way the record page reads
29
+ * everything: the phone and company another holder keeps on the same row
30
+ * are theirs, and matching on them would tell this holder what another
31
+ * business knows. The top-level search echoes stand in only where this
32
+ * holder's facet has nothing, since those are what the global search
33
+ * already shows this reader.
34
+ */
35
+ /** Why a candidate reads as the same person. */
36
+ export type DuplicateReason = 'phone' | 'company';
37
+ /** How many same-name rows the card reads before applying the rule. */
38
+ export declare const CONTACT_DUPLICATES_LIMIT = 25;
39
+ /**
40
+ * The name two records are compared on: this holder's own name for the
41
+ * person, else the canonical one — normalized the way the search key is,
42
+ * so "Jane Doe" and "jane doe" are one name.
43
+ */
44
+ export declare function duplicateNameKey(doc: Record<string, unknown>, groupId: string): string;
45
+ /**
46
+ * Every reason `candidate` reads as the same person as `current` — empty
47
+ * when it does not. A candidate with a different name, or the record
48
+ * itself, never matches.
49
+ */
50
+ export declare function likelyDuplicateReasons(current: {
51
+ id: string;
52
+ doc: Record<string, unknown>;
53
+ }, candidate: {
54
+ id: string;
55
+ doc: Record<string, unknown>;
56
+ }, groupId: string): DuplicateReason[];
57
+ /** How a reason reads on the card. */
58
+ export declare const DUPLICATE_REASON_LABELS: Record<DuplicateReason, string>;
@@ -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 { nameSearchKey, readContactFacet, readContactCompanyLink } from "@aglyn/aglyn";
17
+ /** How many same-name rows the card reads before applying the rule. */ export const CONTACT_DUPLICATES_LIMIT = 25;
18
+ function text(value) {
19
+ return typeof value === 'string' ? value.trim() : '';
20
+ }
21
+ /** This holder's phone for the person, or the echo the last writer left. */ function phoneOf(doc, groupId) {
22
+ return text(readContactFacet(doc, groupId).phone) || text(doc['phone']);
23
+ }
24
+ /** The company keys a record answers to: its linked ids and its typed name. */ function companyKeysOf(doc, groupId) {
25
+ const facet = readContactFacet(doc, groupId);
26
+ const link = readContactCompanyLink(doc, groupId);
27
+ const name = nameSearchKey(facet.companyName || text(doc['companyName']));
28
+ return [
29
+ ...link.companyId ? [
30
+ `id:${link.companyId}`
31
+ ] : [],
32
+ ...link.companyIds.map((id)=>`id:${id}`),
33
+ ...name ? [
34
+ `name:${name}`
35
+ ] : []
36
+ ];
37
+ }
38
+ /**
39
+ * The name two records are compared on: this holder's own name for the
40
+ * person, else the canonical one — normalized the way the search key is,
41
+ * so "Jane Doe" and "jane doe" are one name.
42
+ */ export function duplicateNameKey(doc, groupId) {
43
+ return nameSearchKey(text(readContactFacet(doc, groupId).name) || text(doc['name']));
44
+ }
45
+ /**
46
+ * Every reason `candidate` reads as the same person as `current` — empty
47
+ * when it does not. A candidate with a different name, or the record
48
+ * itself, never matches.
49
+ */ export function likelyDuplicateReasons(current, candidate, groupId) {
50
+ if (current.id === candidate.id) return [];
51
+ const name = duplicateNameKey(current.doc, groupId);
52
+ if (!name || name !== duplicateNameKey(candidate.doc, groupId)) return [];
53
+ const reasons = [];
54
+ const phone = phoneOf(current.doc, groupId);
55
+ if (phone && phone === phoneOf(candidate.doc, groupId)) reasons.push('phone');
56
+ const keys = new Set(companyKeysOf(current.doc, groupId));
57
+ if (companyKeysOf(candidate.doc, groupId).some((key)=>keys.has(key))) {
58
+ reasons.push('company');
59
+ }
60
+ return reasons;
61
+ }
62
+ /** How a reason reads on the card. */ export const DUPLICATE_REASON_LABELS = {
63
+ phone: 'Same name and phone',
64
+ company: 'Same name and company'
65
+ };
66
+
67
+ //# sourceMappingURL=contact-duplicates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/contact-duplicates.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 { nameSearchKey, readContactFacet, readContactCompanyLink } from '@aglyn/aglyn'\n\n/**\n * LIKELY DUPLICATES (AGL-2625): the rule, with no Firestore attached.\n *\n * Two records are likely one person when they share a name AND a phone\n * number, or a name AND a company. A name alone is two people called Sam\n * Lee; a phone alone is a household; either beside the same name is a\n * person who filled in two forms from two addresses. The card runs ONE\n * bounded query — same normalized name, among the contacts this viewer may\n * list, on the index the list's own search uses — and applies this rule to\n * the page, so no index has to be added for it.\n *\n * Read through the VIEWING group's facet, the way the record page reads\n * everything: the phone and company another holder keeps on the same row\n * are theirs, and matching on them would tell this holder what another\n * business knows. The top-level search echoes stand in only where this\n * holder's facet has nothing, since those are what the global search\n * already shows this reader.\n */\n\n/** Why a candidate reads as the same person. */\nexport type DuplicateReason = 'phone' | 'company'\n\n/** How many same-name rows the card reads before applying the rule. */\nexport const CONTACT_DUPLICATES_LIMIT = 25\n\nfunction text(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\n/** This holder's phone for the person, or the echo the last writer left. */\nfunction phoneOf(doc: Record<string, unknown>, groupId: string): string {\n return text(readContactFacet(doc, groupId).phone) || text(doc['phone'])\n}\n\n/** The company keys a record answers to: its linked ids and its typed name. */\nfunction companyKeysOf(doc: Record<string, unknown>, groupId: string): string[] {\n const facet = readContactFacet(doc, groupId)\n const link = readContactCompanyLink(doc, groupId)\n const name = nameSearchKey(facet.companyName || text(doc['companyName']))\n return [\n ...(link.companyId ? [`id:${link.companyId}`] : []),\n ...link.companyIds.map((id) => `id:${id}`),\n ...(name ? [`name:${name}`] : []),\n ]\n}\n\n/**\n * The name two records are compared on: this holder's own name for the\n * person, else the canonical one — normalized the way the search key is,\n * so \"Jane Doe\" and \"jane doe\" are one name.\n */\nexport function duplicateNameKey(\n doc: Record<string, unknown>,\n groupId: string,\n): string {\n return nameSearchKey(text(readContactFacet(doc, groupId).name) || text(doc['name']))\n}\n\n/**\n * Every reason `candidate` reads as the same person as `current` — empty\n * when it does not. A candidate with a different name, or the record\n * itself, never matches.\n */\nexport function likelyDuplicateReasons(\n current: { id: string; doc: Record<string, unknown> },\n candidate: { id: string; doc: Record<string, unknown> },\n groupId: string,\n): DuplicateReason[] {\n if (current.id === candidate.id) return []\n const name = duplicateNameKey(current.doc, groupId)\n if (!name || name !== duplicateNameKey(candidate.doc, groupId)) return []\n const reasons: DuplicateReason[] = []\n const phone = phoneOf(current.doc, groupId)\n if (phone && phone === phoneOf(candidate.doc, groupId)) reasons.push('phone')\n const keys = new Set(companyKeysOf(current.doc, groupId))\n if (companyKeysOf(candidate.doc, groupId).some((key) => keys.has(key))) {\n reasons.push('company')\n }\n return reasons\n}\n\n/** How a reason reads on the card. */\nexport const DUPLICATE_REASON_LABELS: Record<DuplicateReason, string> = {\n phone: 'Same name and phone',\n company: 'Same name and company',\n}\n"],"names":["nameSearchKey","readContactFacet","readContactCompanyLink","CONTACT_DUPLICATES_LIMIT","text","value","trim","phoneOf","doc","groupId","phone","companyKeysOf","facet","link","name","companyName","companyId","companyIds","map","id","duplicateNameKey","likelyDuplicateReasons","current","candidate","reasons","push","keys","Set","some","key","has","DUPLICATE_REASON_LABELS","company"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,aAAa,EAAEC,gBAAgB,EAAEC,sBAAsB,QAAQ,eAAc;AAwBtF,qEAAqE,GACrE,OAAO,MAAMC,2BAA2B,GAAE;AAE1C,SAASC,KAAKC,KAAc;IAC1B,OAAO,OAAOA,UAAU,WAAWA,MAAMC,IAAI,KAAK;AACpD;AAEA,0EAA0E,GAC1E,SAASC,QAAQC,GAA4B,EAAEC,OAAe;IAC5D,OAAOL,KAAKH,iBAAiBO,KAAKC,SAASC,KAAK,KAAKN,KAAKI,GAAG,CAAC,QAAQ;AACxE;AAEA,6EAA6E,GAC7E,SAASG,cAAcH,GAA4B,EAAEC,OAAe;IAClE,MAAMG,QAAQX,iBAAiBO,KAAKC;IACpC,MAAMI,OAAOX,uBAAuBM,KAAKC;IACzC,MAAMK,OAAOd,cAAcY,MAAMG,WAAW,IAAIX,KAAKI,GAAG,CAAC,cAAc;IACvE,OAAO;WACDK,KAAKG,SAAS,GAAG;YAAC,CAAC,GAAG,EAAEH,KAAKG,SAAS,EAAE;SAAC,GAAG,EAAE;WAC/CH,KAAKI,UAAU,CAACC,GAAG,CAAC,CAACC,KAAO,CAAC,GAAG,EAAEA,IAAI;WACrCL,OAAO;YAAC,CAAC,KAAK,EAAEA,MAAM;SAAC,GAAG,EAAE;KACjC;AACH;AAEA;;;;CAIC,GACD,OAAO,SAASM,iBACdZ,GAA4B,EAC5BC,OAAe;IAEf,OAAOT,cAAcI,KAAKH,iBAAiBO,KAAKC,SAASK,IAAI,KAAKV,KAAKI,GAAG,CAAC,OAAO;AACpF;AAEA;;;;CAIC,GACD,OAAO,SAASa,uBACdC,OAAqD,EACrDC,SAAuD,EACvDd,OAAe;IAEf,IAAIa,QAAQH,EAAE,KAAKI,UAAUJ,EAAE,EAAE,OAAO,EAAE;IAC1C,MAAML,OAAOM,iBAAiBE,QAAQd,GAAG,EAAEC;IAC3C,IAAI,CAACK,QAAQA,SAASM,iBAAiBG,UAAUf,GAAG,EAAEC,UAAU,OAAO,EAAE;IACzE,MAAMe,UAA6B,EAAE;IACrC,MAAMd,QAAQH,QAAQe,QAAQd,GAAG,EAAEC;IACnC,IAAIC,SAASA,UAAUH,QAAQgB,UAAUf,GAAG,EAAEC,UAAUe,QAAQC,IAAI,CAAC;IACrE,MAAMC,OAAO,IAAIC,IAAIhB,cAAcW,QAAQd,GAAG,EAAEC;IAChD,IAAIE,cAAcY,UAAUf,GAAG,EAAEC,SAASmB,IAAI,CAAC,CAACC,MAAQH,KAAKI,GAAG,CAACD,OAAO;QACtEL,QAAQC,IAAI,CAAC;IACf;IACA,OAAOD;AACT;AAEA,oCAAoC,GACpC,OAAO,MAAMO,0BAA2D;IACtErB,OAAO;IACPsB,SAAS;AACX,EAAC"}
@@ -0,0 +1,113 @@
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 * as Aglyn from '@aglyn/aglyn';
18
+ import type { AglynPostalAddress, ConsentGroup, ContactInteraction, ContactLifecycleStage, ContactSource } from '@aglyn/aglyn';
19
+ /**
20
+ * One contact, as the VIEWING GROUP may see it (AGL-2596).
21
+ *
22
+ * A contact document is shared by every site in the org, and almost nothing
23
+ * on it is legitimately shared: the notes, tags, timeline, profile and
24
+ * commercial figures are the holder's own records and live in that holder's
25
+ * facet. This is the row after the facet read — flat, so the list, the
26
+ * record page and the export can render fields by name without any of them
27
+ * reaching into `facets.{groupId}` for itself. One projection rather than a
28
+ * facet read at every field is what keeps a surface from ever showing
29
+ * another holder's records: there is no field on this shape that came from
30
+ * the top of the document except the two that ARE shared, the address and
31
+ * the canonical name.
32
+ */
33
+ export interface ContactRecord {
34
+ $id: string;
35
+ /**
36
+ * The facet this row was flattened through — the viewing group under a
37
+ * site, the person's primary holder at the org level (AGL-2630). A write
38
+ * that edits the row goes back to the same facet, so a surface that has
39
+ * only the flat record can still address the holder's own fields.
40
+ */
41
+ groupId: string;
42
+ /**
43
+ * A site of that holder's group — the viewing site under a site, and at
44
+ * the organization level the site the primary holder was resolved from —
45
+ * which is where a stage move for this row is made and announced. `''` for
46
+ * a row no site holds.
47
+ */
48
+ holderHostId: string;
49
+ /** Every site that has captured this person, sorted — the org-level "Known by". */
50
+ capturedByHostIds: string[];
51
+ /** The shared identity and the dedupe key. */
52
+ email: string;
53
+ /** The other addresses a merge folded into this record (AGL-2625). */
54
+ alternateEmails: string[];
55
+ /** What THIS holder sees — their own override, or the canonical name. */
56
+ name: string;
57
+ /** The canonical name: the identity of last resort, shared by every holder. */
58
+ canonicalName: string;
59
+ /** This holder's own name for the person, when they have set one. */
60
+ nameOverride: string;
61
+ sources: Partial<Record<ContactSource, true>>;
62
+ /** This holder's timeline, narrowed to the sites the group covers. */
63
+ interactions: ContactInteraction[];
64
+ tags: string[];
65
+ notes: string;
66
+ campaignIds: string[];
67
+ ltvCents: number;
68
+ ordersCount: number;
69
+ phone: string;
70
+ jobTitle: string;
71
+ companyName: string;
72
+ companyId: string;
73
+ /**
74
+ * What linking this person to a company has to know — this holder's link,
75
+ * the shared mirror and the other holders' ids — so the properties card
76
+ * and the bulk bar can plan a link from the row without the document. Not
77
+ * a display field: the mirror is an index every reader of the document
78
+ * already holds, and nothing renders it.
79
+ */
80
+ companyLink: Aglyn.ContactCompanyLinkState;
81
+ address: AglynPostalAddress | null;
82
+ /** This holder's custom field values, keyed by definition key (AGL-2601). */
83
+ custom?: Record<string, Aglyn.ContactCustomValue>;
84
+ /** This holder's attached org-library files, by media id (AGL-2662). */
85
+ mediaIds?: string[];
86
+ ownerUid: string;
87
+ /** Empty when the holder has not placed the person in the funnel. */
88
+ lifecycleStage: ContactLifecycleStage | '';
89
+ /**
90
+ * When the person last opened or clicked one of this holder's campaigns
91
+ * (AGL-2616), or `null` when they never have since the stamp shipped.
92
+ */
93
+ lastEmailEngagementAtMs: number | null;
94
+ /**
95
+ * When the earliest open task against this person is due (AGL-2661), or
96
+ * `null` when nothing is scheduled. SHARED, not the holder's: a task is
97
+ * filed against the contact document, and every holder reading the row
98
+ * sees the same next step.
99
+ */
100
+ nextTaskAtMs: number | null;
101
+ createdAt?: unknown;
102
+ updatedAt?: unknown;
103
+ }
104
+ export { contactPrimaryGroup, NO_HOLDER_GROUP } from '@aglyn/aglyn';
105
+ /** A document off the wire, flattened through one group's facet. */
106
+ export declare function contactRecordFromDoc(row: Record<string, any>, group: ConsentGroup): ContactRecord;
107
+ /**
108
+ * Tags as typed — comma-separated — into the shape the facet stores:
109
+ * lower-cased, trimmed, deduplicated and capped, so a tag typed on the
110
+ * record page and one typed in the create drawer are the same tag to the
111
+ * segment filter that matches on them.
112
+ */
113
+ export declare function parseContactTags(input: string): string[];
@@ -0,0 +1,70 @@
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 * as Aglyn from "@aglyn/aglyn";
17
+ /*
18
+ * `NO_HOLDER_GROUP` and `contactPrimaryGroup` moved to `@aglyn/aglyn`
19
+ * under AGL-2662 so the server's whole-collection export can flatten a
20
+ * contact the way the organization-level list does — the console app may
21
+ * not import this plugin. Re-exported here, so every caller is unchanged.
22
+ */ export { contactPrimaryGroup, NO_HOLDER_GROUP } from "@aglyn/aglyn";
23
+ /** A document off the wire, flattened through one group's facet. */ export function contactRecordFromDoc(row, group) {
24
+ var _row_$id, _facet_name, _facet_tags, _facet_notes, _facet_ltvCents, _facet_ordersCount, _facet_phone, _facet_jobTitle, _facet_companyName, _facet_companyId, _facet_address, _facet_custom, _facet_mediaIds, _facet_ownerUid;
25
+ const facet = Aglyn.readContactFacet(row, group.groupId);
26
+ return {
27
+ $id: String((_row_$id = row['$id']) != null ? _row_$id : ''),
28
+ groupId: group.groupId,
29
+ holderHostId: group.hostId,
30
+ capturedByHostIds: Aglyn.contactCaptureHostIds(row),
31
+ email: typeof row['email'] === 'string' ? row['email'] : '',
32
+ alternateEmails: Array.isArray(row[Aglyn.CONTACT_ALTERNATE_EMAILS_FIELD]) ? row[Aglyn.CONTACT_ALTERNATE_EMAILS_FIELD].filter((email)=>typeof email === 'string') : [],
33
+ name: Aglyn.contactDisplayName(row, group.groupId),
34
+ canonicalName: typeof row['name'] === 'string' ? row['name'] : '',
35
+ nameOverride: (_facet_name = facet.name) != null ? _facet_name : '',
36
+ sources: facet.sources,
37
+ interactions: Aglyn.interactionsForGroup(facet.interactions, group.hostIds),
38
+ tags: (_facet_tags = facet.tags) != null ? _facet_tags : [],
39
+ notes: (_facet_notes = facet.notes) != null ? _facet_notes : '',
40
+ campaignIds: Aglyn.readContactCampaignIds(row, group.groupId),
41
+ ltvCents: (_facet_ltvCents = facet.ltvCents) != null ? _facet_ltvCents : 0,
42
+ ordersCount: (_facet_ordersCount = facet.ordersCount) != null ? _facet_ordersCount : 0,
43
+ phone: (_facet_phone = facet.phone) != null ? _facet_phone : '',
44
+ jobTitle: (_facet_jobTitle = facet.jobTitle) != null ? _facet_jobTitle : '',
45
+ companyName: (_facet_companyName = facet.companyName) != null ? _facet_companyName : '',
46
+ companyId: (_facet_companyId = facet.companyId) != null ? _facet_companyId : '',
47
+ companyLink: Aglyn.readContactCompanyLink(row, group.groupId),
48
+ address: (_facet_address = facet.address) != null ? _facet_address : null,
49
+ custom: (_facet_custom = facet.custom) != null ? _facet_custom : {},
50
+ mediaIds: (_facet_mediaIds = facet.mediaIds) != null ? _facet_mediaIds : [],
51
+ ownerUid: (_facet_ownerUid = facet.ownerUid) != null ? _facet_ownerUid : '',
52
+ lifecycleStage: Aglyn.isContactLifecycleStage(facet.lifecycleStage) ? facet.lifecycleStage : '',
53
+ lastEmailEngagementAtMs: typeof facet.lastEmailEngagementAtMs === 'number' && Number.isFinite(facet.lastEmailEngagementAtMs) && facet.lastEmailEngagementAtMs > 0 ? facet.lastEmailEngagementAtMs : null,
54
+ nextTaskAtMs: Aglyn.readNextTaskAtMs(row),
55
+ createdAt: row['createdAt'],
56
+ updatedAt: row['updatedAt']
57
+ };
58
+ }
59
+ /**
60
+ * Tags as typed — comma-separated — into the shape the facet stores:
61
+ * lower-cased, trimmed, deduplicated and capped, so a tag typed on the
62
+ * record page and one typed in the create drawer are the same tag to the
63
+ * segment filter that matches on them.
64
+ */ export function parseContactTags(input) {
65
+ return [
66
+ ...new Set(input.split(',').map((tag)=>tag.trim().toLowerCase().slice(0, 40)).filter(Boolean).slice(0, 20))
67
+ ];
68
+ }
69
+
70
+ //# sourceMappingURL=contact-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/contact-record.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 * as Aglyn from '@aglyn/aglyn'\nimport type {\n AglynPostalAddress,\n ConsentGroup,\n ContactInteraction,\n ContactLifecycleStage,\n ContactSource,\n} from '@aglyn/aglyn'\n\n/**\n * One contact, as the VIEWING GROUP may see it (AGL-2596).\n *\n * A contact document is shared by every site in the org, and almost nothing\n * on it is legitimately shared: the notes, tags, timeline, profile and\n * commercial figures are the holder's own records and live in that holder's\n * facet. This is the row after the facet read — flat, so the list, the\n * record page and the export can render fields by name without any of them\n * reaching into `facets.{groupId}` for itself. One projection rather than a\n * facet read at every field is what keeps a surface from ever showing\n * another holder's records: there is no field on this shape that came from\n * the top of the document except the two that ARE shared, the address and\n * the canonical name.\n */\nexport interface ContactRecord {\n $id: string\n /**\n * The facet this row was flattened through — the viewing group under a\n * site, the person's primary holder at the org level (AGL-2630). A write\n * that edits the row goes back to the same facet, so a surface that has\n * only the flat record can still address the holder's own fields.\n */\n groupId: string\n /**\n * A site of that holder's group — the viewing site under a site, and at\n * the organization level the site the primary holder was resolved from —\n * which is where a stage move for this row is made and announced. `''` for\n * a row no site holds.\n */\n holderHostId: string\n /** Every site that has captured this person, sorted — the org-level \"Known by\". */\n capturedByHostIds: string[]\n /** The shared identity and the dedupe key. */\n email: string\n /** The other addresses a merge folded into this record (AGL-2625). */\n alternateEmails: string[]\n /** What THIS holder sees — their own override, or the canonical name. */\n name: string\n /** The canonical name: the identity of last resort, shared by every holder. */\n canonicalName: string\n /** This holder's own name for the person, when they have set one. */\n nameOverride: string\n sources: Partial<Record<ContactSource, true>>\n /** This holder's timeline, narrowed to the sites the group covers. */\n interactions: ContactInteraction[]\n tags: string[]\n notes: string\n campaignIds: string[]\n ltvCents: number\n ordersCount: number\n phone: string\n jobTitle: string\n companyName: string\n companyId: string\n /**\n * What linking this person to a company has to know — this holder's link,\n * the shared mirror and the other holders' ids — so the properties card\n * and the bulk bar can plan a link from the row without the document. Not\n * a display field: the mirror is an index every reader of the document\n * already holds, and nothing renders it.\n */\n companyLink: Aglyn.ContactCompanyLinkState\n address: AglynPostalAddress | null\n /** This holder's custom field values, keyed by definition key (AGL-2601). */\n custom?: Record<string, Aglyn.ContactCustomValue>\n /** This holder's attached org-library files, by media id (AGL-2662). */\n mediaIds?: string[]\n ownerUid: string\n /** Empty when the holder has not placed the person in the funnel. */\n lifecycleStage: ContactLifecycleStage | ''\n /**\n * When the person last opened or clicked one of this holder's campaigns\n * (AGL-2616), or `null` when they never have since the stamp shipped.\n */\n lastEmailEngagementAtMs: number | null\n /**\n * When the earliest open task against this person is due (AGL-2661), or\n * `null` when nothing is scheduled. SHARED, not the holder's: a task is\n * filed against the contact document, and every holder reading the row\n * sees the same next step.\n */\n nextTaskAtMs: number | null\n createdAt?: unknown\n updatedAt?: unknown\n}\n\n/*\n * `NO_HOLDER_GROUP` and `contactPrimaryGroup` moved to `@aglyn/aglyn`\n * under AGL-2662 so the server's whole-collection export can flatten a\n * contact the way the organization-level list does — the console app may\n * not import this plugin. Re-exported here, so every caller is unchanged.\n */\nexport { contactPrimaryGroup, NO_HOLDER_GROUP } from '@aglyn/aglyn'\n\n/** A document off the wire, flattened through one group's facet. */\nexport function contactRecordFromDoc(\n row: Record<string, any>,\n group: ConsentGroup,\n): ContactRecord {\n const facet = Aglyn.readContactFacet(row, group.groupId)\n return {\n $id: String(row['$id'] ?? ''),\n groupId: group.groupId,\n holderHostId: group.hostId,\n capturedByHostIds: Aglyn.contactCaptureHostIds(row),\n email: typeof row['email'] === 'string' ? row['email'] : '',\n alternateEmails: Array.isArray(row[Aglyn.CONTACT_ALTERNATE_EMAILS_FIELD])\n ? (row[Aglyn.CONTACT_ALTERNATE_EMAILS_FIELD] as unknown[]).filter(\n (email): email is string => typeof email === 'string',\n )\n : [],\n name: Aglyn.contactDisplayName(row, group.groupId),\n canonicalName: typeof row['name'] === 'string' ? row['name'] : '',\n nameOverride: facet.name ?? '',\n sources: facet.sources,\n interactions: Aglyn.interactionsForGroup(facet.interactions, group.hostIds),\n tags: facet.tags ?? [],\n notes: facet.notes ?? '',\n campaignIds: Aglyn.readContactCampaignIds(row, group.groupId),\n ltvCents: facet.ltvCents ?? 0,\n ordersCount: facet.ordersCount ?? 0,\n phone: facet.phone ?? '',\n jobTitle: facet.jobTitle ?? '',\n companyName: facet.companyName ?? '',\n companyId: facet.companyId ?? '',\n companyLink: Aglyn.readContactCompanyLink(row, group.groupId),\n address: facet.address ?? null,\n custom: facet.custom ?? {},\n mediaIds: facet.mediaIds ?? [],\n ownerUid: facet.ownerUid ?? '',\n lifecycleStage: Aglyn.isContactLifecycleStage(facet.lifecycleStage)\n ? facet.lifecycleStage\n : '',\n lastEmailEngagementAtMs:\n typeof facet.lastEmailEngagementAtMs === 'number' &&\n Number.isFinite(facet.lastEmailEngagementAtMs) &&\n facet.lastEmailEngagementAtMs > 0\n ? facet.lastEmailEngagementAtMs\n : null,\n nextTaskAtMs: Aglyn.readNextTaskAtMs(row as { nextTaskAtMs?: unknown }),\n createdAt: row['createdAt'],\n updatedAt: row['updatedAt'],\n }\n}\n\n/**\n * Tags as typed — comma-separated — into the shape the facet stores:\n * lower-cased, trimmed, deduplicated and capped, so a tag typed on the\n * record page and one typed in the create drawer are the same tag to the\n * segment filter that matches on them.\n */\nexport function parseContactTags(input: string): string[] {\n return [\n ...new Set(\n input\n .split(',')\n .map((tag) => tag.trim().toLowerCase().slice(0, 40))\n .filter(Boolean)\n .slice(0, 20),\n ),\n ]\n}\n"],"names":["Aglyn","contactPrimaryGroup","NO_HOLDER_GROUP","contactRecordFromDoc","row","group","facet","readContactFacet","groupId","$id","String","holderHostId","hostId","capturedByHostIds","contactCaptureHostIds","email","alternateEmails","Array","isArray","CONTACT_ALTERNATE_EMAILS_FIELD","filter","name","contactDisplayName","canonicalName","nameOverride","sources","interactions","interactionsForGroup","hostIds","tags","notes","campaignIds","readContactCampaignIds","ltvCents","ordersCount","phone","jobTitle","companyName","companyId","companyLink","readContactCompanyLink","address","custom","mediaIds","ownerUid","lifecycleStage","isContactLifecycleStage","lastEmailEngagementAtMs","Number","isFinite","nextTaskAtMs","readNextTaskAtMs","createdAt","updatedAt","parseContactTags","input","Set","split","map","tag","trim","toLowerCase","slice","Boolean"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,YAAYA,WAAW,eAAc;AA+FrC;;;;;CAKC,GACD,SAASC,mBAAmB,EAAEC,eAAe,QAAQ,eAAc;AAEnE,kEAAkE,GAClE,OAAO,SAASC,qBACdC,GAAwB,EACxBC,KAAmB;QAILD,UAYEE,aAGRA,aACCA,cAEGA,iBACGA,oBACNA,cACGA,iBACGA,oBACFA,kBAEFA,gBACDA,eACEA,iBACAA;IA9BZ,MAAMA,QAAQN,MAAMO,gBAAgB,CAACH,KAAKC,MAAMG,OAAO;IACvD,OAAO;QACLC,KAAKC,QAAON,WAAAA,GAAG,CAAC,MAAM,YAAVA,WAAc;QAC1BI,SAASH,MAAMG,OAAO;QACtBG,cAAcN,MAAMO,MAAM;QAC1BC,mBAAmBb,MAAMc,qBAAqB,CAACV;QAC/CW,OAAO,OAAOX,GAAG,CAAC,QAAQ,KAAK,WAAWA,GAAG,CAAC,QAAQ,GAAG;QACzDY,iBAAiBC,MAAMC,OAAO,CAACd,GAAG,CAACJ,MAAMmB,8BAA8B,CAAC,IACpE,AAACf,GAAG,CAACJ,MAAMmB,8BAA8B,CAAC,CAAeC,MAAM,CAC7D,CAACL,QAA2B,OAAOA,UAAU,YAE/C,EAAE;QACNM,MAAMrB,MAAMsB,kBAAkB,CAAClB,KAAKC,MAAMG,OAAO;QACjDe,eAAe,OAAOnB,GAAG,CAAC,OAAO,KAAK,WAAWA,GAAG,CAAC,OAAO,GAAG;QAC/DoB,YAAY,GAAElB,cAAAA,MAAMe,IAAI,YAAVf,cAAc;QAC5BmB,SAASnB,MAAMmB,OAAO;QACtBC,cAAc1B,MAAM2B,oBAAoB,CAACrB,MAAMoB,YAAY,EAAErB,MAAMuB,OAAO;QAC1EC,IAAI,GAAEvB,cAAAA,MAAMuB,IAAI,YAAVvB,cAAc,EAAE;QACtBwB,KAAK,GAAExB,eAAAA,MAAMwB,KAAK,YAAXxB,eAAe;QACtByB,aAAa/B,MAAMgC,sBAAsB,CAAC5B,KAAKC,MAAMG,OAAO;QAC5DyB,QAAQ,GAAE3B,kBAAAA,MAAM2B,QAAQ,YAAd3B,kBAAkB;QAC5B4B,WAAW,GAAE5B,qBAAAA,MAAM4B,WAAW,YAAjB5B,qBAAqB;QAClC6B,KAAK,GAAE7B,eAAAA,MAAM6B,KAAK,YAAX7B,eAAe;QACtB8B,QAAQ,GAAE9B,kBAAAA,MAAM8B,QAAQ,YAAd9B,kBAAkB;QAC5B+B,WAAW,GAAE/B,qBAAAA,MAAM+B,WAAW,YAAjB/B,qBAAqB;QAClCgC,SAAS,GAAEhC,mBAAAA,MAAMgC,SAAS,YAAfhC,mBAAmB;QAC9BiC,aAAavC,MAAMwC,sBAAsB,CAACpC,KAAKC,MAAMG,OAAO;QAC5DiC,OAAO,GAAEnC,iBAAAA,MAAMmC,OAAO,YAAbnC,iBAAiB;QAC1BoC,MAAM,GAAEpC,gBAAAA,MAAMoC,MAAM,YAAZpC,gBAAgB,CAAC;QACzBqC,QAAQ,GAAErC,kBAAAA,MAAMqC,QAAQ,YAAdrC,kBAAkB,EAAE;QAC9BsC,QAAQ,GAAEtC,kBAAAA,MAAMsC,QAAQ,YAAdtC,kBAAkB;QAC5BuC,gBAAgB7C,MAAM8C,uBAAuB,CAACxC,MAAMuC,cAAc,IAC9DvC,MAAMuC,cAAc,GACpB;QACJE,yBACE,OAAOzC,MAAMyC,uBAAuB,KAAK,YACzCC,OAAOC,QAAQ,CAAC3C,MAAMyC,uBAAuB,KAC7CzC,MAAMyC,uBAAuB,GAAG,IAC5BzC,MAAMyC,uBAAuB,GAC7B;QACNG,cAAclD,MAAMmD,gBAAgB,CAAC/C;QACrCgD,WAAWhD,GAAG,CAAC,YAAY;QAC3BiD,WAAWjD,GAAG,CAAC,YAAY;IAC7B;AACF;AAEA;;;;;CAKC,GACD,OAAO,SAASkD,iBAAiBC,KAAa;IAC5C,OAAO;WACF,IAAIC,IACLD,MACGE,KAAK,CAAC,KACNC,GAAG,CAAC,CAACC,MAAQA,IAAIC,IAAI,GAAGC,WAAW,GAAGC,KAAK,CAAC,GAAG,KAC/C1C,MAAM,CAAC2C,SACPD,KAAK,CAAC,GAAG;KAEf;AACH"}
@@ -0,0 +1,93 @@
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 { AglynPostalAddress, ContactCustomValue } from '@aglyn/aglyn';
18
+ /**
19
+ * THE CONTACT PROFILE ROUTE'S CONTRACT (AGL-2804), in one module both halves
20
+ * import, so the field the console sends and the field the handler reads
21
+ * cannot drift apart.
22
+ *
23
+ * `crm/contact-update` is the console's one writer of a contact's facets.
24
+ * The Firestore rules cannot tell one field of a holder's facet from another
25
+ * — the holder is a map key a rule cannot address — so a client update may
26
+ * not change a facet at all beyond letting a holder go, and every edit the
27
+ * console makes to one arrives here: the record page's profile, custom
28
+ * fields, files and campaign filing, the company page's link, and the bulk
29
+ * bar's tags, owner and company. A lifecycle stage has a route of its own,
30
+ * `crm/contact-stage`, because moving it is an event.
31
+ */
32
+ /**
33
+ * The most contacts one request names — the contacts list's window, which is
34
+ * as much as a selection reaches. A larger selection is sent in pieces.
35
+ */
36
+ export declare const CRM_CONTACT_UPDATE_MAX = 200;
37
+ /**
38
+ * What one request sets, for ONE holder: the viewing site's group under a
39
+ * site, and at the organization level each contact's own primary holder.
40
+ *
41
+ * A text field sent as `''` is CLEARED — removed from the facet — except
42
+ * `notes`, which are stored as typed. A list replaces the stored list;
43
+ * `addTag` and `removeTag` change one tag and leave the rest as the server
44
+ * holds them.
45
+ */
46
+ export interface ContactUpdateFields {
47
+ /** This holder's own name for the person. The canonical name is never written. */
48
+ name?: string;
49
+ /** As typed; stored as E.164, and refused when it cannot be read as a number. */
50
+ phone?: string;
51
+ jobTitle?: string;
52
+ address?: AglynPostalAddress | null;
53
+ notes?: string;
54
+ tags?: string[];
55
+ addTag?: string;
56
+ removeTag?: string;
57
+ campaignIds?: string[];
58
+ /** A member of the organization, or `''` for nobody. */
59
+ ownerUid?: string;
60
+ /** The company to file the person under, or `null` to unlink them. */
61
+ companyId?: string | null;
62
+ /**
63
+ * The company's label on the record. Left out beside `companyId`, the
64
+ * linked company's own name is written, and an unlink clears it.
65
+ */
66
+ companyName?: string;
67
+ /** Only the keys that changed, each judged against its definition; `null` clears. */
68
+ custom?: Record<string, ContactCustomValue>;
69
+ mediaIds?: string[];
70
+ }
71
+ /** Every field the route reads. A body naming any other is refused, not trimmed. */
72
+ export declare const CONTACT_UPDATE_FIELDS: ReadonlyArray<keyof ContactUpdateFields>;
73
+ export interface ContactUpdateRequest {
74
+ /** The mounted site; at the organization level the record's own site, or nothing. */
75
+ hostId?: string | null;
76
+ /** The organization, which makes the call the route's organization variant. */
77
+ orgId?: string;
78
+ contactIds: string[];
79
+ set: ContactUpdateFields;
80
+ }
81
+ /** One contact's answer: saved, or refused with a sentence written for the reader. */
82
+ export type ContactUpdateOutcome = {
83
+ contactId: string;
84
+ ok: true;
85
+ } | {
86
+ contactId: string;
87
+ ok: false;
88
+ error: string;
89
+ };
90
+ export interface ContactUpdateResponse {
91
+ ok: true;
92
+ results: ContactUpdateOutcome[];
93
+ }
@@ -0,0 +1,50 @@
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 CONTACT PROFILE ROUTE'S CONTRACT (AGL-2804), in one module both halves
18
+ * import, so the field the console sends and the field the handler reads
19
+ * cannot drift apart.
20
+ *
21
+ * `crm/contact-update` is the console's one writer of a contact's facets.
22
+ * The Firestore rules cannot tell one field of a holder's facet from another
23
+ * — the holder is a map key a rule cannot address — so a client update may
24
+ * not change a facet at all beyond letting a holder go, and every edit the
25
+ * console makes to one arrives here: the record page's profile, custom
26
+ * fields, files and campaign filing, the company page's link, and the bulk
27
+ * bar's tags, owner and company. A lifecycle stage has a route of its own,
28
+ * `crm/contact-stage`, because moving it is an event.
29
+ */ /**
30
+ * The most contacts one request names — the contacts list's window, which is
31
+ * as much as a selection reaches. A larger selection is sent in pieces.
32
+ */ export const CRM_CONTACT_UPDATE_MAX = 200;
33
+ /** Every field the route reads. A body naming any other is refused, not trimmed. */ export const CONTACT_UPDATE_FIELDS = [
34
+ 'name',
35
+ 'phone',
36
+ 'jobTitle',
37
+ 'address',
38
+ 'notes',
39
+ 'tags',
40
+ 'addTag',
41
+ 'removeTag',
42
+ 'campaignIds',
43
+ 'ownerUid',
44
+ 'companyId',
45
+ 'companyName',
46
+ 'custom',
47
+ 'mediaIds'
48
+ ];
49
+
50
+ //# sourceMappingURL=contact-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/contact-update.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 { AglynPostalAddress, ContactCustomValue } from '@aglyn/aglyn'\n\n/**\n * THE CONTACT PROFILE ROUTE'S CONTRACT (AGL-2804), in one module both halves\n * import, so the field the console sends and the field the handler reads\n * cannot drift apart.\n *\n * `crm/contact-update` is the console's one writer of a contact's facets.\n * The Firestore rules cannot tell one field of a holder's facet from another\n * — the holder is a map key a rule cannot address — so a client update may\n * not change a facet at all beyond letting a holder go, and every edit the\n * console makes to one arrives here: the record page's profile, custom\n * fields, files and campaign filing, the company page's link, and the bulk\n * bar's tags, owner and company. A lifecycle stage has a route of its own,\n * `crm/contact-stage`, because moving it is an event.\n */\n\n/**\n * The most contacts one request names — the contacts list's window, which is\n * as much as a selection reaches. A larger selection is sent in pieces.\n */\nexport const CRM_CONTACT_UPDATE_MAX = 200\n\n/**\n * What one request sets, for ONE holder: the viewing site's group under a\n * site, and at the organization level each contact's own primary holder.\n *\n * A text field sent as `''` is CLEARED — removed from the facet — except\n * `notes`, which are stored as typed. A list replaces the stored list;\n * `addTag` and `removeTag` change one tag and leave the rest as the server\n * holds them.\n */\nexport interface ContactUpdateFields {\n /** This holder's own name for the person. The canonical name is never written. */\n name?: string\n /** As typed; stored as E.164, and refused when it cannot be read as a number. */\n phone?: string\n jobTitle?: string\n address?: AglynPostalAddress | null\n notes?: string\n tags?: string[]\n addTag?: string\n removeTag?: string\n campaignIds?: string[]\n /** A member of the organization, or `''` for nobody. */\n ownerUid?: string\n /** The company to file the person under, or `null` to unlink them. */\n companyId?: string | null\n /**\n * The company's label on the record. Left out beside `companyId`, the\n * linked company's own name is written, and an unlink clears it.\n */\n companyName?: string\n /** Only the keys that changed, each judged against its definition; `null` clears. */\n custom?: Record<string, ContactCustomValue>\n mediaIds?: string[]\n}\n\n/** Every field the route reads. A body naming any other is refused, not trimmed. */\nexport const CONTACT_UPDATE_FIELDS: ReadonlyArray<keyof ContactUpdateFields> = [\n 'name',\n 'phone',\n 'jobTitle',\n 'address',\n 'notes',\n 'tags',\n 'addTag',\n 'removeTag',\n 'campaignIds',\n 'ownerUid',\n 'companyId',\n 'companyName',\n 'custom',\n 'mediaIds',\n]\n\nexport interface ContactUpdateRequest {\n /** The mounted site; at the organization level the record's own site, or nothing. */\n hostId?: string | null\n /** The organization, which makes the call the route's organization variant. */\n orgId?: string\n contactIds: string[]\n set: ContactUpdateFields\n}\n\n/** One contact's answer: saved, or refused with a sentence written for the reader. */\nexport type ContactUpdateOutcome =\n | { contactId: string; ok: true }\n | { contactId: string; ok: false; error: string }\n\nexport interface ContactUpdateResponse {\n ok: true\n results: ContactUpdateOutcome[]\n}\n"],"names":["CRM_CONTACT_UPDATE_MAX","CONTACT_UPDATE_FIELDS"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAID;;;;;;;;;;;;;CAaC,GAED;;;CAGC,GACD,OAAO,MAAMA,yBAAyB,IAAG;AAqCzC,kFAAkF,GAClF,OAAO,MAAMC,wBAAkE;IAC7E;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAA"}