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