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

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 (514) 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-record-picker.d.ts +15 -0
  34. package/src/lib/components/crm-record-picker.js +16 -10
  35. package/src/lib/components/crm-record-picker.js.map +1 -1
  36. package/src/lib/components/crm-transfer-buttons.d.ts +54 -0
  37. package/src/lib/components/crm-transfer-buttons.js +167 -0
  38. package/src/lib/components/crm-transfer-buttons.js.map +1 -0
  39. package/src/lib/components/deal-contact-roles-card.d.ts +46 -0
  40. package/src/lib/components/deal-contact-roles-card.js +368 -0
  41. package/src/lib/components/deal-contact-roles-card.js.map +1 -0
  42. package/src/lib/components/deal-detail-page.d.ts +3 -2
  43. package/src/lib/components/deal-detail-page.js +25 -6
  44. package/src/lib/components/deal-detail-page.js.map +1 -1
  45. package/src/lib/components/deal-edit-drawer.d.ts +10 -0
  46. package/src/lib/components/deal-edit-drawer.js +219 -10
  47. package/src/lib/components/deal-edit-drawer.js.map +1 -1
  48. package/src/lib/components/deal-properties-card.d.ts +7 -0
  49. package/src/lib/components/deal-properties-card.js +34 -3
  50. package/src/lib/components/deal-properties-card.js.map +1 -1
  51. package/src/lib/components/deal-stage-card.d.ts +4 -0
  52. package/src/lib/components/deal-stage-card.js +10 -2
  53. package/src/lib/components/deal-stage-card.js.map +1 -1
  54. package/src/lib/components/deals-bulk-bar.d.ts +0 -3
  55. package/src/lib/components/deals-bulk-bar.js +7 -20
  56. package/src/lib/components/deals-bulk-bar.js.map +1 -1
  57. package/src/lib/components/deals-section.d.ts +3 -3
  58. package/src/lib/components/deals-section.js +123 -63
  59. package/src/lib/components/deals-section.js.map +1 -1
  60. package/src/lib/components/fields-section.js +31 -17
  61. package/src/lib/components/fields-section.js.map +1 -1
  62. package/src/lib/components/lead-convert-dialog.d.ts +4 -0
  63. package/src/lib/components/lead-convert-dialog.js +23 -1
  64. package/src/lib/components/lead-convert-dialog.js.map +1 -1
  65. package/src/lib/components/lead-detail-page.js +8 -2
  66. package/src/lib/components/lead-detail-page.js.map +1 -1
  67. package/src/lib/components/lead-profile-fields.d.ts +71 -0
  68. package/src/lib/components/lead-profile-fields.js +386 -0
  69. package/src/lib/components/lead-profile-fields.js.map +1 -0
  70. package/src/lib/components/lead-properties-card.d.ts +2 -1
  71. package/src/lib/components/lead-properties-card.js +85 -176
  72. package/src/lib/components/lead-properties-card.js.map +1 -1
  73. package/src/lib/components/lead-source-select.d.ts +4 -23
  74. package/src/lib/components/lead-source-select.js +9 -73
  75. package/src/lib/components/lead-source-select.js.map +1 -1
  76. package/src/lib/components/lead-status-chip.d.ts +9 -3
  77. package/src/lib/components/lead-status-chip.js +8 -4
  78. package/src/lib/components/lead-status-chip.js.map +1 -1
  79. package/src/lib/components/lead-status-options.d.ts +20 -0
  80. package/src/lib/components/lead-status-options.js +51 -0
  81. package/src/lib/components/lead-status-options.js.map +1 -0
  82. package/src/lib/components/lead-unqualify-dialog.d.ts +5 -0
  83. package/src/lib/components/lead-unqualify-dialog.js +50 -18
  84. package/src/lib/components/lead-unqualify-dialog.js.map +1 -1
  85. package/src/lib/components/leads-bulk-bar.d.ts +0 -3
  86. package/src/lib/components/leads-bulk-bar.js +29 -29
  87. package/src/lib/components/leads-bulk-bar.js.map +1 -1
  88. package/src/lib/components/leads-section.js +120 -68
  89. package/src/lib/components/leads-section.js.map +1 -1
  90. package/src/lib/components/linked-deals-card.d.ts +4 -0
  91. package/src/lib/components/linked-deals-card.js +47 -3
  92. package/src/lib/components/linked-deals-card.js.map +1 -1
  93. package/src/lib/components/log-activity-dialog.js +43 -3
  94. package/src/lib/components/log-activity-dialog.js.map +1 -1
  95. package/src/lib/components/new-contact-drawer.d.ts +8 -0
  96. package/src/lib/components/new-contact-drawer.js +108 -6
  97. package/src/lib/components/new-contact-drawer.js.map +1 -1
  98. package/src/lib/components/new-lead-drawer.d.ts +9 -2
  99. package/src/lib/components/new-lead-drawer.js +88 -121
  100. package/src/lib/components/new-lead-drawer.js.map +1 -1
  101. package/src/lib/components/picklist-select.d.ts +36 -0
  102. package/src/lib/components/picklist-select.js +114 -0
  103. package/src/lib/components/picklist-select.js.map +1 -0
  104. package/src/lib/components/picklist-values-card.d.ts +34 -0
  105. package/src/lib/components/{lead-source-values-card.js → picklist-values-card.js} +241 -58
  106. package/src/lib/components/picklist-values-card.js.map +1 -0
  107. package/src/lib/components/pipeline-stages-dialog.d.ts +7 -0
  108. package/src/lib/components/pipeline-stages-dialog.js +26 -4
  109. package/src/lib/components/pipeline-stages-dialog.js.map +1 -1
  110. package/src/lib/components/pipelines-dialog.js +15 -6
  111. package/src/lib/components/pipelines-dialog.js.map +1 -1
  112. package/src/lib/components/recent-activity-feed.js +20 -5
  113. package/src/lib/components/recent-activity-feed.js.map +1 -1
  114. package/src/lib/components/recipes-card.js +4 -2
  115. package/src/lib/components/recipes-card.js.map +1 -1
  116. package/src/lib/components/record-tasks-card.js +15 -8
  117. package/src/lib/components/record-tasks-card.js.map +1 -1
  118. package/src/lib/components/reports/forecast-card.d.ts +6 -0
  119. package/src/lib/components/reports/forecast-card.js +101 -3
  120. package/src/lib/components/reports/forecast-card.js.map +1 -1
  121. package/src/lib/components/reports/lead-funnel-card.d.ts +12 -0
  122. package/src/lib/components/reports/lead-funnel-card.js +9 -5
  123. package/src/lib/components/reports/lead-funnel-card.js.map +1 -1
  124. package/src/lib/components/reports/lead-source-card.d.ts +23 -0
  125. package/src/lib/components/reports/lead-source-card.js +318 -0
  126. package/src/lib/components/reports/lead-source-card.js.map +1 -0
  127. package/src/lib/components/reports/report-export.js +1 -1
  128. package/src/lib/components/reports/report-export.js.map +1 -1
  129. package/src/lib/components/reports-section.js +8 -0
  130. package/src/lib/components/reports-section.js.map +1 -1
  131. package/src/lib/components/sharing-rule-drawer.d.ts +5 -0
  132. package/src/lib/components/sharing-rule-drawer.js +108 -19
  133. package/src/lib/components/sharing-rule-drawer.js.map +1 -1
  134. package/src/lib/components/sharing-rules-card.js +11 -3
  135. package/src/lib/components/sharing-rules-card.js.map +1 -1
  136. package/src/lib/components/task-cells.d.ts +9 -1
  137. package/src/lib/components/task-cells.js +9 -4
  138. package/src/lib/components/task-cells.js.map +1 -1
  139. package/src/lib/components/task-edit-drawer.js +111 -43
  140. package/src/lib/components/task-edit-drawer.js.map +1 -1
  141. package/src/lib/components/tasks-bulk-bar.d.ts +0 -3
  142. package/src/lib/components/tasks-bulk-bar.js +7 -20
  143. package/src/lib/components/tasks-bulk-bar.js.map +1 -1
  144. package/src/lib/components/tasks-calendar.d.ts +3 -0
  145. package/src/lib/components/tasks-calendar.js +8 -1
  146. package/src/lib/components/tasks-calendar.js.map +1 -1
  147. package/src/lib/components/tasks-section.d.ts +3 -3
  148. package/src/lib/components/tasks-section.js +58 -43
  149. package/src/lib/components/tasks-section.js.map +1 -1
  150. package/src/lib/constants/api-routes.d.ts +2 -9
  151. package/src/lib/constants/api-routes.js +1 -7
  152. package/src/lib/constants/api-routes.js.map +1 -1
  153. package/src/lib/constants/bundle-common.d.ts +6 -0
  154. package/src/lib/constants/bundle-common.js +11 -0
  155. package/src/lib/constants/bundle-common.js.map +1 -1
  156. package/src/lib/constants/company-filters.d.ts +14 -0
  157. package/src/lib/constants/company-filters.js +51 -1
  158. package/src/lib/constants/company-filters.js.map +1 -1
  159. package/src/lib/constants/contact-filters.d.ts +2 -0
  160. package/src/lib/constants/contact-filters.js +18 -1
  161. package/src/lib/constants/contact-filters.js.map +1 -1
  162. package/src/lib/constants/deal-filters.d.ts +22 -1
  163. package/src/lib/constants/deal-filters.js +67 -4
  164. package/src/lib/constants/deal-filters.js.map +1 -1
  165. package/src/lib/declarations.console-server.d.ts +3 -0
  166. package/src/lib/declarations.console-server.js +35 -0
  167. package/src/lib/declarations.console-server.js.map +1 -1
  168. package/src/lib/declarations.d.ts +26 -0
  169. package/src/lib/declarations.js +35 -0
  170. package/src/lib/declarations.js.map +1 -0
  171. package/src/lib/declarations.server.d.ts +11 -0
  172. package/src/lib/declarations.server.js +92 -1
  173. package/src/lib/declarations.server.js.map +1 -1
  174. package/src/lib/hooks/use-company-picklists.d.ts +15 -0
  175. package/src/lib/hooks/use-company-picklists.js +55 -0
  176. package/src/lib/hooks/use-company-picklists.js.map +1 -0
  177. package/src/lib/hooks/use-crm-picklist.d.ts +25 -0
  178. package/src/lib/hooks/use-crm-picklist.js +53 -0
  179. package/src/lib/hooks/use-crm-picklist.js.map +1 -0
  180. package/src/lib/hooks/use-crm-record-names.d.ts +16 -0
  181. package/src/lib/hooks/use-crm-record-names.js +45 -19
  182. package/src/lib/hooks/use-crm-record-names.js.map +1 -1
  183. package/src/lib/hooks/use-crm-task-picklists.d.ts +11 -0
  184. package/src/lib/hooks/use-crm-task-picklists.js +45 -0
  185. package/src/lib/hooks/use-crm-task-picklists.js.map +1 -0
  186. package/src/lib/hooks/use-deals.d.ts +14 -0
  187. package/src/lib/hooks/use-deals.js +29 -0
  188. package/src/lib/hooks/use-deals.js.map +1 -1
  189. package/src/lib/hooks/use-lead-picklists.d.ts +14 -0
  190. package/src/lib/hooks/use-lead-picklists.js +46 -0
  191. package/src/lib/hooks/use-lead-picklists.js.map +1 -0
  192. package/src/lib/hooks/use-lead-source-picklist.d.ts +5 -19
  193. package/src/lib/hooks/use-lead-source-picklist.js +12 -22
  194. package/src/lib/hooks/use-lead-source-picklist.js.map +1 -1
  195. package/src/lib/hooks/use-lead-status-picklist.d.ts +9 -0
  196. package/src/lib/hooks/use-lead-status-picklist.js +40 -0
  197. package/src/lib/hooks/use-lead-status-picklist.js.map +1 -0
  198. package/src/lib/model/companies.d.ts +32 -3
  199. package/src/lib/model/companies.js +133 -16
  200. package/src/lib/model/companies.js.map +1 -1
  201. package/src/lib/model/contact-merge.d.ts +27 -3
  202. package/src/lib/model/contact-merge.js +81 -7
  203. package/src/lib/model/contact-merge.js.map +1 -1
  204. package/src/lib/model/contact-record.d.ts +17 -0
  205. package/src/lib/model/contact-record.js +15 -1
  206. package/src/lib/model/contact-record.js.map +1 -1
  207. package/src/lib/model/contact-update.d.ts +31 -2
  208. package/src/lib/model/contact-update.js +14 -0
  209. package/src/lib/model/contact-update.js.map +1 -1
  210. package/src/lib/model/crm-list-query.d.ts +5 -0
  211. package/src/lib/model/crm-list-query.js +8 -0
  212. package/src/lib/model/crm-list-query.js.map +1 -1
  213. package/src/lib/model/crm-recipes.d.ts +40 -0
  214. package/src/lib/model/crm-recipes.js +244 -0
  215. package/src/lib/model/crm-recipes.js.map +1 -0
  216. package/src/lib/model/crm-record-counts.d.ts +36 -0
  217. package/src/lib/model/crm-record-counts.js +54 -0
  218. package/src/lib/model/crm-record-counts.js.map +1 -0
  219. package/src/lib/model/crm-record-lists.d.ts +23 -0
  220. package/src/lib/model/crm-record-lists.js +161 -0
  221. package/src/lib/model/crm-record-lists.js.map +1 -0
  222. package/src/lib/model/crm-reports.d.ts +73 -3
  223. package/src/lib/model/crm-reports.js +120 -1
  224. package/src/lib/model/crm-reports.js.map +1 -1
  225. package/src/lib/model/crm-sharing.d.ts +21 -3
  226. package/src/lib/model/crm-sharing.js +27 -6
  227. package/src/lib/model/crm-sharing.js.map +1 -1
  228. package/src/lib/model/deal-board-model.d.ts +8 -2
  229. package/src/lib/model/deal-board-model.js +15 -2
  230. package/src/lib/model/deal-board-model.js.map +1 -1
  231. package/src/lib/model/deal-contact-roles.d.ts +45 -0
  232. package/src/lib/model/deal-contact-roles.js +73 -0
  233. package/src/lib/model/deal-contact-roles.js.map +1 -0
  234. package/src/lib/model/deal-form-model.d.ts +56 -0
  235. package/src/lib/model/deal-form-model.js +79 -7
  236. package/src/lib/model/deal-form-model.js.map +1 -1
  237. package/src/lib/model/download-text-file.d.ts +23 -0
  238. package/src/lib/model/download-text-file.js +34 -0
  239. package/src/lib/model/download-text-file.js.map +1 -0
  240. package/src/lib/model/lead-filters.d.ts +36 -2
  241. package/src/lib/model/lead-filters.js +123 -2
  242. package/src/lib/model/lead-filters.js.map +1 -1
  243. package/src/lib/model/lead-source-direction.d.ts +38 -0
  244. package/src/lib/model/lead-source-direction.js +52 -0
  245. package/src/lib/model/lead-source-direction.js.map +1 -0
  246. package/src/lib/model/picklist-values.d.ts +119 -0
  247. package/src/lib/model/picklist-values.js +256 -0
  248. package/src/lib/model/picklist-values.js.map +1 -0
  249. package/src/lib/model/record-facts-disclosed.d.ts +81 -0
  250. package/src/lib/model/record-facts-disclosed.js +281 -0
  251. package/src/lib/model/record-facts-disclosed.js.map +1 -0
  252. package/src/lib/model/record-facts.d.ts +215 -34
  253. package/src/lib/model/record-facts.js +307 -128
  254. package/src/lib/model/record-facts.js.map +1 -1
  255. package/src/lib/model/task-picklists.d.ts +52 -0
  256. package/src/lib/model/task-picklists.js +83 -0
  257. package/src/lib/model/task-picklists.js.map +1 -0
  258. package/src/lib/model/task-routes.d.ts +13 -0
  259. package/src/lib/model/task-routes.js +23 -4
  260. package/src/lib/model/task-routes.js.map +1 -1
  261. package/src/lib/plan-entitlements.js +6 -4
  262. package/src/lib/plan-entitlements.js.map +1 -1
  263. package/src/lib/plugin.js +17 -0
  264. package/src/lib/plugin.js.map +1 -1
  265. package/src/lib/server/api-v1/contacts.js +220 -14
  266. package/src/lib/server/api-v1/contacts.js.map +1 -1
  267. package/src/lib/server/api-v1/crm-activities.js +14 -1
  268. package/src/lib/server/api-v1/crm-activities.js.map +1 -1
  269. package/src/lib/server/api-v1/crm-companies.js +123 -14
  270. package/src/lib/server/api-v1/crm-companies.js.map +1 -1
  271. package/src/lib/server/api-v1/crm-deals.js +291 -26
  272. package/src/lib/server/api-v1/crm-deals.js.map +1 -1
  273. package/src/lib/server/api-v1/crm-leads.js +144 -38
  274. package/src/lib/server/api-v1/crm-leads.js.map +1 -1
  275. package/src/lib/server/api-v1/crm-pipelines.d.ts +6 -0
  276. package/src/lib/server/api-v1/crm-pipelines.js +8 -2
  277. package/src/lib/server/api-v1/crm-pipelines.js.map +1 -1
  278. package/src/lib/server/api-v1/crm-tasks.js +75 -33
  279. package/src/lib/server/api-v1/crm-tasks.js.map +1 -1
  280. package/src/lib/server/api-v1/openapi.d.ts +0 -11
  281. package/src/lib/server/api-v1/openapi.js +171 -16
  282. package/src/lib/server/api-v1/openapi.js.map +1 -1
  283. package/src/lib/server/assign-contact-owner.d.ts +162 -0
  284. package/src/lib/server/assign-contact-owner.js +340 -0
  285. package/src/lib/server/assign-contact-owner.js.map +1 -0
  286. package/src/lib/server/associate-company-by-domain.d.ts +70 -0
  287. package/src/lib/server/associate-company-by-domain.js +153 -0
  288. package/src/lib/server/associate-company-by-domain.js.map +1 -0
  289. package/src/lib/server/automation-steps.d.ts +139 -0
  290. package/src/lib/server/automation-steps.js +472 -0
  291. package/src/lib/server/automation-steps.js.map +1 -0
  292. package/src/lib/server/capture-contact.js +65 -21
  293. package/src/lib/server/capture-contact.js.map +1 -1
  294. package/src/lib/server/capture-host-contact.d.ts +104 -0
  295. package/src/lib/server/capture-host-contact.js +151 -0
  296. package/src/lib/server/capture-host-contact.js.map +1 -0
  297. package/src/lib/server/company-children.d.ts +25 -0
  298. package/src/lib/server/company-children.js +42 -0
  299. package/src/lib/server/company-children.js.map +1 -0
  300. package/src/lib/server/company-delete.d.ts +18 -0
  301. package/src/lib/server/company-delete.js +44 -21
  302. package/src/lib/server/company-delete.js.map +1 -1
  303. package/src/lib/server/contact-email-history.js +21 -19
  304. package/src/lib/server/contact-email-history.js.map +1 -1
  305. package/src/lib/server/contact-remove.js +27 -2
  306. package/src/lib/server/contact-remove.js.map +1 -1
  307. package/src/lib/server/contact-reports-to.d.ts +61 -0
  308. package/src/lib/server/contact-reports-to.js +114 -0
  309. package/src/lib/server/contact-reports-to.js.map +1 -0
  310. package/src/lib/server/contact-update.d.ts +42 -1
  311. package/src/lib/server/contact-update.js +204 -23
  312. package/src/lib/server/contact-update.js.map +1 -1
  313. package/src/lib/server/convert-host-lead.d.ts +46 -1
  314. package/src/lib/server/convert-host-lead.js +173 -15
  315. package/src/lib/server/convert-host-lead.js.map +1 -1
  316. package/src/lib/server/convert-open-lead.js +12 -5
  317. package/src/lib/server/convert-open-lead.js.map +1 -1
  318. package/src/lib/server/crm-record-indexes.d.ts +45 -0
  319. package/src/lib/server/crm-record-indexes.js +78 -0
  320. package/src/lib/server/crm-record-indexes.js.map +1 -0
  321. package/src/lib/server/crm-sharing.d.ts +9 -1
  322. package/src/lib/server/crm-sharing.js +23 -3
  323. package/src/lib/server/crm-sharing.js.map +1 -1
  324. package/src/lib/server/deal-contact-roles.d.ts +27 -0
  325. package/src/lib/server/deal-contact-roles.js +89 -0
  326. package/src/lib/server/deal-contact-roles.js.map +1 -0
  327. package/src/lib/server/lead-convert.d.ts +5 -0
  328. package/src/lib/server/lead-convert.js +19 -3
  329. package/src/lib/server/lead-convert.js.map +1 -1
  330. package/src/lib/server/lead-create.d.ts +17 -2
  331. package/src/lib/server/lead-create.js +46 -14
  332. package/src/lib/server/lead-create.js.map +1 -1
  333. package/src/lib/server/lead-nurturing.d.ts +6 -0
  334. package/src/lib/server/lead-nurturing.js +57 -20
  335. package/src/lib/server/lead-nurturing.js.map +1 -1
  336. package/src/lib/server/lead-picklists.d.ts +35 -0
  337. package/src/lib/server/lead-picklists.js +52 -0
  338. package/src/lib/server/lead-picklists.js.map +1 -0
  339. package/src/lib/server/lead-source-picklist.d.ts +1 -13
  340. package/src/lib/server/lead-source-picklist.js +6 -33
  341. package/src/lib/server/lead-source-picklist.js.map +1 -1
  342. package/src/lib/server/merge-contacts.js +22 -4
  343. package/src/lib/server/merge-contacts.js.map +1 -1
  344. package/src/lib/server/person-eraser.d.ts +53 -0
  345. package/src/lib/server/person-eraser.js +149 -0
  346. package/src/lib/server/person-eraser.js.map +1 -0
  347. package/src/lib/server/person-records.d.ts +69 -0
  348. package/src/lib/server/person-records.js +317 -0
  349. package/src/lib/server/person-records.js.map +1 -0
  350. package/src/lib/server/person-refund.d.ts +97 -0
  351. package/src/lib/server/person-refund.js +221 -0
  352. package/src/lib/server/person-refund.js.map +1 -0
  353. package/src/lib/server/picklist-values.d.ts +21 -0
  354. package/src/lib/server/picklist-values.js +308 -0
  355. package/src/lib/server/picklist-values.js.map +1 -0
  356. package/src/lib/server/read-picklist.d.ts +44 -0
  357. package/src/lib/server/read-picklist.js +65 -0
  358. package/src/lib/server/read-picklist.js.map +1 -0
  359. package/src/lib/server/recipe-routes.js +15 -7
  360. package/src/lib/server/recipe-routes.js.map +1 -1
  361. package/src/lib/server/record-email-state.js +7 -1
  362. package/src/lib/server/record-email-state.js.map +1 -1
  363. package/src/lib/server/record-facts.d.ts +3 -0
  364. package/src/lib/server/record-facts.js +233 -31
  365. package/src/lib/server/record-facts.js.map +1 -1
  366. package/src/lib/server/record-origin.d.ts +27 -0
  367. package/src/lib/server/record-origin.js +104 -0
  368. package/src/lib/server/record-origin.js.map +1 -0
  369. package/src/lib/server/record-timeline.js +15 -2
  370. package/src/lib/server/record-timeline.js.map +1 -1
  371. package/src/lib/server/suite-gate.js +4 -3
  372. package/src/lib/server/suite-gate.js.map +1 -1
  373. package/src/lib/server/task-routes.js +30 -16
  374. package/src/lib/server/task-routes.js.map +1 -1
  375. package/src/lib/server-deal-stage.d.ts +5 -1
  376. package/src/lib/server-deal-stage.js +10 -5
  377. package/src/lib/server-deal-stage.js.map +1 -1
  378. package/src/lib/server.d.ts +8 -3
  379. package/src/lib/server.js +47 -43
  380. package/src/lib/server.js.map +1 -1
  381. package/src/lib/testing/memory-firestore.d.ts +55 -0
  382. package/src/lib/testing/memory-firestore.js +335 -0
  383. package/src/lib/testing/memory-firestore.js.map +1 -0
  384. package/src/lib/testing/stand-in-email-send-index.d.ts +25 -0
  385. package/src/lib/testing/stand-in-email-send-index.js +49 -0
  386. package/src/lib/testing/stand-in-email-send-index.js.map +1 -0
  387. package/src/lib/transfer/activities.d.ts +30 -0
  388. package/src/lib/transfer/activities.js +132 -0
  389. package/src/lib/transfer/activities.js.map +1 -0
  390. package/src/lib/transfer/aliases.d.ts +22 -0
  391. package/src/lib/transfer/aliases.js +1342 -0
  392. package/src/lib/transfer/aliases.js.map +1 -0
  393. package/src/lib/transfer/common.d.ts +222 -0
  394. package/src/lib/transfer/common.js +832 -0
  395. package/src/lib/transfer/common.js.map +1 -0
  396. package/src/lib/transfer/companies.d.ts +43 -0
  397. package/src/lib/transfer/companies.js +549 -0
  398. package/src/lib/transfer/companies.js.map +1 -0
  399. package/src/lib/transfer/contacts.d.ts +31 -0
  400. package/src/lib/transfer/contacts.js +727 -0
  401. package/src/lib/transfer/contacts.js.map +1 -0
  402. package/src/lib/transfer/deals.d.ts +66 -0
  403. package/src/lib/transfer/deals.js +698 -0
  404. package/src/lib/transfer/deals.js.map +1 -0
  405. package/src/lib/transfer/email-templates-package.d.ts +40 -0
  406. package/src/lib/transfer/email-templates-package.js +76 -0
  407. package/src/lib/transfer/email-templates-package.js.map +1 -0
  408. package/src/lib/transfer/email-templates-package.server.d.ts +32 -0
  409. package/src/lib/transfer/email-templates-package.server.js +176 -0
  410. package/src/lib/transfer/email-templates-package.server.js.map +1 -0
  411. package/src/lib/transfer/fields.d.ts +102 -0
  412. package/src/lib/transfer/fields.js +1755 -0
  413. package/src/lib/transfer/fields.js.map +1 -0
  414. package/src/lib/transfer/leads.d.ts +30 -0
  415. package/src/lib/transfer/leads.js +582 -0
  416. package/src/lib/transfer/leads.js.map +1 -0
  417. package/src/lib/transfer/pipelines.d.ts +21 -0
  418. package/src/lib/transfer/pipelines.js +172 -0
  419. package/src/lib/transfer/pipelines.js.map +1 -0
  420. package/src/lib/transfer/register.d.ts +47 -0
  421. package/src/lib/transfer/register.js +277 -0
  422. package/src/lib/transfer/register.js.map +1 -0
  423. package/src/lib/transfer/tasks.d.ts +30 -0
  424. package/src/lib/transfer/tasks.js +418 -0
  425. package/src/lib/transfer/tasks.js.map +1 -0
  426. package/src/lib/transfer/ui.d.ts +20 -0
  427. package/src/lib/transfer/ui.js +42 -0
  428. package/src/lib/transfer/ui.js.map +1 -0
  429. package/src/lib/components/company-import-drawer.d.ts +0 -42
  430. package/src/lib/components/company-import-drawer.js +0 -99
  431. package/src/lib/components/company-import-drawer.js.map +0 -1
  432. package/src/lib/components/contact-import-drawer.d.ts +0 -46
  433. package/src/lib/components/contact-import-drawer.js +0 -149
  434. package/src/lib/components/contact-import-drawer.js.map +0 -1
  435. package/src/lib/components/crm-export-all-button.d.ts +0 -39
  436. package/src/lib/components/crm-export-all-button.js +0 -98
  437. package/src/lib/components/crm-export-all-button.js.map +0 -1
  438. package/src/lib/components/csv-import-drawer.d.ts +0 -139
  439. package/src/lib/components/csv-import-drawer.js +0 -757
  440. package/src/lib/components/csv-import-drawer.js.map +0 -1
  441. package/src/lib/components/deal-import-drawer.d.ts +0 -24
  442. package/src/lib/components/deal-import-drawer.js +0 -83
  443. package/src/lib/components/deal-import-drawer.js.map +0 -1
  444. package/src/lib/components/lead-import-drawer.d.ts +0 -27
  445. package/src/lib/components/lead-import-drawer.js +0 -118
  446. package/src/lib/components/lead-import-drawer.js.map +0 -1
  447. package/src/lib/components/lead-source-values-card.d.ts +0 -27
  448. package/src/lib/components/lead-source-values-card.js.map +0 -1
  449. package/src/lib/components/task-import-drawer.d.ts +0 -24
  450. package/src/lib/components/task-import-drawer.js +0 -82
  451. package/src/lib/components/task-import-drawer.js.map +0 -1
  452. package/src/lib/model/companies-csv.d.ts +0 -36
  453. package/src/lib/model/companies-csv.js +0 -38
  454. package/src/lib/model/companies-csv.js.map +0 -1
  455. package/src/lib/model/contacts-csv.d.ts +0 -54
  456. package/src/lib/model/contacts-csv.js +0 -67
  457. package/src/lib/model/contacts-csv.js.map +0 -1
  458. package/src/lib/model/crm-company-import.d.ts +0 -154
  459. package/src/lib/model/crm-company-import.js +0 -331
  460. package/src/lib/model/crm-company-import.js.map +0 -1
  461. package/src/lib/model/crm-csv.d.ts +0 -239
  462. package/src/lib/model/crm-csv.js +0 -467
  463. package/src/lib/model/crm-csv.js.map +0 -1
  464. package/src/lib/model/crm-deal-import.d.ts +0 -112
  465. package/src/lib/model/crm-deal-import.js +0 -263
  466. package/src/lib/model/crm-deal-import.js.map +0 -1
  467. package/src/lib/model/crm-import.d.ts +0 -250
  468. package/src/lib/model/crm-import.js +0 -467
  469. package/src/lib/model/crm-import.js.map +0 -1
  470. package/src/lib/model/crm-lead-import.d.ts +0 -138
  471. package/src/lib/model/crm-lead-import.js +0 -446
  472. package/src/lib/model/crm-lead-import.js.map +0 -1
  473. package/src/lib/model/crm-task-import.d.ts +0 -94
  474. package/src/lib/model/crm-task-import.js +0 -275
  475. package/src/lib/model/crm-task-import.js.map +0 -1
  476. package/src/lib/model/deals-csv.d.ts +0 -32
  477. package/src/lib/model/deals-csv.js +0 -36
  478. package/src/lib/model/deals-csv.js.map +0 -1
  479. package/src/lib/model/import-column-shapes.d.ts +0 -36
  480. package/src/lib/model/import-column-shapes.js +0 -76
  481. package/src/lib/model/import-column-shapes.js.map +0 -1
  482. package/src/lib/model/lead-source-values.d.ts +0 -82
  483. package/src/lib/model/lead-source-values.js +0 -149
  484. package/src/lib/model/lead-source-values.js.map +0 -1
  485. package/src/lib/model/leads-csv.d.ts +0 -40
  486. package/src/lib/model/leads-csv.js +0 -40
  487. package/src/lib/model/leads-csv.js.map +0 -1
  488. package/src/lib/model/tasks-csv.d.ts +0 -28
  489. package/src/lib/model/tasks-csv.js +0 -28
  490. package/src/lib/model/tasks-csv.js.map +0 -1
  491. package/src/lib/server/companies-import.d.ts +0 -57
  492. package/src/lib/server/companies-import.js +0 -242
  493. package/src/lib/server/companies-import.js.map +0 -1
  494. package/src/lib/server/contacts-import.d.ts +0 -109
  495. package/src/lib/server/contacts-import.js +0 -393
  496. package/src/lib/server/contacts-import.js.map +0 -1
  497. package/src/lib/server/deals-import.d.ts +0 -76
  498. package/src/lib/server/deals-import.js +0 -248
  499. package/src/lib/server/deals-import.js.map +0 -1
  500. package/src/lib/server/export-route.d.ts +0 -60
  501. package/src/lib/server/export-route.js +0 -447
  502. package/src/lib/server/export-route.js.map +0 -1
  503. package/src/lib/server/import-context.d.ts +0 -87
  504. package/src/lib/server/import-context.js +0 -182
  505. package/src/lib/server/import-context.js.map +0 -1
  506. package/src/lib/server/lead-source-values.d.ts +0 -50
  507. package/src/lib/server/lead-source-values.js +0 -191
  508. package/src/lib/server/lead-source-values.js.map +0 -1
  509. package/src/lib/server/leads-import.d.ts +0 -84
  510. package/src/lib/server/leads-import.js +0 -367
  511. package/src/lib/server/leads-import.js.map +0 -1
  512. package/src/lib/server/tasks-import.d.ts +0 -54
  513. package/src/lib/server/tasks-import.js +0 -160
  514. package/src/lib/server/tasks-import.js.map +0 -1
@@ -16,11 +16,12 @@
16
16
  */ 'use client';
17
17
  import { _ as _extends } from "@swc/helpers/_/_extends";
18
18
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
- import { CONTACT_LIFECYCLE_STAGE_LABELS, CONTACT_LIFECYCLE_STAGES, CRM_LEAD_STATUS_LABELS, CRM_LEAD_STATUSES, crmMemberPickerLabel } from "@aglyn/aglyn";
19
+ import { CONTACT_LIFECYCLE_STAGE_LABELS, CONTACT_LIFECYCLE_STAGES, CRM_LEAD_SOURCE_PICKLIST, CRM_LEAD_STATUSES, STANDARD_CRM_LEAD_STATUS_PICKLIST, crmLeadStatusLabelFor, crmMemberPickerLabel, crmPicklistDefinition, crmPicklistOptions, groupPicklistOptions } from "@aglyn/aglyn";
20
20
  import { hostIdsFromScope, ORG_SCOPE_TOKEN } from "@aglyn/aglyn/app-utils/scope-tokens";
21
- import { Button, Checkbox, Drawer, FormControl, FormControlLabel, FormGroup, FormHelperText, FormLabel, MenuItem, Radio, RadioGroup, Stack, Switch, TextField, Typography } from "@mui/material";
22
- import { useEffect, useState } from "react";
21
+ import { Button, Checkbox, Drawer, FormControl, FormControlLabel, FormGroup, FormHelperText, FormLabel, ListSubheader, MenuItem, Radio, RadioGroup, Stack, Switch, TextField, Typography } from "@mui/material";
22
+ import { useEffect, useMemo, useState } from "react";
23
23
  import { CRM_SHARING_CRITERIA_FOR, CRM_SHARING_OBJECT_LABELS, CRM_SHARING_OBJECTS } from "../model/crm-sharing.js";
24
+ import { LEAD_SOURCE_DIRECTION_LABELS, LEAD_SOURCE_DIRECTIONS, STANDARD_LEAD_SOURCES } from "../model/lead-source-direction.js";
24
25
  const splitList = (text)=>[
25
26
  ...new Set(text.split(',').map((entry)=>entry.trim()).filter(Boolean))
26
27
  ].slice(0, 20);
@@ -29,12 +30,15 @@ const splitList = (text)=>[
29
30
  * sites that captured them, optional criteria), SHARED WITH (sites, or all
30
31
  * sites), and ACCESS (read-only unless edit is chosen).
31
32
  */ export function SharingRuleDrawer(props) {
33
+ var _props_leadSourceList;
32
34
  const { open, onClose, rule, sites, members, campaigns, busy, onSubmit } = props;
35
+ const leadSourceList = (_props_leadSourceList = props.leadSourceList) != null ? _props_leadSourceList : STANDARD_LEAD_SOURCES;
33
36
  const [name, setName] = useState('');
34
37
  const [object, setObject] = useState('leads');
35
38
  const [enabled, setEnabled] = useState(true);
36
39
  const [sourceHostIds, setSourceHostIds] = useState([]);
37
- const [leadSources, setLeadSources] = useState('');
40
+ const [leadSources, setLeadSources] = useState([]);
41
+ const [leadSourceGroups, setLeadSourceGroups] = useState([]);
38
42
  const [tags, setTags] = useState('');
39
43
  const [stages, setStages] = useState([]);
40
44
  const [ownerUids, setOwnerUids] = useState([]);
@@ -43,38 +47,80 @@ const splitList = (text)=>[
43
47
  const [targets, setTargets] = useState([]);
44
48
  const [access, setAccess] = useState('read');
45
49
  useEffect(()=>{
46
- var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9;
50
+ var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _ref10;
47
51
  if (!open) return;
48
52
  setName((_ref = rule == null ? void 0 : rule.name) != null ? _ref : '');
49
53
  setObject((_ref1 = rule == null ? void 0 : rule.object) != null ? _ref1 : 'leads');
50
54
  setEnabled((_ref2 = rule == null ? void 0 : rule.enabled) != null ? _ref2 : true);
51
55
  setSourceHostIds((_ref3 = rule == null ? void 0 : rule.sourceHostIds) != null ? _ref3 : []);
52
- setLeadSources(((_ref4 = rule == null ? void 0 : rule.criteria.leadSources) != null ? _ref4 : []).join(', '));
53
- setTags(((_ref5 = rule == null ? void 0 : rule.criteria.tags) != null ? _ref5 : []).join(', '));
54
- setStages((_ref6 = rule == null ? void 0 : rule.criteria.stages) != null ? _ref6 : []);
55
- setOwnerUids((_ref7 = rule == null ? void 0 : rule.criteria.ownerUids) != null ? _ref7 : []);
56
- setCampaignIds((_ref8 = rule == null ? void 0 : rule.criteria.campaignIds) != null ? _ref8 : []);
56
+ setLeadSources((_ref4 = rule == null ? void 0 : rule.criteria.leadSources) != null ? _ref4 : []);
57
+ setLeadSourceGroups((_ref5 = rule == null ? void 0 : rule.criteria.leadSourceGroups) != null ? _ref5 : []);
58
+ setTags(((_ref6 = rule == null ? void 0 : rule.criteria.tags) != null ? _ref6 : []).join(', '));
59
+ setStages((_ref7 = rule == null ? void 0 : rule.criteria.stages) != null ? _ref7 : []);
60
+ setOwnerUids((_ref8 = rule == null ? void 0 : rule.criteria.ownerUids) != null ? _ref8 : []);
61
+ setCampaignIds((_ref9 = rule == null ? void 0 : rule.criteria.campaignIds) != null ? _ref9 : []);
57
62
  setAllSites(rule ? rule.targets.includes(ORG_SCOPE_TOKEN) : true);
58
63
  setTargets(rule ? hostIdsFromScope(rule.targets) : []);
59
- setAccess((_ref9 = rule == null ? void 0 : rule.access) != null ? _ref9 : 'read');
64
+ setAccess((_ref10 = rule == null ? void 0 : rule.access) != null ? _ref10 : 'read');
60
65
  }, [
61
66
  open,
62
67
  rule
63
68
  ]);
64
69
  const offers = CRM_SHARING_CRITERIA_FOR[object];
65
- const stageOptions = object === 'leads' ? CRM_LEAD_STATUSES.map((value)=>({
70
+ const stageOptions = object === 'leads' ? CRM_LEAD_STATUSES.map((value)=>{
71
+ var _props_leadStatusList;
72
+ return {
66
73
  value,
67
- label: CRM_LEAD_STATUS_LABELS[value]
68
- })) : object === 'contacts' ? CONTACT_LIFECYCLE_STAGES.map((value)=>({
74
+ label: crmLeadStatusLabelFor((_props_leadStatusList = props.leadStatusList) != null ? _props_leadStatusList : STANDARD_CRM_LEAD_STATUS_PICKLIST, value)
75
+ };
76
+ }) : object === 'contacts' ? CONTACT_LIFECYCLE_STAGES.map((value)=>({
69
77
  value,
70
78
  label: CONTACT_LIFECYCLE_STAGE_LABELS[value]
71
79
  })) : [];
72
80
  const canSubmit = !busy && name.trim().length > 0 && (allSites || targets.length > 0);
81
+ /*
82
+ * The org's lead source values under their groups (AGL-3511), and every
83
+ * value the rule already names that the list no longer offers, so an
84
+ * edit shows what the rule matches until somebody changes it.
85
+ */ const leadSourceItems = useMemo(()=>{
86
+ var _ref;
87
+ var _crmPicklistDefinition;
88
+ const options = crmPicklistOptions(leadSourceList);
89
+ for (const label of leadSources){
90
+ if (!options.some((option)=>option.label.toLowerCase() === label.toLowerCase())) {
91
+ options.push({
92
+ label,
93
+ inactive: false,
94
+ unlisted: true
95
+ });
96
+ }
97
+ }
98
+ const groups = (_ref = (_crmPicklistDefinition = crmPicklistDefinition(CRM_LEAD_SOURCE_PICKLIST)) == null ? void 0 : _crmPicklistDefinition.groups) != null ? _ref : [];
99
+ return groupPicklistOptions(options, groups).flatMap((section)=>{
100
+ var _ref, _ref1;
101
+ var _section_group, _section_group1;
102
+ return [
103
+ /*#__PURE__*/ _jsx(ListSubheader, {
104
+ children: (_ref = (_section_group = section.group) == null ? void 0 : _section_group.label) != null ? _ref : 'No group'
105
+ }, `group:${(_ref1 = (_section_group1 = section.group) == null ? void 0 : _section_group1.id) != null ? _ref1 : ''}`),
106
+ ...section.options.map((option)=>/*#__PURE__*/ _jsx(MenuItem, {
107
+ value: option.label,
108
+ children: option.unlisted ? `${option.label} (not in the list)` : option.label
109
+ }, option.label))
110
+ ];
111
+ });
112
+ }, [
113
+ leadSourceList,
114
+ leadSources
115
+ ]);
73
116
  const submit = ()=>{
74
117
  if (!canSubmit) return;
75
118
  const criteria = {};
76
- if (offers.includes('leadSources') && splitList(leadSources).length) {
77
- criteria.leadSources = splitList(leadSources);
119
+ if (offers.includes('leadSources') && leadSources.length) {
120
+ criteria.leadSources = leadSources.slice(0, 20);
121
+ }
122
+ if (offers.includes('leadSourceGroups') && leadSourceGroups.length) {
123
+ criteria.leadSourceGroups = leadSourceGroups;
78
124
  }
79
125
  if (offers.includes('tags') && splitList(tags).length) {
80
126
  criteria.tags = splitList(tags).map((tag)=>tag.toLowerCase());
@@ -180,12 +226,55 @@ const splitList = (text)=>[
180
226
  }, site.id))
181
227
  }),
182
228
  offers.includes('leadSources') ? /*#__PURE__*/ _jsx(TextField, {
229
+ select: true,
183
230
  size: "small",
184
231
  label: "Lead source",
185
232
  value: leadSources,
186
- onChange: (event)=>setLeadSources(event.target.value),
187
- helperText: "Any of these, separated by commas. Blank for any source.",
188
- fullWidth: true
233
+ onChange: (event)=>{
234
+ const value = event.target.value;
235
+ setLeadSources(Array.isArray(value) ? value : String(value).split(','));
236
+ },
237
+ slotProps: {
238
+ select: {
239
+ multiple: true,
240
+ displayEmpty: true,
241
+ renderValue: (value)=>value.length ? value.join(', ') : 'Any'
242
+ },
243
+ inputLabel: {
244
+ shrink: true
245
+ }
246
+ },
247
+ fullWidth: true,
248
+ children: leadSourceItems
249
+ }) : null,
250
+ offers.includes('leadSourceGroups') ? /*#__PURE__*/ _jsx(TextField, {
251
+ select: true,
252
+ size: "small",
253
+ label: "Lead source direction",
254
+ value: leadSourceGroups,
255
+ onChange: (event)=>{
256
+ const value = event.target.value;
257
+ setLeadSourceGroups(Array.isArray(value) ? value : String(value).split(','));
258
+ },
259
+ slotProps: {
260
+ select: {
261
+ multiple: true,
262
+ displayEmpty: true,
263
+ renderValue: (value)=>value.length ? value.map((id)=>{
264
+ var _LEAD_SOURCE_DIRECTION_LABELS_id;
265
+ return (_LEAD_SOURCE_DIRECTION_LABELS_id = LEAD_SOURCE_DIRECTION_LABELS[id]) != null ? _LEAD_SOURCE_DIRECTION_LABELS_id : id;
266
+ }).join(', ') : 'Any'
267
+ },
268
+ inputLabel: {
269
+ shrink: true
270
+ }
271
+ },
272
+ helperText: "Matched through each lead source's group on the Fields page, as it stands when the rule runs.",
273
+ fullWidth: true,
274
+ children: LEAD_SOURCE_DIRECTIONS.map((direction)=>/*#__PURE__*/ _jsx(MenuItem, {
275
+ value: direction,
276
+ children: LEAD_SOURCE_DIRECTION_LABELS[direction]
277
+ }, direction))
189
278
  }) : null,
190
279
  offers.includes('tags') ? /*#__PURE__*/ _jsx(TextField, {
191
280
  size: "small",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/sharing-rule-drawer.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n CONTACT_LIFECYCLE_STAGE_LABELS,\n CONTACT_LIFECYCLE_STAGES,\n CRM_LEAD_STATUS_LABELS,\n CRM_LEAD_STATUSES,\n crmMemberPickerLabel,\n} from '@aglyn/aglyn'\nimport { hostIdsFromScope, ORG_SCOPE_TOKEN } from '@aglyn/aglyn/app-utils/scope-tokens'\nimport {\n Button,\n Checkbox,\n Drawer,\n FormControl,\n FormControlLabel,\n FormGroup,\n FormHelperText,\n FormLabel,\n MenuItem,\n Radio,\n RadioGroup,\n Stack,\n Switch,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useEffect, useState } from 'react'\nimport type { OrgMemberOption } from '../hooks/use-org-member-directory'\nimport {\n CRM_SHARING_CRITERIA_FOR,\n CRM_SHARING_OBJECT_LABELS,\n CRM_SHARING_OBJECTS,\n type CrmShareAccess,\n type CrmSharingCriteria,\n type CrmSharingObject,\n type CrmSharingRule,\n type CrmSharingSite,\n} from '../model/crm-sharing'\n\n/** What the drawer hands back: the rule as `crm/sharing` `rule-save` reads it. */\nexport interface SharingRuleDraft {\n id?: string\n name: string\n object: CrmSharingObject\n enabled: boolean\n sourceHostIds: string[]\n criteria: CrmSharingCriteria\n targets: 'all' | string[]\n access: CrmShareAccess\n}\n\nexport interface SharingRuleDrawerProps {\n open: boolean\n onClose: () => void\n /** The rule being edited, or `null` for a new one. */\n rule: CrmSharingRule | null\n sites: readonly CrmSharingSite[]\n members: readonly OrgMemberOption[]\n campaigns: readonly { value: string; label: string }[]\n busy: boolean\n onSubmit: (draft: SharingRuleDraft) => void\n}\n\nconst splitList = (text: string) =>\n [...new Set(text.split(',').map((entry) => entry.trim()).filter(Boolean))].slice(0, 20)\n\n/**\n * A sharing rule, three parts (AGL-3336): WHICH RECORDS (an object, the\n * sites that captured them, optional criteria), SHARED WITH (sites, or all\n * sites), and ACCESS (read-only unless edit is chosen).\n */\nexport function SharingRuleDrawer(props: SharingRuleDrawerProps) {\n const { open, onClose, rule, sites, members, campaigns, busy, onSubmit } = props\n const [name, setName] = useState('')\n const [object, setObject] = useState<CrmSharingObject>('leads')\n const [enabled, setEnabled] = useState(true)\n const [sourceHostIds, setSourceHostIds] = useState<string[]>([])\n const [leadSources, setLeadSources] = useState('')\n const [tags, setTags] = useState('')\n const [stages, setStages] = useState<string[]>([])\n const [ownerUids, setOwnerUids] = useState<string[]>([])\n const [campaignIds, setCampaignIds] = useState<string[]>([])\n const [allSites, setAllSites] = useState(true)\n const [targets, setTargets] = useState<string[]>([])\n const [access, setAccess] = useState<CrmShareAccess>('read')\n\n useEffect(() => {\n if (!open) return\n setName(rule?.name ?? '')\n setObject(rule?.object ?? 'leads')\n setEnabled(rule?.enabled ?? true)\n setSourceHostIds(rule?.sourceHostIds ?? [])\n setLeadSources((rule?.criteria.leadSources ?? []).join(', '))\n setTags((rule?.criteria.tags ?? []).join(', '))\n setStages(rule?.criteria.stages ?? [])\n setOwnerUids(rule?.criteria.ownerUids ?? [])\n setCampaignIds(rule?.criteria.campaignIds ?? [])\n setAllSites(rule ? rule.targets.includes(ORG_SCOPE_TOKEN) : true)\n setTargets(rule ? hostIdsFromScope(rule.targets) : [])\n setAccess(rule?.access ?? 'read')\n }, [open, rule])\n\n const offers = CRM_SHARING_CRITERIA_FOR[object]\n const stageOptions: { value: string; label: string }[] =\n object === 'leads'\n ? CRM_LEAD_STATUSES.map((value) => ({ value, label: CRM_LEAD_STATUS_LABELS[value] }))\n : object === 'contacts'\n ? CONTACT_LIFECYCLE_STAGES.map((value) => ({\n value,\n label: CONTACT_LIFECYCLE_STAGE_LABELS[value],\n }))\n : []\n const canSubmit =\n !busy && name.trim().length > 0 && (allSites || targets.length > 0)\n\n const submit = () => {\n if (!canSubmit) return\n const criteria: CrmSharingCriteria = {}\n if (offers.includes('leadSources') && splitList(leadSources).length) {\n criteria.leadSources = splitList(leadSources)\n }\n if (offers.includes('tags') && splitList(tags).length) {\n criteria.tags = splitList(tags).map((tag) => tag.toLowerCase())\n }\n if (stageOptions.length && stages.length) criteria.stages = stages\n if (offers.includes('ownerUids') && ownerUids.length) criteria.ownerUids = ownerUids\n if (offers.includes('campaignIds') && campaignIds.length) criteria.campaignIds = campaignIds\n onSubmit({\n ...(rule ? { id: rule.id } : {}),\n name: name.trim(),\n object,\n enabled,\n sourceHostIds,\n criteria,\n targets: allSites ? 'all' : targets,\n access,\n })\n }\n\n const siteName = (id: string) => sites.find((site) => site.id === id)?.name ?? id\n return (\n <Drawer anchor=\"right\" open={open} onClose={busy ? undefined : onClose}>\n <Stack spacing={2} sx={{ width: 400, maxWidth: '100vw', p: 3 }}>\n <Typography variant=\"h6\">{rule ? 'Edit sharing rule' : 'New sharing rule'}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Shares every record the rule matches — the ones you already have, and every one ' +\n 'captured or changed from now on. Sharing lets a site see and work a record; it ' +\n 'never shares the person’s consent.'}\n </Typography>\n <TextField\n size=\"small\"\n label=\"Name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n slotProps={{ htmlInput: { maxLength: 120 } }}\n required\n fullWidth\n />\n <FormLabel>{'Which records'}</FormLabel>\n <TextField\n select\n size=\"small\"\n label=\"Records\"\n value={object}\n onChange={(event) => {\n setObject(event.target.value as CrmSharingObject)\n setStages([])\n }}\n disabled={Boolean(rule)}\n helperText={rule ? 'A rule keeps the kind of record it was made for.' : undefined}\n fullWidth\n >\n {CRM_SHARING_OBJECTS.map((option) => (\n <MenuItem key={option} value={option}>\n {CRM_SHARING_OBJECT_LABELS[option].many}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n select\n size=\"small\"\n label=\"Captured on\"\n value={sourceHostIds}\n onChange={(event) => {\n const value = event.target.value as unknown\n setSourceHostIds(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length ? (value as string[]).map(siteName).join(', ') : 'Any site',\n },\n inputLabel: { shrink: true },\n }}\n helperText=\"The sites the record was captured or created on.\"\n fullWidth\n >\n {sites.map((site) => (\n <MenuItem key={site.id} value={site.id}>\n {site.name}\n </MenuItem>\n ))}\n </TextField>\n {offers.includes('leadSources') ? (\n <TextField\n size=\"small\"\n label=\"Lead source\"\n value={leadSources}\n onChange={(event) => setLeadSources(event.target.value)}\n helperText=\"Any of these, separated by commas. Blank for any source.\"\n fullWidth\n />\n ) : null}\n {offers.includes('tags') ? (\n <TextField\n size=\"small\"\n label=\"Tags\"\n value={tags}\n onChange={(event) => setTags(event.target.value)}\n helperText=\"Any of these, separated by commas. Blank for any tags.\"\n fullWidth\n />\n ) : null}\n {stageOptions.length ? (\n <TextField\n select\n size=\"small\"\n label={object === 'leads' ? 'Status' : 'Lifecycle stage'}\n value={stages}\n onChange={(event) => {\n const value = event.target.value as unknown\n setStages(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((id) => stageOptions.find((option) => option.value === id)?.label ?? id)\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {stageOptions.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {offers.includes('campaignIds') && campaigns.length ? (\n <TextField\n select\n size=\"small\"\n label=\"Campaign\"\n value={campaignIds}\n onChange={(event) => {\n const value = event.target.value as unknown\n setCampaignIds(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((id) => campaigns.find((option) => option.value === id)?.label ?? id)\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {campaigns.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n <TextField\n select\n size=\"small\"\n label=\"Owner\"\n value={ownerUids}\n onChange={(event) => {\n const value = event.target.value as unknown\n setOwnerUids(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((uid) => {\n const member = members.find((entry) => entry.uid === uid)\n return member ? crmMemberPickerLabel(member) : uid\n })\n .join(', ')\n : 'Anyone',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {members.map((member) => (\n <MenuItem key={member.uid} value={member.uid}>\n {crmMemberPickerLabel(member)}\n </MenuItem>\n ))}\n </TextField>\n <FormControl>\n <FormLabel>{'Shared with'}</FormLabel>\n <FormGroup>\n <FormControlLabel\n control={\n <Checkbox checked={allSites} onChange={(event) => setAllSites(event.target.checked)} />\n }\n label=\"All sites, including sites added later\"\n />\n {sites.map((site) => (\n <FormControlLabel\n key={site.id}\n control={\n <Checkbox\n checked={allSites || targets.includes(site.id)}\n disabled={allSites}\n onChange={(event) =>\n setTargets((current) =>\n event.target.checked\n ? [...current, site.id]\n : current.filter((id) => id !== site.id),\n )\n }\n />\n }\n label={site.name}\n />\n ))}\n </FormGroup>\n </FormControl>\n <FormControl>\n <FormLabel>{'Access'}</FormLabel>\n <RadioGroup\n value={access}\n onChange={(event) => setAccess(event.target.value === 'edit' ? 'edit' : 'read')}\n >\n <FormControlLabel value=\"read\" control={<Radio size=\"small\" />} label=\"Read-only\" />\n <FormControlLabel value=\"edit\" control={<Radio size=\"small\" />} label=\"Read and edit\" />\n </RadioGroup>\n </FormControl>\n <FormControlLabel\n control={<Switch checked={enabled} onChange={(event) => setEnabled(event.target.checked)} />}\n label=\"On\"\n />\n {!enabled ? (\n <FormHelperText>{'Off keeps the rule and takes away what it shared.'}</FormHelperText>\n ) : null}\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"contained\" disabled={!canSubmit} onClick={submit}>\n {rule ? 'Save rule' : 'Add rule'}\n </Button>\n <Button onClick={onClose} disabled={busy}>\n {'Cancel'}\n </Button>\n </Stack>\n </Stack>\n </Drawer>\n )\n}\nSharingRuleDrawer.displayName = 'SharingRuleDrawer'\n\nexport default SharingRuleDrawer\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","CONTACT_LIFECYCLE_STAGES","CRM_LEAD_STATUS_LABELS","CRM_LEAD_STATUSES","crmMemberPickerLabel","hostIdsFromScope","ORG_SCOPE_TOKEN","Button","Checkbox","Drawer","FormControl","FormControlLabel","FormGroup","FormHelperText","FormLabel","MenuItem","Radio","RadioGroup","Stack","Switch","TextField","Typography","useEffect","useState","CRM_SHARING_CRITERIA_FOR","CRM_SHARING_OBJECT_LABELS","CRM_SHARING_OBJECTS","splitList","text","Set","split","map","entry","trim","filter","Boolean","slice","SharingRuleDrawer","props","open","onClose","rule","sites","members","campaigns","busy","onSubmit","name","setName","object","setObject","enabled","setEnabled","sourceHostIds","setSourceHostIds","leadSources","setLeadSources","tags","setTags","stages","setStages","ownerUids","setOwnerUids","campaignIds","setCampaignIds","allSites","setAllSites","targets","setTargets","access","setAccess","criteria","join","includes","offers","stageOptions","value","label","canSubmit","length","submit","tag","toLowerCase","id","siteName","find","site","anchor","undefined","spacing","sx","width","maxWidth","p","variant","color","size","onChange","event","target","slotProps","htmlInput","maxLength","required","fullWidth","select","disabled","helperText","option","many","Array","isArray","String","multiple","displayEmpty","renderValue","inputLabel","shrink","uid","member","control","checked","current","direction","onClick","displayName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/sharing-rule-drawer.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n CONTACT_LIFECYCLE_STAGE_LABELS,\n CONTACT_LIFECYCLE_STAGES,\n CRM_LEAD_SOURCE_PICKLIST,\n CRM_LEAD_STATUSES,\n type CrmPicklist,\n STANDARD_CRM_LEAD_STATUS_PICKLIST,\n crmLeadStatusLabelFor,\n crmMemberPickerLabel,\n crmPicklistDefinition,\n crmPicklistOptions,\n groupPicklistOptions,\n} from '@aglyn/aglyn'\nimport { hostIdsFromScope, ORG_SCOPE_TOKEN } from '@aglyn/aglyn/app-utils/scope-tokens'\nimport {\n Button,\n Checkbox,\n Drawer,\n FormControl,\n FormControlLabel,\n FormGroup,\n FormHelperText,\n FormLabel,\n ListSubheader,\n MenuItem,\n Radio,\n RadioGroup,\n Stack,\n Switch,\n TextField,\n Typography,\n} from '@mui/material'\nimport { type ReactNode, useEffect, useMemo, useState } from 'react'\nimport type { OrgMemberOption } from '../hooks/use-org-member-directory'\nimport {\n CRM_SHARING_CRITERIA_FOR,\n CRM_SHARING_OBJECT_LABELS,\n CRM_SHARING_OBJECTS,\n type CrmShareAccess,\n type CrmSharingCriteria,\n type CrmSharingObject,\n type CrmSharingRule,\n type CrmSharingSite,\n} from '../model/crm-sharing'\nimport {\n LEAD_SOURCE_DIRECTION_LABELS,\n LEAD_SOURCE_DIRECTIONS,\n STANDARD_LEAD_SOURCES,\n} from '../model/lead-source-direction'\n\n/** What the drawer hands back: the rule as `crm/sharing` `rule-save` reads it. */\nexport interface SharingRuleDraft {\n id?: string\n name: string\n object: CrmSharingObject\n enabled: boolean\n sourceHostIds: string[]\n criteria: CrmSharingCriteria\n targets: 'all' | string[]\n access: CrmShareAccess\n}\n\nexport interface SharingRuleDrawerProps {\n open: boolean\n onClose: () => void\n /** The rule being edited, or `null` for a new one. */\n rule: CrmSharingRule | null\n sites: readonly CrmSharingSite[]\n members: readonly OrgMemberOption[]\n campaigns: readonly { value: string; label: string }[]\n /** The org's Lead source list, which the Lead source criterion picks from. */\n leadSourceList?: CrmPicklist\n /** The org's Lead status list, whose labels name the statuses a rule matches (AGL-3512). */\n leadStatusList?: CrmPicklist\n busy: boolean\n onSubmit: (draft: SharingRuleDraft) => void\n}\n\nconst splitList = (text: string) =>\n [...new Set(text.split(',').map((entry) => entry.trim()).filter(Boolean))].slice(0, 20)\n\n/**\n * A sharing rule, three parts (AGL-3336): WHICH RECORDS (an object, the\n * sites that captured them, optional criteria), SHARED WITH (sites, or all\n * sites), and ACCESS (read-only unless edit is chosen).\n */\nexport function SharingRuleDrawer(props: SharingRuleDrawerProps) {\n const { open, onClose, rule, sites, members, campaigns, busy, onSubmit } = props\n const leadSourceList = props.leadSourceList ?? STANDARD_LEAD_SOURCES\n const [name, setName] = useState('')\n const [object, setObject] = useState<CrmSharingObject>('leads')\n const [enabled, setEnabled] = useState(true)\n const [sourceHostIds, setSourceHostIds] = useState<string[]>([])\n const [leadSources, setLeadSources] = useState<string[]>([])\n const [leadSourceGroups, setLeadSourceGroups] = useState<string[]>([])\n const [tags, setTags] = useState('')\n const [stages, setStages] = useState<string[]>([])\n const [ownerUids, setOwnerUids] = useState<string[]>([])\n const [campaignIds, setCampaignIds] = useState<string[]>([])\n const [allSites, setAllSites] = useState(true)\n const [targets, setTargets] = useState<string[]>([])\n const [access, setAccess] = useState<CrmShareAccess>('read')\n\n useEffect(() => {\n if (!open) return\n setName(rule?.name ?? '')\n setObject(rule?.object ?? 'leads')\n setEnabled(rule?.enabled ?? true)\n setSourceHostIds(rule?.sourceHostIds ?? [])\n setLeadSources(rule?.criteria.leadSources ?? [])\n setLeadSourceGroups(rule?.criteria.leadSourceGroups ?? [])\n setTags((rule?.criteria.tags ?? []).join(', '))\n setStages(rule?.criteria.stages ?? [])\n setOwnerUids(rule?.criteria.ownerUids ?? [])\n setCampaignIds(rule?.criteria.campaignIds ?? [])\n setAllSites(rule ? rule.targets.includes(ORG_SCOPE_TOKEN) : true)\n setTargets(rule ? hostIdsFromScope(rule.targets) : [])\n setAccess(rule?.access ?? 'read')\n }, [open, rule])\n\n const offers = CRM_SHARING_CRITERIA_FOR[object]\n const stageOptions: { value: string; label: string }[] =\n object === 'leads'\n ? // A rule matches the MEANING, named as the org names it.\n CRM_LEAD_STATUSES.map((value) => ({\n value,\n label: crmLeadStatusLabelFor(props.leadStatusList ?? STANDARD_CRM_LEAD_STATUS_PICKLIST, value),\n }))\n : object === 'contacts'\n ? CONTACT_LIFECYCLE_STAGES.map((value) => ({\n value,\n label: CONTACT_LIFECYCLE_STAGE_LABELS[value],\n }))\n : []\n const canSubmit =\n !busy && name.trim().length > 0 && (allSites || targets.length > 0)\n /*\n * The org's lead source values under their groups (AGL-3511), and every\n * value the rule already names that the list no longer offers, so an\n * edit shows what the rule matches until somebody changes it.\n */\n const leadSourceItems = useMemo<ReactNode[]>(() => {\n const options = crmPicklistOptions(leadSourceList)\n for (const label of leadSources) {\n if (!options.some((option) => option.label.toLowerCase() === label.toLowerCase())) {\n options.push({ label, inactive: false, unlisted: true })\n }\n }\n const groups = crmPicklistDefinition(CRM_LEAD_SOURCE_PICKLIST)?.groups ?? []\n return groupPicklistOptions(options, groups).flatMap((section) => [\n <ListSubheader key={`group:${section.group?.id ?? ''}`}>\n {section.group?.label ?? 'No group'}\n </ListSubheader>,\n ...section.options.map((option) => (\n <MenuItem key={option.label} value={option.label}>\n {option.unlisted ? `${option.label} (not in the list)` : option.label}\n </MenuItem>\n )),\n ])\n }, [leadSourceList, leadSources])\n\n const submit = () => {\n if (!canSubmit) return\n const criteria: CrmSharingCriteria = {}\n if (offers.includes('leadSources') && leadSources.length) {\n criteria.leadSources = leadSources.slice(0, 20)\n }\n if (offers.includes('leadSourceGroups') && leadSourceGroups.length) {\n criteria.leadSourceGroups = leadSourceGroups\n }\n if (offers.includes('tags') && splitList(tags).length) {\n criteria.tags = splitList(tags).map((tag) => tag.toLowerCase())\n }\n if (stageOptions.length && stages.length) criteria.stages = stages\n if (offers.includes('ownerUids') && ownerUids.length) criteria.ownerUids = ownerUids\n if (offers.includes('campaignIds') && campaignIds.length) criteria.campaignIds = campaignIds\n onSubmit({\n ...(rule ? { id: rule.id } : {}),\n name: name.trim(),\n object,\n enabled,\n sourceHostIds,\n criteria,\n targets: allSites ? 'all' : targets,\n access,\n })\n }\n\n const siteName = (id: string) => sites.find((site) => site.id === id)?.name ?? id\n return (\n <Drawer anchor=\"right\" open={open} onClose={busy ? undefined : onClose}>\n <Stack spacing={2} sx={{ width: 400, maxWidth: '100vw', p: 3 }}>\n <Typography variant=\"h6\">{rule ? 'Edit sharing rule' : 'New sharing rule'}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Shares every record the rule matches — the ones you already have, and every one ' +\n 'captured or changed from now on. Sharing lets a site see and work a record; it ' +\n 'never shares the person’s consent.'}\n </Typography>\n <TextField\n size=\"small\"\n label=\"Name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n slotProps={{ htmlInput: { maxLength: 120 } }}\n required\n fullWidth\n />\n <FormLabel>{'Which records'}</FormLabel>\n <TextField\n select\n size=\"small\"\n label=\"Records\"\n value={object}\n onChange={(event) => {\n setObject(event.target.value as CrmSharingObject)\n setStages([])\n }}\n disabled={Boolean(rule)}\n helperText={rule ? 'A rule keeps the kind of record it was made for.' : undefined}\n fullWidth\n >\n {CRM_SHARING_OBJECTS.map((option) => (\n <MenuItem key={option} value={option}>\n {CRM_SHARING_OBJECT_LABELS[option].many}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n select\n size=\"small\"\n label=\"Captured on\"\n value={sourceHostIds}\n onChange={(event) => {\n const value = event.target.value as unknown\n setSourceHostIds(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length ? (value as string[]).map(siteName).join(', ') : 'Any site',\n },\n inputLabel: { shrink: true },\n }}\n helperText=\"The sites the record was captured or created on.\"\n fullWidth\n >\n {sites.map((site) => (\n <MenuItem key={site.id} value={site.id}>\n {site.name}\n </MenuItem>\n ))}\n </TextField>\n {offers.includes('leadSources') ? (\n <TextField\n select\n size=\"small\"\n label=\"Lead source\"\n value={leadSources}\n onChange={(event) => {\n const value = event.target.value as unknown\n setLeadSources(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length ? (value as string[]).join(', ') : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {leadSourceItems}\n </TextField>\n ) : null}\n {offers.includes('leadSourceGroups') ? (\n <TextField\n select\n size=\"small\"\n label=\"Lead source direction\"\n value={leadSourceGroups}\n onChange={(event) => {\n const value = event.target.value as unknown\n setLeadSourceGroups(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map(\n (id) =>\n LEAD_SOURCE_DIRECTION_LABELS[id as keyof typeof LEAD_SOURCE_DIRECTION_LABELS] ?? id,\n )\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n helperText=\"Matched through each lead source's group on the Fields page, as it stands when the rule runs.\"\n fullWidth\n >\n {LEAD_SOURCE_DIRECTIONS.map((direction) => (\n <MenuItem key={direction} value={direction}>\n {LEAD_SOURCE_DIRECTION_LABELS[direction]}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {offers.includes('tags') ? (\n <TextField\n size=\"small\"\n label=\"Tags\"\n value={tags}\n onChange={(event) => setTags(event.target.value)}\n helperText=\"Any of these, separated by commas. Blank for any tags.\"\n fullWidth\n />\n ) : null}\n {stageOptions.length ? (\n <TextField\n select\n size=\"small\"\n label={object === 'leads' ? 'Status' : 'Lifecycle stage'}\n value={stages}\n onChange={(event) => {\n const value = event.target.value as unknown\n setStages(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((id) => stageOptions.find((option) => option.value === id)?.label ?? id)\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {stageOptions.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {offers.includes('campaignIds') && campaigns.length ? (\n <TextField\n select\n size=\"small\"\n label=\"Campaign\"\n value={campaignIds}\n onChange={(event) => {\n const value = event.target.value as unknown\n setCampaignIds(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((id) => campaigns.find((option) => option.value === id)?.label ?? id)\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {campaigns.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n <TextField\n select\n size=\"small\"\n label=\"Owner\"\n value={ownerUids}\n onChange={(event) => {\n const value = event.target.value as unknown\n setOwnerUids(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((uid) => {\n const member = members.find((entry) => entry.uid === uid)\n return member ? crmMemberPickerLabel(member) : uid\n })\n .join(', ')\n : 'Anyone',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {members.map((member) => (\n <MenuItem key={member.uid} value={member.uid}>\n {crmMemberPickerLabel(member)}\n </MenuItem>\n ))}\n </TextField>\n <FormControl>\n <FormLabel>{'Shared with'}</FormLabel>\n <FormGroup>\n <FormControlLabel\n control={\n <Checkbox checked={allSites} onChange={(event) => setAllSites(event.target.checked)} />\n }\n label=\"All sites, including sites added later\"\n />\n {sites.map((site) => (\n <FormControlLabel\n key={site.id}\n control={\n <Checkbox\n checked={allSites || targets.includes(site.id)}\n disabled={allSites}\n onChange={(event) =>\n setTargets((current) =>\n event.target.checked\n ? [...current, site.id]\n : current.filter((id) => id !== site.id),\n )\n }\n />\n }\n label={site.name}\n />\n ))}\n </FormGroup>\n </FormControl>\n <FormControl>\n <FormLabel>{'Access'}</FormLabel>\n <RadioGroup\n value={access}\n onChange={(event) => setAccess(event.target.value === 'edit' ? 'edit' : 'read')}\n >\n <FormControlLabel value=\"read\" control={<Radio size=\"small\" />} label=\"Read-only\" />\n <FormControlLabel value=\"edit\" control={<Radio size=\"small\" />} label=\"Read and edit\" />\n </RadioGroup>\n </FormControl>\n <FormControlLabel\n control={<Switch checked={enabled} onChange={(event) => setEnabled(event.target.checked)} />}\n label=\"On\"\n />\n {!enabled ? (\n <FormHelperText>{'Off keeps the rule and takes away what it shared.'}</FormHelperText>\n ) : null}\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"contained\" disabled={!canSubmit} onClick={submit}>\n {rule ? 'Save rule' : 'Add rule'}\n </Button>\n <Button onClick={onClose} disabled={busy}>\n {'Cancel'}\n </Button>\n </Stack>\n </Stack>\n </Drawer>\n )\n}\nSharingRuleDrawer.displayName = 'SharingRuleDrawer'\n\nexport default SharingRuleDrawer\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","CONTACT_LIFECYCLE_STAGES","CRM_LEAD_SOURCE_PICKLIST","CRM_LEAD_STATUSES","STANDARD_CRM_LEAD_STATUS_PICKLIST","crmLeadStatusLabelFor","crmMemberPickerLabel","crmPicklistDefinition","crmPicklistOptions","groupPicklistOptions","hostIdsFromScope","ORG_SCOPE_TOKEN","Button","Checkbox","Drawer","FormControl","FormControlLabel","FormGroup","FormHelperText","FormLabel","ListSubheader","MenuItem","Radio","RadioGroup","Stack","Switch","TextField","Typography","useEffect","useMemo","useState","CRM_SHARING_CRITERIA_FOR","CRM_SHARING_OBJECT_LABELS","CRM_SHARING_OBJECTS","LEAD_SOURCE_DIRECTION_LABELS","LEAD_SOURCE_DIRECTIONS","STANDARD_LEAD_SOURCES","splitList","text","Set","split","map","entry","trim","filter","Boolean","slice","SharingRuleDrawer","props","open","onClose","rule","sites","members","campaigns","busy","onSubmit","leadSourceList","name","setName","object","setObject","enabled","setEnabled","sourceHostIds","setSourceHostIds","leadSources","setLeadSources","leadSourceGroups","setLeadSourceGroups","tags","setTags","stages","setStages","ownerUids","setOwnerUids","campaignIds","setCampaignIds","allSites","setAllSites","targets","setTargets","access","setAccess","criteria","join","includes","offers","stageOptions","value","label","leadStatusList","canSubmit","length","leadSourceItems","options","some","option","toLowerCase","push","inactive","unlisted","groups","flatMap","section","group","id","submit","tag","siteName","find","site","anchor","undefined","spacing","sx","width","maxWidth","p","variant","color","size","onChange","event","target","slotProps","htmlInput","maxLength","required","fullWidth","select","disabled","helperText","many","Array","isArray","String","multiple","displayEmpty","renderValue","inputLabel","shrink","direction","uid","member","control","checked","current","onClick","displayName"],"mappings":"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"}
@@ -15,7 +15,7 @@
15
15
  * limitations under the License.
16
16
  */ 'use client';
17
17
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
- import { CONTACT_LIFECYCLE_STAGE_LABELS, CRM_LEAD_STATUS_LABELS, pluginDocsHelp } from "@aglyn/aglyn";
18
+ import { CONTACT_LIFECYCLE_STAGE_LABELS, crmLeadStatusLabelFor, isCrmLeadStatus, pluginDocsHelp } from "@aglyn/aglyn";
19
19
  import { mdiDeleteOutline, mdiPencilOutline, mdiRefresh } from "@aglyn/shared-data-mdi";
20
20
  import { CardDisplay, MdiIcon } from "@aglyn/shared-ui-jsx";
21
21
  import RowActionsMenu from "@aglyn/shared-ui-jsx/components/row-actions-menu.component";
@@ -26,6 +26,8 @@ import { Button, LinearProgress, Stack, TableBody, TableCell, TableHead, TableRo
26
26
  import { useCallback, useState } from "react";
27
27
  import { useCrmCampaigns } from "../hooks/use-crm-campaigns.js";
28
28
  import { useCrmSharingRules, useCrmSharingSites } from "../hooks/use-crm-sharing.js";
29
+ import { useLeadSourcePicklist } from "../hooks/use-lead-source-picklist.js";
30
+ import { useLeadStatusPicklist } from "../hooks/use-lead-status-picklist.js";
29
31
  import { useOrgMemberDirectory } from "../hooks/use-org-member-directory.js";
30
32
  import { CRM_SHARING_RULES_MAX, describeShareTargets, describeSharingRuleScope } from "../model/crm-sharing.js";
31
33
  import { callCrmSharing } from "../model/crm-sharing-api.js";
@@ -69,6 +71,10 @@ import { SharingRuleDrawer } from "./sharing-rule-drawer.js";
69
71
  }, {
70
72
  enabled: canManage
71
73
  });
74
+ // The values the Lead source criterion picks from, under their groups (AGL-3511).
75
+ const leadSources = useLeadSourcePicklist(canManage ? orgId : null);
76
+ // The org's names for the lead statuses a rule matches (AGL-3512).
77
+ const leadStatuses = useLeadStatusPicklist(orgId);
72
78
  const [editing, setEditing] = useState(null);
73
79
  const [drawerOpen, setDrawerOpen] = useState(false);
74
80
  const [busy, setBusy] = useState(false);
@@ -113,8 +119,8 @@ import { SharingRuleDrawer } from "./sharing-rule-drawer.js";
113
119
  }, draft.id ? 'Rule saved' : 'Rule added');
114
120
  const canEdit = ready && canManage && !busy;
115
121
  const stageLabel = (id)=>{
116
- var _ref, _CRM_LEAD_STATUS_LABELS_id;
117
- return (_ref = (_CRM_LEAD_STATUS_LABELS_id = CRM_LEAD_STATUS_LABELS[id]) != null ? _CRM_LEAD_STATUS_LABELS_id : CONTACT_LIFECYCLE_STAGE_LABELS[id]) != null ? _ref : id;
122
+ var _ref, _ref1;
123
+ return (_ref = (_ref1 = isCrmLeadStatus(id) ? crmLeadStatusLabelFor(leadStatuses.picklist, id) : null) != null ? _ref1 : CONTACT_LIFECYCLE_STAGE_LABELS[id]) != null ? _ref : id;
118
124
  };
119
125
  return /*#__PURE__*/ _jsxs(CardDisplay, {
120
126
  header: 'Sharing rules',
@@ -275,6 +281,8 @@ import { SharingRuleDrawer } from "./sharing-rule-drawer.js";
275
281
  sites: sites.sites,
276
282
  members: roster.members,
277
283
  campaigns: campaigns.options,
284
+ leadSourceList: leadSources.picklist,
285
+ leadStatusList: leadStatuses.picklist,
278
286
  busy: busy,
279
287
  onSubmit: save
280
288
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/sharing-rules-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 CONTACT_LIFECYCLE_STAGE_LABELS,\n type ContactLifecycleStage,\n CRM_LEAD_STATUS_LABELS,\n type CrmLeadStatus,\n pluginDocsHelp,\n} from '@aglyn/aglyn'\nimport { mdiDeleteOutline, mdiPencilOutline, mdiRefresh } from '@aglyn/shared-data-mdi'\nimport { CardDisplay, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport RowActionsMenu 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 { useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Button,\n LinearProgress,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { useCrmCampaigns } from '../hooks/use-crm-campaigns'\nimport { useCrmSharingRules, useCrmSharingSites } from '../hooks/use-crm-sharing'\nimport type { CrmOrgDoc } from '../hooks/use-crm-scope'\nimport { useOrgMemberDirectory } from '../hooks/use-org-member-directory'\nimport {\n CRM_SHARING_RULES_MAX,\n type CrmSharingAction,\n type CrmSharingRule,\n describeShareTargets,\n describeSharingRuleScope,\n} from '../model/crm-sharing'\nimport { callCrmSharing } from '../model/crm-sharing-api'\nimport { SharingRuleDrawer, type SharingRuleDraft } from './sharing-rule-drawer'\n\nexport interface SharingRulesCardProps {\n orgId: string | null\n org: CrmOrgDoc\n canManage: boolean\n ready: boolean\n}\n\n/** How far a rule's recompute has got, as the table shows it. */\nfunction runLabel(rule: CrmSharingRule): string {\n const run = rule.run\n if (rule.deleting) return 'Removing what it shared…'\n if (!run) return rule.enabled ? 'On' : 'Off'\n if (run.status === 'running') {\n return `${run.mode === 'remove' ? 'Removing' : 'Applying'} — ${run.processed} checked, ${run.changed} changed`\n }\n if (run.status === 'failed') return run.error ?? 'Stopped'\n return `${rule.enabled ? 'On' : 'Off'} — ${run.changed} ${run.changed === 1 ? 'record' : 'records'} changed`\n}\n\n/**\n * SHARING RULES — the organization's automated sharing (AGL-3336).\n *\n * A rule shares every record it matches with other sites: the existing ones\n * through a recompute that runs when the rule is saved, with its progress\n * on the row, and every later capture or change through the record-written\n * seam. The recompute runs in passes; the card keeps asking while the page\n * is open, and a rule whose run stopped offers Resume.\n *\n * Mounted at the organization level only: a rule is a fact about the org,\n * and its targets are the org's sites.\n */\nexport function SharingRulesCard(props: SharingRulesCardProps) {\n const { orgId, org, canManage, ready } = props\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const rules = useCrmSharingRules(org)\n const sites = useCrmSharingSites({ hostId: null, orgId, enabled: canManage })\n const roster = useOrgMemberDirectory(orgId)\n const campaigns = useCrmCampaigns({ hostId: null, orgId }, { enabled: canManage })\n const [editing, setEditing] = useState<CrmSharingRule | null>(null)\n const [drawerOpen, setDrawerOpen] = useState(false)\n const [busy, setBusy] = useState(false)\n const scope = orgId ? { orgId } : null\n\n /** One action, then `rule-continue` until the rule's run has nothing left. */\n const run = useCallback(\n async (action: CrmSharingAction, body: Record<string, unknown>, said: string) => {\n if (!scope) return\n setBusy(true)\n try {\n let answer = await callCrmSharing(user, scope, action, body)\n const ruleId = answer.rule?.id ?? String(body['ruleId'] ?? '')\n while (answer.more && ruleId) {\n answer = await callCrmSharing(user, scope, 'rule-continue', { ruleId })\n }\n enqueueSnackbar(said, { variant: 'success', persist: false })\n setDrawerOpen(false)\n } catch (error) {\n enqueueSnackbar((error as Error).message, { variant: 'error', allowDuplicate: true })\n } finally {\n setBusy(false)\n }\n },\n // `scope` is rebuilt from `orgId` every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [user, orgId, enqueueSnackbar],\n )\n\n const save = (draft: SharingRuleDraft) =>\n void run('rule-save', { rule: draft }, draft.id ? 'Rule saved' : 'Rule added')\n\n const canEdit = ready && canManage && !busy\n const stageLabel = (id: string) =>\n CRM_LEAD_STATUS_LABELS[id as CrmLeadStatus] ??\n CONTACT_LIFECYCLE_STAGE_LABELS[id as ContactLifecycleStage] ??\n id\n return (\n <CardDisplay\n header={'Sharing rules'}\n help={pluginDocsHelp('crmSharing', { anchor: '#sharing-rules' })}\n contentGutterX\n contentGutterY\n contentBordered=\"all\"\n HeaderProps={{\n action: (\n <Button\n variant=\"contained\"\n disabled={!canEdit || rules.length >= CRM_SHARING_RULES_MAX}\n onClick={() => {\n setEditing(null)\n setDrawerOpen(true)\n }}\n >\n {'Add rule'}\n </Button>\n ),\n }}\n >\n <Stack spacing={2}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Share leads, contacts, companies or deals captured on one site with other sites, ' +\n 'automatically. A rule applies to the records you have now and to every one captured ' +\n 'or changed later. Sharing is visibility only: a site never gains a person’s consent ' +\n 'through it.'}\n </Typography>\n {busy ? <LinearProgress /> : null}\n {rules.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No sharing rules. Every record is visible only to the sites that captured it.'}\n </Typography>\n ) : (\n <ScrollTable size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{'Rule'}</TableCell>\n <TableCell>{'Which records'}</TableCell>\n <TableCell>{'Shared with'}</TableCell>\n <TableCell>{'Status'}</TableCell>\n <TableCell align=\"right\" />\n </TableRow>\n </TableHead>\n <TableBody>\n {rules.map((rule) => (\n <TableRow key={rule.id} hover>\n <TableCell>\n <Typography variant=\"body2\">{rule.name}</Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {describeSharingRuleScope(rule, sites.siteName, {\n owner: roster.nameOf,\n stage: stageLabel,\n })}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {`${describeShareTargets(rule.targets, sites.siteName)}, ${\n rule.access === 'edit' ? 'read and edit' : 'read-only'\n }`}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {runLabel(rule)}\n </Typography>\n </TableCell>\n <TableCell align=\"right\" sx={{ width: 56 }}>\n <RowActionsMenu\n label={rule.name}\n items={[\n {\n key: 'edit',\n label: 'Edit rule',\n icon: <MdiIcon path={mdiPencilOutline.path} size={0.8} />,\n disabled: !canEdit || rule.deleting === true,\n onClick: () => {\n setEditing(rule)\n setDrawerOpen(true)\n },\n },\n ...(rule.run && rule.run.status !== 'done'\n ? [\n {\n key: 'resume',\n label: 'Resume',\n icon: <MdiIcon path={mdiRefresh.path} size={0.8} />,\n disabled: !canEdit,\n onClick: () =>\n void run('rule-continue', { ruleId: rule.id }, 'Rule applied'),\n },\n ]\n : []),\n {\n key: 'delete',\n label: 'Delete rule',\n icon: <MdiIcon path={mdiDeleteOutline.path} size={0.8} />,\n destructive: true,\n disabled: !canEdit,\n onClick: () =>\n void run('rule-delete', { ruleId: rule.id }, 'Rule deleted'),\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </ScrollTable>\n )}\n {ready && !canManage ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Only a workspace owner or admin can change sharing rules.'}\n </Typography>\n ) : null}\n </Stack>\n <SharingRuleDrawer\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n rule={editing}\n sites={sites.sites}\n members={roster.members}\n campaigns={campaigns.options}\n busy={busy}\n onSubmit={save}\n />\n </CardDisplay>\n )\n}\nSharingRulesCard.displayName = 'SharingRulesCard'\n\nexport default SharingRulesCard\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","CRM_LEAD_STATUS_LABELS","pluginDocsHelp","mdiDeleteOutline","mdiPencilOutline","mdiRefresh","CardDisplay","MdiIcon","RowActionsMenu","ScrollTable","useSnackbar","useUser","Button","LinearProgress","Stack","TableBody","TableCell","TableHead","TableRow","Typography","useCallback","useState","useCrmCampaigns","useCrmSharingRules","useCrmSharingSites","useOrgMemberDirectory","CRM_SHARING_RULES_MAX","describeShareTargets","describeSharingRuleScope","callCrmSharing","SharingRuleDrawer","runLabel","rule","run","deleting","enabled","status","mode","processed","changed","error","SharingRulesCard","props","orgId","org","canManage","ready","data","user","enqueueSnackbar","rules","sites","hostId","roster","campaigns","editing","setEditing","drawerOpen","setDrawerOpen","busy","setBusy","scope","action","body","said","answer","ruleId","id","String","more","variant","persist","message","allowDuplicate","save","draft","canEdit","stageLabel","header","help","anchor","contentGutterX","contentGutterY","contentBordered","HeaderProps","disabled","length","onClick","spacing","color","size","align","map","hover","name","siteName","owner","nameOf","stage","targets","access","sx","width","label","items","key","icon","path","destructive","open","onClose","members","options","onSubmit","displayName"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;AAEA,SACEA,8BAA8B,EAE9BC,sBAAsB,EAEtBC,cAAc,QACT,eAAc;AACrB,SAASC,gBAAgB,EAAEC,gBAAgB,EAAEC,UAAU,QAAQ,yBAAwB;AACvF,SAASC,WAAW,EAAEC,OAAO,QAAQ,uBAAsB;AAC3D,OAAOC,oBAAoB,6DAA4D;AACvF,SAASC,WAAW,QAAQ,yDAAwD;AACpF,SAASC,WAAW,QAAQ,8BAA6B;AACzD,SAASC,OAAO,QAAQ,iCAAgC;AACxD,SACEC,MAAM,EACNC,cAAc,EACdC,KAAK,EACLC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,QAAQ,EACRC,UAAU,QACL,gBAAe;AACtB,SAASC,WAAW,EAAEC,QAAQ,QAAQ,QAAO;AAC7C,SAASC,eAAe,QAAQ,gCAA4B;AAC5D,SAASC,kBAAkB,EAAEC,kBAAkB,QAAQ,8BAA0B;AAEjF,SAASC,qBAAqB,QAAQ,uCAAmC;AACzE,SACEC,qBAAqB,EAGrBC,oBAAoB,EACpBC,wBAAwB,QACnB,0BAAsB;AAC7B,SAASC,cAAc,QAAQ,8BAA0B;AACzD,SAASC,iBAAiB,QAA+B,2BAAuB;AAShF,+DAA+D,GAC/D,SAASC,SAASC,IAAoB;QAOAC;IANpC,MAAMA,MAAMD,KAAKC,GAAG;IACpB,IAAID,KAAKE,QAAQ,EAAE,OAAO;IAC1B,IAAI,CAACD,KAAK,OAAOD,KAAKG,OAAO,GAAG,OAAO;IACvC,IAAIF,IAAIG,MAAM,KAAK,WAAW;QAC5B,OAAO,GAAGH,IAAII,IAAI,KAAK,WAAW,aAAa,WAAW,GAAG,EAAEJ,IAAIK,SAAS,CAAC,UAAU,EAAEL,IAAIM,OAAO,CAAC,QAAQ,CAAC;IAChH;IACA,IAAIN,IAAIG,MAAM,KAAK,UAAU,QAAOH,aAAAA,IAAIO,KAAK,YAATP,aAAa;IACjD,OAAO,GAAGD,KAAKG,OAAO,GAAG,OAAO,MAAM,GAAG,EAAEF,IAAIM,OAAO,CAAC,CAAC,EAAEN,IAAIM,OAAO,KAAK,IAAI,WAAW,UAAU,QAAQ,CAAC;AAC9G;AAEA;;;;;;;;;;;CAWC,GACD,OAAO,SAASE,iBAAiBC,KAA4B;IAC3D,MAAM,EAAEC,KAAK,EAAEC,GAAG,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGJ;IACzC,MAAM,EAAEK,MAAMC,IAAI,EAAE,GAAGrC;IACvB,MAAM,EAAEsC,eAAe,EAAE,GAAGvC;IAC5B,MAAMwC,QAAQ3B,mBAAmBqB;IACjC,MAAMO,QAAQ3B,mBAAmB;QAAE4B,QAAQ;QAAMT;QAAOR,SAASU;IAAU;IAC3E,MAAMQ,SAAS5B,sBAAsBkB;IACrC,MAAMW,YAAYhC,gBAAgB;QAAE8B,QAAQ;QAAMT;IAAM,GAAG;QAAER,SAASU;IAAU;IAChF,MAAM,CAACU,SAASC,WAAW,GAAGnC,SAAgC;IAC9D,MAAM,CAACoC,YAAYC,cAAc,GAAGrC,SAAS;IAC7C,MAAM,CAACsC,MAAMC,QAAQ,GAAGvC,SAAS;IACjC,MAAMwC,QAAQlB,QAAQ;QAAEA;IAAM,IAAI;IAElC,4EAA4E,GAC5E,MAAMV,MAAMb,YACV,OAAO0C,QAA0BC,MAA+BC;QAC9D,IAAI,CAACH,OAAO;QACZD,QAAQ;QACR,IAAI;sBAEuCG;gBAA1BE;YADf,IAAIA,SAAS,MAAMpC,eAAemB,MAAMa,OAAOC,QAAQC;YACvD,MAAMG,kBAASD,eAAAA,OAAOjC,IAAI,qBAAXiC,aAAaE,EAAE,mBAAIC,QAAOL,eAAAA,IAAI,CAAC,SAAS,YAAdA,eAAkB;YAC3D,MAAOE,OAAOI,IAAI,IAAIH,OAAQ;gBAC5BD,SAAS,MAAMpC,eAAemB,MAAMa,OAAO,iBAAiB;oBAAEK;gBAAO;YACvE;YACAjB,gBAAgBe,MAAM;gBAAEM,SAAS;gBAAWC,SAAS;YAAM;YAC3Db,cAAc;QAChB,EAAE,OAAOlB,OAAO;YACdS,gBAAgB,AAACT,MAAgBgC,OAAO,EAAE;gBAAEF,SAAS;gBAASG,gBAAgB;YAAK;QACrF,SAAU;YACRb,QAAQ;QACV;IACF,GACA,gDAAgD;IAChD,uDAAuD;IACvD;QAACZ;QAAML;QAAOM;KAAgB;IAGhC,MAAMyB,OAAO,CAACC,QACZ,KAAK1C,IAAI,aAAa;YAAED,MAAM2C;QAAM,GAAGA,MAAMR,EAAE,GAAG,eAAe;IAEnE,MAAMS,UAAU9B,SAASD,aAAa,CAACc;IACvC,MAAMkB,aAAa,CAACV;YAClBlE,MAAAA;gBAAAA,QAAAA,6BAAAA,sBAAsB,CAACkE,GAAoB,YAA3ClE,6BACAD,8BAA8B,CAACmE,GAA4B,YAD3DlE,OAEAkE;;IACF,qBACE,MAAC7D;QACCwE,QAAQ;QACRC,MAAM7E,eAAe,cAAc;YAAE8E,QAAQ;QAAiB;QAC9DC,cAAc;QACdC,cAAc;QACdC,iBAAgB;QAChBC,aAAa;YACXtB,sBACE,KAAClD;gBACC0D,SAAQ;gBACRe,UAAU,CAACT,WAAW1B,MAAMoC,MAAM,IAAI5D;gBACtC6D,SAAS;oBACP/B,WAAW;oBACXE,cAAc;gBAChB;0BAEC;;QAGP;;0BAEA,MAAC5C;gBAAM0E,SAAS;;kCACd,KAACrE;wBAAWmD,SAAQ;wBAAQmB,OAAM;kCAC/B,sFACC,yFACA,yFACA;;oBAEH9B,qBAAO,KAAC9C,sBAAoB;oBAC5BqC,MAAMoC,MAAM,KAAK,kBAChB,KAACnE;wBAAWmD,SAAQ;wBAAQmB,OAAM;kCAC/B;uCAGH,MAAChF;wBAAYiF,MAAK;;0CAChB,KAACzE;0CACC,cAAA,MAACC;;sDACC,KAACF;sDAAW;;sDACZ,KAACA;sDAAW;;sDACZ,KAACA;sDAAW;;sDACZ,KAACA;sDAAW;;sDACZ,KAACA;4CAAU2E,OAAM;;;;;0CAGrB,KAAC5E;0CACEmC,MAAM0C,GAAG,CAAC,CAAC5D,qBACV,MAACd;wCAAuB2E,KAAK;;0DAC3B,KAAC7E;0DACC,cAAA,KAACG;oDAAWmD,SAAQ;8DAAStC,KAAK8D,IAAI;;;0DAExC,KAAC9E;0DACC,cAAA,KAACG;oDAAWmD,SAAQ;8DACjB1C,yBAAyBI,MAAMmB,MAAM4C,QAAQ,EAAE;wDAC9CC,OAAO3C,OAAO4C,MAAM;wDACpBC,OAAOrB;oDACT;;;0DAGJ,KAAC7D;0DACC,cAAA,KAACG;oDAAWmD,SAAQ;8DACjB,GAAG3C,qBAAqBK,KAAKmE,OAAO,EAAEhD,MAAM4C,QAAQ,EAAE,EAAE,EACvD/D,KAAKoE,MAAM,KAAK,SAAS,kBAAkB,aAC3C;;;0DAGN,KAACpF;0DACC,cAAA,KAACG;oDAAWmD,SAAQ;oDAAQmB,OAAM;8DAC/B1D,SAASC;;;0DAGd,KAAChB;gDAAU2E,OAAM;gDAAQU,IAAI;oDAAEC,OAAO;gDAAG;0DACvC,cAAA,KAAC9F;oDACC+F,OAAOvE,KAAK8D,IAAI;oDAChBU,OAAO;wDACL;4DACEC,KAAK;4DACLF,OAAO;4DACPG,oBAAM,KAACnG;gEAAQoG,MAAMvG,iBAAiBuG,IAAI;gEAAEjB,MAAM;;4DAClDL,UAAU,CAACT,WAAW5C,KAAKE,QAAQ,KAAK;4DACxCqD,SAAS;gEACP/B,WAAWxB;gEACX0B,cAAc;4DAChB;wDACF;2DACI1B,KAAKC,GAAG,IAAID,KAAKC,GAAG,CAACG,MAAM,KAAK,SAChC;4DACE;gEACEqE,KAAK;gEACLF,OAAO;gEACPG,oBAAM,KAACnG;oEAAQoG,MAAMtG,WAAWsG,IAAI;oEAAEjB,MAAM;;gEAC5CL,UAAU,CAACT;gEACXW,SAAS,IACP,KAAKtD,IAAI,iBAAiB;wEAAEiC,QAAQlC,KAAKmC,EAAE;oEAAC,GAAG;4DACnD;yDACD,GACD,EAAE;wDACN;4DACEsC,KAAK;4DACLF,OAAO;4DACPG,oBAAM,KAACnG;gEAAQoG,MAAMxG,iBAAiBwG,IAAI;gEAAEjB,MAAM;;4DAClDkB,aAAa;4DACbvB,UAAU,CAACT;4DACXW,SAAS,IACP,KAAKtD,IAAI,eAAe;oEAAEiC,QAAQlC,KAAKmC,EAAE;gEAAC,GAAG;wDACjD;qDACD;;;;uCA3DQnC,KAAKmC,EAAE;;;;oBAmE7BrB,SAAS,CAACD,0BACT,KAAC1B;wBAAWmD,SAAQ;wBAAUmB,OAAM;kCACjC;yBAED;;;0BAEN,KAAC3D;gBACC+E,MAAMpD;gBACNqD,SAAS,IAAMpD,cAAc;gBAC7B1B,MAAMuB;gBACNJ,OAAOA,MAAMA,KAAK;gBAClB4D,SAAS1D,OAAO0D,OAAO;gBACvBzD,WAAWA,UAAU0D,OAAO;gBAC5BrD,MAAMA;gBACNsD,UAAUvC;;;;AAIlB;AACAjC,iBAAiByE,WAAW,GAAG;AAE/B,eAAezE,iBAAgB"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/sharing-rules-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 CONTACT_LIFECYCLE_STAGE_LABELS,\n type ContactLifecycleStage,\n crmLeadStatusLabelFor,\n isCrmLeadStatus,\n pluginDocsHelp,\n} from '@aglyn/aglyn'\nimport { mdiDeleteOutline, mdiPencilOutline, mdiRefresh } from '@aglyn/shared-data-mdi'\nimport { CardDisplay, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport RowActionsMenu 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 { useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Button,\n LinearProgress,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { useCrmCampaigns } from '../hooks/use-crm-campaigns'\nimport { useCrmSharingRules, useCrmSharingSites } from '../hooks/use-crm-sharing'\nimport { useLeadSourcePicklist } from '../hooks/use-lead-source-picklist'\nimport { useLeadStatusPicklist } from '../hooks/use-lead-status-picklist'\nimport type { CrmOrgDoc } from '../hooks/use-crm-scope'\nimport { useOrgMemberDirectory } from '../hooks/use-org-member-directory'\nimport {\n CRM_SHARING_RULES_MAX,\n type CrmSharingAction,\n type CrmSharingRule,\n describeShareTargets,\n describeSharingRuleScope,\n} from '../model/crm-sharing'\nimport { callCrmSharing } from '../model/crm-sharing-api'\nimport { SharingRuleDrawer, type SharingRuleDraft } from './sharing-rule-drawer'\n\nexport interface SharingRulesCardProps {\n orgId: string | null\n org: CrmOrgDoc\n canManage: boolean\n ready: boolean\n}\n\n/** How far a rule's recompute has got, as the table shows it. */\nfunction runLabel(rule: CrmSharingRule): string {\n const run = rule.run\n if (rule.deleting) return 'Removing what it shared…'\n if (!run) return rule.enabled ? 'On' : 'Off'\n if (run.status === 'running') {\n return `${run.mode === 'remove' ? 'Removing' : 'Applying'} — ${run.processed} checked, ${run.changed} changed`\n }\n if (run.status === 'failed') return run.error ?? 'Stopped'\n return `${rule.enabled ? 'On' : 'Off'} — ${run.changed} ${run.changed === 1 ? 'record' : 'records'} changed`\n}\n\n/**\n * SHARING RULES — the organization's automated sharing (AGL-3336).\n *\n * A rule shares every record it matches with other sites: the existing ones\n * through a recompute that runs when the rule is saved, with its progress\n * on the row, and every later capture or change through the record-written\n * seam. The recompute runs in passes; the card keeps asking while the page\n * is open, and a rule whose run stopped offers Resume.\n *\n * Mounted at the organization level only: a rule is a fact about the org,\n * and its targets are the org's sites.\n */\nexport function SharingRulesCard(props: SharingRulesCardProps) {\n const { orgId, org, canManage, ready } = props\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const rules = useCrmSharingRules(org)\n const sites = useCrmSharingSites({ hostId: null, orgId, enabled: canManage })\n const roster = useOrgMemberDirectory(orgId)\n const campaigns = useCrmCampaigns({ hostId: null, orgId }, { enabled: canManage })\n // The values the Lead source criterion picks from, under their groups (AGL-3511).\n const leadSources = useLeadSourcePicklist(canManage ? orgId : null)\n // The org's names for the lead statuses a rule matches (AGL-3512).\n const leadStatuses = useLeadStatusPicklist(orgId)\n const [editing, setEditing] = useState<CrmSharingRule | null>(null)\n const [drawerOpen, setDrawerOpen] = useState(false)\n const [busy, setBusy] = useState(false)\n const scope = orgId ? { orgId } : null\n\n /** One action, then `rule-continue` until the rule's run has nothing left. */\n const run = useCallback(\n async (action: CrmSharingAction, body: Record<string, unknown>, said: string) => {\n if (!scope) return\n setBusy(true)\n try {\n let answer = await callCrmSharing(user, scope, action, body)\n const ruleId = answer.rule?.id ?? String(body['ruleId'] ?? '')\n while (answer.more && ruleId) {\n answer = await callCrmSharing(user, scope, 'rule-continue', { ruleId })\n }\n enqueueSnackbar(said, { variant: 'success', persist: false })\n setDrawerOpen(false)\n } catch (error) {\n enqueueSnackbar((error as Error).message, { variant: 'error', allowDuplicate: true })\n } finally {\n setBusy(false)\n }\n },\n // `scope` is rebuilt from `orgId` every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [user, orgId, enqueueSnackbar],\n )\n\n const save = (draft: SharingRuleDraft) =>\n void run('rule-save', { rule: draft }, draft.id ? 'Rule saved' : 'Rule added')\n\n const canEdit = ready && canManage && !busy\n const stageLabel = (id: string) =>\n (isCrmLeadStatus(id) ? crmLeadStatusLabelFor(leadStatuses.picklist, id) : null) ??\n CONTACT_LIFECYCLE_STAGE_LABELS[id as ContactLifecycleStage] ??\n id\n return (\n <CardDisplay\n header={'Sharing rules'}\n help={pluginDocsHelp('crmSharing', { anchor: '#sharing-rules' })}\n contentGutterX\n contentGutterY\n contentBordered=\"all\"\n HeaderProps={{\n action: (\n <Button\n variant=\"contained\"\n disabled={!canEdit || rules.length >= CRM_SHARING_RULES_MAX}\n onClick={() => {\n setEditing(null)\n setDrawerOpen(true)\n }}\n >\n {'Add rule'}\n </Button>\n ),\n }}\n >\n <Stack spacing={2}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Share leads, contacts, companies or deals captured on one site with other sites, ' +\n 'automatically. A rule applies to the records you have now and to every one captured ' +\n 'or changed later. Sharing is visibility only: a site never gains a person’s consent ' +\n 'through it.'}\n </Typography>\n {busy ? <LinearProgress /> : null}\n {rules.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No sharing rules. Every record is visible only to the sites that captured it.'}\n </Typography>\n ) : (\n <ScrollTable size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{'Rule'}</TableCell>\n <TableCell>{'Which records'}</TableCell>\n <TableCell>{'Shared with'}</TableCell>\n <TableCell>{'Status'}</TableCell>\n <TableCell align=\"right\" />\n </TableRow>\n </TableHead>\n <TableBody>\n {rules.map((rule) => (\n <TableRow key={rule.id} hover>\n <TableCell>\n <Typography variant=\"body2\">{rule.name}</Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {describeSharingRuleScope(rule, sites.siteName, {\n owner: roster.nameOf,\n stage: stageLabel,\n })}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {`${describeShareTargets(rule.targets, sites.siteName)}, ${\n rule.access === 'edit' ? 'read and edit' : 'read-only'\n }`}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {runLabel(rule)}\n </Typography>\n </TableCell>\n <TableCell align=\"right\" sx={{ width: 56 }}>\n <RowActionsMenu\n label={rule.name}\n items={[\n {\n key: 'edit',\n label: 'Edit rule',\n icon: <MdiIcon path={mdiPencilOutline.path} size={0.8} />,\n disabled: !canEdit || rule.deleting === true,\n onClick: () => {\n setEditing(rule)\n setDrawerOpen(true)\n },\n },\n ...(rule.run && rule.run.status !== 'done'\n ? [\n {\n key: 'resume',\n label: 'Resume',\n icon: <MdiIcon path={mdiRefresh.path} size={0.8} />,\n disabled: !canEdit,\n onClick: () =>\n void run('rule-continue', { ruleId: rule.id }, 'Rule applied'),\n },\n ]\n : []),\n {\n key: 'delete',\n label: 'Delete rule',\n icon: <MdiIcon path={mdiDeleteOutline.path} size={0.8} />,\n destructive: true,\n disabled: !canEdit,\n onClick: () =>\n void run('rule-delete', { ruleId: rule.id }, 'Rule deleted'),\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </ScrollTable>\n )}\n {ready && !canManage ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Only a workspace owner or admin can change sharing rules.'}\n </Typography>\n ) : null}\n </Stack>\n <SharingRuleDrawer\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n rule={editing}\n sites={sites.sites}\n members={roster.members}\n campaigns={campaigns.options}\n leadSourceList={leadSources.picklist}\n leadStatusList={leadStatuses.picklist}\n busy={busy}\n onSubmit={save}\n />\n </CardDisplay>\n )\n}\nSharingRulesCard.displayName = 'SharingRulesCard'\n\nexport default SharingRulesCard\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","crmLeadStatusLabelFor","isCrmLeadStatus","pluginDocsHelp","mdiDeleteOutline","mdiPencilOutline","mdiRefresh","CardDisplay","MdiIcon","RowActionsMenu","ScrollTable","useSnackbar","useUser","Button","LinearProgress","Stack","TableBody","TableCell","TableHead","TableRow","Typography","useCallback","useState","useCrmCampaigns","useCrmSharingRules","useCrmSharingSites","useLeadSourcePicklist","useLeadStatusPicklist","useOrgMemberDirectory","CRM_SHARING_RULES_MAX","describeShareTargets","describeSharingRuleScope","callCrmSharing","SharingRuleDrawer","runLabel","rule","run","deleting","enabled","status","mode","processed","changed","error","SharingRulesCard","props","orgId","org","canManage","ready","data","user","enqueueSnackbar","rules","sites","hostId","roster","campaigns","leadSources","leadStatuses","editing","setEditing","drawerOpen","setDrawerOpen","busy","setBusy","scope","action","body","said","answer","ruleId","id","String","more","variant","persist","message","allowDuplicate","save","draft","canEdit","stageLabel","picklist","header","help","anchor","contentGutterX","contentGutterY","contentBordered","HeaderProps","disabled","length","onClick","spacing","color","size","align","map","hover","name","siteName","owner","nameOf","stage","targets","access","sx","width","label","items","key","icon","path","destructive","open","onClose","members","options","leadSourceList","leadStatusList","onSubmit","displayName"],"mappings":"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"}
@@ -8,8 +8,14 @@ import type { CrmRecordKind } from '../hooks/use-crm-record-names';
8
8
  */
9
9
  export declare const TASK_KIND_ICONS: Record<CrmTaskKind, string>;
10
10
  export declare const RECORD_KIND_ICONS: Record<CrmRecordKind, string>;
11
+ /**
12
+ * The task's type: the icon of its meaning and the org's label for it
13
+ * (AGL-3517) — `label`, from `crmTaskPicklistLabels`, or the built-in name
14
+ * of the kind where a surface has no list to hand.
15
+ */
11
16
  export declare function TaskKindCell(props: {
12
17
  kind: CrmTaskKind;
18
+ label?: string;
13
19
  iconOnly?: boolean;
14
20
  }): import("react").JSX.Element;
15
21
  export declare namespace TaskKindCell {
@@ -18,10 +24,12 @@ export declare namespace TaskKindCell {
18
24
  /**
19
25
  * Priority as a chip. Only `high` is colored: a column where every row
20
26
  * carries a colored chip is a column nobody scans, and "normal" is the
21
- * absence of a flag rather than a flag of its own.
27
+ * absence of a flag rather than a flag of its own. The color follows the
28
+ * MEANING; the text is the org's label for it when one is passed (AGL-3517).
22
29
  */
23
30
  export declare function TaskPriorityChip(props: {
24
31
  priority: CrmTaskPriority;
32
+ label?: string;
25
33
  }): import("react").JSX.Element;
26
34
  export declare namespace TaskPriorityChip {
27
35
  var displayName: string;
@@ -34,10 +34,14 @@ export const RECORD_KIND_ICONS = {
34
34
  company: mdiDomain.path,
35
35
  deal: mdiHandshakeOutline.path
36
36
  };
37
- export function TaskKindCell(props) {
37
+ /**
38
+ * The task's type: the icon of its meaning and the org's label for it
39
+ * (AGL-3517) — `label`, from `crmTaskPicklistLabels`, or the built-in name
40
+ * of the kind where a surface has no list to hand.
41
+ */ export function TaskKindCell(props) {
38
42
  var _CRM_TASK_KIND_LABELS_kind, _TASK_KIND_ICONS_kind;
39
43
  const { kind, iconOnly } = props;
40
- const label = (_CRM_TASK_KIND_LABELS_kind = CRM_TASK_KIND_LABELS[kind]) != null ? _CRM_TASK_KIND_LABELS_kind : kind;
44
+ const label = props.label || ((_CRM_TASK_KIND_LABELS_kind = CRM_TASK_KIND_LABELS[kind]) != null ? _CRM_TASK_KIND_LABELS_kind : kind);
41
45
  return /*#__PURE__*/ _jsxs(Stack, {
42
46
  direction: "row",
43
47
  spacing: 0.75,
@@ -62,13 +66,14 @@ TaskKindCell.displayName = 'TaskKindCell';
62
66
  /**
63
67
  * Priority as a chip. Only `high` is colored: a column where every row
64
68
  * carries a colored chip is a column nobody scans, and "normal" is the
65
- * absence of a flag rather than a flag of its own.
69
+ * absence of a flag rather than a flag of its own. The color follows the
70
+ * MEANING; the text is the org's label for it when one is passed (AGL-3517).
66
71
  */ export function TaskPriorityChip(props) {
67
72
  var _CRM_TASK_PRIORITY_LABELS_priority;
68
73
  const { priority } = props;
69
74
  return /*#__PURE__*/ _jsx(Chip, {
70
75
  size: "small",
71
- label: (_CRM_TASK_PRIORITY_LABELS_priority = CRM_TASK_PRIORITY_LABELS[priority]) != null ? _CRM_TASK_PRIORITY_LABELS_priority : priority,
76
+ label: props.label || ((_CRM_TASK_PRIORITY_LABELS_priority = CRM_TASK_PRIORITY_LABELS[priority]) != null ? _CRM_TASK_PRIORITY_LABELS_priority : priority),
72
77
  color: priority === 'high' ? 'error' : 'default',
73
78
  variant: priority === 'normal' ? 'filled' : 'outlined'
74
79
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/task-cells.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 type { CrmTask, CrmTaskKind, CrmTaskPriority } from '@aglyn/aglyn'\nimport {\n mdiAccountGroupOutline,\n mdiAccountOutline,\n mdiCheckboxMarkedCircleOutline,\n mdiDomain,\n mdiEmailOutline,\n mdiHandshakeOutline,\n mdiPhoneOutline,\n} from '@aglyn/shared-data-mdi'\nimport { AppLink, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { Chip, Stack, Typography } from '@mui/material'\nimport type { CrmRoutes } from '../model/crm-routes'\nimport type { CrmRecordKind } from '../hooks/use-crm-record-names'\nimport {\n CRM_TASK_KIND_LABELS,\n CRM_TASK_PRIORITY_LABELS,\n describeTaskDue,\n TASK_DUE_COLORS,\n taskRecordLink,\n} from '../model/task-views'\n\n/**\n * The cells a task is drawn with, shared by the tasks section, the record\n * cards and the dashboard widget (AGL-2599) so a call reads as a call on\n * every surface and an overdue date is the same red everywhere.\n */\n\nexport const TASK_KIND_ICONS: Record<CrmTaskKind, string> = {\n call: mdiPhoneOutline.path,\n email: mdiEmailOutline.path,\n meeting: mdiAccountGroupOutline.path,\n todo: mdiCheckboxMarkedCircleOutline.path,\n}\n\nexport const RECORD_KIND_ICONS: Record<CrmRecordKind, string> = {\n contact: mdiAccountOutline.path,\n company: mdiDomain.path,\n deal: mdiHandshakeOutline.path,\n}\n\nexport function TaskKindCell(props: { kind: CrmTaskKind; iconOnly?: boolean }) {\n const { kind, iconOnly } = props\n const label = CRM_TASK_KIND_LABELS[kind] ?? kind\n return (\n <Stack\n direction=\"row\"\n spacing={0.75}\n sx={{ alignItems: 'center', color: 'text.secondary' }}\n title={iconOnly ? label : undefined}\n >\n <MdiIcon path={TASK_KIND_ICONS[kind] ?? TASK_KIND_ICONS.todo} fontSize=\"small\" />\n {iconOnly ? null : <Typography variant=\"body2\">{label}</Typography>}\n </Stack>\n )\n}\nTaskKindCell.displayName = 'TaskKindCell'\n\n/**\n * Priority as a chip. Only `high` is colored: a column where every row\n * carries a colored chip is a column nobody scans, and \"normal\" is the\n * absence of a flag rather than a flag of its own.\n */\nexport function TaskPriorityChip(props: { priority: CrmTaskPriority }) {\n const { priority } = props\n return (\n <Chip\n size=\"small\"\n label={CRM_TASK_PRIORITY_LABELS[priority] ?? priority}\n color={priority === 'high' ? 'error' : 'default'}\n variant={priority === 'normal' ? 'filled' : 'outlined'}\n />\n )\n}\nTaskPriorityChip.displayName = 'TaskPriorityChip'\n\n/** The due date, painted by where it stands against the reader's clock. */\nexport function TaskDueText(props: {\n task: Pick<CrmTask, 'status' | 'dueAtMs'>\n nowMs: number\n variant?: 'body2' | 'caption'\n}) {\n const { task, nowMs, variant = 'body2' } = props\n const { state, label } = describeTaskDue(task, nowMs)\n return (\n <Typography\n variant={variant}\n sx={{\n color: TASK_DUE_COLORS[state],\n fontWeight: state === 'overdue' || state === 'today' ? 'fontWeightMedium' : undefined,\n textDecoration: state === 'done' ? 'line-through' : undefined,\n }}\n data-due-state={state}\n >\n {label}\n </Typography>\n )\n}\nTaskDueText.displayName = 'TaskDueText'\n\n/**\n * The record a task is for, as a link into the hub, with its name when the\n * cache has resolved one and its id until then. An unlinked task shows a\n * dash rather than nothing, so an empty cell reads as \"none\" and not as\n * \"still loading\".\n */\nexport function TaskRecordLink(props: {\n task: Pick<CrmTask, 'contactId' | 'companyId' | 'dealId'>\n routes: CrmRoutes\n nameOf: (kind: CrmRecordKind, id: string) => string | undefined\n}) {\n const { task, routes, nameOf } = props\n const link = taskRecordLink(task, routes)\n if (!link) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'—'}\n </Typography>\n )\n }\n return (\n <Stack direction=\"row\" spacing={0.75} sx={{ alignItems: 'center', minWidth: 0 }}>\n <MdiIcon\n path={RECORD_KIND_ICONS[link.kind]}\n fontSize=\"small\"\n sx={{ color: 'text.secondary' }}\n />\n <Typography variant=\"body2\" noWrap sx={{ minWidth: 0 }}>\n <AppLink\n href={link.href}\n onClick={(event: { stopPropagation: () => void }) =>\n event.stopPropagation()\n }\n >\n {nameOf(link.kind, link.id) || link.id}\n </AppLink>\n </Typography>\n </Stack>\n )\n}\nTaskRecordLink.displayName = 'TaskRecordLink'\n"],"names":["mdiAccountGroupOutline","mdiAccountOutline","mdiCheckboxMarkedCircleOutline","mdiDomain","mdiEmailOutline","mdiHandshakeOutline","mdiPhoneOutline","AppLink","MdiIcon","Chip","Stack","Typography","CRM_TASK_KIND_LABELS","CRM_TASK_PRIORITY_LABELS","describeTaskDue","TASK_DUE_COLORS","taskRecordLink","TASK_KIND_ICONS","call","path","email","meeting","todo","RECORD_KIND_ICONS","contact","company","deal","TaskKindCell","props","kind","iconOnly","label","direction","spacing","sx","alignItems","color","title","undefined","fontSize","variant","displayName","TaskPriorityChip","priority","size","TaskDueText","task","nowMs","state","fontWeight","textDecoration","data-due-state","TaskRecordLink","routes","nameOf","link","minWidth","noWrap","href","onClick","event","stopPropagation","id"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/task-cells.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 type { CrmTask, CrmTaskKind, CrmTaskPriority } from '@aglyn/aglyn'\nimport {\n mdiAccountGroupOutline,\n mdiAccountOutline,\n mdiCheckboxMarkedCircleOutline,\n mdiDomain,\n mdiEmailOutline,\n mdiHandshakeOutline,\n mdiPhoneOutline,\n} from '@aglyn/shared-data-mdi'\nimport { AppLink, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { Chip, Stack, Typography } from '@mui/material'\nimport type { CrmRoutes } from '../model/crm-routes'\nimport type { CrmRecordKind } from '../hooks/use-crm-record-names'\nimport {\n CRM_TASK_KIND_LABELS,\n CRM_TASK_PRIORITY_LABELS,\n describeTaskDue,\n TASK_DUE_COLORS,\n taskRecordLink,\n} from '../model/task-views'\n\n/**\n * The cells a task is drawn with, shared by the tasks section, the record\n * cards and the dashboard widget (AGL-2599) so a call reads as a call on\n * every surface and an overdue date is the same red everywhere.\n */\n\nexport const TASK_KIND_ICONS: Record<CrmTaskKind, string> = {\n call: mdiPhoneOutline.path,\n email: mdiEmailOutline.path,\n meeting: mdiAccountGroupOutline.path,\n todo: mdiCheckboxMarkedCircleOutline.path,\n}\n\nexport const RECORD_KIND_ICONS: Record<CrmRecordKind, string> = {\n contact: mdiAccountOutline.path,\n company: mdiDomain.path,\n deal: mdiHandshakeOutline.path,\n}\n\n/**\n * The task's type: the icon of its meaning and the org's label for it\n * (AGL-3517) — `label`, from `crmTaskPicklistLabels`, or the built-in name\n * of the kind where a surface has no list to hand.\n */\nexport function TaskKindCell(props: { kind: CrmTaskKind; label?: string; iconOnly?: boolean }) {\n const { kind, iconOnly } = props\n const label = props.label || (CRM_TASK_KIND_LABELS[kind] ?? kind)\n return (\n <Stack\n direction=\"row\"\n spacing={0.75}\n sx={{ alignItems: 'center', color: 'text.secondary' }}\n title={iconOnly ? label : undefined}\n >\n <MdiIcon path={TASK_KIND_ICONS[kind] ?? TASK_KIND_ICONS.todo} fontSize=\"small\" />\n {iconOnly ? null : <Typography variant=\"body2\">{label}</Typography>}\n </Stack>\n )\n}\nTaskKindCell.displayName = 'TaskKindCell'\n\n/**\n * Priority as a chip. Only `high` is colored: a column where every row\n * carries a colored chip is a column nobody scans, and \"normal\" is the\n * absence of a flag rather than a flag of its own. The color follows the\n * MEANING; the text is the org's label for it when one is passed (AGL-3517).\n */\nexport function TaskPriorityChip(props: { priority: CrmTaskPriority; label?: string }) {\n const { priority } = props\n return (\n <Chip\n size=\"small\"\n label={props.label || (CRM_TASK_PRIORITY_LABELS[priority] ?? priority)}\n color={priority === 'high' ? 'error' : 'default'}\n variant={priority === 'normal' ? 'filled' : 'outlined'}\n />\n )\n}\nTaskPriorityChip.displayName = 'TaskPriorityChip'\n\n/** The due date, painted by where it stands against the reader's clock. */\nexport function TaskDueText(props: {\n task: Pick<CrmTask, 'status' | 'dueAtMs'>\n nowMs: number\n variant?: 'body2' | 'caption'\n}) {\n const { task, nowMs, variant = 'body2' } = props\n const { state, label } = describeTaskDue(task, nowMs)\n return (\n <Typography\n variant={variant}\n sx={{\n color: TASK_DUE_COLORS[state],\n fontWeight: state === 'overdue' || state === 'today' ? 'fontWeightMedium' : undefined,\n textDecoration: state === 'done' ? 'line-through' : undefined,\n }}\n data-due-state={state}\n >\n {label}\n </Typography>\n )\n}\nTaskDueText.displayName = 'TaskDueText'\n\n/**\n * The record a task is for, as a link into the hub, with its name when the\n * cache has resolved one and its id until then. An unlinked task shows a\n * dash rather than nothing, so an empty cell reads as \"none\" and not as\n * \"still loading\".\n */\nexport function TaskRecordLink(props: {\n task: Pick<CrmTask, 'contactId' | 'companyId' | 'dealId'>\n routes: CrmRoutes\n nameOf: (kind: CrmRecordKind, id: string) => string | undefined\n}) {\n const { task, routes, nameOf } = props\n const link = taskRecordLink(task, routes)\n if (!link) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'—'}\n </Typography>\n )\n }\n return (\n <Stack direction=\"row\" spacing={0.75} sx={{ alignItems: 'center', minWidth: 0 }}>\n <MdiIcon\n path={RECORD_KIND_ICONS[link.kind]}\n fontSize=\"small\"\n sx={{ color: 'text.secondary' }}\n />\n <Typography variant=\"body2\" noWrap sx={{ minWidth: 0 }}>\n <AppLink\n href={link.href}\n onClick={(event: { stopPropagation: () => void }) =>\n event.stopPropagation()\n }\n >\n {nameOf(link.kind, link.id) || link.id}\n </AppLink>\n </Typography>\n </Stack>\n )\n}\nTaskRecordLink.displayName = 'TaskRecordLink'\n"],"names":["mdiAccountGroupOutline","mdiAccountOutline","mdiCheckboxMarkedCircleOutline","mdiDomain","mdiEmailOutline","mdiHandshakeOutline","mdiPhoneOutline","AppLink","MdiIcon","Chip","Stack","Typography","CRM_TASK_KIND_LABELS","CRM_TASK_PRIORITY_LABELS","describeTaskDue","TASK_DUE_COLORS","taskRecordLink","TASK_KIND_ICONS","call","path","email","meeting","todo","RECORD_KIND_ICONS","contact","company","deal","TaskKindCell","props","kind","iconOnly","label","direction","spacing","sx","alignItems","color","title","undefined","fontSize","variant","displayName","TaskPriorityChip","priority","size","TaskDueText","task","nowMs","state","fontWeight","textDecoration","data-due-state","TaskRecordLink","routes","nameOf","link","minWidth","noWrap","href","onClick","event","stopPropagation","id"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;AAGA,SACEA,sBAAsB,EACtBC,iBAAiB,EACjBC,8BAA8B,EAC9BC,SAAS,EACTC,eAAe,EACfC,mBAAmB,EACnBC,eAAe,QACV,yBAAwB;AAC/B,SAASC,OAAO,EAAEC,OAAO,QAAQ,uBAAsB;AACvD,SAASC,IAAI,EAAEC,KAAK,EAAEC,UAAU,QAAQ,gBAAe;AAGvD,SACEC,oBAAoB,EACpBC,wBAAwB,EACxBC,eAAe,EACfC,eAAe,EACfC,cAAc,QACT,yBAAqB;AAE5B;;;;CAIC,GAED,OAAO,MAAMC,kBAA+C;IAC1DC,MAAMZ,gBAAgBa,IAAI;IAC1BC,OAAOhB,gBAAgBe,IAAI;IAC3BE,SAASrB,uBAAuBmB,IAAI;IACpCG,MAAMpB,+BAA+BiB,IAAI;AAC3C,EAAC;AAED,OAAO,MAAMI,oBAAmD;IAC9DC,SAASvB,kBAAkBkB,IAAI;IAC/BM,SAAStB,UAAUgB,IAAI;IACvBO,MAAMrB,oBAAoBc,IAAI;AAChC,EAAC;AAED;;;;CAIC,GACD,OAAO,SAASQ,aAAaC,KAAgE;QAE7DhB,4BAQXK;IATnB,MAAM,EAAEY,IAAI,EAAEC,QAAQ,EAAE,GAAGF;IAC3B,MAAMG,QAAQH,MAAMG,KAAK,MAAKnB,6BAAAA,oBAAoB,CAACiB,KAAK,YAA1BjB,6BAA8BiB;IAC5D,qBACE,MAACnB;QACCsB,WAAU;QACVC,SAAS;QACTC,IAAI;YAAEC,YAAY;YAAUC,OAAO;QAAiB;QACpDC,OAAOP,WAAWC,QAAQO;;0BAE1B,KAAC9B;gBAAQW,IAAI,GAAEF,wBAAAA,eAAe,CAACY,KAAK,YAArBZ,wBAAyBA,gBAAgBK,IAAI;gBAAEiB,UAAS;;YACtET,WAAW,qBAAO,KAACnB;gBAAW6B,SAAQ;0BAAST;;;;AAGtD;AACAJ,aAAac,WAAW,GAAG;AAE3B;;;;;CAKC,GACD,OAAO,SAASC,iBAAiBd,KAAoD;QAKxDf;IAJ3B,MAAM,EAAE8B,QAAQ,EAAE,GAAGf;IACrB,qBACE,KAACnB;QACCmC,MAAK;QACLb,OAAOH,MAAMG,KAAK,MAAKlB,qCAAAA,wBAAwB,CAAC8B,SAAS,YAAlC9B,qCAAsC8B;QAC7DP,OAAOO,aAAa,SAAS,UAAU;QACvCH,SAASG,aAAa,WAAW,WAAW;;AAGlD;AACAD,iBAAiBD,WAAW,GAAG;AAE/B,yEAAyE,GACzE,OAAO,SAASI,YAAYjB,KAI3B;IACC,MAAM,EAAEkB,IAAI,EAAEC,KAAK,EAAEP,UAAU,OAAO,EAAE,GAAGZ;IAC3C,MAAM,EAAEoB,KAAK,EAAEjB,KAAK,EAAE,GAAGjB,gBAAgBgC,MAAMC;IAC/C,qBACE,KAACpC;QACC6B,SAASA;QACTN,IAAI;YACFE,OAAOrB,eAAe,CAACiC,MAAM;YAC7BC,YAAYD,UAAU,aAAaA,UAAU,UAAU,qBAAqBV;YAC5EY,gBAAgBF,UAAU,SAAS,iBAAiBV;QACtD;QACAa,kBAAgBH;kBAEfjB;;AAGP;AACAc,YAAYJ,WAAW,GAAG;AAE1B;;;;;CAKC,GACD,OAAO,SAASW,eAAexB,KAI9B;IACC,MAAM,EAAEkB,IAAI,EAAEO,MAAM,EAAEC,MAAM,EAAE,GAAG1B;IACjC,MAAM2B,OAAOvC,eAAe8B,MAAMO;IAClC,IAAI,CAACE,MAAM;QACT,qBACE,KAAC5C;YAAW6B,SAAQ;YAAQJ,OAAM;sBAC/B;;IAGP;IACA,qBACE,MAAC1B;QAAMsB,WAAU;QAAMC,SAAS;QAAMC,IAAI;YAAEC,YAAY;YAAUqB,UAAU;QAAE;;0BAC5E,KAAChD;gBACCW,MAAMI,iBAAiB,CAACgC,KAAK1B,IAAI,CAAC;gBAClCU,UAAS;gBACTL,IAAI;oBAAEE,OAAO;gBAAiB;;0BAEhC,KAACzB;gBAAW6B,SAAQ;gBAAQiB,MAAM;gBAACvB,IAAI;oBAAEsB,UAAU;gBAAE;0BACnD,cAAA,KAACjD;oBACCmD,MAAMH,KAAKG,IAAI;oBACfC,SAAS,CAACC,QACRA,MAAMC,eAAe;8BAGtBP,OAAOC,KAAK1B,IAAI,EAAE0B,KAAKO,EAAE,KAAKP,KAAKO,EAAE;;;;;AAKhD;AACAV,eAAeX,WAAW,GAAG"}