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