@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,370 @@
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 { CRM_COLLECTIONS, CRM_EMAIL_TEMPLATE_KIND_LABELS, CRM_EMAIL_TEMPLATE_VISIBILITY_LABELS, CRM_EMAIL_TEMPLATES_LIMIT, createResourceUid, pluginDocsHelp } from "@aglyn/aglyn";
20
+ import { mdiContentCopy, mdiDeleteOutline, mdiPencilOutline } from "@aglyn/shared-data-mdi";
21
+ import EmptyStateComponent from "@aglyn/shared-ui-jsx/components/empty-state.component";
22
+ import { CardDisplay, MdiIcon, useConfirmationContext } from "@aglyn/shared-ui-jsx";
23
+ import RowActionsMenu from "@aglyn/shared-ui-jsx/components/row-actions-menu.component";
24
+ import { ScrollTable } from "@aglyn/shared-ui-jsx/components/scroll-table.component";
25
+ import { useSnackbar } from "@aglyn/shared-ui-snackstack";
26
+ import { DUPLICATE_MENU_LABEL, useDuplicateResource, useFirestore, useUser } from "@aglyn/tenant-feature-instance";
27
+ import { useCrmApi } from "./use-crm-api.js";
28
+ import { Button, Chip, Stack, TableBody, TableCell, TableHead, TableRow, Typography } from "@mui/material";
29
+ import { collection, deleteDoc, deleteField, doc, setDoc, updateDoc } from "firebase/firestore";
30
+ import { useCallback, useState } from "react";
31
+ import { useCrmEmailTemplates, useCrmEmailTemplateScope } from "../hooks/use-crm-email-templates.js";
32
+ import EmailTemplateDrawer from "./email-template-drawer.js";
33
+ /**
34
+ * "Email templates" — the letters the team keeps for **Send email**
35
+ * (AGL-2658): every template and snippet this member can use, with a
36
+ * drawer to write one and a row menu to edit or delete it.
37
+ *
38
+ * ## Whose card this is
39
+ *
40
+ * Unlike the switches above it, which the org's owner or admin alone may
41
+ * move, this card is every CRM editor's: a template is working material,
42
+ * not policy. The rules gate the rest — a shared row is any editor's, a
43
+ * personal row its owner's — and a colleague's personal rows are not
44
+ * listed here at all, so every row on screen is one this member may
45
+ * change.
46
+ *
47
+ * ## Where a new template lands
48
+ *
49
+ * Under a site, in that site's scope; from the organization's own hub, in
50
+ * the org's — the same rule the send dialog's Save as template follows
51
+ * (`useCrmEmailTemplateScope`). A personal template is owned by its
52
+ * writer; switching one to shared drops the owner, and back to personal
53
+ * makes the member editing it the owner.
54
+ */ export function EmailTemplatesCard(props) {
55
+ var _ref;
56
+ const { hostId, org } = props;
57
+ const firestore = useFirestore();
58
+ const { enqueueSnackbar } = useSnackbar();
59
+ const { confirm } = useConfirmationContext();
60
+ const { data: user } = useUser();
61
+ const uid = (_ref = user == null ? void 0 : user.uid) != null ? _ref : null;
62
+ const templateScope = useCrmEmailTemplateScope({
63
+ hostId,
64
+ org
65
+ });
66
+ const { scope, ready: scopeReady } = templateScope;
67
+ const { templates, ready } = useCrmEmailTemplates({
68
+ scope,
69
+ visibleTo: templateScope.visibleTo,
70
+ uid
71
+ });
72
+ // Duplicate (AGL-2936): through the plugin's own door, which files the
73
+ // copy under this person and keeps the original's scope.
74
+ const callCrm = useCrmApi(hostId != null ? hostId : null);
75
+ const duplicate = useDuplicateResource({
76
+ hostId: hostId != null ? hostId : '',
77
+ perform: async ({ sourceId, name, attemptKey })=>{
78
+ var _ref, _payload_name;
79
+ const { response, payload } = await callCrm('email-template-duplicate', {
80
+ templateId: sourceId,
81
+ name,
82
+ attemptKey
83
+ });
84
+ if (!response.ok) throw new Error((_ref = payload == null ? void 0 : payload.error) != null ? _ref : 'Duplicate failed');
85
+ return {
86
+ id: String(payload.templateId),
87
+ versionId: null,
88
+ name: String((_payload_name = payload.name) != null ? _payload_name : name)
89
+ };
90
+ },
91
+ onDuplicated: (_kind, copy)=>enqueueSnackbar(`Duplicated as “${copy.name}”`, {
92
+ variant: 'success',
93
+ persist: false
94
+ })
95
+ });
96
+ const [drawerOpen, setDrawerOpen] = useState(false);
97
+ const [editing, setEditing] = useState(null);
98
+ const [busyId, setBusyId] = useState('');
99
+ const templateRef = useCallback((id)=>{
100
+ if (!scope) throw new Error('an email template needs an organization');
101
+ return doc(firestore, scope[0], scope[1], CRM_COLLECTIONS.emailTemplates, id);
102
+ }, [
103
+ firestore,
104
+ scope
105
+ ]);
106
+ const openCreate = useCallback(()=>{
107
+ setEditing(null);
108
+ setDrawerOpen(true);
109
+ }, []);
110
+ const openEdit = useCallback((template)=>{
111
+ setEditing(template);
112
+ setDrawerOpen(true);
113
+ }, []);
114
+ const handleSubmit = useCallback(async (draft)=>{
115
+ if (!scope || !uid) return;
116
+ const now = Date.now();
117
+ const ownership = draft.visibility === 'personal' ? {
118
+ ownerUid: uid
119
+ } : {
120
+ ownerUid: deleteField()
121
+ };
122
+ if (editing) {
123
+ await updateDoc(templateRef(editing.$id), _extends({
124
+ name: draft.name,
125
+ kind: draft.kind,
126
+ visibility: draft.visibility,
127
+ subject: draft.subject,
128
+ body: draft.body
129
+ }, ownership, {
130
+ updatedAtMs: now,
131
+ updatedAt: new Date(now)
132
+ }));
133
+ enqueueSnackbar('Template saved', {
134
+ variant: 'success',
135
+ persist: false
136
+ });
137
+ } else {
138
+ await setDoc(doc(collection(firestore, scope[0], scope[1], CRM_COLLECTIONS.emailTemplates), createResourceUid()), _extends({
139
+ name: draft.name,
140
+ kind: draft.kind,
141
+ visibility: draft.visibility,
142
+ subject: draft.subject,
143
+ body: draft.body
144
+ }, draft.visibility === 'personal' ? {
145
+ ownerUid: uid
146
+ } : {}, {
147
+ createdByUid: uid,
148
+ createdAtMs: now,
149
+ updatedAtMs: now,
150
+ hostId: templateScope.createHostId,
151
+ visibleTo: [
152
+ ...templateScope.createTokens
153
+ ],
154
+ createdAt: new Date(now),
155
+ updatedAt: new Date(now)
156
+ }));
157
+ enqueueSnackbar(`Template "${draft.name}" added`, {
158
+ variant: 'success',
159
+ persist: false
160
+ });
161
+ }
162
+ setDrawerOpen(false);
163
+ setEditing(null);
164
+ }, [
165
+ scope,
166
+ uid,
167
+ editing,
168
+ templateRef,
169
+ enqueueSnackbar,
170
+ firestore,
171
+ templateScope
172
+ ]);
173
+ const handleDelete = useCallback(async (template)=>{
174
+ if (!scope || busyId) return;
175
+ const accepted = await confirm({
176
+ title: `Delete "${template.name}"?`,
177
+ description: template.kind === 'snippet' ? 'The snippet is removed for everyone it is listed for. Emails already sent are not changed.' : 'The template is removed for everyone it is listed for. Emails already sent are not changed.',
178
+ confirmationText: 'Delete',
179
+ confirmationButtonProps: {
180
+ color: 'error'
181
+ }
182
+ }).then(()=>true).catch(()=>false);
183
+ if (!accepted) return;
184
+ setBusyId(template.$id);
185
+ try {
186
+ await deleteDoc(templateRef(template.$id));
187
+ enqueueSnackbar('Template deleted', {
188
+ variant: 'success',
189
+ persist: false
190
+ });
191
+ } catch (error) {
192
+ console.error(error);
193
+ enqueueSnackbar('An error has occurred', {
194
+ variant: 'error',
195
+ allowDuplicate: true
196
+ });
197
+ } finally{
198
+ setBusyId('');
199
+ }
200
+ }, [
201
+ scope,
202
+ busyId,
203
+ confirm,
204
+ templateRef,
205
+ enqueueSnackbar
206
+ ]);
207
+ const rowActions = (template)=>[
208
+ {
209
+ key: 'edit',
210
+ label: 'Edit',
211
+ icon: /*#__PURE__*/ _jsx(MdiIcon, {
212
+ path: mdiPencilOutline.path,
213
+ size: 0.8
214
+ }),
215
+ onClick: ()=>openEdit(template)
216
+ },
217
+ {
218
+ key: 'duplicate',
219
+ label: DUPLICATE_MENU_LABEL,
220
+ icon: /*#__PURE__*/ _jsx(MdiIcon, {
221
+ path: mdiContentCopy.path,
222
+ size: 0.8
223
+ }),
224
+ onClick: ()=>duplicate.request('emailTemplate', {
225
+ id: template.$id,
226
+ name: template.name
227
+ })
228
+ },
229
+ {
230
+ key: 'delete',
231
+ label: 'Delete',
232
+ icon: /*#__PURE__*/ _jsx(MdiIcon, {
233
+ path: mdiDeleteOutline.path,
234
+ size: 0.8
235
+ }),
236
+ destructive: true,
237
+ disabled: Boolean(busyId),
238
+ onClick: ()=>void handleDelete(template)
239
+ }
240
+ ];
241
+ const atCap = templates.length >= CRM_EMAIL_TEMPLATES_LIMIT;
242
+ const canCreate = Boolean(scope) && Boolean(uid) && !atCap;
243
+ return /*#__PURE__*/ _jsxs(CardDisplay, {
244
+ header: 'Email templates',
245
+ help: pluginDocsHelp('crmEmailTemplates', {
246
+ anchor: '#managing-templates'
247
+ }),
248
+ contentGutterX: true,
249
+ contentGutterY: true,
250
+ contentBordered: "all",
251
+ HeaderProps: {
252
+ action: /*#__PURE__*/ _jsx(Button, {
253
+ variant: "contained",
254
+ disabled: !canCreate,
255
+ onClick: openCreate,
256
+ children: 'New template'
257
+ })
258
+ },
259
+ children: [
260
+ duplicate.dialog,
261
+ /*#__PURE__*/ _jsxs(Stack, {
262
+ spacing: 2,
263
+ children: [
264
+ /*#__PURE__*/ _jsx(Typography, {
265
+ variant: "body2",
266
+ color: "text.secondary",
267
+ children: 'The letters your team sends from a record. A template fills in the ' + 'subject and the message of Send email; a snippet drops a paragraph ' + 'in where the cursor is. Merge fields such as {{contact.firstName}} ' + 'are filled in from the record when the email is sent.'
268
+ }),
269
+ scopeReady && !scope ? /*#__PURE__*/ _jsx(Typography, {
270
+ variant: "body2",
271
+ color: "text.secondary",
272
+ children: 'This site has no organization, so it has no email templates.'
273
+ }) : !ready ? null : templates.length === 0 ? /*#__PURE__*/ _jsx(EmptyStateComponent, {
274
+ label: 'No templates yet',
275
+ description: 'Write one here, or save an email you are about to send as a template.',
276
+ action: canCreate ? /*#__PURE__*/ _jsx(Button, {
277
+ variant: "contained",
278
+ onClick: openCreate,
279
+ children: 'New template'
280
+ }) : undefined
281
+ }) : /*#__PURE__*/ _jsxs(ScrollTable, {
282
+ size: "small",
283
+ children: [
284
+ /*#__PURE__*/ _jsx(TableHead, {
285
+ children: /*#__PURE__*/ _jsxs(TableRow, {
286
+ children: [
287
+ /*#__PURE__*/ _jsx(TableCell, {
288
+ children: 'Name'
289
+ }),
290
+ /*#__PURE__*/ _jsx(TableCell, {
291
+ children: 'Kind'
292
+ }),
293
+ /*#__PURE__*/ _jsx(TableCell, {
294
+ children: 'For'
295
+ }),
296
+ /*#__PURE__*/ _jsx(TableCell, {
297
+ children: 'Subject'
298
+ }),
299
+ /*#__PURE__*/ _jsx(TableCell, {
300
+ align: "right"
301
+ })
302
+ ]
303
+ })
304
+ }),
305
+ /*#__PURE__*/ _jsx(TableBody, {
306
+ children: templates.map((template)=>/*#__PURE__*/ _jsxs(TableRow, {
307
+ hover: true,
308
+ children: [
309
+ /*#__PURE__*/ _jsx(TableCell, {
310
+ children: /*#__PURE__*/ _jsx(Typography, {
311
+ variant: "body2",
312
+ children: template.name
313
+ })
314
+ }),
315
+ /*#__PURE__*/ _jsx(TableCell, {
316
+ children: /*#__PURE__*/ _jsx(Typography, {
317
+ variant: "body2",
318
+ children: CRM_EMAIL_TEMPLATE_KIND_LABELS[template.kind]
319
+ })
320
+ }),
321
+ /*#__PURE__*/ _jsx(TableCell, {
322
+ children: /*#__PURE__*/ _jsx(Chip, {
323
+ size: "small",
324
+ variant: template.visibility === 'personal' ? 'outlined' : 'filled',
325
+ label: CRM_EMAIL_TEMPLATE_VISIBILITY_LABELS[template.visibility]
326
+ })
327
+ }),
328
+ /*#__PURE__*/ _jsx(TableCell, {
329
+ children: /*#__PURE__*/ _jsx(Typography, {
330
+ variant: "body2",
331
+ color: "text.secondary",
332
+ noWrap: true,
333
+ children: template.kind === 'template' ? template.subject || '—' : template.body
334
+ })
335
+ }),
336
+ /*#__PURE__*/ _jsx(TableCell, {
337
+ align: "right",
338
+ sx: {
339
+ width: 56
340
+ },
341
+ children: /*#__PURE__*/ _jsx(RowActionsMenu, {
342
+ label: template.name,
343
+ items: rowActions(template)
344
+ })
345
+ })
346
+ ]
347
+ }, template.$id))
348
+ })
349
+ ]
350
+ }),
351
+ atCap ? /*#__PURE__*/ _jsx(Typography, {
352
+ variant: "caption",
353
+ color: "text.secondary",
354
+ children: `A workspace keeps at most ${CRM_EMAIL_TEMPLATES_LIMIT} templates and snippets. Delete one to add another.`
355
+ }) : null
356
+ ]
357
+ }),
358
+ /*#__PURE__*/ _jsx(EmailTemplateDrawer, {
359
+ open: drawerOpen,
360
+ onClose: ()=>setDrawerOpen(false),
361
+ template: editing,
362
+ onSubmit: handleSubmit
363
+ })
364
+ ]
365
+ });
366
+ }
367
+ EmailTemplatesCard.displayName = 'EmailTemplatesCard';
368
+ export default EmailTemplatesCard;
369
+
370
+ //# sourceMappingURL=email-templates-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/email-templates-card.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n type AglynOrgBilling,\n CRM_COLLECTIONS,\n CRM_EMAIL_TEMPLATE_KIND_LABELS,\n CRM_EMAIL_TEMPLATE_VISIBILITY_LABELS,\n CRM_EMAIL_TEMPLATES_LIMIT,\n type CrmEmailTemplateRow,\n createResourceUid,\n pluginDocsHelp,\n} from '@aglyn/aglyn'\nimport {\n mdiContentCopy,\n mdiDeleteOutline,\n mdiPencilOutline,\n} from '@aglyn/shared-data-mdi'\nimport EmptyStateComponent from '@aglyn/shared-ui-jsx/components/empty-state.component'\nimport { CardDisplay, MdiIcon, useConfirmationContext } from '@aglyn/shared-ui-jsx'\nimport RowActionsMenu, {\n type RowActionsMenuItem,\n} from '@aglyn/shared-ui-jsx/components/row-actions-menu.component'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport {\n DUPLICATE_MENU_LABEL,\n useDuplicateResource,\n useFirestore,\n useUser,\n} from '@aglyn/tenant-feature-instance'\nimport { useCrmApi } from './use-crm-api'\nimport {\n Button,\n Chip,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport { collection, deleteDoc, deleteField, doc, setDoc, updateDoc } from 'firebase/firestore'\nimport { useCallback, useState } from 'react'\nimport {\n useCrmEmailTemplates,\n useCrmEmailTemplateScope,\n} from '../hooks/use-crm-email-templates'\nimport EmailTemplateDrawer, { type EmailTemplateDraft } from './email-template-drawer'\n\nexport interface EmailTemplatesCardProps {\n /** The site the section is read under, or `null` at the organization level. */\n hostId: string | null\n org?: Partial<AglynOrgBilling> | null\n}\n\n/**\n * \"Email templates\" — the letters the team keeps for **Send email**\n * (AGL-2658): every template and snippet this member can use, with a\n * drawer to write one and a row menu to edit or delete it.\n *\n * ## Whose card this is\n *\n * Unlike the switches above it, which the org's owner or admin alone may\n * move, this card is every CRM editor's: a template is working material,\n * not policy. The rules gate the rest — a shared row is any editor's, a\n * personal row its owner's — and a colleague's personal rows are not\n * listed here at all, so every row on screen is one this member may\n * change.\n *\n * ## Where a new template lands\n *\n * Under a site, in that site's scope; from the organization's own hub, in\n * the org's — the same rule the send dialog's Save as template follows\n * (`useCrmEmailTemplateScope`). A personal template is owned by its\n * writer; switching one to shared drops the owner, and back to personal\n * makes the member editing it the owner.\n */\nexport function EmailTemplatesCard(props: EmailTemplatesCardProps) {\n const { hostId, org } = props\n const firestore = useFirestore()\n const { enqueueSnackbar } = useSnackbar()\n const { confirm } = useConfirmationContext()\n const { data: user } = useUser()\n const uid = user?.uid ?? null\n const templateScope = useCrmEmailTemplateScope({ hostId, org })\n const { scope, ready: scopeReady } = templateScope\n const { templates, ready } = useCrmEmailTemplates({\n scope,\n visibleTo: templateScope.visibleTo,\n uid,\n })\n // Duplicate (AGL-2936): through the plugin's own door, which files the\n // copy under this person and keeps the original's scope.\n const callCrm = useCrmApi(hostId ?? null)\n const duplicate = useDuplicateResource({\n hostId: hostId ?? '',\n perform: async ({ sourceId, name, attemptKey }) => {\n const { response, payload } = await callCrm('email-template-duplicate', {\n templateId: sourceId,\n name,\n attemptKey,\n })\n if (!response.ok) throw new Error(payload?.error ?? 'Duplicate failed')\n return {\n id: String(payload.templateId),\n versionId: null,\n name: String(payload.name ?? name),\n }\n },\n onDuplicated: (_kind, copy) =>\n enqueueSnackbar(`Duplicated as “${copy.name}”`, { variant: 'success', persist: false }),\n })\n\n const [drawerOpen, setDrawerOpen] = useState(false)\n const [editing, setEditing] = useState<CrmEmailTemplateRow | null>(null)\n const [busyId, setBusyId] = useState('')\n\n const templateRef = useCallback(\n (id: string) => {\n if (!scope) throw new Error('an email template needs an organization')\n return doc(firestore, scope[0], scope[1], CRM_COLLECTIONS.emailTemplates, id)\n },\n [firestore, scope],\n )\n\n const openCreate = useCallback(() => {\n setEditing(null)\n setDrawerOpen(true)\n }, [])\n const openEdit = useCallback((template: CrmEmailTemplateRow) => {\n setEditing(template)\n setDrawerOpen(true)\n }, [])\n\n const handleSubmit = useCallback(\n async (draft: EmailTemplateDraft) => {\n if (!scope || !uid) return\n const now = Date.now()\n const ownership =\n draft.visibility === 'personal' ? { ownerUid: uid } : { ownerUid: deleteField() }\n if (editing) {\n await updateDoc(templateRef(editing.$id), {\n name: draft.name,\n kind: draft.kind,\n visibility: draft.visibility,\n subject: draft.subject,\n body: draft.body,\n ...ownership,\n updatedAtMs: now,\n updatedAt: new Date(now),\n })\n enqueueSnackbar('Template saved', { variant: 'success', persist: false })\n } else {\n await setDoc(\n doc(\n collection(firestore, scope[0], scope[1], CRM_COLLECTIONS.emailTemplates),\n createResourceUid(),\n ),\n {\n name: draft.name,\n kind: draft.kind,\n visibility: draft.visibility,\n subject: draft.subject,\n body: draft.body,\n ...(draft.visibility === 'personal' ? { ownerUid: uid } : {}),\n createdByUid: uid,\n createdAtMs: now,\n updatedAtMs: now,\n hostId: templateScope.createHostId,\n visibleTo: [...templateScope.createTokens],\n createdAt: new Date(now),\n updatedAt: new Date(now),\n },\n )\n enqueueSnackbar(`Template \"${draft.name}\" added`, { variant: 'success', persist: false })\n }\n setDrawerOpen(false)\n setEditing(null)\n },\n [scope, uid, editing, templateRef, enqueueSnackbar, firestore, templateScope],\n )\n\n const handleDelete = useCallback(\n async (template: CrmEmailTemplateRow) => {\n if (!scope || busyId) return\n const accepted = await confirm({\n title: `Delete \"${template.name}\"?`,\n description:\n template.kind === 'snippet'\n ? 'The snippet is removed for everyone it is listed for. Emails already sent are not changed.'\n : 'The template is removed for everyone it is listed for. Emails already sent are not changed.',\n confirmationText: 'Delete',\n confirmationButtonProps: { color: 'error' },\n })\n .then(() => true)\n .catch(() => false)\n if (!accepted) return\n setBusyId(template.$id)\n try {\n await deleteDoc(templateRef(template.$id))\n enqueueSnackbar('Template deleted', { variant: 'success', persist: false })\n } catch (error) {\n console.error(error)\n enqueueSnackbar('An error has occurred', { variant: 'error', allowDuplicate: true })\n } finally {\n setBusyId('')\n }\n },\n [scope, busyId, confirm, templateRef, enqueueSnackbar],\n )\n\n const rowActions = (template: CrmEmailTemplateRow): RowActionsMenuItem[] => [\n {\n key: 'edit',\n label: 'Edit',\n icon: <MdiIcon path={mdiPencilOutline.path} size={0.8} />,\n onClick: () => openEdit(template),\n },\n {\n key: 'duplicate',\n label: DUPLICATE_MENU_LABEL,\n icon: <MdiIcon path={mdiContentCopy.path} size={0.8} />,\n onClick: () =>\n duplicate.request('emailTemplate', { id: template.$id, name: template.name }),\n },\n {\n key: 'delete',\n label: 'Delete',\n icon: <MdiIcon path={mdiDeleteOutline.path} size={0.8} />,\n destructive: true,\n disabled: Boolean(busyId),\n onClick: () => void handleDelete(template),\n },\n ]\n\n const atCap = templates.length >= CRM_EMAIL_TEMPLATES_LIMIT\n const canCreate = Boolean(scope) && Boolean(uid) && !atCap\n return (\n <CardDisplay\n header={'Email templates'}\n help={pluginDocsHelp('crmEmailTemplates', { anchor: '#managing-templates' })}\n contentGutterX\n contentGutterY\n contentBordered=\"all\"\n HeaderProps={{\n action: (\n <Button variant=\"contained\" disabled={!canCreate} onClick={openCreate}>\n {'New template'}\n </Button>\n ),\n }}\n >\n {duplicate.dialog}\n <Stack spacing={2}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'The letters your team sends from a record. A template fills in the ' +\n 'subject and the message of Send email; a snippet drops a paragraph ' +\n 'in where the cursor is. Merge fields such as {{contact.firstName}} ' +\n 'are filled in from the record when the email is sent.'}\n </Typography>\n {scopeReady && !scope ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'This site has no organization, so it has no email templates.'}\n </Typography>\n ) : !ready ? null : templates.length === 0 ? (\n <EmptyStateComponent\n label={'No templates yet'}\n description={'Write one here, or save an email you are about to send as a template.'}\n action={\n canCreate ? (\n <Button variant=\"contained\" onClick={openCreate}>\n {'New template'}\n </Button>\n ) : undefined\n }\n />\n ) : (\n <ScrollTable size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{'Name'}</TableCell>\n <TableCell>{'Kind'}</TableCell>\n <TableCell>{'For'}</TableCell>\n <TableCell>{'Subject'}</TableCell>\n <TableCell align=\"right\" />\n </TableRow>\n </TableHead>\n <TableBody>\n {templates.map((template) => (\n <TableRow key={template.$id} hover>\n <TableCell>\n <Typography variant=\"body2\">{template.name}</Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {CRM_EMAIL_TEMPLATE_KIND_LABELS[template.kind]}\n </Typography>\n </TableCell>\n <TableCell>\n <Chip\n size=\"small\"\n variant={template.visibility === 'personal' ? 'outlined' : 'filled'}\n label={CRM_EMAIL_TEMPLATE_VISIBILITY_LABELS[template.visibility]}\n />\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" color=\"text.secondary\" noWrap>\n {template.kind === 'template' ? template.subject || '—' : template.body}\n </Typography>\n </TableCell>\n <TableCell align=\"right\" sx={{ width: 56 }}>\n <RowActionsMenu label={template.name} items={rowActions(template)} />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </ScrollTable>\n )}\n {atCap ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`A workspace keeps at most ${CRM_EMAIL_TEMPLATES_LIMIT} templates and snippets. Delete one to add another.`}\n </Typography>\n ) : null}\n </Stack>\n <EmailTemplateDrawer\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n template={editing}\n onSubmit={handleSubmit}\n />\n </CardDisplay>\n )\n}\nEmailTemplatesCard.displayName = 'EmailTemplatesCard'\n\nexport default EmailTemplatesCard\n"],"names":["CRM_COLLECTIONS","CRM_EMAIL_TEMPLATE_KIND_LABELS","CRM_EMAIL_TEMPLATE_VISIBILITY_LABELS","CRM_EMAIL_TEMPLATES_LIMIT","createResourceUid","pluginDocsHelp","mdiContentCopy","mdiDeleteOutline","mdiPencilOutline","EmptyStateComponent","CardDisplay","MdiIcon","useConfirmationContext","RowActionsMenu","ScrollTable","useSnackbar","DUPLICATE_MENU_LABEL","useDuplicateResource","useFirestore","useUser","useCrmApi","Button","Chip","Stack","TableBody","TableCell","TableHead","TableRow","Typography","collection","deleteDoc","deleteField","doc","setDoc","updateDoc","useCallback","useState","useCrmEmailTemplates","useCrmEmailTemplateScope","EmailTemplateDrawer","EmailTemplatesCard","props","hostId","org","firestore","enqueueSnackbar","confirm","data","user","uid","templateScope","scope","ready","scopeReady","templates","visibleTo","callCrm","duplicate","perform","sourceId","name","attemptKey","payload","response","templateId","ok","Error","error","id","String","versionId","onDuplicated","_kind","copy","variant","persist","drawerOpen","setDrawerOpen","editing","setEditing","busyId","setBusyId","templateRef","emailTemplates","openCreate","openEdit","template","handleSubmit","draft","now","Date","ownership","visibility","ownerUid","$id","kind","subject","body","updatedAtMs","updatedAt","createdByUid","createdAtMs","createHostId","createTokens","createdAt","handleDelete","accepted","title","description","confirmationText","confirmationButtonProps","color","then","catch","console","allowDuplicate","rowActions","key","label","icon","path","size","onClick","request","destructive","disabled","Boolean","atCap","length","canCreate","header","help","anchor","contentGutterX","contentGutterY","contentBordered","HeaderProps","action","dialog","spacing","undefined","align","map","hover","noWrap","sx","width","items","open","onClose","onSubmit","displayName"],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import type { RowActionsMenuItem } from '@aglyn/shared-ui-jsx/components/row-actions-menu.component';
2
+ import { type ReactNode } from 'react';
3
+ /** The record the action is offered on: which kind, its id, and its address. */
4
+ export type ErasePersonSubject = {
5
+ kind: 'contact';
6
+ id: string;
7
+ email: string;
8
+ } | {
9
+ kind: 'lead';
10
+ id: string;
11
+ email: string;
12
+ };
13
+ export interface UseErasePersonActionProps {
14
+ /**
15
+ * The site the request is filed from — the route logs it on that site's
16
+ * feed. At the organization level the record's own capturing site
17
+ * (AGL-2630), or `null` for a record no site has captured: beneath the
18
+ * org hub's mount the route's org variant files it anyway (AGL-2634), and
19
+ * only a surface mounted nowhere holds the item.
20
+ */
21
+ hostId: string | null;
22
+ orgId: string | null | undefined;
23
+ /** Null while the record has not loaded; the item is then disabled. */
24
+ subject: ErasePersonSubject | null;
25
+ /** The record's marker, when a request is already waiting. */
26
+ requestedAtMs: number | null;
27
+ }
28
+ export interface ErasePersonAction {
29
+ /** Zero or one item, to spread into the record header's overflow menu. */
30
+ menuItems: RowActionsMenuItem[];
31
+ /** The pending banner, or null. Render it where the record's cards begin. */
32
+ banner: ReactNode;
33
+ /** The dialog. Render it once, anywhere in the page. */
34
+ dialog: ReactNode;
35
+ /**
36
+ * When the waiting request was filed, or null while none waits: the
37
+ * record's marker, or the route's answer until the listener carries the
38
+ * marker. What a page gates its other acts on — Convert, on a lead — so
39
+ * they close the moment the item does.
40
+ */
41
+ pendingSinceMs: number | null;
42
+ }
43
+ /**
44
+ * **Erase this person** on a record page (AGL-2623).
45
+ *
46
+ * Owned by a hook rather than a component because the overflow menu takes
47
+ * items as data: the page spreads `menuItems` into its own list, renders
48
+ * `banner` under the header and `dialog` at the end, and everything the
49
+ * action knows — who may, whether a request is already waiting, what the
50
+ * dialog says, what the route answers — lives here.
51
+ *
52
+ * Offered to workspace admins and owners only, and the item is present but
53
+ * disabled for everyone else with the reason as its tooltip: an absent item
54
+ * and an inapplicable one look alike, and a site editor who cannot find
55
+ * the action should learn who can rather than conclude it does not exist.
56
+ *
57
+ * Takes the site from the page and the workspace from `useOrgDataScope`,
58
+ * never a route, so an org-level mount can offer the same item.
59
+ */
60
+ export declare function useErasePersonAction(props: UseErasePersonActionProps): ErasePersonAction;
61
+ export interface ErasurePendingBannerProps {
62
+ requestedAtMs: number;
63
+ }
64
+ /**
65
+ * The state a record wears between the request and the run. Says when it
66
+ * was asked and what will happen, so a reader arriving cold neither files
67
+ * it again nor keeps working the record.
68
+ */
69
+ export declare function ErasurePendingBanner(props: ErasurePendingBannerProps): import("react").JSX.Element;
70
+ export declare namespace ErasurePendingBanner {
71
+ var displayName: string;
72
+ }
73
+ export interface ErasePersonDialogProps {
74
+ open: boolean;
75
+ onClose: () => void;
76
+ /** The site the request is filed from, or `null` beneath the org hub's mount. */
77
+ hostId: string | null;
78
+ subject: ErasePersonSubject;
79
+ /** Called with the request's queue time once the route has filed it. */
80
+ onFiled: (pendingSinceMs: number) => void;
81
+ }
82
+ /**
83
+ * The confirmation: everything the request removes, everything it keeps
84
+ * and how, what it does not reach, and the two facts that follow the click
85
+ * — the address is closed to capture at once, and the sweep runs with the
86
+ * nightly job. The admin types the address back; the route checks the same
87
+ * match before it files anything.
88
+ */
89
+ export declare function ErasePersonDialog(props: ErasePersonDialogProps): import("react").JSX.Element;
90
+ export declare namespace ErasePersonDialog {
91
+ var displayName: string;
92
+ }