@aglyn/plugins-crm 1.0.0-beta.143
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +7 -0
- package/package.json +57 -0
- package/src/index.d.ts +21 -0
- package/src/index.js +29 -0
- package/src/index.js.map +1 -0
- package/src/lib/components/activity-list.d.ts +98 -0
- package/src/lib/components/activity-list.js +321 -0
- package/src/lib/components/activity-list.js.map +1 -0
- package/src/lib/components/activity-queries.d.ts +117 -0
- package/src/lib/components/activity-queries.js +198 -0
- package/src/lib/components/activity-queries.js.map +1 -0
- package/src/lib/components/add-to-list-button.d.ts +25 -0
- package/src/lib/components/add-to-list-button.js +64 -0
- package/src/lib/components/add-to-list-button.js.map +1 -0
- package/src/lib/components/add-to-list-dialog.d.ts +24 -0
- package/src/lib/components/add-to-list-dialog.js +327 -0
- package/src/lib/components/add-to-list-dialog.js.map +1 -0
- package/src/lib/components/assignment-rule-drawer.d.ts +43 -0
- package/src/lib/components/assignment-rule-drawer.js +293 -0
- package/src/lib/components/assignment-rule-drawer.js.map +1 -0
- package/src/lib/components/companies-bulk-bar.d.ts +29 -0
- package/src/lib/components/companies-bulk-bar.js +274 -0
- package/src/lib/components/companies-bulk-bar.js.map +1 -0
- package/src/lib/components/companies-section.d.ts +54 -0
- package/src/lib/components/companies-section.js +522 -0
- package/src/lib/components/companies-section.js.map +1 -0
- package/src/lib/components/company-contacts-card.d.ts +49 -0
- package/src/lib/components/company-contacts-card.js +435 -0
- package/src/lib/components/company-contacts-card.js.map +1 -0
- package/src/lib/components/company-deals-card.d.ts +20 -0
- package/src/lib/components/company-deals-card.js +38 -0
- package/src/lib/components/company-deals-card.js.map +1 -0
- package/src/lib/components/company-detail-page.d.ts +20 -0
- package/src/lib/components/company-detail-page.js +165 -0
- package/src/lib/components/company-detail-page.js.map +1 -0
- package/src/lib/components/company-edit-drawer.d.ts +65 -0
- package/src/lib/components/company-edit-drawer.js +433 -0
- package/src/lib/components/company-edit-drawer.js.map +1 -0
- package/src/lib/components/company-import-drawer.d.ts +42 -0
- package/src/lib/components/company-import-drawer.js +99 -0
- package/src/lib/components/company-import-drawer.js.map +1 -0
- package/src/lib/components/company-picker.d.ts +127 -0
- package/src/lib/components/company-picker.js +323 -0
- package/src/lib/components/company-picker.js.map +1 -0
- package/src/lib/components/company-properties-card.d.ts +47 -0
- package/src/lib/components/company-properties-card.js +289 -0
- package/src/lib/components/company-properties-card.js.map +1 -0
- package/src/lib/components/contact-address-fields.d.ts +29 -0
- package/src/lib/components/contact-address-fields.js +149 -0
- package/src/lib/components/contact-address-fields.js.map +1 -0
- package/src/lib/components/contact-associations-card.d.ts +72 -0
- package/src/lib/components/contact-associations-card.js +296 -0
- package/src/lib/components/contact-associations-card.js.map +1 -0
- package/src/lib/components/contact-custom-columns.d.ts +38 -0
- package/src/lib/components/contact-custom-columns.js +102 -0
- package/src/lib/components/contact-custom-columns.js.map +1 -0
- package/src/lib/components/contact-custom-fields-card.d.ts +39 -0
- package/src/lib/components/contact-custom-fields-card.js +204 -0
- package/src/lib/components/contact-custom-fields-card.js.map +1 -0
- package/src/lib/components/contact-deals-card.d.ts +20 -0
- package/src/lib/components/contact-deals-card.js +38 -0
- package/src/lib/components/contact-deals-card.js.map +1 -0
- package/src/lib/components/contact-detail-page.d.ts +46 -0
- package/src/lib/components/contact-detail-page.js +535 -0
- package/src/lib/components/contact-detail-page.js.map +1 -0
- package/src/lib/components/contact-duplicates-card.d.ts +42 -0
- package/src/lib/components/contact-duplicates-card.js +167 -0
- package/src/lib/components/contact-duplicates-card.js.map +1 -0
- package/src/lib/components/contact-field-drawer.d.ts +64 -0
- package/src/lib/components/contact-field-drawer.js +251 -0
- package/src/lib/components/contact-field-drawer.js.map +1 -0
- package/src/lib/components/contact-import-drawer.d.ts +46 -0
- package/src/lib/components/contact-import-drawer.js +149 -0
- package/src/lib/components/contact-import-drawer.js.map +1 -0
- package/src/lib/components/contact-known-by-card.d.ts +39 -0
- package/src/lib/components/contact-known-by-card.js +142 -0
- package/src/lib/components/contact-known-by-card.js.map +1 -0
- package/src/lib/components/contact-list-columns.d.ts +53 -0
- package/src/lib/components/contact-list-columns.js +288 -0
- package/src/lib/components/contact-list-columns.js.map +1 -0
- package/src/lib/components/contact-merge-dialog.d.ts +79 -0
- package/src/lib/components/contact-merge-dialog.js +405 -0
- package/src/lib/components/contact-merge-dialog.js.map +1 -0
- package/src/lib/components/contact-properties-card.d.ts +89 -0
- package/src/lib/components/contact-properties-card.js +492 -0
- package/src/lib/components/contact-properties-card.js.map +1 -0
- package/src/lib/components/contact-timeline-card.d.ts +68 -0
- package/src/lib/components/contact-timeline-card.js +435 -0
- package/src/lib/components/contact-timeline-card.js.map +1 -0
- package/src/lib/components/contacts-bulk-bar.d.ts +91 -0
- package/src/lib/components/contacts-bulk-bar.js +493 -0
- package/src/lib/components/contacts-bulk-bar.js.map +1 -0
- package/src/lib/components/contacts-section.d.ts +26 -0
- package/src/lib/components/contacts-section.js +1025 -0
- package/src/lib/components/contacts-section.js.map +1 -0
- package/src/lib/components/copy-capture-address-button.d.ts +33 -0
- package/src/lib/components/copy-capture-address-button.js +60 -0
- package/src/lib/components/copy-capture-address-button.js.map +1 -0
- package/src/lib/components/crm-attribution-zone.d.ts +38 -0
- package/src/lib/components/crm-attribution-zone.js +36 -0
- package/src/lib/components/crm-attribution-zone.js.map +1 -0
- package/src/lib/components/crm-booking-zone.d.ts +61 -0
- package/src/lib/components/crm-booking-zone.js +50 -0
- package/src/lib/components/crm-booking-zone.js.map +1 -0
- package/src/lib/components/crm-bulk-bar-frame.d.ts +47 -0
- package/src/lib/components/crm-bulk-bar-frame.js +137 -0
- package/src/lib/components/crm-bulk-bar-frame.js.map +1 -0
- package/src/lib/components/crm-call-actions.d.ts +65 -0
- package/src/lib/components/crm-call-actions.js +110 -0
- package/src/lib/components/crm-call-actions.js.map +1 -0
- package/src/lib/components/crm-column-menu.d.ts +21 -0
- package/src/lib/components/crm-column-menu.js +103 -0
- package/src/lib/components/crm-column-menu.js.map +1 -0
- package/src/lib/components/crm-console-page.d.ts +19 -0
- package/src/lib/components/crm-console-page.js +151 -0
- package/src/lib/components/crm-console-page.js.map +1 -0
- package/src/lib/components/crm-console-sections.d.ts +52 -0
- package/src/lib/components/crm-console-sections.js +83 -0
- package/src/lib/components/crm-console-sections.js.map +1 -0
- package/src/lib/components/crm-custom-field-control.d.ts +26 -0
- package/src/lib/components/crm-custom-field-control.js +131 -0
- package/src/lib/components/crm-custom-field-control.js.map +1 -0
- package/src/lib/components/crm-email-template-tools.d.ts +69 -0
- package/src/lib/components/crm-email-template-tools.js +240 -0
- package/src/lib/components/crm-email-template-tools.js.map +1 -0
- package/src/lib/components/crm-export-all-button.d.ts +39 -0
- package/src/lib/components/crm-export-all-button.js +98 -0
- package/src/lib/components/crm-export-all-button.js.map +1 -0
- package/src/lib/components/crm-filter-bar.d.ts +53 -0
- package/src/lib/components/crm-filter-bar.js +294 -0
- package/src/lib/components/crm-filter-bar.js.map +1 -0
- package/src/lib/components/crm-glance-card.d.ts +54 -0
- package/src/lib/components/crm-glance-card.js +219 -0
- package/src/lib/components/crm-glance-card.js.map +1 -0
- package/src/lib/components/crm-next-activity-column.d.ts +35 -0
- package/src/lib/components/crm-next-activity-column.js +100 -0
- package/src/lib/components/crm-next-activity-column.js.map +1 -0
- package/src/lib/components/crm-record-header.d.ts +97 -0
- package/src/lib/components/crm-record-header.js +160 -0
- package/src/lib/components/crm-record-header.js.map +1 -0
- package/src/lib/components/crm-record-insights-zone.d.ts +50 -0
- package/src/lib/components/crm-record-insights-zone.js +169 -0
- package/src/lib/components/crm-record-insights-zone.js.map +1 -0
- package/src/lib/components/crm-record-picker.d.ts +42 -0
- package/src/lib/components/crm-record-picker.js +104 -0
- package/src/lib/components/crm-record-picker.js.map +1 -0
- package/src/lib/components/crm-send-email-button.d.ts +39 -0
- package/src/lib/components/crm-send-email-button.js +81 -0
- package/src/lib/components/crm-send-email-button.js.map +1 -0
- package/src/lib/components/crm-send-email-dialog.d.ts +61 -0
- package/src/lib/components/crm-send-email-dialog.js +851 -0
- package/src/lib/components/crm-send-email-dialog.js.map +1 -0
- package/src/lib/components/crm-site-picker.d.ts +61 -0
- package/src/lib/components/crm-site-picker.js +99 -0
- package/src/lib/components/crm-site-picker.js.map +1 -0
- package/src/lib/components/crm-suite-lock.d.ts +29 -0
- package/src/lib/components/crm-suite-lock.js +114 -0
- package/src/lib/components/crm-suite-lock.js.map +1 -0
- package/src/lib/components/crm-tasks-due-card.d.ts +42 -0
- package/src/lib/components/crm-tasks-due-card.js +225 -0
- package/src/lib/components/crm-tasks-due-card.js.map +1 -0
- package/src/lib/components/crm-views-control.d.ts +65 -0
- package/src/lib/components/crm-views-control.js +518 -0
- package/src/lib/components/crm-views-control.js.map +1 -0
- package/src/lib/components/csv-import-drawer.d.ts +132 -0
- package/src/lib/components/csv-import-drawer.js +746 -0
- package/src/lib/components/csv-import-drawer.js.map +1 -0
- package/src/lib/components/deal-board.d.ts +70 -0
- package/src/lib/components/deal-board.js +478 -0
- package/src/lib/components/deal-board.js.map +1 -0
- package/src/lib/components/deal-detail-page.d.ts +18 -0
- package/src/lib/components/deal-detail-page.js +323 -0
- package/src/lib/components/deal-detail-page.js.map +1 -0
- package/src/lib/components/deal-edit-drawer.d.ts +59 -0
- package/src/lib/components/deal-edit-drawer.js +640 -0
- package/src/lib/components/deal-edit-drawer.js.map +1 -0
- package/src/lib/components/deal-import-drawer.d.ts +24 -0
- package/src/lib/components/deal-import-drawer.js +83 -0
- package/src/lib/components/deal-import-drawer.js.map +1 -0
- package/src/lib/components/deal-products-card.d.ts +48 -0
- package/src/lib/components/deal-products-card.js +614 -0
- package/src/lib/components/deal-products-card.js.map +1 -0
- package/src/lib/components/deal-properties-card.d.ts +29 -0
- package/src/lib/components/deal-properties-card.js +144 -0
- package/src/lib/components/deal-properties-card.js.map +1 -0
- package/src/lib/components/deal-stage-card.d.ts +24 -0
- package/src/lib/components/deal-stage-card.js +199 -0
- package/src/lib/components/deal-stage-card.js.map +1 -0
- package/src/lib/components/deals-bulk-bar.d.ts +31 -0
- package/src/lib/components/deals-bulk-bar.js +340 -0
- package/src/lib/components/deals-bulk-bar.js.map +1 -0
- package/src/lib/components/deals-section.d.ts +49 -0
- package/src/lib/components/deals-section.js +767 -0
- package/src/lib/components/deals-section.js.map +1 -0
- package/src/lib/components/email-capture-card.d.ts +42 -0
- package/src/lib/components/email-capture-card.js +134 -0
- package/src/lib/components/email-capture-card.js.map +1 -0
- package/src/lib/components/email-template-drawer.d.ts +33 -0
- package/src/lib/components/email-template-drawer.js +209 -0
- package/src/lib/components/email-template-drawer.js.map +1 -0
- package/src/lib/components/email-templates-card.d.ts +33 -0
- package/src/lib/components/email-templates-card.js +370 -0
- package/src/lib/components/email-templates-card.js.map +1 -0
- package/src/lib/components/erase-person-action.d.ts +92 -0
- package/src/lib/components/erase-person-action.js +261 -0
- package/src/lib/components/erase-person-action.js.map +1 -0
- package/src/lib/components/fields-section.d.ts +37 -0
- package/src/lib/components/fields-section.js +641 -0
- package/src/lib/components/fields-section.js.map +1 -0
- package/src/lib/components/form-contact-fields-card.d.ts +46 -0
- package/src/lib/components/form-contact-fields-card.js +253 -0
- package/src/lib/components/form-contact-fields-card.js.map +1 -0
- package/src/lib/components/insert-link-at-caret.d.ts +28 -0
- package/src/lib/components/insert-link-at-caret.js +37 -0
- package/src/lib/components/insert-link-at-caret.js.map +1 -0
- package/src/lib/components/lead-convert-dialog.d.ts +32 -0
- package/src/lib/components/lead-convert-dialog.js +493 -0
- package/src/lib/components/lead-convert-dialog.js.map +1 -0
- package/src/lib/components/lead-detail-page.d.ts +16 -0
- package/src/lib/components/lead-detail-page.js +163 -0
- package/src/lib/components/lead-detail-page.js.map +1 -0
- package/src/lib/components/lead-history-card.d.ts +32 -0
- package/src/lib/components/lead-history-card.js +165 -0
- package/src/lib/components/lead-history-card.js.map +1 -0
- package/src/lib/components/lead-import-drawer.d.ts +24 -0
- package/src/lib/components/lead-import-drawer.js +95 -0
- package/src/lib/components/lead-import-drawer.js.map +1 -0
- package/src/lib/components/lead-owner-select.d.ts +35 -0
- package/src/lib/components/lead-owner-select.js +91 -0
- package/src/lib/components/lead-owner-select.js.map +1 -0
- package/src/lib/components/lead-properties-card.d.ts +61 -0
- package/src/lib/components/lead-properties-card.js +395 -0
- package/src/lib/components/lead-properties-card.js.map +1 -0
- package/src/lib/components/lead-status-chip.d.ts +12 -0
- package/src/lib/components/lead-status-chip.js +43 -0
- package/src/lib/components/lead-status-chip.js.map +1 -0
- package/src/lib/components/lead-surfaces-note.d.ts +126 -0
- package/src/lib/components/lead-surfaces-note.js +262 -0
- package/src/lib/components/lead-surfaces-note.js.map +1 -0
- package/src/lib/components/lead-unqualify-dialog.d.ts +24 -0
- package/src/lib/components/lead-unqualify-dialog.js +125 -0
- package/src/lib/components/lead-unqualify-dialog.js.map +1 -0
- package/src/lib/components/leads-bulk-bar.d.ts +58 -0
- package/src/lib/components/leads-bulk-bar.js +307 -0
- package/src/lib/components/leads-bulk-bar.js.map +1 -0
- package/src/lib/components/leads-section.d.ts +23 -0
- package/src/lib/components/leads-section.js +664 -0
- package/src/lib/components/leads-section.js.map +1 -0
- package/src/lib/components/linked-deals-card.d.ts +32 -0
- package/src/lib/components/linked-deals-card.js +163 -0
- package/src/lib/components/linked-deals-card.js.map +1 -0
- package/src/lib/components/log-activity-dialog.d.ts +60 -0
- package/src/lib/components/log-activity-dialog.js +368 -0
- package/src/lib/components/log-activity-dialog.js.map +1 -0
- package/src/lib/components/lost-reason-dialog.d.ts +26 -0
- package/src/lib/components/lost-reason-dialog.js +95 -0
- package/src/lib/components/lost-reason-dialog.js.map +1 -0
- package/src/lib/components/new-contact-drawer.d.ts +78 -0
- package/src/lib/components/new-contact-drawer.js +343 -0
- package/src/lib/components/new-contact-drawer.js.map +1 -0
- package/src/lib/components/org-lead-surfaces-note.d.ts +57 -0
- package/src/lib/components/org-lead-surfaces-note.js +172 -0
- package/src/lib/components/org-lead-surfaces-note.js.map +1 -0
- package/src/lib/components/owner-avatar.d.ts +18 -0
- package/src/lib/components/owner-avatar.js +61 -0
- package/src/lib/components/owner-avatar.js.map +1 -0
- package/src/lib/components/pipeline-stages-dialog.d.ts +43 -0
- package/src/lib/components/pipeline-stages-dialog.js +339 -0
- package/src/lib/components/pipeline-stages-dialog.js.map +1 -0
- package/src/lib/components/pipelines-dialog.d.ts +55 -0
- package/src/lib/components/pipelines-dialog.js +517 -0
- package/src/lib/components/pipelines-dialog.js.map +1 -0
- package/src/lib/components/recent-activity-feed.d.ts +39 -0
- package/src/lib/components/recent-activity-feed.js +103 -0
- package/src/lib/components/recent-activity-feed.js.map +1 -0
- package/src/lib/components/recipes-card.d.ts +39 -0
- package/src/lib/components/recipes-card.js +485 -0
- package/src/lib/components/recipes-card.js.map +1 -0
- package/src/lib/components/record-activity-card.d.ts +26 -0
- package/src/lib/components/record-activity-card.js +121 -0
- package/src/lib/components/record-activity-card.js.map +1 -0
- package/src/lib/components/record-files-card.d.ts +67 -0
- package/src/lib/components/record-files-card.js +290 -0
- package/src/lib/components/record-files-card.js.map +1 -0
- package/src/lib/components/record-tasks-card.d.ts +32 -0
- package/src/lib/components/record-tasks-card.js +306 -0
- package/src/lib/components/record-tasks-card.js.map +1 -0
- package/src/lib/components/reports/activity-card.d.ts +57 -0
- package/src/lib/components/reports/activity-card.js +281 -0
- package/src/lib/components/reports/activity-card.js.map +1 -0
- package/src/lib/components/reports/closed-deals-card.d.ts +20 -0
- package/src/lib/components/reports/closed-deals-card.js +194 -0
- package/src/lib/components/reports/closed-deals-card.js.map +1 -0
- package/src/lib/components/reports/contacts-mix-card.d.ts +27 -0
- package/src/lib/components/reports/contacts-mix-card.js +161 -0
- package/src/lib/components/reports/contacts-mix-card.js.map +1 -0
- package/src/lib/components/reports/contacts-trend-card.d.ts +31 -0
- package/src/lib/components/reports/contacts-trend-card.js +144 -0
- package/src/lib/components/reports/contacts-trend-card.js.map +1 -0
- package/src/lib/components/reports/forecast-card.d.ts +22 -0
- package/src/lib/components/reports/forecast-card.js +251 -0
- package/src/lib/components/reports/forecast-card.js.map +1 -0
- package/src/lib/components/reports/lead-counts.d.ts +32 -0
- package/src/lib/components/reports/lead-counts.js +44 -0
- package/src/lib/components/reports/lead-counts.js.map +1 -0
- package/src/lib/components/reports/lead-funnel-card.d.ts +38 -0
- package/src/lib/components/reports/lead-funnel-card.js +375 -0
- package/src/lib/components/reports/lead-funnel-card.js.map +1 -0
- package/src/lib/components/reports/pipeline-card.d.ts +19 -0
- package/src/lib/components/reports/pipeline-card.js +338 -0
- package/src/lib/components/reports/pipeline-card.js.map +1 -0
- package/src/lib/components/reports/report-bar-chart.d.ts +39 -0
- package/src/lib/components/reports/report-bar-chart.js +133 -0
- package/src/lib/components/reports/report-bar-chart.js.map +1 -0
- package/src/lib/components/reports/report-breakdown.d.ts +32 -0
- package/src/lib/components/reports/report-breakdown.js +105 -0
- package/src/lib/components/reports/report-breakdown.js.map +1 -0
- package/src/lib/components/reports/report-export.d.ts +37 -0
- package/src/lib/components/reports/report-export.js +66 -0
- package/src/lib/components/reports/report-export.js.map +1 -0
- package/src/lib/components/reports/report-format.d.ts +36 -0
- package/src/lib/components/reports/report-format.js +43 -0
- package/src/lib/components/reports/report-format.js.map +1 -0
- package/src/lib/components/reports/report-scope.d.ts +81 -0
- package/src/lib/components/reports/report-scope.js +58 -0
- package/src/lib/components/reports/report-scope.js.map +1 -0
- package/src/lib/components/reports/report-stat-tile.d.ts +47 -0
- package/src/lib/components/reports/report-stat-tile.js +96 -0
- package/src/lib/components/reports/report-stat-tile.js.map +1 -0
- package/src/lib/components/reports/source-conversion-card.d.ts +28 -0
- package/src/lib/components/reports/source-conversion-card.js +205 -0
- package/src/lib/components/reports/source-conversion-card.js.map +1 -0
- package/src/lib/components/reports/tasks-card.d.ts +26 -0
- package/src/lib/components/reports/tasks-card.js +279 -0
- package/src/lib/components/reports/tasks-card.js.map +1 -0
- package/src/lib/components/reports/use-aggregate-read.d.ts +99 -0
- package/src/lib/components/reports/use-aggregate-read.js +195 -0
- package/src/lib/components/reports/use-aggregate-read.js.map +1 -0
- package/src/lib/components/reports/won-lost-by-owner-card.d.ts +30 -0
- package/src/lib/components/reports/won-lost-by-owner-card.js +168 -0
- package/src/lib/components/reports/won-lost-by-owner-card.js.map +1 -0
- package/src/lib/components/reports-section.d.ts +42 -0
- package/src/lib/components/reports-section.js +308 -0
- package/src/lib/components/reports-section.js.map +1 -0
- package/src/lib/components/sending-addresses-card.d.ts +49 -0
- package/src/lib/components/sending-addresses-card.js +262 -0
- package/src/lib/components/sending-addresses-card.js.map +1 -0
- package/src/lib/components/settings-section.d.ts +151 -0
- package/src/lib/components/settings-section.js +783 -0
- package/src/lib/components/settings-section.js.map +1 -0
- package/src/lib/components/task-cells.d.ts +51 -0
- package/src/lib/components/task-cells.js +139 -0
- package/src/lib/components/task-cells.js.map +1 -0
- package/src/lib/components/task-edit-drawer.d.ts +53 -0
- package/src/lib/components/task-edit-drawer.js +483 -0
- package/src/lib/components/task-edit-drawer.js.map +1 -0
- package/src/lib/components/task-import-drawer.d.ts +24 -0
- package/src/lib/components/task-import-drawer.js +82 -0
- package/src/lib/components/task-import-drawer.js.map +1 -0
- package/src/lib/components/task-snooze-menu.d.ts +65 -0
- package/src/lib/components/task-snooze-menu.js +207 -0
- package/src/lib/components/task-snooze-menu.js.map +1 -0
- package/src/lib/components/tasks-bulk-bar.d.ts +25 -0
- package/src/lib/components/tasks-bulk-bar.js +348 -0
- package/src/lib/components/tasks-bulk-bar.js.map +1 -0
- package/src/lib/components/tasks-calendar.d.ts +38 -0
- package/src/lib/components/tasks-calendar.js +228 -0
- package/src/lib/components/tasks-calendar.js.map +1 -0
- package/src/lib/components/tasks-section.d.ts +27 -0
- package/src/lib/components/tasks-section.js +579 -0
- package/src/lib/components/tasks-section.js.map +1 -0
- package/src/lib/components/use-contact-campaign-emails.d.ts +32 -0
- package/src/lib/components/use-contact-campaign-emails.js +83 -0
- package/src/lib/components/use-contact-campaign-emails.js.map +1 -0
- package/src/lib/components/use-crm-api.d.ts +44 -0
- package/src/lib/components/use-crm-api.js +84 -0
- package/src/lib/components/use-crm-api.js.map +1 -0
- package/src/lib/components/use-crm-inbound-address.d.ts +60 -0
- package/src/lib/components/use-crm-inbound-address.js +124 -0
- package/src/lib/components/use-crm-inbound-address.js.map +1 -0
- package/src/lib/components/use-emails-hub-path.d.ts +24 -0
- package/src/lib/components/use-emails-hub-path.js +59 -0
- package/src/lib/components/use-emails-hub-path.js.map +1 -0
- package/src/lib/components/use-member-email-aliases.d.ts +54 -0
- package/src/lib/components/use-member-email-aliases.js +186 -0
- package/src/lib/components/use-member-email-aliases.js.map +1 -0
- package/src/lib/components/use-org-members.d.ts +40 -0
- package/src/lib/components/use-org-members.js +100 -0
- package/src/lib/components/use-org-members.js.map +1 -0
- package/src/lib/constants/api-routes.d.ts +109 -0
- package/src/lib/constants/api-routes.js +74 -0
- package/src/lib/constants/api-routes.js.map +1 -0
- package/src/lib/constants/bundle-common.d.ts +14 -0
- package/src/lib/constants/bundle-common.js +14 -0
- package/src/lib/constants/bundle-common.js.map +1 -0
- package/src/lib/constants/company-filters.d.ts +18 -0
- package/src/lib/constants/company-filters.js +51 -0
- package/src/lib/constants/company-filters.js.map +1 -0
- package/src/lib/constants/contact-filters.d.ts +38 -0
- package/src/lib/constants/contact-filters.js +294 -0
- package/src/lib/constants/contact-filters.js.map +1 -0
- package/src/lib/hooks/use-contact-field-definitions.d.ts +48 -0
- package/src/lib/hooks/use-contact-field-definitions.js +72 -0
- package/src/lib/hooks/use-contact-field-definitions.js.map +1 -0
- package/src/lib/hooks/use-contact-update.d.ts +25 -0
- package/src/lib/hooks/use-contact-update.js +80 -0
- package/src/lib/hooks/use-contact-update.js.map +1 -0
- package/src/lib/hooks/use-crm-activity-logger.d.ts +73 -0
- package/src/lib/hooks/use-crm-activity-logger.js +101 -0
- package/src/lib/hooks/use-crm-activity-logger.js.map +1 -0
- package/src/lib/hooks/use-crm-bulk-apply.d.ts +52 -0
- package/src/lib/hooks/use-crm-bulk-apply.js +112 -0
- package/src/lib/hooks/use-crm-bulk-apply.js.map +1 -0
- package/src/lib/hooks/use-crm-default-view.d.ts +24 -0
- package/src/lib/hooks/use-crm-default-view.js +64 -0
- package/src/lib/hooks/use-crm-default-view.js.map +1 -0
- package/src/lib/hooks/use-crm-email-templates.d.ts +59 -0
- package/src/lib/hooks/use-crm-email-templates.js +103 -0
- package/src/lib/hooks/use-crm-email-templates.js.map +1 -0
- package/src/lib/hooks/use-crm-hub-path.d.ts +29 -0
- package/src/lib/hooks/use-crm-hub-path.js +41 -0
- package/src/lib/hooks/use-crm-hub-path.js.map +1 -0
- package/src/lib/hooks/use-crm-org-mount.d.ts +97 -0
- package/src/lib/hooks/use-crm-org-mount.js +215 -0
- package/src/lib/hooks/use-crm-org-mount.js.map +1 -0
- package/src/lib/hooks/use-crm-record-names.d.ts +52 -0
- package/src/lib/hooks/use-crm-record-names.js +126 -0
- package/src/lib/hooks/use-crm-record-names.js.map +1 -0
- package/src/lib/hooks/use-crm-records-quota.d.ts +68 -0
- package/src/lib/hooks/use-crm-records-quota.js +118 -0
- package/src/lib/hooks/use-crm-records-quota.js.map +1 -0
- package/src/lib/hooks/use-crm-saved-view.d.ts +96 -0
- package/src/lib/hooks/use-crm-saved-view.js +329 -0
- package/src/lib/hooks/use-crm-saved-view.js.map +1 -0
- package/src/lib/hooks/use-crm-scope.d.ts +117 -0
- package/src/lib/hooks/use-crm-scope.js +147 -0
- package/src/lib/hooks/use-crm-scope.js.map +1 -0
- package/src/lib/hooks/use-crm-tasks.d.ts +85 -0
- package/src/lib/hooks/use-crm-tasks.js +153 -0
- package/src/lib/hooks/use-crm-tasks.js.map +1 -0
- package/src/lib/hooks/use-crm-view-grid.d.ts +55 -0
- package/src/lib/hooks/use-crm-view-grid.js +170 -0
- package/src/lib/hooks/use-crm-view-grid.js.map +1 -0
- package/src/lib/hooks/use-crm-views.d.ts +42 -0
- package/src/lib/hooks/use-crm-views.js +84 -0
- package/src/lib/hooks/use-crm-views.js.map +1 -0
- package/src/lib/hooks/use-deal-stage-api.d.ts +69 -0
- package/src/lib/hooks/use-deal-stage-api.js +78 -0
- package/src/lib/hooks/use-deal-stage-api.js.map +1 -0
- package/src/lib/hooks/use-deals.d.ts +47 -0
- package/src/lib/hooks/use-deals.js +105 -0
- package/src/lib/hooks/use-deals.js.map +1 -0
- package/src/lib/hooks/use-org-leads.d.ts +53 -0
- package/src/lib/hooks/use-org-leads.js +114 -0
- package/src/lib/hooks/use-org-leads.js.map +1 -0
- package/src/lib/hooks/use-org-member-directory.d.ts +36 -0
- package/src/lib/hooks/use-org-member-directory.js +116 -0
- package/src/lib/hooks/use-org-member-directory.js.map +1 -0
- package/src/lib/hooks/use-org-member-options.d.ts +38 -0
- package/src/lib/hooks/use-org-member-options.js +131 -0
- package/src/lib/hooks/use-org-member-options.js.map +1 -0
- package/src/lib/hooks/use-pipeline.d.ts +71 -0
- package/src/lib/hooks/use-pipeline.js +159 -0
- package/src/lib/hooks/use-pipeline.js.map +1 -0
- package/src/lib/model/companies-bulk-writes.d.ts +40 -0
- package/src/lib/model/companies-bulk-writes.js +103 -0
- package/src/lib/model/companies-bulk-writes.js.map +1 -0
- package/src/lib/model/companies-csv.d.ts +36 -0
- package/src/lib/model/companies-csv.js +38 -0
- package/src/lib/model/companies-csv.js.map +1 -0
- package/src/lib/model/companies.d.ts +99 -0
- package/src/lib/model/companies.js +168 -0
- package/src/lib/model/companies.js.map +1 -0
- package/src/lib/model/company-delete-route.d.ts +43 -0
- package/src/lib/model/company-delete-route.js +31 -0
- package/src/lib/model/company-delete-route.js.map +1 -0
- package/src/lib/model/company-delete.d.ts +42 -0
- package/src/lib/model/company-delete.js +52 -0
- package/src/lib/model/company-delete.js.map +1 -0
- package/src/lib/model/contact-duplicates.d.ts +58 -0
- package/src/lib/model/contact-duplicates.js +67 -0
- package/src/lib/model/contact-duplicates.js.map +1 -0
- package/src/lib/model/contact-record.d.ts +113 -0
- package/src/lib/model/contact-record.js +70 -0
- package/src/lib/model/contact-record.js.map +1 -0
- package/src/lib/model/contact-update.d.ts +93 -0
- package/src/lib/model/contact-update.js +50 -0
- package/src/lib/model/contact-update.js.map +1 -0
- package/src/lib/model/contacts-bulk-writes.d.ts +173 -0
- package/src/lib/model/contacts-bulk-writes.js +196 -0
- package/src/lib/model/contacts-bulk-writes.js.map +1 -0
- package/src/lib/model/contacts-csv.d.ts +54 -0
- package/src/lib/model/contacts-csv.js +67 -0
- package/src/lib/model/contacts-csv.js.map +1 -0
- package/src/lib/model/contacts-list-seed.d.ts +51 -0
- package/src/lib/model/contacts-list-seed.js +63 -0
- package/src/lib/model/contacts-list-seed.js.map +1 -0
- package/src/lib/model/crm-activity-report.d.ts +27 -0
- package/src/lib/model/crm-activity-report.js +56 -0
- package/src/lib/model/crm-activity-report.js.map +1 -0
- package/src/lib/model/crm-api.d.ts +49 -0
- package/src/lib/model/crm-api.js +47 -0
- package/src/lib/model/crm-api.js.map +1 -0
- package/src/lib/model/crm-bulk-writes.d.ts +147 -0
- package/src/lib/model/crm-bulk-writes.js +207 -0
- package/src/lib/model/crm-bulk-writes.js.map +1 -0
- package/src/lib/model/crm-company-import.d.ts +154 -0
- package/src/lib/model/crm-company-import.js +331 -0
- package/src/lib/model/crm-company-import.js.map +1 -0
- package/src/lib/model/crm-custom-draft.d.ts +62 -0
- package/src/lib/model/crm-custom-draft.js +67 -0
- package/src/lib/model/crm-custom-draft.js.map +1 -0
- package/src/lib/model/crm-deal-import.d.ts +112 -0
- package/src/lib/model/crm-deal-import.js +263 -0
- package/src/lib/model/crm-deal-import.js.map +1 -0
- package/src/lib/model/crm-import.d.ts +244 -0
- package/src/lib/model/crm-import.js +466 -0
- package/src/lib/model/crm-import.js.map +1 -0
- package/src/lib/model/crm-lead-import.d.ts +105 -0
- package/src/lib/model/crm-lead-import.js +255 -0
- package/src/lib/model/crm-lead-import.js.map +1 -0
- package/src/lib/model/crm-record-routes.d.ts +21 -0
- package/src/lib/model/crm-record-routes.js +70 -0
- package/src/lib/model/crm-record-routes.js.map +1 -0
- package/src/lib/model/crm-routes.d.ts +101 -0
- package/src/lib/model/crm-routes.js +92 -0
- package/src/lib/model/crm-routes.js.map +1 -0
- package/src/lib/model/crm-task-import.d.ts +94 -0
- package/src/lib/model/crm-task-import.js +275 -0
- package/src/lib/model/crm-task-import.js.map +1 -0
- package/src/lib/model/crm-view-param.d.ts +43 -0
- package/src/lib/model/crm-view-param.js +49 -0
- package/src/lib/model/crm-view-param.js.map +1 -0
- package/src/lib/model/deal-board-model.d.ts +241 -0
- package/src/lib/model/deal-board-model.js +439 -0
- package/src/lib/model/deal-board-model.js.map +1 -0
- package/src/lib/model/deal-form-model.d.ts +114 -0
- package/src/lib/model/deal-form-model.js +218 -0
- package/src/lib/model/deal-form-model.js.map +1 -0
- package/src/lib/model/deals-csv.d.ts +32 -0
- package/src/lib/model/deals-csv.js +37 -0
- package/src/lib/model/deals-csv.js.map +1 -0
- package/src/lib/model/import-column-shapes.d.ts +36 -0
- package/src/lib/model/import-column-shapes.js +76 -0
- package/src/lib/model/import-column-shapes.js.map +1 -0
- package/src/lib/model/lead-company-suggestion.d.ts +61 -0
- package/src/lib/model/lead-company-suggestion.js +65 -0
- package/src/lib/model/lead-company-suggestion.js.map +1 -0
- package/src/lib/model/lead-filters.d.ts +29 -0
- package/src/lib/model/lead-filters.js +39 -0
- package/src/lib/model/lead-filters.js.map +1 -0
- package/src/lib/model/lead-surfaces.d.ts +58 -0
- package/src/lib/model/lead-surfaces.js +67 -0
- package/src/lib/model/lead-surfaces.js.map +1 -0
- package/src/lib/model/leads-csv.d.ts +40 -0
- package/src/lib/model/leads-csv.js +40 -0
- package/src/lib/model/leads-csv.js.map +1 -0
- package/src/lib/model/next-activity-api.d.ts +31 -0
- package/src/lib/model/next-activity-api.js +57 -0
- package/src/lib/model/next-activity-api.js.map +1 -0
- package/src/lib/model/next-activity.d.ts +64 -0
- package/src/lib/model/next-activity.js +47 -0
- package/src/lib/model/next-activity.js.map +1 -0
- package/src/lib/model/person-key-web.d.ts +43 -0
- package/src/lib/model/person-key-web.js +52 -0
- package/src/lib/model/person-key-web.js.map +1 -0
- package/src/lib/model/record-facts.d.ts +282 -0
- package/src/lib/model/record-facts.js +434 -0
- package/src/lib/model/record-facts.js.map +1 -0
- package/src/lib/model/task-api.d.ts +28 -0
- package/src/lib/model/task-api.js +57 -0
- package/src/lib/model/task-api.js.map +1 -0
- package/src/lib/model/task-calendar.d.ts +108 -0
- package/src/lib/model/task-calendar.js +139 -0
- package/src/lib/model/task-calendar.js.map +1 -0
- package/src/lib/model/task-routes.d.ts +177 -0
- package/src/lib/model/task-routes.js +197 -0
- package/src/lib/model/task-routes.js.map +1 -0
- package/src/lib/model/task-scope.d.ts +45 -0
- package/src/lib/model/task-scope.js +51 -0
- package/src/lib/model/task-scope.js.map +1 -0
- package/src/lib/model/task-views.d.ts +149 -0
- package/src/lib/model/task-views.js +286 -0
- package/src/lib/model/task-views.js.map +1 -0
- package/src/lib/model/tasks-csv.d.ts +28 -0
- package/src/lib/model/tasks-csv.js +28 -0
- package/src/lib/model/tasks-csv.js.map +1 -0
- package/src/lib/plugin.d.ts +32 -0
- package/src/lib/plugin.js +208 -0
- package/src/lib/plugin.js.map +1 -0
- package/src/lib/server/companies-import.d.ts +57 -0
- package/src/lib/server/companies-import.js +242 -0
- package/src/lib/server/companies-import.js.map +1 -0
- package/src/lib/server/company-delete.d.ts +59 -0
- package/src/lib/server/company-delete.js +146 -0
- package/src/lib/server/company-delete.js.map +1 -0
- package/src/lib/server/contact-email-history.d.ts +82 -0
- package/src/lib/server/contact-email-history.js +264 -0
- package/src/lib/server/contact-email-history.js.map +1 -0
- package/src/lib/server/contact-profile.d.ts +41 -0
- package/src/lib/server/contact-profile.js +45 -0
- package/src/lib/server/contact-profile.js.map +1 -0
- package/src/lib/server/contact-update.d.ts +92 -0
- package/src/lib/server/contact-update.js +512 -0
- package/src/lib/server/contact-update.js.map +1 -0
- package/src/lib/server/contacts-import.d.ts +73 -0
- package/src/lib/server/contacts-import.js +263 -0
- package/src/lib/server/contacts-import.js.map +1 -0
- package/src/lib/server/contacts-merge.d.ts +86 -0
- package/src/lib/server/contacts-merge.js +206 -0
- package/src/lib/server/contacts-merge.js.map +1 -0
- package/src/lib/server/deals-import.d.ts +76 -0
- package/src/lib/server/deals-import.js +246 -0
- package/src/lib/server/deals-import.js.map +1 -0
- package/src/lib/server/email-send.d.ts +119 -0
- package/src/lib/server/email-send.js +667 -0
- package/src/lib/server/email-send.js.map +1 -0
- package/src/lib/server/email-template-duplicate.d.ts +19 -0
- package/src/lib/server/email-template-duplicate.js +206 -0
- package/src/lib/server/email-template-duplicate.js.map +1 -0
- package/src/lib/server/erase-person.d.ts +108 -0
- package/src/lib/server/erase-person.js +309 -0
- package/src/lib/server/erase-person.js.map +1 -0
- package/src/lib/server/import-context.d.ts +85 -0
- package/src/lib/server/import-context.js +181 -0
- package/src/lib/server/import-context.js.map +1 -0
- package/src/lib/server/inbound-address.d.ts +61 -0
- package/src/lib/server/inbound-address.js +188 -0
- package/src/lib/server/inbound-address.js.map +1 -0
- package/src/lib/server/lead-convert.d.ts +78 -0
- package/src/lib/server/lead-convert.js +250 -0
- package/src/lib/server/lead-convert.js.map +1 -0
- package/src/lib/server/leads-import.d.ts +84 -0
- package/src/lib/server/leads-import.js +261 -0
- package/src/lib/server/leads-import.js.map +1 -0
- package/src/lib/server/next-activity-routes.d.ts +33 -0
- package/src/lib/server/next-activity-routes.js +110 -0
- package/src/lib/server/next-activity-routes.js.map +1 -0
- package/src/lib/server/org-activity.d.ts +61 -0
- package/src/lib/server/org-activity.js +120 -0
- package/src/lib/server/org-activity.js.map +1 -0
- package/src/lib/server/org-caller.d.ts +110 -0
- package/src/lib/server/org-caller.js +154 -0
- package/src/lib/server/org-caller.js.map +1 -0
- package/src/lib/server/recipe-routes.d.ts +75 -0
- package/src/lib/server/recipe-routes.js +442 -0
- package/src/lib/server/recipe-routes.js.map +1 -0
- package/src/lib/server/record-facts.d.ts +65 -0
- package/src/lib/server/record-facts.js +337 -0
- package/src/lib/server/record-facts.js.map +1 -0
- package/src/lib/server/record-timeline.d.ts +51 -0
- package/src/lib/server/record-timeline.js +215 -0
- package/src/lib/server/record-timeline.js.map +1 -0
- package/src/lib/server/suite-gate.d.ts +42 -0
- package/src/lib/server/suite-gate.js +87 -0
- package/src/lib/server/suite-gate.js.map +1 -0
- package/src/lib/server/task-routes.d.ts +132 -0
- package/src/lib/server/task-routes.js +699 -0
- package/src/lib/server/task-routes.js.map +1 -0
- package/src/lib/server/tasks-import.d.ts +54 -0
- package/src/lib/server/tasks-import.js +157 -0
- package/src/lib/server/tasks-import.js.map +1 -0
- package/src/lib/server-deal-stage.d.ts +88 -0
- package/src/lib/server-deal-stage.js +316 -0
- package/src/lib/server-deal-stage.js.map +1 -0
- package/src/lib/server.d.ts +149 -0
- package/src/lib/server.js +615 -0
- package/src/lib/server.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/crm-send-email-dialog.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n type AglynOrgBilling,\n CRM_EMAIL_BODY_MAX,\n CRM_EMAIL_SUBJECT_MAX,\n normalizeContactEmail,\n consentGroupForHost,\n CRM_COLLECTIONS,\n createResourceUid,\n type CrmEmailTemplateRow,\n type CrmMergeContext,\n type CrmMergeFieldGroup,\n crmMergeUnresolvedMessage,\n hasCrmMergeFields,\n resolveCrmMergeFields,\n} from '@aglyn/aglyn'\nimport { useConsoleWidgetSlot } from '@aglyn/aglyn/app-utils/console-widget-slot-context'\nimport type { ConsoleRecordEmailDraft } from '@aglyn/aglyn/plugin-manager/record-zone-props'\nimport { useSendingApi } from '@aglyn/tenant-feature-instance/hooks/use-sending-identity-api'\nimport { AppLink, useConfirmationContext } from '@aglyn/shared-ui-jsx'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport {\n useFirestore,\n useOrgDataScope,\n useUser,\n} from '@aglyn/tenant-feature-instance'\nimport {\n Alert,\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n InputAdornment,\n Stack,\n TextField,\n Typography,\n} from '@mui/material'\nimport { collection, doc, getDoc, setDoc } from 'firebase/firestore'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useCrmOrgMount } from '../hooks/use-crm-org-mount'\nimport { CrmRecordBookingZone } from './crm-booking-zone'\nimport { insertLinkAtCaret } from './insert-link-at-caret'\nimport {\n CAPTURE_ADDRESS_HELPER,\n CopyCaptureAddressButton,\n} from './copy-capture-address-button'\nimport { CrmSitePicker } from './crm-site-picker'\nimport { useCrmApi } from './use-crm-api'\nimport { useCrmInboundAddress } from './use-crm-inbound-address'\nimport { useEmailsHubPath } from './use-emails-hub-path'\nimport {\n useCrmEmailTemplates,\n useCrmEmailTemplateScope,\n} from '../hooks/use-crm-email-templates'\nimport {\n CrmInsertMenu,\n CrmSaveAsTemplateDialog,\n CrmTemplatePicker,\n} from './crm-email-template-tools'\n\n/**\n * The documents a merge-field preview reads (AGL-2658), fetched once per\n * open and only once the draft names a field: a letter with no fields\n * costs no reads. `site` is the sending site's name; `loaded` says the\n * fetch has answered, so the helper text can tell \"no value\" from \"not\n * yet read\".\n */\ninterface MergeRecords {\n contact: Record<string, unknown> | null\n deal: Record<string, unknown> | null\n lead: Record<string, unknown> | null\n site: string | null\n loaded: boolean\n}\n\nconst NO_MERGE_RECORDS: MergeRecords = {\n contact: null,\n deal: null,\n lead: null,\n site: null,\n loaded: false,\n}\n\n/**\n * What the sending-identity route said about this site, as the dialog\n * needs it: an address to print, or the reason there is none — or, at the\n * organization level, that no site has been picked to ask about.\n */\ntype IdentityState =\n | { status: 'loading' }\n | { status: 'site' }\n | { status: 'ready'; from: string }\n | { status: 'refused'; message: string; canManage: boolean }\n | { status: 'error'; message: string }\n\nexport interface CrmSendEmailDialogProps {\n open: boolean\n onClose: () => void\n /**\n * The site the message leaves from — passed in, never assumed from the\n * URL. At the organization level the record's own capturing site, or\n * `null` for a record no site has captured (AGL-2634): the dialog then\n * offers the org's sites to send from, defaulting to the reader's pick.\n */\n hostId: string | null\n /** The org the shell passed; lets a deal's contact be read without a lookup. */\n org?: Partial<AglynOrgBilling> | null\n contactId?: string\n leadId?: string\n dealId?: string\n /**\n * The recipient as the record shows it. A deal's page holds no address,\n * so a caller with only a `contactId` may leave this out and the dialog\n * reads it off the contact when it opens.\n */\n email?: string | null\n /** What the dialog says it is writing to, beside the address. */\n name?: string | null\n /** Told once the route has accepted the message. */\n onSent?: (result: { activityId: string }) => void\n}\n\n/**\n * One email to one person, from their record (AGL-2615).\n *\n * ## What the reader sees, and what they cannot change\n *\n * To is the record's address and is read-only: the route resolves the\n * recipient off the record again, so an editable field here would be a\n * promise the server does not keep. From is the site's sending identity as\n * the sending-identity route reports it — the same answer the campaign\n * composer prints — and when that route refuses, the dialog says why and\n * points at **Emails › Sending** rather than offering a Send button that\n * 409s. Reply-to is the signed-in user's own address, because a reply to a\n * relationship email belongs in the inbox of the person who wrote it, not\n * the site's shared mailbox. Subject and Body are the whole of what a\n * person writes; the body is plain paragraphs, and the email design system\n * is deliberately not here — this is a letter, not a campaign.\n *\n * ## A refusal stays on screen\n *\n * The route's refusals — the daily cap, a suppressed address, a stated\n * refusal, the ceiling — are answers the rep should read, so they render\n * inside the dialog with the draft intact rather than as a toast over a\n * closed one. Only a send the provider accepted closes it.\n *\n * Mounted on open by its button, so the identity request and the contact\n * read happen when somebody asks and not on every record page paint.\n */\nexport function CrmSendEmailDialog(props: CrmSendEmailDialogProps) {\n const { open, onClose, hostId, org, contactId, leadId, dealId, onSent } = props\n const firestore = useFirestore()\n const mount = useCrmOrgMount()\n const { orgId } = useOrgDataScope({\n hostId: hostId ?? undefined,\n orgId: org?.$id ?? mount?.orgId,\n })\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const sendingApi = useSendingApi()\n /*\n * The site the message LEAVES FROM: the record's own, or at the\n * organization level — for a record no site captured — the site the\n * reader picked (AGL-2634). The identity, the suppression list and the\n * person's stated refusal are each that site's, which is why the org\n * level cannot do without one.\n */\n const sendHostId = hostId ?? mount?.createHostId ?? null\n const crmApi = useCrmApi(sendHostId)\n const emailsHub = useEmailsHubPath(sendHostId)\n // The capture address (AGL-2657), for the reply this send will get: the\n // console logs what IT sends, so the address is shown to be forwarded\n // to or copied from a mailbox, never put on this message.\n const capture = useCrmInboundAddress(sendHostId, { enabled: open })\n // The Sending section of the Emails console — the page that fixes a\n // missing identity. `null` on a surface that cannot name the site's hub,\n // so the refusal prints the section's name instead of a link to nowhere.\n const sendingPath = emailsHub ? `${emailsHub}/sending` : null\n\n const [identity, setIdentity] = useState<IdentityState>({ status: 'loading' })\n const [recipient, setRecipient] = useState<string | null>(\n normalizeContactEmail(props.email) ?? null,\n )\n const [subject, setSubject] = useState('')\n const [body, setBody] = useState('')\n const [sending, setSending] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n /*\n * TEMPLATES, SNIPPETS AND MERGE FIELDS (AGL-2658). The listener is the\n * dialog's own scope — the mounted site's tokens, or none at the org\n * level — and what a saved template is stamped with follows the same\n * rule. The message field's element is held so a snippet lands at the\n * caret rather than at the end.\n */\n const { confirm } = useConfirmationContext()\n const templateScope = useCrmEmailTemplateScope({ hostId, org })\n const { templates } = useCrmEmailTemplates({\n scope: templateScope.scope,\n visibleTo: templateScope.visibleTo,\n uid: user?.uid,\n })\n const pickable = useMemo(() => templates.filter((row) => row.kind === 'template'), [templates])\n const snippets = useMemo(() => templates.filter((row) => row.kind === 'snippet'), [templates])\n const [appliedTemplate, setAppliedTemplate] = useState<CrmEmailTemplateRow | null>(null)\n const [saveOpen, setSaveOpen] = useState(false)\n const [records, setRecords] = useState<MergeRecords>(NO_MERGE_RECORDS)\n const messageRef = useRef<HTMLTextAreaElement | null>(null)\n const draftHasFields = hasCrmMergeFields(`${subject}\\n${body}`)\n // The groups the Insert menu offers: what the record can answer.\n const fieldGroups = useMemo<CrmMergeFieldGroup[]>(\n () => [\n ...(contactId || dealId ? (['Contact'] as const) : []),\n ...(leadId && !contactId ? (['Lead'] as const) : []),\n ...(dealId ? (['Deal'] as const) : []),\n 'You',\n 'Site',\n ],\n [contactId, dealId, leadId],\n )\n\n /*\n * The identity, asked for on open. The route is the send path's own\n * resolver, so what it prints here is what the message will leave as; a\n * dialog that derived \"verified\" from the domain list would be a second\n * opinion that drifts from the send.\n */\n useEffect(() => {\n if (!open) return\n let cancelled = false\n setError(null)\n // The draft survives a change of sending site — the site is not the\n // letter — and is cleared only when the dialog opens.\n if (!sendHostId) {\n setIdentity({ status: 'site' })\n return undefined\n }\n setIdentity({ status: 'loading' })\n void (async () => {\n const { response, payload } = await sendingApi({\n path: 'sending-identity',\n method: 'GET',\n query: { hostId: sendHostId },\n })\n if (cancelled) return\n if (!response.ok) {\n setIdentity({\n status: 'error',\n message: String(payload['error'] ?? 'The sending identity could not be read.'),\n })\n return\n }\n const refusal = payload['refusal'] as { message?: string } | null\n if (refusal) {\n setIdentity({\n status: 'refused',\n message: String(refusal.message ?? 'This site has no verified sending identity.'),\n canManage: payload['canManage'] === true,\n })\n return\n }\n const senders = Array.isArray(payload['senders'])\n ? (payload['senders'] as { isDefault?: boolean; from?: string | null }[])\n : []\n const from =\n senders.find((sender) => sender.isDefault && sender.from)?.from ??\n senders.find((sender) => sender.from)?.from ??\n null\n setIdentity(\n from\n ? { status: 'ready', from }\n : {\n status: 'error',\n message: String(payload['identity'] ?? 'No sending address is in effect.'),\n },\n )\n })()\n return () => {\n cancelled = true\n }\n }, [open, sendHostId, sendingApi])\n useEffect(() => {\n if (!open) return\n setSubject('')\n setBody('')\n setAppliedTemplate(null)\n setSaveOpen(false)\n setRecords(NO_MERGE_RECORDS)\n }, [open])\n\n /*\n * The documents a preview reads, fetched the first time the draft names\n * a merge field and kept for the rest of the open: the contact, the\n * deal, the lead, and the sending site's name — off the org mount when\n * it knows the site, off the host document otherwise. The route reads\n * the same documents again for the send; these are what the rep sees.\n */\n useEffect(() => {\n if (!open || !draftHasFields || records.loaded) return\n let cancelled = false\n const read = async (path: string[] | null): Promise<Record<string, unknown> | null> => {\n if (!path) return null\n const snapshot = await getDoc(doc(firestore, path[0], ...path.slice(1)))\n return snapshot.exists() ? ((snapshot.data() ?? null) as Record<string, unknown> | null) : null\n }\n const mountedSite = sendHostId\n ? (mount?.hosts ?? []).find((host) => host.id === sendHostId)\n : undefined\n void Promise.all([\n read(contactId && orgId ? ['orgs', orgId, 'contacts', contactId] : null),\n read(dealId && orgId ? ['orgs', orgId, CRM_COLLECTIONS.deals, dealId] : null),\n read(leadId && sendHostId ? ['hosts', sendHostId, 'leads', leadId] : null),\n mountedSite || !sendHostId ? null : read(['hosts', sendHostId]),\n ])\n .then(([contact, deal, lead, host]) => {\n if (cancelled) return\n // A deal's contact, when the page named only the deal.\n const dealContactId = String(deal?.['contactId'] ?? '').trim()\n const withContact =\n !contact && dealContactId && orgId\n ? read(['orgs', orgId, 'contacts', dealContactId])\n : Promise.resolve(contact)\n return withContact.then((resolvedContact) => {\n if (cancelled) return\n setRecords({\n contact: resolvedContact,\n deal,\n lead,\n site: mountedSite?.name ?? (host ? String(host['displayName'] ?? '') : null),\n loaded: true,\n })\n })\n })\n .catch((cause) => {\n console.error(cause)\n if (!cancelled) setRecords({ ...NO_MERGE_RECORDS, loaded: true })\n })\n return () => {\n cancelled = true\n }\n }, [\n open,\n draftHasFields,\n records.loaded,\n firestore,\n orgId,\n contactId,\n dealId,\n leadId,\n sendHostId,\n mount?.hosts,\n ])\n\n const mergeContext = useMemo<CrmMergeContext>(\n () => ({\n contact: records.contact,\n contactGroupId: sendHostId ? consentGroupForHost(org ?? null, sendHostId).groupId : null,\n deal: records.deal,\n lead: records.lead,\n sender: { name: user?.displayName ?? '', email: user?.email ?? '' },\n site: { name: records.site ?? '' },\n }),\n [records, sendHostId, org, user?.displayName, user?.email],\n )\n const preview = useMemo(\n () =>\n draftHasFields && records.loaded\n ? {\n subject: resolveCrmMergeFields(subject, mergeContext),\n body: resolveCrmMergeFields(body, mergeContext),\n }\n : null,\n [draftHasFields, records.loaded, subject, body, mergeContext],\n )\n const unresolved = useMemo(\n () =>\n preview\n ? [...new Set([...preview.subject.unresolved, ...preview.body.unresolved])]\n : [],\n [preview],\n )\n\n /** A template into both fields — asking first when a message is already written. */\n const applyTemplate = useCallback(\n async (template: CrmEmailTemplateRow | null) => {\n if (!template) {\n setAppliedTemplate(null)\n return\n }\n const written = body.trim().length > 0 && body !== appliedTemplate?.body\n if (written) {\n const accepted = await confirm({\n title: 'Replace the message?',\n description: `\"${template.name}\" replaces what you have written in the subject and the message.`,\n confirmationText: 'Replace',\n })\n .then(() => true)\n .catch(() => false)\n if (!accepted) return\n }\n if (template.subject) setSubject(template.subject)\n setBody(template.body)\n setAppliedTemplate(template)\n },\n [body, appliedTemplate, confirm],\n )\n\n /*\n * The `recordEmail` zone (AGL-2917), hosted through the shell's renderer: a\n * widget there proposes a subject and a message, which land in the fields\n * above like a template does, asking first when a message is already\n * written. Send is still the only write, and the zone reads the record the\n * message is written from: the deal over its contact, a lead on its own site,\n * and at the organization level a contact or a deal the org reads.\n */\n const EmailDraftSlot = useConsoleWidgetSlot()\n const proposeDraft = useCallback(\n async (draft: ConsoleRecordEmailDraft) => {\n const next = { subject: draft.subject.slice(0, CRM_EMAIL_SUBJECT_MAX), body: draft.body.slice(0, CRM_EMAIL_BODY_MAX) }\n if (body.trim() && body !== next.body) {\n const accepted = await confirm({\n title: 'Replace the message?',\n description: 'The draft replaces what you have written in the subject and the message.',\n confirmationText: 'Replace',\n })\n .then(() => true)\n .catch(() => false)\n if (!accepted) return\n }\n setSubject(next.subject)\n setBody(next.body)\n setAppliedTemplate(null)\n },\n [body, confirm],\n )\n const draftRecord = dealId\n ? { kind: 'deal', id: dealId }\n : leadId\n ? { kind: 'lead', id: leadId }\n : contactId\n ? { kind: 'contact', id: contactId }\n : null\n\n /** A snippet or a field where the caret is, the caret moved past it. */\n const insertAtCaret = useCallback(\n (text: string) => {\n const element = messageRef.current\n const start = element?.selectionStart ?? body.length\n const end = element?.selectionEnd ?? body.length\n const next = `${body.slice(0, start)}${text}${body.slice(end)}`.slice(0, CRM_EMAIL_BODY_MAX)\n setBody(next)\n const caret = Math.min(start + text.length, next.length)\n window.setTimeout(() => {\n element?.focus()\n element?.setSelectionRange(caret, caret)\n }, 0)\n },\n [body],\n )\n\n /**\n * The draft kept as a template, stamped as this surface's scope stamps\n * every CRM record — the site's tokens under a site, the org token from\n * the organization's hub — and, when personal, owned by the writer.\n */\n const saveAsTemplate = useCallback(\n async (draft: { name: string; visibility: 'shared' | 'personal' }) => {\n const scope = templateScope.scope\n const uid = user?.uid\n if (!scope || !uid || templateScope.createTokens.length === 0) {\n throw new Error('a template needs an organization and a signed-in writer')\n }\n const now = Date.now()\n await setDoc(\n doc(collection(firestore, scope[0], scope[1], CRM_COLLECTIONS.emailTemplates), createResourceUid()),\n {\n name: draft.name,\n subject: subject.trim(),\n body: body.trim(),\n kind: 'template',\n visibility: draft.visibility,\n ...(draft.visibility === 'personal' ? { ownerUid: uid } : {}),\n createdByUid: uid,\n createdAtMs: now,\n updatedAtMs: now,\n hostId: templateScope.createHostId,\n visibleTo: [...templateScope.createTokens],\n createdAt: new Date(now),\n updatedAt: new Date(now),\n },\n )\n enqueueSnackbar(`Template \"${draft.name}\" saved`, { variant: 'success', persist: false })\n setSaveOpen(false)\n },\n [templateScope, user?.uid, firestore, subject, body, enqueueSnackbar],\n )\n\n /*\n * The address, when the caller had none: one read of the contact, on\n * open. The route reads it again for itself; this one is what the To\n * field prints, and a field that printed nothing until the send answered\n * would ask the rep to write to somebody unnamed.\n */\n useEffect(() => {\n if (!open) return\n const given = normalizeContactEmail(props.email)\n if (given) {\n setRecipient(given)\n return\n }\n if (!contactId || !orgId) return\n let cancelled = false\n void getDoc(doc(firestore, 'orgs', orgId, 'contacts', contactId))\n .then((snapshot) => {\n if (cancelled) return\n setRecipient(normalizeContactEmail(snapshot.get('email')) ?? null)\n })\n .catch((cause) => {\n console.error(cause)\n if (!cancelled) setRecipient(null)\n })\n return () => {\n cancelled = true\n }\n }, [open, props.email, contactId, orgId, firestore])\n\n const replyTo = normalizeContactEmail(user?.email) ?? ''\n const canSend =\n identity.status === 'ready' &&\n Boolean(recipient) &&\n subject.trim().length > 0 &&\n body.trim().length > 0 &&\n !sending\n\n const handleSend = useCallback(async () => {\n if (!canSend) return\n setSending(true)\n setError(null)\n try {\n const { response, payload } = await crmApi('email-send', {\n ...(contactId ? { contactId } : {}),\n ...(leadId ? { leadId } : {}),\n ...(dealId ? { dealId } : {}),\n subject: subject.trim(),\n body: body.trim(),\n })\n if (!response.ok) {\n setError(String(payload['error'] ?? 'The email could not be sent.'))\n return\n }\n enqueueSnackbar('Email sent', { variant: 'success', persist: false })\n onSent?.({ activityId: String(payload['activityId'] ?? '') })\n onClose()\n } catch (cause) {\n console.error(cause)\n setError('The email could not be sent.')\n } finally {\n setSending(false)\n }\n }, [canSend, crmApi, contactId, leadId, dealId, subject, body, enqueueSnackbar, onSent, onClose])\n\n const toLabel = props.name && recipient ? `${props.name} <${recipient}>` : (recipient ?? '')\n\n /*\n * The booking door (AGL-2660): a link to one of the sending site's\n * services, dropped where the caret is. The link carries the most\n * specific record this message is about — the deal over its contact, so\n * the booking lands on the deal's timeline as the email does.\n */\n const bookingRef = dealId\n ? { kind: 'deal' as const, id: dealId }\n : leadId\n ? { kind: 'lead' as const, id: leadId }\n : contactId\n ? { kind: 'contact' as const, id: contactId }\n : null\n const handleInsertLink = useCallback((link: string) => {\n const input = messageRef.current\n const current = input?.value ?? ''\n const start = input?.selectionStart ?? current.length\n const end = input?.selectionEnd ?? start\n const next = insertLinkAtCaret(current, link, start, end)\n setBody(next.text)\n // Once the new value has painted, typing continues after the link.\n window.setTimeout(() => {\n input?.focus()\n input?.setSelectionRange(next.caret, next.caret)\n }, 0)\n }, [])\n\n return (\n <Dialog open={open} onClose={sending ? undefined : onClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>{'Send email'}</DialogTitle>\n <DialogContent sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {!hostId ? (\n <CrmSitePicker\n hostId={hostId}\n label=\"Send from\"\n helperText=\"The site whose sending address the email leaves on.\"\n disabled={sending}\n />\n ) : null}\n {identity.status === 'site' ? (\n <Alert severity=\"info\" sx={{ mt: 1 }}>\n {'Pick the site the email leaves from.'}\n </Alert>\n ) : identity.status === 'refused' ? (\n <Alert severity=\"warning\" sx={{ mt: 1 }}>\n <Typography variant=\"body2\">{identity.message}</Typography>\n {sendingPath ? (\n <Typography variant=\"body2\" sx={{ mt: 0.5 }}>\n <AppLink href={sendingPath}>\n {identity.canManage ? 'Set up sending' : 'See sending'}\n </AppLink>\n </Typography>\n ) : (\n <Typography variant=\"body2\" sx={{ mt: 0.5 }}>\n {'An admin sets this up under Emails › Sending.'}\n </Typography>\n )}\n </Alert>\n ) : identity.status === 'error' ? (\n <Alert severity=\"error\" sx={{ mt: 1 }}>\n {identity.message}\n </Alert>\n ) : null}\n {open && !recipient && (identity.status === 'ready' || identity.status === 'loading') ? (\n <Alert severity=\"warning\" sx={{ mt: 1 }}>\n {'This record has no email address.'}\n </Alert>\n ) : null}\n <TextField\n size=\"small\"\n label=\"To\"\n value={toLabel}\n slotProps={{ input: { readOnly: true }, inputLabel: { shrink: true } }}\n sx={{ mt: identity.status === 'ready' || identity.status === 'loading' ? 1 : 0 }}\n />\n <TextField\n size=\"small\"\n label=\"From\"\n value={\n identity.status === 'ready'\n ? identity.from\n : identity.status === 'loading'\n ? 'Resolving the site’s sending address…'\n : identity.status === 'site'\n ? 'Pick a site to send from'\n : ''\n }\n slotProps={{ input: { readOnly: true }, inputLabel: { shrink: true } }}\n />\n <TextField\n size=\"small\"\n label=\"Reply-to\"\n value={replyTo}\n helperText=\"Replies come to you, not to the site's mailbox.\"\n slotProps={{ input: { readOnly: true }, inputLabel: { shrink: true } }}\n />\n {capture.status === 'ready' ? (\n <TextField\n size=\"small\"\n label=\"Log replies\"\n value={capture.address}\n helperText={CAPTURE_ADDRESS_HELPER}\n slotProps={{\n input: {\n readOnly: true,\n endAdornment: (\n <InputAdornment position=\"end\">\n <CopyCaptureAddressButton address={capture.address} />\n </InputAdornment>\n ),\n },\n inputLabel: { shrink: true },\n }}\n />\n ) : null}\n {pickable.length ? (\n <CrmTemplatePicker\n templates={pickable}\n value={appliedTemplate}\n onChange={(template) => void applyTemplate(template)}\n disabled={sending}\n />\n ) : null}\n <TextField\n size=\"small\"\n label=\"Subject\"\n value={subject}\n onChange={(event) => setSubject(event.target.value)}\n autoFocus\n slotProps={{ htmlInput: { maxLength: CRM_EMAIL_SUBJECT_MAX } }}\n />\n <Stack direction=\"row\" spacing={1} sx={{ justifyContent: 'flex-end' }}>\n <CrmInsertMenu\n snippets={snippets}\n groups={fieldGroups}\n disabled={sending}\n onInsert={insertAtCaret}\n />\n <Button\n size=\"small\"\n disabled={sending || !templateScope.scope || (!subject.trim() && !body.trim())}\n onClick={() => setSaveOpen(true)}\n >\n {'Save as template…'}\n </Button>\n </Stack>\n <TextField\n size=\"small\"\n label=\"Message\"\n value={body}\n onChange={(event) => setBody(event.target.value)}\n multiline\n minRows={6}\n inputRef={messageRef}\n helperText={\n unresolved.length\n ? crmMergeUnresolvedMessage(unresolved)\n : draftHasFields\n ? 'Plain text. Merge fields are filled in from this record when the email is sent.'\n : 'Plain text. A blank line starts a new paragraph.'\n }\n slotProps={{\n htmlInput: { maxLength: CRM_EMAIL_BODY_MAX },\n formHelperText: { sx: unresolved.length ? { color: 'warning.main' } : undefined },\n }}\n />\n {EmailDraftSlot && draftRecord ? (\n <EmailDraftSlot\n slot=\"recordEmail\"\n // A lead is read on its own site; a contact or a deal at the level\n // the composer was opened at.\n hostId={draftRecord.kind === 'lead' || !mount ? hostId : null}\n orgId={orgId ?? undefined}\n record={{ ...draftRecord, name: String(props.name ?? '') }}\n subject={subject}\n body={body}\n proposeDraft={(draft: ConsoleRecordEmailDraft) => void proposeDraft(draft)}\n />\n ) : null}\n {preview ? (\n <Stack spacing={0.5} data-testid=\"crm-email-preview\">\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Preview — as it will be sent'}\n </Typography>\n <Typography variant=\"subtitle2\">{preview.subject.text}</Typography>\n <Typography variant=\"body2\" sx={{ whiteSpace: 'pre-wrap' }}>\n {preview.body.text}\n </Typography>\n </Stack>\n ) : null}\n {bookingRef ? (\n <CrmRecordBookingZone\n variant=\"chip\"\n hostId={sendHostId}\n org={org}\n kind={bookingRef.kind}\n recordId={bookingRef.id}\n onInsert={handleInsertLink}\n />\n ) : null}\n {error ? <Alert severity=\"error\">{error}</Alert> : null}\n </DialogContent>\n <CrmSaveAsTemplateDialog\n open={saveOpen}\n onClose={() => setSaveOpen(false)}\n onSave={saveAsTemplate}\n />\n <DialogActions>\n <Button onClick={onClose} disabled={sending}>\n {'Cancel'}\n </Button>\n <Button variant=\"contained\" color=\"primary\" disabled={!canSend} onClick={handleSend}>\n {sending ? 'Sending…' : 'Send'}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\nCrmSendEmailDialog.displayName = 'CrmSendEmailDialog'\n\nexport default CrmSendEmailDialog\n"],"names":["CRM_EMAIL_BODY_MAX","CRM_EMAIL_SUBJECT_MAX","normalizeContactEmail","consentGroupForHost","CRM_COLLECTIONS","createResourceUid","crmMergeUnresolvedMessage","hasCrmMergeFields","resolveCrmMergeFields","useConsoleWidgetSlot","useSendingApi","AppLink","useConfirmationContext","useSnackbar","useFirestore","useOrgDataScope","useUser","Alert","Button","Dialog","DialogActions","DialogContent","DialogTitle","InputAdornment","Stack","TextField","Typography","collection","doc","getDoc","setDoc","useCallback","useEffect","useMemo","useRef","useState","useCrmOrgMount","CrmRecordBookingZone","insertLinkAtCaret","CAPTURE_ADDRESS_HELPER","CopyCaptureAddressButton","CrmSitePicker","useCrmApi","useCrmInboundAddress","useEmailsHubPath","useCrmEmailTemplates","useCrmEmailTemplateScope","CrmInsertMenu","CrmSaveAsTemplateDialog","CrmTemplatePicker","NO_MERGE_RECORDS","contact","deal","lead","site","loaded","CrmSendEmailDialog","props","hostId","open","onClose","org","contactId","leadId","dealId","onSent","firestore","mount","orgId","undefined","$id","data","user","enqueueSnackbar","sendingApi","sendHostId","createHostId","crmApi","emailsHub","capture","enabled","sendingPath","identity","setIdentity","status","recipient","setRecipient","email","subject","setSubject","body","setBody","sending","setSending","error","setError","confirm","templateScope","templates","scope","visibleTo","uid","pickable","filter","row","kind","snippets","appliedTemplate","setAppliedTemplate","saveOpen","setSaveOpen","records","setRecords","messageRef","draftHasFields","fieldGroups","cancelled","senders","payload","response","path","method","query","ok","message","String","refusal","canManage","Array","isArray","from","find","sender","isDefault","read","snapshot","slice","exists","mountedSite","hosts","host","id","Promise","all","deals","then","dealContactId","trim","withContact","resolve","resolvedContact","name","catch","cause","console","mergeContext","contactGroupId","groupId","displayName","preview","unresolved","Set","applyTemplate","template","written","length","accepted","title","description","confirmationText","EmailDraftSlot","proposeDraft","draft","next","draftRecord","insertAtCaret","text","element","current","start","selectionStart","end","selectionEnd","caret","Math","min","window","setTimeout","focus","setSelectionRange","saveAsTemplate","createTokens","Error","now","Date","emailTemplates","visibility","ownerUid","createdByUid","createdAtMs","updatedAtMs","createdAt","updatedAt","variant","persist","given","get","replyTo","canSend","Boolean","handleSend","activityId","toLabel","bookingRef","handleInsertLink","link","input","value","maxWidth","fullWidth","sx","display","flexDirection","gap","label","helperText","disabled","severity","mt","href","size","slotProps","readOnly","inputLabel","shrink","address","endAdornment","position","onChange","event","target","autoFocus","htmlInput","maxLength","direction","spacing","justifyContent","groups","onInsert","onClick","multiline","minRows","inputRef","formHelperText","color","slot","record","data-testid","whiteSpace","recordId","onSave"],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface CrmSitePickerProps {
|
|
2
|
+
/**
|
|
3
|
+
* The site the surface is mounted under. Under a site the picker renders
|
|
4
|
+
* NOTHING — the site is known — so a drawer mounts this unconditionally
|
|
5
|
+
* and only the organization-level reader ever sees a field.
|
|
6
|
+
*/
|
|
7
|
+
hostId: string | null;
|
|
8
|
+
/** The field's label; "Site" unless the form has a reason to say more. */
|
|
9
|
+
label?: string;
|
|
10
|
+
/** What the pick decides, said under the field. */
|
|
11
|
+
helperText?: string;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* A choice that is no site at all — the organization itself (AGL-2637).
|
|
15
|
+
* Offered under the sites when given, and then the field renders even
|
|
16
|
+
* for an org with one site, because there is a choice to make. `picked`
|
|
17
|
+
* says the form holds that choice; picking a site clears it. Only a task
|
|
18
|
+
* offers this: every other CRM record is a fact about a person some site
|
|
19
|
+
* met, and is captured BY that site.
|
|
20
|
+
*/
|
|
21
|
+
noSite?: {
|
|
22
|
+
label: string;
|
|
23
|
+
/** What the choice decides, said under the field while it is picked. */
|
|
24
|
+
helperText?: string;
|
|
25
|
+
picked: boolean;
|
|
26
|
+
onPick: (picked: boolean) => void;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* THE SITE A CREATE IS CAPTURED BY, at the organization level (AGL-2630).
|
|
31
|
+
*
|
|
32
|
+
* Every CRM record names the site that created it: its `hostId`, the
|
|
33
|
+
* `visibleTo` that decides who may read it, and — for a contact — the
|
|
34
|
+
* consent group whose facet holds the profile and whose name the consent
|
|
35
|
+
* checkbox records a basis for. Under a site all three follow from the
|
|
36
|
+
* URL. At `/[orgSlug]/crm` nothing does, so every create and import drawer
|
|
37
|
+
* mounted there asks, with this field, and holds its submit until it is
|
|
38
|
+
* answered. The REST API asks the same question as `consentSiteId`; this is
|
|
39
|
+
* that parameter with a list attached.
|
|
40
|
+
*
|
|
41
|
+
* The pick is REMEMBERED for the session (`useCrmOrgMount`), so a reader
|
|
42
|
+
* filing ten records for one brand picks once; an org with exactly one
|
|
43
|
+
* site never sees the field, because there is nothing to choose. Nothing
|
|
44
|
+
* else is picked silently — a wrong guess files a person under a brand
|
|
45
|
+
* that never met them, which is exactly the disclosure the per-site model
|
|
46
|
+
* exists to prevent.
|
|
47
|
+
*
|
|
48
|
+
* Rendered as a required select rather than an autocomplete: an org has at
|
|
49
|
+
* most thirty sites in a consent group and rarely more than a handful at
|
|
50
|
+
* all, and a required field with a fixed list should look like one.
|
|
51
|
+
*
|
|
52
|
+
* With a {@link CrmSitePickerProps.noSite} choice the field is a question
|
|
53
|
+
* even for an org with one site — the site, or the organization — and the
|
|
54
|
+
* no-site pick is the FORM's, not the session's: the remembered site stays
|
|
55
|
+
* what the next contact or deal defaults to.
|
|
56
|
+
*/
|
|
57
|
+
export declare function CrmSitePicker(props: CrmSitePickerProps): import("react").JSX.Element;
|
|
58
|
+
export declare namespace CrmSitePicker {
|
|
59
|
+
var displayName: string;
|
|
60
|
+
}
|
|
61
|
+
export default CrmSitePicker;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ 'use client';
|
|
17
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
18
|
+
import { MenuItem, TextField } from "@mui/material";
|
|
19
|
+
import { useCrmOrgMount } from "../hooks/use-crm-org-mount.js";
|
|
20
|
+
/**
|
|
21
|
+
* The select's value for the no-site choice. Never a site's id, which is a
|
|
22
|
+
* Firestore document id and cannot begin with an underscore-and-word the
|
|
23
|
+
* console minted itself.
|
|
24
|
+
*/ const NO_SITE_VALUE = '__organization';
|
|
25
|
+
/**
|
|
26
|
+
* THE SITE A CREATE IS CAPTURED BY, at the organization level (AGL-2630).
|
|
27
|
+
*
|
|
28
|
+
* Every CRM record names the site that created it: its `hostId`, the
|
|
29
|
+
* `visibleTo` that decides who may read it, and — for a contact — the
|
|
30
|
+
* consent group whose facet holds the profile and whose name the consent
|
|
31
|
+
* checkbox records a basis for. Under a site all three follow from the
|
|
32
|
+
* URL. At `/[orgSlug]/crm` nothing does, so every create and import drawer
|
|
33
|
+
* mounted there asks, with this field, and holds its submit until it is
|
|
34
|
+
* answered. The REST API asks the same question as `consentSiteId`; this is
|
|
35
|
+
* that parameter with a list attached.
|
|
36
|
+
*
|
|
37
|
+
* The pick is REMEMBERED for the session (`useCrmOrgMount`), so a reader
|
|
38
|
+
* filing ten records for one brand picks once; an org with exactly one
|
|
39
|
+
* site never sees the field, because there is nothing to choose. Nothing
|
|
40
|
+
* else is picked silently — a wrong guess files a person under a brand
|
|
41
|
+
* that never met them, which is exactly the disclosure the per-site model
|
|
42
|
+
* exists to prevent.
|
|
43
|
+
*
|
|
44
|
+
* Rendered as a required select rather than an autocomplete: an org has at
|
|
45
|
+
* most thirty sites in a consent group and rarely more than a handful at
|
|
46
|
+
* all, and a required field with a fixed list should look like one.
|
|
47
|
+
*
|
|
48
|
+
* With a {@link CrmSitePickerProps.noSite} choice the field is a question
|
|
49
|
+
* even for an org with one site — the site, or the organization — and the
|
|
50
|
+
* no-site pick is the FORM's, not the session's: the remembered site stays
|
|
51
|
+
* what the next contact or deal defaults to.
|
|
52
|
+
*/ export function CrmSitePicker(props) {
|
|
53
|
+
var _mount_createHostId, _noSite_helperText;
|
|
54
|
+
const { hostId, label = 'Site', helperText, disabled, noSite } = props;
|
|
55
|
+
const mount = useCrmOrgMount();
|
|
56
|
+
// Under a site, or with one site and nothing else to choose, there is no
|
|
57
|
+
// question.
|
|
58
|
+
if (hostId || !mount || !noSite && mount.hostsReady && mount.hosts.length === 1) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
const picked = (noSite == null ? void 0 : noSite.picked) ? NO_SITE_VALUE : (_mount_createHostId = mount.createHostId) != null ? _mount_createHostId : '';
|
|
62
|
+
return /*#__PURE__*/ _jsxs(TextField, {
|
|
63
|
+
select: true,
|
|
64
|
+
required: true,
|
|
65
|
+
size: "small",
|
|
66
|
+
label: label,
|
|
67
|
+
value: picked,
|
|
68
|
+
onChange: (event)=>{
|
|
69
|
+
const next = String(event.target.value);
|
|
70
|
+
if (next === NO_SITE_VALUE) {
|
|
71
|
+
noSite == null ? void 0 : noSite.onPick(true);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
noSite == null ? void 0 : noSite.onPick(false);
|
|
75
|
+
mount.setCreateHostId(next);
|
|
76
|
+
},
|
|
77
|
+
disabled: disabled || !mount.hostsReady,
|
|
78
|
+
helperText: !mount.hostsReady ? 'Loading your sites…' : (noSite == null ? void 0 : noSite.picked) ? (_noSite_helperText = noSite.helperText) != null ? _noSite_helperText : helperText : mount.hosts.length === 0 && !noSite ? 'This organization has no sites yet, so nothing can be filed.' : helperText != null ? helperText : 'The site this record belongs to — it decides which of your ' + 'sites may see it.',
|
|
79
|
+
slotProps: {
|
|
80
|
+
inputLabel: {
|
|
81
|
+
shrink: true
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
children: [
|
|
85
|
+
mount.hosts.map((host)=>/*#__PURE__*/ _jsx(MenuItem, {
|
|
86
|
+
value: host.id,
|
|
87
|
+
children: host.name
|
|
88
|
+
}, host.id)),
|
|
89
|
+
noSite ? /*#__PURE__*/ _jsx(MenuItem, {
|
|
90
|
+
value: NO_SITE_VALUE,
|
|
91
|
+
children: noSite.label
|
|
92
|
+
}) : null
|
|
93
|
+
]
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
CrmSitePicker.displayName = 'CrmSitePicker';
|
|
97
|
+
export default CrmSitePicker;
|
|
98
|
+
|
|
99
|
+
//# sourceMappingURL=crm-site-picker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/crm-site-picker.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 { MenuItem, TextField } from '@mui/material'\nimport { useCrmOrgMount } from '../hooks/use-crm-org-mount'\n\nexport interface CrmSitePickerProps {\n /**\n * The site the surface is mounted under. Under a site the picker renders\n * NOTHING — the site is known — so a drawer mounts this unconditionally\n * and only the organization-level reader ever sees a field.\n */\n hostId: string | null\n /** The field's label; \"Site\" unless the form has a reason to say more. */\n label?: string\n /** What the pick decides, said under the field. */\n helperText?: string\n disabled?: boolean\n /**\n * A choice that is no site at all — the organization itself (AGL-2637).\n * Offered under the sites when given, and then the field renders even\n * for an org with one site, because there is a choice to make. `picked`\n * says the form holds that choice; picking a site clears it. Only a task\n * offers this: every other CRM record is a fact about a person some site\n * met, and is captured BY that site.\n */\n noSite?: {\n label: string\n /** What the choice decides, said under the field while it is picked. */\n helperText?: string\n picked: boolean\n onPick: (picked: boolean) => void\n }\n}\n\n/**\n * The select's value for the no-site choice. Never a site's id, which is a\n * Firestore document id and cannot begin with an underscore-and-word the\n * console minted itself.\n */\nconst NO_SITE_VALUE = '__organization'\n\n/**\n * THE SITE A CREATE IS CAPTURED BY, at the organization level (AGL-2630).\n *\n * Every CRM record names the site that created it: its `hostId`, the\n * `visibleTo` that decides who may read it, and — for a contact — the\n * consent group whose facet holds the profile and whose name the consent\n * checkbox records a basis for. Under a site all three follow from the\n * URL. At `/[orgSlug]/crm` nothing does, so every create and import drawer\n * mounted there asks, with this field, and holds its submit until it is\n * answered. The REST API asks the same question as `consentSiteId`; this is\n * that parameter with a list attached.\n *\n * The pick is REMEMBERED for the session (`useCrmOrgMount`), so a reader\n * filing ten records for one brand picks once; an org with exactly one\n * site never sees the field, because there is nothing to choose. Nothing\n * else is picked silently — a wrong guess files a person under a brand\n * that never met them, which is exactly the disclosure the per-site model\n * exists to prevent.\n *\n * Rendered as a required select rather than an autocomplete: an org has at\n * most thirty sites in a consent group and rarely more than a handful at\n * all, and a required field with a fixed list should look like one.\n *\n * With a {@link CrmSitePickerProps.noSite} choice the field is a question\n * even for an org with one site — the site, or the organization — and the\n * no-site pick is the FORM's, not the session's: the remembered site stays\n * what the next contact or deal defaults to.\n */\nexport function CrmSitePicker(props: CrmSitePickerProps) {\n const { hostId, label = 'Site', helperText, disabled, noSite } = props\n const mount = useCrmOrgMount()\n // Under a site, or with one site and nothing else to choose, there is no\n // question.\n if (\n hostId ||\n !mount ||\n (!noSite && mount.hostsReady && mount.hosts.length === 1)\n ) {\n return null\n }\n const picked = noSite?.picked ? NO_SITE_VALUE : (mount.createHostId ?? '')\n return (\n <TextField\n select\n required\n size=\"small\"\n label={label}\n value={picked}\n onChange={(event) => {\n const next = String(event.target.value)\n if (next === NO_SITE_VALUE) {\n noSite?.onPick(true)\n return\n }\n noSite?.onPick(false)\n mount.setCreateHostId(next)\n }}\n disabled={disabled || !mount.hostsReady}\n helperText={\n !mount.hostsReady\n ? 'Loading your sites…'\n : noSite?.picked\n ? (noSite.helperText ?? helperText)\n : mount.hosts.length === 0 && !noSite\n ? 'This organization has no sites yet, so nothing can be filed.'\n : (helperText ??\n 'The site this record belongs to — it decides which of your ' +\n 'sites may see it.')\n }\n slotProps={{ inputLabel: { shrink: true } }}\n >\n {mount.hosts.map((host) => (\n <MenuItem key={host.id} value={host.id}>\n {host.name}\n </MenuItem>\n ))}\n {noSite ? <MenuItem value={NO_SITE_VALUE}>{noSite.label}</MenuItem> : null}\n </TextField>\n )\n}\nCrmSitePicker.displayName = 'CrmSitePicker'\n\nexport default CrmSitePicker\n"],"names":["MenuItem","TextField","useCrmOrgMount","NO_SITE_VALUE","CrmSitePicker","props","mount","noSite","hostId","label","helperText","disabled","hostsReady","hosts","length","picked","createHostId","select","required","size","value","onChange","event","next","String","target","onPick","setCreateHostId","slotProps","inputLabel","shrink","map","host","id","name","displayName"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;AAEA,SAASA,QAAQ,EAAEC,SAAS,QAAQ,gBAAe;AACnD,SAASC,cAAc,QAAQ,gCAA4B;AA+B3D;;;;CAIC,GACD,MAAMC,gBAAgB;AAEtB;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,SAASC,cAAcC,KAAyB;QAYJC,qBAsBpCC;IAjCb,MAAM,EAAEC,MAAM,EAAEC,QAAQ,MAAM,EAAEC,UAAU,EAAEC,QAAQ,EAAEJ,MAAM,EAAE,GAAGF;IACjE,MAAMC,QAAQJ;IACd,yEAAyE;IACzE,YAAY;IACZ,IACEM,UACA,CAACF,SACA,CAACC,UAAUD,MAAMM,UAAU,IAAIN,MAAMO,KAAK,CAACC,MAAM,KAAK,GACvD;QACA,OAAO;IACT;IACA,MAAMC,SAASR,CAAAA,0BAAAA,OAAQQ,MAAM,IAAGZ,iBAAiBG,sBAAAA,MAAMU,YAAY,YAAlBV,sBAAsB;IACvE,qBACE,MAACL;QACCgB,MAAM;QACNC,QAAQ;QACRC,MAAK;QACLV,OAAOA;QACPW,OAAOL;QACPM,UAAU,CAACC;YACT,MAAMC,OAAOC,OAAOF,MAAMG,MAAM,CAACL,KAAK;YACtC,IAAIG,SAASpB,eAAe;gBAC1BI,0BAAAA,OAAQmB,MAAM,CAAC;gBACf;YACF;YACAnB,0BAAAA,OAAQmB,MAAM,CAAC;YACfpB,MAAMqB,eAAe,CAACJ;QACxB;QACAZ,UAAUA,YAAY,CAACL,MAAMM,UAAU;QACvCF,YACE,CAACJ,MAAMM,UAAU,GACb,wBACAL,CAAAA,0BAAAA,OAAQQ,MAAM,KACXR,qBAAAA,OAAOG,UAAU,YAAjBH,qBAAqBG,aACtBJ,MAAMO,KAAK,CAACC,MAAM,KAAK,KAAK,CAACP,SAC3B,iEACCG,qBAAAA,aACD,gEACE;QAEZkB,WAAW;YAAEC,YAAY;gBAAEC,QAAQ;YAAK;QAAE;;YAEzCxB,MAAMO,KAAK,CAACkB,GAAG,CAAC,CAACC,qBAChB,KAAChC;oBAAuBoB,OAAOY,KAAKC,EAAE;8BACnCD,KAAKE,IAAI;mBADGF,KAAKC,EAAE;YAIvB1B,uBAAS,KAACP;gBAASoB,OAAOjB;0BAAgBI,OAAOE,KAAK;iBAAe;;;AAG5E;AACAL,cAAc+B,WAAW,GAAG;AAE5B,eAAe/B,cAAa"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ButtonProps } from '@mui/material';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
/** Whether the org's plan carries the CRM suite. */
|
|
4
|
+
export declare function crmSuiteIncluded(org: unknown): boolean;
|
|
5
|
+
/** What a locked control says about itself, on hover and to assistive tech. */
|
|
6
|
+
export declare function crmSuiteLockedReason(): string;
|
|
7
|
+
/**
|
|
8
|
+
* The notice a surface with locked controls carries: what is locked, the
|
|
9
|
+
* plan that includes it, and the way to the plans — the alert and the link
|
|
10
|
+
* the shell ends a locked section with.
|
|
11
|
+
*/
|
|
12
|
+
export declare function CrmSuiteNotice(props: {
|
|
13
|
+
children: ReactNode;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
export declare namespace CrmSuiteNotice {
|
|
16
|
+
var displayName: string;
|
|
17
|
+
}
|
|
18
|
+
export type CrmSuiteLockedButtonProps = Omit<ButtonProps, 'disabled' | 'onClick' | 'startIcon' | 'href'>;
|
|
19
|
+
/**
|
|
20
|
+
* A control the plan has locked: standing where the working one stands,
|
|
21
|
+
* with the rail's lock, disabled, and its reason as the description.
|
|
22
|
+
*
|
|
23
|
+
* The span carries the tooltip because a disabled button fires no pointer
|
|
24
|
+
* events, so a tooltip on the button itself would never open.
|
|
25
|
+
*/
|
|
26
|
+
export declare function CrmSuiteLockedButton(props: CrmSuiteLockedButtonProps): import("react").JSX.Element;
|
|
27
|
+
export declare namespace CrmSuiteLockedButton {
|
|
28
|
+
var displayName: string;
|
|
29
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ 'use client';
|
|
17
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
18
|
+
import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_without_properties_loose";
|
|
19
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
20
|
+
import { buildRoute, checkEntitlement, planLabelGrantingFeature, Route } from "@aglyn/aglyn";
|
|
21
|
+
import { mdiLockOutline } from "@aglyn/shared-data-mdi";
|
|
22
|
+
import { AppLink, MdiIcon } from "@aglyn/shared-ui-jsx";
|
|
23
|
+
import { Alert, Button, Tooltip } from "@mui/material";
|
|
24
|
+
import { useParams } from "next/navigation";
|
|
25
|
+
/**
|
|
26
|
+
* THE CRM'S LOCK AND NOTICE, AS A SURFACE'S OWN CONTROLS DRAW THEM (AGL-2788).
|
|
27
|
+
*
|
|
28
|
+
* The CRM is included from Starter (AGL-2851), and the shell refuses all of
|
|
29
|
+
* it on a plan without `features.crm`: every section is drawn locked beside
|
|
30
|
+
* the upgrade notice, and no CRM page mounts. These are a page's second
|
|
31
|
+
* answer, not its first. When a CRM surface renders for an org whose plan
|
|
32
|
+
* lacks the CRM, its acts — adding a person by hand, importing a file, a
|
|
33
|
+
* saved view, an owner, a stage, a company, a task, a logged call, an email,
|
|
34
|
+
* a merge — are drawn in the shell's own terms: the lock the rail draws, on a
|
|
35
|
+
* control that stays where it is and cannot be pressed, and the notice and
|
|
36
|
+
* link the shell ends a locked section with.
|
|
37
|
+
*
|
|
38
|
+
* ## Not hidden, and not pressable
|
|
39
|
+
*
|
|
40
|
+
* A control that vanished would hide the CRM from the plan being asked to buy
|
|
41
|
+
* it, and one that opened and then failed would spend the reader's work on a
|
|
42
|
+
* refusal. The routes behind these acts refuse the same plans either way
|
|
43
|
+
* (`server/suite-gate.ts`).
|
|
44
|
+
*
|
|
45
|
+
* ## An answer, not a loading state
|
|
46
|
+
*
|
|
47
|
+
* The plan is read from the org document the shell hands a plugin page, and
|
|
48
|
+
* the shell mounts the page only once that document has settled — so a lock
|
|
49
|
+
* drawn here is a fact about the plan, never one paint of an org still in
|
|
50
|
+
* flight read as Free (AGL-1380).
|
|
51
|
+
*/ /** The entitlement the suite is sold under. */ const CRM_SUITE_FEATURE = 'crm';
|
|
52
|
+
/** Whether the org's plan carries the CRM suite. */ export function crmSuiteIncluded(org) {
|
|
53
|
+
return checkEntitlement(org, CRM_SUITE_FEATURE);
|
|
54
|
+
}
|
|
55
|
+
/** What a locked control says about itself, on hover and to assistive tech. */ export function crmSuiteLockedReason() {
|
|
56
|
+
const plan = planLabelGrantingFeature(CRM_SUITE_FEATURE);
|
|
57
|
+
return plan ? `Part of the CRM, included from ${plan}` : 'Part of the CRM, which your plan does not include';
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The notice a surface with locked controls carries: what is locked, the
|
|
61
|
+
* plan that includes it, and the way to the plans — the alert and the link
|
|
62
|
+
* the shell ends a locked section with.
|
|
63
|
+
*/ export function CrmSuiteNotice(props) {
|
|
64
|
+
const params = useParams();
|
|
65
|
+
const orgSlug = (params == null ? void 0 : params.orgSlug) ? String(params.orgSlug) : '';
|
|
66
|
+
const plan = planLabelGrantingFeature(CRM_SUITE_FEATURE);
|
|
67
|
+
return /*#__PURE__*/ _jsxs(Alert, {
|
|
68
|
+
severity: "info",
|
|
69
|
+
action: orgSlug ? /*#__PURE__*/ _jsx(AppLink, {
|
|
70
|
+
componentVariant: "button",
|
|
71
|
+
size: "small",
|
|
72
|
+
color: "inherit",
|
|
73
|
+
href: buildRoute(Route.MANAGE_BILLING, {
|
|
74
|
+
orgSlug
|
|
75
|
+
}),
|
|
76
|
+
children: 'View plans'
|
|
77
|
+
}) : undefined,
|
|
78
|
+
children: [
|
|
79
|
+
props.children,
|
|
80
|
+
plan ? ` Included from ${plan}.` : null
|
|
81
|
+
]
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
CrmSuiteNotice.displayName = 'CrmSuiteNotice';
|
|
85
|
+
/**
|
|
86
|
+
* A control the plan has locked: standing where the working one stands,
|
|
87
|
+
* with the rail's lock, disabled, and its reason as the description.
|
|
88
|
+
*
|
|
89
|
+
* The span carries the tooltip because a disabled button fires no pointer
|
|
90
|
+
* events, so a tooltip on the button itself would never open.
|
|
91
|
+
*/ export function CrmSuiteLockedButton(props) {
|
|
92
|
+
const { children, size = 'small' } = props, rest = _object_without_properties_loose(props, [
|
|
93
|
+
"children",
|
|
94
|
+
"size"
|
|
95
|
+
]);
|
|
96
|
+
return /*#__PURE__*/ _jsx(Tooltip, {
|
|
97
|
+
title: crmSuiteLockedReason(),
|
|
98
|
+
describeChild: true,
|
|
99
|
+
children: /*#__PURE__*/ _jsx("span", {
|
|
100
|
+
children: /*#__PURE__*/ _jsx(Button, _extends({}, rest, {
|
|
101
|
+
size: size,
|
|
102
|
+
disabled: true,
|
|
103
|
+
startIcon: /*#__PURE__*/ _jsx(MdiIcon, {
|
|
104
|
+
path: mdiLockOutline.path,
|
|
105
|
+
size: 0.7
|
|
106
|
+
}),
|
|
107
|
+
children: children
|
|
108
|
+
}))
|
|
109
|
+
})
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
CrmSuiteLockedButton.displayName = 'CrmSuiteLockedButton';
|
|
113
|
+
|
|
114
|
+
//# sourceMappingURL=crm-suite-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/crm-suite-lock.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n type AglynOrgBilling,\n buildRoute,\n checkEntitlement,\n planLabelGrantingFeature,\n Route,\n} from '@aglyn/aglyn'\nimport { mdiLockOutline } from '@aglyn/shared-data-mdi'\nimport { AppLink, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { Alert, Button, type ButtonProps, Tooltip } from '@mui/material'\nimport { useParams } from 'next/navigation'\nimport type { ReactNode } from 'react'\n\n/**\n * THE CRM'S LOCK AND NOTICE, AS A SURFACE'S OWN CONTROLS DRAW THEM (AGL-2788).\n *\n * The CRM is included from Starter (AGL-2851), and the shell refuses all of\n * it on a plan without `features.crm`: every section is drawn locked beside\n * the upgrade notice, and no CRM page mounts. These are a page's second\n * answer, not its first. When a CRM surface renders for an org whose plan\n * lacks the CRM, its acts — adding a person by hand, importing a file, a\n * saved view, an owner, a stage, a company, a task, a logged call, an email,\n * a merge — are drawn in the shell's own terms: the lock the rail draws, on a\n * control that stays where it is and cannot be pressed, and the notice and\n * link the shell ends a locked section with.\n *\n * ## Not hidden, and not pressable\n *\n * A control that vanished would hide the CRM from the plan being asked to buy\n * it, and one that opened and then failed would spend the reader's work on a\n * refusal. The routes behind these acts refuse the same plans either way\n * (`server/suite-gate.ts`).\n *\n * ## An answer, not a loading state\n *\n * The plan is read from the org document the shell hands a plugin page, and\n * the shell mounts the page only once that document has settled — so a lock\n * drawn here is a fact about the plan, never one paint of an org still in\n * flight read as Free (AGL-1380).\n */\n\n/** The entitlement the suite is sold under. */\nconst CRM_SUITE_FEATURE = 'crm'\n\n/** Whether the org's plan carries the CRM suite. */\nexport function crmSuiteIncluded(org: unknown): boolean {\n return checkEntitlement(\n org as Partial<AglynOrgBilling> | null | undefined,\n CRM_SUITE_FEATURE,\n )\n}\n\n/** What a locked control says about itself, on hover and to assistive tech. */\nexport function crmSuiteLockedReason(): string {\n const plan = planLabelGrantingFeature(CRM_SUITE_FEATURE)\n return plan\n ? `Part of the CRM, included from ${plan}`\n : 'Part of the CRM, which your plan does not include'\n}\n\n/**\n * The notice a surface with locked controls carries: what is locked, the\n * plan that includes it, and the way to the plans — the alert and the link\n * the shell ends a locked section with.\n */\nexport function CrmSuiteNotice(props: { children: ReactNode }) {\n const params = useParams<{ orgSlug?: string }>()\n const orgSlug = params?.orgSlug ? String(params.orgSlug) : ''\n const plan = planLabelGrantingFeature(CRM_SUITE_FEATURE)\n return (\n <Alert\n severity=\"info\"\n action={\n orgSlug ? (\n <AppLink\n componentVariant=\"button\"\n size=\"small\"\n color=\"inherit\"\n href={buildRoute(Route.MANAGE_BILLING, { orgSlug })}\n >\n {'View plans'}\n </AppLink>\n ) : undefined\n }\n >\n {props.children}\n {plan ? ` Included from ${plan}.` : null}\n </Alert>\n )\n}\nCrmSuiteNotice.displayName = 'CrmSuiteNotice'\n\nexport type CrmSuiteLockedButtonProps = Omit<\n ButtonProps,\n 'disabled' | 'onClick' | 'startIcon' | 'href'\n>\n\n/**\n * A control the plan has locked: standing where the working one stands,\n * with the rail's lock, disabled, and its reason as the description.\n *\n * The span carries the tooltip because a disabled button fires no pointer\n * events, so a tooltip on the button itself would never open.\n */\nexport function CrmSuiteLockedButton(props: CrmSuiteLockedButtonProps) {\n const { children, size = 'small', ...rest } = props\n return (\n <Tooltip title={crmSuiteLockedReason()} describeChild>\n <span>\n <Button\n {...rest}\n size={size}\n disabled\n startIcon={<MdiIcon path={mdiLockOutline.path} size={0.7} />}\n >\n {children}\n </Button>\n </span>\n </Tooltip>\n )\n}\nCrmSuiteLockedButton.displayName = 'CrmSuiteLockedButton'\n"],"names":["buildRoute","checkEntitlement","planLabelGrantingFeature","Route","mdiLockOutline","AppLink","MdiIcon","Alert","Button","Tooltip","useParams","CRM_SUITE_FEATURE","crmSuiteIncluded","org","crmSuiteLockedReason","plan","CrmSuiteNotice","props","params","orgSlug","String","severity","action","componentVariant","size","color","href","MANAGE_BILLING","undefined","children","displayName","CrmSuiteLockedButton","rest","title","describeChild","span","disabled","startIcon","path"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;;;AAEA,SAEEA,UAAU,EACVC,gBAAgB,EAChBC,wBAAwB,EACxBC,KAAK,QACA,eAAc;AACrB,SAASC,cAAc,QAAQ,yBAAwB;AACvD,SAASC,OAAO,EAAEC,OAAO,QAAQ,uBAAsB;AACvD,SAASC,KAAK,EAAEC,MAAM,EAAoBC,OAAO,QAAQ,gBAAe;AACxE,SAASC,SAAS,QAAQ,kBAAiB;AAG3C;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BC,GAED,6CAA6C,GAC7C,MAAMC,oBAAoB;AAE1B,kDAAkD,GAClD,OAAO,SAASC,iBAAiBC,GAAY;IAC3C,OAAOZ,iBACLY,KACAF;AAEJ;AAEA,6EAA6E,GAC7E,OAAO,SAASG;IACd,MAAMC,OAAOb,yBAAyBS;IACtC,OAAOI,OACH,CAAC,+BAA+B,EAAEA,MAAM,GACxC;AACN;AAEA;;;;CAIC,GACD,OAAO,SAASC,eAAeC,KAA8B;IAC3D,MAAMC,SAASR;IACf,MAAMS,UAAUD,CAAAA,0BAAAA,OAAQC,OAAO,IAAGC,OAAOF,OAAOC,OAAO,IAAI;IAC3D,MAAMJ,OAAOb,yBAAyBS;IACtC,qBACE,MAACJ;QACCc,UAAS;QACTC,QACEH,wBACE,KAACd;YACCkB,kBAAiB;YACjBC,MAAK;YACLC,OAAM;YACNC,MAAM1B,WAAWG,MAAMwB,cAAc,EAAE;gBAAER;YAAQ;sBAEhD;aAEDS;;YAGLX,MAAMY,QAAQ;YACdd,OAAO,CAAC,eAAe,EAAEA,KAAK,CAAC,CAAC,GAAG;;;AAG1C;AACAC,eAAec,WAAW,GAAG;AAO7B;;;;;;CAMC,GACD,OAAO,SAASC,qBAAqBd,KAAgC;IACnE,MAAM,EAAEY,QAAQ,EAAEL,OAAO,OAAO,EAAW,GAAGP,OAATe,wCAASf;;;;IAC9C,qBACE,KAACR;QAAQwB,OAAOnB;QAAwBoB,aAAa;kBACnD,cAAA,KAACC;sBACC,cAAA,KAAC3B,qBACKwB;gBACJR,MAAMA;gBACNY,QAAQ;gBACRC,yBAAW,KAAC/B;oBAAQgC,MAAMlC,eAAekC,IAAI;oBAAEd,MAAM;;0BAEpDK;;;;AAKX;AACAE,qBAAqBD,WAAW,GAAG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface CrmTasksDueCardProps {
|
|
2
|
+
/**
|
|
3
|
+
* The site the card is on the dashboard of, or `null` beneath the org
|
|
4
|
+
* hub's mount (AGL-2636), where the reader's tasks are read across every
|
|
5
|
+
* site of the organization at once.
|
|
6
|
+
*/
|
|
7
|
+
hostId: string | null;
|
|
8
|
+
/** The org hub's own path, for the link when there is no site to derive it from. */
|
|
9
|
+
basePath?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Dashboard glance at the reader's tasks (AGL-2599): how many are overdue,
|
|
13
|
+
* how many are due today, and the next five, linking into the tasks section.
|
|
14
|
+
*
|
|
15
|
+
* Registered on the shell's `hostDashboard` slot, so it appears only on
|
|
16
|
+
* workspaces with the CRM enabled and for readers who hold `data.manage` —
|
|
17
|
+
* the extension's own gate, which the slot composes for every card.
|
|
18
|
+
*
|
|
19
|
+
* Renders NOTHING when the org has no open tasks at all. A dashboard card
|
|
20
|
+
* saying "no tasks" on a workspace that has never made one is a card about a
|
|
21
|
+
* feature the reader has not adopted, and the dashboard is not the place to
|
|
22
|
+
* sell it. The absence is decided by a one-row probe on the whole org's open
|
|
23
|
+
* tasks rather than by the reader's own list, so a person with nothing
|
|
24
|
+
* assigned on a team that uses tasks still sees the card, saying so.
|
|
25
|
+
*
|
|
26
|
+
* ## The organization level (AGL-2636)
|
|
27
|
+
*
|
|
28
|
+
* Mounted with no site beneath the org hub's mount — the org's sites page
|
|
29
|
+
* hands the card `hostId: null` and the hub's `basePath` — the two reads
|
|
30
|
+
* carry no scope clause, exactly as the tasks section's do at that level:
|
|
31
|
+
* the reader is an org-wide member (the page admits nobody else to the
|
|
32
|
+
* row), the rules admit them to every row, and a clause listing every
|
|
33
|
+
* site's token would need the whole site list and still miss a site the
|
|
34
|
+
* list did not carry. `useCrmScope` spells both levels, so the card is one
|
|
35
|
+
* component: under a site it filters on the site's own group's tokens as
|
|
36
|
+
* it always has, and at the org level it filters on nothing.
|
|
37
|
+
*/
|
|
38
|
+
export declare function CrmTasksDueCard(props: CrmTasksDueCardProps): import("react").JSX.Element;
|
|
39
|
+
export declare namespace CrmTasksDueCard {
|
|
40
|
+
var displayName: string;
|
|
41
|
+
}
|
|
42
|
+
export default CrmTasksDueCard;
|