@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,94 @@
|
|
|
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
|
+
*/
|
|
17
|
+
import { type CrmTaskKind, type CrmTaskPriority, type CrmTaskStatus } from '@aglyn/aglyn/app-utils/crm';
|
|
18
|
+
import { type ImportChunkResult, type ImportDroppedValue } from '@aglyn/aglyn/app-utils/csv-import';
|
|
19
|
+
/** The shared ceilings, under this collection's names. */
|
|
20
|
+
export declare const TASK_IMPORT_MAX_ROWS = 5000;
|
|
21
|
+
export declare const TASK_IMPORT_CHUNK_SIZE = 200;
|
|
22
|
+
export declare const TASK_IMPORT_MAX_BODY_BYTES = 2000000;
|
|
23
|
+
export declare const TASK_IMPORT_PREVIEW_ROWS = 10;
|
|
24
|
+
/** The same caps the task drawer holds a typed task to. */
|
|
25
|
+
export declare const TASK_IMPORT_TITLE_MAX = 200;
|
|
26
|
+
export declare const TASK_IMPORT_NOTES_MAX = 4000;
|
|
27
|
+
/** The fields a column may be mapped to, in the order the mapping menu lists them. */
|
|
28
|
+
export declare const TASK_IMPORT_FIELDS: readonly ["title", "kind", "priority", "status", "due", "assigneeEmail", "notes"];
|
|
29
|
+
export type TaskImportField = (typeof TASK_IMPORT_FIELDS)[number];
|
|
30
|
+
/** How each field reads in the mapping menu. Typed so a field cannot ship unlabeled. */
|
|
31
|
+
export declare const TASK_IMPORT_FIELD_LABELS: Record<TaskImportField, string>;
|
|
32
|
+
/** Column index → field. A column absent from the map is not imported. */
|
|
33
|
+
export type TaskImportMapping = Record<number, TaskImportField>;
|
|
34
|
+
/** A proposed mapping from a file's header row, each field taken at most once. */
|
|
35
|
+
export declare function guessTaskImportMapping(columns: readonly string[]): TaskImportMapping;
|
|
36
|
+
/**
|
|
37
|
+
* What the browser posts for one line: the cells the mapping selected,
|
|
38
|
+
* under the field they were mapped to, verbatim. `unknown` because the
|
|
39
|
+
* server reads this off an untrusted body.
|
|
40
|
+
*/
|
|
41
|
+
export type TaskImportRawRow = Partial<Record<TaskImportField, unknown>>;
|
|
42
|
+
/** One parsed line under the mapping. Empty cells are left absent; a task has no custom fields. */
|
|
43
|
+
export declare function mapTaskImportRow(cells: readonly string[], mapping: Record<number, TaskImportField | `custom:${string}`>): TaskImportRawRow;
|
|
44
|
+
export type TaskImportSkipReason = 'missing-title' | 'unknown-assignee' | 'write-failed';
|
|
45
|
+
/** How a skip reason reads on screen and in the downloaded file. */
|
|
46
|
+
export declare const TASK_IMPORT_SKIP_LABELS: Record<TaskImportSkipReason, string>;
|
|
47
|
+
/** One row, ready for the server to resolve and write. */
|
|
48
|
+
export interface TaskImportRow {
|
|
49
|
+
title: string;
|
|
50
|
+
kind: CrmTaskKind;
|
|
51
|
+
priority: CrmTaskPriority;
|
|
52
|
+
status: CrmTaskStatus;
|
|
53
|
+
/** Epoch ms, or `null` for no due date — the shape the document stores. */
|
|
54
|
+
dueAtMs: number | null;
|
|
55
|
+
/** Normalized, for the server to resolve against the org's members. */
|
|
56
|
+
assigneeEmail?: string;
|
|
57
|
+
notes?: string;
|
|
58
|
+
dropped: ImportDroppedValue[];
|
|
59
|
+
}
|
|
60
|
+
export type TaskImportRowVerdict = {
|
|
61
|
+
ok: true;
|
|
62
|
+
row: TaskImportRow;
|
|
63
|
+
} | {
|
|
64
|
+
ok: false;
|
|
65
|
+
reason: 'missing-title';
|
|
66
|
+
input: string;
|
|
67
|
+
};
|
|
68
|
+
/** A kind cell by id or by label — `todo`, `To-do`, `to do` are one kind. */
|
|
69
|
+
export declare function parseImportTaskKind(value: unknown): CrmTaskKind | null;
|
|
70
|
+
/** A priority cell as one of the three, `medium` and `urgent` folded in. */
|
|
71
|
+
export declare function parseImportTaskPriority(value: unknown): CrmTaskPriority | null;
|
|
72
|
+
/** A status cell as open or done — `done`, `complete`, `yes`, `true` all close it. */
|
|
73
|
+
export declare function parseImportTaskStatus(value: unknown): CrmTaskStatus | null;
|
|
74
|
+
/**
|
|
75
|
+
* One raw row as the values that will be written, or the reason it cannot
|
|
76
|
+
* be. Refused here only for a missing title; the assignee is refused by
|
|
77
|
+
* the server, which alone can look them up.
|
|
78
|
+
*/
|
|
79
|
+
export declare function normalizeTaskImportRow(raw: TaskImportRawRow): TaskImportRowVerdict;
|
|
80
|
+
/** One row the server did not store, by its index in the request, named by the task. */
|
|
81
|
+
export interface TaskImportSkippedRow {
|
|
82
|
+
index: number;
|
|
83
|
+
title: string;
|
|
84
|
+
reason: TaskImportSkipReason;
|
|
85
|
+
}
|
|
86
|
+
/** What one request did. The drawer sums these across a file. */
|
|
87
|
+
export type TaskImportChunkResult = ImportChunkResult<TaskImportSkippedRow>;
|
|
88
|
+
export declare function emptyTaskImportResult(): TaskImportChunkResult;
|
|
89
|
+
export declare function mergeTaskImportResults(total: TaskImportChunkResult, chunk: TaskImportChunkResult, offset?: number): TaskImportChunkResult;
|
|
90
|
+
/** The skipped rows as a file the operator can fix and re-import. */
|
|
91
|
+
export declare function taskImportSkippedCsv(columns: readonly string[], entries: readonly {
|
|
92
|
+
cells: readonly string[];
|
|
93
|
+
reason: TaskImportSkipReason;
|
|
94
|
+
}[]): string;
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_without_properties_loose";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ /**
|
|
18
|
+
* BRINGING A SPREADSHEET OF TASKS INTO THE CRM — the pure half (AGL-2662).
|
|
19
|
+
*
|
|
20
|
+
* The contact import's three stages (`crm-import.ts`) over the task
|
|
21
|
+
* vocabulary. A task is the simplest CRM record — a title, what kind of
|
|
22
|
+
* thing it is, how urgent, when it is due, whose it is — and the file
|
|
23
|
+
* carries exactly that.
|
|
24
|
+
*
|
|
25
|
+
* ## The assignee is resolved by address, and a stranger refuses the row
|
|
26
|
+
*
|
|
27
|
+
* A contact or a company whose owner address matches nobody is filed
|
|
28
|
+
* without an owner and the address is named at the end, because the
|
|
29
|
+
* record is worth having either way. A task is different: a task nobody
|
|
30
|
+
* holds is a task nobody does, and a file that names an assignee meant
|
|
31
|
+
* that person. So an address that matches no member of the organization
|
|
32
|
+
* refuses the ROW as `unknown-assignee`, and the operator fixes the sheet.
|
|
33
|
+
* A row with no assignee cell is filed unassigned, which is a choice.
|
|
34
|
+
*
|
|
35
|
+
* ## A task has no key, so nothing is merged
|
|
36
|
+
*
|
|
37
|
+
* Every row CREATES; importing a file twice files it twice. An imported
|
|
38
|
+
* task does not notify its assignee: forty notifications for a spreadsheet
|
|
39
|
+
* is noise, and the drawer's assignment notice is for one task at a time.
|
|
40
|
+
*
|
|
41
|
+
* ## A bad cell is dropped and named; a bad row is skipped and named
|
|
42
|
+
*
|
|
43
|
+
* A kind or a priority the CRM does not have falls back to the drawer's
|
|
44
|
+
* own defaults (`todo`, `normal`) and is REPORTED under
|
|
45
|
+
* {@link TaskImportRow.dropped}; a due date that is not a date is dropped
|
|
46
|
+
* the same way; a status other than open or done reads as open.
|
|
47
|
+
*/ import { normalizeContactEmail } from "@aglyn/aglyn/app-utils/contacts";
|
|
48
|
+
import { parseImportDate } from "./crm-deal-import.js";
|
|
49
|
+
import { CRM_TASK_KIND_LABELS, isCrmTaskKind } from "@aglyn/aglyn/app-utils/crm";
|
|
50
|
+
import { CSV_IMPORT_CHUNK_SIZE, CSV_IMPORT_MAX_BODY_BYTES, CSV_IMPORT_MAX_ROWS, CSV_IMPORT_PREVIEW_ROWS, emptyImportResult, guessImportMapping, importAliasKeys, importSkippedCsv, importTextValue, mapImportRow, mergeImportResults } from "@aglyn/aglyn/app-utils/csv-import";
|
|
51
|
+
/** The shared ceilings, under this collection's names. */ export const TASK_IMPORT_MAX_ROWS = CSV_IMPORT_MAX_ROWS;
|
|
52
|
+
export const TASK_IMPORT_CHUNK_SIZE = CSV_IMPORT_CHUNK_SIZE;
|
|
53
|
+
export const TASK_IMPORT_MAX_BODY_BYTES = CSV_IMPORT_MAX_BODY_BYTES;
|
|
54
|
+
export const TASK_IMPORT_PREVIEW_ROWS = CSV_IMPORT_PREVIEW_ROWS;
|
|
55
|
+
/** The same caps the task drawer holds a typed task to. */ export const TASK_IMPORT_TITLE_MAX = 200;
|
|
56
|
+
export const TASK_IMPORT_NOTES_MAX = 4000;
|
|
57
|
+
/** The fields a column may be mapped to, in the order the mapping menu lists them. */ export const TASK_IMPORT_FIELDS = [
|
|
58
|
+
'title',
|
|
59
|
+
'kind',
|
|
60
|
+
'priority',
|
|
61
|
+
'status',
|
|
62
|
+
'due',
|
|
63
|
+
'assigneeEmail',
|
|
64
|
+
'notes'
|
|
65
|
+
];
|
|
66
|
+
/** How each field reads in the mapping menu. Typed so a field cannot ship unlabeled. */ export const TASK_IMPORT_FIELD_LABELS = {
|
|
67
|
+
title: 'Title (required)',
|
|
68
|
+
kind: 'Kind (call, email, meeting, to-do)',
|
|
69
|
+
priority: 'Priority (low, normal, high)',
|
|
70
|
+
status: 'Status (open or done)',
|
|
71
|
+
due: 'Due (date or timestamp)',
|
|
72
|
+
assigneeEmail: 'Assignee (team member email)',
|
|
73
|
+
notes: 'Notes'
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Header aliases per field, matched after the shared header normalization.
|
|
77
|
+
*
|
|
78
|
+
* First in each list is the header this CRM's own tasks export writes, so
|
|
79
|
+
* an export re-imports without a hand mapping; the export's Contact,
|
|
80
|
+
* Company, Deal and Completed columns are deliberately absent, because a
|
|
81
|
+
* link is made on the record, not from a file, and the completion is
|
|
82
|
+
* stamped by the import when the status says done.
|
|
83
|
+
*/ const FIELD_ALIASES = {
|
|
84
|
+
title: [
|
|
85
|
+
'title',
|
|
86
|
+
'task',
|
|
87
|
+
'task title',
|
|
88
|
+
'task name',
|
|
89
|
+
'name',
|
|
90
|
+
'subject',
|
|
91
|
+
'summary'
|
|
92
|
+
],
|
|
93
|
+
kind: [
|
|
94
|
+
'kind',
|
|
95
|
+
'type',
|
|
96
|
+
'task type',
|
|
97
|
+
'activity type'
|
|
98
|
+
],
|
|
99
|
+
priority: [
|
|
100
|
+
'priority',
|
|
101
|
+
'importance',
|
|
102
|
+
'urgency'
|
|
103
|
+
],
|
|
104
|
+
status: [
|
|
105
|
+
'status',
|
|
106
|
+
'state',
|
|
107
|
+
'done',
|
|
108
|
+
'completed'
|
|
109
|
+
],
|
|
110
|
+
due: [
|
|
111
|
+
'due',
|
|
112
|
+
'due date',
|
|
113
|
+
'due at',
|
|
114
|
+
'deadline',
|
|
115
|
+
'due on'
|
|
116
|
+
],
|
|
117
|
+
assigneeEmail: [
|
|
118
|
+
'assignee',
|
|
119
|
+
'assignee email',
|
|
120
|
+
'assigned to',
|
|
121
|
+
'owner',
|
|
122
|
+
'owner email',
|
|
123
|
+
'rep'
|
|
124
|
+
],
|
|
125
|
+
notes: [
|
|
126
|
+
'notes',
|
|
127
|
+
'note',
|
|
128
|
+
'description',
|
|
129
|
+
'comments',
|
|
130
|
+
'details'
|
|
131
|
+
]
|
|
132
|
+
};
|
|
133
|
+
const FIELD_ALIAS_KEYS = importAliasKeys(TASK_IMPORT_FIELDS, FIELD_ALIASES);
|
|
134
|
+
/** A proposed mapping from a file's header row, each field taken at most once. */ export function guessTaskImportMapping(columns) {
|
|
135
|
+
return guessImportMapping(columns, TASK_IMPORT_FIELDS, FIELD_ALIAS_KEYS);
|
|
136
|
+
}
|
|
137
|
+
/** One parsed line under the mapping. Empty cells are left absent; a task has no custom fields. */ export function mapTaskImportRow(cells, mapping) {
|
|
138
|
+
const _mapImportRow = mapImportRow(cells, mapping), { custom: _custom } = _mapImportRow, row = _object_without_properties_loose(_mapImportRow, [
|
|
139
|
+
"custom"
|
|
140
|
+
]);
|
|
141
|
+
return row;
|
|
142
|
+
}
|
|
143
|
+
/** How a skip reason reads on screen and in the downloaded file. */ export const TASK_IMPORT_SKIP_LABELS = {
|
|
144
|
+
'missing-title': 'No title',
|
|
145
|
+
'unknown-assignee': 'No team member has that assignee address',
|
|
146
|
+
'write-failed': 'Could not be saved'
|
|
147
|
+
};
|
|
148
|
+
/** A kind cell by id or by label — `todo`, `To-do`, `to do` are one kind. */ export function parseImportTaskKind(value) {
|
|
149
|
+
const text = String(value != null ? value : '').trim().toLowerCase();
|
|
150
|
+
if (!text) return null;
|
|
151
|
+
if (isCrmTaskKind(text)) return text;
|
|
152
|
+
const bare = text.replace(/[\s-]+/g, '');
|
|
153
|
+
for (const [kind, label] of Object.entries(CRM_TASK_KIND_LABELS)){
|
|
154
|
+
if (label.toLowerCase().replace(/[\s-]+/g, '') === bare) return kind;
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
const PRIORITIES = {
|
|
159
|
+
low: 'low',
|
|
160
|
+
normal: 'normal',
|
|
161
|
+
medium: 'normal',
|
|
162
|
+
high: 'high',
|
|
163
|
+
urgent: 'high'
|
|
164
|
+
};
|
|
165
|
+
/** A priority cell as one of the three, `medium` and `urgent` folded in. */ export function parseImportTaskPriority(value) {
|
|
166
|
+
var _PRIORITIES_String_trim_toLowerCase;
|
|
167
|
+
return (_PRIORITIES_String_trim_toLowerCase = PRIORITIES[String(value != null ? value : '').trim().toLowerCase()]) != null ? _PRIORITIES_String_trim_toLowerCase : null;
|
|
168
|
+
}
|
|
169
|
+
/** A status cell as open or done — `done`, `complete`, `yes`, `true` all close it. */ export function parseImportTaskStatus(value) {
|
|
170
|
+
const text = String(value != null ? value : '').trim().toLowerCase();
|
|
171
|
+
if (!text) return null;
|
|
172
|
+
if ([
|
|
173
|
+
'done',
|
|
174
|
+
'complete',
|
|
175
|
+
'completed',
|
|
176
|
+
'closed',
|
|
177
|
+
'yes',
|
|
178
|
+
'y',
|
|
179
|
+
'true',
|
|
180
|
+
'1'
|
|
181
|
+
].includes(text)) {
|
|
182
|
+
return 'done';
|
|
183
|
+
}
|
|
184
|
+
if ([
|
|
185
|
+
'open',
|
|
186
|
+
'todo',
|
|
187
|
+
'to do',
|
|
188
|
+
'pending',
|
|
189
|
+
'no',
|
|
190
|
+
'n',
|
|
191
|
+
'false',
|
|
192
|
+
'0',
|
|
193
|
+
'incomplete'
|
|
194
|
+
].includes(text)) {
|
|
195
|
+
return 'open';
|
|
196
|
+
}
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* One raw row as the values that will be written, or the reason it cannot
|
|
201
|
+
* be. Refused here only for a missing title; the assignee is refused by
|
|
202
|
+
* the server, which alone can look them up.
|
|
203
|
+
*/ export function normalizeTaskImportRow(raw) {
|
|
204
|
+
var _importTextValue;
|
|
205
|
+
const title = (_importTextValue = importTextValue(raw.title, TASK_IMPORT_TITLE_MAX)) == null ? void 0 : _importTextValue.replace(/\s+/g, ' ');
|
|
206
|
+
if (!title) {
|
|
207
|
+
return {
|
|
208
|
+
ok: false,
|
|
209
|
+
reason: 'missing-title',
|
|
210
|
+
input: ''
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const dropped = [];
|
|
214
|
+
const drop = (field, value)=>{
|
|
215
|
+
dropped.push({
|
|
216
|
+
field,
|
|
217
|
+
value: String(value != null ? value : '').trim()
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
const row = {
|
|
221
|
+
title,
|
|
222
|
+
kind: 'todo',
|
|
223
|
+
priority: 'normal',
|
|
224
|
+
status: 'open',
|
|
225
|
+
dueAtMs: null,
|
|
226
|
+
dropped
|
|
227
|
+
};
|
|
228
|
+
const kindText = importTextValue(raw.kind, 32);
|
|
229
|
+
if (kindText) {
|
|
230
|
+
const kind = parseImportTaskKind(kindText);
|
|
231
|
+
if (kind) row.kind = kind;
|
|
232
|
+
else drop('kind', kindText);
|
|
233
|
+
}
|
|
234
|
+
const priorityText = importTextValue(raw.priority, 32);
|
|
235
|
+
if (priorityText) {
|
|
236
|
+
const priority = parseImportTaskPriority(priorityText);
|
|
237
|
+
if (priority) row.priority = priority;
|
|
238
|
+
else drop('priority', priorityText);
|
|
239
|
+
}
|
|
240
|
+
const statusText = importTextValue(raw.status, 32);
|
|
241
|
+
if (statusText) {
|
|
242
|
+
const status = parseImportTaskStatus(statusText);
|
|
243
|
+
if (status) row.status = status;
|
|
244
|
+
else drop('status', statusText);
|
|
245
|
+
}
|
|
246
|
+
const dueText = importTextValue(raw.due, 64);
|
|
247
|
+
if (dueText) {
|
|
248
|
+
const ms = parseImportDate(dueText);
|
|
249
|
+
if (ms !== null) row.dueAtMs = ms;
|
|
250
|
+
else drop('due', dueText);
|
|
251
|
+
}
|
|
252
|
+
const assigneeText = importTextValue(raw.assigneeEmail, 320);
|
|
253
|
+
if (assigneeText) {
|
|
254
|
+
const assignee = normalizeContactEmail(assigneeText);
|
|
255
|
+
if (assignee) row.assigneeEmail = assignee;
|
|
256
|
+
else drop('assigneeEmail', assigneeText);
|
|
257
|
+
}
|
|
258
|
+
const notes = importTextValue(raw.notes, TASK_IMPORT_NOTES_MAX);
|
|
259
|
+
if (notes) row.notes = notes;
|
|
260
|
+
return {
|
|
261
|
+
ok: true,
|
|
262
|
+
row
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
export function emptyTaskImportResult() {
|
|
266
|
+
return emptyImportResult();
|
|
267
|
+
}
|
|
268
|
+
export function mergeTaskImportResults(total, chunk, offset = 0) {
|
|
269
|
+
return mergeImportResults(total, chunk, offset);
|
|
270
|
+
}
|
|
271
|
+
/** The skipped rows as a file the operator can fix and re-import. */ export function taskImportSkippedCsv(columns, entries) {
|
|
272
|
+
return importSkippedCsv(columns, entries, TASK_IMPORT_SKIP_LABELS);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
//# sourceMappingURL=crm-task-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/crm-task-import.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * BRINGING A SPREADSHEET OF TASKS INTO THE CRM — the pure half (AGL-2662).\n *\n * The contact import's three stages (`crm-import.ts`) over the task\n * vocabulary. A task is the simplest CRM record — a title, what kind of\n * thing it is, how urgent, when it is due, whose it is — and the file\n * carries exactly that.\n *\n * ## The assignee is resolved by address, and a stranger refuses the row\n *\n * A contact or a company whose owner address matches nobody is filed\n * without an owner and the address is named at the end, because the\n * record is worth having either way. A task is different: a task nobody\n * holds is a task nobody does, and a file that names an assignee meant\n * that person. So an address that matches no member of the organization\n * refuses the ROW as `unknown-assignee`, and the operator fixes the sheet.\n * A row with no assignee cell is filed unassigned, which is a choice.\n *\n * ## A task has no key, so nothing is merged\n *\n * Every row CREATES; importing a file twice files it twice. An imported\n * task does not notify its assignee: forty notifications for a spreadsheet\n * is noise, and the drawer's assignment notice is for one task at a time.\n *\n * ## A bad cell is dropped and named; a bad row is skipped and named\n *\n * A kind or a priority the CRM does not have falls back to the drawer's\n * own defaults (`todo`, `normal`) and is REPORTED under\n * {@link TaskImportRow.dropped}; a due date that is not a date is dropped\n * the same way; a status other than open or done reads as open.\n */\n\nimport { normalizeContactEmail } from '@aglyn/aglyn/app-utils/contacts'\nimport { parseImportDate } from './crm-deal-import'\nimport {\n CRM_TASK_KIND_LABELS,\n type CrmTaskKind,\n type CrmTaskPriority,\n type CrmTaskStatus,\n isCrmTaskKind,\n} from '@aglyn/aglyn/app-utils/crm'\nimport {\n CSV_IMPORT_CHUNK_SIZE,\n CSV_IMPORT_MAX_BODY_BYTES,\n CSV_IMPORT_MAX_ROWS,\n CSV_IMPORT_PREVIEW_ROWS,\n emptyImportResult,\n guessImportMapping,\n importAliasKeys,\n type ImportChunkResult,\n type ImportDroppedValue,\n importSkippedCsv,\n importTextValue,\n mapImportRow,\n mergeImportResults,\n} from '@aglyn/aglyn/app-utils/csv-import'\n\n/** The shared ceilings, under this collection's names. */\nexport const TASK_IMPORT_MAX_ROWS = CSV_IMPORT_MAX_ROWS\nexport const TASK_IMPORT_CHUNK_SIZE = CSV_IMPORT_CHUNK_SIZE\nexport const TASK_IMPORT_MAX_BODY_BYTES = CSV_IMPORT_MAX_BODY_BYTES\nexport const TASK_IMPORT_PREVIEW_ROWS = CSV_IMPORT_PREVIEW_ROWS\n\n/** The same caps the task drawer holds a typed task to. */\nexport const TASK_IMPORT_TITLE_MAX = 200\nexport const TASK_IMPORT_NOTES_MAX = 4000\n\n/** The fields a column may be mapped to, in the order the mapping menu lists them. */\nexport const TASK_IMPORT_FIELDS = [\n 'title',\n 'kind',\n 'priority',\n 'status',\n 'due',\n 'assigneeEmail',\n 'notes',\n] as const\n\nexport type TaskImportField = (typeof TASK_IMPORT_FIELDS)[number]\n\n/** How each field reads in the mapping menu. Typed so a field cannot ship unlabeled. */\nexport const TASK_IMPORT_FIELD_LABELS: Record<TaskImportField, string> = {\n title: 'Title (required)',\n kind: 'Kind (call, email, meeting, to-do)',\n priority: 'Priority (low, normal, high)',\n status: 'Status (open or done)',\n due: 'Due (date or timestamp)',\n assigneeEmail: 'Assignee (team member email)',\n notes: 'Notes',\n}\n\n/**\n * Header aliases per field, matched after the shared header normalization.\n *\n * First in each list is the header this CRM's own tasks export writes, so\n * an export re-imports without a hand mapping; the export's Contact,\n * Company, Deal and Completed columns are deliberately absent, because a\n * link is made on the record, not from a file, and the completion is\n * stamped by the import when the status says done.\n */\nconst FIELD_ALIASES: Record<TaskImportField, readonly string[]> = {\n title: ['title', 'task', 'task title', 'task name', 'name', 'subject', 'summary'],\n kind: ['kind', 'type', 'task type', 'activity type'],\n priority: ['priority', 'importance', 'urgency'],\n status: ['status', 'state', 'done', 'completed'],\n due: ['due', 'due date', 'due at', 'deadline', 'due on'],\n assigneeEmail: ['assignee', 'assignee email', 'assigned to', 'owner', 'owner email', 'rep'],\n notes: ['notes', 'note', 'description', 'comments', 'details'],\n}\n\nconst FIELD_ALIAS_KEYS = importAliasKeys(TASK_IMPORT_FIELDS, FIELD_ALIASES)\n\n/** Column index → field. A column absent from the map is not imported. */\nexport type TaskImportMapping = Record<number, TaskImportField>\n\n/** A proposed mapping from a file's header row, each field taken at most once. */\nexport function guessTaskImportMapping(columns: readonly string[]): TaskImportMapping {\n return guessImportMapping(columns, TASK_IMPORT_FIELDS, FIELD_ALIAS_KEYS)\n}\n\n/**\n * What the browser posts for one line: the cells the mapping selected,\n * under the field they were mapped to, verbatim. `unknown` because the\n * server reads this off an untrusted body.\n */\nexport type TaskImportRawRow = Partial<Record<TaskImportField, unknown>>\n\n/** One parsed line under the mapping. Empty cells are left absent; a task has no custom fields. */\nexport function mapTaskImportRow(\n cells: readonly string[],\n mapping: Record<number, TaskImportField | `custom:${string}`>,\n): TaskImportRawRow {\n const { custom: _custom, ...row } = mapImportRow(cells, mapping)\n return row\n}\n\nexport type TaskImportSkipReason =\n | 'missing-title'\n | 'unknown-assignee'\n | 'write-failed'\n\n/** How a skip reason reads on screen and in the downloaded file. */\nexport const TASK_IMPORT_SKIP_LABELS: Record<TaskImportSkipReason, string> = {\n 'missing-title': 'No title',\n 'unknown-assignee': 'No team member has that assignee address',\n 'write-failed': 'Could not be saved',\n}\n\n/** One row, ready for the server to resolve and write. */\nexport interface TaskImportRow {\n title: string\n kind: CrmTaskKind\n priority: CrmTaskPriority\n status: CrmTaskStatus\n /** Epoch ms, or `null` for no due date — the shape the document stores. */\n dueAtMs: number | null\n /** Normalized, for the server to resolve against the org's members. */\n assigneeEmail?: string\n notes?: string\n dropped: ImportDroppedValue[]\n}\n\nexport type TaskImportRowVerdict =\n | { ok: true; row: TaskImportRow }\n | { ok: false; reason: 'missing-title'; input: string }\n\n/** A kind cell by id or by label — `todo`, `To-do`, `to do` are one kind. */\nexport function parseImportTaskKind(value: unknown): CrmTaskKind | null {\n const text = String(value ?? '')\n .trim()\n .toLowerCase()\n if (!text) return null\n if (isCrmTaskKind(text)) return text\n const bare = text.replace(/[\\s-]+/g, '')\n for (const [kind, label] of Object.entries(CRM_TASK_KIND_LABELS)) {\n if (label.toLowerCase().replace(/[\\s-]+/g, '') === bare) return kind as CrmTaskKind\n }\n return null\n}\n\nconst PRIORITIES: Record<string, CrmTaskPriority> = {\n low: 'low',\n normal: 'normal',\n medium: 'normal',\n high: 'high',\n urgent: 'high',\n}\n\n/** A priority cell as one of the three, `medium` and `urgent` folded in. */\nexport function parseImportTaskPriority(value: unknown): CrmTaskPriority | null {\n return PRIORITIES[String(value ?? '').trim().toLowerCase()] ?? null\n}\n\n/** A status cell as open or done — `done`, `complete`, `yes`, `true` all close it. */\nexport function parseImportTaskStatus(value: unknown): CrmTaskStatus | null {\n const text = String(value ?? '')\n .trim()\n .toLowerCase()\n if (!text) return null\n if (['done', 'complete', 'completed', 'closed', 'yes', 'y', 'true', '1'].includes(text)) {\n return 'done'\n }\n if (['open', 'todo', 'to do', 'pending', 'no', 'n', 'false', '0', 'incomplete'].includes(text)) {\n return 'open'\n }\n return null\n}\n\n/**\n * One raw row as the values that will be written, or the reason it cannot\n * be. Refused here only for a missing title; the assignee is refused by\n * the server, which alone can look them up.\n */\nexport function normalizeTaskImportRow(raw: TaskImportRawRow): TaskImportRowVerdict {\n const title = importTextValue(raw.title, TASK_IMPORT_TITLE_MAX)?.replace(/\\s+/g, ' ')\n if (!title) {\n return { ok: false, reason: 'missing-title', input: '' }\n }\n const dropped: ImportDroppedValue[] = []\n const drop = (field: TaskImportField, value: unknown) => {\n dropped.push({ field, value: String(value ?? '').trim() })\n }\n const row: TaskImportRow = {\n title,\n kind: 'todo',\n priority: 'normal',\n status: 'open',\n dueAtMs: null,\n dropped,\n }\n\n const kindText = importTextValue(raw.kind, 32)\n if (kindText) {\n const kind = parseImportTaskKind(kindText)\n if (kind) row.kind = kind\n else drop('kind', kindText)\n }\n\n const priorityText = importTextValue(raw.priority, 32)\n if (priorityText) {\n const priority = parseImportTaskPriority(priorityText)\n if (priority) row.priority = priority\n else drop('priority', priorityText)\n }\n\n const statusText = importTextValue(raw.status, 32)\n if (statusText) {\n const status = parseImportTaskStatus(statusText)\n if (status) row.status = status\n else drop('status', statusText)\n }\n\n const dueText = importTextValue(raw.due, 64)\n if (dueText) {\n const ms = parseImportDate(dueText)\n if (ms !== null) row.dueAtMs = ms\n else drop('due', dueText)\n }\n\n const assigneeText = importTextValue(raw.assigneeEmail, 320)\n if (assigneeText) {\n const assignee = normalizeContactEmail(assigneeText)\n if (assignee) row.assigneeEmail = assignee\n else drop('assigneeEmail', assigneeText)\n }\n\n const notes = importTextValue(raw.notes, TASK_IMPORT_NOTES_MAX)\n if (notes) row.notes = notes\n\n return { ok: true, row }\n}\n\n/** One row the server did not store, by its index in the request, named by the task. */\nexport interface TaskImportSkippedRow {\n index: number\n title: string\n reason: TaskImportSkipReason\n}\n\n/** What one request did. The drawer sums these across a file. */\nexport type TaskImportChunkResult = ImportChunkResult<TaskImportSkippedRow>\n\nexport function emptyTaskImportResult(): TaskImportChunkResult {\n return emptyImportResult<TaskImportSkippedRow>()\n}\n\nexport function mergeTaskImportResults(\n total: TaskImportChunkResult,\n chunk: TaskImportChunkResult,\n offset = 0,\n): TaskImportChunkResult {\n return mergeImportResults(total, chunk, offset)\n}\n\n/** The skipped rows as a file the operator can fix and re-import. */\nexport function taskImportSkippedCsv(\n columns: readonly string[],\n entries: readonly { cells: readonly string[]; reason: TaskImportSkipReason }[],\n): string {\n return importSkippedCsv(columns, entries, TASK_IMPORT_SKIP_LABELS)\n}\n"],"names":["normalizeContactEmail","parseImportDate","CRM_TASK_KIND_LABELS","isCrmTaskKind","CSV_IMPORT_CHUNK_SIZE","CSV_IMPORT_MAX_BODY_BYTES","CSV_IMPORT_MAX_ROWS","CSV_IMPORT_PREVIEW_ROWS","emptyImportResult","guessImportMapping","importAliasKeys","importSkippedCsv","importTextValue","mapImportRow","mergeImportResults","TASK_IMPORT_MAX_ROWS","TASK_IMPORT_CHUNK_SIZE","TASK_IMPORT_MAX_BODY_BYTES","TASK_IMPORT_PREVIEW_ROWS","TASK_IMPORT_TITLE_MAX","TASK_IMPORT_NOTES_MAX","TASK_IMPORT_FIELDS","TASK_IMPORT_FIELD_LABELS","title","kind","priority","status","due","assigneeEmail","notes","FIELD_ALIASES","FIELD_ALIAS_KEYS","guessTaskImportMapping","columns","mapTaskImportRow","cells","mapping","custom","_custom","row","TASK_IMPORT_SKIP_LABELS","parseImportTaskKind","value","text","String","trim","toLowerCase","bare","replace","label","Object","entries","PRIORITIES","low","normal","medium","high","urgent","parseImportTaskPriority","parseImportTaskStatus","includes","normalizeTaskImportRow","raw","ok","reason","input","dropped","drop","field","push","dueAtMs","kindText","priorityText","statusText","dueText","ms","assigneeText","assignee","emptyTaskImportResult","mergeTaskImportResults","total","chunk","offset","taskImportSkippedCsv"],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* A view's place in a section's address (AGL-2617).
|
|
19
|
+
*
|
|
20
|
+
* `?view=<id>` is what makes a view linkable: a rep pastes the address of
|
|
21
|
+
* "my open leads" into a chat and a colleague opens the same list. The key
|
|
22
|
+
* COMPOSES with the other keys a section reads — the Contacts list's
|
|
23
|
+
* `formId` and `email` seeds — rather than replacing them, so a form's page
|
|
24
|
+
* can link to "the people this form captured, in my usual view" and the
|
|
25
|
+
* list answers both. Pure, so the seed parser and the views controller read
|
|
26
|
+
* one spelling of the key.
|
|
27
|
+
*/
|
|
28
|
+
export declare const CRM_VIEW_PARAM = "view";
|
|
29
|
+
/** The view id a section's address names, or none. */
|
|
30
|
+
export declare function crmViewIdFromParams(params: {
|
|
31
|
+
get(name: string): string | null;
|
|
32
|
+
} | null | undefined): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* The same address with the view set or, with `null`, cleared — every
|
|
35
|
+
* other key kept exactly as it was.
|
|
36
|
+
*
|
|
37
|
+
* Built from the section path and the current query rather than from
|
|
38
|
+
* `location`, so a list mounted anywhere the shell mounts it links to
|
|
39
|
+
* itself; `pathname` carries no query of its own.
|
|
40
|
+
*/
|
|
41
|
+
export declare function crmViewHref(pathname: string, params: {
|
|
42
|
+
toString(): string;
|
|
43
|
+
} | null | undefined, viewId: string | null): string;
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
*/ /**
|
|
17
|
+
* A view's place in a section's address (AGL-2617).
|
|
18
|
+
*
|
|
19
|
+
* `?view=<id>` is what makes a view linkable: a rep pastes the address of
|
|
20
|
+
* "my open leads" into a chat and a colleague opens the same list. The key
|
|
21
|
+
* COMPOSES with the other keys a section reads — the Contacts list's
|
|
22
|
+
* `formId` and `email` seeds — rather than replacing them, so a form's page
|
|
23
|
+
* can link to "the people this form captured, in my usual view" and the
|
|
24
|
+
* list answers both. Pure, so the seed parser and the views controller read
|
|
25
|
+
* one spelling of the key.
|
|
26
|
+
*/ export const CRM_VIEW_PARAM = 'view';
|
|
27
|
+
/** The view id a section's address names, or none. */ export function crmViewIdFromParams(params) {
|
|
28
|
+
var _ref;
|
|
29
|
+
const raw = (_ref = params == null ? void 0 : params.get(CRM_VIEW_PARAM)) != null ? _ref : '';
|
|
30
|
+
const trimmed = raw.trim();
|
|
31
|
+
return trimmed ? trimmed : null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The same address with the view set or, with `null`, cleared — every
|
|
35
|
+
* other key kept exactly as it was.
|
|
36
|
+
*
|
|
37
|
+
* Built from the section path and the current query rather than from
|
|
38
|
+
* `location`, so a list mounted anywhere the shell mounts it links to
|
|
39
|
+
* itself; `pathname` carries no query of its own.
|
|
40
|
+
*/ export function crmViewHref(pathname, params, viewId) {
|
|
41
|
+
var _ref;
|
|
42
|
+
const next = new URLSearchParams((_ref = params == null ? void 0 : params.toString()) != null ? _ref : '');
|
|
43
|
+
if (viewId) next.set(CRM_VIEW_PARAM, viewId);
|
|
44
|
+
else next.delete(CRM_VIEW_PARAM);
|
|
45
|
+
const query = next.toString();
|
|
46
|
+
return query ? `${pathname}?${query}` : pathname;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=crm-view-param.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/crm-view-param.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * A view's place in a section's address (AGL-2617).\n *\n * `?view=<id>` is what makes a view linkable: a rep pastes the address of\n * \"my open leads\" into a chat and a colleague opens the same list. The key\n * COMPOSES with the other keys a section reads — the Contacts list's\n * `formId` and `email` seeds — rather than replacing them, so a form's page\n * can link to \"the people this form captured, in my usual view\" and the\n * list answers both. Pure, so the seed parser and the views controller read\n * one spelling of the key.\n */\n\nexport const CRM_VIEW_PARAM = 'view'\n\n/** The view id a section's address names, or none. */\nexport function crmViewIdFromParams(\n params: { get(name: string): string | null } | null | undefined,\n): string | null {\n const raw = params?.get(CRM_VIEW_PARAM) ?? ''\n const trimmed = raw.trim()\n return trimmed ? trimmed : null\n}\n\n/**\n * The same address with the view set or, with `null`, cleared — every\n * other key kept exactly as it was.\n *\n * Built from the section path and the current query rather than from\n * `location`, so a list mounted anywhere the shell mounts it links to\n * itself; `pathname` carries no query of its own.\n */\nexport function crmViewHref(\n pathname: string,\n params: { toString(): string } | null | undefined,\n viewId: string | null,\n): string {\n const next = new URLSearchParams(params?.toString() ?? '')\n if (viewId) next.set(CRM_VIEW_PARAM, viewId)\n else next.delete(CRM_VIEW_PARAM)\n const query = next.toString()\n return query ? `${pathname}?${query}` : pathname\n}\n"],"names":["CRM_VIEW_PARAM","crmViewIdFromParams","params","raw","get","trimmed","trim","crmViewHref","pathname","viewId","next","URLSearchParams","toString","set","delete","query"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;CAUC,GAED,OAAO,MAAMA,iBAAiB,OAAM;AAEpC,oDAAoD,GACpD,OAAO,SAASC,oBACdC,MAA+D;;IAE/D,MAAMC,cAAMD,0BAAAA,OAAQE,GAAG,CAACJ,kCAAmB;IAC3C,MAAMK,UAAUF,IAAIG,IAAI;IACxB,OAAOD,UAAUA,UAAU;AAC7B;AAEA;;;;;;;CAOC,GACD,OAAO,SAASE,YACdC,QAAgB,EAChBN,MAAiD,EACjDO,MAAqB;;IAErB,MAAMC,OAAO,IAAIC,wBAAgBT,0BAAAA,OAAQU,QAAQ,qBAAM;IACvD,IAAIH,QAAQC,KAAKG,GAAG,CAACb,gBAAgBS;SAChCC,KAAKI,MAAM,CAACd;IACjB,MAAMe,QAAQL,KAAKE,QAAQ;IAC3B,OAAOG,QAAQ,GAAGP,SAAS,CAAC,EAAEO,OAAO,GAAGP;AAC1C"}
|