@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,327 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { _ as _extends } from "@swc/helpers/_/_extends";
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
+ /**
20
+ * Put people from the CRM onto an email audience (AGL-2603).
21
+ *
22
+ * ## The same door the Emails console uses
23
+ *
24
+ * A list membership carries the consent basis that says why this person may
25
+ * be mailed, and the rules make its create API-only for exactly that reason:
26
+ * a client that could write one could mint a consent record by pressing a
27
+ * button. So this dialog does not write a membership. It calls the two
28
+ * routes the audience page's own add form calls — `email/list-members-preview`
29
+ * to say, per address, what adding them would do, and `email/list-members-add`
30
+ * to do it — with the same body and the same single attestation over the
31
+ * count the operator was shown. Whoever is refused there is refused here, for
32
+ * the same reason, in the same words.
33
+ *
34
+ * ## Check, then add
35
+ *
36
+ * The attestation is a statement about people, so the people are counted in
37
+ * front of the operator before the checkbox exists: how many already opted
38
+ * in, how many have nothing on record, how many cannot be added at all. The
39
+ * routes take a hundred addresses a call, so a large selection is sent in
40
+ * hundreds and the verdicts are summed — the number on screen is the whole
41
+ * selection's, not the first page's.
42
+ *
43
+ * ## The audiences are a bounded lookup
44
+ *
45
+ * Fifty by name, the window the Emails console's own pickers use. A list is
46
+ * org-shared, readable by an org-wide member and by nobody else, and the
47
+ * route refuses a caller who is not one — so a collaborator scoped to one
48
+ * site sees the listen refused and a sentence saying who manages audiences,
49
+ * rather than an empty picker.
50
+ */ import { authorizedFetch } from "@aglyn/shared-util-http/authorized-token";
51
+ import { useSnackbar } from "@aglyn/shared-ui-snackstack";
52
+ import { Alert, Button, Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, FormControlLabel, MenuItem, Stack, TextField, Typography } from "@mui/material";
53
+ import { collection, limit, orderBy, query } from "firebase/firestore";
54
+ import { useCallback, useEffect, useMemo, useState } from "react";
55
+ import { useFirestore, useFirestoreCollection, useUser } from "@aglyn/tenant-feature-instance";
56
+ /**
57
+ * How many addresses one call to the membership routes takes — their
58
+ * `readAddresses` cap. Named here because a request over it is refused
59
+ * whole, and a refusal of the whole selection reads as nobody being addable.
60
+ */ export const LIST_MEMBER_REQUEST_CHUNK = 100;
61
+ /** The audience picker's window; the Emails console's own pickers use it. */ export const AUDIENCE_PICKER_LIMIT = 50;
62
+ /** The addresses, deduplicated the way the route will deduplicate them. */ const distinctAddresses = (emails)=>[
63
+ ...new Set(emails.map((email)=>String(email != null ? email : '').trim().toLowerCase()).filter(Boolean))
64
+ ];
65
+ const chunk = (items, size)=>{
66
+ const chunks = [];
67
+ for(let start = 0; start < items.length; start += size){
68
+ chunks.push(items.slice(start, start + size));
69
+ }
70
+ return chunks;
71
+ };
72
+ export function AddToListDialog(props) {
73
+ const { open, onClose, hostId, scope, emails, onAdded } = props;
74
+ const firestore = useFirestore();
75
+ const { data: user } = useUser();
76
+ const { enqueueSnackbar } = useSnackbar();
77
+ const addresses = useMemo(()=>distinctAddresses(emails), [
78
+ emails
79
+ ]);
80
+ const { data: audienceRows, status: audiencesStatus } = useFirestoreCollection(()=>open && scope ? query(collection(firestore, scope[0], scope[1], 'lists'), orderBy('name'), limit(AUDIENCE_PICKER_LIMIT)) : null, [
81
+ firestore,
82
+ scope,
83
+ open
84
+ ], {
85
+ idField: '$id'
86
+ });
87
+ const audiences = audienceRows != null ? audienceRows : [];
88
+ const [listId, setListId] = useState('');
89
+ const [preview, setPreview] = useState(null);
90
+ const [attested, setAttested] = useState(false);
91
+ const [results, setResults] = useState(null);
92
+ const [busy, setBusy] = useState(false);
93
+ /*
94
+ * A preview belongs to the list and the addresses it was run for. Change
95
+ * either and the count on screen — and the attestation offered under it —
96
+ * would be about a different set, so both go.
97
+ */ useEffect(()=>{
98
+ setPreview(null);
99
+ setAttested(false);
100
+ setResults(null);
101
+ }, [
102
+ listId,
103
+ addresses
104
+ ]);
105
+ const post = useCallback(async (route, body)=>{
106
+ const response = await authorizedFetch(user, `/api/email/${route}`, {
107
+ method: 'POST',
108
+ headers: {
109
+ 'Content-Type': 'application/json'
110
+ },
111
+ body: JSON.stringify(_extends({
112
+ hostId,
113
+ listId
114
+ }, body))
115
+ });
116
+ const payload = await response.json().catch(()=>({}));
117
+ return {
118
+ ok: response.ok,
119
+ payload
120
+ };
121
+ }, [
122
+ user,
123
+ hostId,
124
+ listId
125
+ ]);
126
+ const handleCheck = useCallback(async ()=>{
127
+ if (busy || !listId || !addresses.length) return;
128
+ setBusy(true);
129
+ try {
130
+ const summed = {
131
+ verdicts: [],
132
+ optedIn: 0,
133
+ needAttestation: 0,
134
+ refused: 0
135
+ };
136
+ for (const batch of chunk(addresses, LIST_MEMBER_REQUEST_CHUNK)){
137
+ var _page_verdicts, _page_optedIn, _page_needAttestation, _page_refused;
138
+ const { ok, payload } = await post('list-members-preview', {
139
+ emails: batch
140
+ });
141
+ if (!ok) {
142
+ var _ref;
143
+ return void enqueueSnackbar((_ref = payload == null ? void 0 : payload.error) != null ? _ref : 'The addresses could not be checked.', {
144
+ variant: 'warning',
145
+ allowDuplicate: true
146
+ });
147
+ }
148
+ const page = payload;
149
+ summed.verdicts.push(...(_page_verdicts = page.verdicts) != null ? _page_verdicts : []);
150
+ summed.optedIn += Number((_page_optedIn = page.optedIn) != null ? _page_optedIn : 0);
151
+ summed.needAttestation += Number((_page_needAttestation = page.needAttestation) != null ? _page_needAttestation : 0);
152
+ summed.refused += Number((_page_refused = page.refused) != null ? _page_refused : 0);
153
+ }
154
+ setPreview(summed);
155
+ } catch (unused) {
156
+ enqueueSnackbar('The addresses could not be checked.', {
157
+ variant: 'warning',
158
+ allowDuplicate: true
159
+ });
160
+ } finally{
161
+ setBusy(false);
162
+ }
163
+ }, [
164
+ busy,
165
+ listId,
166
+ addresses,
167
+ post,
168
+ enqueueSnackbar
169
+ ]);
170
+ const handleAdd = useCallback(async ()=>{
171
+ if (busy || !preview) return;
172
+ setBusy(true);
173
+ try {
174
+ const all = [];
175
+ for (const batch of chunk(addresses, LIST_MEMBER_REQUEST_CHUNK)){
176
+ var _ref;
177
+ const { ok, payload } = await post('list-members-add', {
178
+ emails: batch,
179
+ // The operator's assertion, applied per address by the route to
180
+ // the people who need it; a stored opt-in keeps its own basis.
181
+ attestConsent: attested
182
+ });
183
+ if (!ok) {
184
+ var _ref1;
185
+ return void enqueueSnackbar((_ref1 = payload == null ? void 0 : payload.error) != null ? _ref1 : 'Nobody was added to the list', {
186
+ variant: 'warning',
187
+ allowDuplicate: true
188
+ });
189
+ }
190
+ all.push(...(_ref = payload == null ? void 0 : payload.results) != null ? _ref : []);
191
+ }
192
+ const added = all.filter((result)=>result.enrolled).length;
193
+ setResults(all);
194
+ setPreview(null);
195
+ if (added) onAdded == null ? void 0 : onAdded(added);
196
+ enqueueSnackbar(added === 1 ? 'One person added' : `${added} people added`, {
197
+ variant: added ? 'success' : 'warning',
198
+ persist: false
199
+ });
200
+ } catch (unused) {
201
+ enqueueSnackbar('Nobody was added to the list', {
202
+ variant: 'warning',
203
+ allowDuplicate: true
204
+ });
205
+ } finally{
206
+ setBusy(false);
207
+ }
208
+ }, [
209
+ busy,
210
+ preview,
211
+ addresses,
212
+ attested,
213
+ post,
214
+ enqueueSnackbar,
215
+ onAdded
216
+ ]);
217
+ const enrollable = preview ? preview.optedIn + preview.needAttestation : 0;
218
+ const chosen = audiences.find((row)=>row.$id === listId);
219
+ return /*#__PURE__*/ _jsxs(Dialog, {
220
+ open: open,
221
+ onClose: busy ? undefined : onClose,
222
+ fullWidth: true,
223
+ maxWidth: "sm",
224
+ children: [
225
+ /*#__PURE__*/ _jsx(DialogTitle, {
226
+ children: addresses.length === 1 ? 'Add to an audience' : `Add ${addresses.length} people to an audience`
227
+ }),
228
+ /*#__PURE__*/ _jsx(DialogContent, {
229
+ children: /*#__PURE__*/ _jsxs(Stack, {
230
+ spacing: 2,
231
+ sx: {
232
+ pt: 1
233
+ },
234
+ children: [
235
+ /*#__PURE__*/ _jsx(Typography, {
236
+ variant: "body2",
237
+ color: "text.secondary",
238
+ children: 'Every address is checked against its consent record and both ' + 'suppression lists before anyone is added — the same check the ' + "audience's own page runs."
239
+ }),
240
+ audiencesStatus === 'error' ? /*#__PURE__*/ _jsx(Alert, {
241
+ severity: "warning",
242
+ children: 'Audiences are managed by members with access to every site ' + 'in the workspace. Ask one of them to add these people.'
243
+ }) : /*#__PURE__*/ _jsx(TextField, {
244
+ select: true,
245
+ size: "small",
246
+ label: "Audience",
247
+ value: listId,
248
+ onChange: (event)=>setListId(event.target.value),
249
+ disabled: busy,
250
+ helperText: (chosen == null ? void 0 : chosen.kind) === 'dynamic' ? 'A live audience. Whoever you add stays, whether or not the rule matches them.' : audiences.length ? undefined : 'No audiences yet — create one under Emails.',
251
+ children: audiences.map((row)=>{
252
+ var _row_name;
253
+ return /*#__PURE__*/ _jsx(MenuItem, {
254
+ value: row.$id,
255
+ children: (_row_name = row.name) != null ? _row_name : row.$id
256
+ }, row.$id);
257
+ })
258
+ }),
259
+ preview ? /*#__PURE__*/ _jsxs(Stack, {
260
+ spacing: 1,
261
+ children: [
262
+ /*#__PURE__*/ _jsx(Alert, {
263
+ severity: enrollable ? 'info' : 'warning',
264
+ children: [
265
+ preview.optedIn ? `${preview.optedIn} already opted in` : '',
266
+ preview.needAttestation ? `${preview.needAttestation} with no opt-in on record` : '',
267
+ preview.refused ? `${preview.refused} cannot be added at all` : ''
268
+ ].filter(Boolean).join(' · ')
269
+ }),
270
+ preview.verdicts.filter((verdict)=>verdict.refusal).map((verdict)=>/*#__PURE__*/ _jsx(Typography, {
271
+ variant: "caption",
272
+ color: "text.secondary",
273
+ children: `${verdict.input} — ${verdict.summary}`
274
+ }, verdict.input)),
275
+ preview.needAttestation ? /*#__PURE__*/ _jsx(FormControlLabel, {
276
+ control: /*#__PURE__*/ _jsx(Checkbox, {
277
+ checked: attested,
278
+ onChange: (event)=>setAttested(event.target.checked)
279
+ }),
280
+ label: /*#__PURE__*/ _jsx(Typography, {
281
+ variant: "body2",
282
+ children: 'I have permission to send marketing email to the ' + `${preview.needAttestation} ` + `${preview.needAttestation === 1 ? 'person' : 'people'} ` + 'with no opt-in on record. This is recorded against my ' + 'account, with the date.'
283
+ })
284
+ }) : null
285
+ ]
286
+ }) : null,
287
+ (results == null ? void 0 : results.length) ? /*#__PURE__*/ _jsx(Stack, {
288
+ spacing: 0.5,
289
+ children: results.filter((result)=>!result.enrolled).map((result)=>{
290
+ var _result_error;
291
+ return /*#__PURE__*/ _jsx(Typography, {
292
+ variant: "caption",
293
+ color: "text.secondary",
294
+ children: `${result.input} — not added. ${(_result_error = result.error) != null ? _result_error : ''}`
295
+ }, result.input);
296
+ })
297
+ }) : null
298
+ ]
299
+ })
300
+ }),
301
+ /*#__PURE__*/ _jsxs(DialogActions, {
302
+ children: [
303
+ /*#__PURE__*/ _jsx(Button, {
304
+ onClick: onClose,
305
+ disabled: busy,
306
+ children: results ? 'Done' : 'Cancel'
307
+ }),
308
+ preview ? /*#__PURE__*/ _jsx(Button, {
309
+ variant: "contained",
310
+ disabled: busy || !enrollable || preview.needAttestation > 0 && !attested,
311
+ onClick: ()=>void handleAdd(),
312
+ children: busy ? 'Adding…' : `Add ${enrollable}`
313
+ }) : /*#__PURE__*/ _jsx(Button, {
314
+ variant: "contained",
315
+ disabled: busy || !listId || !addresses.length || Boolean(results),
316
+ onClick: ()=>void handleCheck(),
317
+ children: busy ? 'Checking…' : 'Check'
318
+ })
319
+ ]
320
+ })
321
+ ]
322
+ });
323
+ }
324
+ AddToListDialog.displayName = 'AddToListDialog';
325
+ export default AddToListDialog;
326
+
327
+ //# sourceMappingURL=add-to-list-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/add-to-list-dialog.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\n/**\n * Put people from the CRM onto an email audience (AGL-2603).\n *\n * ## The same door the Emails console uses\n *\n * A list membership carries the consent basis that says why this person may\n * be mailed, and the rules make its create API-only for exactly that reason:\n * a client that could write one could mint a consent record by pressing a\n * button. So this dialog does not write a membership. It calls the two\n * routes the audience page's own add form calls — `email/list-members-preview`\n * to say, per address, what adding them would do, and `email/list-members-add`\n * to do it — with the same body and the same single attestation over the\n * count the operator was shown. Whoever is refused there is refused here, for\n * the same reason, in the same words.\n *\n * ## Check, then add\n *\n * The attestation is a statement about people, so the people are counted in\n * front of the operator before the checkbox exists: how many already opted\n * in, how many have nothing on record, how many cannot be added at all. The\n * routes take a hundred addresses a call, so a large selection is sent in\n * hundreds and the verdicts are summed — the number on screen is the whole\n * selection's, not the first page's.\n *\n * ## The audiences are a bounded lookup\n *\n * Fifty by name, the window the Emails console's own pickers use. A list is\n * org-shared, readable by an org-wide member and by nobody else, and the\n * route refuses a caller who is not one — so a collaborator scoped to one\n * site sees the listen refused and a sentence saying who manages audiences,\n * rather than an empty picker.\n */\n\nimport { authorizedFetch } from '@aglyn/shared-util-http/authorized-token'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport {\n Alert,\n Button,\n Checkbox,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControlLabel,\n MenuItem,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { collection, limit, orderBy, query } from 'firebase/firestore'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n useFirestore,\n useFirestoreCollection,\n useUser,\n} from '@aglyn/tenant-feature-instance'\n\n/**\n * How many addresses one call to the membership routes takes — their\n * `readAddresses` cap. Named here because a request over it is refused\n * whole, and a refusal of the whole selection reads as nobody being addable.\n */\nexport const LIST_MEMBER_REQUEST_CHUNK = 100\n\n/** The audience picker's window; the Emails console's own pickers use it. */\nexport const AUDIENCE_PICKER_LIMIT = 50\n\n/** What `email/list-members-preview` answers for one address. */\ninterface AddressVerdict {\n input: string\n email: string | null\n refusal: string | null\n requiresAttestation: boolean\n summary: string\n}\n\n/** The preview, summed over every chunk sent. */\ninterface Preview {\n verdicts: AddressVerdict[]\n optedIn: number\n needAttestation: number\n refused: number\n}\n\n/** What one address's outcome was, after the add. */\ninterface AddResult {\n input: string\n email: string | null\n enrolled: boolean\n error?: string\n}\n\ninterface AudienceRow {\n $id: string\n name?: string\n kind?: 'manual' | 'dynamic'\n}\n\nexport interface AddToListDialogProps {\n open: boolean\n onClose: () => void\n hostId: string\n /** `['orgs', orgId]`, or `null` while the org is still being resolved. */\n scope: readonly [string, string] | null\n /** The people to add — a selection's addresses, or one person's. */\n emails: readonly string[]\n /** Called once with how many were enrolled, when at least one was. */\n onAdded?: (added: number) => void\n}\n\n/** The addresses, deduplicated the way the route will deduplicate them. */\nconst distinctAddresses = (emails: readonly string[]): string[] => [\n ...new Set(\n emails.map((email) => String(email ?? '').trim().toLowerCase()).filter(Boolean),\n ),\n]\n\nconst chunk = <T,>(items: readonly T[], size: number): T[][] => {\n const chunks: T[][] = []\n for (let start = 0; start < items.length; start += size) {\n chunks.push(items.slice(start, start + size))\n }\n return chunks\n}\n\nexport function AddToListDialog(props: AddToListDialogProps) {\n const { open, onClose, hostId, scope, emails, onAdded } = props\n const firestore = useFirestore()\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n\n const addresses = useMemo(() => distinctAddresses(emails), [emails])\n\n const { data: audienceRows, status: audiencesStatus } =\n useFirestoreCollection<AudienceRow>(\n () =>\n open && scope\n ? query(\n collection(firestore, scope[0], scope[1], 'lists'),\n orderBy('name'),\n limit(AUDIENCE_PICKER_LIMIT),\n )\n : null,\n [firestore, scope, open],\n { idField: '$id' },\n )\n const audiences = audienceRows ?? []\n\n const [listId, setListId] = useState('')\n const [preview, setPreview] = useState<Preview | null>(null)\n const [attested, setAttested] = useState(false)\n const [results, setResults] = useState<AddResult[] | null>(null)\n const [busy, setBusy] = useState(false)\n\n /*\n * A preview belongs to the list and the addresses it was run for. Change\n * either and the count on screen — and the attestation offered under it —\n * would be about a different set, so both go.\n */\n useEffect(() => {\n setPreview(null)\n setAttested(false)\n setResults(null)\n }, [listId, addresses])\n\n const post = useCallback(\n async (route: string, body: Record<string, unknown>) => {\n const response = await authorizedFetch(user, `/api/email/${route}`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ hostId, listId, ...body }),\n })\n const payload = await response.json().catch(() => ({}))\n return { ok: response.ok, payload }\n },\n [user, hostId, listId],\n )\n\n const handleCheck = useCallback(async () => {\n if (busy || !listId || !addresses.length) return\n setBusy(true)\n try {\n const summed: Preview = {\n verdicts: [],\n optedIn: 0,\n needAttestation: 0,\n refused: 0,\n }\n for (const batch of chunk(addresses, LIST_MEMBER_REQUEST_CHUNK)) {\n const { ok, payload } = await post('list-members-preview', {\n emails: batch,\n })\n if (!ok) {\n return void enqueueSnackbar(\n payload?.error ?? 'The addresses could not be checked.',\n { variant: 'warning', allowDuplicate: true },\n )\n }\n const page = payload as Preview\n summed.verdicts.push(...(page.verdicts ?? []))\n summed.optedIn += Number(page.optedIn ?? 0)\n summed.needAttestation += Number(page.needAttestation ?? 0)\n summed.refused += Number(page.refused ?? 0)\n }\n setPreview(summed)\n } catch {\n enqueueSnackbar('The addresses could not be checked.', {\n variant: 'warning',\n allowDuplicate: true,\n })\n } finally {\n setBusy(false)\n }\n }, [busy, listId, addresses, post, enqueueSnackbar])\n\n const handleAdd = useCallback(async () => {\n if (busy || !preview) return\n setBusy(true)\n try {\n const all: AddResult[] = []\n for (const batch of chunk(addresses, LIST_MEMBER_REQUEST_CHUNK)) {\n const { ok, payload } = await post('list-members-add', {\n emails: batch,\n // The operator's assertion, applied per address by the route to\n // the people who need it; a stored opt-in keeps its own basis.\n attestConsent: attested,\n })\n if (!ok) {\n return void enqueueSnackbar(\n payload?.error ?? 'Nobody was added to the list',\n { variant: 'warning', allowDuplicate: true },\n )\n }\n all.push(...((payload?.results ?? []) as AddResult[]))\n }\n const added = all.filter((result) => result.enrolled).length\n setResults(all)\n setPreview(null)\n if (added) onAdded?.(added)\n enqueueSnackbar(\n added === 1 ? 'One person added' : `${added} people added`,\n { variant: added ? 'success' : 'warning', persist: false },\n )\n } catch {\n enqueueSnackbar('Nobody was added to the list', {\n variant: 'warning',\n allowDuplicate: true,\n })\n } finally {\n setBusy(false)\n }\n }, [busy, preview, addresses, attested, post, enqueueSnackbar, onAdded])\n\n const enrollable = preview ? preview.optedIn + preview.needAttestation : 0\n const chosen = audiences.find((row) => row.$id === listId)\n\n return (\n <Dialog open={open} onClose={busy ? undefined : onClose} fullWidth maxWidth=\"sm\">\n <DialogTitle>\n {addresses.length === 1\n ? 'Add to an audience'\n : `Add ${addresses.length} people to an audience`}\n </DialogTitle>\n <DialogContent>\n <Stack spacing={2} sx={{ pt: 1 }}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Every address is checked against its consent record and both ' +\n 'suppression lists before anyone is added — the same check the ' +\n \"audience's own page runs.\"}\n </Typography>\n {audiencesStatus === 'error' ? (\n <Alert severity=\"warning\">\n {'Audiences are managed by members with access to every site ' +\n 'in the workspace. Ask one of them to add these people.'}\n </Alert>\n ) : (\n <TextField\n select\n size=\"small\"\n label=\"Audience\"\n value={listId}\n onChange={(event) => setListId(event.target.value)}\n disabled={busy}\n helperText={\n chosen?.kind === 'dynamic'\n ? 'A live audience. Whoever you add stays, whether or not the rule matches them.'\n : audiences.length\n ? undefined\n : 'No audiences yet — create one under Emails.'\n }\n >\n {audiences.map((row) => (\n <MenuItem key={row.$id} value={row.$id}>\n {row.name ?? row.$id}\n </MenuItem>\n ))}\n </TextField>\n )}\n {preview ? (\n <Stack spacing={1}>\n <Alert severity={enrollable ? 'info' : 'warning'}>\n {[\n preview.optedIn ? `${preview.optedIn} already opted in` : '',\n preview.needAttestation\n ? `${preview.needAttestation} with no opt-in on record`\n : '',\n preview.refused ? `${preview.refused} cannot be added at all` : '',\n ]\n .filter(Boolean)\n .join(' · ')}\n </Alert>\n {/*\n The hard refusals only, by address. An address that merely\n needs the attestation is not a refusal, and listing it here\n would put the people the checkbox is about under a heading\n that says they cannot be added.\n */}\n {preview.verdicts\n .filter((verdict) => verdict.refusal)\n .map((verdict) => (\n <Typography\n key={verdict.input}\n variant=\"caption\"\n color=\"text.secondary\"\n >\n {`${verdict.input} — ${verdict.summary}`}\n </Typography>\n ))}\n {preview.needAttestation ? (\n <FormControlLabel\n control={\n <Checkbox\n checked={attested}\n onChange={(event) => setAttested(event.target.checked)}\n />\n }\n label={\n <Typography variant=\"body2\">\n {'I have permission to send marketing email to the ' +\n `${preview.needAttestation} ` +\n `${preview.needAttestation === 1 ? 'person' : 'people'} ` +\n 'with no opt-in on record. This is recorded against my ' +\n 'account, with the date.'}\n </Typography>\n }\n />\n ) : null}\n </Stack>\n ) : null}\n {results?.length ? (\n <Stack spacing={0.5}>\n {results\n .filter((result) => !result.enrolled)\n .map((result) => (\n <Typography\n key={result.input}\n variant=\"caption\"\n color=\"text.secondary\"\n >\n {`${result.input} — not added. ${result.error ?? ''}`}\n </Typography>\n ))}\n </Stack>\n ) : null}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={onClose} disabled={busy}>\n {results ? 'Done' : 'Cancel'}\n </Button>\n {preview ? (\n <Button\n variant=\"contained\"\n disabled={\n busy || !enrollable || (preview.needAttestation > 0 && !attested)\n }\n onClick={() => void handleAdd()}\n >\n {busy ? 'Adding…' : `Add ${enrollable}`}\n </Button>\n ) : (\n <Button\n variant=\"contained\"\n disabled={busy || !listId || !addresses.length || Boolean(results)}\n onClick={() => void handleCheck()}\n >\n {busy ? 'Checking…' : 'Check'}\n </Button>\n )}\n </DialogActions>\n </Dialog>\n )\n}\nAddToListDialog.displayName = 'AddToListDialog'\n\nexport default AddToListDialog\n"],"names":["authorizedFetch","useSnackbar","Alert","Button","Checkbox","Dialog","DialogActions","DialogContent","DialogTitle","FormControlLabel","MenuItem","Stack","TextField","Typography","collection","limit","orderBy","query","useCallback","useEffect","useMemo","useState","useFirestore","useFirestoreCollection","useUser","LIST_MEMBER_REQUEST_CHUNK","AUDIENCE_PICKER_LIMIT","distinctAddresses","emails","Set","map","email","String","trim","toLowerCase","filter","Boolean","chunk","items","size","chunks","start","length","push","slice","AddToListDialog","props","open","onClose","hostId","scope","onAdded","firestore","data","user","enqueueSnackbar","addresses","audienceRows","status","audiencesStatus","idField","audiences","listId","setListId","preview","setPreview","attested","setAttested","results","setResults","busy","setBusy","post","route","body","response","method","headers","JSON","stringify","payload","json","catch","ok","handleCheck","summed","verdicts","optedIn","needAttestation","refused","batch","page","error","variant","allowDuplicate","Number","handleAdd","all","attestConsent","added","result","enrolled","persist","enrollable","chosen","find","row","$id","undefined","fullWidth","maxWidth","spacing","sx","pt","color","severity","select","label","value","onChange","event","target","disabled","helperText","kind","name","join","verdict","refusal","input","summary","control","checked","onClick","displayName"],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type CrmAssignmentRule } from '@aglyn/aglyn';
2
+ import type { OrgMemberOption } from '../hooks/use-org-member-directory';
3
+ export interface AssignmentRuleDrawerProps {
4
+ open: boolean;
5
+ onClose: () => void;
6
+ /** The roster the member target is picked from. */
7
+ members: readonly OrgMemberOption[];
8
+ membersLoading: boolean;
9
+ /** How many people the round-robin pool holds, for the target's helper text. */
10
+ poolSize: number;
11
+ /** The ids the org already holds, so the new one is minted apart from them. */
12
+ existingIds: readonly string[];
13
+ /** Receives the rule; closing on success is the caller's job. */
14
+ onSubmit: (rule: CrmAssignmentRule) => Promise<void> | void;
15
+ }
16
+ /**
17
+ * The one form an assignment rule is written through (AGL-2618).
18
+ *
19
+ * ## Every condition is optional, and none is a form above the list
20
+ *
21
+ * A rule names the captures it claims — a source, a form, an email domain,
22
+ * a tag — and a field left blank is not a condition, so a rule with every
23
+ * field blank is the catch-all, which is a rule a team writes on purpose
24
+ * ("everything else goes to Sam"). The drawer says so rather than refusing
25
+ * it. The email domain is typed the way a person sees one in an address,
26
+ * `@acme.com` or `acme.com`, and the reader strips the `@`; what it cannot
27
+ * read as a domain is refused here, with the field, rather than stored as
28
+ * a condition nothing will ever match.
29
+ *
30
+ * ## The target is a member, or the rotation
31
+ *
32
+ * A member is picked from the roster by name, never typed as an address —
33
+ * an address is resolved at run time and a rule must not depend on a
34
+ * resolution that can change. The rotation is offered whatever the pool
35
+ * holds, with the pool's size beside it: an empty pool is a rule the pass
36
+ * steps over until somebody fills the pool, which the card below explains,
37
+ * and refusing the rule here would make the two cards order-dependent.
38
+ */
39
+ export declare function AssignmentRuleDrawer(props: AssignmentRuleDrawerProps): import("react").JSX.Element;
40
+ export declare namespace AssignmentRuleDrawer {
41
+ var displayName: string;
42
+ }
43
+ export default AssignmentRuleDrawer;