@aglyn/plugins-crm 1.0.0-beta.221 → 1.0.0-beta.223

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 (541) hide show
  1. package/README.md +2 -1
  2. package/package.json +13 -13
  3. package/src/lib/components/activity-list.js +12 -5
  4. package/src/lib/components/activity-list.js.map +1 -1
  5. package/src/lib/components/companies-bulk-bar.d.ts +1 -4
  6. package/src/lib/components/companies-bulk-bar.js +7 -20
  7. package/src/lib/components/companies-bulk-bar.js.map +1 -1
  8. package/src/lib/components/companies-section.d.ts +3 -3
  9. package/src/lib/components/companies-section.js +149 -46
  10. package/src/lib/components/companies-section.js.map +1 -1
  11. package/src/lib/components/company-edit-drawer.js +281 -20
  12. package/src/lib/components/company-edit-drawer.js.map +1 -1
  13. package/src/lib/components/company-properties-card.js +99 -8
  14. package/src/lib/components/company-properties-card.js.map +1 -1
  15. package/src/lib/components/contact-detail-page.js +3 -1
  16. package/src/lib/components/contact-detail-page.js.map +1 -1
  17. package/src/lib/components/contact-merge-dialog.js +33 -10
  18. package/src/lib/components/contact-merge-dialog.js.map +1 -1
  19. package/src/lib/components/contact-properties-card.d.ts +0 -69
  20. package/src/lib/components/contact-properties-card.js +350 -60
  21. package/src/lib/components/contact-properties-card.js.map +1 -1
  22. package/src/lib/components/contact-reports-to-field.d.ts +46 -0
  23. package/src/lib/components/contact-reports-to-field.js +67 -0
  24. package/src/lib/components/contact-reports-to-field.js.map +1 -0
  25. package/src/lib/components/contacts-bulk-bar.d.ts +1 -8
  26. package/src/lib/components/contacts-bulk-bar.js +7 -19
  27. package/src/lib/components/contacts-bulk-bar.js.map +1 -1
  28. package/src/lib/components/contacts-section.js +46 -33
  29. package/src/lib/components/contacts-section.js.map +1 -1
  30. package/src/lib/components/crm-call-actions.d.ts +10 -0
  31. package/src/lib/components/crm-call-actions.js +26 -9
  32. package/src/lib/components/crm-call-actions.js.map +1 -1
  33. package/src/lib/components/crm-next-activity-column.js +1 -1
  34. package/src/lib/components/crm-next-activity-column.js.map +1 -1
  35. package/src/lib/components/crm-record-picker.d.ts +15 -0
  36. package/src/lib/components/crm-record-picker.js +16 -10
  37. package/src/lib/components/crm-record-picker.js.map +1 -1
  38. package/src/lib/components/crm-transfer-buttons.d.ts +54 -0
  39. package/src/lib/components/crm-transfer-buttons.js +167 -0
  40. package/src/lib/components/crm-transfer-buttons.js.map +1 -0
  41. package/src/lib/components/deal-contact-roles-card.d.ts +46 -0
  42. package/src/lib/components/deal-contact-roles-card.js +368 -0
  43. package/src/lib/components/deal-contact-roles-card.js.map +1 -0
  44. package/src/lib/components/deal-detail-page.d.ts +3 -2
  45. package/src/lib/components/deal-detail-page.js +25 -6
  46. package/src/lib/components/deal-detail-page.js.map +1 -1
  47. package/src/lib/components/deal-edit-drawer.d.ts +10 -0
  48. package/src/lib/components/deal-edit-drawer.js +219 -10
  49. package/src/lib/components/deal-edit-drawer.js.map +1 -1
  50. package/src/lib/components/deal-properties-card.d.ts +7 -0
  51. package/src/lib/components/deal-properties-card.js +34 -3
  52. package/src/lib/components/deal-properties-card.js.map +1 -1
  53. package/src/lib/components/deal-stage-card.d.ts +4 -0
  54. package/src/lib/components/deal-stage-card.js +10 -2
  55. package/src/lib/components/deal-stage-card.js.map +1 -1
  56. package/src/lib/components/deals-bulk-bar.d.ts +0 -3
  57. package/src/lib/components/deals-bulk-bar.js +7 -20
  58. package/src/lib/components/deals-bulk-bar.js.map +1 -1
  59. package/src/lib/components/deals-section.d.ts +3 -3
  60. package/src/lib/components/deals-section.js +123 -63
  61. package/src/lib/components/deals-section.js.map +1 -1
  62. package/src/lib/components/fields-section.js +31 -17
  63. package/src/lib/components/fields-section.js.map +1 -1
  64. package/src/lib/components/lead-convert-dialog.d.ts +4 -0
  65. package/src/lib/components/lead-convert-dialog.js +23 -1
  66. package/src/lib/components/lead-convert-dialog.js.map +1 -1
  67. package/src/lib/components/lead-detail-page.js +8 -2
  68. package/src/lib/components/lead-detail-page.js.map +1 -1
  69. package/src/lib/components/lead-profile-fields.d.ts +71 -0
  70. package/src/lib/components/lead-profile-fields.js +386 -0
  71. package/src/lib/components/lead-profile-fields.js.map +1 -0
  72. package/src/lib/components/lead-properties-card.d.ts +2 -1
  73. package/src/lib/components/lead-properties-card.js +85 -176
  74. package/src/lib/components/lead-properties-card.js.map +1 -1
  75. package/src/lib/components/lead-source-select.d.ts +4 -23
  76. package/src/lib/components/lead-source-select.js +9 -73
  77. package/src/lib/components/lead-source-select.js.map +1 -1
  78. package/src/lib/components/lead-status-chip.d.ts +9 -3
  79. package/src/lib/components/lead-status-chip.js +8 -4
  80. package/src/lib/components/lead-status-chip.js.map +1 -1
  81. package/src/lib/components/lead-status-options.d.ts +20 -0
  82. package/src/lib/components/lead-status-options.js +51 -0
  83. package/src/lib/components/lead-status-options.js.map +1 -0
  84. package/src/lib/components/lead-unqualify-dialog.d.ts +5 -0
  85. package/src/lib/components/lead-unqualify-dialog.js +50 -18
  86. package/src/lib/components/lead-unqualify-dialog.js.map +1 -1
  87. package/src/lib/components/leads-bulk-bar.d.ts +0 -3
  88. package/src/lib/components/leads-bulk-bar.js +29 -29
  89. package/src/lib/components/leads-bulk-bar.js.map +1 -1
  90. package/src/lib/components/leads-section.js +120 -68
  91. package/src/lib/components/leads-section.js.map +1 -1
  92. package/src/lib/components/linked-deals-card.d.ts +4 -0
  93. package/src/lib/components/linked-deals-card.js +47 -3
  94. package/src/lib/components/linked-deals-card.js.map +1 -1
  95. package/src/lib/components/log-activity-dialog.js +43 -3
  96. package/src/lib/components/log-activity-dialog.js.map +1 -1
  97. package/src/lib/components/new-contact-drawer.d.ts +8 -0
  98. package/src/lib/components/new-contact-drawer.js +108 -6
  99. package/src/lib/components/new-contact-drawer.js.map +1 -1
  100. package/src/lib/components/new-lead-drawer.d.ts +9 -2
  101. package/src/lib/components/new-lead-drawer.js +88 -121
  102. package/src/lib/components/new-lead-drawer.js.map +1 -1
  103. package/src/lib/components/picklist-select.d.ts +36 -0
  104. package/src/lib/components/picklist-select.js +114 -0
  105. package/src/lib/components/picklist-select.js.map +1 -0
  106. package/src/lib/components/picklist-values-card.d.ts +34 -0
  107. package/src/lib/components/{lead-source-values-card.js → picklist-values-card.js} +241 -58
  108. package/src/lib/components/picklist-values-card.js.map +1 -0
  109. package/src/lib/components/pipeline-stages-dialog.d.ts +7 -0
  110. package/src/lib/components/pipeline-stages-dialog.js +26 -4
  111. package/src/lib/components/pipeline-stages-dialog.js.map +1 -1
  112. package/src/lib/components/pipelines-dialog.js +15 -6
  113. package/src/lib/components/pipelines-dialog.js.map +1 -1
  114. package/src/lib/components/recent-activity-feed.js +20 -5
  115. package/src/lib/components/recent-activity-feed.js.map +1 -1
  116. package/src/lib/components/recipes-card.js +4 -2
  117. package/src/lib/components/recipes-card.js.map +1 -1
  118. package/src/lib/components/record-tasks-card.js +15 -8
  119. package/src/lib/components/record-tasks-card.js.map +1 -1
  120. package/src/lib/components/reports/forecast-card.d.ts +6 -0
  121. package/src/lib/components/reports/forecast-card.js +101 -3
  122. package/src/lib/components/reports/forecast-card.js.map +1 -1
  123. package/src/lib/components/reports/lead-funnel-card.d.ts +12 -0
  124. package/src/lib/components/reports/lead-funnel-card.js +9 -5
  125. package/src/lib/components/reports/lead-funnel-card.js.map +1 -1
  126. package/src/lib/components/reports/lead-source-card.d.ts +23 -0
  127. package/src/lib/components/reports/lead-source-card.js +318 -0
  128. package/src/lib/components/reports/lead-source-card.js.map +1 -0
  129. package/src/lib/components/reports/pipeline-card.js +2 -1
  130. package/src/lib/components/reports/pipeline-card.js.map +1 -1
  131. package/src/lib/components/reports/report-export.js +1 -1
  132. package/src/lib/components/reports/report-export.js.map +1 -1
  133. package/src/lib/components/reports-section.js +8 -0
  134. package/src/lib/components/reports-section.js.map +1 -1
  135. package/src/lib/components/sharing-rule-drawer.d.ts +5 -0
  136. package/src/lib/components/sharing-rule-drawer.js +108 -19
  137. package/src/lib/components/sharing-rule-drawer.js.map +1 -1
  138. package/src/lib/components/sharing-rules-card.js +11 -3
  139. package/src/lib/components/sharing-rules-card.js.map +1 -1
  140. package/src/lib/components/task-cells.d.ts +9 -1
  141. package/src/lib/components/task-cells.js +9 -4
  142. package/src/lib/components/task-cells.js.map +1 -1
  143. package/src/lib/components/task-edit-drawer.js +111 -43
  144. package/src/lib/components/task-edit-drawer.js.map +1 -1
  145. package/src/lib/components/tasks-bulk-bar.d.ts +0 -3
  146. package/src/lib/components/tasks-bulk-bar.js +7 -20
  147. package/src/lib/components/tasks-bulk-bar.js.map +1 -1
  148. package/src/lib/components/tasks-calendar.d.ts +3 -0
  149. package/src/lib/components/tasks-calendar.js +8 -1
  150. package/src/lib/components/tasks-calendar.js.map +1 -1
  151. package/src/lib/components/tasks-section.d.ts +3 -3
  152. package/src/lib/components/tasks-section.js +58 -43
  153. package/src/lib/components/tasks-section.js.map +1 -1
  154. package/src/lib/constants/api-routes.d.ts +2 -9
  155. package/src/lib/constants/api-routes.js +1 -7
  156. package/src/lib/constants/api-routes.js.map +1 -1
  157. package/src/lib/constants/bundle-common.d.ts +6 -0
  158. package/src/lib/constants/bundle-common.js +11 -0
  159. package/src/lib/constants/bundle-common.js.map +1 -1
  160. package/src/lib/constants/company-filters.d.ts +14 -0
  161. package/src/lib/constants/company-filters.js +51 -1
  162. package/src/lib/constants/company-filters.js.map +1 -1
  163. package/src/lib/constants/contact-filters.d.ts +2 -0
  164. package/src/lib/constants/contact-filters.js +18 -1
  165. package/src/lib/constants/contact-filters.js.map +1 -1
  166. package/src/lib/constants/deal-filters.d.ts +22 -1
  167. package/src/lib/constants/deal-filters.js +67 -4
  168. package/src/lib/constants/deal-filters.js.map +1 -1
  169. package/src/lib/declarations.console-server.d.ts +3 -0
  170. package/src/lib/declarations.console-server.js +35 -0
  171. package/src/lib/declarations.console-server.js.map +1 -1
  172. package/src/lib/declarations.d.ts +26 -0
  173. package/src/lib/declarations.js +35 -0
  174. package/src/lib/declarations.js.map +1 -0
  175. package/src/lib/declarations.server.d.ts +11 -0
  176. package/src/lib/declarations.server.js +97 -1
  177. package/src/lib/declarations.server.js.map +1 -1
  178. package/src/lib/hooks/use-company-picklists.d.ts +15 -0
  179. package/src/lib/hooks/use-company-picklists.js +55 -0
  180. package/src/lib/hooks/use-company-picklists.js.map +1 -0
  181. package/src/lib/hooks/use-crm-picklist.d.ts +25 -0
  182. package/src/lib/hooks/use-crm-picklist.js +53 -0
  183. package/src/lib/hooks/use-crm-picklist.js.map +1 -0
  184. package/src/lib/hooks/use-crm-record-names.d.ts +16 -0
  185. package/src/lib/hooks/use-crm-record-names.js +45 -19
  186. package/src/lib/hooks/use-crm-record-names.js.map +1 -1
  187. package/src/lib/hooks/use-crm-task-picklists.d.ts +11 -0
  188. package/src/lib/hooks/use-crm-task-picklists.js +45 -0
  189. package/src/lib/hooks/use-crm-task-picklists.js.map +1 -0
  190. package/src/lib/hooks/use-deals.d.ts +14 -0
  191. package/src/lib/hooks/use-deals.js +29 -0
  192. package/src/lib/hooks/use-deals.js.map +1 -1
  193. package/src/lib/hooks/use-lead-picklists.d.ts +14 -0
  194. package/src/lib/hooks/use-lead-picklists.js +46 -0
  195. package/src/lib/hooks/use-lead-picklists.js.map +1 -0
  196. package/src/lib/hooks/use-lead-source-picklist.d.ts +5 -19
  197. package/src/lib/hooks/use-lead-source-picklist.js +12 -22
  198. package/src/lib/hooks/use-lead-source-picklist.js.map +1 -1
  199. package/src/lib/hooks/use-lead-status-picklist.d.ts +9 -0
  200. package/src/lib/hooks/use-lead-status-picklist.js +40 -0
  201. package/src/lib/hooks/use-lead-status-picklist.js.map +1 -0
  202. package/src/lib/model/companies.d.ts +32 -3
  203. package/src/lib/model/companies.js +133 -16
  204. package/src/lib/model/companies.js.map +1 -1
  205. package/src/lib/model/contact-merge.d.ts +27 -3
  206. package/src/lib/model/contact-merge.js +81 -7
  207. package/src/lib/model/contact-merge.js.map +1 -1
  208. package/src/lib/model/contact-record.d.ts +17 -0
  209. package/src/lib/model/contact-record.js +17 -2
  210. package/src/lib/model/contact-record.js.map +1 -1
  211. package/src/lib/model/contact-update.d.ts +31 -2
  212. package/src/lib/model/contact-update.js +14 -0
  213. package/src/lib/model/contact-update.js.map +1 -1
  214. package/src/lib/model/crm-list-query.d.ts +5 -0
  215. package/src/lib/model/crm-list-query.js +8 -0
  216. package/src/lib/model/crm-list-query.js.map +1 -1
  217. package/src/lib/model/crm-next-activity.d.ts +107 -0
  218. package/src/lib/model/crm-next-activity.js +140 -0
  219. package/src/lib/model/crm-next-activity.js.map +1 -0
  220. package/src/lib/model/crm-recipes.d.ts +40 -0
  221. package/src/lib/model/crm-recipes.js +259 -0
  222. package/src/lib/model/crm-recipes.js.map +1 -0
  223. package/src/lib/model/crm-record-counts.d.ts +36 -0
  224. package/src/lib/model/crm-record-counts.js +54 -0
  225. package/src/lib/model/crm-record-counts.js.map +1 -0
  226. package/src/lib/model/crm-record-lists.d.ts +23 -0
  227. package/src/lib/model/crm-record-lists.js +161 -0
  228. package/src/lib/model/crm-record-lists.js.map +1 -0
  229. package/src/lib/model/crm-reports.d.ts +73 -3
  230. package/src/lib/model/crm-reports.js +120 -1
  231. package/src/lib/model/crm-reports.js.map +1 -1
  232. package/src/lib/model/crm-sharing.d.ts +21 -3
  233. package/src/lib/model/crm-sharing.js +27 -6
  234. package/src/lib/model/crm-sharing.js.map +1 -1
  235. package/src/lib/model/crm-task-reminders.d.ts +152 -0
  236. package/src/lib/model/crm-task-reminders.js +161 -0
  237. package/src/lib/model/crm-task-reminders.js.map +1 -0
  238. package/src/lib/model/deal-board-model.d.ts +8 -2
  239. package/src/lib/model/deal-board-model.js +15 -2
  240. package/src/lib/model/deal-board-model.js.map +1 -1
  241. package/src/lib/model/deal-contact-roles.d.ts +45 -0
  242. package/src/lib/model/deal-contact-roles.js +73 -0
  243. package/src/lib/model/deal-contact-roles.js.map +1 -0
  244. package/src/lib/model/deal-form-model.d.ts +56 -0
  245. package/src/lib/model/deal-form-model.js +79 -7
  246. package/src/lib/model/deal-form-model.js.map +1 -1
  247. package/src/lib/model/download-text-file.d.ts +23 -0
  248. package/src/lib/model/download-text-file.js +34 -0
  249. package/src/lib/model/download-text-file.js.map +1 -0
  250. package/src/lib/model/lead-filters.d.ts +36 -2
  251. package/src/lib/model/lead-filters.js +123 -2
  252. package/src/lib/model/lead-filters.js.map +1 -1
  253. package/src/lib/model/lead-source-direction.d.ts +38 -0
  254. package/src/lib/model/lead-source-direction.js +52 -0
  255. package/src/lib/model/lead-source-direction.js.map +1 -0
  256. package/src/lib/model/next-activity.d.ts +1 -1
  257. package/src/lib/model/next-activity.js.map +1 -1
  258. package/src/lib/model/picklist-values.d.ts +119 -0
  259. package/src/lib/model/picklist-values.js +256 -0
  260. package/src/lib/model/picklist-values.js.map +1 -0
  261. package/src/lib/model/record-facts-disclosed.d.ts +81 -0
  262. package/src/lib/model/record-facts-disclosed.js +281 -0
  263. package/src/lib/model/record-facts-disclosed.js.map +1 -0
  264. package/src/lib/model/record-facts.d.ts +215 -34
  265. package/src/lib/model/record-facts.js +307 -128
  266. package/src/lib/model/record-facts.js.map +1 -1
  267. package/src/lib/model/task-picklists.d.ts +52 -0
  268. package/src/lib/model/task-picklists.js +83 -0
  269. package/src/lib/model/task-picklists.js.map +1 -0
  270. package/src/lib/model/task-routes.d.ts +13 -0
  271. package/src/lib/model/task-routes.js +23 -4
  272. package/src/lib/model/task-routes.js.map +1 -1
  273. package/src/lib/plan-entitlements.js +6 -4
  274. package/src/lib/plan-entitlements.js.map +1 -1
  275. package/src/lib/plugin.js +17 -0
  276. package/src/lib/plugin.js.map +1 -1
  277. package/src/lib/server/api-v1/contacts.js +220 -14
  278. package/src/lib/server/api-v1/contacts.js.map +1 -1
  279. package/src/lib/server/api-v1/crm-activities.js +14 -1
  280. package/src/lib/server/api-v1/crm-activities.js.map +1 -1
  281. package/src/lib/server/api-v1/crm-companies.js +123 -14
  282. package/src/lib/server/api-v1/crm-companies.js.map +1 -1
  283. package/src/lib/server/api-v1/crm-deals.js +291 -26
  284. package/src/lib/server/api-v1/crm-deals.js.map +1 -1
  285. package/src/lib/server/api-v1/crm-leads.js +144 -38
  286. package/src/lib/server/api-v1/crm-leads.js.map +1 -1
  287. package/src/lib/server/api-v1/crm-pipelines.d.ts +6 -0
  288. package/src/lib/server/api-v1/crm-pipelines.js +8 -2
  289. package/src/lib/server/api-v1/crm-pipelines.js.map +1 -1
  290. package/src/lib/server/api-v1/crm-tasks.js +78 -34
  291. package/src/lib/server/api-v1/crm-tasks.js.map +1 -1
  292. package/src/lib/server/api-v1/openapi.d.ts +0 -11
  293. package/src/lib/server/api-v1/openapi.js +171 -16
  294. package/src/lib/server/api-v1/openapi.js.map +1 -1
  295. package/src/lib/server/assign-contact-owner.d.ts +188 -0
  296. package/src/lib/server/assign-contact-owner.js +446 -0
  297. package/src/lib/server/assign-contact-owner.js.map +1 -0
  298. package/src/lib/server/associate-company-by-domain.d.ts +70 -0
  299. package/src/lib/server/associate-company-by-domain.js +153 -0
  300. package/src/lib/server/associate-company-by-domain.js.map +1 -0
  301. package/src/lib/server/automation-steps.d.ts +140 -0
  302. package/src/lib/server/automation-steps.js +669 -0
  303. package/src/lib/server/automation-steps.js.map +1 -0
  304. package/src/lib/server/capture-contact.d.ts +17 -0
  305. package/src/lib/server/capture-contact.js +95 -26
  306. package/src/lib/server/capture-contact.js.map +1 -1
  307. package/src/lib/server/capture-host-contact.d.ts +104 -0
  308. package/src/lib/server/capture-host-contact.js +151 -0
  309. package/src/lib/server/capture-host-contact.js.map +1 -0
  310. package/src/lib/server/company-children.d.ts +25 -0
  311. package/src/lib/server/company-children.js +42 -0
  312. package/src/lib/server/company-children.js.map +1 -0
  313. package/src/lib/server/company-delete.d.ts +18 -0
  314. package/src/lib/server/company-delete.js +44 -21
  315. package/src/lib/server/company-delete.js.map +1 -1
  316. package/src/lib/server/contact-email-history.js +21 -19
  317. package/src/lib/server/contact-email-history.js.map +1 -1
  318. package/src/lib/server/contact-remove.js +27 -2
  319. package/src/lib/server/contact-remove.js.map +1 -1
  320. package/src/lib/server/contact-reports-to.d.ts +61 -0
  321. package/src/lib/server/contact-reports-to.js +114 -0
  322. package/src/lib/server/contact-reports-to.js.map +1 -0
  323. package/src/lib/server/contact-update.d.ts +42 -1
  324. package/src/lib/server/contact-update.js +204 -23
  325. package/src/lib/server/contact-update.js.map +1 -1
  326. package/src/lib/server/convert-host-lead.d.ts +46 -1
  327. package/src/lib/server/convert-host-lead.js +173 -15
  328. package/src/lib/server/convert-host-lead.js.map +1 -1
  329. package/src/lib/server/convert-open-lead.js +12 -5
  330. package/src/lib/server/convert-open-lead.js.map +1 -1
  331. package/src/lib/server/crm-email-activity.d.ts +118 -0
  332. package/src/lib/server/crm-email-activity.js +148 -0
  333. package/src/lib/server/crm-email-activity.js.map +1 -0
  334. package/src/lib/server/crm-inbound-email.js +1 -1
  335. package/src/lib/server/crm-inbound-email.js.map +1 -1
  336. package/src/lib/server/crm-next-activity.d.ts +74 -0
  337. package/src/lib/server/crm-next-activity.js +194 -0
  338. package/src/lib/server/crm-next-activity.js.map +1 -0
  339. package/src/lib/server/crm-record-indexes.d.ts +45 -0
  340. package/src/lib/server/crm-record-indexes.js +78 -0
  341. package/src/lib/server/crm-record-indexes.js.map +1 -0
  342. package/src/lib/server/crm-sharing.d.ts +9 -1
  343. package/src/lib/server/crm-sharing.js +23 -3
  344. package/src/lib/server/crm-sharing.js.map +1 -1
  345. package/src/lib/server/deal-contact-roles.d.ts +27 -0
  346. package/src/lib/server/deal-contact-roles.js +89 -0
  347. package/src/lib/server/deal-contact-roles.js.map +1 -0
  348. package/src/lib/server/email-send.js +2 -1
  349. package/src/lib/server/email-send.js.map +1 -1
  350. package/src/lib/server/lead-convert.d.ts +5 -0
  351. package/src/lib/server/lead-convert.js +19 -3
  352. package/src/lib/server/lead-convert.js.map +1 -1
  353. package/src/lib/server/lead-create.d.ts +17 -2
  354. package/src/lib/server/lead-create.js +46 -14
  355. package/src/lib/server/lead-create.js.map +1 -1
  356. package/src/lib/server/lead-nurturing.d.ts +6 -0
  357. package/src/lib/server/lead-nurturing.js +57 -20
  358. package/src/lib/server/lead-nurturing.js.map +1 -1
  359. package/src/lib/server/lead-picklists.d.ts +35 -0
  360. package/src/lib/server/lead-picklists.js +52 -0
  361. package/src/lib/server/lead-picklists.js.map +1 -0
  362. package/src/lib/server/lead-source-picklist.d.ts +1 -13
  363. package/src/lib/server/lead-source-picklist.js +6 -33
  364. package/src/lib/server/lead-source-picklist.js.map +1 -1
  365. package/src/lib/server/merge-contacts.js +23 -5
  366. package/src/lib/server/merge-contacts.js.map +1 -1
  367. package/src/lib/server/next-activity-routes.js +2 -1
  368. package/src/lib/server/next-activity-routes.js.map +1 -1
  369. package/src/lib/server/person-eraser.d.ts +53 -0
  370. package/src/lib/server/person-eraser.js +149 -0
  371. package/src/lib/server/person-eraser.js.map +1 -0
  372. package/src/lib/server/person-records.d.ts +69 -0
  373. package/src/lib/server/person-records.js +317 -0
  374. package/src/lib/server/person-records.js.map +1 -0
  375. package/src/lib/server/person-refund.d.ts +97 -0
  376. package/src/lib/server/person-refund.js +221 -0
  377. package/src/lib/server/person-refund.js.map +1 -0
  378. package/src/lib/server/picklist-values.d.ts +21 -0
  379. package/src/lib/server/picklist-values.js +308 -0
  380. package/src/lib/server/picklist-values.js.map +1 -0
  381. package/src/lib/server/read-picklist.d.ts +44 -0
  382. package/src/lib/server/read-picklist.js +65 -0
  383. package/src/lib/server/read-picklist.js.map +1 -0
  384. package/src/lib/server/recipe-routes.js +22 -8
  385. package/src/lib/server/recipe-routes.js.map +1 -1
  386. package/src/lib/server/record-email-state.js +7 -1
  387. package/src/lib/server/record-email-state.js.map +1 -1
  388. package/src/lib/server/record-facts.d.ts +3 -0
  389. package/src/lib/server/record-facts.js +233 -31
  390. package/src/lib/server/record-facts.js.map +1 -1
  391. package/src/lib/server/record-origin.d.ts +27 -0
  392. package/src/lib/server/record-origin.js +104 -0
  393. package/src/lib/server/record-origin.js.map +1 -0
  394. package/src/lib/server/record-timeline.js +40 -3
  395. package/src/lib/server/record-timeline.js.map +1 -1
  396. package/src/lib/server/suite-gate.js +4 -3
  397. package/src/lib/server/suite-gate.js.map +1 -1
  398. package/src/lib/server/task-reminders-route.js +2 -1
  399. package/src/lib/server/task-reminders-route.js.map +1 -1
  400. package/src/lib/server/task-routes.js +33 -17
  401. package/src/lib/server/task-routes.js.map +1 -1
  402. package/src/lib/server-deal-stage.d.ts +5 -1
  403. package/src/lib/server-deal-stage.js +10 -5
  404. package/src/lib/server-deal-stage.js.map +1 -1
  405. package/src/lib/server.d.ts +8 -3
  406. package/src/lib/server.js +47 -43
  407. package/src/lib/server.js.map +1 -1
  408. package/src/lib/testing/memory-firestore.d.ts +55 -0
  409. package/src/lib/testing/memory-firestore.js +335 -0
  410. package/src/lib/testing/memory-firestore.js.map +1 -0
  411. package/src/lib/testing/stand-in-email-send-index.d.ts +25 -0
  412. package/src/lib/testing/stand-in-email-send-index.js +49 -0
  413. package/src/lib/testing/stand-in-email-send-index.js.map +1 -0
  414. package/src/lib/transfer/activities.d.ts +30 -0
  415. package/src/lib/transfer/activities.js +132 -0
  416. package/src/lib/transfer/activities.js.map +1 -0
  417. package/src/lib/transfer/aliases.d.ts +22 -0
  418. package/src/lib/transfer/aliases.js +1342 -0
  419. package/src/lib/transfer/aliases.js.map +1 -0
  420. package/src/lib/transfer/common.d.ts +222 -0
  421. package/src/lib/transfer/common.js +832 -0
  422. package/src/lib/transfer/common.js.map +1 -0
  423. package/src/lib/transfer/companies.d.ts +43 -0
  424. package/src/lib/transfer/companies.js +549 -0
  425. package/src/lib/transfer/companies.js.map +1 -0
  426. package/src/lib/transfer/contacts.d.ts +31 -0
  427. package/src/lib/transfer/contacts.js +727 -0
  428. package/src/lib/transfer/contacts.js.map +1 -0
  429. package/src/lib/transfer/deals.d.ts +66 -0
  430. package/src/lib/transfer/deals.js +698 -0
  431. package/src/lib/transfer/deals.js.map +1 -0
  432. package/src/lib/transfer/email-templates-package.d.ts +40 -0
  433. package/src/lib/transfer/email-templates-package.js +76 -0
  434. package/src/lib/transfer/email-templates-package.js.map +1 -0
  435. package/src/lib/transfer/email-templates-package.server.d.ts +32 -0
  436. package/src/lib/transfer/email-templates-package.server.js +176 -0
  437. package/src/lib/transfer/email-templates-package.server.js.map +1 -0
  438. package/src/lib/transfer/fields.d.ts +102 -0
  439. package/src/lib/transfer/fields.js +1755 -0
  440. package/src/lib/transfer/fields.js.map +1 -0
  441. package/src/lib/transfer/leads.d.ts +30 -0
  442. package/src/lib/transfer/leads.js +582 -0
  443. package/src/lib/transfer/leads.js.map +1 -0
  444. package/src/lib/transfer/pipelines.d.ts +21 -0
  445. package/src/lib/transfer/pipelines.js +172 -0
  446. package/src/lib/transfer/pipelines.js.map +1 -0
  447. package/src/lib/transfer/register.d.ts +47 -0
  448. package/src/lib/transfer/register.js +277 -0
  449. package/src/lib/transfer/register.js.map +1 -0
  450. package/src/lib/transfer/tasks.d.ts +30 -0
  451. package/src/lib/transfer/tasks.js +418 -0
  452. package/src/lib/transfer/tasks.js.map +1 -0
  453. package/src/lib/transfer/ui.d.ts +20 -0
  454. package/src/lib/transfer/ui.js +42 -0
  455. package/src/lib/transfer/ui.js.map +1 -0
  456. package/src/lib/components/company-import-drawer.d.ts +0 -42
  457. package/src/lib/components/company-import-drawer.js +0 -99
  458. package/src/lib/components/company-import-drawer.js.map +0 -1
  459. package/src/lib/components/contact-import-drawer.d.ts +0 -46
  460. package/src/lib/components/contact-import-drawer.js +0 -149
  461. package/src/lib/components/contact-import-drawer.js.map +0 -1
  462. package/src/lib/components/crm-export-all-button.d.ts +0 -39
  463. package/src/lib/components/crm-export-all-button.js +0 -98
  464. package/src/lib/components/crm-export-all-button.js.map +0 -1
  465. package/src/lib/components/csv-import-drawer.d.ts +0 -139
  466. package/src/lib/components/csv-import-drawer.js +0 -757
  467. package/src/lib/components/csv-import-drawer.js.map +0 -1
  468. package/src/lib/components/deal-import-drawer.d.ts +0 -24
  469. package/src/lib/components/deal-import-drawer.js +0 -83
  470. package/src/lib/components/deal-import-drawer.js.map +0 -1
  471. package/src/lib/components/lead-import-drawer.d.ts +0 -27
  472. package/src/lib/components/lead-import-drawer.js +0 -118
  473. package/src/lib/components/lead-import-drawer.js.map +0 -1
  474. package/src/lib/components/lead-source-values-card.d.ts +0 -27
  475. package/src/lib/components/lead-source-values-card.js.map +0 -1
  476. package/src/lib/components/task-import-drawer.d.ts +0 -24
  477. package/src/lib/components/task-import-drawer.js +0 -82
  478. package/src/lib/components/task-import-drawer.js.map +0 -1
  479. package/src/lib/model/companies-csv.d.ts +0 -36
  480. package/src/lib/model/companies-csv.js +0 -38
  481. package/src/lib/model/companies-csv.js.map +0 -1
  482. package/src/lib/model/contacts-csv.d.ts +0 -54
  483. package/src/lib/model/contacts-csv.js +0 -67
  484. package/src/lib/model/contacts-csv.js.map +0 -1
  485. package/src/lib/model/crm-company-import.d.ts +0 -154
  486. package/src/lib/model/crm-company-import.js +0 -331
  487. package/src/lib/model/crm-company-import.js.map +0 -1
  488. package/src/lib/model/crm-csv.d.ts +0 -239
  489. package/src/lib/model/crm-csv.js +0 -467
  490. package/src/lib/model/crm-csv.js.map +0 -1
  491. package/src/lib/model/crm-deal-import.d.ts +0 -112
  492. package/src/lib/model/crm-deal-import.js +0 -263
  493. package/src/lib/model/crm-deal-import.js.map +0 -1
  494. package/src/lib/model/crm-import.d.ts +0 -250
  495. package/src/lib/model/crm-import.js +0 -467
  496. package/src/lib/model/crm-import.js.map +0 -1
  497. package/src/lib/model/crm-lead-import.d.ts +0 -138
  498. package/src/lib/model/crm-lead-import.js +0 -446
  499. package/src/lib/model/crm-lead-import.js.map +0 -1
  500. package/src/lib/model/crm-task-import.d.ts +0 -94
  501. package/src/lib/model/crm-task-import.js +0 -275
  502. package/src/lib/model/crm-task-import.js.map +0 -1
  503. package/src/lib/model/deals-csv.d.ts +0 -32
  504. package/src/lib/model/deals-csv.js +0 -36
  505. package/src/lib/model/deals-csv.js.map +0 -1
  506. package/src/lib/model/import-column-shapes.d.ts +0 -36
  507. package/src/lib/model/import-column-shapes.js +0 -76
  508. package/src/lib/model/import-column-shapes.js.map +0 -1
  509. package/src/lib/model/lead-source-values.d.ts +0 -82
  510. package/src/lib/model/lead-source-values.js +0 -149
  511. package/src/lib/model/lead-source-values.js.map +0 -1
  512. package/src/lib/model/leads-csv.d.ts +0 -40
  513. package/src/lib/model/leads-csv.js +0 -40
  514. package/src/lib/model/leads-csv.js.map +0 -1
  515. package/src/lib/model/tasks-csv.d.ts +0 -28
  516. package/src/lib/model/tasks-csv.js +0 -28
  517. package/src/lib/model/tasks-csv.js.map +0 -1
  518. package/src/lib/server/companies-import.d.ts +0 -57
  519. package/src/lib/server/companies-import.js +0 -242
  520. package/src/lib/server/companies-import.js.map +0 -1
  521. package/src/lib/server/contacts-import.d.ts +0 -109
  522. package/src/lib/server/contacts-import.js +0 -393
  523. package/src/lib/server/contacts-import.js.map +0 -1
  524. package/src/lib/server/deals-import.d.ts +0 -76
  525. package/src/lib/server/deals-import.js +0 -248
  526. package/src/lib/server/deals-import.js.map +0 -1
  527. package/src/lib/server/export-route.d.ts +0 -60
  528. package/src/lib/server/export-route.js +0 -447
  529. package/src/lib/server/export-route.js.map +0 -1
  530. package/src/lib/server/import-context.d.ts +0 -87
  531. package/src/lib/server/import-context.js +0 -182
  532. package/src/lib/server/import-context.js.map +0 -1
  533. package/src/lib/server/lead-source-values.d.ts +0 -50
  534. package/src/lib/server/lead-source-values.js +0 -191
  535. package/src/lib/server/lead-source-values.js.map +0 -1
  536. package/src/lib/server/leads-import.d.ts +0 -84
  537. package/src/lib/server/leads-import.js +0 -367
  538. package/src/lib/server/leads-import.js.map +0 -1
  539. package/src/lib/server/tasks-import.d.ts +0 -54
  540. package/src/lib/server/tasks-import.js +0 -160
  541. package/src/lib/server/tasks-import.js.map +0 -1
@@ -0,0 +1,45 @@
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 { CRM_TASK_PICKLIST_IDS } from "@aglyn/aglyn";
18
+ import { useMemo } from "react";
19
+ import { useCrmPicklist } from "./use-crm-picklist.js";
20
+ /**
21
+ * An org's Status, Priority and Type lists for tasks (AGL-3517), for every
22
+ * surface that shows or writes a task's labels. Three document listens,
23
+ * shared by the Firestore SDK with every other mount asking for the same
24
+ * lists; `orgId` null reads nothing and answers the standard values.
25
+ */ export function useCrmTaskPicklists(orgId) {
26
+ const status = useCrmPicklist(CRM_TASK_PICKLIST_IDS.status, orgId);
27
+ const priority = useCrmPicklist(CRM_TASK_PICKLIST_IDS.priority, orgId);
28
+ const type = useCrmPicklist(CRM_TASK_PICKLIST_IDS.type, orgId);
29
+ return useMemo(()=>({
30
+ status: status.picklist,
31
+ priority: priority.picklist,
32
+ type: type.picklist,
33
+ ready: status.ready && priority.ready && type.ready
34
+ }), [
35
+ status.picklist,
36
+ status.ready,
37
+ priority.picklist,
38
+ priority.ready,
39
+ type.picklist,
40
+ type.ready
41
+ ]);
42
+ }
43
+ export default useCrmTaskPicklists;
44
+
45
+ //# sourceMappingURL=use-crm-task-picklists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/hooks/use-crm-task-picklists.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { CRM_TASK_PICKLIST_IDS, type CrmTaskPicklists } from '@aglyn/aglyn'\nimport { useMemo } from 'react'\nimport { useCrmPicklist } from './use-crm-picklist'\n\n/**\n * An org's Status, Priority and Type lists for tasks (AGL-3517), for every\n * surface that shows or writes a task's labels. Three document listens,\n * shared by the Firestore SDK with every other mount asking for the same\n * lists; `orgId` null reads nothing and answers the standard values.\n */\nexport function useCrmTaskPicklists(orgId: string | null | undefined): CrmTaskPicklists & {\n ready: boolean\n} {\n const status = useCrmPicklist(CRM_TASK_PICKLIST_IDS.status, orgId)\n const priority = useCrmPicklist(CRM_TASK_PICKLIST_IDS.priority, orgId)\n const type = useCrmPicklist(CRM_TASK_PICKLIST_IDS.type, orgId)\n return useMemo(\n () => ({\n status: status.picklist,\n priority: priority.picklist,\n type: type.picklist,\n ready: status.ready && priority.ready && type.ready,\n }),\n [status.picklist, status.ready, priority.picklist, priority.ready, type.picklist, type.ready],\n )\n}\n\nexport default useCrmTaskPicklists\n"],"names":["CRM_TASK_PICKLIST_IDS","useMemo","useCrmPicklist","useCrmTaskPicklists","orgId","status","priority","type","picklist","ready"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;AAEA,SAASA,qBAAqB,QAA+B,eAAc;AAC3E,SAASC,OAAO,QAAQ,QAAO;AAC/B,SAASC,cAAc,QAAQ,wBAAoB;AAEnD;;;;;CAKC,GACD,OAAO,SAASC,oBAAoBC,KAAgC;IAGlE,MAAMC,SAASH,eAAeF,sBAAsBK,MAAM,EAAED;IAC5D,MAAME,WAAWJ,eAAeF,sBAAsBM,QAAQ,EAAEF;IAChE,MAAMG,OAAOL,eAAeF,sBAAsBO,IAAI,EAAEH;IACxD,OAAOH,QACL,IAAO,CAAA;YACLI,QAAQA,OAAOG,QAAQ;YACvBF,UAAUA,SAASE,QAAQ;YAC3BD,MAAMA,KAAKC,QAAQ;YACnBC,OAAOJ,OAAOI,KAAK,IAAIH,SAASG,KAAK,IAAIF,KAAKE,KAAK;QACrD,CAAA,GACA;QAACJ,OAAOG,QAAQ;QAAEH,OAAOI,KAAK;QAAEH,SAASE,QAAQ;QAAEF,SAASG,KAAK;QAAEF,KAAKC,QAAQ;QAAED,KAAKE,KAAK;KAAC;AAEjG;AAEA,eAAeN,oBAAmB"}
@@ -32,5 +32,19 @@ export declare function useLinkedDeals(orgId: string | null, readTokens: readonl
32
32
  } | {
33
33
  companyId: string;
34
34
  }): import("@aglyn/tenant-feature-instance").UseFirestoreCollectionResult<DealDoc>;
35
+ /**
36
+ * The deals a contact is on in ANY role (AGL-3521), for the contact's page
37
+ * beside the deals that name them as `contactId`.
38
+ *
39
+ * At the organization level, `contactRoleContactIds array-contains`. Under
40
+ * a site the scope and the contact are one clause —
41
+ * `scopedContactRoleContactIds array-contains-any` over `token~contactId`
42
+ * — because a query holds one array clause and the scope clause is one;
43
+ * that is a query the rules prove only for an org-wide member
44
+ * (`foldsScope`). A member whose reach is some sites asks nothing here, and
45
+ * reads the deals that name the contact as their Primary.
46
+ * `(contactRoleContactIds | scopedContactRoleContactIds, updatedAt DESC)`.
47
+ */
48
+ export declare function useContactRoleDeals(orgId: string | null, readTokens: readonly string[] | null, foldsScope: boolean, contactId: string | null): import("@aglyn/tenant-feature-instance").UseFirestoreCollectionResult<DealDoc>;
35
49
  /** One deal, live. `undefined` while loading, and after a delete. */
36
50
  export declare function useDeal(orgId: string | null, dealId: string): import("@aglyn/tenant-feature-instance").UseFirestoreDocResult<DealDoc>;
@@ -15,6 +15,7 @@
15
15
  * limitations under the License.
16
16
  */ 'use client';
17
17
  import { CRM_COLLECTIONS } from "@aglyn/aglyn";
18
+ import { SCOPED_SEARCH_JOIN } from "@aglyn/aglyn/app-utils/name-search";
18
19
  import { useFirestore, useFirestoreCollection, useFirestoreDoc } from "@aglyn/tenant-feature-instance";
19
20
  import { collection, doc, limit, orderBy, query, where } from "firebase/firestore";
20
21
  import { crmScopeListable, crmVisibleToClause } from "./use-crm-scope.js";
@@ -66,6 +67,34 @@ import { crmScopeListable, crmVisibleToClause } from "./use-crm-scope.js";
66
67
  idField: '$id'
67
68
  });
68
69
  }
70
+ /**
71
+ * The deals a contact is on in ANY role (AGL-3521), for the contact's page
72
+ * beside the deals that name them as `contactId`.
73
+ *
74
+ * At the organization level, `contactRoleContactIds array-contains`. Under
75
+ * a site the scope and the contact are one clause —
76
+ * `scopedContactRoleContactIds array-contains-any` over `token~contactId`
77
+ * — because a query holds one array clause and the scope clause is one;
78
+ * that is a query the rules prove only for an org-wide member
79
+ * (`foldsScope`). A member whose reach is some sites asks nothing here, and
80
+ * reads the deals that name the contact as their Primary.
81
+ * `(contactRoleContactIds | scopedContactRoleContactIds, updatedAt DESC)`.
82
+ */ export function useContactRoleDeals(orgId, readTokens, foldsScope, contactId) {
83
+ const firestore = useFirestore();
84
+ const scoped = readTokens ? readTokens.slice(0, 30).map((token)=>`${token}${SCOPED_SEARCH_JOIN}${contactId}`) : null;
85
+ const key = scoped ? scoped.join('\n') : '';
86
+ return useFirestoreCollection(()=>orgId && contactId && (readTokens === null || foldsScope && (scoped == null ? void 0 : scoped.length)) ? query(collection(firestore, 'orgs', orgId, CRM_COLLECTIONS.deals), scoped ? where('scopedContactRoleContactIds', 'array-contains-any', scoped) : where('contactRoleContactIds', 'array-contains', contactId), orderBy('updatedAt', 'desc'), limit(LINKED_DEALS_LIMIT)) : null, // `key` stands for `scoped`, whose array is rebuilt on every render.
87
+ [
88
+ firestore,
89
+ orgId,
90
+ key,
91
+ foldsScope,
92
+ contactId,
93
+ readTokens === null
94
+ ], {
95
+ idField: '$id'
96
+ });
97
+ }
69
98
  /** One deal, live. `undefined` while loading, and after a delete. */ export function useDeal(orgId, dealId) {
70
99
  const firestore = useFirestore();
71
100
  return useFirestoreDoc(()=>orgId && dealId ? doc(firestore, 'orgs', orgId, CRM_COLLECTIONS.deals, dealId) : null, [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/hooks/use-deals.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { CRM_COLLECTIONS, type CrmDealStatus } from '@aglyn/aglyn'\nimport {\n useFirestore,\n useFirestoreCollection,\n useFirestoreDoc,\n} from '@aglyn/tenant-feature-instance'\nimport {\n collection,\n doc,\n limit,\n orderBy,\n query,\n where,\n} from 'firebase/firestore'\nimport type { DealDoc } from '../model/deal-board-model'\nimport { crmScopeListable, crmVisibleToClause } from './use-crm-scope'\n\n/**\n * The most open cards one pipeline draws. A board past this is a board\n * nobody reads column by column; the table is paged by its query\n * (`DEAL_LIST_DECLARATION`) and reaches the rest.\n */\nexport const BOARD_OPEN_LIMIT = 500\n\n/** Closed deals shown per closed column when it is expanded. */\nexport const BOARD_CLOSED_LIMIT = 50\n\n/** Deals listed on a contact's or a company's page. */\nexport const LINKED_DEALS_LIMIT = 25\n\n/**\n * The deals of one status in one pipeline, newest activity first (AGL-2598).\n *\n * Every query here carries the viewer's scope tokens and an `orderBy`, and\n * each shape sits on an index the foundation declared:\n * `(visibleTo, pipelineId, status, updatedAt DESC)`. Passing `null` for the\n * pipeline or an EMPTY token list issues nothing, which is how a column\n * stays quiet until the pipeline has loaded and a collapsed Won column\n * costs no read. A `null` token list is the ORGANIZATION level (AGL-2630):\n * the clause is dropped and the query rides the `(pipelineId, status,\n * updatedAt DESC)` twin of that index.\n */\nexport function useDealsByStatus(\n orgId: string | null,\n readTokens: readonly string[] | null,\n pipelineId: string | null,\n status: CrmDealStatus,\n max: number,\n) {\n const firestore = useFirestore()\n return useFirestoreCollection<DealDoc>(\n () =>\n orgId && pipelineId && crmScopeListable(readTokens)\n ? query(\n collection(firestore, 'orgs', orgId, CRM_COLLECTIONS.deals),\n ...crmVisibleToClause(readTokens),\n where('pipelineId', '==', pipelineId),\n where('status', '==', status),\n orderBy('updatedAt', 'desc'),\n limit(max),\n )\n : null,\n [firestore, orgId, readTokens, pipelineId, status, max],\n { idField: '$id' },\n )\n}\n\n/**\n * The deals that name one contact or one company, for the card on that\n * record's page. `(visibleTo, contactId|companyId, updatedAt DESC)`.\n */\nexport function useLinkedDeals(\n orgId: string | null,\n readTokens: readonly string[] | null,\n link: { contactId: string } | { companyId: string },\n) {\n const firestore = useFirestore()\n const field = 'contactId' in link ? 'contactId' : 'companyId'\n const id = 'contactId' in link ? link.contactId : link.companyId\n return useFirestoreCollection<DealDoc>(\n () =>\n orgId && id && crmScopeListable(readTokens)\n ? query(\n collection(firestore, 'orgs', orgId, CRM_COLLECTIONS.deals),\n ...crmVisibleToClause(readTokens),\n where(field, '==', id),\n orderBy('updatedAt', 'desc'),\n limit(LINKED_DEALS_LIMIT),\n )\n : null,\n [firestore, orgId, readTokens, field, id],\n { idField: '$id' },\n )\n}\n\n/** One deal, live. `undefined` while loading, and after a delete. */\nexport function useDeal(orgId: string | null, dealId: string) {\n const firestore = useFirestore()\n return useFirestoreDoc<DealDoc>(\n () =>\n orgId && dealId\n ? doc(firestore, 'orgs', orgId, CRM_COLLECTIONS.deals, dealId)\n : null,\n [firestore, orgId, dealId],\n { idField: '$id' },\n )\n}\n"],"names":["CRM_COLLECTIONS","useFirestore","useFirestoreCollection","useFirestoreDoc","collection","doc","limit","orderBy","query","where","crmScopeListable","crmVisibleToClause","BOARD_OPEN_LIMIT","BOARD_CLOSED_LIMIT","LINKED_DEALS_LIMIT","useDealsByStatus","orgId","readTokens","pipelineId","status","max","firestore","deals","idField","useLinkedDeals","link","field","id","contactId","companyId","useDeal","dealId"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;AAEA,SAASA,eAAe,QAA4B,eAAc;AAClE,SACEC,YAAY,EACZC,sBAAsB,EACtBC,eAAe,QACV,iCAAgC;AACvC,SACEC,UAAU,EACVC,GAAG,EACHC,KAAK,EACLC,OAAO,EACPC,KAAK,EACLC,KAAK,QACA,qBAAoB;AAE3B,SAASC,gBAAgB,EAAEC,kBAAkB,QAAQ,qBAAiB;AAEtE;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,IAAG;AAEnC,8DAA8D,GAC9D,OAAO,MAAMC,qBAAqB,GAAE;AAEpC,qDAAqD,GACrD,OAAO,MAAMC,qBAAqB,GAAE;AAEpC;;;;;;;;;;;CAWC,GACD,OAAO,SAASC,iBACdC,KAAoB,EACpBC,UAAoC,EACpCC,UAAyB,EACzBC,MAAqB,EACrBC,GAAW;IAEX,MAAMC,YAAYpB;IAClB,OAAOC,uBACL,IACEc,SAASE,cAAcR,iBAAiBO,cACpCT,MACEJ,WAAWiB,WAAW,QAAQL,OAAOhB,gBAAgBsB,KAAK,MACvDX,mBAAmBM,aACtBR,MAAM,cAAc,MAAMS,aAC1BT,MAAM,UAAU,MAAMU,SACtBZ,QAAQ,aAAa,SACrBD,MAAMc,QAER,MACN;QAACC;QAAWL;QAAOC;QAAYC;QAAYC;QAAQC;KAAI,EACvD;QAAEG,SAAS;IAAM;AAErB;AAEA;;;CAGC,GACD,OAAO,SAASC,eACdR,KAAoB,EACpBC,UAAoC,EACpCQ,IAAmD;IAEnD,MAAMJ,YAAYpB;IAClB,MAAMyB,QAAQ,eAAeD,OAAO,cAAc;IAClD,MAAME,KAAK,eAAeF,OAAOA,KAAKG,SAAS,GAAGH,KAAKI,SAAS;IAChE,OAAO3B,uBACL,IACEc,SAASW,MAAMjB,iBAAiBO,cAC5BT,MACEJ,WAAWiB,WAAW,QAAQL,OAAOhB,gBAAgBsB,KAAK,MACvDX,mBAAmBM,aACtBR,MAAMiB,OAAO,MAAMC,KACnBpB,QAAQ,aAAa,SACrBD,MAAMQ,uBAER,MACN;QAACO;QAAWL;QAAOC;QAAYS;QAAOC;KAAG,EACzC;QAAEJ,SAAS;IAAM;AAErB;AAEA,mEAAmE,GACnE,OAAO,SAASO,QAAQd,KAAoB,EAAEe,MAAc;IAC1D,MAAMV,YAAYpB;IAClB,OAAOE,gBACL,IACEa,SAASe,SACL1B,IAAIgB,WAAW,QAAQL,OAAOhB,gBAAgBsB,KAAK,EAAES,UACrD,MACN;QAACV;QAAWL;QAAOe;KAAO,EAC1B;QAAER,SAAS;IAAM;AAErB"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/hooks/use-deals.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { CRM_COLLECTIONS, type CrmDealStatus } from '@aglyn/aglyn'\nimport { SCOPED_SEARCH_JOIN } from '@aglyn/aglyn/app-utils/name-search'\nimport {\n useFirestore,\n useFirestoreCollection,\n useFirestoreDoc,\n} from '@aglyn/tenant-feature-instance'\nimport {\n collection,\n doc,\n limit,\n orderBy,\n query,\n where,\n} from 'firebase/firestore'\nimport type { DealDoc } from '../model/deal-board-model'\nimport { crmScopeListable, crmVisibleToClause } from './use-crm-scope'\n\n/**\n * The most open cards one pipeline draws. A board past this is a board\n * nobody reads column by column; the table is paged by its query\n * (`DEAL_LIST_DECLARATION`) and reaches the rest.\n */\nexport const BOARD_OPEN_LIMIT = 500\n\n/** Closed deals shown per closed column when it is expanded. */\nexport const BOARD_CLOSED_LIMIT = 50\n\n/** Deals listed on a contact's or a company's page. */\nexport const LINKED_DEALS_LIMIT = 25\n\n/**\n * The deals of one status in one pipeline, newest activity first (AGL-2598).\n *\n * Every query here carries the viewer's scope tokens and an `orderBy`, and\n * each shape sits on an index the foundation declared:\n * `(visibleTo, pipelineId, status, updatedAt DESC)`. Passing `null` for the\n * pipeline or an EMPTY token list issues nothing, which is how a column\n * stays quiet until the pipeline has loaded and a collapsed Won column\n * costs no read. A `null` token list is the ORGANIZATION level (AGL-2630):\n * the clause is dropped and the query rides the `(pipelineId, status,\n * updatedAt DESC)` twin of that index.\n */\nexport function useDealsByStatus(\n orgId: string | null,\n readTokens: readonly string[] | null,\n pipelineId: string | null,\n status: CrmDealStatus,\n max: number,\n) {\n const firestore = useFirestore()\n return useFirestoreCollection<DealDoc>(\n () =>\n orgId && pipelineId && crmScopeListable(readTokens)\n ? query(\n collection(firestore, 'orgs', orgId, CRM_COLLECTIONS.deals),\n ...crmVisibleToClause(readTokens),\n where('pipelineId', '==', pipelineId),\n where('status', '==', status),\n orderBy('updatedAt', 'desc'),\n limit(max),\n )\n : null,\n [firestore, orgId, readTokens, pipelineId, status, max],\n { idField: '$id' },\n )\n}\n\n/**\n * The deals that name one contact or one company, for the card on that\n * record's page. `(visibleTo, contactId|companyId, updatedAt DESC)`.\n */\nexport function useLinkedDeals(\n orgId: string | null,\n readTokens: readonly string[] | null,\n link: { contactId: string } | { companyId: string },\n) {\n const firestore = useFirestore()\n const field = 'contactId' in link ? 'contactId' : 'companyId'\n const id = 'contactId' in link ? link.contactId : link.companyId\n return useFirestoreCollection<DealDoc>(\n () =>\n orgId && id && crmScopeListable(readTokens)\n ? query(\n collection(firestore, 'orgs', orgId, CRM_COLLECTIONS.deals),\n ...crmVisibleToClause(readTokens),\n where(field, '==', id),\n orderBy('updatedAt', 'desc'),\n limit(LINKED_DEALS_LIMIT),\n )\n : null,\n [firestore, orgId, readTokens, field, id],\n { idField: '$id' },\n )\n}\n\n/**\n * The deals a contact is on in ANY role (AGL-3521), for the contact's page\n * beside the deals that name them as `contactId`.\n *\n * At the organization level, `contactRoleContactIds array-contains`. Under\n * a site the scope and the contact are one clause —\n * `scopedContactRoleContactIds array-contains-any` over `token~contactId`\n * — because a query holds one array clause and the scope clause is one;\n * that is a query the rules prove only for an org-wide member\n * (`foldsScope`). A member whose reach is some sites asks nothing here, and\n * reads the deals that name the contact as their Primary.\n * `(contactRoleContactIds | scopedContactRoleContactIds, updatedAt DESC)`.\n */\nexport function useContactRoleDeals(\n orgId: string | null,\n readTokens: readonly string[] | null,\n foldsScope: boolean,\n contactId: string | null,\n) {\n const firestore = useFirestore()\n const scoped = readTokens\n ? readTokens.slice(0, 30).map((token) => `${token}${SCOPED_SEARCH_JOIN}${contactId}`)\n : null\n const key = scoped ? scoped.join('\\n') : ''\n return useFirestoreCollection<DealDoc>(\n () =>\n orgId && contactId && (readTokens === null || (foldsScope && scoped?.length))\n ? query(\n collection(firestore, 'orgs', orgId, CRM_COLLECTIONS.deals),\n scoped\n ? where('scopedContactRoleContactIds', 'array-contains-any', scoped)\n : where('contactRoleContactIds', 'array-contains', contactId),\n orderBy('updatedAt', 'desc'),\n limit(LINKED_DEALS_LIMIT),\n )\n : null,\n // `key` stands for `scoped`, whose array is rebuilt on every render.\n [firestore, orgId, key, foldsScope, contactId, readTokens === null],\n { idField: '$id' },\n )\n}\n\n/** One deal, live. `undefined` while loading, and after a delete. */\nexport function useDeal(orgId: string | null, dealId: string) {\n const firestore = useFirestore()\n return useFirestoreDoc<DealDoc>(\n () =>\n orgId && dealId\n ? doc(firestore, 'orgs', orgId, CRM_COLLECTIONS.deals, dealId)\n : null,\n [firestore, orgId, dealId],\n { idField: '$id' },\n )\n}\n"],"names":["CRM_COLLECTIONS","SCOPED_SEARCH_JOIN","useFirestore","useFirestoreCollection","useFirestoreDoc","collection","doc","limit","orderBy","query","where","crmScopeListable","crmVisibleToClause","BOARD_OPEN_LIMIT","BOARD_CLOSED_LIMIT","LINKED_DEALS_LIMIT","useDealsByStatus","orgId","readTokens","pipelineId","status","max","firestore","deals","idField","useLinkedDeals","link","field","id","contactId","companyId","useContactRoleDeals","foldsScope","scoped","slice","map","token","key","join","length","useDeal","dealId"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;AAEA,SAASA,eAAe,QAA4B,eAAc;AAClE,SAASC,kBAAkB,QAAQ,qCAAoC;AACvE,SACEC,YAAY,EACZC,sBAAsB,EACtBC,eAAe,QACV,iCAAgC;AACvC,SACEC,UAAU,EACVC,GAAG,EACHC,KAAK,EACLC,OAAO,EACPC,KAAK,EACLC,KAAK,QACA,qBAAoB;AAE3B,SAASC,gBAAgB,EAAEC,kBAAkB,QAAQ,qBAAiB;AAEtE;;;;CAIC,GACD,OAAO,MAAMC,mBAAmB,IAAG;AAEnC,8DAA8D,GAC9D,OAAO,MAAMC,qBAAqB,GAAE;AAEpC,qDAAqD,GACrD,OAAO,MAAMC,qBAAqB,GAAE;AAEpC;;;;;;;;;;;CAWC,GACD,OAAO,SAASC,iBACdC,KAAoB,EACpBC,UAAoC,EACpCC,UAAyB,EACzBC,MAAqB,EACrBC,GAAW;IAEX,MAAMC,YAAYpB;IAClB,OAAOC,uBACL,IACEc,SAASE,cAAcR,iBAAiBO,cACpCT,MACEJ,WAAWiB,WAAW,QAAQL,OAAOjB,gBAAgBuB,KAAK,MACvDX,mBAAmBM,aACtBR,MAAM,cAAc,MAAMS,aAC1BT,MAAM,UAAU,MAAMU,SACtBZ,QAAQ,aAAa,SACrBD,MAAMc,QAER,MACN;QAACC;QAAWL;QAAOC;QAAYC;QAAYC;QAAQC;KAAI,EACvD;QAAEG,SAAS;IAAM;AAErB;AAEA;;;CAGC,GACD,OAAO,SAASC,eACdR,KAAoB,EACpBC,UAAoC,EACpCQ,IAAmD;IAEnD,MAAMJ,YAAYpB;IAClB,MAAMyB,QAAQ,eAAeD,OAAO,cAAc;IAClD,MAAME,KAAK,eAAeF,OAAOA,KAAKG,SAAS,GAAGH,KAAKI,SAAS;IAChE,OAAO3B,uBACL,IACEc,SAASW,MAAMjB,iBAAiBO,cAC5BT,MACEJ,WAAWiB,WAAW,QAAQL,OAAOjB,gBAAgBuB,KAAK,MACvDX,mBAAmBM,aACtBR,MAAMiB,OAAO,MAAMC,KACnBpB,QAAQ,aAAa,SACrBD,MAAMQ,uBAER,MACN;QAACO;QAAWL;QAAOC;QAAYS;QAAOC;KAAG,EACzC;QAAEJ,SAAS;IAAM;AAErB;AAEA;;;;;;;;;;;;CAYC,GACD,OAAO,SAASO,oBACdd,KAAoB,EACpBC,UAAoC,EACpCc,UAAmB,EACnBH,SAAwB;IAExB,MAAMP,YAAYpB;IAClB,MAAM+B,SAASf,aACXA,WAAWgB,KAAK,CAAC,GAAG,IAAIC,GAAG,CAAC,CAACC,QAAU,GAAGA,QAAQnC,qBAAqB4B,WAAW,IAClF;IACJ,MAAMQ,MAAMJ,SAASA,OAAOK,IAAI,CAAC,QAAQ;IACzC,OAAOnC,uBACL,IACEc,SAASY,aAAcX,CAAAA,eAAe,QAASc,eAAcC,0BAAAA,OAAQM,MAAM,CAAA,IACvE9B,MACEJ,WAAWiB,WAAW,QAAQL,OAAOjB,gBAAgBuB,KAAK,GAC1DU,SACIvB,MAAM,+BAA+B,sBAAsBuB,UAC3DvB,MAAM,yBAAyB,kBAAkBmB,YACrDrB,QAAQ,aAAa,SACrBD,MAAMQ,uBAER,MACN,qEAAqE;IACrE;QAACO;QAAWL;QAAOoB;QAAKL;QAAYH;QAAWX,eAAe;KAAK,EACnE;QAAEM,SAAS;IAAM;AAErB;AAEA,mEAAmE,GACnE,OAAO,SAASgB,QAAQvB,KAAoB,EAAEwB,MAAc;IAC1D,MAAMnB,YAAYpB;IAClB,OAAOE,gBACL,IACEa,SAASwB,SACLnC,IAAIgB,WAAW,QAAQL,OAAOjB,gBAAgBuB,KAAK,EAAEkB,UACrD,MACN;QAACnB;QAAWL;QAAOwB;KAAO,EAC1B;QAAEjB,SAAS;IAAM;AAErB"}
@@ -0,0 +1,14 @@
1
+ import type { CrmPicklist, CrmPicklistId } from '@aglyn/aglyn';
2
+ export interface LeadPicklistsResult {
3
+ /** Each list a lead field beside the lead source holds a value of, by picklist id. */
4
+ lists: Readonly<Partial<Record<CrmPicklistId, CrmPicklist>>>;
5
+ /** Every list has answered from the server. */
6
+ ready: boolean;
7
+ }
8
+ /**
9
+ * The org's lists behind a lead's Salutation, Industry and Rating
10
+ * (AGL-3513) — the contact's and the company's own lists, one document
11
+ * listen each, shared with every other mount asking for the same list.
12
+ */
13
+ export declare function useLeadPicklists(orgId: string | null | undefined): LeadPicklistsResult;
14
+ export default useLeadPicklists;
@@ -0,0 +1,46 @@
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 { useMemo } from "react";
18
+ import { useCrmPicklist } from "./use-crm-picklist.js";
19
+ /**
20
+ * The org's lists behind a lead's Salutation, Industry and Rating
21
+ * (AGL-3513) — the contact's and the company's own lists, one document
22
+ * listen each, shared with every other mount asking for the same list.
23
+ */ export function useLeadPicklists(orgId) {
24
+ const salutation = useCrmPicklist('salutation', orgId);
25
+ const industry = useCrmPicklist('industry', orgId);
26
+ const rating = useCrmPicklist('rating', orgId);
27
+ return useMemo(()=>({
28
+ lists: {
29
+ salutation: salutation.picklist,
30
+ industry: industry.picklist,
31
+ rating: rating.picklist
32
+ },
33
+ ready: [
34
+ salutation,
35
+ industry,
36
+ rating
37
+ ].every((list)=>list.ready)
38
+ }), [
39
+ salutation,
40
+ industry,
41
+ rating
42
+ ]);
43
+ }
44
+ export default useLeadPicklists;
45
+
46
+ //# sourceMappingURL=use-lead-picklists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/hooks/use-lead-picklists.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport type { CrmPicklist, CrmPicklistId } from '@aglyn/aglyn'\nimport { useMemo } from 'react'\nimport { useCrmPicklist } from './use-crm-picklist'\n\nexport interface LeadPicklistsResult {\n /** Each list a lead field beside the lead source holds a value of, by picklist id. */\n lists: Readonly<Partial<Record<CrmPicklistId, CrmPicklist>>>\n /** Every list has answered from the server. */\n ready: boolean\n}\n\n/**\n * The org's lists behind a lead's Salutation, Industry and Rating\n * (AGL-3513) — the contact's and the company's own lists, one document\n * listen each, shared with every other mount asking for the same list.\n */\nexport function useLeadPicklists(orgId: string | null | undefined): LeadPicklistsResult {\n const salutation = useCrmPicklist('salutation', orgId)\n const industry = useCrmPicklist('industry', orgId)\n const rating = useCrmPicklist('rating', orgId)\n return useMemo(\n () => ({\n lists: {\n salutation: salutation.picklist,\n industry: industry.picklist,\n rating: rating.picklist,\n },\n ready: [salutation, industry, rating].every((list) => list.ready),\n }),\n [salutation, industry, rating],\n )\n}\n\nexport default useLeadPicklists\n"],"names":["useMemo","useCrmPicklist","useLeadPicklists","orgId","salutation","industry","rating","lists","picklist","ready","every","list"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;AAGA,SAASA,OAAO,QAAQ,QAAO;AAC/B,SAASC,cAAc,QAAQ,wBAAoB;AASnD;;;;CAIC,GACD,OAAO,SAASC,iBAAiBC,KAAgC;IAC/D,MAAMC,aAAaH,eAAe,cAAcE;IAChD,MAAME,WAAWJ,eAAe,YAAYE;IAC5C,MAAMG,SAASL,eAAe,UAAUE;IACxC,OAAOH,QACL,IAAO,CAAA;YACLO,OAAO;gBACLH,YAAYA,WAAWI,QAAQ;gBAC/BH,UAAUA,SAASG,QAAQ;gBAC3BF,QAAQA,OAAOE,QAAQ;YACzB;YACAC,OAAO;gBAACL;gBAAYC;gBAAUC;aAAO,CAACI,KAAK,CAAC,CAACC,OAASA,KAAKF,KAAK;QAClE,CAAA,GACA;QAACL;QAAYC;QAAUC;KAAO;AAElC;AAEA,eAAeJ,iBAAgB"}
@@ -1,23 +1,9 @@
1
- import { type CrmPicklist } from '@aglyn/aglyn';
2
- export interface LeadSourcePicklistResult {
3
- /** The list every picker offers — the org's own, or the starter set. */
4
- picklist: CrmPicklist;
5
- /** The org has written its own list; false while it reads the starter set. */
6
- stored: boolean;
7
- /** The server has answered, so the list is the org's and not a placeholder. */
8
- ready: boolean;
9
- /** The document has not been confirmed by the server — `writeGuardedBySeed`'s input. */
10
- fromCache: boolean;
11
- }
1
+ import { type CrmPicklistResult } from './use-crm-picklist';
2
+ export type LeadSourcePicklistResult = Omit<CrmPicklistResult, 'definition'>;
12
3
  /**
13
- * The org's lead source values (AGL-3298), for every surface that offers
14
- * or manages them: the lead page's select, the New lead drawer, the
15
- * contact's card, the leads list's filter and the Fields page.
16
- *
17
- * One document listen, shared by the Firestore SDK across every mount that
18
- * asks for the same org, so a page with the list and a drawer open pays
19
- * for it once. `orgId` null issues no read and answers the starter set,
20
- * unready.
4
+ * The org's lead source values (AGL-3298) — {@link useCrmPicklist} for the
5
+ * lead source: the lead page's select, the New lead drawer, the contact's
6
+ * card, the leads list's filter and the import drawer.
21
7
  */
22
8
  export declare function useLeadSourcePicklist(orgId: string | null | undefined): LeadSourcePicklistResult;
23
9
  export default useLeadSourcePicklist;
@@ -14,34 +14,24 @@
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */ 'use client';
17
- import { CRM_COLLECTIONS, CRM_LEAD_SOURCE_PICKLIST, effectiveCrmLeadSourcePicklist, normalizeCrmPicklist } from "@aglyn/aglyn";
18
- import { useFirestore, useFirestoreDoc } from "@aglyn/tenant-feature-instance";
19
- import { doc } from "firebase/firestore";
17
+ import { CRM_LEAD_SOURCE_PICKLIST } from "@aglyn/aglyn";
20
18
  import { useMemo } from "react";
19
+ import { useCrmPicklist } from "./use-crm-picklist.js";
21
20
  /**
22
- * The org's lead source values (AGL-3298), for every surface that offers
23
- * or manages them: the lead page's select, the New lead drawer, the
24
- * contact's card, the leads list's filter and the Fields page.
25
- *
26
- * One document listen, shared by the Firestore SDK across every mount that
27
- * asks for the same org, so a page with the list and a drawer open pays
28
- * for it once. `orgId` null issues no read and answers the starter set,
29
- * unready.
21
+ * The org's lead source values (AGL-3298) — {@link useCrmPicklist} for the
22
+ * lead source: the lead page's select, the New lead drawer, the contact's
23
+ * card, the leads list's filter and the import drawer.
30
24
  */ export function useLeadSourcePicklist(orgId) {
31
- const firestore = useFirestore();
32
- const { data, status, fromCache } = useFirestoreDoc(()=>orgId ? doc(firestore, 'orgs', orgId, CRM_COLLECTIONS.picklists, CRM_LEAD_SOURCE_PICKLIST) : null, [
33
- firestore,
34
- orgId
35
- ]);
25
+ const { picklist, stored, ready, fromCache } = useCrmPicklist(CRM_LEAD_SOURCE_PICKLIST, orgId);
36
26
  return useMemo(()=>({
37
- picklist: effectiveCrmLeadSourcePicklist(data),
38
- stored: normalizeCrmPicklist(data) !== null,
39
- ready: Boolean(orgId) && status !== 'loading',
27
+ picklist,
28
+ stored,
29
+ ready,
40
30
  fromCache
41
31
  }), [
42
- data,
43
- orgId,
44
- status,
32
+ picklist,
33
+ stored,
34
+ ready,
45
35
  fromCache
46
36
  ]);
47
37
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/hooks/use-lead-source-picklist.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n CRM_COLLECTIONS,\n CRM_LEAD_SOURCE_PICKLIST,\n type CrmPicklist,\n effectiveCrmLeadSourcePicklist,\n normalizeCrmPicklist,\n} from '@aglyn/aglyn'\nimport { useFirestore, useFirestoreDoc } from '@aglyn/tenant-feature-instance'\nimport { doc } from 'firebase/firestore'\nimport { useMemo } from 'react'\n\nexport interface LeadSourcePicklistResult {\n /** The list every picker offers — the org's own, or the starter set. */\n picklist: CrmPicklist\n /** The org has written its own list; false while it reads the starter set. */\n stored: boolean\n /** The server has answered, so the list is the org's and not a placeholder. */\n ready: boolean\n /** The document has not been confirmed by the server — `writeGuardedBySeed`'s input. */\n fromCache: boolean\n}\n\n/**\n * The org's lead source values (AGL-3298), for every surface that offers\n * or manages them: the lead page's select, the New lead drawer, the\n * contact's card, the leads list's filter and the Fields page.\n *\n * One document listen, shared by the Firestore SDK across every mount that\n * asks for the same org, so a page with the list and a drawer open pays\n * for it once. `orgId` null issues no read and answers the starter set,\n * unready.\n */\nexport function useLeadSourcePicklist(orgId: string | null | undefined): LeadSourcePicklistResult {\n const firestore = useFirestore()\n const { data, status, fromCache } = useFirestoreDoc<Record<string, unknown>>(\n () =>\n orgId\n ? doc(firestore, 'orgs', orgId, CRM_COLLECTIONS.picklists, CRM_LEAD_SOURCE_PICKLIST)\n : null,\n [firestore, orgId],\n )\n return useMemo(\n () => ({\n picklist: effectiveCrmLeadSourcePicklist(data),\n stored: normalizeCrmPicklist(data) !== null,\n ready: Boolean(orgId) && status !== 'loading',\n fromCache,\n }),\n [data, orgId, status, fromCache],\n )\n}\n\nexport default useLeadSourcePicklist\n"],"names":["CRM_COLLECTIONS","CRM_LEAD_SOURCE_PICKLIST","effectiveCrmLeadSourcePicklist","normalizeCrmPicklist","useFirestore","useFirestoreDoc","doc","useMemo","useLeadSourcePicklist","orgId","firestore","data","status","fromCache","picklists","picklist","stored","ready","Boolean"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;AAEA,SACEA,eAAe,EACfC,wBAAwB,EAExBC,8BAA8B,EAC9BC,oBAAoB,QACf,eAAc;AACrB,SAASC,YAAY,EAAEC,eAAe,QAAQ,iCAAgC;AAC9E,SAASC,GAAG,QAAQ,qBAAoB;AACxC,SAASC,OAAO,QAAQ,QAAO;AAa/B;;;;;;;;;CASC,GACD,OAAO,SAASC,sBAAsBC,KAAgC;IACpE,MAAMC,YAAYN;IAClB,MAAM,EAAEO,IAAI,EAAEC,MAAM,EAAEC,SAAS,EAAE,GAAGR,gBAClC,IACEI,QACIH,IAAII,WAAW,QAAQD,OAAOT,gBAAgBc,SAAS,EAAEb,4BACzD,MACN;QAACS;QAAWD;KAAM;IAEpB,OAAOF,QACL,IAAO,CAAA;YACLQ,UAAUb,+BAA+BS;YACzCK,QAAQb,qBAAqBQ,UAAU;YACvCM,OAAOC,QAAQT,UAAUG,WAAW;YACpCC;QACF,CAAA,GACA;QAACF;QAAMF;QAAOG;QAAQC;KAAU;AAEpC;AAEA,eAAeL,sBAAqB"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/hooks/use-lead-source-picklist.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { CRM_LEAD_SOURCE_PICKLIST } from '@aglyn/aglyn'\nimport { useMemo } from 'react'\nimport { type CrmPicklistResult, useCrmPicklist } from './use-crm-picklist'\n\nexport type LeadSourcePicklistResult = Omit<CrmPicklistResult, 'definition'>\n\n/**\n * The org's lead source values (AGL-3298) — {@link useCrmPicklist} for the\n * lead source: the lead page's select, the New lead drawer, the contact's\n * card, the leads list's filter and the import drawer.\n */\nexport function useLeadSourcePicklist(orgId: string | null | undefined): LeadSourcePicklistResult {\n const { picklist, stored, ready, fromCache } = useCrmPicklist(CRM_LEAD_SOURCE_PICKLIST, orgId)\n return useMemo(() => ({ picklist, stored, ready, fromCache }), [picklist, stored, ready, fromCache])\n}\n\nexport default useLeadSourcePicklist\n"],"names":["CRM_LEAD_SOURCE_PICKLIST","useMemo","useCrmPicklist","useLeadSourcePicklist","orgId","picklist","stored","ready","fromCache"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;AAEA,SAASA,wBAAwB,QAAQ,eAAc;AACvD,SAASC,OAAO,QAAQ,QAAO;AAC/B,SAAiCC,cAAc,QAAQ,wBAAoB;AAI3E;;;;CAIC,GACD,OAAO,SAASC,sBAAsBC,KAAgC;IACpE,MAAM,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,KAAK,EAAEC,SAAS,EAAE,GAAGN,eAAeF,0BAA0BI;IACxF,OAAOH,QAAQ,IAAO,CAAA;YAAEI;YAAUC;YAAQC;YAAOC;QAAU,CAAA,GAAI;QAACH;QAAUC;QAAQC;QAAOC;KAAU;AACrG;AAEA,eAAeL,sBAAqB"}
@@ -0,0 +1,9 @@
1
+ import { type CrmPicklistResult } from './use-crm-picklist';
2
+ export type LeadStatusPicklistResult = Omit<CrmPicklistResult, 'definition'>;
3
+ /**
4
+ * The org's lead status values (AGL-3512) — {@link useCrmPicklist} for the
5
+ * lead status: every chip, select and filter that shows a lead's status by
6
+ * the label the org gave its meaning. One shared document listen.
7
+ */
8
+ export declare function useLeadStatusPicklist(orgId: string | null | undefined): LeadStatusPicklistResult;
9
+ export default useLeadStatusPicklist;
@@ -0,0 +1,40 @@
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 { CRM_LEAD_STATUS_PICKLIST } from "@aglyn/aglyn";
18
+ import { useMemo } from "react";
19
+ import { useCrmPicklist } from "./use-crm-picklist.js";
20
+ /**
21
+ * The org's lead status values (AGL-3512) — {@link useCrmPicklist} for the
22
+ * lead status: every chip, select and filter that shows a lead's status by
23
+ * the label the org gave its meaning. One shared document listen.
24
+ */ export function useLeadStatusPicklist(orgId) {
25
+ const { picklist, stored, ready, fromCache } = useCrmPicklist(CRM_LEAD_STATUS_PICKLIST, orgId);
26
+ return useMemo(()=>({
27
+ picklist,
28
+ stored,
29
+ ready,
30
+ fromCache
31
+ }), [
32
+ picklist,
33
+ stored,
34
+ ready,
35
+ fromCache
36
+ ]);
37
+ }
38
+ export default useLeadStatusPicklist;
39
+
40
+ //# sourceMappingURL=use-lead-status-picklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/hooks/use-lead-status-picklist.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport { CRM_LEAD_STATUS_PICKLIST } from '@aglyn/aglyn'\nimport { useMemo } from 'react'\nimport { type CrmPicklistResult, useCrmPicklist } from './use-crm-picklist'\n\nexport type LeadStatusPicklistResult = Omit<CrmPicklistResult, 'definition'>\n\n/**\n * The org's lead status values (AGL-3512) — {@link useCrmPicklist} for the\n * lead status: every chip, select and filter that shows a lead's status by\n * the label the org gave its meaning. One shared document listen.\n */\nexport function useLeadStatusPicklist(orgId: string | null | undefined): LeadStatusPicklistResult {\n const { picklist, stored, ready, fromCache } = useCrmPicklist(CRM_LEAD_STATUS_PICKLIST, orgId)\n return useMemo(() => ({ picklist, stored, ready, fromCache }), [picklist, stored, ready, fromCache])\n}\n\nexport default useLeadStatusPicklist\n"],"names":["CRM_LEAD_STATUS_PICKLIST","useMemo","useCrmPicklist","useLeadStatusPicklist","orgId","picklist","stored","ready","fromCache"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;AAEA,SAASA,wBAAwB,QAAQ,eAAc;AACvD,SAASC,OAAO,QAAQ,QAAO;AAC/B,SAAiCC,cAAc,QAAQ,wBAAoB;AAI3E;;;;CAIC,GACD,OAAO,SAASC,sBAAsBC,KAAgC;IACpE,MAAM,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,KAAK,EAAEC,SAAS,EAAE,GAAGN,eAAeF,0BAA0BI;IACxF,OAAOH,QAAQ,IAAO,CAAA;YAAEI;YAAUC;YAAQC;YAAOC;QAAU,CAAA,GAAI;QAACH;QAAUC;QAAQC;QAAOC;KAAU;AACrG;AAEA,eAAeL,sBAAqB"}
@@ -26,7 +26,7 @@
26
26
  * rule once, as a function of the document and nothing else, so a spec can
27
27
  * pin it without mounting a card.
28
28
  */
29
- import { type AglynPostalAddress, CONTACT_COMPANY_IDS_FIELD, type CrmCompany } from '@aglyn/aglyn';
29
+ import { type AglynPostalAddress, CONTACT_COMPANY_IDS_FIELD, type CrmCompany, type CrmPicklist, type CrmPicklistId } from '@aglyn/aglyn';
30
30
  export { CONTACT_COMPANY_IDS_FIELD };
31
31
  export { COMPANY_DETACH_LIMIT } from './company-delete-route';
32
32
  /** One company as a picker or a suggestion needs it. */
@@ -46,15 +46,34 @@ export interface CompanyOption {
46
46
  * contact still meet.
47
47
  */
48
48
  export declare function suggestCompanyForEmail(email: unknown, companies: readonly CompanyOption[]): CompanyOption | null;
49
- /** What the form holds — every field as text, the address as its parts. */
49
+ /** What the form holds — every field as text, the addresses as their parts. */
50
50
  export interface CompanyDraft {
51
51
  name: string;
52
52
  domain: string;
53
53
  website: string;
54
54
  phone: string;
55
+ /** Each company picklist's label (AGL-3514), `''` for none. */
56
+ type: string;
55
57
  industry: string;
58
+ rating: string;
59
+ ownership: string;
60
+ accountSource: string;
56
61
  ownerUid: string;
62
+ /** The billing address. */
57
63
  address: AglynPostalAddress;
64
+ shippingAddress: AglynPostalAddress;
65
+ /** As typed, in the currency's major unit — `parseAmountInput` reads it. */
66
+ annualRevenue: string;
67
+ /** Lowercase ISO 4217. */
68
+ currency: string;
69
+ numberOfEmployees: string;
70
+ fax: string;
71
+ accountNumber: string;
72
+ site: string;
73
+ tickerSymbol: string;
74
+ sicCode: string;
75
+ /** The parent company's id, `''` for none. */
76
+ parentCompanyId: string;
58
77
  /** Comma-separated as typed; stored as the list `companyDraftFields` reads. */
59
78
  tags: string;
60
79
  notes: string;
@@ -71,6 +90,16 @@ export declare const COMPANY_TAGS_MAX = 20;
71
90
  export declare function normalizeCompanyTags(input: string): string[];
72
91
  /** A stored company, as the form should start from it. */
73
92
  export declare function companyDraftFrom(company: Partial<CrmCompany> | null | undefined): CompanyDraft;
93
+ /**
94
+ * What a draft's picklist fields are judged against (AGL-3514): the org's
95
+ * lists the form read, and the company as stored — whose own values are
96
+ * kept even when a list no longer offers them. Absent, each field is
97
+ * judged against its standard values alone.
98
+ */
99
+ export interface CompanyDraftPicklists {
100
+ lists: Readonly<Partial<Record<CrmPicklistId, CrmPicklist>>>;
101
+ current?: Partial<CrmCompany> | null;
102
+ }
74
103
  export type CompanyDraftResult = {
75
104
  ok: true;
76
105
  /** Fields with a value, ready to `setDoc` or `updateDoc`. */
@@ -96,4 +125,4 @@ export type CompanyDraftResult = {
96
125
  * list's name filter — a range over `nameLower` — can find the record; a
97
126
  * company written without those keys still lists and cannot be searched.
98
127
  */
99
- export declare function companyDraftFields(draft: CompanyDraft): CompanyDraftResult;
128
+ export declare function companyDraftFields(draft: CompanyDraft, picklists?: CompanyDraftPicklists): CompanyDraftResult;