@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,293 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ 'use client';
17
+ import { _ as _extends } from "@swc/helpers/_/_extends";
18
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
+ import { CONTACT_SOURCE_LABELS, newAssignmentRuleId, readCrmAssignmentRule } from "@aglyn/aglyn";
20
+ import { Button, Drawer, FormControl, FormControlLabel, FormHelperText, FormLabel, MenuItem, Radio, RadioGroup, Stack, TextField, Typography } from "@mui/material";
21
+ import { useCallback, useEffect, useState } from "react";
22
+ /** The `value` of the source picker's "any door" entry. */ const ANY_SOURCE = '';
23
+ /**
24
+ * The one form an assignment rule is written through (AGL-2618).
25
+ *
26
+ * ## Every condition is optional, and none is a form above the list
27
+ *
28
+ * A rule names the captures it claims — a source, a form, an email domain,
29
+ * a tag — and a field left blank is not a condition, so a rule with every
30
+ * field blank is the catch-all, which is a rule a team writes on purpose
31
+ * ("everything else goes to Sam"). The drawer says so rather than refusing
32
+ * it. The email domain is typed the way a person sees one in an address,
33
+ * `@acme.com` or `acme.com`, and the reader strips the `@`; what it cannot
34
+ * read as a domain is refused here, with the field, rather than stored as
35
+ * a condition nothing will ever match.
36
+ *
37
+ * ## The target is a member, or the rotation
38
+ *
39
+ * A member is picked from the roster by name, never typed as an address —
40
+ * an address is resolved at run time and a rule must not depend on a
41
+ * resolution that can change. The rotation is offered whatever the pool
42
+ * holds, with the pool's size beside it: an empty pool is a rule the pass
43
+ * steps over until somebody fills the pool, which the card below explains,
44
+ * and refusing the rule here would make the two cards order-dependent.
45
+ */ export function AssignmentRuleDrawer(props) {
46
+ var _readCrmAssignmentRule;
47
+ const { open, onClose, members, membersLoading, poolSize, existingIds, onSubmit } = props;
48
+ const [source, setSource] = useState(ANY_SOURCE);
49
+ const [formId, setFormId] = useState('');
50
+ const [emailDomain, setEmailDomain] = useState('');
51
+ const [tag, setTag] = useState('');
52
+ const [target, setTarget] = useState('member');
53
+ const [memberUid, setMemberUid] = useState('');
54
+ const [busy, setBusy] = useState(false);
55
+ const [error, setError] = useState(null);
56
+ // Seeded on every open, so a drawer that was cancelled halfway does not
57
+ // offer the abandoned draft as the next rule.
58
+ useEffect(()=>{
59
+ if (!open) return;
60
+ setSource(ANY_SOURCE);
61
+ setFormId('');
62
+ setEmailDomain('');
63
+ setTag('');
64
+ setTarget('member');
65
+ setMemberUid('');
66
+ setBusy(false);
67
+ setError(null);
68
+ }, [
69
+ open
70
+ ]);
71
+ const domainTyped = emailDomain.trim().length > 0;
72
+ const domainReadable = !domainTyped || ((_readCrmAssignmentRule = readCrmAssignmentRule({
73
+ id: 'probe',
74
+ when: {
75
+ emailDomain
76
+ },
77
+ assign: {
78
+ roundRobin: true
79
+ }
80
+ })) == null ? void 0 : _readCrmAssignmentRule.when.emailDomain) !== undefined;
81
+ const canSubmit = !busy && domainReadable && (target === 'roundRobin' || memberUid.length > 0);
82
+ const handleSubmit = useCallback(async ()=>{
83
+ if (!canSubmit) return;
84
+ const rule = readCrmAssignmentRule({
85
+ id: newAssignmentRuleId(existingIds),
86
+ when: _extends({}, source ? {
87
+ source
88
+ } : {}, formId.trim() ? {
89
+ formId: formId.trim()
90
+ } : {}, emailDomain.trim() ? {
91
+ emailDomain: emailDomain.trim()
92
+ } : {}, tag.trim() ? {
93
+ tag: tag.trim()
94
+ } : {}),
95
+ assign: target === 'roundRobin' ? {
96
+ roundRobin: true
97
+ } : {
98
+ memberUid
99
+ }
100
+ });
101
+ if (!rule) {
102
+ setError('The rule could not be read back. Check each field.');
103
+ return;
104
+ }
105
+ setBusy(true);
106
+ setError(null);
107
+ try {
108
+ await onSubmit(rule);
109
+ } catch (caught) {
110
+ console.error(caught);
111
+ setError('Could not save the rule. Try again.');
112
+ } finally{
113
+ setBusy(false);
114
+ }
115
+ }, [
116
+ canSubmit,
117
+ existingIds,
118
+ source,
119
+ formId,
120
+ emailDomain,
121
+ tag,
122
+ target,
123
+ memberUid,
124
+ onSubmit
125
+ ]);
126
+ const conditions = [
127
+ source,
128
+ formId.trim(),
129
+ emailDomain.trim(),
130
+ tag.trim()
131
+ ].filter(Boolean);
132
+ return /*#__PURE__*/ _jsx(Drawer, {
133
+ anchor: "right",
134
+ open: open,
135
+ onClose: onClose,
136
+ children: /*#__PURE__*/ _jsxs(Stack, {
137
+ spacing: 2,
138
+ sx: {
139
+ width: 380,
140
+ p: 3
141
+ },
142
+ children: [
143
+ /*#__PURE__*/ _jsx(Typography, {
144
+ variant: "h6",
145
+ children: 'New assignment rule'
146
+ }),
147
+ /*#__PURE__*/ _jsx(Typography, {
148
+ variant: "body2",
149
+ color: "text.secondary",
150
+ children: 'When a new contact matches every condition below, it is assigned ' + 'as the rule says. Leave every condition blank for a rule that ' + 'catches everything the rules above it did not.'
151
+ }),
152
+ /*#__PURE__*/ _jsxs(TextField, {
153
+ select: true,
154
+ size: "small",
155
+ label: "Source",
156
+ value: source,
157
+ onChange: (event)=>setSource(event.target.value),
158
+ fullWidth: true,
159
+ children: [
160
+ /*#__PURE__*/ _jsx(MenuItem, {
161
+ value: ANY_SOURCE,
162
+ children: 'Any source'
163
+ }),
164
+ Object.keys(CONTACT_SOURCE_LABELS).map((option)=>/*#__PURE__*/ _jsx(MenuItem, {
165
+ value: option,
166
+ children: CONTACT_SOURCE_LABELS[option]
167
+ }, option))
168
+ ]
169
+ }),
170
+ /*#__PURE__*/ _jsx(TextField, {
171
+ size: "small",
172
+ label: "Form",
173
+ value: formId,
174
+ onChange: (event)=>setFormId(event.target.value),
175
+ helperText: "The form's id, from its address in Forms. Blank for any form.",
176
+ slotProps: {
177
+ htmlInput: {
178
+ maxLength: 128,
179
+ spellCheck: false
180
+ }
181
+ },
182
+ fullWidth: true
183
+ }),
184
+ /*#__PURE__*/ _jsx(TextField, {
185
+ size: "small",
186
+ label: "Email domain",
187
+ value: emailDomain,
188
+ onChange: (event)=>setEmailDomain(event.target.value),
189
+ error: !domainReadable,
190
+ helperText: domainReadable ? 'acme.com — the domain of the captured address. Public mailboxes such as gmail.com count.' : 'That does not look like a domain.',
191
+ slotProps: {
192
+ htmlInput: {
193
+ maxLength: 253,
194
+ spellCheck: false
195
+ }
196
+ },
197
+ fullWidth: true
198
+ }),
199
+ /*#__PURE__*/ _jsx(TextField, {
200
+ size: "small",
201
+ label: "Tag",
202
+ value: tag,
203
+ onChange: (event)=>setTag(event.target.value),
204
+ helperText: "A tag the capture carries, or the contact already has.",
205
+ slotProps: {
206
+ htmlInput: {
207
+ maxLength: 60
208
+ }
209
+ },
210
+ fullWidth: true
211
+ }),
212
+ /*#__PURE__*/ _jsxs(FormControl, {
213
+ children: [
214
+ /*#__PURE__*/ _jsx(FormLabel, {
215
+ id: "assignment-rule-target",
216
+ children: 'Assign to'
217
+ }),
218
+ /*#__PURE__*/ _jsxs(RadioGroup, {
219
+ "aria-labelledby": "assignment-rule-target",
220
+ value: target,
221
+ onChange: (event)=>setTarget(event.target.value === 'roundRobin' ? 'roundRobin' : 'member'),
222
+ children: [
223
+ /*#__PURE__*/ _jsx(FormControlLabel, {
224
+ value: "member",
225
+ control: /*#__PURE__*/ _jsx(Radio, {
226
+ size: "small"
227
+ }),
228
+ label: "A team member"
229
+ }),
230
+ /*#__PURE__*/ _jsx(FormControlLabel, {
231
+ value: "roundRobin",
232
+ control: /*#__PURE__*/ _jsx(Radio, {
233
+ size: "small"
234
+ }),
235
+ label: "Round robin — the next member of the pool"
236
+ })
237
+ ]
238
+ }),
239
+ target === 'roundRobin' ? /*#__PURE__*/ _jsx(FormHelperText, {
240
+ children: poolSize > 0 ? `The pool has ${poolSize} ${poolSize === 1 ? 'member' : 'members'}; each new contact goes to the next in turn.` : 'The pool is empty. This rule is skipped until somebody is added to it below.'
241
+ }) : null
242
+ ]
243
+ }),
244
+ target === 'member' ? /*#__PURE__*/ _jsx(TextField, {
245
+ select: true,
246
+ size: "small",
247
+ label: "Member",
248
+ value: memberUid,
249
+ onChange: (event)=>setMemberUid(event.target.value),
250
+ disabled: membersLoading,
251
+ helperText: membersLoading ? 'Loading the team…' : members.length ? undefined : 'The team could not be listed.',
252
+ fullWidth: true,
253
+ children: members.map((member)=>/*#__PURE__*/ _jsx(MenuItem, {
254
+ value: member.uid,
255
+ children: member.label
256
+ }, member.uid))
257
+ }) : null,
258
+ conditions.length === 0 ? /*#__PURE__*/ _jsx(Typography, {
259
+ variant: "caption",
260
+ color: "text.secondary",
261
+ children: 'No conditions: this rule matches every new contact the rules above it did not claim.'
262
+ }) : null,
263
+ error ? /*#__PURE__*/ _jsx(Typography, {
264
+ variant: "body2",
265
+ color: "error",
266
+ children: error
267
+ }) : null,
268
+ /*#__PURE__*/ _jsxs(Stack, {
269
+ direction: "row",
270
+ spacing: 1,
271
+ children: [
272
+ /*#__PURE__*/ _jsx(Button, {
273
+ variant: "contained",
274
+ color: "primary",
275
+ disabled: !canSubmit,
276
+ onClick: handleSubmit,
277
+ children: 'Add rule'
278
+ }),
279
+ /*#__PURE__*/ _jsx(Button, {
280
+ onClick: onClose,
281
+ disabled: busy,
282
+ children: 'Cancel'
283
+ })
284
+ ]
285
+ })
286
+ ]
287
+ })
288
+ });
289
+ }
290
+ AssignmentRuleDrawer.displayName = 'AssignmentRuleDrawer';
291
+ export default AssignmentRuleDrawer;
292
+
293
+ //# sourceMappingURL=assignment-rule-drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/assignment-rule-drawer.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n CONTACT_SOURCE_LABELS,\n type ContactSource,\n type CrmAssignmentRule,\n newAssignmentRuleId,\n readCrmAssignmentRule,\n} from '@aglyn/aglyn'\nimport {\n Button,\n Drawer,\n FormControl,\n FormControlLabel,\n FormHelperText,\n FormLabel,\n MenuItem,\n Radio,\n RadioGroup,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useCallback, useEffect, useState } from 'react'\nimport type { OrgMemberOption } from '../hooks/use-org-member-directory'\n\n/** The `value` of the source picker's \"any door\" entry. */\nconst ANY_SOURCE = ''\n\nexport interface AssignmentRuleDrawerProps {\n open: boolean\n onClose: () => void\n /** The roster the member target is picked from. */\n members: readonly OrgMemberOption[]\n membersLoading: boolean\n /** How many people the round-robin pool holds, for the target's helper text. */\n poolSize: number\n /** The ids the org already holds, so the new one is minted apart from them. */\n existingIds: readonly string[]\n /** Receives the rule; closing on success is the caller's job. */\n onSubmit: (rule: CrmAssignmentRule) => Promise<void> | void\n}\n\n/**\n * The one form an assignment rule is written through (AGL-2618).\n *\n * ## Every condition is optional, and none is a form above the list\n *\n * A rule names the captures it claims — a source, a form, an email domain,\n * a tag — and a field left blank is not a condition, so a rule with every\n * field blank is the catch-all, which is a rule a team writes on purpose\n * (\"everything else goes to Sam\"). The drawer says so rather than refusing\n * it. The email domain is typed the way a person sees one in an address,\n * `@acme.com` or `acme.com`, and the reader strips the `@`; what it cannot\n * read as a domain is refused here, with the field, rather than stored as\n * a condition nothing will ever match.\n *\n * ## The target is a member, or the rotation\n *\n * A member is picked from the roster by name, never typed as an address —\n * an address is resolved at run time and a rule must not depend on a\n * resolution that can change. The rotation is offered whatever the pool\n * holds, with the pool's size beside it: an empty pool is a rule the pass\n * steps over until somebody fills the pool, which the card below explains,\n * and refusing the rule here would make the two cards order-dependent.\n */\nexport function AssignmentRuleDrawer(props: AssignmentRuleDrawerProps) {\n const { open, onClose, members, membersLoading, poolSize, existingIds, onSubmit } =\n props\n const [source, setSource] = useState<string>(ANY_SOURCE)\n const [formId, setFormId] = useState('')\n const [emailDomain, setEmailDomain] = useState('')\n const [tag, setTag] = useState('')\n const [target, setTarget] = useState<'member' | 'roundRobin'>('member')\n const [memberUid, setMemberUid] = useState('')\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n // Seeded on every open, so a drawer that was cancelled halfway does not\n // offer the abandoned draft as the next rule.\n useEffect(() => {\n if (!open) return\n setSource(ANY_SOURCE)\n setFormId('')\n setEmailDomain('')\n setTag('')\n setTarget('member')\n setMemberUid('')\n setBusy(false)\n setError(null)\n }, [open])\n\n const domainTyped = emailDomain.trim().length > 0\n const domainReadable =\n !domainTyped ||\n readCrmAssignmentRule({\n id: 'probe',\n when: { emailDomain },\n assign: { roundRobin: true },\n })?.when.emailDomain !== undefined\n const canSubmit =\n !busy && domainReadable && (target === 'roundRobin' || memberUid.length > 0)\n\n const handleSubmit = useCallback(async () => {\n if (!canSubmit) return\n const rule = readCrmAssignmentRule({\n id: newAssignmentRuleId(existingIds),\n when: {\n ...(source ? { source } : {}),\n ...(formId.trim() ? { formId: formId.trim() } : {}),\n ...(emailDomain.trim() ? { emailDomain: emailDomain.trim() } : {}),\n ...(tag.trim() ? { tag: tag.trim() } : {}),\n },\n assign: target === 'roundRobin' ? { roundRobin: true } : { memberUid },\n })\n if (!rule) {\n setError('The rule could not be read back. Check each field.')\n return\n }\n setBusy(true)\n setError(null)\n try {\n await onSubmit(rule)\n } catch (caught) {\n console.error(caught)\n setError('Could not save the rule. Try again.')\n } finally {\n setBusy(false)\n }\n }, [canSubmit, existingIds, source, formId, emailDomain, tag, target, memberUid, onSubmit])\n\n const conditions = [source, formId.trim(), emailDomain.trim(), tag.trim()].filter(Boolean)\n\n return (\n <Drawer anchor=\"right\" open={open} onClose={onClose}>\n <Stack spacing={2} sx={{ width: 380, p: 3 }}>\n <Typography variant=\"h6\">{'New assignment rule'}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'When a new contact matches every condition below, it is assigned ' +\n 'as the rule says. Leave every condition blank for a rule that ' +\n 'catches everything the rules above it did not.'}\n </Typography>\n <TextField\n select\n size=\"small\"\n label=\"Source\"\n value={source}\n onChange={(event) => setSource(event.target.value)}\n fullWidth\n >\n <MenuItem value={ANY_SOURCE}>{'Any source'}</MenuItem>\n {(Object.keys(CONTACT_SOURCE_LABELS) as ContactSource[]).map((option) => (\n <MenuItem key={option} value={option}>\n {CONTACT_SOURCE_LABELS[option]}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n size=\"small\"\n label=\"Form\"\n value={formId}\n onChange={(event) => setFormId(event.target.value)}\n helperText=\"The form's id, from its address in Forms. Blank for any form.\"\n slotProps={{ htmlInput: { maxLength: 128, spellCheck: false } }}\n fullWidth\n />\n <TextField\n size=\"small\"\n label=\"Email domain\"\n value={emailDomain}\n onChange={(event) => setEmailDomain(event.target.value)}\n error={!domainReadable}\n helperText={\n domainReadable\n ? 'acme.com — the domain of the captured address. Public mailboxes such as gmail.com count.'\n : 'That does not look like a domain.'\n }\n slotProps={{ htmlInput: { maxLength: 253, spellCheck: false } }}\n fullWidth\n />\n <TextField\n size=\"small\"\n label=\"Tag\"\n value={tag}\n onChange={(event) => setTag(event.target.value)}\n helperText=\"A tag the capture carries, or the contact already has.\"\n slotProps={{ htmlInput: { maxLength: 60 } }}\n fullWidth\n />\n <FormControl>\n <FormLabel id=\"assignment-rule-target\">{'Assign to'}</FormLabel>\n <RadioGroup\n aria-labelledby=\"assignment-rule-target\"\n value={target}\n onChange={(event) =>\n setTarget(event.target.value === 'roundRobin' ? 'roundRobin' : 'member')\n }\n >\n <FormControlLabel value=\"member\" control={<Radio size=\"small\" />} label=\"A team member\" />\n <FormControlLabel\n value=\"roundRobin\"\n control={<Radio size=\"small\" />}\n label=\"Round robin — the next member of the pool\"\n />\n </RadioGroup>\n {target === 'roundRobin' ? (\n <FormHelperText>\n {poolSize > 0\n ? `The pool has ${poolSize} ${poolSize === 1 ? 'member' : 'members'}; each new contact goes to the next in turn.`\n : 'The pool is empty. This rule is skipped until somebody is added to it below.'}\n </FormHelperText>\n ) : null}\n </FormControl>\n {target === 'member' ? (\n <TextField\n select\n size=\"small\"\n label=\"Member\"\n value={memberUid}\n onChange={(event) => setMemberUid(event.target.value)}\n disabled={membersLoading}\n helperText={\n membersLoading\n ? 'Loading the team…'\n : members.length\n ? undefined\n : 'The team could not be listed.'\n }\n fullWidth\n >\n {members.map((member) => (\n <MenuItem key={member.uid} value={member.uid}>\n {member.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {conditions.length === 0 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'No conditions: this rule matches every new contact the rules above it did not claim.'}\n </Typography>\n ) : null}\n {error ? (\n <Typography variant=\"body2\" color=\"error\">\n {error}\n </Typography>\n ) : null}\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"contained\" color=\"primary\" disabled={!canSubmit} onClick={handleSubmit}>\n {'Add rule'}\n </Button>\n <Button onClick={onClose} disabled={busy}>\n {'Cancel'}\n </Button>\n </Stack>\n </Stack>\n </Drawer>\n )\n}\nAssignmentRuleDrawer.displayName = 'AssignmentRuleDrawer'\n\nexport default AssignmentRuleDrawer\n"],"names":["CONTACT_SOURCE_LABELS","newAssignmentRuleId","readCrmAssignmentRule","Button","Drawer","FormControl","FormControlLabel","FormHelperText","FormLabel","MenuItem","Radio","RadioGroup","Stack","TextField","Typography","useCallback","useEffect","useState","ANY_SOURCE","AssignmentRuleDrawer","props","open","onClose","members","membersLoading","poolSize","existingIds","onSubmit","source","setSource","formId","setFormId","emailDomain","setEmailDomain","tag","setTag","target","setTarget","memberUid","setMemberUid","busy","setBusy","error","setError","domainTyped","trim","length","domainReadable","id","when","assign","roundRobin","undefined","canSubmit","handleSubmit","rule","caught","console","conditions","filter","Boolean","anchor","spacing","sx","width","p","variant","color","select","size","label","value","onChange","event","fullWidth","Object","keys","map","option","helperText","slotProps","htmlInput","maxLength","spellCheck","aria-labelledby","control","disabled","member","uid","direction","onClick","displayName"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { OrgMemberOptions } from '../hooks/use-org-member-options';
2
+ import { type CompanyBulkRow } from '../model/companies-bulk-writes';
3
+ import { type CompanyCsvOptions, type CompanyCsvRow } from '../model/companies-csv';
4
+ export interface CompaniesBulkBarProps {
5
+ /**
6
+ * The site whose activity feed the bar's acts are logged in, or `null`
7
+ * at the organization level (AGL-2630), where the selection spans sites
8
+ * and no one feed is written.
9
+ */
10
+ hostId: string | null;
11
+ /** `['orgs', orgId]`, or `null` while the org is unresolved. */
12
+ scope: readonly ['orgs', string] | null;
13
+ rows: readonly (CompanyBulkRow & CompanyCsvRow)[];
14
+ selected: readonly string[];
15
+ onSelectedChange: (ids: string[]) => void;
16
+ /** The section's roster — already read for the Owner column. */
17
+ members: OrgMemberOptions;
18
+ /** How the export names an owner — the table's own options. */
19
+ csv?: CompanyCsvOptions;
20
+ }
21
+ /**
22
+ * The bar, or nothing — a separate boundary so the body's hooks never run
23
+ * on the visit to the list that ticks no row.
24
+ */
25
+ export declare function CompaniesBulkBar(props: CompaniesBulkBarProps): import("react").JSX.Element;
26
+ export declare namespace CompaniesBulkBar {
27
+ var displayName: string;
28
+ }
29
+ export default CompaniesBulkBar;
@@ -0,0 +1,274 @@
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
+ * The bar over the companies table, for whatever rows are ticked
21
+ * (AGL-2621).
22
+ *
23
+ * Tag or untag them, hand them to an owner, take them into a spreadsheet,
24
+ * or delete them. The patches come from `companies-bulk-writes.ts` and go
25
+ * through the shared runner; the delete is the record page's own
26
+ * `crm/company-delete`, per company, one after another — the route unlinks a
27
+ * company's contacts before it goes, and a company past the detach bound is
28
+ * left standing and NAMED, the way the page says it, so a second delete
29
+ * continues where this one stopped.
30
+ *
31
+ * ## The delete is logged, per company
32
+ *
33
+ * Each company that goes is one line in the site's activity feed, as it
34
+ * would be from its own page. A bulk delete of forty companies is forty
35
+ * acts and forty lines; a single "deleted 40 companies" line would name
36
+ * none of them, and the feed exists to answer "where did Acme go".
37
+ */ import { CRM_COLLECTIONS } from "@aglyn/aglyn";
38
+ import { useConfirmationContext } from "@aglyn/shared-ui-jsx";
39
+ import { useFirestore, useHostActivityLogger } from "@aglyn/tenant-feature-instance";
40
+ import { Button, MenuItem, TextField } from "@mui/material";
41
+ import { doc } from "firebase/firestore";
42
+ import { useCallback, useMemo, useState } from "react";
43
+ import { useCrmBulkApply } from "../hooks/use-crm-bulk-apply.js";
44
+ import { planCompanyAddTag, planCompanyRemoveTag, planCompanySetOwner } from "../model/companies-bulk-writes.js";
45
+ import { companiesCsv } from "../model/companies-csv.js";
46
+ import { COMPANY_DETACH_LIMIT } from "../model/companies.js";
47
+ import { deleteCompanyThroughRoute } from "../model/company-delete.js";
48
+ import { normalizeBulkTag } from "../model/contacts-bulk-writes.js";
49
+ import { downloadTextFile } from "../model/contacts-csv.js";
50
+ import { crmBulkWriters, runCrmBulkCalls, runCrmBulkWrites } from "../model/crm-bulk-writes.js";
51
+ import { CrmBulkBarFrame, CrmBulkValueDialog, countNoun } from "./crm-bulk-bar-frame.js";
52
+ import CrmExportAllButton from "./crm-export-all-button.js";
53
+ import { useCrmApi } from "./use-crm-api.js";
54
+ const NOUN = {
55
+ singular: 'company',
56
+ plural: 'companies'
57
+ };
58
+ const ACTION_TITLES = {
59
+ 'add-tag': 'Add a tag',
60
+ 'remove-tag': 'Remove a tag',
61
+ owner: 'Set the owner'
62
+ };
63
+ const doneSentence = (action, done)=>{
64
+ const rows = countNoun(done, NOUN);
65
+ switch(action){
66
+ case 'add-tag':
67
+ return `Tagged ${rows}`;
68
+ case 'remove-tag':
69
+ return `Removed the tag from ${rows}`;
70
+ case 'owner':
71
+ return `Owner set on ${rows}`;
72
+ }
73
+ };
74
+ /**
75
+ * The bar, or nothing — a separate boundary so the body's hooks never run
76
+ * on the visit to the list that ticks no row.
77
+ */ export function CompaniesBulkBar(props) {
78
+ if (!props.selected.length) return null;
79
+ return /*#__PURE__*/ _jsx(CompaniesBulkBarBody, _extends({}, props));
80
+ }
81
+ CompaniesBulkBar.displayName = 'CompaniesBulkBar';
82
+ function CompaniesBulkBarBody(props) {
83
+ var _members_error, _ref;
84
+ const { hostId, scope, rows, selected, onSelectedChange, members, csv } = props;
85
+ const firestore = useFirestore();
86
+ const { confirm } = useConfirmationContext();
87
+ const logActivity = useHostActivityLogger(hostId != null ? hostId : undefined);
88
+ const callCrm = useCrmApi(hostId);
89
+ const { busy, report, apply, dismissReport } = useCrmBulkApply({
90
+ recordKind: 'company'
91
+ });
92
+ const selectedRows = useMemo(()=>{
93
+ const chosen = new Set(selected);
94
+ return rows.filter((row)=>chosen.has(row.$id));
95
+ }, [
96
+ rows,
97
+ selected
98
+ ]);
99
+ const [pending, setPending] = useState(null);
100
+ const [value, setValue] = useState('');
101
+ const writers = useMemo(()=>crmBulkWriters(firestore, (id)=>{
102
+ var _ref, _ref1;
103
+ return doc(firestore, (_ref = scope == null ? void 0 : scope[0]) != null ? _ref : 'orgs', (_ref1 = scope == null ? void 0 : scope[1]) != null ? _ref1 : '', CRM_COLLECTIONS.companies, id);
104
+ }), [
105
+ firestore,
106
+ scope
107
+ ]);
108
+ const openAction = (action)=>{
109
+ setValue('');
110
+ setPending(action);
111
+ };
112
+ const runPlan = useCallback((action, plan)=>apply({
113
+ attempted: plan.writes.length,
114
+ skipped: plan.skipped,
115
+ job: ()=>runCrmBulkWrites(writers, plan.writes, (write)=>write.label),
116
+ done: (count)=>doneSentence(action, count)
117
+ }), [
118
+ apply,
119
+ writers
120
+ ]);
121
+ const handleApply = useCallback(async ()=>{
122
+ if (!pending || !scope) return;
123
+ const nowMs = Date.now();
124
+ const tag = normalizeBulkTag(value);
125
+ if (pending !== 'owner' && !tag) return;
126
+ const plan = pending === 'add-tag' ? planCompanyAddTag(selectedRows, tag != null ? tag : '', nowMs) : pending === 'remove-tag' ? planCompanyRemoveTag(selectedRows, tag != null ? tag : '', nowMs) : planCompanySetOwner(selectedRows, value || null, nowMs);
127
+ const action = pending;
128
+ setPending(null);
129
+ await runPlan(action, plan);
130
+ }, [
131
+ pending,
132
+ scope,
133
+ value,
134
+ selectedRows,
135
+ runPlan
136
+ ]);
137
+ const handleExport = useCallback(()=>{
138
+ downloadTextFile('companies-selected.csv', 'text/csv', companiesCsv(selectedRows, csv));
139
+ }, [
140
+ selectedRows,
141
+ csv
142
+ ]);
143
+ const handleDelete = useCallback(async ()=>{
144
+ if (!scope || !selectedRows.length) return;
145
+ const count = selectedRows.length;
146
+ const confirmed = await confirm({
147
+ title: count === 1 ? 'Delete this company?' : `Delete ${count} companies?`,
148
+ description: `${count === 1 ? 'It is' : 'They are'} removed from Companies and ` + 'unlinked from every contact at them. The contacts themselves are ' + 'kept, and so is anything else filed against the companies.',
149
+ confirmationText: count === 1 ? 'Delete company' : 'Delete companies',
150
+ confirmationButtonProps: {
151
+ color: 'error'
152
+ }
153
+ })// `confirm` resolves with no value and REJECTS on cancel.
154
+ .then(()=>true).catch(()=>false);
155
+ if (!confirmed) return;
156
+ const outcome = await apply({
157
+ attempted: count,
158
+ skipped: [],
159
+ job: ()=>runCrmBulkCalls(selectedRows, (row)=>String(row.name || row.$id), async (row)=>{
160
+ const result = await deleteCompanyThroughRoute(callCrm, row.$id);
161
+ if (!result.deleted) {
162
+ throw new Error(`${COMPANY_DETACH_LIMIT.toLocaleString()} contacts were unlinked ` + 'and more remain — delete again to continue');
163
+ }
164
+ logActivity('Deleted company', {
165
+ type: 'company',
166
+ id: row.$id,
167
+ name: row.name
168
+ });
169
+ }),
170
+ done: (done)=>`Deleted ${countNoun(done, NOUN)}`
171
+ });
172
+ // The rows that went are gone from the table; the refused ones stay
173
+ // selected, so the reader can see which they are and try again.
174
+ const refused = new Set(outcome.refused.map((row)=>row.label));
175
+ onSelectedChange(selectedRows.filter((row)=>refused.has(String(row.name || row.$id))).map((row)=>row.$id));
176
+ }, [
177
+ scope,
178
+ selectedRows,
179
+ confirm,
180
+ apply,
181
+ callCrm,
182
+ logActivity,
183
+ onSelectedChange
184
+ ]);
185
+ return /*#__PURE__*/ _jsxs(CrmBulkBarFrame, {
186
+ count: selected.length,
187
+ noun: NOUN,
188
+ busy: busy,
189
+ onClear: ()=>onSelectedChange([]),
190
+ report: report,
191
+ onDismissReport: dismissReport,
192
+ extras: /*#__PURE__*/ _jsx(CrmBulkValueDialog, {
193
+ open: pending !== null,
194
+ title: pending ? ACTION_TITLES[pending] : '',
195
+ count: selected.length,
196
+ noun: NOUN,
197
+ busy: busy,
198
+ canApply: pending === 'owner' || Boolean(normalizeBulkTag(value)),
199
+ onClose: ()=>setPending(null),
200
+ onApply: ()=>void handleApply(),
201
+ children: pending === 'add-tag' || pending === 'remove-tag' ? /*#__PURE__*/ _jsx(TextField, {
202
+ autoFocus: true,
203
+ size: "small",
204
+ label: "Tag",
205
+ placeholder: "enterprise",
206
+ value: value,
207
+ onChange: (event)=>setValue(event.target.value),
208
+ helperText: pending === 'add-tag' ? 'Lowercased, like the tags on a company' : 'Removed wherever it is present'
209
+ }) : pending === 'owner' ? /*#__PURE__*/ _jsxs(TextField, {
210
+ select: true,
211
+ size: "small",
212
+ label: "Owner",
213
+ value: value,
214
+ onChange: (event)=>setValue(event.target.value),
215
+ disabled: !members.ready,
216
+ error: Boolean(members.error),
217
+ helperText: (_members_error = members.error) != null ? _members_error : members.ready ? undefined : 'Loading the team…',
218
+ children: [
219
+ /*#__PURE__*/ _jsx(MenuItem, {
220
+ value: "",
221
+ children: 'Nobody — clear the owner'
222
+ }),
223
+ members.options.map((member)=>/*#__PURE__*/ _jsx(MenuItem, {
224
+ value: member.uid,
225
+ children: member.label
226
+ }, member.uid))
227
+ ]
228
+ }) : null
229
+ }),
230
+ children: [
231
+ /*#__PURE__*/ _jsx(Button, {
232
+ size: "small",
233
+ disabled: busy || !scope,
234
+ onClick: ()=>openAction('add-tag'),
235
+ children: 'Add tag'
236
+ }),
237
+ /*#__PURE__*/ _jsx(Button, {
238
+ size: "small",
239
+ disabled: busy || !scope,
240
+ onClick: ()=>openAction('remove-tag'),
241
+ children: 'Remove tag'
242
+ }),
243
+ /*#__PURE__*/ _jsx(Button, {
244
+ size: "small",
245
+ disabled: busy || !scope,
246
+ onClick: ()=>openAction('owner'),
247
+ children: 'Set owner'
248
+ }),
249
+ /*#__PURE__*/ _jsx(Button, {
250
+ size: "small",
251
+ disabled: busy,
252
+ onClick: handleExport,
253
+ children: 'Export CSV'
254
+ }),
255
+ /*#__PURE__*/ _jsx(CrmExportAllButton, {
256
+ resource: "companies",
257
+ orgId: (_ref = scope == null ? void 0 : scope[1]) != null ? _ref : null,
258
+ hostId: hostId,
259
+ disabled: busy
260
+ }),
261
+ /*#__PURE__*/ _jsx(Button, {
262
+ size: "small",
263
+ color: "error",
264
+ disabled: busy || !scope,
265
+ onClick: ()=>void handleDelete(),
266
+ children: 'Delete'
267
+ })
268
+ ]
269
+ });
270
+ }
271
+ CompaniesBulkBarBody.displayName = 'CompaniesBulkBarBody';
272
+ export default CompaniesBulkBar;
273
+
274
+ //# sourceMappingURL=companies-bulk-bar.js.map