@aglyn/plugins-crm 1.0.0-beta.221 → 1.0.0-beta.223
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-next-activity-column.js +1 -1
- package/src/lib/components/crm-next-activity-column.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/pipeline-card.js +2 -1
- package/src/lib/components/reports/pipeline-card.js.map +1 -1
- 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 +97 -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 +17 -2
- 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-next-activity.d.ts +107 -0
- package/src/lib/model/crm-next-activity.js +140 -0
- package/src/lib/model/crm-next-activity.js.map +1 -0
- package/src/lib/model/crm-recipes.d.ts +40 -0
- package/src/lib/model/crm-recipes.js +259 -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/crm-task-reminders.d.ts +152 -0
- package/src/lib/model/crm-task-reminders.js +161 -0
- package/src/lib/model/crm-task-reminders.js.map +1 -0
- 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/next-activity.d.ts +1 -1
- package/src/lib/model/next-activity.js.map +1 -1
- 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 +78 -34
- 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 +188 -0
- package/src/lib/server/assign-contact-owner.js +446 -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 +140 -0
- package/src/lib/server/automation-steps.js +669 -0
- package/src/lib/server/automation-steps.js.map +1 -0
- package/src/lib/server/capture-contact.d.ts +17 -0
- package/src/lib/server/capture-contact.js +95 -26
- 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-email-activity.d.ts +118 -0
- package/src/lib/server/crm-email-activity.js +148 -0
- package/src/lib/server/crm-email-activity.js.map +1 -0
- package/src/lib/server/crm-inbound-email.js +1 -1
- package/src/lib/server/crm-inbound-email.js.map +1 -1
- package/src/lib/server/crm-next-activity.d.ts +74 -0
- package/src/lib/server/crm-next-activity.js +194 -0
- package/src/lib/server/crm-next-activity.js.map +1 -0
- 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/email-send.js +2 -1
- package/src/lib/server/email-send.js.map +1 -1
- 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 +23 -5
- package/src/lib/server/merge-contacts.js.map +1 -1
- package/src/lib/server/next-activity-routes.js +2 -1
- package/src/lib/server/next-activity-routes.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 +22 -8
- 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 +40 -3
- 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-reminders-route.js +2 -1
- package/src/lib/server/task-reminders-route.js.map +1 -1
- package/src/lib/server/task-routes.js +33 -17
- 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,7 +16,7 @@
|
|
|
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 { CRM_COLLECTIONS, pluginDocsHelp, crmMemberPickerLabel } from "@aglyn/aglyn";
|
|
19
|
+
import { CRM_COLLECTIONS, crmPicklistKey, pluginDocsHelp, crmMemberPickerLabel } from "@aglyn/aglyn";
|
|
20
20
|
import { mdiPlus } from "@aglyn/shared-data-mdi";
|
|
21
21
|
import { CardDisplay, MdiIcon } from "@aglyn/shared-ui-jsx";
|
|
22
22
|
import { ListPagination } from "@aglyn/shared-ui-jsx/components/list-pagination.component";
|
|
@@ -38,23 +38,54 @@ import { Button, Chip, Stack, Typography } from "@mui/material";
|
|
|
38
38
|
import { getGridSingleSelectOperators } from "@mui/x-data-grid";
|
|
39
39
|
import { useRouter } from "next/navigation";
|
|
40
40
|
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
41
|
-
import { COMPANY_LIST_DECLARATION, COMPANY_LIST_FILTER_FIELDS, COMPANY_PREFIX_SEARCH } from "../constants/company-filters.js";
|
|
41
|
+
import { COMPANY_LIST_DECLARATION, COMPANY_LIST_FILTER_FIELDS, COMPANY_PICKLIST_FILTERS, COMPANY_PREFIX_SEARCH } from "../constants/company-filters.js";
|
|
42
|
+
import { useCompanyPicklists } from "../hooks/use-company-picklists.js";
|
|
43
|
+
import { formatMoney } from "../model/deal-board-model.js";
|
|
42
44
|
import { useContactFieldDefinitions } from "../hooks/use-contact-field-definitions.js";
|
|
43
45
|
import { useCrmScope } from "../hooks/use-crm-scope.js";
|
|
44
46
|
import { useOrgMemberOptions } from "../hooks/use-org-member-options.js";
|
|
45
|
-
import {
|
|
46
|
-
import { downloadTextFile } from "../model/contacts-csv.js";
|
|
47
|
+
import { CRM_COMPANIES_RESOURCE } from "../transfer/fields.js";
|
|
47
48
|
import { crmRoutes } from "../model/crm-routes.js";
|
|
48
49
|
import CompaniesBulkBar from "./companies-bulk-bar.js";
|
|
49
50
|
import CompanyEditDrawer from "./company-edit-drawer.js";
|
|
50
|
-
import {
|
|
51
|
+
import { CrmExportButton, CrmImportButton } from "./crm-transfer-buttons.js";
|
|
51
52
|
import { customFieldColumns } from "./contact-custom-columns.js";
|
|
52
53
|
/** What the companies grid's panel offers — every field the query asks. */ const COMPANY_GRID_FILTER_FIELDS = COMPANY_LIST_FILTER_FIELDS;
|
|
53
|
-
const COMPANY_GRID_FILTER_HEADERS = {
|
|
54
|
+
const COMPANY_GRID_FILTER_HEADERS = _extends({
|
|
54
55
|
name: 'Company',
|
|
55
56
|
ownerUid: 'Owner',
|
|
56
57
|
[CRM_NEXT_ACTIVITY_FILTER_FIELD.column]: CRM_NEXT_ACTIVITY_FILTER_HEADER
|
|
58
|
+
}, Object.fromEntries(COMPANY_PICKLIST_FILTERS.map((entry)=>[
|
|
59
|
+
entry.column,
|
|
60
|
+
entry.header
|
|
61
|
+
])));
|
|
62
|
+
/** The grid's select columns — the owner and each picklist — as the filter hook names them. */ const COMPANY_SELECT_FIELDS = [
|
|
63
|
+
'ownerUid',
|
|
64
|
+
...COMPANY_PICKLIST_FILTERS.map((entry)=>entry.column)
|
|
65
|
+
];
|
|
66
|
+
/**
|
|
67
|
+
* Salesforce's Account columns (AGL-3514), optional: a reader turns one on
|
|
68
|
+
* from the column menu, and a view that shows it stores it by name.
|
|
69
|
+
*/ const COMPANY_HIDDEN_COLUMNS = {
|
|
70
|
+
type: false,
|
|
71
|
+
industry: false,
|
|
72
|
+
rating: false,
|
|
73
|
+
accountSource: false,
|
|
74
|
+
numberOfEmployees: false,
|
|
75
|
+
annualRevenueCents: false
|
|
57
76
|
};
|
|
77
|
+
/** A text cell that reads as a dash when empty. */ function textCell(value) {
|
|
78
|
+
const text = value === null || value === undefined ? '' : String(value);
|
|
79
|
+
return text ? /*#__PURE__*/ _jsx(Typography, {
|
|
80
|
+
variant: "body2",
|
|
81
|
+
noWrap: true,
|
|
82
|
+
children: text
|
|
83
|
+
}) : /*#__PURE__*/ _jsx(Typography, {
|
|
84
|
+
variant: "body2",
|
|
85
|
+
color: "text.secondary",
|
|
86
|
+
children: '—'
|
|
87
|
+
});
|
|
88
|
+
}
|
|
58
89
|
/**
|
|
59
90
|
* `/crm/companies` — the organizations behind the people (AGL-2597).
|
|
60
91
|
*
|
|
@@ -92,9 +123,9 @@ const COMPANY_GRID_FILTER_HEADERS = {
|
|
|
92
123
|
* ## Selection, the bar and the file (AGL-2621)
|
|
93
124
|
*
|
|
94
125
|
* The rows are selectable, and a selection raises `CompaniesBulkBar` over
|
|
95
|
-
* the table. Export
|
|
96
|
-
*
|
|
97
|
-
*
|
|
126
|
+
* the table. Import and Export open the console's import wizard and
|
|
127
|
+
* export dialog on `crm.companies` (AGL-3527): the export over the
|
|
128
|
+
* selection, the list's own query, or every company.
|
|
98
129
|
*/ export function CompaniesSection(props) {
|
|
99
130
|
const { hostId, org, basePath } = props;
|
|
100
131
|
const routes = crmRoutes(basePath);
|
|
@@ -110,6 +141,8 @@ const COMPANY_GRID_FILTER_HEADERS = {
|
|
|
110
141
|
*/ const members = useOrgMemberOptions(orgId);
|
|
111
142
|
// The org's company fields, for the optional columns below (AGL-2661).
|
|
112
143
|
const companyFields = useContactFieldDefinitions(orgId, 'company');
|
|
144
|
+
// The lists behind Type, Industry and Rating, for their filters (AGL-3514).
|
|
145
|
+
const picklists = useCompanyPicklists(orgId);
|
|
113
146
|
/*
|
|
114
147
|
* The clauses are the saved VIEW'S (AGL-2617), beside its columns and
|
|
115
148
|
* sort; the grid's panel and the chips edit them, and the query answers
|
|
@@ -141,20 +174,13 @@ const COMPANY_GRID_FILTER_HEADERS = {
|
|
|
141
174
|
plan,
|
|
142
175
|
page
|
|
143
176
|
]);
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
members.emailFor
|
|
152
|
-
]);
|
|
153
|
-
const handleExport = useCallback(()=>{
|
|
154
|
-
downloadTextFile('companies.csv', 'text/csv', companiesCsv(companies, csvOptions));
|
|
155
|
-
}, [
|
|
156
|
-
companies,
|
|
157
|
-
csvOptions
|
|
177
|
+
// The list's filter, when one narrows it, for the export to read the same
|
|
178
|
+
// records the list does (AGL-3527).
|
|
179
|
+
const exportFilter = useMemo(()=>plan.served.length || plan.searched ? {
|
|
180
|
+
label: 'what the list shows',
|
|
181
|
+
plan
|
|
182
|
+
} : null, [
|
|
183
|
+
plan
|
|
158
184
|
]);
|
|
159
185
|
const openCompany = useCallback((id)=>router.push(routes.company(id)), [
|
|
160
186
|
router,
|
|
@@ -339,6 +365,55 @@ const COMPANY_GRID_FILTER_HEADERS = {
|
|
|
339
365
|
},
|
|
340
366
|
// When the earliest open task against the company is due (AGL-2661).
|
|
341
367
|
nextActivityColumn(nowMs),
|
|
368
|
+
// Salesforce's Account fields (AGL-3514), each optional. Type, Industry
|
|
369
|
+
// and Rating filter by the key stored beside the label; the rest read.
|
|
370
|
+
...COMPANY_PICKLIST_FILTERS.map((entry)=>({
|
|
371
|
+
field: entry.column,
|
|
372
|
+
headerName: entry.header,
|
|
373
|
+
flex: 0.8,
|
|
374
|
+
minWidth: 130,
|
|
375
|
+
sortable: false,
|
|
376
|
+
valueGetter: (_value, row)=>{
|
|
377
|
+
var _crmPicklistKey;
|
|
378
|
+
return (_crmPicklistKey = crmPicklistKey(row[entry.column])) != null ? _crmPicklistKey : '';
|
|
379
|
+
},
|
|
380
|
+
renderCell: ({ row })=>textCell(row[entry.column])
|
|
381
|
+
})),
|
|
382
|
+
{
|
|
383
|
+
field: 'accountSource',
|
|
384
|
+
headerName: 'Account source',
|
|
385
|
+
flex: 0.8,
|
|
386
|
+
minWidth: 140,
|
|
387
|
+
filterable: false,
|
|
388
|
+
sortable: false,
|
|
389
|
+
valueGetter: (_value, row)=>{
|
|
390
|
+
var _row_accountSource;
|
|
391
|
+
return String((_row_accountSource = row.accountSource) != null ? _row_accountSource : '');
|
|
392
|
+
},
|
|
393
|
+
renderCell: ({ row })=>textCell(row.accountSource)
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
field: 'numberOfEmployees',
|
|
397
|
+
headerName: 'Employees',
|
|
398
|
+
width: 120,
|
|
399
|
+
align: 'right',
|
|
400
|
+
headerAlign: 'right',
|
|
401
|
+
filterable: false,
|
|
402
|
+
sortable: false,
|
|
403
|
+
valueGetter: (_value, row)=>typeof row.numberOfEmployees === 'number' ? row.numberOfEmployees : null,
|
|
404
|
+
renderCell: ({ row })=>textCell(typeof row.numberOfEmployees === 'number' ? row.numberOfEmployees.toLocaleString() : '')
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
field: 'annualRevenueCents',
|
|
408
|
+
headerName: 'Annual revenue',
|
|
409
|
+
width: 150,
|
|
410
|
+
align: 'right',
|
|
411
|
+
headerAlign: 'right',
|
|
412
|
+
filterable: false,
|
|
413
|
+
sortable: false,
|
|
414
|
+
valueGetter: (_value, row)=>typeof row.annualRevenueCents === 'number' ? row.annualRevenueCents : null,
|
|
415
|
+
renderCell: ({ row })=>textCell(typeof row.annualRevenueCents === 'number' ? formatMoney(row.annualRevenueCents, row.currency) : '')
|
|
416
|
+
},
|
|
342
417
|
// The org's company fields as optional columns (AGL-2661), read off
|
|
343
418
|
// the row's own `custom` map the way the contacts list reads its own.
|
|
344
419
|
...customFieldColumns(companyFields.active)
|
|
@@ -356,18 +431,50 @@ const COMPANY_GRID_FILTER_HEADERS = {
|
|
|
356
431
|
})), [
|
|
357
432
|
members.options
|
|
358
433
|
]);
|
|
359
|
-
|
|
434
|
+
/*
|
|
435
|
+
* Each picklist's choices (AGL-3514): every value the org keeps, valued
|
|
436
|
+
* by the key the query compares and captioned by the label, inactive
|
|
437
|
+
* ones marked. A stored clause naming a key no longer listed stays a
|
|
438
|
+
* choice, so the panel can show it and clear it.
|
|
439
|
+
*/ const filterOptions = useMemo(()=>{
|
|
440
|
+
const options = {
|
|
360
441
|
ownerUid: ownerOptions
|
|
361
|
-
}
|
|
442
|
+
};
|
|
443
|
+
for (const entry of COMPANY_PICKLIST_FILTERS){
|
|
444
|
+
var _ref;
|
|
445
|
+
const list = picklists.lists[entry.picklistId];
|
|
446
|
+
const known = ((_ref = list == null ? void 0 : list.values) != null ? _ref : []).flatMap((value)=>{
|
|
447
|
+
const key = crmPicklistKey(value.label);
|
|
448
|
+
return key ? [
|
|
449
|
+
{
|
|
450
|
+
value: key,
|
|
451
|
+
label: value.active ? value.label : `${value.label} (inactive)`
|
|
452
|
+
}
|
|
453
|
+
] : [];
|
|
454
|
+
});
|
|
455
|
+
const stale = viewFilters.filter((clause)=>clause.field === entry.column).flatMap((clause)=>clause.value.split(',')).map((value)=>value.trim()).filter((value)=>value && !known.some((option)=>option.value === value)).map((value)=>({
|
|
456
|
+
value,
|
|
457
|
+
label: value
|
|
458
|
+
}));
|
|
459
|
+
options[entry.column] = [
|
|
460
|
+
...known,
|
|
461
|
+
...stale
|
|
462
|
+
];
|
|
463
|
+
}
|
|
464
|
+
return options;
|
|
465
|
+
}, [
|
|
466
|
+
ownerOptions,
|
|
467
|
+
picklists.lists,
|
|
468
|
+
viewFilters
|
|
469
|
+
]);
|
|
470
|
+
const filterColumns = useMemo(()=>listFilterGridColumns(columns, COMPANY_GRID_FILTER_FIELDS, filterOptions, COMPANY_GRID_FILTER_HEADERS), [
|
|
362
471
|
columns,
|
|
363
|
-
|
|
472
|
+
filterOptions
|
|
364
473
|
]);
|
|
365
474
|
const gridFilter = useListGridFilter({
|
|
366
475
|
clauses: viewFilters,
|
|
367
476
|
onChange: views.setFilters,
|
|
368
|
-
selectFields:
|
|
369
|
-
'ownerUid'
|
|
370
|
-
],
|
|
477
|
+
selectFields: COMPANY_SELECT_FIELDS,
|
|
371
478
|
search: {
|
|
372
479
|
words: searchWords,
|
|
373
480
|
onChange: setSearchWords
|
|
@@ -377,19 +484,17 @@ const COMPANY_GRID_FILTER_HEADERS = {
|
|
|
377
484
|
const refused = useMemo(()=>listQueryRefusals(plan.refused, {
|
|
378
485
|
fields: COMPANY_GRID_FILTER_FIELDS,
|
|
379
486
|
headers: COMPANY_GRID_FILTER_HEADERS,
|
|
380
|
-
options:
|
|
381
|
-
ownerUid: ownerOptions
|
|
382
|
-
}
|
|
487
|
+
options: filterOptions
|
|
383
488
|
}), [
|
|
384
489
|
plan.refused,
|
|
385
|
-
|
|
490
|
+
filterOptions
|
|
386
491
|
]);
|
|
387
492
|
/*
|
|
388
493
|
* The grid's models are the view's (AGL-2617). The filter model shows the
|
|
389
494
|
* view's clause in the panel as a typed one would appear — the owner's
|
|
390
495
|
* stored `equals` back as the single-select `is` the panel offers — so a
|
|
391
496
|
* view opened from its address reads as filtered, not as a mystery.
|
|
392
|
-
*/ const grid = useCrmViewGrid(views, filterColumns);
|
|
497
|
+
*/ const grid = useCrmViewGrid(views, filterColumns, COMPANY_HIDDEN_COLUMNS);
|
|
393
498
|
/** Whether anything narrows the list, so an empty one is "no match", not "none yet". */ const narrowed = viewFilters.length > 0 || searchWords.some((word)=>word.trim());
|
|
394
499
|
const newCompanyButton = /*#__PURE__*/ _jsx(Button, {
|
|
395
500
|
size: "small",
|
|
@@ -415,15 +520,16 @@ const COMPANY_GRID_FILTER_HEADERS = {
|
|
|
415
520
|
// The record actions, top right and never clipped (AGL-3311).
|
|
416
521
|
action: /*#__PURE__*/ _jsxs(CrmListActions, {
|
|
417
522
|
children: [
|
|
418
|
-
/*#__PURE__*/ _jsx(
|
|
523
|
+
/*#__PURE__*/ _jsx(CrmImportButton, {
|
|
524
|
+
resource: CRM_COMPANIES_RESOURCE,
|
|
525
|
+
noun: "companies",
|
|
419
526
|
hostId: hostId,
|
|
420
|
-
|
|
527
|
+
mappingZone: "companies"
|
|
421
528
|
}),
|
|
422
|
-
/*#__PURE__*/ _jsx(
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
children: 'Export CSV'
|
|
529
|
+
/*#__PURE__*/ _jsx(CrmExportButton, {
|
|
530
|
+
resource: CRM_COMPANIES_RESOURCE,
|
|
531
|
+
hostId: hostId,
|
|
532
|
+
filter: exportFilter
|
|
427
533
|
}),
|
|
428
534
|
newCompanyButton
|
|
429
535
|
]
|
|
@@ -450,9 +556,7 @@ const COMPANY_GRID_FILTER_HEADERS = {
|
|
|
450
556
|
headers: COMPANY_GRID_FILTER_HEADERS,
|
|
451
557
|
clauses: viewFilters,
|
|
452
558
|
onChange: views.setFilters,
|
|
453
|
-
options:
|
|
454
|
-
ownerUid: ownerOptions
|
|
455
|
-
},
|
|
559
|
+
options: filterOptions,
|
|
456
560
|
marksServed: false
|
|
457
561
|
})
|
|
458
562
|
]
|
|
@@ -467,8 +571,7 @@ const COMPANY_GRID_FILTER_HEADERS = {
|
|
|
467
571
|
rows: companies,
|
|
468
572
|
selected: selectedIds,
|
|
469
573
|
onSelectedChange: setSelectedIds,
|
|
470
|
-
members: members
|
|
471
|
-
csv: csvOptions
|
|
574
|
+
members: members
|
|
472
575
|
}),
|
|
473
576
|
/*#__PURE__*/ _jsx(CrmColumnOrderProvider, {
|
|
474
577
|
value: grid.columnOrder,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/companies-section.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n type AglynOrgBilling,\n CRM_COLLECTIONS,\n type CrmCompany,\n pluginDocsHelp,\n crmMemberPickerLabel,\n} from '@aglyn/aglyn'\nimport { mdiPlus } from '@aglyn/shared-data-mdi'\nimport { CardDisplay, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { ListPagination } from '@aglyn/shared-ui-jsx/components/list-pagination.component'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { listFilterColumn } from '@aglyn/shared-ui-jsx/const/list-grid-filter'\nimport ListQueryNotices, {\n listQueryRefusals,\n} from '@aglyn/shared-ui-jsx/components/list-query-notices.component'\nimport { useCrmSavedView } from '../hooks/use-crm-saved-view'\nimport { useCrmViewGrid } from '../hooks/use-crm-view-grid'\nimport { CRM_LIST_SLOTS, CrmColumnOrderProvider } from './crm-column-menu'\nimport {\n CRM_NEXT_ACTIVITY_FILTER_FIELD,\n CRM_NEXT_ACTIVITY_FILTER_HEADER,\n nextActivityColumn,\n} from './crm-next-activity-column'\nimport { useCrmFoldsScope, useCrmListQuery } from '../hooks/use-crm-list-query'\nimport ListFilterChips from '@aglyn/shared-ui-jsx/components/list-filter-chips.component'\nimport { listFilterGridColumns } from '@aglyn/shared-ui-jsx/const/list-grid-filter'\nimport { useListGridFilter } from '@aglyn/shared-ui-jsx/hooks/use-list-grid-filter'\nimport CrmViewsControl from './crm-views-control'\nimport { CrmListActions, CrmListToolbar } from './crm-list-toolbar'\nimport { TABLE_ROW_HEIGHT } from '@aglyn/shared-ui-jsx/const/table-pagination'\nimport { Button, Chip, Stack, Typography } from '@mui/material'\nimport {\n getGridSingleSelectOperators,\n type GridColDef,\n} from '@mui/x-data-grid'\nimport { useRouter } from 'next/navigation'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n COMPANY_LIST_DECLARATION,\n COMPANY_LIST_FILTER_FIELDS,\n COMPANY_PREFIX_SEARCH,\n} from '../constants/company-filters'\nimport { useContactFieldDefinitions } from '../hooks/use-contact-field-definitions'\nimport { useCrmScope } from '../hooks/use-crm-scope'\nimport { useOrgMemberOptions } from '../hooks/use-org-member-options'\nimport { type CompanyCsvOptions, companiesCsv } from '../model/companies-csv'\nimport { downloadTextFile } from '../model/contacts-csv'\nimport { crmRoutes } from '../model/crm-routes'\nimport CompaniesBulkBar from './companies-bulk-bar'\nimport CompanyEditDrawer from './company-edit-drawer'\nimport { CompanyImportButton } from './company-import-drawer'\nimport { customFieldColumns } from './contact-custom-columns'\n\nexport interface CompaniesSectionProps {\n /** The site the list is read under, or `null` at the organization level. */\n hostId: string | null\n org?: Partial<AglynOrgBilling>\n /** The CRM hub URL, which every company route hangs beneath. */\n basePath: string\n}\n\ntype CompanyRow = Partial<CrmCompany> & { $id: string; updatedAt?: any }\n\n/** What the companies grid's panel offers — every field the query asks. */\nconst COMPANY_GRID_FILTER_FIELDS = COMPANY_LIST_FILTER_FIELDS\nconst COMPANY_GRID_FILTER_HEADERS: Readonly<Record<string, string>> = {\n name: 'Company',\n ownerUid: 'Owner',\n [CRM_NEXT_ACTIVITY_FILTER_FIELD.column]: CRM_NEXT_ACTIVITY_FILTER_HEADER,\n}\n\n/**\n * `/crm/companies` — the organizations behind the people (AGL-2597).\n *\n * A section of its own rather than a column on the contact list, because a\n * company is known by several contacts and carries records of its own: a\n * domain the email suggestion keys on, an address, an owner, and the deals\n * and tasks filed against it. The row opens `/crm/companies/{id}`, where all\n * of that lives; this list is the cheaper surface and reads nothing a row\n * does not show.\n *\n * ## What the listener carries\n *\n * Paged and ordered by the server — `updatedAt desc`, so a company somebody\n * just touched is on page one — and SCOPED by the same `visibleTo\n * array-contains-any` predicate the contact list runs. That predicate is what\n * the rules evaluate: a filtered query is provable per document, and an\n * unfiltered one is refused rather than quietly returning the whole org's\n * accounts to a site that may see one client's.\n *\n * ## What a filter may be\n *\n * Every clause and the search word are on the one query (AGL-3321): the\n * search reads the name's and the domain's word prefixes, the name is also\n * an exact match and a prefix, the owner a choice from the roster, and \"No\n * next activity\" a `null` — each reaching the whole collection, which is\n * the property a filter must have: a company on page four is found, not\n * reported missing. `COMPANY_LIST_DECLARATION` states what the query asks.\n *\n * ## Creating is a drawer\n *\n * \"New company\" opens the same eight-field drawer the company's page edits\n * with, and the new record's page opens when it is saved. A form above a\n * list has nowhere to grow, and this one has an address in it.\n *\n * ## Selection, the bar and the file (AGL-2621)\n *\n * The rows are selectable, and a selection raises `CompaniesBulkBar` over\n * the table. Export CSV writes the loaded page through `companiesCsv()` —\n * the same file the bar writes over the selection, headed as the import\n * reads it — and Import CSV opens the companies drawer beside it.\n */\nexport function CompaniesSection(props: CompaniesSectionProps) {\n const { hostId, org, basePath } = props\n const routes = crmRoutes(basePath)\n const router = useRouter()\n const { scope, orgId, visibleTo } = useCrmScope({ hostId, org })\n /*\n * The team, read once for this surface: the Owner column names a person\n * from a uid, and the create drawer picks from the same roster. One fetch\n * serves both, which is why the drawer takes it as a prop.\n */\n const members = useOrgMemberOptions(orgId)\n // The org's company fields, for the optional columns below (AGL-2661).\n const companyFields = useContactFieldDefinitions(orgId, 'company')\n\n /*\n * The clauses are the saved VIEW'S (AGL-2617), beside its columns and\n * sort; the grid's panel and the chips edit them, and the query answers\n * every one and the search word together (AGL-3321).\n */\n const views = useCrmSavedView({ section: 'companies', hostId, org, basePath })\n const viewFilters = views.state.filters\n const [searchWords, setSearchWords] = useState<string[]>([])\n const foldsScope = useCrmFoldsScope(orgId, visibleTo)\n const {\n rows: companies,\n status,\n hasMore,\n page,\n setPage,\n pageSize,\n setPageSize,\n plan,\n } = useCrmListQuery<CompanyRow>({\n scope,\n collection: CRM_COLLECTIONS.companies,\n visibleTo,\n foldsScope,\n declaration: COMPANY_LIST_DECLARATION,\n clauses: viewFilters,\n search: searchWords,\n prefixSearch: COMPANY_PREFIX_SEARCH,\n })\n const nowMs = useMemo(() => Date.now(), [])\n\n const [createOpen, setCreateOpen] = useState(false)\n const [selectedIds, setSelectedIds] = useState<string[]>([])\n // A filter, a search or a page is a different set of rows.\n useEffect(() => setSelectedIds([]), [plan, page])\n /*\n * The owner is written by ADDRESS, because the companies import resolves\n * an owner by email; the same options reach the bar, so the page's file\n * and the selection's are one format.\n */\n const csvOptions: CompanyCsvOptions = useMemo(\n () => ({ ownerEmail: members.emailFor }),\n [members.emailFor],\n )\n const handleExport = useCallback(() => {\n downloadTextFile('companies.csv', 'text/csv', companiesCsv(companies, csvOptions))\n }, [companies, csvOptions])\n const openCompany = useCallback(\n (id: string) => router.push(routes.company(id)),\n [router, routes],\n )\n\n const columns: GridColDef[] = useMemo(\n () => [\n {\n field: 'name',\n headerName: 'Company',\n flex: 1.6,\n minWidth: 240,\n ...listFilterColumn(COMPANY_LIST_FILTER_FIELDS, 'name'),\n valueGetter: (_value, row: CompanyRow) => String(row.name ?? ''),\n renderCell: ({ row }: { row: CompanyRow }) => (\n <Stack\n sx={{ justifyContent: 'center', height: '100%', lineHeight: 1.25 }}\n >\n <Typography variant=\"body2\" sx={{ lineHeight: 1.25 }}>\n {row.name}\n </Typography>\n {row.industry ? (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ lineHeight: 1.25 }}\n noWrap\n >\n {row.industry}\n </Typography>\n ) : null}\n </Stack>\n ),\n },\n {\n field: 'domain',\n headerName: 'Domain',\n flex: 1,\n minWidth: 160,\n // Stored normalized, so it could be filtered exactly — but a domain\n // lookup is what the company suggestion on a contact does, and a\n // filter here would need an index of its own for one more way to\n // find a row the name filter already finds.\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) => String(row.domain ?? ''),\n renderCell: ({ row }: { row: CompanyRow }) =>\n row.domain ? (\n <Typography variant=\"body2\">{row.domain}</Typography>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'—'}\n </Typography>\n ),\n },\n {\n field: 'contactsCount',\n headerName: 'Contacts',\n width: 110,\n align: 'right',\n headerAlign: 'right',\n /*\n * The denormalized count every link moves (AGL-2613) — a stored\n * number, so a page of companies costs no read per row. Absent on a\n * company nobody has linked since the counter existed, which reads\n * as zero; the company's own page takes the live aggregate.\n */\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) => Number(row.contactsCount ?? 0),\n renderCell: ({ row }: { row: CompanyRow }) => (\n <Typography\n variant=\"body2\"\n color={row.contactsCount ? 'text.primary' : 'text.secondary'}\n >\n {Number(row.contactsCount ?? 0).toLocaleString()}\n </Typography>\n ),\n },\n {\n field: 'tags',\n headerName: 'Tags',\n flex: 1,\n minWidth: 140,\n // Written by the drawer and the bulk bar (AGL-2621); read here, not\n // filtered — a tag filter would need an `array-contains` index of\n // its own beside the scope predicate.\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) => (row.tags ?? []).join(', '),\n renderCell: ({ row }: { row: CompanyRow }) =>\n row.tags?.length ? (\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center', overflow: 'hidden' }}>\n {row.tags.slice(0, 3).map((tag) => (\n <Chip key={tag} size=\"small\" variant=\"outlined\" label={tag} />\n ))}\n {row.tags.length > 3 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`+${row.tags.length - 3}`}\n </Typography>\n ) : null}\n </Stack>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'—'}\n </Typography>\n ),\n },\n {\n field: 'ownerUid',\n headerName: 'Owner',\n flex: 1,\n minWidth: 160,\n sortable: false,\n /*\n * A CHOICE from the roster, not a text box for a uid. The grid's\n * single-select `is` operator is what the panel offers; the handler\n * below maps it onto the declared field's `equals`, which the\n * translator turns into the equality the index serves.\n */\n type: 'singleSelect',\n valueOptions: members.options.map((option) => ({\n value: option.uid,\n label: crmMemberPickerLabel(option),\n })),\n filterable: members.options.length > 0,\n filterOperators: getGridSingleSelectOperators().filter(\n (operator) => operator.value === 'is',\n ),\n valueGetter: (_value, row: CompanyRow) => String(row.ownerUid ?? ''),\n renderCell: ({ row }: { row: CompanyRow }) => (\n <Typography\n variant=\"body2\"\n color={row.ownerUid ? 'text.primary' : 'text.secondary'}\n >\n {row.ownerUid\n ? members.ready\n ? members.labelFor(row.ownerUid)\n : '…'\n : '—'}\n </Typography>\n ),\n },\n {\n field: 'updatedAt',\n headerName: 'Updated',\n flex: 0.8,\n minWidth: 140,\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) =>\n row.updatedAt?.seconds ? new Date(row.updatedAt.seconds * 1000) : null,\n renderCell: ({ row }: { row: CompanyRow }) => (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {row.updatedAt?.seconds\n ? new Date(row.updatedAt.seconds * 1000).toLocaleDateString()\n : '—'}\n </Typography>\n ),\n },\n // When the earliest open task against the company is due (AGL-2661).\n nextActivityColumn(nowMs),\n // The org's company fields as optional columns (AGL-2661), read off\n // the row's own `custom` map the way the contacts list reads its own.\n ...customFieldColumns(companyFields.active),\n ],\n [members, companyFields.active, nowMs],\n )\n\n /*\n * The grid's own Filters panel and quick search edit the view's clauses\n * (AGL-3313); the query answers them all (AGL-3321).\n */\n const ownerOptions = useMemo(\n () =>\n members.options.map((option) => ({\n value: option.uid,\n label: crmMemberPickerLabel(option),\n })),\n [members.options],\n )\n const filterColumns = useMemo(\n () =>\n listFilterGridColumns(columns, COMPANY_GRID_FILTER_FIELDS, { ownerUid: ownerOptions }, COMPANY_GRID_FILTER_HEADERS),\n [columns, ownerOptions],\n )\n const gridFilter = useListGridFilter({\n clauses: viewFilters,\n onChange: views.setFilters,\n selectFields: ['ownerUid'],\n search: { words: searchWords, onChange: setSearchWords },\n })\n // What the query could not hold, named by the clause the reader set.\n const refused = useMemo(\n () =>\n listQueryRefusals(plan.refused, {\n fields: COMPANY_GRID_FILTER_FIELDS,\n headers: COMPANY_GRID_FILTER_HEADERS,\n options: { ownerUid: ownerOptions },\n }),\n [plan.refused, ownerOptions],\n )\n /*\n * The grid's models are the view's (AGL-2617). The filter model shows the\n * view's clause in the panel as a typed one would appear — the owner's\n * stored `equals` back as the single-select `is` the panel offers — so a\n * view opened from its address reads as filtered, not as a mystery.\n */\n const grid = useCrmViewGrid(views, filterColumns)\n\n /** Whether anything narrows the list, so an empty one is \"no match\", not \"none yet\". */\n const narrowed = viewFilters.length > 0 || searchWords.some((word) => word.trim())\n\n const newCompanyButton = (\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"primary\"\n disabled={!scope}\n startIcon={<MdiIcon path={mdiPlus.path} size={0.8} />}\n onClick={() => setCreateOpen(true)}\n >\n {'New company'}\n </Button>\n )\n\n return (\n <CardDisplay\n header={'Companies'}\n help={pluginDocsHelp('companies', { anchor: '#the-companies-list' })}\n contentGutterX\n contentGutterY\n contentBordered=\"all\"\n HeaderProps={{\n // The record actions, top right and never clipped (AGL-3311).\n action: (\n <CrmListActions>\n <CompanyImportButton hostId={hostId} org={org} />\n <Button size=\"small\" onClick={handleExport} disabled={!companies.length}>\n {'Export CSV'}\n </Button>\n {newCompanyButton}\n </CrmListActions>\n ),\n }}\n >\n <Stack spacing={1.5}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'The organizations your contacts belong to. Open one to see its ' +\n 'people, its deals and its open tasks, or to link a contact ' +\n 'to it.'}\n </Typography>\n {/* The saved view, and the clauses narrowing it as chips (AGL-3313). */}\n <CrmListToolbar label=\"Company filters\">\n <CrmViewsControl controller={views} allLabel=\"All companies\" />\n <ListFilterChips\n fields={COMPANY_GRID_FILTER_FIELDS}\n headers={COMPANY_GRID_FILTER_HEADERS}\n clauses={viewFilters}\n onChange={views.setFilters}\n options={{ ownerUid: ownerOptions }}\n marksServed={false}\n />\n </CrmListToolbar>\n <ListQueryNotices refused={refused} notices={plan.notices} />\n <CompaniesBulkBar\n hostId={hostId}\n scope={scope}\n rows={companies}\n selected={selectedIds}\n onSelectedChange={setSelectedIds}\n members={members}\n csv={csvOptions}\n />\n <CrmColumnOrderProvider value={grid.columnOrder}>\n <ListTable\n rowHeight={TABLE_ROW_HEIGHT}\n columns={grid.columns}\n slots={CRM_LIST_SLOTS}\n rows={companies}\n selectable={{ selected: selectedIds, onChange: setSelectedIds }}\n noRowsLabel={narrowed ? 'No companies match these filters' : 'No companies yet'}\n noRowsDescription={\n narrowed\n ? undefined\n : 'A company groups the contacts who work at one business, with its domain, owner and address. Create the first one, or link a contact to a company from their page.'\n }\n noRowsAction={narrowed ? undefined : newCompanyButton}\n onOpen={(id) => openCompany(String(id))}\n // An empty table while the read is in flight reads as \"you have\n // none\" rather than \"these are on their way\".\n loading={!scope || status === 'loading'}\n /*\n * The grid must NOT also filter. The query answers it, so a client\n * pass could only drop rows the query already matched (AGL-3321).\n */\n filterMode=\"server\"\n filterModel={gridFilter.filterModel}\n onFilterModelChange={gridFilter.onFilterModelChange}\n quickFilter\n // Columns and sort are the view's, controlled (AGL-2617).\n columnVisibilityModel={grid.columnVisibilityModel}\n onColumnVisibilityModelChange={grid.onColumnVisibilityModelChange}\n sortModel={grid.sortModel}\n onSortModelChange={grid.onSortModelChange}\n // Paged by the footer below, so the grid must not also slice.\n hideFooter\n />\n </CrmColumnOrderProvider>\n <ListPagination\n page={page}\n pageSize={pageSize}\n rowCount={companies.length}\n hasMore={hasMore}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </Stack>\n {/*\n Mounted only while it is open, so the list pays for none of the\n drawer's state — and a fresh mount is what seeds an empty form.\n */}\n {createOpen ? (\n <CompanyEditDrawer\n open\n onClose={() => setCreateOpen(false)}\n hostId={hostId}\n org={org}\n members={members}\n onSaved={openCompany}\n />\n ) : null}\n </CardDisplay>\n )\n}\nCompaniesSection.displayName = 'CompaniesSection'\n\nexport default CompaniesSection\n"],"names":["CRM_COLLECTIONS","pluginDocsHelp","crmMemberPickerLabel","mdiPlus","CardDisplay","MdiIcon","ListPagination","ListTable","listFilterColumn","ListQueryNotices","listQueryRefusals","useCrmSavedView","useCrmViewGrid","CRM_LIST_SLOTS","CrmColumnOrderProvider","CRM_NEXT_ACTIVITY_FILTER_FIELD","CRM_NEXT_ACTIVITY_FILTER_HEADER","nextActivityColumn","useCrmFoldsScope","useCrmListQuery","ListFilterChips","listFilterGridColumns","useListGridFilter","CrmViewsControl","CrmListActions","CrmListToolbar","TABLE_ROW_HEIGHT","Button","Chip","Stack","Typography","getGridSingleSelectOperators","useRouter","useCallback","useEffect","useMemo","useState","COMPANY_LIST_DECLARATION","COMPANY_LIST_FILTER_FIELDS","COMPANY_PREFIX_SEARCH","useContactFieldDefinitions","useCrmScope","useOrgMemberOptions","companiesCsv","downloadTextFile","crmRoutes","CompaniesBulkBar","CompanyEditDrawer","CompanyImportButton","customFieldColumns","COMPANY_GRID_FILTER_FIELDS","COMPANY_GRID_FILTER_HEADERS","name","ownerUid","column","CompaniesSection","props","hostId","org","basePath","routes","router","scope","orgId","visibleTo","members","companyFields","views","section","viewFilters","state","filters","searchWords","setSearchWords","foldsScope","rows","companies","status","hasMore","page","setPage","pageSize","setPageSize","plan","collection","declaration","clauses","search","prefixSearch","nowMs","Date","now","createOpen","setCreateOpen","selectedIds","setSelectedIds","csvOptions","ownerEmail","emailFor","handleExport","openCompany","id","push","company","columns","field","headerName","flex","minWidth","valueGetter","_value","row","String","renderCell","sx","justifyContent","height","lineHeight","variant","industry","color","noWrap","filterable","sortable","domain","width","align","headerAlign","Number","contactsCount","toLocaleString","tags","join","length","direction","spacing","alignItems","overflow","slice","map","tag","size","label","type","valueOptions","options","option","value","uid","filterOperators","filter","operator","ready","labelFor","updatedAt","seconds","toLocaleDateString","active","ownerOptions","filterColumns","gridFilter","onChange","setFilters","selectFields","words","refused","fields","headers","grid","narrowed","some","word","trim","newCompanyButton","disabled","startIcon","path","onClick","header","help","anchor","contentGutterX","contentGutterY","contentBordered","HeaderProps","action","controller","allLabel","marksServed","notices","selected","onSelectedChange","csv","columnOrder","rowHeight","slots","selectable","noRowsLabel","noRowsDescription","undefined","noRowsAction","onOpen","loading","filterMode","filterModel","onFilterModelChange","quickFilter","columnVisibilityModel","onColumnVisibilityModelChange","sortModel","onSortModelChange","hideFooter","rowCount","onPageChange","onPageSizeChange","open","onClose","onSaved","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/components/companies-section.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n'use client'\n\nimport {\n type AglynOrgBilling,\n CRM_COLLECTIONS,\n type CrmCompany,\n crmPicklistKey,\n pluginDocsHelp,\n crmMemberPickerLabel,\n} from '@aglyn/aglyn'\nimport { mdiPlus } from '@aglyn/shared-data-mdi'\nimport { CardDisplay, MdiIcon } from '@aglyn/shared-ui-jsx'\nimport { ListPagination } from '@aglyn/shared-ui-jsx/components/list-pagination.component'\nimport { ListTable } from '@aglyn/shared-ui-jsx/components/list-table.component'\nimport { listFilterColumn } from '@aglyn/shared-ui-jsx/const/list-grid-filter'\nimport ListQueryNotices, {\n listQueryRefusals,\n} from '@aglyn/shared-ui-jsx/components/list-query-notices.component'\nimport { useCrmSavedView } from '../hooks/use-crm-saved-view'\nimport { useCrmViewGrid } from '../hooks/use-crm-view-grid'\nimport { CRM_LIST_SLOTS, CrmColumnOrderProvider } from './crm-column-menu'\nimport {\n CRM_NEXT_ACTIVITY_FILTER_FIELD,\n CRM_NEXT_ACTIVITY_FILTER_HEADER,\n nextActivityColumn,\n} from './crm-next-activity-column'\nimport { useCrmFoldsScope, useCrmListQuery } from '../hooks/use-crm-list-query'\nimport ListFilterChips from '@aglyn/shared-ui-jsx/components/list-filter-chips.component'\nimport { listFilterGridColumns } from '@aglyn/shared-ui-jsx/const/list-grid-filter'\nimport { useListGridFilter } from '@aglyn/shared-ui-jsx/hooks/use-list-grid-filter'\nimport CrmViewsControl from './crm-views-control'\nimport { CrmListActions, CrmListToolbar } from './crm-list-toolbar'\nimport { TABLE_ROW_HEIGHT } from '@aglyn/shared-ui-jsx/const/table-pagination'\nimport { Button, Chip, Stack, Typography } from '@mui/material'\nimport {\n getGridSingleSelectOperators,\n type GridColDef,\n} from '@mui/x-data-grid'\nimport { useRouter } from 'next/navigation'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\nimport {\n COMPANY_LIST_DECLARATION,\n COMPANY_LIST_FILTER_FIELDS,\n COMPANY_PICKLIST_FILTERS,\n COMPANY_PREFIX_SEARCH,\n} from '../constants/company-filters'\nimport { useCompanyPicklists } from '../hooks/use-company-picklists'\nimport { formatMoney } from '../model/deal-board-model'\nimport { useContactFieldDefinitions } from '../hooks/use-contact-field-definitions'\nimport { useCrmScope } from '../hooks/use-crm-scope'\nimport { useOrgMemberOptions } from '../hooks/use-org-member-options'\nimport { CRM_COMPANIES_RESOURCE } from '../transfer/fields'\nimport { crmRoutes } from '../model/crm-routes'\nimport CompaniesBulkBar from './companies-bulk-bar'\nimport CompanyEditDrawer from './company-edit-drawer'\nimport { CrmExportButton, CrmImportButton } from './crm-transfer-buttons'\nimport { customFieldColumns } from './contact-custom-columns'\n\nexport interface CompaniesSectionProps {\n /** The site the list is read under, or `null` at the organization level. */\n hostId: string | null\n org?: Partial<AglynOrgBilling>\n /** The CRM hub URL, which every company route hangs beneath. */\n basePath: string\n}\n\ntype CompanyRow = Partial<CrmCompany> & { $id: string; updatedAt?: any }\n\n/** What the companies grid's panel offers — every field the query asks. */\nconst COMPANY_GRID_FILTER_FIELDS = COMPANY_LIST_FILTER_FIELDS\nconst COMPANY_GRID_FILTER_HEADERS: Readonly<Record<string, string>> = {\n name: 'Company',\n ownerUid: 'Owner',\n [CRM_NEXT_ACTIVITY_FILTER_FIELD.column]: CRM_NEXT_ACTIVITY_FILTER_HEADER,\n ...Object.fromEntries(COMPANY_PICKLIST_FILTERS.map((entry) => [entry.column, entry.header])),\n}\n\n/** The grid's select columns — the owner and each picklist — as the filter hook names them. */\nconst COMPANY_SELECT_FIELDS = ['ownerUid', ...COMPANY_PICKLIST_FILTERS.map((entry) => entry.column)]\n\n/**\n * Salesforce's Account columns (AGL-3514), optional: a reader turns one on\n * from the column menu, and a view that shows it stores it by name.\n */\nconst COMPANY_HIDDEN_COLUMNS: Readonly<Record<string, boolean>> = {\n type: false,\n industry: false,\n rating: false,\n accountSource: false,\n numberOfEmployees: false,\n annualRevenueCents: false,\n}\n\n/** A text cell that reads as a dash when empty. */\nfunction textCell(value: unknown) {\n const text = value === null || value === undefined ? '' : String(value)\n return text ? (\n <Typography variant=\"body2\" noWrap>\n {text}\n </Typography>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'—'}\n </Typography>\n )\n}\n\n/**\n * `/crm/companies` — the organizations behind the people (AGL-2597).\n *\n * A section of its own rather than a column on the contact list, because a\n * company is known by several contacts and carries records of its own: a\n * domain the email suggestion keys on, an address, an owner, and the deals\n * and tasks filed against it. The row opens `/crm/companies/{id}`, where all\n * of that lives; this list is the cheaper surface and reads nothing a row\n * does not show.\n *\n * ## What the listener carries\n *\n * Paged and ordered by the server — `updatedAt desc`, so a company somebody\n * just touched is on page one — and SCOPED by the same `visibleTo\n * array-contains-any` predicate the contact list runs. That predicate is what\n * the rules evaluate: a filtered query is provable per document, and an\n * unfiltered one is refused rather than quietly returning the whole org's\n * accounts to a site that may see one client's.\n *\n * ## What a filter may be\n *\n * Every clause and the search word are on the one query (AGL-3321): the\n * search reads the name's and the domain's word prefixes, the name is also\n * an exact match and a prefix, the owner a choice from the roster, and \"No\n * next activity\" a `null` — each reaching the whole collection, which is\n * the property a filter must have: a company on page four is found, not\n * reported missing. `COMPANY_LIST_DECLARATION` states what the query asks.\n *\n * ## Creating is a drawer\n *\n * \"New company\" opens the same eight-field drawer the company's page edits\n * with, and the new record's page opens when it is saved. A form above a\n * list has nowhere to grow, and this one has an address in it.\n *\n * ## Selection, the bar and the file (AGL-2621)\n *\n * The rows are selectable, and a selection raises `CompaniesBulkBar` over\n * the table. Import and Export open the console's import wizard and\n * export dialog on `crm.companies` (AGL-3527): the export over the\n * selection, the list's own query, or every company.\n */\nexport function CompaniesSection(props: CompaniesSectionProps) {\n const { hostId, org, basePath } = props\n const routes = crmRoutes(basePath)\n const router = useRouter()\n const { scope, orgId, visibleTo } = useCrmScope({ hostId, org })\n /*\n * The team, read once for this surface: the Owner column names a person\n * from a uid, and the create drawer picks from the same roster. One fetch\n * serves both, which is why the drawer takes it as a prop.\n */\n const members = useOrgMemberOptions(orgId)\n // The org's company fields, for the optional columns below (AGL-2661).\n const companyFields = useContactFieldDefinitions(orgId, 'company')\n // The lists behind Type, Industry and Rating, for their filters (AGL-3514).\n const picklists = useCompanyPicklists(orgId)\n\n /*\n * The clauses are the saved VIEW'S (AGL-2617), beside its columns and\n * sort; the grid's panel and the chips edit them, and the query answers\n * every one and the search word together (AGL-3321).\n */\n const views = useCrmSavedView({ section: 'companies', hostId, org, basePath })\n const viewFilters = views.state.filters\n const [searchWords, setSearchWords] = useState<string[]>([])\n const foldsScope = useCrmFoldsScope(orgId, visibleTo)\n const {\n rows: companies,\n status,\n hasMore,\n page,\n setPage,\n pageSize,\n setPageSize,\n plan,\n } = useCrmListQuery<CompanyRow>({\n scope,\n collection: CRM_COLLECTIONS.companies,\n visibleTo,\n foldsScope,\n declaration: COMPANY_LIST_DECLARATION,\n clauses: viewFilters,\n search: searchWords,\n prefixSearch: COMPANY_PREFIX_SEARCH,\n })\n const nowMs = useMemo(() => Date.now(), [])\n\n const [createOpen, setCreateOpen] = useState(false)\n const [selectedIds, setSelectedIds] = useState<string[]>([])\n // A filter, a search or a page is a different set of rows.\n useEffect(() => setSelectedIds([]), [plan, page])\n // The list's filter, when one narrows it, for the export to read the same\n // records the list does (AGL-3527).\n const exportFilter = useMemo(\n () => (plan.served.length || plan.searched ? { label: 'what the list shows', plan } : null),\n [plan],\n )\n const openCompany = useCallback(\n (id: string) => router.push(routes.company(id)),\n [router, routes],\n )\n\n const columns: GridColDef[] = useMemo(\n () => [\n {\n field: 'name',\n headerName: 'Company',\n flex: 1.6,\n minWidth: 240,\n ...listFilterColumn(COMPANY_LIST_FILTER_FIELDS, 'name'),\n valueGetter: (_value, row: CompanyRow) => String(row.name ?? ''),\n renderCell: ({ row }: { row: CompanyRow }) => (\n <Stack\n sx={{ justifyContent: 'center', height: '100%', lineHeight: 1.25 }}\n >\n <Typography variant=\"body2\" sx={{ lineHeight: 1.25 }}>\n {row.name}\n </Typography>\n {row.industry ? (\n <Typography\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{ lineHeight: 1.25 }}\n noWrap\n >\n {row.industry}\n </Typography>\n ) : null}\n </Stack>\n ),\n },\n {\n field: 'domain',\n headerName: 'Domain',\n flex: 1,\n minWidth: 160,\n // Stored normalized, so it could be filtered exactly — but a domain\n // lookup is what the company suggestion on a contact does, and a\n // filter here would need an index of its own for one more way to\n // find a row the name filter already finds.\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) => String(row.domain ?? ''),\n renderCell: ({ row }: { row: CompanyRow }) =>\n row.domain ? (\n <Typography variant=\"body2\">{row.domain}</Typography>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'—'}\n </Typography>\n ),\n },\n {\n field: 'contactsCount',\n headerName: 'Contacts',\n width: 110,\n align: 'right',\n headerAlign: 'right',\n /*\n * The denormalized count every link moves (AGL-2613) — a stored\n * number, so a page of companies costs no read per row. Absent on a\n * company nobody has linked since the counter existed, which reads\n * as zero; the company's own page takes the live aggregate.\n */\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) => Number(row.contactsCount ?? 0),\n renderCell: ({ row }: { row: CompanyRow }) => (\n <Typography\n variant=\"body2\"\n color={row.contactsCount ? 'text.primary' : 'text.secondary'}\n >\n {Number(row.contactsCount ?? 0).toLocaleString()}\n </Typography>\n ),\n },\n {\n field: 'tags',\n headerName: 'Tags',\n flex: 1,\n minWidth: 140,\n // Written by the drawer and the bulk bar (AGL-2621); read here, not\n // filtered — a tag filter would need an `array-contains` index of\n // its own beside the scope predicate.\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) => (row.tags ?? []).join(', '),\n renderCell: ({ row }: { row: CompanyRow }) =>\n row.tags?.length ? (\n <Stack direction=\"row\" spacing={0.5} sx={{ alignItems: 'center', overflow: 'hidden' }}>\n {row.tags.slice(0, 3).map((tag) => (\n <Chip key={tag} size=\"small\" variant=\"outlined\" label={tag} />\n ))}\n {row.tags.length > 3 ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {`+${row.tags.length - 3}`}\n </Typography>\n ) : null}\n </Stack>\n ) : (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'—'}\n </Typography>\n ),\n },\n {\n field: 'ownerUid',\n headerName: 'Owner',\n flex: 1,\n minWidth: 160,\n sortable: false,\n /*\n * A CHOICE from the roster, not a text box for a uid. The grid's\n * single-select `is` operator is what the panel offers; the handler\n * below maps it onto the declared field's `equals`, which the\n * translator turns into the equality the index serves.\n */\n type: 'singleSelect',\n valueOptions: members.options.map((option) => ({\n value: option.uid,\n label: crmMemberPickerLabel(option),\n })),\n filterable: members.options.length > 0,\n filterOperators: getGridSingleSelectOperators().filter(\n (operator) => operator.value === 'is',\n ),\n valueGetter: (_value, row: CompanyRow) => String(row.ownerUid ?? ''),\n renderCell: ({ row }: { row: CompanyRow }) => (\n <Typography\n variant=\"body2\"\n color={row.ownerUid ? 'text.primary' : 'text.secondary'}\n >\n {row.ownerUid\n ? members.ready\n ? members.labelFor(row.ownerUid)\n : '…'\n : '—'}\n </Typography>\n ),\n },\n {\n field: 'updatedAt',\n headerName: 'Updated',\n flex: 0.8,\n minWidth: 140,\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) =>\n row.updatedAt?.seconds ? new Date(row.updatedAt.seconds * 1000) : null,\n renderCell: ({ row }: { row: CompanyRow }) => (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {row.updatedAt?.seconds\n ? new Date(row.updatedAt.seconds * 1000).toLocaleDateString()\n : '—'}\n </Typography>\n ),\n },\n // When the earliest open task against the company is due (AGL-2661).\n nextActivityColumn(nowMs),\n // Salesforce's Account fields (AGL-3514), each optional. Type, Industry\n // and Rating filter by the key stored beside the label; the rest read.\n ...COMPANY_PICKLIST_FILTERS.map(\n (entry): GridColDef => ({\n field: entry.column,\n headerName: entry.header,\n flex: 0.8,\n minWidth: 130,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) =>\n crmPicklistKey(row[entry.column as 'type' | 'industry' | 'rating']) ?? '',\n renderCell: ({ row }: { row: CompanyRow }) =>\n textCell(row[entry.column as 'type' | 'industry' | 'rating']),\n }),\n ),\n {\n field: 'accountSource',\n headerName: 'Account source',\n flex: 0.8,\n minWidth: 140,\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) => String(row.accountSource ?? ''),\n renderCell: ({ row }: { row: CompanyRow }) => textCell(row.accountSource),\n },\n {\n field: 'numberOfEmployees',\n headerName: 'Employees',\n width: 120,\n align: 'right',\n headerAlign: 'right',\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) =>\n typeof row.numberOfEmployees === 'number' ? row.numberOfEmployees : null,\n renderCell: ({ row }: { row: CompanyRow }) =>\n textCell(\n typeof row.numberOfEmployees === 'number' ? row.numberOfEmployees.toLocaleString() : '',\n ),\n },\n {\n field: 'annualRevenueCents',\n headerName: 'Annual revenue',\n width: 150,\n align: 'right',\n headerAlign: 'right',\n filterable: false,\n sortable: false,\n valueGetter: (_value, row: CompanyRow) =>\n typeof row.annualRevenueCents === 'number' ? row.annualRevenueCents : null,\n renderCell: ({ row }: { row: CompanyRow }) =>\n textCell(\n typeof row.annualRevenueCents === 'number'\n ? formatMoney(row.annualRevenueCents, row.currency)\n : '',\n ),\n },\n // The org's company fields as optional columns (AGL-2661), read off\n // the row's own `custom` map the way the contacts list reads its own.\n ...customFieldColumns(companyFields.active),\n ],\n [members, companyFields.active, nowMs],\n )\n\n /*\n * The grid's own Filters panel and quick search edit the view's clauses\n * (AGL-3313); the query answers them all (AGL-3321).\n */\n const ownerOptions = useMemo(\n () =>\n members.options.map((option) => ({\n value: option.uid,\n label: crmMemberPickerLabel(option),\n })),\n [members.options],\n )\n /*\n * Each picklist's choices (AGL-3514): every value the org keeps, valued\n * by the key the query compares and captioned by the label, inactive\n * ones marked. A stored clause naming a key no longer listed stays a\n * choice, so the panel can show it and clear it.\n */\n const filterOptions = useMemo(() => {\n const options: Record<string, Array<{ value: string; label: string }>> = {\n ownerUid: ownerOptions,\n }\n for (const entry of COMPANY_PICKLIST_FILTERS) {\n const list = picklists.lists[entry.picklistId]\n const known = (list?.values ?? []).flatMap((value) => {\n const key = crmPicklistKey(value.label)\n return key ? [{ value: key, label: value.active ? value.label : `${value.label} (inactive)` }] : []\n })\n const stale = viewFilters\n .filter((clause) => clause.field === entry.column)\n .flatMap((clause) => clause.value.split(','))\n .map((value) => value.trim())\n .filter((value) => value && !known.some((option) => option.value === value))\n .map((value) => ({ value, label: value }))\n options[entry.column] = [...known, ...stale]\n }\n return options\n }, [ownerOptions, picklists.lists, viewFilters])\n const filterColumns = useMemo(\n () =>\n listFilterGridColumns(columns, COMPANY_GRID_FILTER_FIELDS, filterOptions, COMPANY_GRID_FILTER_HEADERS),\n [columns, filterOptions],\n )\n const gridFilter = useListGridFilter({\n clauses: viewFilters,\n onChange: views.setFilters,\n selectFields: COMPANY_SELECT_FIELDS,\n search: { words: searchWords, onChange: setSearchWords },\n })\n // What the query could not hold, named by the clause the reader set.\n const refused = useMemo(\n () =>\n listQueryRefusals(plan.refused, {\n fields: COMPANY_GRID_FILTER_FIELDS,\n headers: COMPANY_GRID_FILTER_HEADERS,\n options: filterOptions,\n }),\n [plan.refused, filterOptions],\n )\n /*\n * The grid's models are the view's (AGL-2617). The filter model shows the\n * view's clause in the panel as a typed one would appear — the owner's\n * stored `equals` back as the single-select `is` the panel offers — so a\n * view opened from its address reads as filtered, not as a mystery.\n */\n const grid = useCrmViewGrid(views, filterColumns, COMPANY_HIDDEN_COLUMNS)\n\n /** Whether anything narrows the list, so an empty one is \"no match\", not \"none yet\". */\n const narrowed = viewFilters.length > 0 || searchWords.some((word) => word.trim())\n\n const newCompanyButton = (\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"primary\"\n disabled={!scope}\n startIcon={<MdiIcon path={mdiPlus.path} size={0.8} />}\n onClick={() => setCreateOpen(true)}\n >\n {'New company'}\n </Button>\n )\n\n return (\n <CardDisplay\n header={'Companies'}\n help={pluginDocsHelp('companies', { anchor: '#the-companies-list' })}\n contentGutterX\n contentGutterY\n contentBordered=\"all\"\n HeaderProps={{\n // The record actions, top right and never clipped (AGL-3311).\n action: (\n <CrmListActions>\n <CrmImportButton resource={CRM_COMPANIES_RESOURCE} noun=\"companies\" hostId={hostId} mappingZone=\"companies\" />\n <CrmExportButton resource={CRM_COMPANIES_RESOURCE} hostId={hostId} filter={exportFilter} />\n {newCompanyButton}\n </CrmListActions>\n ),\n }}\n >\n <Stack spacing={1.5}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {'The organizations your contacts belong to. Open one to see its ' +\n 'people, its deals and its open tasks, or to link a contact ' +\n 'to it.'}\n </Typography>\n {/* The saved view, and the clauses narrowing it as chips (AGL-3313). */}\n <CrmListToolbar label=\"Company filters\">\n <CrmViewsControl controller={views} allLabel=\"All companies\" />\n <ListFilterChips\n fields={COMPANY_GRID_FILTER_FIELDS}\n headers={COMPANY_GRID_FILTER_HEADERS}\n clauses={viewFilters}\n onChange={views.setFilters}\n options={filterOptions}\n marksServed={false}\n />\n </CrmListToolbar>\n <ListQueryNotices refused={refused} notices={plan.notices} />\n <CompaniesBulkBar\n hostId={hostId}\n scope={scope}\n rows={companies}\n selected={selectedIds}\n onSelectedChange={setSelectedIds}\n members={members}\n />\n <CrmColumnOrderProvider value={grid.columnOrder}>\n <ListTable\n rowHeight={TABLE_ROW_HEIGHT}\n columns={grid.columns}\n slots={CRM_LIST_SLOTS}\n rows={companies}\n selectable={{ selected: selectedIds, onChange: setSelectedIds }}\n noRowsLabel={narrowed ? 'No companies match these filters' : 'No companies yet'}\n noRowsDescription={\n narrowed\n ? undefined\n : 'A company groups the contacts who work at one business, with its domain, owner and address. Create the first one, or link a contact to a company from their page.'\n }\n noRowsAction={narrowed ? undefined : newCompanyButton}\n onOpen={(id) => openCompany(String(id))}\n // An empty table while the read is in flight reads as \"you have\n // none\" rather than \"these are on their way\".\n loading={!scope || status === 'loading'}\n /*\n * The grid must NOT also filter. The query answers it, so a client\n * pass could only drop rows the query already matched (AGL-3321).\n */\n filterMode=\"server\"\n filterModel={gridFilter.filterModel}\n onFilterModelChange={gridFilter.onFilterModelChange}\n quickFilter\n // Columns and sort are the view's, controlled (AGL-2617).\n columnVisibilityModel={grid.columnVisibilityModel}\n onColumnVisibilityModelChange={grid.onColumnVisibilityModelChange}\n sortModel={grid.sortModel}\n onSortModelChange={grid.onSortModelChange}\n // Paged by the footer below, so the grid must not also slice.\n hideFooter\n />\n </CrmColumnOrderProvider>\n <ListPagination\n page={page}\n pageSize={pageSize}\n rowCount={companies.length}\n hasMore={hasMore}\n onPageChange={setPage}\n onPageSizeChange={setPageSize}\n />\n </Stack>\n {/*\n Mounted only while it is open, so the list pays for none of the\n drawer's state — and a fresh mount is what seeds an empty form.\n */}\n {createOpen ? (\n <CompanyEditDrawer\n open\n onClose={() => setCreateOpen(false)}\n hostId={hostId}\n org={org}\n members={members}\n onSaved={openCompany}\n />\n ) : null}\n </CardDisplay>\n )\n}\nCompaniesSection.displayName = 'CompaniesSection'\n\nexport default CompaniesSection\n"],"names":["CRM_COLLECTIONS","crmPicklistKey","pluginDocsHelp","crmMemberPickerLabel","mdiPlus","CardDisplay","MdiIcon","ListPagination","ListTable","listFilterColumn","ListQueryNotices","listQueryRefusals","useCrmSavedView","useCrmViewGrid","CRM_LIST_SLOTS","CrmColumnOrderProvider","CRM_NEXT_ACTIVITY_FILTER_FIELD","CRM_NEXT_ACTIVITY_FILTER_HEADER","nextActivityColumn","useCrmFoldsScope","useCrmListQuery","ListFilterChips","listFilterGridColumns","useListGridFilter","CrmViewsControl","CrmListActions","CrmListToolbar","TABLE_ROW_HEIGHT","Button","Chip","Stack","Typography","getGridSingleSelectOperators","useRouter","useCallback","useEffect","useMemo","useState","COMPANY_LIST_DECLARATION","COMPANY_LIST_FILTER_FIELDS","COMPANY_PICKLIST_FILTERS","COMPANY_PREFIX_SEARCH","useCompanyPicklists","formatMoney","useContactFieldDefinitions","useCrmScope","useOrgMemberOptions","CRM_COMPANIES_RESOURCE","crmRoutes","CompaniesBulkBar","CompanyEditDrawer","CrmExportButton","CrmImportButton","customFieldColumns","COMPANY_GRID_FILTER_FIELDS","COMPANY_GRID_FILTER_HEADERS","name","ownerUid","column","Object","fromEntries","map","entry","header","COMPANY_SELECT_FIELDS","COMPANY_HIDDEN_COLUMNS","type","industry","rating","accountSource","numberOfEmployees","annualRevenueCents","textCell","value","text","undefined","String","variant","noWrap","color","CompaniesSection","props","hostId","org","basePath","routes","router","scope","orgId","visibleTo","members","companyFields","picklists","views","section","viewFilters","state","filters","searchWords","setSearchWords","foldsScope","rows","companies","status","hasMore","page","setPage","pageSize","setPageSize","plan","collection","declaration","clauses","search","prefixSearch","nowMs","Date","now","createOpen","setCreateOpen","selectedIds","setSelectedIds","exportFilter","served","length","searched","label","openCompany","id","push","company","columns","field","headerName","flex","minWidth","valueGetter","_value","row","renderCell","sx","justifyContent","height","lineHeight","filterable","sortable","domain","width","align","headerAlign","Number","contactsCount","toLocaleString","tags","join","direction","spacing","alignItems","overflow","slice","tag","size","valueOptions","options","option","uid","filterOperators","filter","operator","ready","labelFor","updatedAt","seconds","toLocaleDateString","currency","active","ownerOptions","filterOptions","list","lists","picklistId","known","values","flatMap","key","stale","clause","split","trim","some","filterColumns","gridFilter","onChange","setFilters","selectFields","words","refused","fields","headers","grid","narrowed","word","newCompanyButton","disabled","startIcon","path","onClick","help","anchor","contentGutterX","contentGutterY","contentBordered","HeaderProps","action","resource","noun","mappingZone","controller","allLabel","marksServed","notices","selected","onSelectedChange","columnOrder","rowHeight","slots","selectable","noRowsLabel","noRowsDescription","noRowsAction","onOpen","loading","filterMode","filterModel","onFilterModelChange","quickFilter","columnVisibilityModel","onColumnVisibilityModelChange","sortModel","onSortModelChange","hideFooter","rowCount","onPageChange","onPageSizeChange","open","onClose","onSaved","displayName"],"mappings":"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"}
|