@aglyn/plugins-crm 1.0.0-beta.221 → 1.0.0-beta.222
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/package.json +13 -13
- package/src/lib/components/activity-list.js +12 -5
- package/src/lib/components/activity-list.js.map +1 -1
- package/src/lib/components/companies-bulk-bar.d.ts +1 -4
- package/src/lib/components/companies-bulk-bar.js +7 -20
- package/src/lib/components/companies-bulk-bar.js.map +1 -1
- package/src/lib/components/companies-section.d.ts +3 -3
- package/src/lib/components/companies-section.js +149 -46
- package/src/lib/components/companies-section.js.map +1 -1
- package/src/lib/components/company-edit-drawer.js +281 -20
- package/src/lib/components/company-edit-drawer.js.map +1 -1
- package/src/lib/components/company-properties-card.js +99 -8
- package/src/lib/components/company-properties-card.js.map +1 -1
- package/src/lib/components/contact-detail-page.js +3 -1
- package/src/lib/components/contact-detail-page.js.map +1 -1
- package/src/lib/components/contact-merge-dialog.js +33 -10
- package/src/lib/components/contact-merge-dialog.js.map +1 -1
- package/src/lib/components/contact-properties-card.d.ts +0 -69
- package/src/lib/components/contact-properties-card.js +350 -60
- package/src/lib/components/contact-properties-card.js.map +1 -1
- package/src/lib/components/contact-reports-to-field.d.ts +46 -0
- package/src/lib/components/contact-reports-to-field.js +67 -0
- package/src/lib/components/contact-reports-to-field.js.map +1 -0
- package/src/lib/components/contacts-bulk-bar.d.ts +1 -8
- package/src/lib/components/contacts-bulk-bar.js +7 -19
- package/src/lib/components/contacts-bulk-bar.js.map +1 -1
- package/src/lib/components/contacts-section.js +46 -33
- package/src/lib/components/contacts-section.js.map +1 -1
- package/src/lib/components/crm-call-actions.d.ts +10 -0
- package/src/lib/components/crm-call-actions.js +26 -9
- package/src/lib/components/crm-call-actions.js.map +1 -1
- package/src/lib/components/crm-record-picker.d.ts +15 -0
- package/src/lib/components/crm-record-picker.js +16 -10
- package/src/lib/components/crm-record-picker.js.map +1 -1
- package/src/lib/components/crm-transfer-buttons.d.ts +54 -0
- package/src/lib/components/crm-transfer-buttons.js +167 -0
- package/src/lib/components/crm-transfer-buttons.js.map +1 -0
- package/src/lib/components/deal-contact-roles-card.d.ts +46 -0
- package/src/lib/components/deal-contact-roles-card.js +368 -0
- package/src/lib/components/deal-contact-roles-card.js.map +1 -0
- package/src/lib/components/deal-detail-page.d.ts +3 -2
- package/src/lib/components/deal-detail-page.js +25 -6
- package/src/lib/components/deal-detail-page.js.map +1 -1
- package/src/lib/components/deal-edit-drawer.d.ts +10 -0
- package/src/lib/components/deal-edit-drawer.js +219 -10
- package/src/lib/components/deal-edit-drawer.js.map +1 -1
- package/src/lib/components/deal-properties-card.d.ts +7 -0
- package/src/lib/components/deal-properties-card.js +34 -3
- package/src/lib/components/deal-properties-card.js.map +1 -1
- package/src/lib/components/deal-stage-card.d.ts +4 -0
- package/src/lib/components/deal-stage-card.js +10 -2
- package/src/lib/components/deal-stage-card.js.map +1 -1
- package/src/lib/components/deals-bulk-bar.d.ts +0 -3
- package/src/lib/components/deals-bulk-bar.js +7 -20
- package/src/lib/components/deals-bulk-bar.js.map +1 -1
- package/src/lib/components/deals-section.d.ts +3 -3
- package/src/lib/components/deals-section.js +123 -63
- package/src/lib/components/deals-section.js.map +1 -1
- package/src/lib/components/fields-section.js +31 -17
- package/src/lib/components/fields-section.js.map +1 -1
- package/src/lib/components/lead-convert-dialog.d.ts +4 -0
- package/src/lib/components/lead-convert-dialog.js +23 -1
- package/src/lib/components/lead-convert-dialog.js.map +1 -1
- package/src/lib/components/lead-detail-page.js +8 -2
- package/src/lib/components/lead-detail-page.js.map +1 -1
- package/src/lib/components/lead-profile-fields.d.ts +71 -0
- package/src/lib/components/lead-profile-fields.js +386 -0
- package/src/lib/components/lead-profile-fields.js.map +1 -0
- package/src/lib/components/lead-properties-card.d.ts +2 -1
- package/src/lib/components/lead-properties-card.js +85 -176
- package/src/lib/components/lead-properties-card.js.map +1 -1
- package/src/lib/components/lead-source-select.d.ts +4 -23
- package/src/lib/components/lead-source-select.js +9 -73
- package/src/lib/components/lead-source-select.js.map +1 -1
- package/src/lib/components/lead-status-chip.d.ts +9 -3
- package/src/lib/components/lead-status-chip.js +8 -4
- package/src/lib/components/lead-status-chip.js.map +1 -1
- package/src/lib/components/lead-status-options.d.ts +20 -0
- package/src/lib/components/lead-status-options.js +51 -0
- package/src/lib/components/lead-status-options.js.map +1 -0
- package/src/lib/components/lead-unqualify-dialog.d.ts +5 -0
- package/src/lib/components/lead-unqualify-dialog.js +50 -18
- package/src/lib/components/lead-unqualify-dialog.js.map +1 -1
- package/src/lib/components/leads-bulk-bar.d.ts +0 -3
- package/src/lib/components/leads-bulk-bar.js +29 -29
- package/src/lib/components/leads-bulk-bar.js.map +1 -1
- package/src/lib/components/leads-section.js +120 -68
- package/src/lib/components/leads-section.js.map +1 -1
- package/src/lib/components/linked-deals-card.d.ts +4 -0
- package/src/lib/components/linked-deals-card.js +47 -3
- package/src/lib/components/linked-deals-card.js.map +1 -1
- package/src/lib/components/log-activity-dialog.js +43 -3
- package/src/lib/components/log-activity-dialog.js.map +1 -1
- package/src/lib/components/new-contact-drawer.d.ts +8 -0
- package/src/lib/components/new-contact-drawer.js +108 -6
- package/src/lib/components/new-contact-drawer.js.map +1 -1
- package/src/lib/components/new-lead-drawer.d.ts +9 -2
- package/src/lib/components/new-lead-drawer.js +88 -121
- package/src/lib/components/new-lead-drawer.js.map +1 -1
- package/src/lib/components/picklist-select.d.ts +36 -0
- package/src/lib/components/picklist-select.js +114 -0
- package/src/lib/components/picklist-select.js.map +1 -0
- package/src/lib/components/picklist-values-card.d.ts +34 -0
- package/src/lib/components/{lead-source-values-card.js → picklist-values-card.js} +241 -58
- package/src/lib/components/picklist-values-card.js.map +1 -0
- package/src/lib/components/pipeline-stages-dialog.d.ts +7 -0
- package/src/lib/components/pipeline-stages-dialog.js +26 -4
- package/src/lib/components/pipeline-stages-dialog.js.map +1 -1
- package/src/lib/components/pipelines-dialog.js +15 -6
- package/src/lib/components/pipelines-dialog.js.map +1 -1
- package/src/lib/components/recent-activity-feed.js +20 -5
- package/src/lib/components/recent-activity-feed.js.map +1 -1
- package/src/lib/components/recipes-card.js +4 -2
- package/src/lib/components/recipes-card.js.map +1 -1
- package/src/lib/components/record-tasks-card.js +15 -8
- package/src/lib/components/record-tasks-card.js.map +1 -1
- package/src/lib/components/reports/forecast-card.d.ts +6 -0
- package/src/lib/components/reports/forecast-card.js +101 -3
- package/src/lib/components/reports/forecast-card.js.map +1 -1
- package/src/lib/components/reports/lead-funnel-card.d.ts +12 -0
- package/src/lib/components/reports/lead-funnel-card.js +9 -5
- package/src/lib/components/reports/lead-funnel-card.js.map +1 -1
- package/src/lib/components/reports/lead-source-card.d.ts +23 -0
- package/src/lib/components/reports/lead-source-card.js +318 -0
- package/src/lib/components/reports/lead-source-card.js.map +1 -0
- package/src/lib/components/reports/report-export.js +1 -1
- package/src/lib/components/reports/report-export.js.map +1 -1
- package/src/lib/components/reports-section.js +8 -0
- package/src/lib/components/reports-section.js.map +1 -1
- package/src/lib/components/sharing-rule-drawer.d.ts +5 -0
- package/src/lib/components/sharing-rule-drawer.js +108 -19
- package/src/lib/components/sharing-rule-drawer.js.map +1 -1
- package/src/lib/components/sharing-rules-card.js +11 -3
- package/src/lib/components/sharing-rules-card.js.map +1 -1
- package/src/lib/components/task-cells.d.ts +9 -1
- package/src/lib/components/task-cells.js +9 -4
- package/src/lib/components/task-cells.js.map +1 -1
- package/src/lib/components/task-edit-drawer.js +111 -43
- package/src/lib/components/task-edit-drawer.js.map +1 -1
- package/src/lib/components/tasks-bulk-bar.d.ts +0 -3
- package/src/lib/components/tasks-bulk-bar.js +7 -20
- package/src/lib/components/tasks-bulk-bar.js.map +1 -1
- package/src/lib/components/tasks-calendar.d.ts +3 -0
- package/src/lib/components/tasks-calendar.js +8 -1
- package/src/lib/components/tasks-calendar.js.map +1 -1
- package/src/lib/components/tasks-section.d.ts +3 -3
- package/src/lib/components/tasks-section.js +58 -43
- package/src/lib/components/tasks-section.js.map +1 -1
- package/src/lib/constants/api-routes.d.ts +2 -9
- package/src/lib/constants/api-routes.js +1 -7
- package/src/lib/constants/api-routes.js.map +1 -1
- package/src/lib/constants/bundle-common.d.ts +6 -0
- package/src/lib/constants/bundle-common.js +11 -0
- package/src/lib/constants/bundle-common.js.map +1 -1
- package/src/lib/constants/company-filters.d.ts +14 -0
- package/src/lib/constants/company-filters.js +51 -1
- package/src/lib/constants/company-filters.js.map +1 -1
- package/src/lib/constants/contact-filters.d.ts +2 -0
- package/src/lib/constants/contact-filters.js +18 -1
- package/src/lib/constants/contact-filters.js.map +1 -1
- package/src/lib/constants/deal-filters.d.ts +22 -1
- package/src/lib/constants/deal-filters.js +67 -4
- package/src/lib/constants/deal-filters.js.map +1 -1
- package/src/lib/declarations.console-server.d.ts +3 -0
- package/src/lib/declarations.console-server.js +35 -0
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.d.ts +26 -0
- package/src/lib/declarations.js +35 -0
- package/src/lib/declarations.js.map +1 -0
- package/src/lib/declarations.server.d.ts +11 -0
- package/src/lib/declarations.server.js +92 -1
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/hooks/use-company-picklists.d.ts +15 -0
- package/src/lib/hooks/use-company-picklists.js +55 -0
- package/src/lib/hooks/use-company-picklists.js.map +1 -0
- package/src/lib/hooks/use-crm-picklist.d.ts +25 -0
- package/src/lib/hooks/use-crm-picklist.js +53 -0
- package/src/lib/hooks/use-crm-picklist.js.map +1 -0
- package/src/lib/hooks/use-crm-record-names.d.ts +16 -0
- package/src/lib/hooks/use-crm-record-names.js +45 -19
- package/src/lib/hooks/use-crm-record-names.js.map +1 -1
- package/src/lib/hooks/use-crm-task-picklists.d.ts +11 -0
- package/src/lib/hooks/use-crm-task-picklists.js +45 -0
- package/src/lib/hooks/use-crm-task-picklists.js.map +1 -0
- package/src/lib/hooks/use-deals.d.ts +14 -0
- package/src/lib/hooks/use-deals.js +29 -0
- package/src/lib/hooks/use-deals.js.map +1 -1
- package/src/lib/hooks/use-lead-picklists.d.ts +14 -0
- package/src/lib/hooks/use-lead-picklists.js +46 -0
- package/src/lib/hooks/use-lead-picklists.js.map +1 -0
- package/src/lib/hooks/use-lead-source-picklist.d.ts +5 -19
- package/src/lib/hooks/use-lead-source-picklist.js +12 -22
- package/src/lib/hooks/use-lead-source-picklist.js.map +1 -1
- package/src/lib/hooks/use-lead-status-picklist.d.ts +9 -0
- package/src/lib/hooks/use-lead-status-picklist.js +40 -0
- package/src/lib/hooks/use-lead-status-picklist.js.map +1 -0
- package/src/lib/model/companies.d.ts +32 -3
- package/src/lib/model/companies.js +133 -16
- package/src/lib/model/companies.js.map +1 -1
- package/src/lib/model/contact-merge.d.ts +27 -3
- package/src/lib/model/contact-merge.js +81 -7
- package/src/lib/model/contact-merge.js.map +1 -1
- package/src/lib/model/contact-record.d.ts +17 -0
- package/src/lib/model/contact-record.js +15 -1
- package/src/lib/model/contact-record.js.map +1 -1
- package/src/lib/model/contact-update.d.ts +31 -2
- package/src/lib/model/contact-update.js +14 -0
- package/src/lib/model/contact-update.js.map +1 -1
- package/src/lib/model/crm-list-query.d.ts +5 -0
- package/src/lib/model/crm-list-query.js +8 -0
- package/src/lib/model/crm-list-query.js.map +1 -1
- package/src/lib/model/crm-recipes.d.ts +40 -0
- package/src/lib/model/crm-recipes.js +244 -0
- package/src/lib/model/crm-recipes.js.map +1 -0
- package/src/lib/model/crm-record-counts.d.ts +36 -0
- package/src/lib/model/crm-record-counts.js +54 -0
- package/src/lib/model/crm-record-counts.js.map +1 -0
- package/src/lib/model/crm-record-lists.d.ts +23 -0
- package/src/lib/model/crm-record-lists.js +161 -0
- package/src/lib/model/crm-record-lists.js.map +1 -0
- package/src/lib/model/crm-reports.d.ts +73 -3
- package/src/lib/model/crm-reports.js +120 -1
- package/src/lib/model/crm-reports.js.map +1 -1
- package/src/lib/model/crm-sharing.d.ts +21 -3
- package/src/lib/model/crm-sharing.js +27 -6
- package/src/lib/model/crm-sharing.js.map +1 -1
- package/src/lib/model/deal-board-model.d.ts +8 -2
- package/src/lib/model/deal-board-model.js +15 -2
- package/src/lib/model/deal-board-model.js.map +1 -1
- package/src/lib/model/deal-contact-roles.d.ts +45 -0
- package/src/lib/model/deal-contact-roles.js +73 -0
- package/src/lib/model/deal-contact-roles.js.map +1 -0
- package/src/lib/model/deal-form-model.d.ts +56 -0
- package/src/lib/model/deal-form-model.js +79 -7
- package/src/lib/model/deal-form-model.js.map +1 -1
- package/src/lib/model/download-text-file.d.ts +23 -0
- package/src/lib/model/download-text-file.js +34 -0
- package/src/lib/model/download-text-file.js.map +1 -0
- package/src/lib/model/lead-filters.d.ts +36 -2
- package/src/lib/model/lead-filters.js +123 -2
- package/src/lib/model/lead-filters.js.map +1 -1
- package/src/lib/model/lead-source-direction.d.ts +38 -0
- package/src/lib/model/lead-source-direction.js +52 -0
- package/src/lib/model/lead-source-direction.js.map +1 -0
- package/src/lib/model/picklist-values.d.ts +119 -0
- package/src/lib/model/picklist-values.js +256 -0
- package/src/lib/model/picklist-values.js.map +1 -0
- package/src/lib/model/record-facts-disclosed.d.ts +81 -0
- package/src/lib/model/record-facts-disclosed.js +281 -0
- package/src/lib/model/record-facts-disclosed.js.map +1 -0
- package/src/lib/model/record-facts.d.ts +215 -34
- package/src/lib/model/record-facts.js +307 -128
- package/src/lib/model/record-facts.js.map +1 -1
- package/src/lib/model/task-picklists.d.ts +52 -0
- package/src/lib/model/task-picklists.js +83 -0
- package/src/lib/model/task-picklists.js.map +1 -0
- package/src/lib/model/task-routes.d.ts +13 -0
- package/src/lib/model/task-routes.js +23 -4
- package/src/lib/model/task-routes.js.map +1 -1
- package/src/lib/plan-entitlements.js +6 -4
- package/src/lib/plan-entitlements.js.map +1 -1
- package/src/lib/plugin.js +17 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/server/api-v1/contacts.js +220 -14
- package/src/lib/server/api-v1/contacts.js.map +1 -1
- package/src/lib/server/api-v1/crm-activities.js +14 -1
- package/src/lib/server/api-v1/crm-activities.js.map +1 -1
- package/src/lib/server/api-v1/crm-companies.js +123 -14
- package/src/lib/server/api-v1/crm-companies.js.map +1 -1
- package/src/lib/server/api-v1/crm-deals.js +291 -26
- package/src/lib/server/api-v1/crm-deals.js.map +1 -1
- package/src/lib/server/api-v1/crm-leads.js +144 -38
- package/src/lib/server/api-v1/crm-leads.js.map +1 -1
- package/src/lib/server/api-v1/crm-pipelines.d.ts +6 -0
- package/src/lib/server/api-v1/crm-pipelines.js +8 -2
- package/src/lib/server/api-v1/crm-pipelines.js.map +1 -1
- package/src/lib/server/api-v1/crm-tasks.js +75 -33
- package/src/lib/server/api-v1/crm-tasks.js.map +1 -1
- package/src/lib/server/api-v1/openapi.d.ts +0 -11
- package/src/lib/server/api-v1/openapi.js +171 -16
- package/src/lib/server/api-v1/openapi.js.map +1 -1
- package/src/lib/server/assign-contact-owner.d.ts +162 -0
- package/src/lib/server/assign-contact-owner.js +340 -0
- package/src/lib/server/assign-contact-owner.js.map +1 -0
- package/src/lib/server/associate-company-by-domain.d.ts +70 -0
- package/src/lib/server/associate-company-by-domain.js +153 -0
- package/src/lib/server/associate-company-by-domain.js.map +1 -0
- package/src/lib/server/automation-steps.d.ts +139 -0
- package/src/lib/server/automation-steps.js +472 -0
- package/src/lib/server/automation-steps.js.map +1 -0
- package/src/lib/server/capture-contact.js +65 -21
- package/src/lib/server/capture-contact.js.map +1 -1
- package/src/lib/server/capture-host-contact.d.ts +104 -0
- package/src/lib/server/capture-host-contact.js +151 -0
- package/src/lib/server/capture-host-contact.js.map +1 -0
- package/src/lib/server/company-children.d.ts +25 -0
- package/src/lib/server/company-children.js +42 -0
- package/src/lib/server/company-children.js.map +1 -0
- package/src/lib/server/company-delete.d.ts +18 -0
- package/src/lib/server/company-delete.js +44 -21
- package/src/lib/server/company-delete.js.map +1 -1
- package/src/lib/server/contact-email-history.js +21 -19
- package/src/lib/server/contact-email-history.js.map +1 -1
- package/src/lib/server/contact-remove.js +27 -2
- package/src/lib/server/contact-remove.js.map +1 -1
- package/src/lib/server/contact-reports-to.d.ts +61 -0
- package/src/lib/server/contact-reports-to.js +114 -0
- package/src/lib/server/contact-reports-to.js.map +1 -0
- package/src/lib/server/contact-update.d.ts +42 -1
- package/src/lib/server/contact-update.js +204 -23
- package/src/lib/server/contact-update.js.map +1 -1
- package/src/lib/server/convert-host-lead.d.ts +46 -1
- package/src/lib/server/convert-host-lead.js +173 -15
- package/src/lib/server/convert-host-lead.js.map +1 -1
- package/src/lib/server/convert-open-lead.js +12 -5
- package/src/lib/server/convert-open-lead.js.map +1 -1
- package/src/lib/server/crm-record-indexes.d.ts +45 -0
- package/src/lib/server/crm-record-indexes.js +78 -0
- package/src/lib/server/crm-record-indexes.js.map +1 -0
- package/src/lib/server/crm-sharing.d.ts +9 -1
- package/src/lib/server/crm-sharing.js +23 -3
- package/src/lib/server/crm-sharing.js.map +1 -1
- package/src/lib/server/deal-contact-roles.d.ts +27 -0
- package/src/lib/server/deal-contact-roles.js +89 -0
- package/src/lib/server/deal-contact-roles.js.map +1 -0
- package/src/lib/server/lead-convert.d.ts +5 -0
- package/src/lib/server/lead-convert.js +19 -3
- package/src/lib/server/lead-convert.js.map +1 -1
- package/src/lib/server/lead-create.d.ts +17 -2
- package/src/lib/server/lead-create.js +46 -14
- package/src/lib/server/lead-create.js.map +1 -1
- package/src/lib/server/lead-nurturing.d.ts +6 -0
- package/src/lib/server/lead-nurturing.js +57 -20
- package/src/lib/server/lead-nurturing.js.map +1 -1
- package/src/lib/server/lead-picklists.d.ts +35 -0
- package/src/lib/server/lead-picklists.js +52 -0
- package/src/lib/server/lead-picklists.js.map +1 -0
- package/src/lib/server/lead-source-picklist.d.ts +1 -13
- package/src/lib/server/lead-source-picklist.js +6 -33
- package/src/lib/server/lead-source-picklist.js.map +1 -1
- package/src/lib/server/merge-contacts.js +22 -4
- package/src/lib/server/merge-contacts.js.map +1 -1
- package/src/lib/server/person-eraser.d.ts +53 -0
- package/src/lib/server/person-eraser.js +149 -0
- package/src/lib/server/person-eraser.js.map +1 -0
- package/src/lib/server/person-records.d.ts +69 -0
- package/src/lib/server/person-records.js +317 -0
- package/src/lib/server/person-records.js.map +1 -0
- package/src/lib/server/person-refund.d.ts +97 -0
- package/src/lib/server/person-refund.js +221 -0
- package/src/lib/server/person-refund.js.map +1 -0
- package/src/lib/server/picklist-values.d.ts +21 -0
- package/src/lib/server/picklist-values.js +308 -0
- package/src/lib/server/picklist-values.js.map +1 -0
- package/src/lib/server/read-picklist.d.ts +44 -0
- package/src/lib/server/read-picklist.js +65 -0
- package/src/lib/server/read-picklist.js.map +1 -0
- package/src/lib/server/recipe-routes.js +15 -7
- package/src/lib/server/recipe-routes.js.map +1 -1
- package/src/lib/server/record-email-state.js +7 -1
- package/src/lib/server/record-email-state.js.map +1 -1
- package/src/lib/server/record-facts.d.ts +3 -0
- package/src/lib/server/record-facts.js +233 -31
- package/src/lib/server/record-facts.js.map +1 -1
- package/src/lib/server/record-origin.d.ts +27 -0
- package/src/lib/server/record-origin.js +104 -0
- package/src/lib/server/record-origin.js.map +1 -0
- package/src/lib/server/record-timeline.js +15 -2
- package/src/lib/server/record-timeline.js.map +1 -1
- package/src/lib/server/suite-gate.js +4 -3
- package/src/lib/server/suite-gate.js.map +1 -1
- package/src/lib/server/task-routes.js +30 -16
- package/src/lib/server/task-routes.js.map +1 -1
- package/src/lib/server-deal-stage.d.ts +5 -1
- package/src/lib/server-deal-stage.js +10 -5
- package/src/lib/server-deal-stage.js.map +1 -1
- package/src/lib/server.d.ts +8 -3
- package/src/lib/server.js +47 -43
- package/src/lib/server.js.map +1 -1
- package/src/lib/testing/memory-firestore.d.ts +55 -0
- package/src/lib/testing/memory-firestore.js +335 -0
- package/src/lib/testing/memory-firestore.js.map +1 -0
- package/src/lib/testing/stand-in-email-send-index.d.ts +25 -0
- package/src/lib/testing/stand-in-email-send-index.js +49 -0
- package/src/lib/testing/stand-in-email-send-index.js.map +1 -0
- package/src/lib/transfer/activities.d.ts +30 -0
- package/src/lib/transfer/activities.js +132 -0
- package/src/lib/transfer/activities.js.map +1 -0
- package/src/lib/transfer/aliases.d.ts +22 -0
- package/src/lib/transfer/aliases.js +1342 -0
- package/src/lib/transfer/aliases.js.map +1 -0
- package/src/lib/transfer/common.d.ts +222 -0
- package/src/lib/transfer/common.js +832 -0
- package/src/lib/transfer/common.js.map +1 -0
- package/src/lib/transfer/companies.d.ts +43 -0
- package/src/lib/transfer/companies.js +549 -0
- package/src/lib/transfer/companies.js.map +1 -0
- package/src/lib/transfer/contacts.d.ts +31 -0
- package/src/lib/transfer/contacts.js +727 -0
- package/src/lib/transfer/contacts.js.map +1 -0
- package/src/lib/transfer/deals.d.ts +66 -0
- package/src/lib/transfer/deals.js +698 -0
- package/src/lib/transfer/deals.js.map +1 -0
- package/src/lib/transfer/email-templates-package.d.ts +40 -0
- package/src/lib/transfer/email-templates-package.js +76 -0
- package/src/lib/transfer/email-templates-package.js.map +1 -0
- package/src/lib/transfer/email-templates-package.server.d.ts +32 -0
- package/src/lib/transfer/email-templates-package.server.js +176 -0
- package/src/lib/transfer/email-templates-package.server.js.map +1 -0
- package/src/lib/transfer/fields.d.ts +102 -0
- package/src/lib/transfer/fields.js +1755 -0
- package/src/lib/transfer/fields.js.map +1 -0
- package/src/lib/transfer/leads.d.ts +30 -0
- package/src/lib/transfer/leads.js +582 -0
- package/src/lib/transfer/leads.js.map +1 -0
- package/src/lib/transfer/pipelines.d.ts +21 -0
- package/src/lib/transfer/pipelines.js +172 -0
- package/src/lib/transfer/pipelines.js.map +1 -0
- package/src/lib/transfer/register.d.ts +47 -0
- package/src/lib/transfer/register.js +277 -0
- package/src/lib/transfer/register.js.map +1 -0
- package/src/lib/transfer/tasks.d.ts +30 -0
- package/src/lib/transfer/tasks.js +418 -0
- package/src/lib/transfer/tasks.js.map +1 -0
- package/src/lib/transfer/ui.d.ts +20 -0
- package/src/lib/transfer/ui.js +42 -0
- package/src/lib/transfer/ui.js.map +1 -0
- package/src/lib/components/company-import-drawer.d.ts +0 -42
- package/src/lib/components/company-import-drawer.js +0 -99
- package/src/lib/components/company-import-drawer.js.map +0 -1
- package/src/lib/components/contact-import-drawer.d.ts +0 -46
- package/src/lib/components/contact-import-drawer.js +0 -149
- package/src/lib/components/contact-import-drawer.js.map +0 -1
- package/src/lib/components/crm-export-all-button.d.ts +0 -39
- package/src/lib/components/crm-export-all-button.js +0 -98
- package/src/lib/components/crm-export-all-button.js.map +0 -1
- package/src/lib/components/csv-import-drawer.d.ts +0 -139
- package/src/lib/components/csv-import-drawer.js +0 -757
- package/src/lib/components/csv-import-drawer.js.map +0 -1
- package/src/lib/components/deal-import-drawer.d.ts +0 -24
- package/src/lib/components/deal-import-drawer.js +0 -83
- package/src/lib/components/deal-import-drawer.js.map +0 -1
- package/src/lib/components/lead-import-drawer.d.ts +0 -27
- package/src/lib/components/lead-import-drawer.js +0 -118
- package/src/lib/components/lead-import-drawer.js.map +0 -1
- package/src/lib/components/lead-source-values-card.d.ts +0 -27
- package/src/lib/components/lead-source-values-card.js.map +0 -1
- package/src/lib/components/task-import-drawer.d.ts +0 -24
- package/src/lib/components/task-import-drawer.js +0 -82
- package/src/lib/components/task-import-drawer.js.map +0 -1
- package/src/lib/model/companies-csv.d.ts +0 -36
- package/src/lib/model/companies-csv.js +0 -38
- package/src/lib/model/companies-csv.js.map +0 -1
- package/src/lib/model/contacts-csv.d.ts +0 -54
- package/src/lib/model/contacts-csv.js +0 -67
- package/src/lib/model/contacts-csv.js.map +0 -1
- package/src/lib/model/crm-company-import.d.ts +0 -154
- package/src/lib/model/crm-company-import.js +0 -331
- package/src/lib/model/crm-company-import.js.map +0 -1
- package/src/lib/model/crm-csv.d.ts +0 -239
- package/src/lib/model/crm-csv.js +0 -467
- package/src/lib/model/crm-csv.js.map +0 -1
- package/src/lib/model/crm-deal-import.d.ts +0 -112
- package/src/lib/model/crm-deal-import.js +0 -263
- package/src/lib/model/crm-deal-import.js.map +0 -1
- package/src/lib/model/crm-import.d.ts +0 -250
- package/src/lib/model/crm-import.js +0 -467
- package/src/lib/model/crm-import.js.map +0 -1
- package/src/lib/model/crm-lead-import.d.ts +0 -138
- package/src/lib/model/crm-lead-import.js +0 -446
- package/src/lib/model/crm-lead-import.js.map +0 -1
- package/src/lib/model/crm-task-import.d.ts +0 -94
- package/src/lib/model/crm-task-import.js +0 -275
- package/src/lib/model/crm-task-import.js.map +0 -1
- package/src/lib/model/deals-csv.d.ts +0 -32
- package/src/lib/model/deals-csv.js +0 -36
- package/src/lib/model/deals-csv.js.map +0 -1
- package/src/lib/model/import-column-shapes.d.ts +0 -36
- package/src/lib/model/import-column-shapes.js +0 -76
- package/src/lib/model/import-column-shapes.js.map +0 -1
- package/src/lib/model/lead-source-values.d.ts +0 -82
- package/src/lib/model/lead-source-values.js +0 -149
- package/src/lib/model/lead-source-values.js.map +0 -1
- package/src/lib/model/leads-csv.d.ts +0 -40
- package/src/lib/model/leads-csv.js +0 -40
- package/src/lib/model/leads-csv.js.map +0 -1
- package/src/lib/model/tasks-csv.d.ts +0 -28
- package/src/lib/model/tasks-csv.js +0 -28
- package/src/lib/model/tasks-csv.js.map +0 -1
- package/src/lib/server/companies-import.d.ts +0 -57
- package/src/lib/server/companies-import.js +0 -242
- package/src/lib/server/companies-import.js.map +0 -1
- package/src/lib/server/contacts-import.d.ts +0 -109
- package/src/lib/server/contacts-import.js +0 -393
- package/src/lib/server/contacts-import.js.map +0 -1
- package/src/lib/server/deals-import.d.ts +0 -76
- package/src/lib/server/deals-import.js +0 -248
- package/src/lib/server/deals-import.js.map +0 -1
- package/src/lib/server/export-route.d.ts +0 -60
- package/src/lib/server/export-route.js +0 -447
- package/src/lib/server/export-route.js.map +0 -1
- package/src/lib/server/import-context.d.ts +0 -87
- package/src/lib/server/import-context.js +0 -182
- package/src/lib/server/import-context.js.map +0 -1
- package/src/lib/server/lead-source-values.d.ts +0 -50
- package/src/lib/server/lead-source-values.js +0 -191
- package/src/lib/server/lead-source-values.js.map +0 -1
- package/src/lib/server/leads-import.d.ts +0 -84
- package/src/lib/server/leads-import.js +0 -367
- package/src/lib/server/leads-import.js.map +0 -1
- package/src/lib/server/tasks-import.d.ts +0 -54
- package/src/lib/server/tasks-import.js +0 -160
- package/src/lib/server/tasks-import.js.map +0 -1
|
@@ -16,11 +16,12 @@
|
|
|
16
16
|
*/ 'use client';
|
|
17
17
|
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
18
18
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
19
|
-
import { CONTACT_LIFECYCLE_STAGE_LABELS, CONTACT_LIFECYCLE_STAGES,
|
|
19
|
+
import { CONTACT_LIFECYCLE_STAGE_LABELS, CONTACT_LIFECYCLE_STAGES, CRM_LEAD_SOURCE_PICKLIST, CRM_LEAD_STATUSES, STANDARD_CRM_LEAD_STATUS_PICKLIST, crmLeadStatusLabelFor, crmMemberPickerLabel, crmPicklistDefinition, crmPicklistOptions, groupPicklistOptions } from "@aglyn/aglyn";
|
|
20
20
|
import { hostIdsFromScope, ORG_SCOPE_TOKEN } from "@aglyn/aglyn/app-utils/scope-tokens";
|
|
21
|
-
import { Button, Checkbox, Drawer, FormControl, FormControlLabel, FormGroup, FormHelperText, FormLabel, MenuItem, Radio, RadioGroup, Stack, Switch, TextField, Typography } from "@mui/material";
|
|
22
|
-
import { useEffect, useState } from "react";
|
|
21
|
+
import { Button, Checkbox, Drawer, FormControl, FormControlLabel, FormGroup, FormHelperText, FormLabel, ListSubheader, MenuItem, Radio, RadioGroup, Stack, Switch, TextField, Typography } from "@mui/material";
|
|
22
|
+
import { useEffect, useMemo, useState } from "react";
|
|
23
23
|
import { CRM_SHARING_CRITERIA_FOR, CRM_SHARING_OBJECT_LABELS, CRM_SHARING_OBJECTS } from "../model/crm-sharing.js";
|
|
24
|
+
import { LEAD_SOURCE_DIRECTION_LABELS, LEAD_SOURCE_DIRECTIONS, STANDARD_LEAD_SOURCES } from "../model/lead-source-direction.js";
|
|
24
25
|
const splitList = (text)=>[
|
|
25
26
|
...new Set(text.split(',').map((entry)=>entry.trim()).filter(Boolean))
|
|
26
27
|
].slice(0, 20);
|
|
@@ -29,12 +30,15 @@ const splitList = (text)=>[
|
|
|
29
30
|
* sites that captured them, optional criteria), SHARED WITH (sites, or all
|
|
30
31
|
* sites), and ACCESS (read-only unless edit is chosen).
|
|
31
32
|
*/ export function SharingRuleDrawer(props) {
|
|
33
|
+
var _props_leadSourceList;
|
|
32
34
|
const { open, onClose, rule, sites, members, campaigns, busy, onSubmit } = props;
|
|
35
|
+
const leadSourceList = (_props_leadSourceList = props.leadSourceList) != null ? _props_leadSourceList : STANDARD_LEAD_SOURCES;
|
|
33
36
|
const [name, setName] = useState('');
|
|
34
37
|
const [object, setObject] = useState('leads');
|
|
35
38
|
const [enabled, setEnabled] = useState(true);
|
|
36
39
|
const [sourceHostIds, setSourceHostIds] = useState([]);
|
|
37
|
-
const [leadSources, setLeadSources] = useState(
|
|
40
|
+
const [leadSources, setLeadSources] = useState([]);
|
|
41
|
+
const [leadSourceGroups, setLeadSourceGroups] = useState([]);
|
|
38
42
|
const [tags, setTags] = useState('');
|
|
39
43
|
const [stages, setStages] = useState([]);
|
|
40
44
|
const [ownerUids, setOwnerUids] = useState([]);
|
|
@@ -43,38 +47,80 @@ const splitList = (text)=>[
|
|
|
43
47
|
const [targets, setTargets] = useState([]);
|
|
44
48
|
const [access, setAccess] = useState('read');
|
|
45
49
|
useEffect(()=>{
|
|
46
|
-
var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9;
|
|
50
|
+
var _ref, _ref1, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8, _ref9, _ref10;
|
|
47
51
|
if (!open) return;
|
|
48
52
|
setName((_ref = rule == null ? void 0 : rule.name) != null ? _ref : '');
|
|
49
53
|
setObject((_ref1 = rule == null ? void 0 : rule.object) != null ? _ref1 : 'leads');
|
|
50
54
|
setEnabled((_ref2 = rule == null ? void 0 : rule.enabled) != null ? _ref2 : true);
|
|
51
55
|
setSourceHostIds((_ref3 = rule == null ? void 0 : rule.sourceHostIds) != null ? _ref3 : []);
|
|
52
|
-
setLeadSources((
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
56
|
+
setLeadSources((_ref4 = rule == null ? void 0 : rule.criteria.leadSources) != null ? _ref4 : []);
|
|
57
|
+
setLeadSourceGroups((_ref5 = rule == null ? void 0 : rule.criteria.leadSourceGroups) != null ? _ref5 : []);
|
|
58
|
+
setTags(((_ref6 = rule == null ? void 0 : rule.criteria.tags) != null ? _ref6 : []).join(', '));
|
|
59
|
+
setStages((_ref7 = rule == null ? void 0 : rule.criteria.stages) != null ? _ref7 : []);
|
|
60
|
+
setOwnerUids((_ref8 = rule == null ? void 0 : rule.criteria.ownerUids) != null ? _ref8 : []);
|
|
61
|
+
setCampaignIds((_ref9 = rule == null ? void 0 : rule.criteria.campaignIds) != null ? _ref9 : []);
|
|
57
62
|
setAllSites(rule ? rule.targets.includes(ORG_SCOPE_TOKEN) : true);
|
|
58
63
|
setTargets(rule ? hostIdsFromScope(rule.targets) : []);
|
|
59
|
-
setAccess((
|
|
64
|
+
setAccess((_ref10 = rule == null ? void 0 : rule.access) != null ? _ref10 : 'read');
|
|
60
65
|
}, [
|
|
61
66
|
open,
|
|
62
67
|
rule
|
|
63
68
|
]);
|
|
64
69
|
const offers = CRM_SHARING_CRITERIA_FOR[object];
|
|
65
|
-
const stageOptions = object === 'leads' ? CRM_LEAD_STATUSES.map((value)=>
|
|
70
|
+
const stageOptions = object === 'leads' ? CRM_LEAD_STATUSES.map((value)=>{
|
|
71
|
+
var _props_leadStatusList;
|
|
72
|
+
return {
|
|
66
73
|
value,
|
|
67
|
-
label:
|
|
68
|
-
}
|
|
74
|
+
label: crmLeadStatusLabelFor((_props_leadStatusList = props.leadStatusList) != null ? _props_leadStatusList : STANDARD_CRM_LEAD_STATUS_PICKLIST, value)
|
|
75
|
+
};
|
|
76
|
+
}) : object === 'contacts' ? CONTACT_LIFECYCLE_STAGES.map((value)=>({
|
|
69
77
|
value,
|
|
70
78
|
label: CONTACT_LIFECYCLE_STAGE_LABELS[value]
|
|
71
79
|
})) : [];
|
|
72
80
|
const canSubmit = !busy && name.trim().length > 0 && (allSites || targets.length > 0);
|
|
81
|
+
/*
|
|
82
|
+
* The org's lead source values under their groups (AGL-3511), and every
|
|
83
|
+
* value the rule already names that the list no longer offers, so an
|
|
84
|
+
* edit shows what the rule matches until somebody changes it.
|
|
85
|
+
*/ const leadSourceItems = useMemo(()=>{
|
|
86
|
+
var _ref;
|
|
87
|
+
var _crmPicklistDefinition;
|
|
88
|
+
const options = crmPicklistOptions(leadSourceList);
|
|
89
|
+
for (const label of leadSources){
|
|
90
|
+
if (!options.some((option)=>option.label.toLowerCase() === label.toLowerCase())) {
|
|
91
|
+
options.push({
|
|
92
|
+
label,
|
|
93
|
+
inactive: false,
|
|
94
|
+
unlisted: true
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const groups = (_ref = (_crmPicklistDefinition = crmPicklistDefinition(CRM_LEAD_SOURCE_PICKLIST)) == null ? void 0 : _crmPicklistDefinition.groups) != null ? _ref : [];
|
|
99
|
+
return groupPicklistOptions(options, groups).flatMap((section)=>{
|
|
100
|
+
var _ref, _ref1;
|
|
101
|
+
var _section_group, _section_group1;
|
|
102
|
+
return [
|
|
103
|
+
/*#__PURE__*/ _jsx(ListSubheader, {
|
|
104
|
+
children: (_ref = (_section_group = section.group) == null ? void 0 : _section_group.label) != null ? _ref : 'No group'
|
|
105
|
+
}, `group:${(_ref1 = (_section_group1 = section.group) == null ? void 0 : _section_group1.id) != null ? _ref1 : ''}`),
|
|
106
|
+
...section.options.map((option)=>/*#__PURE__*/ _jsx(MenuItem, {
|
|
107
|
+
value: option.label,
|
|
108
|
+
children: option.unlisted ? `${option.label} (not in the list)` : option.label
|
|
109
|
+
}, option.label))
|
|
110
|
+
];
|
|
111
|
+
});
|
|
112
|
+
}, [
|
|
113
|
+
leadSourceList,
|
|
114
|
+
leadSources
|
|
115
|
+
]);
|
|
73
116
|
const submit = ()=>{
|
|
74
117
|
if (!canSubmit) return;
|
|
75
118
|
const criteria = {};
|
|
76
|
-
if (offers.includes('leadSources') &&
|
|
77
|
-
criteria.leadSources =
|
|
119
|
+
if (offers.includes('leadSources') && leadSources.length) {
|
|
120
|
+
criteria.leadSources = leadSources.slice(0, 20);
|
|
121
|
+
}
|
|
122
|
+
if (offers.includes('leadSourceGroups') && leadSourceGroups.length) {
|
|
123
|
+
criteria.leadSourceGroups = leadSourceGroups;
|
|
78
124
|
}
|
|
79
125
|
if (offers.includes('tags') && splitList(tags).length) {
|
|
80
126
|
criteria.tags = splitList(tags).map((tag)=>tag.toLowerCase());
|
|
@@ -180,12 +226,55 @@ const splitList = (text)=>[
|
|
|
180
226
|
}, site.id))
|
|
181
227
|
}),
|
|
182
228
|
offers.includes('leadSources') ? /*#__PURE__*/ _jsx(TextField, {
|
|
229
|
+
select: true,
|
|
183
230
|
size: "small",
|
|
184
231
|
label: "Lead source",
|
|
185
232
|
value: leadSources,
|
|
186
|
-
onChange: (event)=>
|
|
187
|
-
|
|
188
|
-
|
|
233
|
+
onChange: (event)=>{
|
|
234
|
+
const value = event.target.value;
|
|
235
|
+
setLeadSources(Array.isArray(value) ? value : String(value).split(','));
|
|
236
|
+
},
|
|
237
|
+
slotProps: {
|
|
238
|
+
select: {
|
|
239
|
+
multiple: true,
|
|
240
|
+
displayEmpty: true,
|
|
241
|
+
renderValue: (value)=>value.length ? value.join(', ') : 'Any'
|
|
242
|
+
},
|
|
243
|
+
inputLabel: {
|
|
244
|
+
shrink: true
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
fullWidth: true,
|
|
248
|
+
children: leadSourceItems
|
|
249
|
+
}) : null,
|
|
250
|
+
offers.includes('leadSourceGroups') ? /*#__PURE__*/ _jsx(TextField, {
|
|
251
|
+
select: true,
|
|
252
|
+
size: "small",
|
|
253
|
+
label: "Lead source direction",
|
|
254
|
+
value: leadSourceGroups,
|
|
255
|
+
onChange: (event)=>{
|
|
256
|
+
const value = event.target.value;
|
|
257
|
+
setLeadSourceGroups(Array.isArray(value) ? value : String(value).split(','));
|
|
258
|
+
},
|
|
259
|
+
slotProps: {
|
|
260
|
+
select: {
|
|
261
|
+
multiple: true,
|
|
262
|
+
displayEmpty: true,
|
|
263
|
+
renderValue: (value)=>value.length ? value.map((id)=>{
|
|
264
|
+
var _LEAD_SOURCE_DIRECTION_LABELS_id;
|
|
265
|
+
return (_LEAD_SOURCE_DIRECTION_LABELS_id = LEAD_SOURCE_DIRECTION_LABELS[id]) != null ? _LEAD_SOURCE_DIRECTION_LABELS_id : id;
|
|
266
|
+
}).join(', ') : 'Any'
|
|
267
|
+
},
|
|
268
|
+
inputLabel: {
|
|
269
|
+
shrink: true
|
|
270
|
+
}
|
|
271
|
+
},
|
|
272
|
+
helperText: "Matched through each lead source's group on the Fields page, as it stands when the rule runs.",
|
|
273
|
+
fullWidth: true,
|
|
274
|
+
children: LEAD_SOURCE_DIRECTIONS.map((direction)=>/*#__PURE__*/ _jsx(MenuItem, {
|
|
275
|
+
value: direction,
|
|
276
|
+
children: LEAD_SOURCE_DIRECTION_LABELS[direction]
|
|
277
|
+
}, direction))
|
|
189
278
|
}) : null,
|
|
190
279
|
offers.includes('tags') ? /*#__PURE__*/ _jsx(TextField, {
|
|
191
280
|
size: "small",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/sharing-rule-drawer.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n CONTACT_LIFECYCLE_STAGE_LABELS,\n CONTACT_LIFECYCLE_STAGES,\n CRM_LEAD_STATUS_LABELS,\n CRM_LEAD_STATUSES,\n crmMemberPickerLabel,\n} from '@aglyn/aglyn'\nimport { hostIdsFromScope, ORG_SCOPE_TOKEN } from '@aglyn/aglyn/app-utils/scope-tokens'\nimport {\n Button,\n Checkbox,\n Drawer,\n FormControl,\n FormControlLabel,\n FormGroup,\n FormHelperText,\n FormLabel,\n MenuItem,\n Radio,\n RadioGroup,\n Stack,\n Switch,\n TextField,\n Typography,\n} from '@mui/material'\nimport { useEffect, useState } from 'react'\nimport type { OrgMemberOption } from '../hooks/use-org-member-directory'\nimport {\n CRM_SHARING_CRITERIA_FOR,\n CRM_SHARING_OBJECT_LABELS,\n CRM_SHARING_OBJECTS,\n type CrmShareAccess,\n type CrmSharingCriteria,\n type CrmSharingObject,\n type CrmSharingRule,\n type CrmSharingSite,\n} from '../model/crm-sharing'\n\n/** What the drawer hands back: the rule as `crm/sharing` `rule-save` reads it. */\nexport interface SharingRuleDraft {\n id?: string\n name: string\n object: CrmSharingObject\n enabled: boolean\n sourceHostIds: string[]\n criteria: CrmSharingCriteria\n targets: 'all' | string[]\n access: CrmShareAccess\n}\n\nexport interface SharingRuleDrawerProps {\n open: boolean\n onClose: () => void\n /** The rule being edited, or `null` for a new one. */\n rule: CrmSharingRule | null\n sites: readonly CrmSharingSite[]\n members: readonly OrgMemberOption[]\n campaigns: readonly { value: string; label: string }[]\n busy: boolean\n onSubmit: (draft: SharingRuleDraft) => void\n}\n\nconst splitList = (text: string) =>\n [...new Set(text.split(',').map((entry) => entry.trim()).filter(Boolean))].slice(0, 20)\n\n/**\n * A sharing rule, three parts (AGL-3336): WHICH RECORDS (an object, the\n * sites that captured them, optional criteria), SHARED WITH (sites, or all\n * sites), and ACCESS (read-only unless edit is chosen).\n */\nexport function SharingRuleDrawer(props: SharingRuleDrawerProps) {\n const { open, onClose, rule, sites, members, campaigns, busy, onSubmit } = props\n const [name, setName] = useState('')\n const [object, setObject] = useState<CrmSharingObject>('leads')\n const [enabled, setEnabled] = useState(true)\n const [sourceHostIds, setSourceHostIds] = useState<string[]>([])\n const [leadSources, setLeadSources] = useState('')\n const [tags, setTags] = useState('')\n const [stages, setStages] = useState<string[]>([])\n const [ownerUids, setOwnerUids] = useState<string[]>([])\n const [campaignIds, setCampaignIds] = useState<string[]>([])\n const [allSites, setAllSites] = useState(true)\n const [targets, setTargets] = useState<string[]>([])\n const [access, setAccess] = useState<CrmShareAccess>('read')\n\n useEffect(() => {\n if (!open) return\n setName(rule?.name ?? '')\n setObject(rule?.object ?? 'leads')\n setEnabled(rule?.enabled ?? true)\n setSourceHostIds(rule?.sourceHostIds ?? [])\n setLeadSources((rule?.criteria.leadSources ?? []).join(', '))\n setTags((rule?.criteria.tags ?? []).join(', '))\n setStages(rule?.criteria.stages ?? [])\n setOwnerUids(rule?.criteria.ownerUids ?? [])\n setCampaignIds(rule?.criteria.campaignIds ?? [])\n setAllSites(rule ? rule.targets.includes(ORG_SCOPE_TOKEN) : true)\n setTargets(rule ? hostIdsFromScope(rule.targets) : [])\n setAccess(rule?.access ?? 'read')\n }, [open, rule])\n\n const offers = CRM_SHARING_CRITERIA_FOR[object]\n const stageOptions: { value: string; label: string }[] =\n object === 'leads'\n ? CRM_LEAD_STATUSES.map((value) => ({ value, label: CRM_LEAD_STATUS_LABELS[value] }))\n : object === 'contacts'\n ? CONTACT_LIFECYCLE_STAGES.map((value) => ({\n value,\n label: CONTACT_LIFECYCLE_STAGE_LABELS[value],\n }))\n : []\n const canSubmit =\n !busy && name.trim().length > 0 && (allSites || targets.length > 0)\n\n const submit = () => {\n if (!canSubmit) return\n const criteria: CrmSharingCriteria = {}\n if (offers.includes('leadSources') && splitList(leadSources).length) {\n criteria.leadSources = splitList(leadSources)\n }\n if (offers.includes('tags') && splitList(tags).length) {\n criteria.tags = splitList(tags).map((tag) => tag.toLowerCase())\n }\n if (stageOptions.length && stages.length) criteria.stages = stages\n if (offers.includes('ownerUids') && ownerUids.length) criteria.ownerUids = ownerUids\n if (offers.includes('campaignIds') && campaignIds.length) criteria.campaignIds = campaignIds\n onSubmit({\n ...(rule ? { id: rule.id } : {}),\n name: name.trim(),\n object,\n enabled,\n sourceHostIds,\n criteria,\n targets: allSites ? 'all' : targets,\n access,\n })\n }\n\n const siteName = (id: string) => sites.find((site) => site.id === id)?.name ?? id\n return (\n <Drawer anchor=\"right\" open={open} onClose={busy ? undefined : onClose}>\n <Stack spacing={2} sx={{ width: 400, maxWidth: '100vw', p: 3 }}>\n <Typography variant=\"h6\">{rule ? 'Edit sharing rule' : 'New sharing rule'}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Shares every record the rule matches — the ones you already have, and every one ' +\n 'captured or changed from now on. Sharing lets a site see and work a record; it ' +\n 'never shares the person’s consent.'}\n </Typography>\n <TextField\n size=\"small\"\n label=\"Name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n slotProps={{ htmlInput: { maxLength: 120 } }}\n required\n fullWidth\n />\n <FormLabel>{'Which records'}</FormLabel>\n <TextField\n select\n size=\"small\"\n label=\"Records\"\n value={object}\n onChange={(event) => {\n setObject(event.target.value as CrmSharingObject)\n setStages([])\n }}\n disabled={Boolean(rule)}\n helperText={rule ? 'A rule keeps the kind of record it was made for.' : undefined}\n fullWidth\n >\n {CRM_SHARING_OBJECTS.map((option) => (\n <MenuItem key={option} value={option}>\n {CRM_SHARING_OBJECT_LABELS[option].many}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n select\n size=\"small\"\n label=\"Captured on\"\n value={sourceHostIds}\n onChange={(event) => {\n const value = event.target.value as unknown\n setSourceHostIds(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length ? (value as string[]).map(siteName).join(', ') : 'Any site',\n },\n inputLabel: { shrink: true },\n }}\n helperText=\"The sites the record was captured or created on.\"\n fullWidth\n >\n {sites.map((site) => (\n <MenuItem key={site.id} value={site.id}>\n {site.name}\n </MenuItem>\n ))}\n </TextField>\n {offers.includes('leadSources') ? (\n <TextField\n size=\"small\"\n label=\"Lead source\"\n value={leadSources}\n onChange={(event) => setLeadSources(event.target.value)}\n helperText=\"Any of these, separated by commas. Blank for any source.\"\n fullWidth\n />\n ) : null}\n {offers.includes('tags') ? (\n <TextField\n size=\"small\"\n label=\"Tags\"\n value={tags}\n onChange={(event) => setTags(event.target.value)}\n helperText=\"Any of these, separated by commas. Blank for any tags.\"\n fullWidth\n />\n ) : null}\n {stageOptions.length ? (\n <TextField\n select\n size=\"small\"\n label={object === 'leads' ? 'Status' : 'Lifecycle stage'}\n value={stages}\n onChange={(event) => {\n const value = event.target.value as unknown\n setStages(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((id) => stageOptions.find((option) => option.value === id)?.label ?? id)\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {stageOptions.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {offers.includes('campaignIds') && campaigns.length ? (\n <TextField\n select\n size=\"small\"\n label=\"Campaign\"\n value={campaignIds}\n onChange={(event) => {\n const value = event.target.value as unknown\n setCampaignIds(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((id) => campaigns.find((option) => option.value === id)?.label ?? id)\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {campaigns.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n <TextField\n select\n size=\"small\"\n label=\"Owner\"\n value={ownerUids}\n onChange={(event) => {\n const value = event.target.value as unknown\n setOwnerUids(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((uid) => {\n const member = members.find((entry) => entry.uid === uid)\n return member ? crmMemberPickerLabel(member) : uid\n })\n .join(', ')\n : 'Anyone',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {members.map((member) => (\n <MenuItem key={member.uid} value={member.uid}>\n {crmMemberPickerLabel(member)}\n </MenuItem>\n ))}\n </TextField>\n <FormControl>\n <FormLabel>{'Shared with'}</FormLabel>\n <FormGroup>\n <FormControlLabel\n control={\n <Checkbox checked={allSites} onChange={(event) => setAllSites(event.target.checked)} />\n }\n label=\"All sites, including sites added later\"\n />\n {sites.map((site) => (\n <FormControlLabel\n key={site.id}\n control={\n <Checkbox\n checked={allSites || targets.includes(site.id)}\n disabled={allSites}\n onChange={(event) =>\n setTargets((current) =>\n event.target.checked\n ? [...current, site.id]\n : current.filter((id) => id !== site.id),\n )\n }\n />\n }\n label={site.name}\n />\n ))}\n </FormGroup>\n </FormControl>\n <FormControl>\n <FormLabel>{'Access'}</FormLabel>\n <RadioGroup\n value={access}\n onChange={(event) => setAccess(event.target.value === 'edit' ? 'edit' : 'read')}\n >\n <FormControlLabel value=\"read\" control={<Radio size=\"small\" />} label=\"Read-only\" />\n <FormControlLabel value=\"edit\" control={<Radio size=\"small\" />} label=\"Read and edit\" />\n </RadioGroup>\n </FormControl>\n <FormControlLabel\n control={<Switch checked={enabled} onChange={(event) => setEnabled(event.target.checked)} />}\n label=\"On\"\n />\n {!enabled ? (\n <FormHelperText>{'Off keeps the rule and takes away what it shared.'}</FormHelperText>\n ) : null}\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"contained\" disabled={!canSubmit} onClick={submit}>\n {rule ? 'Save rule' : 'Add rule'}\n </Button>\n <Button onClick={onClose} disabled={busy}>\n {'Cancel'}\n </Button>\n </Stack>\n </Stack>\n </Drawer>\n )\n}\nSharingRuleDrawer.displayName = 'SharingRuleDrawer'\n\nexport default SharingRuleDrawer\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","CONTACT_LIFECYCLE_STAGES","CRM_LEAD_STATUS_LABELS","CRM_LEAD_STATUSES","crmMemberPickerLabel","hostIdsFromScope","ORG_SCOPE_TOKEN","Button","Checkbox","Drawer","FormControl","FormControlLabel","FormGroup","FormHelperText","FormLabel","MenuItem","Radio","RadioGroup","Stack","Switch","TextField","Typography","useEffect","useState","CRM_SHARING_CRITERIA_FOR","CRM_SHARING_OBJECT_LABELS","CRM_SHARING_OBJECTS","splitList","text","Set","split","map","entry","trim","filter","Boolean","slice","SharingRuleDrawer","props","open","onClose","rule","sites","members","campaigns","busy","onSubmit","name","setName","object","setObject","enabled","setEnabled","sourceHostIds","setSourceHostIds","leadSources","setLeadSources","tags","setTags","stages","setStages","ownerUids","setOwnerUids","campaignIds","setCampaignIds","allSites","setAllSites","targets","setTargets","access","setAccess","criteria","join","includes","offers","stageOptions","value","label","canSubmit","length","submit","tag","toLowerCase","id","siteName","find","site","anchor","undefined","spacing","sx","width","maxWidth","p","variant","color","size","onChange","event","target","slotProps","htmlInput","maxLength","required","fullWidth","select","disabled","helperText","option","many","Array","isArray","String","multiple","displayEmpty","renderValue","inputLabel","shrink","uid","member","control","checked","current","direction","onClick","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/sharing-rule-drawer.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n CONTACT_LIFECYCLE_STAGE_LABELS,\n CONTACT_LIFECYCLE_STAGES,\n CRM_LEAD_SOURCE_PICKLIST,\n CRM_LEAD_STATUSES,\n type CrmPicklist,\n STANDARD_CRM_LEAD_STATUS_PICKLIST,\n crmLeadStatusLabelFor,\n crmMemberPickerLabel,\n crmPicklistDefinition,\n crmPicklistOptions,\n groupPicklistOptions,\n} from '@aglyn/aglyn'\nimport { hostIdsFromScope, ORG_SCOPE_TOKEN } from '@aglyn/aglyn/app-utils/scope-tokens'\nimport {\n Button,\n Checkbox,\n Drawer,\n FormControl,\n FormControlLabel,\n FormGroup,\n FormHelperText,\n FormLabel,\n ListSubheader,\n MenuItem,\n Radio,\n RadioGroup,\n Stack,\n Switch,\n TextField,\n Typography,\n} from '@mui/material'\nimport { type ReactNode, useEffect, useMemo, useState } from 'react'\nimport type { OrgMemberOption } from '../hooks/use-org-member-directory'\nimport {\n CRM_SHARING_CRITERIA_FOR,\n CRM_SHARING_OBJECT_LABELS,\n CRM_SHARING_OBJECTS,\n type CrmShareAccess,\n type CrmSharingCriteria,\n type CrmSharingObject,\n type CrmSharingRule,\n type CrmSharingSite,\n} from '../model/crm-sharing'\nimport {\n LEAD_SOURCE_DIRECTION_LABELS,\n LEAD_SOURCE_DIRECTIONS,\n STANDARD_LEAD_SOURCES,\n} from '../model/lead-source-direction'\n\n/** What the drawer hands back: the rule as `crm/sharing` `rule-save` reads it. */\nexport interface SharingRuleDraft {\n id?: string\n name: string\n object: CrmSharingObject\n enabled: boolean\n sourceHostIds: string[]\n criteria: CrmSharingCriteria\n targets: 'all' | string[]\n access: CrmShareAccess\n}\n\nexport interface SharingRuleDrawerProps {\n open: boolean\n onClose: () => void\n /** The rule being edited, or `null` for a new one. */\n rule: CrmSharingRule | null\n sites: readonly CrmSharingSite[]\n members: readonly OrgMemberOption[]\n campaigns: readonly { value: string; label: string }[]\n /** The org's Lead source list, which the Lead source criterion picks from. */\n leadSourceList?: CrmPicklist\n /** The org's Lead status list, whose labels name the statuses a rule matches (AGL-3512). */\n leadStatusList?: CrmPicklist\n busy: boolean\n onSubmit: (draft: SharingRuleDraft) => void\n}\n\nconst splitList = (text: string) =>\n [...new Set(text.split(',').map((entry) => entry.trim()).filter(Boolean))].slice(0, 20)\n\n/**\n * A sharing rule, three parts (AGL-3336): WHICH RECORDS (an object, the\n * sites that captured them, optional criteria), SHARED WITH (sites, or all\n * sites), and ACCESS (read-only unless edit is chosen).\n */\nexport function SharingRuleDrawer(props: SharingRuleDrawerProps) {\n const { open, onClose, rule, sites, members, campaigns, busy, onSubmit } = props\n const leadSourceList = props.leadSourceList ?? STANDARD_LEAD_SOURCES\n const [name, setName] = useState('')\n const [object, setObject] = useState<CrmSharingObject>('leads')\n const [enabled, setEnabled] = useState(true)\n const [sourceHostIds, setSourceHostIds] = useState<string[]>([])\n const [leadSources, setLeadSources] = useState<string[]>([])\n const [leadSourceGroups, setLeadSourceGroups] = useState<string[]>([])\n const [tags, setTags] = useState('')\n const [stages, setStages] = useState<string[]>([])\n const [ownerUids, setOwnerUids] = useState<string[]>([])\n const [campaignIds, setCampaignIds] = useState<string[]>([])\n const [allSites, setAllSites] = useState(true)\n const [targets, setTargets] = useState<string[]>([])\n const [access, setAccess] = useState<CrmShareAccess>('read')\n\n useEffect(() => {\n if (!open) return\n setName(rule?.name ?? '')\n setObject(rule?.object ?? 'leads')\n setEnabled(rule?.enabled ?? true)\n setSourceHostIds(rule?.sourceHostIds ?? [])\n setLeadSources(rule?.criteria.leadSources ?? [])\n setLeadSourceGroups(rule?.criteria.leadSourceGroups ?? [])\n setTags((rule?.criteria.tags ?? []).join(', '))\n setStages(rule?.criteria.stages ?? [])\n setOwnerUids(rule?.criteria.ownerUids ?? [])\n setCampaignIds(rule?.criteria.campaignIds ?? [])\n setAllSites(rule ? rule.targets.includes(ORG_SCOPE_TOKEN) : true)\n setTargets(rule ? hostIdsFromScope(rule.targets) : [])\n setAccess(rule?.access ?? 'read')\n }, [open, rule])\n\n const offers = CRM_SHARING_CRITERIA_FOR[object]\n const stageOptions: { value: string; label: string }[] =\n object === 'leads'\n ? // A rule matches the MEANING, named as the org names it.\n CRM_LEAD_STATUSES.map((value) => ({\n value,\n label: crmLeadStatusLabelFor(props.leadStatusList ?? STANDARD_CRM_LEAD_STATUS_PICKLIST, value),\n }))\n : object === 'contacts'\n ? CONTACT_LIFECYCLE_STAGES.map((value) => ({\n value,\n label: CONTACT_LIFECYCLE_STAGE_LABELS[value],\n }))\n : []\n const canSubmit =\n !busy && name.trim().length > 0 && (allSites || targets.length > 0)\n /*\n * The org's lead source values under their groups (AGL-3511), and every\n * value the rule already names that the list no longer offers, so an\n * edit shows what the rule matches until somebody changes it.\n */\n const leadSourceItems = useMemo<ReactNode[]>(() => {\n const options = crmPicklistOptions(leadSourceList)\n for (const label of leadSources) {\n if (!options.some((option) => option.label.toLowerCase() === label.toLowerCase())) {\n options.push({ label, inactive: false, unlisted: true })\n }\n }\n const groups = crmPicklistDefinition(CRM_LEAD_SOURCE_PICKLIST)?.groups ?? []\n return groupPicklistOptions(options, groups).flatMap((section) => [\n <ListSubheader key={`group:${section.group?.id ?? ''}`}>\n {section.group?.label ?? 'No group'}\n </ListSubheader>,\n ...section.options.map((option) => (\n <MenuItem key={option.label} value={option.label}>\n {option.unlisted ? `${option.label} (not in the list)` : option.label}\n </MenuItem>\n )),\n ])\n }, [leadSourceList, leadSources])\n\n const submit = () => {\n if (!canSubmit) return\n const criteria: CrmSharingCriteria = {}\n if (offers.includes('leadSources') && leadSources.length) {\n criteria.leadSources = leadSources.slice(0, 20)\n }\n if (offers.includes('leadSourceGroups') && leadSourceGroups.length) {\n criteria.leadSourceGroups = leadSourceGroups\n }\n if (offers.includes('tags') && splitList(tags).length) {\n criteria.tags = splitList(tags).map((tag) => tag.toLowerCase())\n }\n if (stageOptions.length && stages.length) criteria.stages = stages\n if (offers.includes('ownerUids') && ownerUids.length) criteria.ownerUids = ownerUids\n if (offers.includes('campaignIds') && campaignIds.length) criteria.campaignIds = campaignIds\n onSubmit({\n ...(rule ? { id: rule.id } : {}),\n name: name.trim(),\n object,\n enabled,\n sourceHostIds,\n criteria,\n targets: allSites ? 'all' : targets,\n access,\n })\n }\n\n const siteName = (id: string) => sites.find((site) => site.id === id)?.name ?? id\n return (\n <Drawer anchor=\"right\" open={open} onClose={busy ? undefined : onClose}>\n <Stack spacing={2} sx={{ width: 400, maxWidth: '100vw', p: 3 }}>\n <Typography variant=\"h6\">{rule ? 'Edit sharing rule' : 'New sharing rule'}</Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Shares every record the rule matches — the ones you already have, and every one ' +\n 'captured or changed from now on. Sharing lets a site see and work a record; it ' +\n 'never shares the person’s consent.'}\n </Typography>\n <TextField\n size=\"small\"\n label=\"Name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n slotProps={{ htmlInput: { maxLength: 120 } }}\n required\n fullWidth\n />\n <FormLabel>{'Which records'}</FormLabel>\n <TextField\n select\n size=\"small\"\n label=\"Records\"\n value={object}\n onChange={(event) => {\n setObject(event.target.value as CrmSharingObject)\n setStages([])\n }}\n disabled={Boolean(rule)}\n helperText={rule ? 'A rule keeps the kind of record it was made for.' : undefined}\n fullWidth\n >\n {CRM_SHARING_OBJECTS.map((option) => (\n <MenuItem key={option} value={option}>\n {CRM_SHARING_OBJECT_LABELS[option].many}\n </MenuItem>\n ))}\n </TextField>\n <TextField\n select\n size=\"small\"\n label=\"Captured on\"\n value={sourceHostIds}\n onChange={(event) => {\n const value = event.target.value as unknown\n setSourceHostIds(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length ? (value as string[]).map(siteName).join(', ') : 'Any site',\n },\n inputLabel: { shrink: true },\n }}\n helperText=\"The sites the record was captured or created on.\"\n fullWidth\n >\n {sites.map((site) => (\n <MenuItem key={site.id} value={site.id}>\n {site.name}\n </MenuItem>\n ))}\n </TextField>\n {offers.includes('leadSources') ? (\n <TextField\n select\n size=\"small\"\n label=\"Lead source\"\n value={leadSources}\n onChange={(event) => {\n const value = event.target.value as unknown\n setLeadSources(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length ? (value as string[]).join(', ') : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {leadSourceItems}\n </TextField>\n ) : null}\n {offers.includes('leadSourceGroups') ? (\n <TextField\n select\n size=\"small\"\n label=\"Lead source direction\"\n value={leadSourceGroups}\n onChange={(event) => {\n const value = event.target.value as unknown\n setLeadSourceGroups(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map(\n (id) =>\n LEAD_SOURCE_DIRECTION_LABELS[id as keyof typeof LEAD_SOURCE_DIRECTION_LABELS] ?? id,\n )\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n helperText=\"Matched through each lead source's group on the Fields page, as it stands when the rule runs.\"\n fullWidth\n >\n {LEAD_SOURCE_DIRECTIONS.map((direction) => (\n <MenuItem key={direction} value={direction}>\n {LEAD_SOURCE_DIRECTION_LABELS[direction]}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {offers.includes('tags') ? (\n <TextField\n size=\"small\"\n label=\"Tags\"\n value={tags}\n onChange={(event) => setTags(event.target.value)}\n helperText=\"Any of these, separated by commas. Blank for any tags.\"\n fullWidth\n />\n ) : null}\n {stageOptions.length ? (\n <TextField\n select\n size=\"small\"\n label={object === 'leads' ? 'Status' : 'Lifecycle stage'}\n value={stages}\n onChange={(event) => {\n const value = event.target.value as unknown\n setStages(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((id) => stageOptions.find((option) => option.value === id)?.label ?? id)\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {stageOptions.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n {offers.includes('campaignIds') && campaigns.length ? (\n <TextField\n select\n size=\"small\"\n label=\"Campaign\"\n value={campaignIds}\n onChange={(event) => {\n const value = event.target.value as unknown\n setCampaignIds(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((id) => campaigns.find((option) => option.value === id)?.label ?? id)\n .join(', ')\n : 'Any',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {campaigns.map((option) => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n ) : null}\n <TextField\n select\n size=\"small\"\n label=\"Owner\"\n value={ownerUids}\n onChange={(event) => {\n const value = event.target.value as unknown\n setOwnerUids(Array.isArray(value) ? (value as string[]) : String(value).split(','))\n }}\n slotProps={{\n select: {\n multiple: true,\n displayEmpty: true,\n renderValue: (value) =>\n (value as string[]).length\n ? (value as string[])\n .map((uid) => {\n const member = members.find((entry) => entry.uid === uid)\n return member ? crmMemberPickerLabel(member) : uid\n })\n .join(', ')\n : 'Anyone',\n },\n inputLabel: { shrink: true },\n }}\n fullWidth\n >\n {members.map((member) => (\n <MenuItem key={member.uid} value={member.uid}>\n {crmMemberPickerLabel(member)}\n </MenuItem>\n ))}\n </TextField>\n <FormControl>\n <FormLabel>{'Shared with'}</FormLabel>\n <FormGroup>\n <FormControlLabel\n control={\n <Checkbox checked={allSites} onChange={(event) => setAllSites(event.target.checked)} />\n }\n label=\"All sites, including sites added later\"\n />\n {sites.map((site) => (\n <FormControlLabel\n key={site.id}\n control={\n <Checkbox\n checked={allSites || targets.includes(site.id)}\n disabled={allSites}\n onChange={(event) =>\n setTargets((current) =>\n event.target.checked\n ? [...current, site.id]\n : current.filter((id) => id !== site.id),\n )\n }\n />\n }\n label={site.name}\n />\n ))}\n </FormGroup>\n </FormControl>\n <FormControl>\n <FormLabel>{'Access'}</FormLabel>\n <RadioGroup\n value={access}\n onChange={(event) => setAccess(event.target.value === 'edit' ? 'edit' : 'read')}\n >\n <FormControlLabel value=\"read\" control={<Radio size=\"small\" />} label=\"Read-only\" />\n <FormControlLabel value=\"edit\" control={<Radio size=\"small\" />} label=\"Read and edit\" />\n </RadioGroup>\n </FormControl>\n <FormControlLabel\n control={<Switch checked={enabled} onChange={(event) => setEnabled(event.target.checked)} />}\n label=\"On\"\n />\n {!enabled ? (\n <FormHelperText>{'Off keeps the rule and takes away what it shared.'}</FormHelperText>\n ) : null}\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"contained\" disabled={!canSubmit} onClick={submit}>\n {rule ? 'Save rule' : 'Add rule'}\n </Button>\n <Button onClick={onClose} disabled={busy}>\n {'Cancel'}\n </Button>\n </Stack>\n </Stack>\n </Drawer>\n )\n}\nSharingRuleDrawer.displayName = 'SharingRuleDrawer'\n\nexport default SharingRuleDrawer\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","CONTACT_LIFECYCLE_STAGES","CRM_LEAD_SOURCE_PICKLIST","CRM_LEAD_STATUSES","STANDARD_CRM_LEAD_STATUS_PICKLIST","crmLeadStatusLabelFor","crmMemberPickerLabel","crmPicklistDefinition","crmPicklistOptions","groupPicklistOptions","hostIdsFromScope","ORG_SCOPE_TOKEN","Button","Checkbox","Drawer","FormControl","FormControlLabel","FormGroup","FormHelperText","FormLabel","ListSubheader","MenuItem","Radio","RadioGroup","Stack","Switch","TextField","Typography","useEffect","useMemo","useState","CRM_SHARING_CRITERIA_FOR","CRM_SHARING_OBJECT_LABELS","CRM_SHARING_OBJECTS","LEAD_SOURCE_DIRECTION_LABELS","LEAD_SOURCE_DIRECTIONS","STANDARD_LEAD_SOURCES","splitList","text","Set","split","map","entry","trim","filter","Boolean","slice","SharingRuleDrawer","props","open","onClose","rule","sites","members","campaigns","busy","onSubmit","leadSourceList","name","setName","object","setObject","enabled","setEnabled","sourceHostIds","setSourceHostIds","leadSources","setLeadSources","leadSourceGroups","setLeadSourceGroups","tags","setTags","stages","setStages","ownerUids","setOwnerUids","campaignIds","setCampaignIds","allSites","setAllSites","targets","setTargets","access","setAccess","criteria","join","includes","offers","stageOptions","value","label","leadStatusList","canSubmit","length","leadSourceItems","options","some","option","toLowerCase","push","inactive","unlisted","groups","flatMap","section","group","id","submit","tag","siteName","find","site","anchor","undefined","spacing","sx","width","maxWidth","p","variant","color","size","onChange","event","target","slotProps","htmlInput","maxLength","required","fullWidth","select","disabled","helperText","many","Array","isArray","String","multiple","displayEmpty","renderValue","inputLabel","shrink","direction","uid","member","control","checked","current","onClick","displayName"],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/ 'use client';
|
|
17
17
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
18
|
-
import { CONTACT_LIFECYCLE_STAGE_LABELS,
|
|
18
|
+
import { CONTACT_LIFECYCLE_STAGE_LABELS, crmLeadStatusLabelFor, isCrmLeadStatus, pluginDocsHelp } from "@aglyn/aglyn";
|
|
19
19
|
import { mdiDeleteOutline, mdiPencilOutline, mdiRefresh } from "@aglyn/shared-data-mdi";
|
|
20
20
|
import { CardDisplay, MdiIcon } from "@aglyn/shared-ui-jsx";
|
|
21
21
|
import RowActionsMenu from "@aglyn/shared-ui-jsx/components/row-actions-menu.component";
|
|
@@ -26,6 +26,8 @@ import { Button, LinearProgress, Stack, TableBody, TableCell, TableHead, TableRo
|
|
|
26
26
|
import { useCallback, useState } from "react";
|
|
27
27
|
import { useCrmCampaigns } from "../hooks/use-crm-campaigns.js";
|
|
28
28
|
import { useCrmSharingRules, useCrmSharingSites } from "../hooks/use-crm-sharing.js";
|
|
29
|
+
import { useLeadSourcePicklist } from "../hooks/use-lead-source-picklist.js";
|
|
30
|
+
import { useLeadStatusPicklist } from "../hooks/use-lead-status-picklist.js";
|
|
29
31
|
import { useOrgMemberDirectory } from "../hooks/use-org-member-directory.js";
|
|
30
32
|
import { CRM_SHARING_RULES_MAX, describeShareTargets, describeSharingRuleScope } from "../model/crm-sharing.js";
|
|
31
33
|
import { callCrmSharing } from "../model/crm-sharing-api.js";
|
|
@@ -69,6 +71,10 @@ import { SharingRuleDrawer } from "./sharing-rule-drawer.js";
|
|
|
69
71
|
}, {
|
|
70
72
|
enabled: canManage
|
|
71
73
|
});
|
|
74
|
+
// The values the Lead source criterion picks from, under their groups (AGL-3511).
|
|
75
|
+
const leadSources = useLeadSourcePicklist(canManage ? orgId : null);
|
|
76
|
+
// The org's names for the lead statuses a rule matches (AGL-3512).
|
|
77
|
+
const leadStatuses = useLeadStatusPicklist(orgId);
|
|
72
78
|
const [editing, setEditing] = useState(null);
|
|
73
79
|
const [drawerOpen, setDrawerOpen] = useState(false);
|
|
74
80
|
const [busy, setBusy] = useState(false);
|
|
@@ -113,8 +119,8 @@ import { SharingRuleDrawer } from "./sharing-rule-drawer.js";
|
|
|
113
119
|
}, draft.id ? 'Rule saved' : 'Rule added');
|
|
114
120
|
const canEdit = ready && canManage && !busy;
|
|
115
121
|
const stageLabel = (id)=>{
|
|
116
|
-
var _ref,
|
|
117
|
-
return (_ref = (
|
|
122
|
+
var _ref, _ref1;
|
|
123
|
+
return (_ref = (_ref1 = isCrmLeadStatus(id) ? crmLeadStatusLabelFor(leadStatuses.picklist, id) : null) != null ? _ref1 : CONTACT_LIFECYCLE_STAGE_LABELS[id]) != null ? _ref : id;
|
|
118
124
|
};
|
|
119
125
|
return /*#__PURE__*/ _jsxs(CardDisplay, {
|
|
120
126
|
header: 'Sharing rules',
|
|
@@ -275,6 +281,8 @@ import { SharingRuleDrawer } from "./sharing-rule-drawer.js";
|
|
|
275
281
|
sites: sites.sites,
|
|
276
282
|
members: roster.members,
|
|
277
283
|
campaigns: campaigns.options,
|
|
284
|
+
leadSourceList: leadSources.picklist,
|
|
285
|
+
leadStatusList: leadStatuses.picklist,
|
|
278
286
|
busy: busy,
|
|
279
287
|
onSubmit: save
|
|
280
288
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/sharing-rules-card.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n CONTACT_LIFECYCLE_STAGE_LABELS,\n type ContactLifecycleStage,\n CRM_LEAD_STATUS_LABELS,\n type CrmLeadStatus,\n pluginDocsHelp,\n} from '@aglyn/aglyn'\nimport { mdiDeleteOutline, mdiPencilOutline, mdiRefresh } from '@aglyn/shared-data-mdi'\nimport { CardDisplay, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport RowActionsMenu from '@aglyn/shared-ui-jsx/components/row-actions-menu.component'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Button,\n LinearProgress,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { useCrmCampaigns } from '../hooks/use-crm-campaigns'\nimport { useCrmSharingRules, useCrmSharingSites } from '../hooks/use-crm-sharing'\nimport type { CrmOrgDoc } from '../hooks/use-crm-scope'\nimport { useOrgMemberDirectory } from '../hooks/use-org-member-directory'\nimport {\n CRM_SHARING_RULES_MAX,\n type CrmSharingAction,\n type CrmSharingRule,\n describeShareTargets,\n describeSharingRuleScope,\n} from '../model/crm-sharing'\nimport { callCrmSharing } from '../model/crm-sharing-api'\nimport { SharingRuleDrawer, type SharingRuleDraft } from './sharing-rule-drawer'\n\nexport interface SharingRulesCardProps {\n orgId: string | null\n org: CrmOrgDoc\n canManage: boolean\n ready: boolean\n}\n\n/** How far a rule's recompute has got, as the table shows it. */\nfunction runLabel(rule: CrmSharingRule): string {\n const run = rule.run\n if (rule.deleting) return 'Removing what it shared…'\n if (!run) return rule.enabled ? 'On' : 'Off'\n if (run.status === 'running') {\n return `${run.mode === 'remove' ? 'Removing' : 'Applying'} — ${run.processed} checked, ${run.changed} changed`\n }\n if (run.status === 'failed') return run.error ?? 'Stopped'\n return `${rule.enabled ? 'On' : 'Off'} — ${run.changed} ${run.changed === 1 ? 'record' : 'records'} changed`\n}\n\n/**\n * SHARING RULES — the organization's automated sharing (AGL-3336).\n *\n * A rule shares every record it matches with other sites: the existing ones\n * through a recompute that runs when the rule is saved, with its progress\n * on the row, and every later capture or change through the record-written\n * seam. The recompute runs in passes; the card keeps asking while the page\n * is open, and a rule whose run stopped offers Resume.\n *\n * Mounted at the organization level only: a rule is a fact about the org,\n * and its targets are the org's sites.\n */\nexport function SharingRulesCard(props: SharingRulesCardProps) {\n const { orgId, org, canManage, ready } = props\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const rules = useCrmSharingRules(org)\n const sites = useCrmSharingSites({ hostId: null, orgId, enabled: canManage })\n const roster = useOrgMemberDirectory(orgId)\n const campaigns = useCrmCampaigns({ hostId: null, orgId }, { enabled: canManage })\n const [editing, setEditing] = useState<CrmSharingRule | null>(null)\n const [drawerOpen, setDrawerOpen] = useState(false)\n const [busy, setBusy] = useState(false)\n const scope = orgId ? { orgId } : null\n\n /** One action, then `rule-continue` until the rule's run has nothing left. */\n const run = useCallback(\n async (action: CrmSharingAction, body: Record<string, unknown>, said: string) => {\n if (!scope) return\n setBusy(true)\n try {\n let answer = await callCrmSharing(user, scope, action, body)\n const ruleId = answer.rule?.id ?? String(body['ruleId'] ?? '')\n while (answer.more && ruleId) {\n answer = await callCrmSharing(user, scope, 'rule-continue', { ruleId })\n }\n enqueueSnackbar(said, { variant: 'success', persist: false })\n setDrawerOpen(false)\n } catch (error) {\n enqueueSnackbar((error as Error).message, { variant: 'error', allowDuplicate: true })\n } finally {\n setBusy(false)\n }\n },\n // `scope` is rebuilt from `orgId` every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [user, orgId, enqueueSnackbar],\n )\n\n const save = (draft: SharingRuleDraft) =>\n void run('rule-save', { rule: draft }, draft.id ? 'Rule saved' : 'Rule added')\n\n const canEdit = ready && canManage && !busy\n const stageLabel = (id: string) =>\n CRM_LEAD_STATUS_LABELS[id as CrmLeadStatus] ??\n CONTACT_LIFECYCLE_STAGE_LABELS[id as ContactLifecycleStage] ??\n id\n return (\n <CardDisplay\n header={'Sharing rules'}\n help={pluginDocsHelp('crmSharing', { anchor: '#sharing-rules' })}\n contentGutterX\n contentGutterY\n contentBordered=\"all\"\n HeaderProps={{\n action: (\n <Button\n variant=\"contained\"\n disabled={!canEdit || rules.length >= CRM_SHARING_RULES_MAX}\n onClick={() => {\n setEditing(null)\n setDrawerOpen(true)\n }}\n >\n {'Add rule'}\n </Button>\n ),\n }}\n >\n <Stack spacing={2}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Share leads, contacts, companies or deals captured on one site with other sites, ' +\n 'automatically. A rule applies to the records you have now and to every one captured ' +\n 'or changed later. Sharing is visibility only: a site never gains a person’s consent ' +\n 'through it.'}\n </Typography>\n {busy ? <LinearProgress /> : null}\n {rules.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No sharing rules. Every record is visible only to the sites that captured it.'}\n </Typography>\n ) : (\n <ScrollTable size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{'Rule'}</TableCell>\n <TableCell>{'Which records'}</TableCell>\n <TableCell>{'Shared with'}</TableCell>\n <TableCell>{'Status'}</TableCell>\n <TableCell align=\"right\" />\n </TableRow>\n </TableHead>\n <TableBody>\n {rules.map((rule) => (\n <TableRow key={rule.id} hover>\n <TableCell>\n <Typography variant=\"body2\">{rule.name}</Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {describeSharingRuleScope(rule, sites.siteName, {\n owner: roster.nameOf,\n stage: stageLabel,\n })}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {`${describeShareTargets(rule.targets, sites.siteName)}, ${\n rule.access === 'edit' ? 'read and edit' : 'read-only'\n }`}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {runLabel(rule)}\n </Typography>\n </TableCell>\n <TableCell align=\"right\" sx={{ width: 56 }}>\n <RowActionsMenu\n label={rule.name}\n items={[\n {\n key: 'edit',\n label: 'Edit rule',\n icon: <MdiIcon path={mdiPencilOutline.path} size={0.8} />,\n disabled: !canEdit || rule.deleting === true,\n onClick: () => {\n setEditing(rule)\n setDrawerOpen(true)\n },\n },\n ...(rule.run && rule.run.status !== 'done'\n ? [\n {\n key: 'resume',\n label: 'Resume',\n icon: <MdiIcon path={mdiRefresh.path} size={0.8} />,\n disabled: !canEdit,\n onClick: () =>\n void run('rule-continue', { ruleId: rule.id }, 'Rule applied'),\n },\n ]\n : []),\n {\n key: 'delete',\n label: 'Delete rule',\n icon: <MdiIcon path={mdiDeleteOutline.path} size={0.8} />,\n destructive: true,\n disabled: !canEdit,\n onClick: () =>\n void run('rule-delete', { ruleId: rule.id }, 'Rule deleted'),\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </ScrollTable>\n )}\n {ready && !canManage ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Only a workspace owner or admin can change sharing rules.'}\n </Typography>\n ) : null}\n </Stack>\n <SharingRuleDrawer\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n rule={editing}\n sites={sites.sites}\n members={roster.members}\n campaigns={campaigns.options}\n busy={busy}\n onSubmit={save}\n />\n </CardDisplay>\n )\n}\nSharingRulesCard.displayName = 'SharingRulesCard'\n\nexport default SharingRulesCard\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","CRM_LEAD_STATUS_LABELS","pluginDocsHelp","mdiDeleteOutline","mdiPencilOutline","mdiRefresh","CardDisplay","MdiIcon","RowActionsMenu","ScrollTable","useSnackbar","useUser","Button","LinearProgress","Stack","TableBody","TableCell","TableHead","TableRow","Typography","useCallback","useState","useCrmCampaigns","useCrmSharingRules","useCrmSharingSites","useOrgMemberDirectory","CRM_SHARING_RULES_MAX","describeShareTargets","describeSharingRuleScope","callCrmSharing","SharingRuleDrawer","runLabel","rule","run","deleting","enabled","status","mode","processed","changed","error","SharingRulesCard","props","orgId","org","canManage","ready","data","user","enqueueSnackbar","rules","sites","hostId","roster","campaigns","editing","setEditing","drawerOpen","setDrawerOpen","busy","setBusy","scope","action","body","said","answer","ruleId","id","String","more","variant","persist","message","allowDuplicate","save","draft","canEdit","stageLabel","header","help","anchor","contentGutterX","contentGutterY","contentBordered","HeaderProps","disabled","length","onClick","spacing","color","size","align","map","hover","name","siteName","owner","nameOf","stage","targets","access","sx","width","label","items","key","icon","path","destructive","open","onClose","members","options","onSubmit","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/sharing-rules-card.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n CONTACT_LIFECYCLE_STAGE_LABELS,\n type ContactLifecycleStage,\n crmLeadStatusLabelFor,\n isCrmLeadStatus,\n pluginDocsHelp,\n} from '@aglyn/aglyn'\nimport { mdiDeleteOutline, mdiPencilOutline, mdiRefresh } from '@aglyn/shared-data-mdi'\nimport { CardDisplay, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport RowActionsMenu from '@aglyn/shared-ui-jsx/components/row-actions-menu.component'\nimport { ScrollTable } from '@aglyn/shared-ui-jsx/components/scroll-table.component'\nimport { useSnackbar } from '@aglyn/shared-ui-snackstack'\nimport { useUser } from '@aglyn/tenant-feature-instance'\nimport {\n Button,\n LinearProgress,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n Typography,\n} from '@mui/material'\nimport { useCallback, useState } from 'react'\nimport { useCrmCampaigns } from '../hooks/use-crm-campaigns'\nimport { useCrmSharingRules, useCrmSharingSites } from '../hooks/use-crm-sharing'\nimport { useLeadSourcePicklist } from '../hooks/use-lead-source-picklist'\nimport { useLeadStatusPicklist } from '../hooks/use-lead-status-picklist'\nimport type { CrmOrgDoc } from '../hooks/use-crm-scope'\nimport { useOrgMemberDirectory } from '../hooks/use-org-member-directory'\nimport {\n CRM_SHARING_RULES_MAX,\n type CrmSharingAction,\n type CrmSharingRule,\n describeShareTargets,\n describeSharingRuleScope,\n} from '../model/crm-sharing'\nimport { callCrmSharing } from '../model/crm-sharing-api'\nimport { SharingRuleDrawer, type SharingRuleDraft } from './sharing-rule-drawer'\n\nexport interface SharingRulesCardProps {\n orgId: string | null\n org: CrmOrgDoc\n canManage: boolean\n ready: boolean\n}\n\n/** How far a rule's recompute has got, as the table shows it. */\nfunction runLabel(rule: CrmSharingRule): string {\n const run = rule.run\n if (rule.deleting) return 'Removing what it shared…'\n if (!run) return rule.enabled ? 'On' : 'Off'\n if (run.status === 'running') {\n return `${run.mode === 'remove' ? 'Removing' : 'Applying'} — ${run.processed} checked, ${run.changed} changed`\n }\n if (run.status === 'failed') return run.error ?? 'Stopped'\n return `${rule.enabled ? 'On' : 'Off'} — ${run.changed} ${run.changed === 1 ? 'record' : 'records'} changed`\n}\n\n/**\n * SHARING RULES — the organization's automated sharing (AGL-3336).\n *\n * A rule shares every record it matches with other sites: the existing ones\n * through a recompute that runs when the rule is saved, with its progress\n * on the row, and every later capture or change through the record-written\n * seam. The recompute runs in passes; the card keeps asking while the page\n * is open, and a rule whose run stopped offers Resume.\n *\n * Mounted at the organization level only: a rule is a fact about the org,\n * and its targets are the org's sites.\n */\nexport function SharingRulesCard(props: SharingRulesCardProps) {\n const { orgId, org, canManage, ready } = props\n const { data: user } = useUser()\n const { enqueueSnackbar } = useSnackbar()\n const rules = useCrmSharingRules(org)\n const sites = useCrmSharingSites({ hostId: null, orgId, enabled: canManage })\n const roster = useOrgMemberDirectory(orgId)\n const campaigns = useCrmCampaigns({ hostId: null, orgId }, { enabled: canManage })\n // The values the Lead source criterion picks from, under their groups (AGL-3511).\n const leadSources = useLeadSourcePicklist(canManage ? orgId : null)\n // The org's names for the lead statuses a rule matches (AGL-3512).\n const leadStatuses = useLeadStatusPicklist(orgId)\n const [editing, setEditing] = useState<CrmSharingRule | null>(null)\n const [drawerOpen, setDrawerOpen] = useState(false)\n const [busy, setBusy] = useState(false)\n const scope = orgId ? { orgId } : null\n\n /** One action, then `rule-continue` until the rule's run has nothing left. */\n const run = useCallback(\n async (action: CrmSharingAction, body: Record<string, unknown>, said: string) => {\n if (!scope) return\n setBusy(true)\n try {\n let answer = await callCrmSharing(user, scope, action, body)\n const ruleId = answer.rule?.id ?? String(body['ruleId'] ?? '')\n while (answer.more && ruleId) {\n answer = await callCrmSharing(user, scope, 'rule-continue', { ruleId })\n }\n enqueueSnackbar(said, { variant: 'success', persist: false })\n setDrawerOpen(false)\n } catch (error) {\n enqueueSnackbar((error as Error).message, { variant: 'error', allowDuplicate: true })\n } finally {\n setBusy(false)\n }\n },\n // `scope` is rebuilt from `orgId` every render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [user, orgId, enqueueSnackbar],\n )\n\n const save = (draft: SharingRuleDraft) =>\n void run('rule-save', { rule: draft }, draft.id ? 'Rule saved' : 'Rule added')\n\n const canEdit = ready && canManage && !busy\n const stageLabel = (id: string) =>\n (isCrmLeadStatus(id) ? crmLeadStatusLabelFor(leadStatuses.picklist, id) : null) ??\n CONTACT_LIFECYCLE_STAGE_LABELS[id as ContactLifecycleStage] ??\n id\n return (\n <CardDisplay\n header={'Sharing rules'}\n help={pluginDocsHelp('crmSharing', { anchor: '#sharing-rules' })}\n contentGutterX\n contentGutterY\n contentBordered=\"all\"\n HeaderProps={{\n action: (\n <Button\n variant=\"contained\"\n disabled={!canEdit || rules.length >= CRM_SHARING_RULES_MAX}\n onClick={() => {\n setEditing(null)\n setDrawerOpen(true)\n }}\n >\n {'Add rule'}\n </Button>\n ),\n }}\n >\n <Stack spacing={2}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'Share leads, contacts, companies or deals captured on one site with other sites, ' +\n 'automatically. A rule applies to the records you have now and to every one captured ' +\n 'or changed later. Sharing is visibility only: a site never gains a person’s consent ' +\n 'through it.'}\n </Typography>\n {busy ? <LinearProgress /> : null}\n {rules.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'No sharing rules. Every record is visible only to the sites that captured it.'}\n </Typography>\n ) : (\n <ScrollTable size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>{'Rule'}</TableCell>\n <TableCell>{'Which records'}</TableCell>\n <TableCell>{'Shared with'}</TableCell>\n <TableCell>{'Status'}</TableCell>\n <TableCell align=\"right\" />\n </TableRow>\n </TableHead>\n <TableBody>\n {rules.map((rule) => (\n <TableRow key={rule.id} hover>\n <TableCell>\n <Typography variant=\"body2\">{rule.name}</Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {describeSharingRuleScope(rule, sites.siteName, {\n owner: roster.nameOf,\n stage: stageLabel,\n })}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">\n {`${describeShareTargets(rule.targets, sites.siteName)}, ${\n rule.access === 'edit' ? 'read and edit' : 'read-only'\n }`}\n </Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {runLabel(rule)}\n </Typography>\n </TableCell>\n <TableCell align=\"right\" sx={{ width: 56 }}>\n <RowActionsMenu\n label={rule.name}\n items={[\n {\n key: 'edit',\n label: 'Edit rule',\n icon: <MdiIcon path={mdiPencilOutline.path} size={0.8} />,\n disabled: !canEdit || rule.deleting === true,\n onClick: () => {\n setEditing(rule)\n setDrawerOpen(true)\n },\n },\n ...(rule.run && rule.run.status !== 'done'\n ? [\n {\n key: 'resume',\n label: 'Resume',\n icon: <MdiIcon path={mdiRefresh.path} size={0.8} />,\n disabled: !canEdit,\n onClick: () =>\n void run('rule-continue', { ruleId: rule.id }, 'Rule applied'),\n },\n ]\n : []),\n {\n key: 'delete',\n label: 'Delete rule',\n icon: <MdiIcon path={mdiDeleteOutline.path} size={0.8} />,\n destructive: true,\n disabled: !canEdit,\n onClick: () =>\n void run('rule-delete', { ruleId: rule.id }, 'Rule deleted'),\n },\n ]}\n />\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </ScrollTable>\n )}\n {ready && !canManage ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {'Only a workspace owner or admin can change sharing rules.'}\n </Typography>\n ) : null}\n </Stack>\n <SharingRuleDrawer\n open={drawerOpen}\n onClose={() => setDrawerOpen(false)}\n rule={editing}\n sites={sites.sites}\n members={roster.members}\n campaigns={campaigns.options}\n leadSourceList={leadSources.picklist}\n leadStatusList={leadStatuses.picklist}\n busy={busy}\n onSubmit={save}\n />\n </CardDisplay>\n )\n}\nSharingRulesCard.displayName = 'SharingRulesCard'\n\nexport default SharingRulesCard\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","crmLeadStatusLabelFor","isCrmLeadStatus","pluginDocsHelp","mdiDeleteOutline","mdiPencilOutline","mdiRefresh","CardDisplay","MdiIcon","RowActionsMenu","ScrollTable","useSnackbar","useUser","Button","LinearProgress","Stack","TableBody","TableCell","TableHead","TableRow","Typography","useCallback","useState","useCrmCampaigns","useCrmSharingRules","useCrmSharingSites","useLeadSourcePicklist","useLeadStatusPicklist","useOrgMemberDirectory","CRM_SHARING_RULES_MAX","describeShareTargets","describeSharingRuleScope","callCrmSharing","SharingRuleDrawer","runLabel","rule","run","deleting","enabled","status","mode","processed","changed","error","SharingRulesCard","props","orgId","org","canManage","ready","data","user","enqueueSnackbar","rules","sites","hostId","roster","campaigns","leadSources","leadStatuses","editing","setEditing","drawerOpen","setDrawerOpen","busy","setBusy","scope","action","body","said","answer","ruleId","id","String","more","variant","persist","message","allowDuplicate","save","draft","canEdit","stageLabel","picklist","header","help","anchor","contentGutterX","contentGutterY","contentBordered","HeaderProps","disabled","length","onClick","spacing","color","size","align","map","hover","name","siteName","owner","nameOf","stage","targets","access","sx","width","label","items","key","icon","path","destructive","open","onClose","members","options","leadSourceList","leadStatusList","onSubmit","displayName"],"mappings":"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"}
|
|
@@ -8,8 +8,14 @@ import type { CrmRecordKind } from '../hooks/use-crm-record-names';
|
|
|
8
8
|
*/
|
|
9
9
|
export declare const TASK_KIND_ICONS: Record<CrmTaskKind, string>;
|
|
10
10
|
export declare const RECORD_KIND_ICONS: Record<CrmRecordKind, string>;
|
|
11
|
+
/**
|
|
12
|
+
* The task's type: the icon of its meaning and the org's label for it
|
|
13
|
+
* (AGL-3517) — `label`, from `crmTaskPicklistLabels`, or the built-in name
|
|
14
|
+
* of the kind where a surface has no list to hand.
|
|
15
|
+
*/
|
|
11
16
|
export declare function TaskKindCell(props: {
|
|
12
17
|
kind: CrmTaskKind;
|
|
18
|
+
label?: string;
|
|
13
19
|
iconOnly?: boolean;
|
|
14
20
|
}): import("react").JSX.Element;
|
|
15
21
|
export declare namespace TaskKindCell {
|
|
@@ -18,10 +24,12 @@ export declare namespace TaskKindCell {
|
|
|
18
24
|
/**
|
|
19
25
|
* Priority as a chip. Only `high` is colored: a column where every row
|
|
20
26
|
* carries a colored chip is a column nobody scans, and "normal" is the
|
|
21
|
-
* absence of a flag rather than a flag of its own.
|
|
27
|
+
* absence of a flag rather than a flag of its own. The color follows the
|
|
28
|
+
* MEANING; the text is the org's label for it when one is passed (AGL-3517).
|
|
22
29
|
*/
|
|
23
30
|
export declare function TaskPriorityChip(props: {
|
|
24
31
|
priority: CrmTaskPriority;
|
|
32
|
+
label?: string;
|
|
25
33
|
}): import("react").JSX.Element;
|
|
26
34
|
export declare namespace TaskPriorityChip {
|
|
27
35
|
var displayName: string;
|
|
@@ -34,10 +34,14 @@ export const RECORD_KIND_ICONS = {
|
|
|
34
34
|
company: mdiDomain.path,
|
|
35
35
|
deal: mdiHandshakeOutline.path
|
|
36
36
|
};
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* The task's type: the icon of its meaning and the org's label for it
|
|
39
|
+
* (AGL-3517) — `label`, from `crmTaskPicklistLabels`, or the built-in name
|
|
40
|
+
* of the kind where a surface has no list to hand.
|
|
41
|
+
*/ export function TaskKindCell(props) {
|
|
38
42
|
var _CRM_TASK_KIND_LABELS_kind, _TASK_KIND_ICONS_kind;
|
|
39
43
|
const { kind, iconOnly } = props;
|
|
40
|
-
const label = (_CRM_TASK_KIND_LABELS_kind = CRM_TASK_KIND_LABELS[kind]) != null ? _CRM_TASK_KIND_LABELS_kind : kind;
|
|
44
|
+
const label = props.label || ((_CRM_TASK_KIND_LABELS_kind = CRM_TASK_KIND_LABELS[kind]) != null ? _CRM_TASK_KIND_LABELS_kind : kind);
|
|
41
45
|
return /*#__PURE__*/ _jsxs(Stack, {
|
|
42
46
|
direction: "row",
|
|
43
47
|
spacing: 0.75,
|
|
@@ -62,13 +66,14 @@ TaskKindCell.displayName = 'TaskKindCell';
|
|
|
62
66
|
/**
|
|
63
67
|
* Priority as a chip. Only `high` is colored: a column where every row
|
|
64
68
|
* carries a colored chip is a column nobody scans, and "normal" is the
|
|
65
|
-
* absence of a flag rather than a flag of its own.
|
|
69
|
+
* absence of a flag rather than a flag of its own. The color follows the
|
|
70
|
+
* MEANING; the text is the org's label for it when one is passed (AGL-3517).
|
|
66
71
|
*/ export function TaskPriorityChip(props) {
|
|
67
72
|
var _CRM_TASK_PRIORITY_LABELS_priority;
|
|
68
73
|
const { priority } = props;
|
|
69
74
|
return /*#__PURE__*/ _jsx(Chip, {
|
|
70
75
|
size: "small",
|
|
71
|
-
label: (_CRM_TASK_PRIORITY_LABELS_priority = CRM_TASK_PRIORITY_LABELS[priority]) != null ? _CRM_TASK_PRIORITY_LABELS_priority : priority,
|
|
76
|
+
label: props.label || ((_CRM_TASK_PRIORITY_LABELS_priority = CRM_TASK_PRIORITY_LABELS[priority]) != null ? _CRM_TASK_PRIORITY_LABELS_priority : priority),
|
|
72
77
|
color: priority === 'high' ? 'error' : 'default',
|
|
73
78
|
variant: priority === 'normal' ? 'filled' : 'outlined'
|
|
74
79
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/task-cells.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport type { CrmTask, CrmTaskKind, CrmTaskPriority } from '@aglyn/aglyn'\nimport {\n mdiAccountGroupOutline,\n mdiAccountOutline,\n mdiCheckboxMarkedCircleOutline,\n mdiDomain,\n mdiEmailOutline,\n mdiHandshakeOutline,\n mdiPhoneOutline,\n} from '@aglyn/shared-data-mdi'\nimport { AppLink, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { Chip, Stack, Typography } from '@mui/material'\nimport type { CrmRoutes } from '../model/crm-routes'\nimport type { CrmRecordKind } from '../hooks/use-crm-record-names'\nimport {\n CRM_TASK_KIND_LABELS,\n CRM_TASK_PRIORITY_LABELS,\n describeTaskDue,\n TASK_DUE_COLORS,\n taskRecordLink,\n} from '../model/task-views'\n\n/**\n * The cells a task is drawn with, shared by the tasks section, the record\n * cards and the dashboard widget (AGL-2599) so a call reads as a call on\n * every surface and an overdue date is the same red everywhere.\n */\n\nexport const TASK_KIND_ICONS: Record<CrmTaskKind, string> = {\n call: mdiPhoneOutline.path,\n email: mdiEmailOutline.path,\n meeting: mdiAccountGroupOutline.path,\n todo: mdiCheckboxMarkedCircleOutline.path,\n}\n\nexport const RECORD_KIND_ICONS: Record<CrmRecordKind, string> = {\n contact: mdiAccountOutline.path,\n company: mdiDomain.path,\n deal: mdiHandshakeOutline.path,\n}\n\nexport function TaskKindCell(props: { kind: CrmTaskKind; iconOnly?: boolean }) {\n const { kind, iconOnly } = props\n const label = CRM_TASK_KIND_LABELS[kind] ?? kind\n return (\n <Stack\n direction=\"row\"\n spacing={0.75}\n sx={{ alignItems: 'center', color: 'text.secondary' }}\n title={iconOnly ? label : undefined}\n >\n <MdiIcon path={TASK_KIND_ICONS[kind] ?? TASK_KIND_ICONS.todo} fontSize=\"small\" />\n {iconOnly ? null : <Typography variant=\"body2\">{label}</Typography>}\n </Stack>\n )\n}\nTaskKindCell.displayName = 'TaskKindCell'\n\n/**\n * Priority as a chip. Only `high` is colored: a column where every row\n * carries a colored chip is a column nobody scans, and \"normal\" is the\n * absence of a flag rather than a flag of its own.\n */\nexport function TaskPriorityChip(props: { priority: CrmTaskPriority }) {\n const { priority } = props\n return (\n <Chip\n size=\"small\"\n label={CRM_TASK_PRIORITY_LABELS[priority] ?? priority}\n color={priority === 'high' ? 'error' : 'default'}\n variant={priority === 'normal' ? 'filled' : 'outlined'}\n />\n )\n}\nTaskPriorityChip.displayName = 'TaskPriorityChip'\n\n/** The due date, painted by where it stands against the reader's clock. */\nexport function TaskDueText(props: {\n task: Pick<CrmTask, 'status' | 'dueAtMs'>\n nowMs: number\n variant?: 'body2' | 'caption'\n}) {\n const { task, nowMs, variant = 'body2' } = props\n const { state, label } = describeTaskDue(task, nowMs)\n return (\n <Typography\n variant={variant}\n sx={{\n color: TASK_DUE_COLORS[state],\n fontWeight: state === 'overdue' || state === 'today' ? 'fontWeightMedium' : undefined,\n textDecoration: state === 'done' ? 'line-through' : undefined,\n }}\n data-due-state={state}\n >\n {label}\n </Typography>\n )\n}\nTaskDueText.displayName = 'TaskDueText'\n\n/**\n * The record a task is for, as a link into the hub, with its name when the\n * cache has resolved one and its id until then. An unlinked task shows a\n * dash rather than nothing, so an empty cell reads as \"none\" and not as\n * \"still loading\".\n */\nexport function TaskRecordLink(props: {\n task: Pick<CrmTask, 'contactId' | 'companyId' | 'dealId'>\n routes: CrmRoutes\n nameOf: (kind: CrmRecordKind, id: string) => string | undefined\n}) {\n const { task, routes, nameOf } = props\n const link = taskRecordLink(task, routes)\n if (!link) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'—'}\n </Typography>\n )\n }\n return (\n <Stack direction=\"row\" spacing={0.75} sx={{ alignItems: 'center', minWidth: 0 }}>\n <MdiIcon\n path={RECORD_KIND_ICONS[link.kind]}\n fontSize=\"small\"\n sx={{ color: 'text.secondary' }}\n />\n <Typography variant=\"body2\" noWrap sx={{ minWidth: 0 }}>\n <AppLink\n href={link.href}\n onClick={(event: { stopPropagation: () => void }) =>\n event.stopPropagation()\n }\n >\n {nameOf(link.kind, link.id) || link.id}\n </AppLink>\n </Typography>\n </Stack>\n )\n}\nTaskRecordLink.displayName = 'TaskRecordLink'\n"],"names":["mdiAccountGroupOutline","mdiAccountOutline","mdiCheckboxMarkedCircleOutline","mdiDomain","mdiEmailOutline","mdiHandshakeOutline","mdiPhoneOutline","AppLink","MdiIcon","Chip","Stack","Typography","CRM_TASK_KIND_LABELS","CRM_TASK_PRIORITY_LABELS","describeTaskDue","TASK_DUE_COLORS","taskRecordLink","TASK_KIND_ICONS","call","path","email","meeting","todo","RECORD_KIND_ICONS","contact","company","deal","TaskKindCell","props","kind","iconOnly","label","direction","spacing","sx","alignItems","color","title","undefined","fontSize","variant","displayName","TaskPriorityChip","priority","size","TaskDueText","task","nowMs","state","fontWeight","textDecoration","data-due-state","TaskRecordLink","routes","nameOf","link","minWidth","noWrap","href","onClick","event","stopPropagation","id"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GACD;;AAGA,SACEA,sBAAsB,EACtBC,iBAAiB,EACjBC,8BAA8B,EAC9BC,SAAS,EACTC,eAAe,EACfC,mBAAmB,EACnBC,eAAe,QACV,yBAAwB;AAC/B,SAASC,OAAO,EAAEC,OAAO,QAAQ,uBAAsB;AACvD,SAASC,IAAI,EAAEC,KAAK,EAAEC,UAAU,QAAQ,gBAAe;AAGvD,SACEC,oBAAoB,EACpBC,wBAAwB,EACxBC,eAAe,EACfC,eAAe,EACfC,cAAc,QACT,yBAAqB;AAE5B;;;;CAIC,GAED,OAAO,MAAMC,kBAA+C;IAC1DC,MAAMZ,gBAAgBa,IAAI;IAC1BC,OAAOhB,gBAAgBe,IAAI;IAC3BE,SAASrB,uBAAuBmB,IAAI;IACpCG,MAAMpB,+BAA+BiB,IAAI;AAC3C,EAAC;AAED,OAAO,MAAMI,oBAAmD;IAC9DC,SAASvB,kBAAkBkB,IAAI;IAC/BM,SAAStB,UAAUgB,IAAI;IACvBO,MAAMrB,oBAAoBc,IAAI;AAChC,EAAC;AAED,OAAO,SAASQ,aAAaC,
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/task-cells.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport type { CrmTask, CrmTaskKind, CrmTaskPriority } from '@aglyn/aglyn'\nimport {\n mdiAccountGroupOutline,\n mdiAccountOutline,\n mdiCheckboxMarkedCircleOutline,\n mdiDomain,\n mdiEmailOutline,\n mdiHandshakeOutline,\n mdiPhoneOutline,\n} from '@aglyn/shared-data-mdi'\nimport { AppLink, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { Chip, Stack, Typography } from '@mui/material'\nimport type { CrmRoutes } from '../model/crm-routes'\nimport type { CrmRecordKind } from '../hooks/use-crm-record-names'\nimport {\n CRM_TASK_KIND_LABELS,\n CRM_TASK_PRIORITY_LABELS,\n describeTaskDue,\n TASK_DUE_COLORS,\n taskRecordLink,\n} from '../model/task-views'\n\n/**\n * The cells a task is drawn with, shared by the tasks section, the record\n * cards and the dashboard widget (AGL-2599) so a call reads as a call on\n * every surface and an overdue date is the same red everywhere.\n */\n\nexport const TASK_KIND_ICONS: Record<CrmTaskKind, string> = {\n call: mdiPhoneOutline.path,\n email: mdiEmailOutline.path,\n meeting: mdiAccountGroupOutline.path,\n todo: mdiCheckboxMarkedCircleOutline.path,\n}\n\nexport const RECORD_KIND_ICONS: Record<CrmRecordKind, string> = {\n contact: mdiAccountOutline.path,\n company: mdiDomain.path,\n deal: mdiHandshakeOutline.path,\n}\n\n/**\n * The task's type: the icon of its meaning and the org's label for it\n * (AGL-3517) — `label`, from `crmTaskPicklistLabels`, or the built-in name\n * of the kind where a surface has no list to hand.\n */\nexport function TaskKindCell(props: { kind: CrmTaskKind; label?: string; iconOnly?: boolean }) {\n const { kind, iconOnly } = props\n const label = props.label || (CRM_TASK_KIND_LABELS[kind] ?? kind)\n return (\n <Stack\n direction=\"row\"\n spacing={0.75}\n sx={{ alignItems: 'center', color: 'text.secondary' }}\n title={iconOnly ? label : undefined}\n >\n <MdiIcon path={TASK_KIND_ICONS[kind] ?? TASK_KIND_ICONS.todo} fontSize=\"small\" />\n {iconOnly ? null : <Typography variant=\"body2\">{label}</Typography>}\n </Stack>\n )\n}\nTaskKindCell.displayName = 'TaskKindCell'\n\n/**\n * Priority as a chip. Only `high` is colored: a column where every row\n * carries a colored chip is a column nobody scans, and \"normal\" is the\n * absence of a flag rather than a flag of its own. The color follows the\n * MEANING; the text is the org's label for it when one is passed (AGL-3517).\n */\nexport function TaskPriorityChip(props: { priority: CrmTaskPriority; label?: string }) {\n const { priority } = props\n return (\n <Chip\n size=\"small\"\n label={props.label || (CRM_TASK_PRIORITY_LABELS[priority] ?? priority)}\n color={priority === 'high' ? 'error' : 'default'}\n variant={priority === 'normal' ? 'filled' : 'outlined'}\n />\n )\n}\nTaskPriorityChip.displayName = 'TaskPriorityChip'\n\n/** The due date, painted by where it stands against the reader's clock. */\nexport function TaskDueText(props: {\n task: Pick<CrmTask, 'status' | 'dueAtMs'>\n nowMs: number\n variant?: 'body2' | 'caption'\n}) {\n const { task, nowMs, variant = 'body2' } = props\n const { state, label } = describeTaskDue(task, nowMs)\n return (\n <Typography\n variant={variant}\n sx={{\n color: TASK_DUE_COLORS[state],\n fontWeight: state === 'overdue' || state === 'today' ? 'fontWeightMedium' : undefined,\n textDecoration: state === 'done' ? 'line-through' : undefined,\n }}\n data-due-state={state}\n >\n {label}\n </Typography>\n )\n}\nTaskDueText.displayName = 'TaskDueText'\n\n/**\n * The record a task is for, as a link into the hub, with its name when the\n * cache has resolved one and its id until then. An unlinked task shows a\n * dash rather than nothing, so an empty cell reads as \"none\" and not as\n * \"still loading\".\n */\nexport function TaskRecordLink(props: {\n task: Pick<CrmTask, 'contactId' | 'companyId' | 'dealId'>\n routes: CrmRoutes\n nameOf: (kind: CrmRecordKind, id: string) => string | undefined\n}) {\n const { task, routes, nameOf } = props\n const link = taskRecordLink(task, routes)\n if (!link) {\n return (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'—'}\n </Typography>\n )\n }\n return (\n <Stack direction=\"row\" spacing={0.75} sx={{ alignItems: 'center', minWidth: 0 }}>\n <MdiIcon\n path={RECORD_KIND_ICONS[link.kind]}\n fontSize=\"small\"\n sx={{ color: 'text.secondary' }}\n />\n <Typography variant=\"body2\" noWrap sx={{ minWidth: 0 }}>\n <AppLink\n href={link.href}\n onClick={(event: { stopPropagation: () => void }) =>\n event.stopPropagation()\n }\n >\n {nameOf(link.kind, link.id) || link.id}\n </AppLink>\n </Typography>\n </Stack>\n )\n}\nTaskRecordLink.displayName = 'TaskRecordLink'\n"],"names":["mdiAccountGroupOutline","mdiAccountOutline","mdiCheckboxMarkedCircleOutline","mdiDomain","mdiEmailOutline","mdiHandshakeOutline","mdiPhoneOutline","AppLink","MdiIcon","Chip","Stack","Typography","CRM_TASK_KIND_LABELS","CRM_TASK_PRIORITY_LABELS","describeTaskDue","TASK_DUE_COLORS","taskRecordLink","TASK_KIND_ICONS","call","path","email","meeting","todo","RECORD_KIND_ICONS","contact","company","deal","TaskKindCell","props","kind","iconOnly","label","direction","spacing","sx","alignItems","color","title","undefined","fontSize","variant","displayName","TaskPriorityChip","priority","size","TaskDueText","task","nowMs","state","fontWeight","textDecoration","data-due-state","TaskRecordLink","routes","nameOf","link","minWidth","noWrap","href","onClick","event","stopPropagation","id"],"mappings":"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"}
|