@open-mercato/core 0.5.1-develop.2663.2c29774b5b → 0.5.1-develop.2681.c559bb2bc3
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/.turbo/turbo-build.log +1 -1
- package/dist/generated/entities/action_log/index.js +8 -0
- package/dist/generated/entities/action_log/index.js.map +2 -2
- package/dist/generated/entities/customer_company_billing/index.js +23 -0
- package/dist/generated/entities/customer_company_billing/index.js.map +7 -0
- package/dist/generated/entities/customer_deal/index.js +8 -0
- package/dist/generated/entities/customer_deal/index.js.map +2 -2
- package/dist/generated/entities/customer_deal_stage_transition/index.js +31 -0
- package/dist/generated/entities/customer_deal_stage_transition/index.js.map +7 -0
- package/dist/generated/entities/customer_dictionary_kind_setting/index.js +21 -0
- package/dist/generated/entities/customer_dictionary_kind_setting/index.js.map +7 -0
- package/dist/generated/entities/customer_entity/index.js +8 -0
- package/dist/generated/entities/customer_entity/index.js.map +2 -2
- package/dist/generated/entities/customer_entity_role/index.js +23 -0
- package/dist/generated/entities/customer_entity_role/index.js.map +7 -0
- package/dist/generated/entities/customer_interaction/index.js +23 -1
- package/dist/generated/entities/customer_interaction/index.js.map +2 -2
- package/dist/generated/entities/customer_label/index.js +19 -0
- package/dist/generated/entities/customer_label/index.js.map +7 -0
- package/dist/generated/entities/customer_label_assignment/index.js +17 -0
- package/dist/generated/entities/customer_label_assignment/index.js.map +7 -0
- package/dist/generated/entities/customer_person_company_link/index.js +21 -0
- package/dist/generated/entities/customer_person_company_link/index.js.map +7 -0
- package/dist/generated/entities/customer_person_company_role/index.js +17 -0
- package/dist/generated/entities/customer_person_company_role/index.js.map +7 -0
- package/dist/generated/entities/dictionary_entry/index.js +4 -0
- package/dist/generated/entities/dictionary_entry/index.js.map +2 -2
- package/dist/generated/entities.ids.generated.js +9 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +116 -1
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/modules/attachments/api/route.js +46 -8
- package/dist/modules/attachments/api/route.js.map +2 -2
- package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js +208 -0
- package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js.map +7 -0
- package/dist/modules/audit_logs/api/audit-logs/actions/route.js +52 -6
- package/dist/modules/audit_logs/api/audit-logs/actions/route.js.map +2 -2
- package/dist/modules/audit_logs/cli.js +62 -0
- package/dist/modules/audit_logs/cli.js.map +7 -0
- package/dist/modules/audit_logs/data/entities.js +21 -1
- package/dist/modules/audit_logs/data/entities.js.map +2 -2
- package/dist/modules/audit_logs/data/validators.js +9 -1
- package/dist/modules/audit_logs/data/validators.js.map +2 -2
- package/dist/modules/audit_logs/lib/changeRows.js +34 -0
- package/dist/modules/audit_logs/lib/changeRows.js.map +7 -0
- package/dist/modules/audit_logs/lib/display-helpers.js +2 -20
- package/dist/modules/audit_logs/lib/display-helpers.js.map +3 -3
- package/dist/modules/audit_logs/lib/projections.js +58 -0
- package/dist/modules/audit_logs/lib/projections.js.map +7 -0
- package/dist/modules/audit_logs/migrations/Migration20260412160533.js +21 -0
- package/dist/modules/audit_logs/migrations/Migration20260412160533.js.map +7 -0
- package/dist/modules/audit_logs/services/actionLogService.js +313 -79
- package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
- package/dist/modules/customers/acl.js +3 -1
- package/dist/modules/customers/acl.js.map +2 -2
- package/dist/modules/customers/api/activities/route.js +4 -0
- package/dist/modules/customers/api/activities/route.js.map +2 -2
- package/dist/modules/customers/api/assignable-staff/route.js +208 -0
- package/dist/modules/customers/api/assignable-staff/route.js.map +7 -0
- package/dist/modules/customers/api/companies/[id]/people/route.js +205 -0
- package/dist/modules/customers/api/companies/[id]/people/route.js.map +7 -0
- package/dist/modules/customers/api/companies/[id]/roles/route.js +22 -0
- package/dist/modules/customers/api/companies/[id]/roles/route.js.map +7 -0
- package/dist/modules/customers/api/companies/[id]/route.js +374 -32
- package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/companies/route.js +82 -7
- package/dist/modules/customers/api/companies/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/companies/route.js +172 -0
- package/dist/modules/customers/api/deals/[id]/companies/route.js.map +7 -0
- package/dist/modules/customers/api/deals/[id]/people/route.js +156 -0
- package/dist/modules/customers/api/deals/[id]/people/route.js.map +7 -0
- package/dist/modules/customers/api/deals/[id]/route.js +459 -53
- package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/deals/[id]/stats/route.js +195 -0
- package/dist/modules/customers/api/deals/[id]/stats/route.js.map +7 -0
- package/dist/modules/customers/api/deals/route.js +20 -10
- package/dist/modules/customers/api/deals/route.js.map +3 -3
- package/dist/modules/customers/api/dictionaries/[kind]/[id]/route.js +105 -4
- package/dist/modules/customers/api/dictionaries/[kind]/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/dictionaries/[kind]/route.js +118 -42
- package/dist/modules/customers/api/dictionaries/[kind]/route.js.map +2 -2
- package/dist/modules/customers/api/dictionaries/context.js +30 -6
- package/dist/modules/customers/api/dictionaries/context.js.map +2 -2
- package/dist/modules/customers/api/dictionaries/kind-settings/route.js +207 -0
- package/dist/modules/customers/api/dictionaries/kind-settings/route.js.map +7 -0
- package/dist/modules/customers/api/entity-roles-factory.js +471 -0
- package/dist/modules/customers/api/entity-roles-factory.js.map +7 -0
- package/dist/modules/customers/api/interactions/conflicts/route.js +158 -0
- package/dist/modules/customers/api/interactions/conflicts/route.js.map +7 -0
- package/dist/modules/customers/api/interactions/counts/route.js +92 -0
- package/dist/modules/customers/api/interactions/counts/route.js.map +7 -0
- package/dist/modules/customers/api/interactions/route.js +83 -4
- package/dist/modules/customers/api/interactions/route.js.map +2 -2
- package/dist/modules/customers/api/labels/assign/route.js +189 -0
- package/dist/modules/customers/api/labels/assign/route.js.map +7 -0
- package/dist/modules/customers/api/labels/auth.js +17 -0
- package/dist/modules/customers/api/labels/auth.js.map +7 -0
- package/dist/modules/customers/api/labels/route.js +281 -0
- package/dist/modules/customers/api/labels/route.js.map +7 -0
- package/dist/modules/customers/api/labels/table-errors.js +38 -0
- package/dist/modules/customers/api/labels/table-errors.js.map +7 -0
- package/dist/modules/customers/api/labels/unassign/route.js +184 -0
- package/dist/modules/customers/api/labels/unassign/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js +292 -0
- package/dist/modules/customers/api/people/[id]/companies/[linkId]/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/companies/context.js +66 -0
- package/dist/modules/customers/api/people/[id]/companies/context.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +334 -0
- package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/companies/route.js +205 -0
- package/dist/modules/customers/api/people/[id]/companies/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/roles/route.js +22 -0
- package/dist/modules/customers/api/people/[id]/roles/route.js.map +7 -0
- package/dist/modules/customers/api/people/[id]/route.js +134 -21
- package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
- package/dist/modules/customers/api/people/route.js +122 -23
- package/dist/modules/customers/api/people/route.js.map +2 -2
- package/dist/modules/customers/api/todos/route.js +4 -0
- package/dist/modules/customers/api/todos/route.js.map +2 -2
- package/dist/modules/customers/api/utils.js +22 -0
- package/dist/modules/customers/api/utils.js.map +2 -2
- package/dist/modules/customers/backend/config/customers/page.js +2 -6
- package/dist/modules/customers/backend/config/customers/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies/page.js +37 -26
- package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +265 -262
- package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +3 -3
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/formatters.js +23 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/formatters.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/types.js +1 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/types.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js +43 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.js +264 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.js +88 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealData.js +41 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealData.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js +66 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealInjectedTabs.js +39 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealInjectedTabs.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealMutationContext.js +49 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealMutationContext.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealPipeline.js +43 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealPipeline.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useScheduleDialog.js +28 -0
- package/dist/modules/customers/backend/customers/deals/[id]/hooks/useScheduleDialog.js.map +7 -0
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +556 -503
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +3 -3
- package/dist/modules/customers/backend/customers/deals/page.js +66 -21
- package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people/page.js +36 -28
- package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +318 -203
- package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +3 -3
- package/dist/modules/customers/cli.js +105 -13
- package/dist/modules/customers/cli.js.map +2 -2
- package/dist/modules/customers/commands/activities.js +6 -0
- package/dist/modules/customers/commands/activities.js.map +2 -2
- package/dist/modules/customers/commands/deals.js +315 -107
- package/dist/modules/customers/commands/deals.js.map +2 -2
- package/dist/modules/customers/commands/dictionaries.js +166 -32
- package/dist/modules/customers/commands/dictionaries.js.map +2 -2
- package/dist/modules/customers/commands/dictionaryKindSettings.js +208 -0
- package/dist/modules/customers/commands/dictionaryKindSettings.js.map +7 -0
- package/dist/modules/customers/commands/entity-roles.js +415 -0
- package/dist/modules/customers/commands/entity-roles.js.map +7 -0
- package/dist/modules/customers/commands/index.js +4 -0
- package/dist/modules/customers/commands/index.js.map +2 -2
- package/dist/modules/customers/commands/interactions.js +108 -21
- package/dist/modules/customers/commands/interactions.js.map +2 -2
- package/dist/modules/customers/commands/labels.js +539 -0
- package/dist/modules/customers/commands/labels.js.map +7 -0
- package/dist/modules/customers/commands/people.js +560 -463
- package/dist/modules/customers/commands/people.js.map +3 -3
- package/dist/modules/customers/commands/personCompanyLinks.js +568 -0
- package/dist/modules/customers/commands/personCompanyLinks.js.map +7 -0
- package/dist/modules/customers/commands/shared.js +12 -4
- package/dist/modules/customers/commands/shared.js.map +2 -2
- package/dist/modules/customers/commands/todos.js +10 -1
- package/dist/modules/customers/commands/todos.js.map +2 -2
- package/dist/modules/customers/components/AddressEditor.js +1 -1
- package/dist/modules/customers/components/AddressEditor.js.map +2 -2
- package/dist/modules/customers/components/CustomersConfigurationSections.js +31 -0
- package/dist/modules/customers/components/CustomersConfigurationSections.js.map +7 -0
- package/dist/modules/customers/components/DictionarySettings.js +37 -2
- package/dist/modules/customers/components/DictionarySettings.js.map +2 -2
- package/dist/modules/customers/components/detail/ActiveDealCard.js +121 -0
- package/dist/modules/customers/components/detail/ActiveDealCard.js.map +7 -0
- package/dist/modules/customers/components/detail/ActivitiesSection.js +222 -331
- package/dist/modules/customers/components/detail/ActivitiesSection.js.map +3 -3
- package/dist/modules/customers/components/detail/ActivityAiActions.js +36 -0
- package/dist/modules/customers/components/detail/ActivityAiActions.js.map +7 -0
- package/dist/modules/customers/components/detail/ActivityCard.js +126 -0
- package/dist/modules/customers/components/detail/ActivityCard.js.map +7 -0
- package/dist/modules/customers/components/detail/ActivityHistorySection.js +340 -0
- package/dist/modules/customers/components/detail/ActivityHistorySection.js.map +7 -0
- package/dist/modules/customers/components/detail/ActivityLogTab.js +56 -0
- package/dist/modules/customers/components/detail/ActivityLogTab.js.map +7 -0
- package/dist/modules/customers/components/detail/ActivityTimeline.js +108 -0
- package/dist/modules/customers/components/detail/ActivityTimeline.js.map +7 -0
- package/dist/modules/customers/components/detail/ActivityTimelineFilters.js +139 -0
- package/dist/modules/customers/components/detail/ActivityTimelineFilters.js.map +7 -0
- package/dist/modules/customers/components/detail/ActivityTypeSelector.js +42 -0
- package/dist/modules/customers/components/detail/ActivityTypeSelector.js.map +7 -0
- package/dist/modules/customers/components/detail/AiActionChips.js +38 -0
- package/dist/modules/customers/components/detail/AiActionChips.js.map +7 -0
- package/dist/modules/customers/components/detail/AssignRoleDialog.js +534 -0
- package/dist/modules/customers/components/detail/AssignRoleDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js +79 -0
- package/dist/modules/customers/components/detail/ChangelogEntryRow.js.map +7 -0
- package/dist/modules/customers/components/detail/ChangelogFilters.js +176 -0
- package/dist/modules/customers/components/detail/ChangelogFilters.js.map +7 -0
- package/dist/modules/customers/components/detail/ChangelogKpiCards.js +88 -0
- package/dist/modules/customers/components/detail/ChangelogKpiCards.js.map +7 -0
- package/dist/modules/customers/components/detail/ChangelogTab.js +470 -0
- package/dist/modules/customers/components/detail/ChangelogTab.js.map +7 -0
- package/dist/modules/customers/components/detail/ComingSoonPlaceholder.js +16 -0
- package/dist/modules/customers/components/detail/ComingSoonPlaceholder.js.map +7 -0
- package/dist/modules/customers/components/detail/CompanyCard.js +283 -0
- package/dist/modules/customers/components/detail/CompanyCard.js.map +7 -0
- package/dist/modules/customers/components/detail/CompanyDashboardTab.js +133 -0
- package/dist/modules/customers/components/detail/CompanyDashboardTab.js.map +7 -0
- package/dist/modules/customers/components/detail/CompanyDetailHeader.js +191 -0
- package/dist/modules/customers/components/detail/CompanyDetailHeader.js.map +7 -0
- package/dist/modules/customers/components/detail/CompanyDetailTabs.js +123 -0
- package/dist/modules/customers/components/detail/CompanyDetailTabs.js.map +7 -0
- package/dist/modules/customers/components/detail/CompanyKpiBar.js +174 -0
- package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +7 -0
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js +514 -230
- package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
- package/dist/modules/customers/components/detail/CompanyTagsDialog.js +22 -0
- package/dist/modules/customers/components/detail/CompanyTagsDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +159 -0
- package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/CreatePersonDialog.js +135 -0
- package/dist/modules/customers/components/detail/CreatePersonDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/DealClosureActionBar.js +59 -0
- package/dist/modules/customers/components/detail/DealClosureActionBar.js.map +7 -0
- package/dist/modules/customers/components/detail/DealDetailHeader.js +237 -0
- package/dist/modules/customers/components/detail/DealDetailHeader.js.map +7 -0
- package/dist/modules/customers/components/detail/DealDetailTabs.js +109 -0
- package/dist/modules/customers/components/detail/DealDetailTabs.js.map +7 -0
- package/dist/modules/customers/components/detail/DealForm.js +219 -92
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/detail/DealLinkedEntitiesTab.js +295 -0
- package/dist/modules/customers/components/detail/DealLinkedEntitiesTab.js.map +7 -0
- package/dist/modules/customers/components/detail/DealLostSummaryDialog.js +107 -0
- package/dist/modules/customers/components/detail/DealLostSummaryDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/DealWonPopup.js +113 -0
- package/dist/modules/customers/components/detail/DealWonPopup.js.map +7 -0
- package/dist/modules/customers/components/detail/DealsSection.js +206 -193
- package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
- package/dist/modules/customers/components/detail/DecisionMakersFooter.js +39 -0
- package/dist/modules/customers/components/detail/DecisionMakersFooter.js.map +7 -0
- package/dist/modules/customers/components/detail/EntityTagsDialog.js +1096 -0
- package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/InlineActivityComposer.js +197 -0
- package/dist/modules/customers/components/detail/InlineActivityComposer.js.map +7 -0
- package/dist/modules/customers/components/detail/ManageTagsDialog.js +1091 -0
- package/dist/modules/customers/components/detail/ManageTagsDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/MiniWeekCalendar.js +272 -0
- package/dist/modules/customers/components/detail/MiniWeekCalendar.js.map +7 -0
- package/dist/modules/customers/components/detail/MobilePersonDetail.js +106 -0
- package/dist/modules/customers/components/detail/MobilePersonDetail.js.map +7 -0
- package/dist/modules/customers/components/detail/NextStepCard.js +72 -0
- package/dist/modules/customers/components/detail/NextStepCard.js.map +7 -0
- package/dist/modules/customers/components/detail/PersonCard.js +192 -0
- package/dist/modules/customers/components/detail/PersonCard.js.map +7 -0
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js +345 -0
- package/dist/modules/customers/components/detail/PersonCompaniesSection.js.map +7 -0
- package/dist/modules/customers/components/detail/PersonDetailHeader.js +220 -0
- package/dist/modules/customers/components/detail/PersonDetailHeader.js.map +7 -0
- package/dist/modules/customers/components/detail/PersonDetailTabs.js +122 -0
- package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +7 -0
- package/dist/modules/customers/components/detail/PersonTagsDialog.js +24 -0
- package/dist/modules/customers/components/detail/PersonTagsDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/PipelineStepper.js +191 -0
- package/dist/modules/customers/components/detail/PipelineStepper.js.map +7 -0
- package/dist/modules/customers/components/detail/PlannedActivitiesSection.js +222 -0
- package/dist/modules/customers/components/detail/PlannedActivitiesSection.js.map +7 -0
- package/dist/modules/customers/components/detail/RelationshipHealthCard.js +49 -0
- package/dist/modules/customers/components/detail/RelationshipHealthCard.js.map +7 -0
- package/dist/modules/customers/components/detail/RoleAssignmentRow.js +189 -0
- package/dist/modules/customers/components/detail/RoleAssignmentRow.js.map +7 -0
- package/dist/modules/customers/components/detail/RolesSection.js +234 -0
- package/dist/modules/customers/components/detail/RolesSection.js.map +7 -0
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +410 -0
- package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +7 -0
- package/dist/modules/customers/components/detail/aiActionCatalog.js +41 -0
- package/dist/modules/customers/components/detail/aiActionCatalog.js.map +7 -0
- package/dist/modules/customers/components/detail/assignableStaff.js +48 -0
- package/dist/modules/customers/components/detail/assignableStaff.js.map +7 -0
- package/dist/modules/customers/components/detail/dashboard/ActiveDealWidget.js +48 -0
- package/dist/modules/customers/components/detail/dashboard/ActiveDealWidget.js.map +7 -0
- package/dist/modules/customers/components/detail/dashboard/OpenTasksWidget.js +86 -0
- package/dist/modules/customers/components/detail/dashboard/OpenTasksWidget.js.map +7 -0
- package/dist/modules/customers/components/detail/dashboard/RecentActivityWidget.js +53 -0
- package/dist/modules/customers/components/detail/dashboard/RecentActivityWidget.js.map +7 -0
- package/dist/modules/customers/components/detail/dashboard/RelationshipHealthWidget.js +30 -0
- package/dist/modules/customers/components/detail/dashboard/RelationshipHealthWidget.js.map +7 -0
- package/dist/modules/customers/components/detail/dashboard/UpcomingMeetingsWidget.js +43 -0
- package/dist/modules/customers/components/detail/dashboard/UpcomingMeetingsWidget.js.map +7 -0
- package/dist/modules/customers/components/detail/dashboard/helpers.js +71 -0
- package/dist/modules/customers/components/detail/dashboard/helpers.js.map +7 -0
- package/dist/modules/customers/components/detail/healthScoreUtils.js +69 -0
- package/dist/modules/customers/components/detail/healthScoreUtils.js.map +7 -0
- package/dist/modules/customers/components/detail/hooks/useCurrencyDictionary.js +5 -5
- package/dist/modules/customers/components/detail/hooks/useCurrencyDictionary.js.map +2 -2
- package/dist/modules/customers/components/detail/hooks/useCustomerDictionary.js +9 -8
- package/dist/modules/customers/components/detail/hooks/useCustomerDictionary.js.map +3 -3
- package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js +65 -0
- package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js.map +7 -0
- package/dist/modules/customers/components/detail/notesAdapter.js +70 -30
- package/dist/modules/customers/components/detail/notesAdapter.js.map +2 -2
- package/dist/modules/customers/components/detail/pipelineStageUtils.js +26 -0
- package/dist/modules/customers/components/detail/pipelineStageUtils.js.map +7 -0
- package/dist/modules/customers/components/detail/schedule/DateTimeFields.js +144 -0
- package/dist/modules/customers/components/detail/schedule/DateTimeFields.js.map +7 -0
- package/dist/modules/customers/components/detail/schedule/FooterFields.js +60 -0
- package/dist/modules/customers/components/detail/schedule/FooterFields.js.map +7 -0
- package/dist/modules/customers/components/detail/schedule/LinkedEntitiesField.js +216 -0
- package/dist/modules/customers/components/detail/schedule/LinkedEntitiesField.js.map +7 -0
- package/dist/modules/customers/components/detail/schedule/LocationField.js +34 -0
- package/dist/modules/customers/components/detail/schedule/LocationField.js.map +7 -0
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js +226 -0
- package/dist/modules/customers/components/detail/schedule/ParticipantsField.js.map +7 -0
- package/dist/modules/customers/components/detail/schedule/fieldConfig.js +69 -0
- package/dist/modules/customers/components/detail/schedule/fieldConfig.js.map +7 -0
- package/dist/modules/customers/components/detail/schedule/index.js +21 -0
- package/dist/modules/customers/components/detail/schedule/index.js.map +7 -0
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +172 -0
- package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +7 -0
- package/dist/modules/customers/components/detail/utils.js +23 -0
- package/dist/modules/customers/components/detail/utils.js.map +2 -2
- package/dist/modules/customers/components/formConfig.js +144 -22
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/customers/components/linking/LinkEntityDialog.js +661 -0
- package/dist/modules/customers/components/linking/LinkEntityDialog.js.map +7 -0
- package/dist/modules/customers/components/linking/adapters/companyAdapter.js +252 -0
- package/dist/modules/customers/components/linking/adapters/companyAdapter.js.map +7 -0
- package/dist/modules/customers/components/linking/adapters/dealAdapter.js +384 -0
- package/dist/modules/customers/components/linking/adapters/dealAdapter.js.map +7 -0
- package/dist/modules/customers/components/linking/adapters/personAdapter.js +324 -0
- package/dist/modules/customers/components/linking/adapters/personAdapter.js.map +7 -0
- package/dist/modules/customers/components/list/CollectionPreviewCell.js +53 -0
- package/dist/modules/customers/components/list/CollectionPreviewCell.js.map +7 -0
- package/dist/modules/customers/data/entities.js +407 -1
- package/dist/modules/customers/data/entities.js.map +2 -2
- package/dist/modules/customers/data/validators.js +139 -21
- package/dist/modules/customers/data/validators.js.map +2 -2
- package/dist/modules/customers/events.js +19 -1
- package/dist/modules/customers/events.js.map +2 -2
- package/dist/modules/customers/lib/customerRoleTypes.js +19 -0
- package/dist/modules/customers/lib/customerRoleTypes.js.map +7 -0
- package/dist/modules/customers/lib/dealClosureNotification.js +39 -0
- package/dist/modules/customers/lib/dealClosureNotification.js.map +7 -0
- package/dist/modules/customers/lib/dealStageTransitionTable.js +29 -0
- package/dist/modules/customers/lib/dealStageTransitionTable.js.map +7 -0
- package/dist/modules/customers/lib/dictionaries.js +25 -0
- package/dist/modules/customers/lib/dictionaries.js.map +2 -2
- package/dist/modules/customers/lib/interactionReadModel.js +10 -0
- package/dist/modules/customers/lib/interactionReadModel.js.map +2 -2
- package/dist/modules/customers/lib/personCompanies.js +235 -0
- package/dist/modules/customers/lib/personCompanies.js.map +7 -0
- package/dist/modules/customers/lib/personCompanyLinkTable.js +42 -0
- package/dist/modules/customers/lib/personCompanyLinkTable.js.map +7 -0
- package/dist/modules/customers/lib/roleTypeUsage.js +104 -0
- package/dist/modules/customers/lib/roleTypeUsage.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260406214502.js +18 -0
- package/dist/modules/customers/migrations/Migration20260406214502.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260408135736.js +17 -0
- package/dist/modules/customers/migrations/Migration20260408135736.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260408225345.js +21 -0
- package/dist/modules/customers/migrations/Migration20260408225345.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260411075533.js +27 -0
- package/dist/modules/customers/migrations/Migration20260411075533.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260411103551.js +13 -0
- package/dist/modules/customers/migrations/Migration20260411103551.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260411130944.js +26 -0
- package/dist/modules/customers/migrations/Migration20260411130944.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260415095203.js +13 -0
- package/dist/modules/customers/migrations/Migration20260415095203.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260415135056.js +20 -0
- package/dist/modules/customers/migrations/Migration20260415135056.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260417140000.js +15 -0
- package/dist/modules/customers/migrations/Migration20260417140000.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260417160000.js +17 -0
- package/dist/modules/customers/migrations/Migration20260417160000.js.map +7 -0
- package/dist/modules/customers/migrations/Migration20260417235407.js +13 -0
- package/dist/modules/customers/migrations/Migration20260417235407.js.map +7 -0
- package/dist/modules/customers/setup.js +16 -1
- package/dist/modules/customers/setup.js.map +2 -2
- package/dist/modules/customers/subscribers/deal-closure-notification.js +16 -0
- package/dist/modules/customers/subscribers/deal-closure-notification.js.map +7 -0
- package/dist/modules/customers/subscribers/deal-lost-notification.js +16 -0
- package/dist/modules/customers/subscribers/deal-lost-notification.js.map +7 -0
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js +2 -0
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js.map +2 -2
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.js +154 -0
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.js.map +7 -0
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js +6 -2
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js.map +2 -2
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.js +154 -0
- package/dist/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.js.map +7 -0
- package/dist/modules/dictionaries/api/context.js +8 -1
- package/dist/modules/dictionaries/api/context.js.map +2 -2
- package/dist/modules/dictionaries/api/openapi.js +18 -1
- package/dist/modules/dictionaries/api/openapi.js.map +2 -2
- package/dist/modules/dictionaries/commands/entry-operations.js +388 -0
- package/dist/modules/dictionaries/commands/entry-operations.js.map +7 -0
- package/dist/modules/dictionaries/commands/factory.js +24 -3
- package/dist/modules/dictionaries/commands/factory.js.map +2 -2
- package/dist/modules/dictionaries/commands/index.js +1 -0
- package/dist/modules/dictionaries/commands/index.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryTable.js +6 -3
- package/dist/modules/dictionaries/components/DictionaryTable.js.map +2 -2
- package/dist/modules/dictionaries/data/entities.js +11 -1
- package/dist/modules/dictionaries/data/entities.js.map +2 -2
- package/dist/modules/dictionaries/data/validators.js +28 -2
- package/dist/modules/dictionaries/data/validators.js.map +2 -2
- package/dist/modules/dictionaries/events.js +18 -0
- package/dist/modules/dictionaries/events.js.map +7 -0
- package/dist/modules/dictionaries/lib/clientEntries.js +43 -0
- package/dist/modules/dictionaries/lib/clientEntries.js.map +7 -0
- package/dist/modules/dictionaries/migrations/Migration20260410171544.js +45 -0
- package/dist/modules/dictionaries/migrations/Migration20260410171544.js.map +7 -0
- package/dist/modules/inbox_ops/api/proposals/[id]/route.js +4 -1
- package/dist/modules/inbox_ops/api/proposals/[id]/route.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +1 -1
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/dist/modules/sales/components/documents/AddressesSection.js +82 -42
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/lib/dictionaries.js +16 -0
- package/dist/modules/sales/lib/dictionaries.js.map +2 -2
- package/dist/modules/sales/widgets/injection-table.js +5 -1
- package/dist/modules/sales/widgets/injection-table.js.map +2 -2
- package/generated/entities/action_log/index.ts +4 -0
- package/generated/entities/customer_company_billing/index.ts +10 -0
- package/generated/entities/customer_deal/index.ts +4 -0
- package/generated/entities/customer_deal_stage_transition/index.ts +14 -0
- package/generated/entities/customer_dictionary_kind_setting/index.ts +9 -0
- package/generated/entities/customer_entity/index.ts +4 -0
- package/generated/entities/customer_entity_role/index.ts +10 -0
- package/generated/entities/customer_interaction/index.ts +11 -0
- package/generated/entities/customer_label/index.ts +8 -0
- package/generated/entities/customer_label_assignment/index.ts +7 -0
- package/generated/entities/customer_person_company_link/index.ts +9 -0
- package/generated/entities/customer_person_company_role/index.ts +7 -0
- package/generated/entities/dictionary_entry/index.ts +2 -0
- package/generated/entities.ids.generated.ts +9 -1
- package/generated/entity-fields-registry.ts +116 -1
- package/package.json +3 -3
- package/src/modules/attachments/api/route.ts +48 -6
- package/src/modules/attachments/i18n/de.json +4 -0
- package/src/modules/attachments/i18n/en.json +4 -0
- package/src/modules/attachments/i18n/es.json +4 -0
- package/src/modules/attachments/i18n/pl.json +4 -0
- package/src/modules/audit_logs/api/audit-logs/actions/export/route.ts +260 -0
- package/src/modules/audit_logs/api/audit-logs/actions/route.ts +81 -6
- package/src/modules/audit_logs/cli.ts +79 -0
- package/src/modules/audit_logs/data/entities.ts +17 -0
- package/src/modules/audit_logs/data/validators.ts +9 -1
- package/src/modules/audit_logs/lib/changeRows.ts +47 -0
- package/src/modules/audit_logs/lib/display-helpers.tsx +4 -30
- package/src/modules/audit_logs/lib/projections.ts +110 -0
- package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +325 -2
- package/src/modules/audit_logs/migrations/Migration20260412160533.ts +21 -0
- package/src/modules/audit_logs/services/actionLogService.ts +455 -85
- package/src/modules/catalog/i18n/de.json +1 -0
- package/src/modules/catalog/i18n/en.json +1 -0
- package/src/modules/catalog/i18n/es.json +1 -0
- package/src/modules/catalog/i18n/pl.json +1 -0
- package/src/modules/customer_accounts/i18n/de.json +2 -0
- package/src/modules/customer_accounts/i18n/en.json +2 -0
- package/src/modules/customer_accounts/i18n/es.json +2 -0
- package/src/modules/customer_accounts/i18n/pl.json +2 -0
- package/src/modules/customers/acl.ts +2 -0
- package/src/modules/customers/api/activities/route.ts +4 -0
- package/src/modules/customers/api/assignable-staff/route.ts +250 -0
- package/src/modules/customers/api/companies/[id]/people/route.ts +244 -0
- package/src/modules/customers/api/companies/[id]/roles/route.ts +15 -0
- package/src/modules/customers/api/companies/[id]/route.ts +458 -40
- package/src/modules/customers/api/companies/route.ts +93 -15
- package/src/modules/customers/api/deals/[id]/companies/route.ts +203 -0
- package/src/modules/customers/api/deals/[id]/people/route.ts +182 -0
- package/src/modules/customers/api/deals/[id]/route.ts +554 -57
- package/src/modules/customers/api/deals/[id]/stats/route.ts +221 -0
- package/src/modules/customers/api/deals/route.ts +35 -46
- package/src/modules/customers/api/dictionaries/[kind]/[id]/route.ts +105 -3
- package/src/modules/customers/api/dictionaries/[kind]/route.ts +143 -44
- package/src/modules/customers/api/dictionaries/context.ts +45 -16
- package/src/modules/customers/api/dictionaries/kind-settings/route.ts +232 -0
- package/src/modules/customers/api/entity-roles-factory.ts +520 -0
- package/src/modules/customers/api/interactions/conflicts/route.ts +196 -0
- package/src/modules/customers/api/interactions/counts/route.ts +112 -0
- package/src/modules/customers/api/interactions/route.ts +95 -2
- package/src/modules/customers/api/labels/assign/route.ts +202 -0
- package/src/modules/customers/api/labels/auth.ts +19 -0
- package/src/modules/customers/api/labels/route.ts +310 -0
- package/src/modules/customers/api/labels/table-errors.ts +36 -0
- package/src/modules/customers/api/labels/unassign/route.ts +197 -0
- package/src/modules/customers/api/people/[id]/companies/[linkId]/route.ts +331 -0
- package/src/modules/customers/api/people/[id]/companies/context.ts +70 -0
- package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +384 -0
- package/src/modules/customers/api/people/[id]/companies/route.ts +215 -0
- package/src/modules/customers/api/people/[id]/roles/route.ts +15 -0
- package/src/modules/customers/api/people/[id]/route.ts +153 -26
- package/src/modules/customers/api/people/route.ts +134 -31
- package/src/modules/customers/api/todos/route.ts +4 -0
- package/src/modules/customers/api/utils.ts +36 -0
- package/src/modules/customers/backend/config/customers/page.tsx +2 -6
- package/src/modules/customers/backend/customers/companies/page.tsx +36 -26
- package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +277 -262
- package/src/modules/customers/backend/customers/deals/[id]/hooks/formatters.ts +19 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/types.ts +104 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.ts +60 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.ts +362 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.ts +113 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealData.ts +52 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealFormHandlers.ts +86 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealInjectedTabs.tsx +60 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealMutationContext.ts +76 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealPipeline.ts +56 -0
- package/src/modules/customers/backend/customers/deals/[id]/hooks/useScheduleDialog.ts +38 -0
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +587 -624
- package/src/modules/customers/backend/customers/deals/page.tsx +71 -28
- package/src/modules/customers/backend/customers/people/page.tsx +35 -29
- package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +343 -209
- package/src/modules/customers/cli.ts +107 -12
- package/src/modules/customers/commands/activities.ts +13 -0
- package/src/modules/customers/commands/deals.ts +386 -114
- package/src/modules/customers/commands/dictionaries.ts +175 -32
- package/src/modules/customers/commands/dictionaryKindSettings.ts +268 -0
- package/src/modules/customers/commands/entity-roles.ts +494 -0
- package/src/modules/customers/commands/index.ts +4 -0
- package/src/modules/customers/commands/interactions.ts +125 -21
- package/src/modules/customers/commands/labels.ts +626 -0
- package/src/modules/customers/commands/people.ts +373 -259
- package/src/modules/customers/commands/personCompanyLinks.ts +654 -0
- package/src/modules/customers/commands/shared.ts +16 -15
- package/src/modules/customers/commands/todos.ts +17 -1
- package/src/modules/customers/components/AddressEditor.tsx +1 -1
- package/src/modules/customers/components/CustomersConfigurationSections.tsx +36 -0
- package/src/modules/customers/components/DictionarySettings.tsx +43 -2
- package/src/modules/customers/components/detail/ActiveDealCard.tsx +175 -0
- package/src/modules/customers/components/detail/ActivitiesSection.tsx +267 -361
- package/src/modules/customers/components/detail/ActivityAiActions.tsx +49 -0
- package/src/modules/customers/components/detail/ActivityCard.tsx +154 -0
- package/src/modules/customers/components/detail/ActivityHistorySection.tsx +412 -0
- package/src/modules/customers/components/detail/ActivityLogTab.tsx +67 -0
- package/src/modules/customers/components/detail/ActivityTimeline.tsx +158 -0
- package/src/modules/customers/components/detail/ActivityTimelineFilters.tsx +163 -0
- package/src/modules/customers/components/detail/ActivityTypeSelector.tsx +53 -0
- package/src/modules/customers/components/detail/AiActionChips.tsx +48 -0
- package/src/modules/customers/components/detail/AssignRoleDialog.tsx +672 -0
- package/src/modules/customers/components/detail/ChangelogEntryRow.tsx +132 -0
- package/src/modules/customers/components/detail/ChangelogFilters.tsx +193 -0
- package/src/modules/customers/components/detail/ChangelogKpiCards.tsx +107 -0
- package/src/modules/customers/components/detail/ChangelogTab.tsx +629 -0
- package/src/modules/customers/components/detail/ComingSoonPlaceholder.tsx +21 -0
- package/src/modules/customers/components/detail/CompanyCard.tsx +419 -0
- package/src/modules/customers/components/detail/CompanyDashboardTab.tsx +161 -0
- package/src/modules/customers/components/detail/CompanyDetailHeader.tsx +243 -0
- package/src/modules/customers/components/detail/CompanyDetailTabs.tsx +172 -0
- package/src/modules/customers/components/detail/CompanyKpiBar.tsx +206 -0
- package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +582 -288
- package/src/modules/customers/components/detail/CompanyTagsDialog.tsx +23 -0
- package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +210 -0
- package/src/modules/customers/components/detail/CreatePersonDialog.tsx +178 -0
- package/src/modules/customers/components/detail/DealClosureActionBar.tsx +63 -0
- package/src/modules/customers/components/detail/DealDetailHeader.tsx +335 -0
- package/src/modules/customers/components/detail/DealDetailTabs.tsx +154 -0
- package/src/modules/customers/components/detail/DealForm.tsx +253 -101
- package/src/modules/customers/components/detail/DealLinkedEntitiesTab.tsx +349 -0
- package/src/modules/customers/components/detail/DealLostSummaryDialog.tsx +156 -0
- package/src/modules/customers/components/detail/DealWonPopup.tsx +164 -0
- package/src/modules/customers/components/detail/DealsSection.tsx +276 -221
- package/src/modules/customers/components/detail/DecisionMakersFooter.tsx +56 -0
- package/src/modules/customers/components/detail/EntityTagsDialog.tsx +1372 -0
- package/src/modules/customers/components/detail/InlineActivityComposer.tsx +239 -0
- package/src/modules/customers/components/detail/ManageTagsDialog.tsx +1331 -0
- package/src/modules/customers/components/detail/MiniWeekCalendar.tsx +338 -0
- package/src/modules/customers/components/detail/MobilePersonDetail.tsx +124 -0
- package/src/modules/customers/components/detail/NextStepCard.tsx +104 -0
- package/src/modules/customers/components/detail/PersonCard.tsx +238 -0
- package/src/modules/customers/components/detail/PersonCompaniesSection.tsx +426 -0
- package/src/modules/customers/components/detail/PersonDetailHeader.tsx +294 -0
- package/src/modules/customers/components/detail/PersonDetailTabs.tsx +172 -0
- package/src/modules/customers/components/detail/PersonTagsDialog.tsx +26 -0
- package/src/modules/customers/components/detail/PipelineStepper.tsx +245 -0
- package/src/modules/customers/components/detail/PlannedActivitiesSection.tsx +255 -0
- package/src/modules/customers/components/detail/RelationshipHealthCard.tsx +63 -0
- package/src/modules/customers/components/detail/RoleAssignmentRow.tsx +248 -0
- package/src/modules/customers/components/detail/RolesSection.tsx +311 -0
- package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +481 -0
- package/src/modules/customers/components/detail/aiActionCatalog.ts +77 -0
- package/src/modules/customers/components/detail/assignableStaff.ts +124 -0
- package/src/modules/customers/components/detail/dashboard/ActiveDealWidget.tsx +63 -0
- package/src/modules/customers/components/detail/dashboard/OpenTasksWidget.tsx +114 -0
- package/src/modules/customers/components/detail/dashboard/RecentActivityWidget.tsx +69 -0
- package/src/modules/customers/components/detail/dashboard/RelationshipHealthWidget.tsx +40 -0
- package/src/modules/customers/components/detail/dashboard/UpcomingMeetingsWidget.tsx +64 -0
- package/src/modules/customers/components/detail/dashboard/helpers.ts +78 -0
- package/src/modules/customers/components/detail/healthScoreUtils.ts +91 -0
- package/src/modules/customers/components/detail/hooks/useCurrencyDictionary.ts +8 -8
- package/src/modules/customers/components/detail/hooks/useCustomerDictionary.ts +10 -6
- package/src/modules/customers/components/detail/hooks/useInteractionMutations.ts +91 -0
- package/src/modules/customers/components/detail/notesAdapter.ts +91 -30
- package/src/modules/customers/components/detail/pipelineStageUtils.ts +29 -0
- package/src/modules/customers/components/detail/schedule/DateTimeFields.tsx +187 -0
- package/src/modules/customers/components/detail/schedule/FooterFields.tsx +79 -0
- package/src/modules/customers/components/detail/schedule/LinkedEntitiesField.tsx +277 -0
- package/src/modules/customers/components/detail/schedule/LocationField.tsx +42 -0
- package/src/modules/customers/components/detail/schedule/ParticipantsField.tsx +255 -0
- package/src/modules/customers/components/detail/schedule/fieldConfig.ts +70 -0
- package/src/modules/customers/components/detail/schedule/index.ts +9 -0
- package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +221 -0
- package/src/modules/customers/components/detail/types.ts +16 -0
- package/src/modules/customers/components/detail/utils.ts +25 -0
- package/src/modules/customers/components/formConfig.tsx +223 -28
- package/src/modules/customers/components/linking/LinkEntityDialog.tsx +920 -0
- package/src/modules/customers/components/linking/adapters/companyAdapter.tsx +398 -0
- package/src/modules/customers/components/linking/adapters/dealAdapter.tsx +578 -0
- package/src/modules/customers/components/linking/adapters/personAdapter.tsx +512 -0
- package/src/modules/customers/components/list/CollectionPreviewCell.tsx +66 -0
- package/src/modules/customers/data/entities.ts +353 -1
- package/src/modules/customers/data/validators.ts +170 -19
- package/src/modules/customers/events.ts +22 -0
- package/src/modules/customers/i18n/de.json +841 -2
- package/src/modules/customers/i18n/en.json +841 -2
- package/src/modules/customers/i18n/es.json +840 -1
- package/src/modules/customers/i18n/pl.json +841 -2
- package/src/modules/customers/lib/customerRoleTypes.ts +24 -0
- package/src/modules/customers/lib/dealClosureNotification.ts +64 -0
- package/src/modules/customers/lib/dealStageTransitionTable.ts +32 -0
- package/src/modules/customers/lib/dictionaries.ts +26 -10
- package/src/modules/customers/lib/interactionReadModel.ts +10 -0
- package/src/modules/customers/lib/personCompanies.ts +317 -0
- package/src/modules/customers/lib/personCompanyLinkTable.ts +58 -0
- package/src/modules/customers/lib/roleTypeUsage.ts +146 -0
- package/src/modules/customers/migrations/.snapshot-open-mercato.json +2747 -798
- package/src/modules/customers/migrations/Migration20260406214502.ts +19 -0
- package/src/modules/customers/migrations/Migration20260408135736.ts +15 -0
- package/src/modules/customers/migrations/Migration20260408225345.ts +23 -0
- package/src/modules/customers/migrations/Migration20260411075533.ts +30 -0
- package/src/modules/customers/migrations/Migration20260411103551.ts +13 -0
- package/src/modules/customers/migrations/Migration20260411130944.ts +30 -0
- package/src/modules/customers/migrations/Migration20260415095203.ts +13 -0
- package/src/modules/customers/migrations/Migration20260415135056.ts +22 -0
- package/src/modules/customers/migrations/Migration20260417140000.ts +15 -0
- package/src/modules/customers/migrations/Migration20260417160000.ts +17 -0
- package/src/modules/customers/migrations/Migration20260417235407.ts +13 -0
- package/src/modules/customers/setup.ts +15 -0
- package/src/modules/customers/subscribers/deal-closure-notification.ts +22 -0
- package/src/modules/customers/subscribers/deal-lost-notification.ts +22 -0
- package/src/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.ts +2 -0
- package/src/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.ts +162 -0
- package/src/modules/dictionaries/api/[dictionaryId]/entries/route.ts +6 -2
- package/src/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.ts +162 -0
- package/src/modules/dictionaries/api/context.ts +9 -0
- package/src/modules/dictionaries/api/openapi.ts +17 -0
- package/src/modules/dictionaries/commands/entry-operations.ts +457 -0
- package/src/modules/dictionaries/commands/factory.ts +31 -3
- package/src/modules/dictionaries/commands/index.ts +1 -0
- package/src/modules/dictionaries/components/DictionaryTable.tsx +15 -6
- package/src/modules/dictionaries/data/entities.ts +9 -0
- package/src/modules/dictionaries/data/validators.ts +34 -0
- package/src/modules/dictionaries/events.ts +20 -0
- package/src/modules/dictionaries/i18n/de.json +2 -0
- package/src/modules/dictionaries/i18n/en.json +2 -0
- package/src/modules/dictionaries/i18n/es.json +2 -0
- package/src/modules/dictionaries/i18n/pl.json +2 -0
- package/src/modules/dictionaries/lib/clientEntries.ts +66 -0
- package/src/modules/dictionaries/migrations/.snapshot-open-mercato.json +185 -3
- package/src/modules/dictionaries/migrations/Migration20260410171544.ts +49 -0
- package/src/modules/inbox_ops/api/proposals/[id]/route.ts +4 -1
- package/src/modules/query_index/lib/engine.ts +9 -1
- package/src/modules/sales/components/documents/AddressesSection.tsx +92 -42
- package/src/modules/sales/i18n/de.json +28 -0
- package/src/modules/sales/i18n/en.json +28 -0
- package/src/modules/sales/i18n/es.json +28 -0
- package/src/modules/sales/i18n/pl.json +28 -0
- package/src/modules/sales/lib/dictionaries.ts +18 -0
- package/src/modules/sales/widgets/injection-table.ts +4 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "next/link";
|
|
4
|
+
import {
|
|
5
|
+
Building2,
|
|
6
|
+
Clock,
|
|
7
|
+
Copy,
|
|
8
|
+
CreditCard,
|
|
9
|
+
ExternalLink,
|
|
10
|
+
FileText,
|
|
11
|
+
Hash,
|
|
12
|
+
MapPin,
|
|
13
|
+
TrendingUp,
|
|
14
|
+
Zap,
|
|
15
|
+
Tag as TagIcon,
|
|
16
|
+
Users
|
|
17
|
+
} from "lucide-react";
|
|
18
|
+
import { Badge } from "@open-mercato/ui/primitives/badge";
|
|
19
|
+
import { IconButton } from "@open-mercato/ui/primitives/icon-button";
|
|
20
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
21
|
+
import { flash } from "@open-mercato/ui/backend/FlashMessages";
|
|
22
|
+
import { renderDictionaryIcon } from "../../../dictionaries/components/dictionaryAppearance.js";
|
|
23
|
+
import { formatFallbackLabel } from "./utils.js";
|
|
24
|
+
function copyToClipboard(text, t) {
|
|
25
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
26
|
+
flash(t("customers.companies.detail.copied", "Copied to clipboard"), "success");
|
|
27
|
+
}).catch((err) => console.warn("[CompanyCard] clipboard write failed", err));
|
|
28
|
+
}
|
|
29
|
+
function formatRelativeTime(isoDate, t) {
|
|
30
|
+
const date = new Date(isoDate);
|
|
31
|
+
const now = /* @__PURE__ */ new Date();
|
|
32
|
+
const diffMs = now.getTime() - date.getTime();
|
|
33
|
+
const diffDays = Math.floor(diffMs / (1e3 * 60 * 60 * 24));
|
|
34
|
+
if (diffDays === 0) {
|
|
35
|
+
return `${t("customers.companies.detail.relativeTime.today", "today")}, ${date.toLocaleTimeString(void 0, { hour: "2-digit", minute: "2-digit" })}`;
|
|
36
|
+
}
|
|
37
|
+
if (diffDays === 1) return t("customers.companies.detail.relativeTime.oneDayAgo", "1 day ago");
|
|
38
|
+
if (diffDays < 7) return t("customers.companies.detail.relativeTime.daysAgo", "{{days}} days ago", { days: diffDays });
|
|
39
|
+
if (diffDays < 30) return t("customers.companies.detail.relativeTime.weeksAgo", "{{weeks}} wk. ago", { weeks: Math.floor(diffDays / 7) });
|
|
40
|
+
return t("customers.companies.detail.relativeTime.monthsAgo", "{{months}} mo. ago", { months: Math.floor(diffDays / 30) });
|
|
41
|
+
}
|
|
42
|
+
function formatCurrency(amount, currency) {
|
|
43
|
+
try {
|
|
44
|
+
return new Intl.NumberFormat(void 0, {
|
|
45
|
+
style: "currency",
|
|
46
|
+
currency,
|
|
47
|
+
maximumFractionDigits: 0,
|
|
48
|
+
notation: amount >= 1e6 ? "compact" : "standard"
|
|
49
|
+
}).format(amount);
|
|
50
|
+
} catch {
|
|
51
|
+
if (amount >= 1e6) return `${(amount / 1e6).toFixed(2)} M ${currency}`;
|
|
52
|
+
if (amount >= 1e3) return `${Math.round(amount / 1e3)}k ${currency}`;
|
|
53
|
+
return `${amount} ${currency}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function ColorBadge({
|
|
57
|
+
value,
|
|
58
|
+
map,
|
|
59
|
+
fallbackIcon
|
|
60
|
+
}) {
|
|
61
|
+
const entry = map?.[value];
|
|
62
|
+
const color = entry?.color ?? null;
|
|
63
|
+
const icon = entry?.icon ?? null;
|
|
64
|
+
const label = entry?.label ?? formatFallbackLabel(value);
|
|
65
|
+
const colorStyle = color ? { color, borderColor: color, backgroundColor: `${color}1A` } : void 0;
|
|
66
|
+
return /* @__PURE__ */ jsxs(
|
|
67
|
+
Badge,
|
|
68
|
+
{
|
|
69
|
+
variant: "outline",
|
|
70
|
+
className: "rounded-sm gap-1.5 text-xs font-medium",
|
|
71
|
+
style: colorStyle,
|
|
72
|
+
children: [
|
|
73
|
+
icon ? renderDictionaryIcon(icon, "size-2.5") : fallbackIcon ?? null,
|
|
74
|
+
label
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
function StatusDotBadge({
|
|
80
|
+
value,
|
|
81
|
+
map
|
|
82
|
+
}) {
|
|
83
|
+
const entry = map?.[value];
|
|
84
|
+
const color = entry?.color ?? null;
|
|
85
|
+
const label = entry?.label ?? formatFallbackLabel(value);
|
|
86
|
+
const colorStyle = color ? { color, borderColor: color, backgroundColor: `${color}1A` } : void 0;
|
|
87
|
+
return /* @__PURE__ */ jsxs(
|
|
88
|
+
Badge,
|
|
89
|
+
{
|
|
90
|
+
variant: "outline",
|
|
91
|
+
className: "rounded-sm gap-1.5 text-xs font-medium",
|
|
92
|
+
style: colorStyle,
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ jsx(
|
|
95
|
+
"span",
|
|
96
|
+
{
|
|
97
|
+
className: "size-1.5 rounded-full",
|
|
98
|
+
style: color ? { backgroundColor: color } : void 0
|
|
99
|
+
}
|
|
100
|
+
),
|
|
101
|
+
label
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
function BillingRow({
|
|
107
|
+
icon: Icon,
|
|
108
|
+
label,
|
|
109
|
+
value,
|
|
110
|
+
showCopy = true,
|
|
111
|
+
showDottedLine = true,
|
|
112
|
+
t
|
|
113
|
+
}) {
|
|
114
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-wrap items-center gap-1.5 min-h-[22px]", children: [
|
|
115
|
+
/* @__PURE__ */ jsx(Icon, { className: "size-3 shrink-0 text-muted-foreground" }),
|
|
116
|
+
/* @__PURE__ */ jsxs("span", { className: "text-xs text-muted-foreground font-medium shrink-0", children: [
|
|
117
|
+
label,
|
|
118
|
+
":"
|
|
119
|
+
] }),
|
|
120
|
+
showDottedLine && /* @__PURE__ */ jsx("div", { className: "mx-1 hidden flex-1 border-b border-dotted border-border/50 sm:block" }),
|
|
121
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 break-words text-xs font-medium text-foreground", children: value }),
|
|
122
|
+
showCopy && /* @__PURE__ */ jsx(
|
|
123
|
+
IconButton,
|
|
124
|
+
{
|
|
125
|
+
type: "button",
|
|
126
|
+
variant: "ghost",
|
|
127
|
+
size: "sm",
|
|
128
|
+
className: "h-auto shrink-0 text-muted-foreground hover:text-foreground transition-colors p-0",
|
|
129
|
+
onClick: () => copyToClipboard(value, t),
|
|
130
|
+
"aria-label": t("customers.companies.detail.copy", "Copy"),
|
|
131
|
+
children: /* @__PURE__ */ jsx(Copy, { className: "size-2.5" })
|
|
132
|
+
}
|
|
133
|
+
)
|
|
134
|
+
] });
|
|
135
|
+
}
|
|
136
|
+
function CompanyCard({
|
|
137
|
+
data,
|
|
138
|
+
personName,
|
|
139
|
+
statusMap,
|
|
140
|
+
lifecycleMap,
|
|
141
|
+
temperatureMap,
|
|
142
|
+
renewalQuarterMap,
|
|
143
|
+
roleMap
|
|
144
|
+
}) {
|
|
145
|
+
const t = useT();
|
|
146
|
+
const hasBillingSection = data.profile?.legalName || data.primaryAddress?.formatted || data.billing?.bankName || data.billing?.bankAccountMasked || data.billing?.paymentTerms || data.billing?.preferredCurrency;
|
|
147
|
+
const dealValue = data.activeDeal?.valueAmount && data.activeDeal?.valueCurrency ? `${data.activeDeal.valueAmount} ${data.activeDeal.valueCurrency}` : null;
|
|
148
|
+
return /* @__PURE__ */ jsxs("div", { className: "min-w-0 overflow-hidden rounded-2xl border border-border/60 bg-card", children: [
|
|
149
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3 px-5 py-5 sm:flex-row sm:items-center", children: [
|
|
150
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [
|
|
151
|
+
/* @__PURE__ */ jsx("div", { className: "flex size-12 shrink-0 items-center justify-center rounded-xl bg-muted", children: /* @__PURE__ */ jsx(Building2, { className: "size-5 text-muted-foreground" }) }),
|
|
152
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
153
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
154
|
+
/* @__PURE__ */ jsx("span", { className: "break-words text-base font-bold", children: data.displayName }),
|
|
155
|
+
data.isPrimary && /* @__PURE__ */ jsx(Badge, { variant: "default", className: "rounded-sm px-1.5 py-0 text-overline font-bold uppercase tracking-wider", children: "PRIMARY" })
|
|
156
|
+
] }),
|
|
157
|
+
data.subtitle && /* @__PURE__ */ jsx("p", { className: "break-words text-sm text-muted-foreground", children: data.subtitle })
|
|
158
|
+
] })
|
|
159
|
+
] }),
|
|
160
|
+
/* @__PURE__ */ jsx("div", { className: "self-start sm:self-auto", children: /* @__PURE__ */ jsx(Link, { href: `/backend/customers/companies-v2/${data.companyId}`, children: /* @__PURE__ */ jsx(IconButton, { variant: "ghost", size: "sm", type: "button", children: /* @__PURE__ */ jsx(ExternalLink, { className: "size-4" }) }) }) })
|
|
161
|
+
] }),
|
|
162
|
+
/* @__PURE__ */ jsx("div", { className: "border-t border-border/60" }),
|
|
163
|
+
/* @__PURE__ */ jsxs("div", { className: "px-5 py-4 space-y-4", children: [
|
|
164
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-1.5", children: [
|
|
165
|
+
data.profile?.industry && /* @__PURE__ */ jsxs(Badge, { variant: "outline", className: "rounded-sm gap-1.5 text-xs font-medium", children: [
|
|
166
|
+
/* @__PURE__ */ jsx(TagIcon, { className: "size-2.5" }),
|
|
167
|
+
data.profile.industry
|
|
168
|
+
] }),
|
|
169
|
+
data.profile?.sizeBucket && /* @__PURE__ */ jsxs(Badge, { variant: "outline", className: "rounded-sm gap-1.5 text-xs font-medium", children: [
|
|
170
|
+
/* @__PURE__ */ jsx(Users, { className: "size-2.5" }),
|
|
171
|
+
data.profile.sizeBucket,
|
|
172
|
+
" ",
|
|
173
|
+
t("customers.companies.detail.employees", "employees")
|
|
174
|
+
] }),
|
|
175
|
+
data.status && /* @__PURE__ */ jsx(StatusDotBadge, { value: data.status, map: statusMap }),
|
|
176
|
+
data.renewalQuarter && /* @__PURE__ */ jsx(
|
|
177
|
+
ColorBadge,
|
|
178
|
+
{
|
|
179
|
+
value: data.renewalQuarter,
|
|
180
|
+
map: renewalQuarterMap,
|
|
181
|
+
fallbackIcon: /* @__PURE__ */ jsx(Clock, { className: "size-2.5" })
|
|
182
|
+
}
|
|
183
|
+
),
|
|
184
|
+
data.temperature && /* @__PURE__ */ jsx(
|
|
185
|
+
ColorBadge,
|
|
186
|
+
{
|
|
187
|
+
value: data.temperature,
|
|
188
|
+
map: temperatureMap,
|
|
189
|
+
fallbackIcon: /* @__PURE__ */ jsx(Zap, { className: "size-2.5" })
|
|
190
|
+
}
|
|
191
|
+
)
|
|
192
|
+
] }),
|
|
193
|
+
data.roles.length > 0 && /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
194
|
+
/* @__PURE__ */ jsx("span", { className: "text-overline font-bold uppercase tracking-wider text-muted-foreground", children: t("customers.companies.detail.roleInCompany", "ROLE OF {{name}} IN THIS COMPANY", { name: personName.toUpperCase() }) }),
|
|
195
|
+
/* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: data.roles.map((role) => /* @__PURE__ */ jsx(
|
|
196
|
+
ColorBadge,
|
|
197
|
+
{
|
|
198
|
+
value: role.roleValue,
|
|
199
|
+
map: roleMap
|
|
200
|
+
},
|
|
201
|
+
role.id
|
|
202
|
+
)) })
|
|
203
|
+
] }),
|
|
204
|
+
/* @__PURE__ */ jsx("div", { className: "border-t border-border/60" }),
|
|
205
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-3", children: [
|
|
206
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
207
|
+
/* @__PURE__ */ jsx("span", { className: "text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1", children: t("customers.companies.detail.activeDeal", "ACTIVE DEAL") }),
|
|
208
|
+
/* @__PURE__ */ jsx("span", { className: "flex min-w-0 items-center gap-1 text-xs font-medium text-foreground", children: data.activeDeal ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
209
|
+
/* @__PURE__ */ jsx(Building2, { className: "size-3 shrink-0" }),
|
|
210
|
+
/* @__PURE__ */ jsxs("span", { className: "min-w-0 break-words", children: [
|
|
211
|
+
data.activeDeal.title,
|
|
212
|
+
dealValue ? ` \xB7 ${dealValue}` : ""
|
|
213
|
+
] })
|
|
214
|
+
] }) : "\u2014" })
|
|
215
|
+
] }),
|
|
216
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
217
|
+
/* @__PURE__ */ jsx("span", { className: "text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1", children: t("customers.companies.detail.lastContact", "LAST CONTACT") }),
|
|
218
|
+
/* @__PURE__ */ jsx("span", { className: "flex min-w-0 items-center gap-1 break-words text-xs font-medium text-foreground", children: data.lastContactAt ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
219
|
+
/* @__PURE__ */ jsx(Clock, { className: "size-3 shrink-0" }),
|
|
220
|
+
formatRelativeTime(data.lastContactAt, t)
|
|
221
|
+
] }) : "\u2014" })
|
|
222
|
+
] }),
|
|
223
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
224
|
+
/* @__PURE__ */ jsx("span", { className: "text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1", children: "CLV" }),
|
|
225
|
+
/* @__PURE__ */ jsx("span", { className: "flex min-w-0 items-center gap-1 break-words text-xs font-medium text-foreground", children: data.clv ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
226
|
+
/* @__PURE__ */ jsx(TrendingUp, { className: "size-3 shrink-0" }),
|
|
227
|
+
formatCurrency(data.clv.amount, data.clv.currency)
|
|
228
|
+
] }) : "\u2014" })
|
|
229
|
+
] })
|
|
230
|
+
] }),
|
|
231
|
+
hasBillingSection && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
232
|
+
/* @__PURE__ */ jsx("div", { className: "border-t border-border/60" }),
|
|
233
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-lg bg-muted/40 border border-border/40 px-3.5 py-3 space-y-1.5", children: [
|
|
234
|
+
data.profile?.legalName && /* @__PURE__ */ jsx(BillingRow, { icon: FileText, label: t("customers.companies.detail.billing.name", "Name"), value: data.profile.legalName, t }),
|
|
235
|
+
data.primaryAddress?.formatted && /* @__PURE__ */ jsx(
|
|
236
|
+
BillingRow,
|
|
237
|
+
{
|
|
238
|
+
icon: MapPin,
|
|
239
|
+
label: t("customers.companies.detail.billing.address", "Address"),
|
|
240
|
+
value: data.primaryAddress.formatted,
|
|
241
|
+
t
|
|
242
|
+
}
|
|
243
|
+
),
|
|
244
|
+
(data.billing?.bankName || data.billing?.bankAccountMasked) && /* @__PURE__ */ jsx(
|
|
245
|
+
BillingRow,
|
|
246
|
+
{
|
|
247
|
+
icon: CreditCard,
|
|
248
|
+
label: t("customers.fields.bankIban", "Bank / IBAN"),
|
|
249
|
+
value: [data.billing?.bankName, data.billing?.bankAccountMasked].filter(Boolean).join(" \xB7 "),
|
|
250
|
+
t
|
|
251
|
+
}
|
|
252
|
+
),
|
|
253
|
+
data.billing?.paymentTerms && /* @__PURE__ */ jsx(
|
|
254
|
+
BillingRow,
|
|
255
|
+
{
|
|
256
|
+
icon: Clock,
|
|
257
|
+
label: t("customers.companies.detail.billing.paymentTerms", "Payment terms"),
|
|
258
|
+
value: data.billing.paymentTerms,
|
|
259
|
+
showCopy: false,
|
|
260
|
+
showDottedLine: false,
|
|
261
|
+
t
|
|
262
|
+
}
|
|
263
|
+
),
|
|
264
|
+
data.billing?.preferredCurrency && /* @__PURE__ */ jsx(
|
|
265
|
+
BillingRow,
|
|
266
|
+
{
|
|
267
|
+
icon: Hash,
|
|
268
|
+
label: t("customers.companies.detail.billing.currency", "Currency"),
|
|
269
|
+
value: data.billing.preferredCurrency,
|
|
270
|
+
showCopy: false,
|
|
271
|
+
showDottedLine: false,
|
|
272
|
+
t
|
|
273
|
+
}
|
|
274
|
+
)
|
|
275
|
+
] })
|
|
276
|
+
] })
|
|
277
|
+
] })
|
|
278
|
+
] });
|
|
279
|
+
}
|
|
280
|
+
export {
|
|
281
|
+
CompanyCard
|
|
282
|
+
};
|
|
283
|
+
//# sourceMappingURL=CompanyCard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/customers/components/detail/CompanyCard.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport Link from 'next/link'\nimport {\n Building2,\n Clock,\n Copy,\n CreditCard,\n ExternalLink,\n FileText,\n Hash,\n MapPin,\n TrendingUp,\n Zap,\n Tag as TagIcon,\n Users,\n} from 'lucide-react'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { renderDictionaryIcon } from '../../../dictionaries/components/dictionaryAppearance'\nimport type { CustomerDictionaryDisplayEntry, CustomerDictionaryMap } from '../../lib/dictionaries'\nimport { formatFallbackLabel } from './utils'\n\nexport type EnrichedCompanyData = {\n linkId: string\n companyId: string\n displayName: string\n isPrimary: boolean\n subtitle: string | null\n profile: {\n industry: string | null\n sizeBucket: string | null\n legalName: string | null\n domain: string | null\n websiteUrl: string | null\n } | null\n billing: {\n bankName: string | null\n bankAccountMasked: string | null\n paymentTerms: string | null\n preferredCurrency: string | null\n } | null\n primaryAddress: { formatted: string } | null\n tags: Array<{ id: string; label: string; color: string | null }>\n roles: Array<{ id: string; roleValue: string }>\n activeDeal: {\n title: string\n valueAmount: string | null\n valueCurrency: string | null\n } | null\n lastContactAt: string | null\n clv: { amount: number; currency: string } | null\n status: string | null\n lifecycleStage: string | null\n temperature: string | null\n renewalQuarter: string | null\n}\n\ntype CompanyCardProps = {\n data: EnrichedCompanyData\n personName: string\n statusMap?: CustomerDictionaryMap | undefined\n lifecycleMap?: CustomerDictionaryMap | undefined\n temperatureMap?: CustomerDictionaryMap | undefined\n renewalQuarterMap?: CustomerDictionaryMap | undefined\n roleMap?: CustomerDictionaryMap | undefined\n}\n\nfunction copyToClipboard(text: string, t: ReturnType<typeof useT>) {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n flash(t('customers.companies.detail.copied', 'Copied to clipboard'), 'success')\n })\n .catch((err) => console.warn('[CompanyCard] clipboard write failed', err))\n}\n\nfunction formatRelativeTime(isoDate: string, t: ReturnType<typeof useT>): string {\n const date = new Date(isoDate)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24))\n if (diffDays === 0) {\n return `${t('customers.companies.detail.relativeTime.today', 'today')}, ${date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`\n }\n if (diffDays === 1) return t('customers.companies.detail.relativeTime.oneDayAgo', '1 day ago')\n if (diffDays < 7) return t('customers.companies.detail.relativeTime.daysAgo', '{{days}} days ago', { days: diffDays })\n if (diffDays < 30) return t('customers.companies.detail.relativeTime.weeksAgo', '{{weeks}} wk. ago', { weeks: Math.floor(diffDays / 7) })\n return t('customers.companies.detail.relativeTime.monthsAgo', '{{months}} mo. ago', { months: Math.floor(diffDays / 30) })\n}\n\nfunction formatCurrency(amount: number, currency: string): string {\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n notation: amount >= 1_000_000 ? 'compact' : 'standard',\n }).format(amount)\n } catch {\n if (amount >= 1_000_000) return `${(amount / 1_000_000).toFixed(2)} M ${currency}`\n if (amount >= 1_000) return `${Math.round(amount / 1000)}k ${currency}`\n return `${amount} ${currency}`\n }\n}\n\nfunction ColorBadge({\n value,\n map,\n fallbackIcon,\n}: {\n value: string\n map: Record<string, CustomerDictionaryDisplayEntry> | undefined\n fallbackIcon?: React.ReactNode\n}) {\n const entry = map?.[value]\n const color = entry?.color ?? null\n const icon = entry?.icon ?? null\n const label = entry?.label ?? formatFallbackLabel(value)\n const colorStyle: React.CSSProperties | undefined = color\n ? { color, borderColor: color, backgroundColor: `${color}1A` }\n : undefined\n return (\n <Badge\n variant=\"outline\"\n className=\"rounded-sm gap-1.5 text-xs font-medium\"\n style={colorStyle}\n >\n {icon ? renderDictionaryIcon(icon, 'size-2.5') : fallbackIcon ?? null}\n {label}\n </Badge>\n )\n}\n\nfunction StatusDotBadge({\n value,\n map,\n}: {\n value: string\n map: Record<string, CustomerDictionaryDisplayEntry> | undefined\n}) {\n const entry = map?.[value]\n const color = entry?.color ?? null\n const label = entry?.label ?? formatFallbackLabel(value)\n const colorStyle: React.CSSProperties | undefined = color\n ? { color, borderColor: color, backgroundColor: `${color}1A` }\n : undefined\n return (\n <Badge\n variant=\"outline\"\n className=\"rounded-sm gap-1.5 text-xs font-medium\"\n style={colorStyle}\n >\n <span\n className=\"size-1.5 rounded-full\"\n style={color ? { backgroundColor: color } : undefined}\n />\n {label}\n </Badge>\n )\n}\n\nfunction BillingRow({\n icon: Icon,\n label,\n value,\n showCopy = true,\n showDottedLine = true,\n t,\n}: {\n icon: React.ComponentType<{ className?: string }>\n label: string\n value: string\n showCopy?: boolean\n showDottedLine?: boolean\n t: ReturnType<typeof useT>\n}) {\n return (\n <div className=\"flex min-w-0 flex-wrap items-center gap-1.5 min-h-[22px]\">\n <Icon className=\"size-3 shrink-0 text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground font-medium shrink-0\">{label}:</span>\n {showDottedLine && <div className=\"mx-1 hidden flex-1 border-b border-dotted border-border/50 sm:block\" />}\n <span className=\"min-w-0 break-words text-xs font-medium text-foreground\">{value}</span>\n {showCopy && (\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-auto shrink-0 text-muted-foreground hover:text-foreground transition-colors p-0\"\n onClick={() => copyToClipboard(value, t)}\n aria-label={t('customers.companies.detail.copy', 'Copy')}\n >\n <Copy className=\"size-2.5\" />\n </IconButton>\n )}\n </div>\n )\n}\n\nexport function CompanyCard({\n data,\n personName,\n statusMap,\n lifecycleMap,\n temperatureMap,\n renewalQuarterMap,\n roleMap,\n}: CompanyCardProps) {\n const t = useT()\n\n const hasBillingSection =\n data.profile?.legalName ||\n data.primaryAddress?.formatted ||\n data.billing?.bankName ||\n data.billing?.bankAccountMasked ||\n data.billing?.paymentTerms ||\n data.billing?.preferredCurrency\n\n const dealValue =\n data.activeDeal?.valueAmount && data.activeDeal?.valueCurrency\n ? `${data.activeDeal.valueAmount} ${data.activeDeal.valueCurrency}`\n : null\n\n return (\n <div className=\"min-w-0 overflow-hidden rounded-2xl border border-border/60 bg-card\">\n {/* Header */}\n <div className=\"flex flex-col gap-3 px-5 py-5 sm:flex-row sm:items-center\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <div className=\"flex size-12 shrink-0 items-center justify-center rounded-xl bg-muted\">\n <Building2 className=\"size-5 text-muted-foreground\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"break-words text-base font-bold\">{data.displayName}</span>\n {data.isPrimary && (\n <Badge variant=\"default\" className=\"rounded-sm px-1.5 py-0 text-overline font-bold uppercase tracking-wider\">\n PRIMARY\n </Badge>\n )}\n </div>\n {data.subtitle && (\n <p className=\"break-words text-sm text-muted-foreground\">{data.subtitle}</p>\n )}\n </div>\n </div>\n <div className=\"self-start sm:self-auto\">\n <Link href={`/backend/customers/companies-v2/${data.companyId}`}>\n <IconButton variant=\"ghost\" size=\"sm\" type=\"button\">\n <ExternalLink className=\"size-4\" />\n </IconButton>\n </Link>\n </div>\n </div>\n\n {/* Divider */}\n <div className=\"border-t border-border/60\" />\n\n {/* Body */}\n <div className=\"px-5 py-4 space-y-4\">\n {/* Info badges */}\n <div className=\"flex flex-wrap gap-1.5\">\n {data.profile?.industry && (\n <Badge variant=\"outline\" className=\"rounded-sm gap-1.5 text-xs font-medium\">\n <TagIcon className=\"size-2.5\" />\n {data.profile.industry}\n </Badge>\n )}\n {data.profile?.sizeBucket && (\n <Badge variant=\"outline\" className=\"rounded-sm gap-1.5 text-xs font-medium\">\n <Users className=\"size-2.5\" />\n {data.profile.sizeBucket} {t('customers.companies.detail.employees', 'employees')}\n </Badge>\n )}\n {data.status && <StatusDotBadge value={data.status} map={statusMap} />}\n {data.renewalQuarter && (\n <ColorBadge\n value={data.renewalQuarter}\n map={renewalQuarterMap}\n fallbackIcon={<Clock className=\"size-2.5\" />}\n />\n )}\n {data.temperature && (\n <ColorBadge\n value={data.temperature}\n map={temperatureMap}\n fallbackIcon={<Zap className=\"size-2.5\" />}\n />\n )}\n </div>\n\n {/* Roles */}\n {data.roles.length > 0 && (\n <div className=\"space-y-1.5\">\n <span className=\"text-overline font-bold uppercase tracking-wider text-muted-foreground\">\n {t('customers.companies.detail.roleInCompany', 'ROLE OF {{name}} IN THIS COMPANY', { name: personName.toUpperCase() })}\n </span>\n <div className=\"flex flex-wrap gap-1.5\">\n {data.roles.map((role) => (\n <ColorBadge\n key={role.id}\n value={role.roleValue}\n map={roleMap}\n />\n ))}\n </div>\n </div>\n )}\n\n {/* Stats divider */}\n <div className=\"border-t border-border/60\" />\n\n {/* Stats row */}\n <div className=\"grid grid-cols-1 gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n <div className=\"min-w-0\">\n <span className=\"text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1\">\n {t('customers.companies.detail.activeDeal', 'ACTIVE DEAL')}\n </span>\n <span className=\"flex min-w-0 items-center gap-1 text-xs font-medium text-foreground\">\n {data.activeDeal ? (\n <>\n <Building2 className=\"size-3 shrink-0\" />\n <span className=\"min-w-0 break-words\">\n {data.activeDeal.title}\n {dealValue ? ` \u00B7 ${dealValue}` : ''}\n </span>\n </>\n ) : (\n '\u2014'\n )}\n </span>\n </div>\n <div className=\"min-w-0\">\n <span className=\"text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1\">\n {t('customers.companies.detail.lastContact', 'LAST CONTACT')}\n </span>\n <span className=\"flex min-w-0 items-center gap-1 break-words text-xs font-medium text-foreground\">\n {data.lastContactAt ? (\n <>\n <Clock className=\"size-3 shrink-0\" />\n {formatRelativeTime(data.lastContactAt, t)}\n </>\n ) : (\n '\u2014'\n )}\n </span>\n </div>\n <div className=\"min-w-0\">\n <span className=\"text-overline font-bold uppercase tracking-wider text-muted-foreground block mb-1\">\n CLV\n </span>\n <span className=\"flex min-w-0 items-center gap-1 break-words text-xs font-medium text-foreground\">\n {data.clv ? (\n <>\n <TrendingUp className=\"size-3 shrink-0\" />\n {formatCurrency(data.clv.amount, data.clv.currency)}\n </>\n ) : (\n '\u2014'\n )}\n </span>\n </div>\n </div>\n\n {/* Billing section */}\n {hasBillingSection && (\n <>\n <div className=\"border-t border-border/60\" />\n <div className=\"rounded-lg bg-muted/40 border border-border/40 px-3.5 py-3 space-y-1.5\">\n {data.profile?.legalName && (\n <BillingRow icon={FileText} label={t('customers.companies.detail.billing.name', 'Name')} value={data.profile.legalName} t={t} />\n )}\n {data.primaryAddress?.formatted && (\n <BillingRow\n icon={MapPin}\n label={t('customers.companies.detail.billing.address', 'Address')}\n value={data.primaryAddress.formatted}\n t={t}\n />\n )}\n {(data.billing?.bankName || data.billing?.bankAccountMasked) && (\n <BillingRow\n icon={CreditCard}\n label={t('customers.fields.bankIban', 'Bank / IBAN')}\n value={[data.billing?.bankName, data.billing?.bankAccountMasked]\n .filter(Boolean)\n .join(' \u00B7 ')}\n t={t}\n />\n )}\n {data.billing?.paymentTerms && (\n <BillingRow\n icon={Clock}\n label={t('customers.companies.detail.billing.paymentTerms', 'Payment terms')}\n value={data.billing.paymentTerms}\n showCopy={false}\n showDottedLine={false}\n t={t}\n />\n )}\n {data.billing?.preferredCurrency && (\n <BillingRow\n icon={Hash}\n label={t('customers.companies.detail.billing.currency', 'Currency')}\n value={data.billing.preferredCurrency}\n showCopy={false}\n showDottedLine={false}\n t={t}\n />\n )}\n </div>\n </>\n )}\n </div>\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": ";AA8HI,SAoMY,UAtKV,KA9BF;AA3HJ,OAAO,UAAU;AACjB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,OACK;AACP,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,4BAA4B;AAErC,SAAS,2BAA2B;AA+CpC,SAAS,gBAAgB,MAAc,GAA4B;AACjE,YAAU,UACP,UAAU,IAAI,EACd,KAAK,MAAM;AACV,UAAM,EAAE,qCAAqC,qBAAqB,GAAG,SAAS;AAAA,EAChF,CAAC,EACA,MAAM,CAAC,QAAQ,QAAQ,KAAK,wCAAwC,GAAG,CAAC;AAC7E;AAEA,SAAS,mBAAmB,SAAiB,GAAoC;AAC/E,QAAM,OAAO,IAAI,KAAK,OAAO;AAC7B,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,SAAS,IAAI,QAAQ,IAAI,KAAK,QAAQ;AAC5C,QAAM,WAAW,KAAK,MAAM,UAAU,MAAO,KAAK,KAAK,GAAG;AAC1D,MAAI,aAAa,GAAG;AAClB,WAAO,GAAG,EAAE,iDAAiD,OAAO,CAAC,KAAK,KAAK,mBAAmB,QAAW,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC,CAAC;AAAA,EACtJ;AACA,MAAI,aAAa,EAAG,QAAO,EAAE,qDAAqD,WAAW;AAC7F,MAAI,WAAW,EAAG,QAAO,EAAE,mDAAmD,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrH,MAAI,WAAW,GAAI,QAAO,EAAE,oDAAoD,qBAAqB,EAAE,OAAO,KAAK,MAAM,WAAW,CAAC,EAAE,CAAC;AACxI,SAAO,EAAE,qDAAqD,sBAAsB,EAAE,QAAQ,KAAK,MAAM,WAAW,EAAE,EAAE,CAAC;AAC3H;AAEA,SAAS,eAAe,QAAgB,UAA0B;AAChE,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,QAAW;AAAA,MACtC,OAAO;AAAA,MACP;AAAA,MACA,uBAAuB;AAAA,MACvB,UAAU,UAAU,MAAY,YAAY;AAAA,IAC9C,CAAC,EAAE,OAAO,MAAM;AAAA,EAClB,QAAQ;AACN,QAAI,UAAU,IAAW,QAAO,IAAI,SAAS,KAAW,QAAQ,CAAC,CAAC,MAAM,QAAQ;AAChF,QAAI,UAAU,IAAO,QAAO,GAAG,KAAK,MAAM,SAAS,GAAI,CAAC,KAAK,QAAQ;AACrE,WAAO,GAAG,MAAM,IAAI,QAAQ;AAAA,EAC9B;AACF;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQ,MAAM,KAAK;AACzB,QAAM,QAAQ,OAAO,SAAS;AAC9B,QAAM,OAAO,OAAO,QAAQ;AAC5B,QAAM,QAAQ,OAAO,SAAS,oBAAoB,KAAK;AACvD,QAAM,aAA8C,QAChD,EAAE,OAAO,aAAa,OAAO,iBAAiB,GAAG,KAAK,KAAK,IAC3D;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,OAAO;AAAA,MAEN;AAAA,eAAO,qBAAqB,MAAM,UAAU,IAAI,gBAAgB;AAAA,QAChE;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AACF,GAGG;AACD,QAAM,QAAQ,MAAM,KAAK;AACzB,QAAM,QAAQ,OAAO,SAAS;AAC9B,QAAM,QAAQ,OAAO,SAAS,oBAAoB,KAAK;AACvD,QAAM,aAA8C,QAChD,EAAE,OAAO,aAAa,OAAO,iBAAiB,GAAG,KAAK,KAAK,IAC3D;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,WAAU;AAAA,MACV,OAAO;AAAA,MAEP;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,QAAQ,EAAE,iBAAiB,MAAM,IAAI;AAAA;AAAA,QAC9C;AAAA,QACC;AAAA;AAAA;AAAA,EACH;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB;AACF,GAOG;AACD,SACE,qBAAC,SAAI,WAAU,4DACb;AAAA,wBAAC,QAAK,WAAU,yCAAwC;AAAA,IACxD,qBAAC,UAAK,WAAU,sDAAsD;AAAA;AAAA,MAAM;AAAA,OAAC;AAAA,IAC5E,kBAAkB,oBAAC,SAAI,WAAU,uEAAsE;AAAA,IACxG,oBAAC,UAAK,WAAU,2DAA2D,iBAAM;AAAA,IAChF,YACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM,gBAAgB,OAAO,CAAC;AAAA,QACvC,cAAY,EAAE,mCAAmC,MAAM;AAAA,QAEvD,8BAAC,QAAK,WAAU,YAAW;AAAA;AAAA,IAC7B;AAAA,KAEJ;AAEJ;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,IAAI,KAAK;AAEf,QAAM,oBACJ,KAAK,SAAS,aACd,KAAK,gBAAgB,aACrB,KAAK,SAAS,YACd,KAAK,SAAS,qBACd,KAAK,SAAS,gBACd,KAAK,SAAS;AAEhB,QAAM,YACJ,KAAK,YAAY,eAAe,KAAK,YAAY,gBAC7C,GAAG,KAAK,WAAW,WAAW,IAAI,KAAK,WAAW,aAAa,KAC/D;AAEN,SACE,qBAAC,SAAI,WAAU,uEAEb;AAAA,yBAAC,SAAI,WAAU,6DACb;AAAA,2BAAC,SAAI,WAAU,0CACb;AAAA,4BAAC,SAAI,WAAU,yEACb,8BAAC,aAAU,WAAU,gCAA+B,GACtD;AAAA,QACA,qBAAC,SAAI,WAAU,kBACb;AAAA,+BAAC,SAAI,WAAU,qCACb;AAAA,gCAAC,UAAK,WAAU,mCAAmC,eAAK,aAAY;AAAA,YACnE,KAAK,aACJ,oBAAC,SAAM,SAAQ,WAAU,WAAU,2EAA0E,qBAE7G;AAAA,aAEJ;AAAA,UACC,KAAK,YACJ,oBAAC,OAAE,WAAU,6CAA6C,eAAK,UAAS;AAAA,WAE5E;AAAA,SACF;AAAA,MACA,oBAAC,SAAI,WAAU,2BACb,8BAAC,QAAK,MAAM,mCAAmC,KAAK,SAAS,IAC3D,8BAAC,cAAW,SAAQ,SAAQ,MAAK,MAAK,MAAK,UACzC,8BAAC,gBAAa,WAAU,UAAS,GACnC,GACF,GACF;AAAA,OACF;AAAA,IAGA,oBAAC,SAAI,WAAU,6BAA4B;AAAA,IAG3C,qBAAC,SAAI,WAAU,uBAEb;AAAA,2BAAC,SAAI,WAAU,0BACZ;AAAA,aAAK,SAAS,YACb,qBAAC,SAAM,SAAQ,WAAU,WAAU,0CACjC;AAAA,8BAAC,WAAQ,WAAU,YAAW;AAAA,UAC7B,KAAK,QAAQ;AAAA,WAChB;AAAA,QAED,KAAK,SAAS,cACb,qBAAC,SAAM,SAAQ,WAAU,WAAU,0CACjC;AAAA,8BAAC,SAAM,WAAU,YAAW;AAAA,UAC3B,KAAK,QAAQ;AAAA,UAAW;AAAA,UAAE,EAAE,wCAAwC,WAAW;AAAA,WAClF;AAAA,QAED,KAAK,UAAU,oBAAC,kBAAe,OAAO,KAAK,QAAQ,KAAK,WAAW;AAAA,QACnE,KAAK,kBACJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK;AAAA,YACZ,KAAK;AAAA,YACL,cAAc,oBAAC,SAAM,WAAU,YAAW;AAAA;AAAA,QAC5C;AAAA,QAED,KAAK,eACJ;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,KAAK;AAAA,YACZ,KAAK;AAAA,YACL,cAAc,oBAAC,OAAI,WAAU,YAAW;AAAA;AAAA,QAC1C;AAAA,SAEJ;AAAA,MAGC,KAAK,MAAM,SAAS,KACnB,qBAAC,SAAI,WAAU,eACb;AAAA,4BAAC,UAAK,WAAU,0EACb,YAAE,4CAA4C,oCAAoC,EAAE,MAAM,WAAW,YAAY,EAAE,CAAC,GACvH;AAAA,QACA,oBAAC,SAAI,WAAU,0BACZ,eAAK,MAAM,IAAI,CAAC,SACf;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO,KAAK;AAAA,YACZ,KAAK;AAAA;AAAA,UAFA,KAAK;AAAA,QAGZ,CACD,GACH;AAAA,SACF;AAAA,MAIF,oBAAC,SAAI,WAAU,6BAA4B;AAAA,MAG3C,qBAAC,SAAI,WAAU,wDACb;AAAA,6BAAC,SAAI,WAAU,WACb;AAAA,8BAAC,UAAK,WAAU,qFACb,YAAE,yCAAyC,aAAa,GAC3D;AAAA,UACA,oBAAC,UAAK,WAAU,uEACb,eAAK,aACJ,iCACE;AAAA,gCAAC,aAAU,WAAU,mBAAkB;AAAA,YACvC,qBAAC,UAAK,WAAU,uBACb;AAAA,mBAAK,WAAW;AAAA,cAChB,YAAY,SAAM,SAAS,KAAK;AAAA,eACnC;AAAA,aACF,IAEA,UAEJ;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,WACb;AAAA,8BAAC,UAAK,WAAU,qFACb,YAAE,0CAA0C,cAAc,GAC7D;AAAA,UACA,oBAAC,UAAK,WAAU,mFACb,eAAK,gBACJ,iCACE;AAAA,gCAAC,SAAM,WAAU,mBAAkB;AAAA,YAClC,mBAAmB,KAAK,eAAe,CAAC;AAAA,aAC3C,IAEA,UAEJ;AAAA,WACF;AAAA,QACA,qBAAC,SAAI,WAAU,WACb;AAAA,8BAAC,UAAK,WAAU,qFAAoF,iBAEpG;AAAA,UACA,oBAAC,UAAK,WAAU,mFACb,eAAK,MACJ,iCACE;AAAA,gCAAC,cAAW,WAAU,mBAAkB;AAAA,YACvC,eAAe,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ;AAAA,aACpD,IAEA,UAEJ;AAAA,WACF;AAAA,SACF;AAAA,MAGC,qBACC,iCACE;AAAA,4BAAC,SAAI,WAAU,6BAA4B;AAAA,QAC3C,qBAAC,SAAI,WAAU,0EACZ;AAAA,eAAK,SAAS,aACb,oBAAC,cAAW,MAAM,UAAU,OAAO,EAAE,2CAA2C,MAAM,GAAG,OAAO,KAAK,QAAQ,WAAW,GAAM;AAAA,UAE/H,KAAK,gBAAgB,aACpB;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,OAAO,EAAE,8CAA8C,SAAS;AAAA,cAChE,OAAO,KAAK,eAAe;AAAA,cAC3B;AAAA;AAAA,UACF;AAAA,WAEA,KAAK,SAAS,YAAY,KAAK,SAAS,sBACxC;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,OAAO,EAAE,6BAA6B,aAAa;AAAA,cACnD,OAAO,CAAC,KAAK,SAAS,UAAU,KAAK,SAAS,iBAAiB,EAC5D,OAAO,OAAO,EACd,KAAK,QAAK;AAAA,cACb;AAAA;AAAA,UACF;AAAA,UAED,KAAK,SAAS,gBACb;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,OAAO,EAAE,mDAAmD,eAAe;AAAA,cAC3E,OAAO,KAAK,QAAQ;AAAA,cACpB,UAAU;AAAA,cACV,gBAAgB;AAAA,cAChB;AAAA;AAAA,UACF;AAAA,UAED,KAAK,SAAS,qBACb;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,OAAO,EAAE,+CAA+C,UAAU;AAAA,cAClE,OAAO,KAAK,QAAQ;AAAA,cACpB,UAAU;AAAA,cACV,gBAAgB;AAAA,cAChB;AAAA;AAAA,UACF;AAAA,WAEJ;AAAA,SACF;AAAA,OAEJ;AAAA,KACF;AAEJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { EyeOff } from "lucide-react";
|
|
5
|
+
import { useT } from "@open-mercato/shared/lib/i18n/context";
|
|
6
|
+
import { KpiCard } from "@open-mercato/ui/backend/charts/KpiCard";
|
|
7
|
+
import { Button } from "@open-mercato/ui/primitives/button";
|
|
8
|
+
import { IconButton } from "@open-mercato/ui/primitives/icon-button";
|
|
9
|
+
import { InlineActivityComposer } from "./InlineActivityComposer.js";
|
|
10
|
+
import { formatCurrency } from "./utils.js";
|
|
11
|
+
import { computeHealthScore } from "./healthScoreUtils.js";
|
|
12
|
+
import {
|
|
13
|
+
readJsonFromLocalStorage,
|
|
14
|
+
writeJsonToLocalStorage,
|
|
15
|
+
removeLocalStorageKey
|
|
16
|
+
} from "@open-mercato/shared/lib/browser/safeLocalStorage";
|
|
17
|
+
import {
|
|
18
|
+
sumActiveDeals,
|
|
19
|
+
getActiveDeals,
|
|
20
|
+
getOpenTasks,
|
|
21
|
+
getUpcomingMeetings,
|
|
22
|
+
getRecentActivity,
|
|
23
|
+
computeActivityTrend,
|
|
24
|
+
computeDealTrend
|
|
25
|
+
} from "./dashboard/helpers.js";
|
|
26
|
+
import { UpcomingMeetingsWidget } from "./dashboard/UpcomingMeetingsWidget.js";
|
|
27
|
+
import { RelationshipHealthWidget } from "./dashboard/RelationshipHealthWidget.js";
|
|
28
|
+
import { ActiveDealWidget } from "./dashboard/ActiveDealWidget.js";
|
|
29
|
+
import { OpenTasksWidget } from "./dashboard/OpenTasksWidget.js";
|
|
30
|
+
import { RecentActivityWidget } from "./dashboard/RecentActivityWidget.js";
|
|
31
|
+
function CompanyDashboardTab({ data, companyId, onTabChange, onActivityCreated, onScheduleRequested, runGuardedMutation, useCanonicalInteractions }) {
|
|
32
|
+
const t = useT();
|
|
33
|
+
const activeDeals = React.useMemo(() => getActiveDeals(data.deals), [data.deals]);
|
|
34
|
+
const activeDealsValue = React.useMemo(() => sumActiveDeals(data.deals), [data.deals]);
|
|
35
|
+
const openTasks = React.useMemo(() => getOpenTasks(data.todos), [data.todos]);
|
|
36
|
+
const upcomingMeetings = React.useMemo(() => getUpcomingMeetings(data.interactions), [data.interactions]);
|
|
37
|
+
const recentActivity = React.useMemo(() => getRecentActivity(data.interactions), [data.interactions]);
|
|
38
|
+
const dealCurrency = activeDeals[0]?.valueCurrency ?? data.deals[0]?.valueCurrency ?? "PLN";
|
|
39
|
+
const activityTrend = React.useMemo(() => computeActivityTrend(data.interactions), [data.interactions]);
|
|
40
|
+
const dealTrend = React.useMemo(() => computeDealTrend(data.deals), [data.deals]);
|
|
41
|
+
const healthScore = React.useMemo(() => computeHealthScore(data.interactions), [data.interactions]);
|
|
42
|
+
const ltvValue = React.useMemo(() => {
|
|
43
|
+
const wonDeals = data.deals.filter((d) => d.status === "won");
|
|
44
|
+
if (wonDeals.length === 0) return null;
|
|
45
|
+
return wonDeals.reduce((sum, d) => {
|
|
46
|
+
const amt = typeof d.valueAmount === "number" ? d.valueAmount : parseFloat(String(d.valueAmount ?? "0"));
|
|
47
|
+
return sum + (Number.isFinite(amt) ? amt : 0);
|
|
48
|
+
}, 0);
|
|
49
|
+
}, [data.deals]);
|
|
50
|
+
const clientTenureYears = React.useMemo(() => {
|
|
51
|
+
const allDates = data.interactions.map((i) => i.occurredAt ?? i.scheduledAt ?? i.createdAt).filter(Boolean).map((d) => new Date(d).getTime());
|
|
52
|
+
if (allDates.length === 0) return null;
|
|
53
|
+
const earliest = Math.min(...allDates);
|
|
54
|
+
return Math.floor((Date.now() - earliest) / (365.25 * 864e5));
|
|
55
|
+
}, [data.interactions]);
|
|
56
|
+
const [hiddenTiles, setHiddenTiles] = React.useState(
|
|
57
|
+
() => new Set(readJsonFromLocalStorage("om:dashboard-hidden-tiles", []))
|
|
58
|
+
);
|
|
59
|
+
const toggleTile = React.useCallback((tileId) => {
|
|
60
|
+
setHiddenTiles((prev) => {
|
|
61
|
+
const next = new Set(prev);
|
|
62
|
+
if (next.has(tileId)) next.delete(tileId);
|
|
63
|
+
else next.add(tileId);
|
|
64
|
+
writeJsonToLocalStorage("om:dashboard-hidden-tiles", [...next]);
|
|
65
|
+
return next;
|
|
66
|
+
});
|
|
67
|
+
}, []);
|
|
68
|
+
const kpiTiles = [
|
|
69
|
+
{ id: "activeDeals", title: t("customers.companies.dashboard.kpi.activeDeals", "ACTIVE DEALS"), value: activeDealsValue, trend: dealTrend, formatValue: (v) => formatCurrency(v, dealCurrency), comparisonLabel: `${activeDeals.length} ${activeDeals.length === 1 ? "pipeline" : "pipelines"}` },
|
|
70
|
+
{ id: "activities", title: t("customers.companies.dashboard.kpi.activities", "ACTIVITIES"), value: data.interactions.length, trend: activityTrend, comparisonLabel: t("customers.companies.dashboard.kpi.last12months", "last 12 months") },
|
|
71
|
+
{ id: "ltv", title: t("customers.companies.dashboard.kpi.ltv", "CUSTOMER VALUE (LTV)"), value: ltvValue, formatValue: ltvValue !== null ? (v) => formatCurrency(v, dealCurrency) : void 0, comparisonLabel: ltvValue !== null ? t("customers.companies.dashboard.kpi.wonDeals", "won deals total") : t("customers.companies.dashboard.kpi.noWonDeals", "No won deals") },
|
|
72
|
+
{ id: "clientSince", title: t("customers.companies.dashboard.kpi.clientSince", "CLIENT SINCE"), value: clientTenureYears, formatValue: clientTenureYears !== null ? (v) => v < 1 ? `< 1 ${t("customers.companies.dashboard.kpi.year", "year")}` : `${v} ${v === 1 ? t("customers.companies.dashboard.kpi.year", "year") : t("customers.companies.dashboard.kpi.years", "years")}` : void 0, comparisonLabel: clientTenureYears !== null ? `${data.deals.filter((d) => d.status === "won").length} ${t("customers.companies.dashboard.kpi.completedDeals", "completed deals")}` : t("customers.companies.dashboard.kpi.noInteractions", "No interactions yet") }
|
|
73
|
+
];
|
|
74
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
75
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-4 lg:grid-cols-4", children: kpiTiles.filter((tile) => !hiddenTiles.has(tile.id)).map((tile) => /* @__PURE__ */ jsxs("div", { className: "relative group", children: [
|
|
76
|
+
/* @__PURE__ */ jsx(
|
|
77
|
+
KpiCard,
|
|
78
|
+
{
|
|
79
|
+
title: tile.title,
|
|
80
|
+
value: tile.value,
|
|
81
|
+
trend: tile.trend,
|
|
82
|
+
formatValue: tile.formatValue,
|
|
83
|
+
comparisonLabel: tile.comparisonLabel
|
|
84
|
+
}
|
|
85
|
+
),
|
|
86
|
+
/* @__PURE__ */ jsx(
|
|
87
|
+
IconButton,
|
|
88
|
+
{
|
|
89
|
+
type: "button",
|
|
90
|
+
variant: "ghost",
|
|
91
|
+
size: "sm",
|
|
92
|
+
onClick: () => toggleTile(tile.id),
|
|
93
|
+
className: "h-auto absolute top-2 right-2 opacity-0 group-hover:opacity-60 transition-opacity text-muted-foreground hover:text-foreground p-0",
|
|
94
|
+
"aria-label": t("customers.companies.dashboard.hideTile", "Hide tile"),
|
|
95
|
+
children: /* @__PURE__ */ jsx(EyeOff, { className: "size-3.5" })
|
|
96
|
+
}
|
|
97
|
+
)
|
|
98
|
+
] }, tile.id)) }),
|
|
99
|
+
hiddenTiles.size > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
100
|
+
/* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: t("customers.companies.dashboard.hiddenTiles", "{{count}} tiles hidden", { count: hiddenTiles.size }) }),
|
|
101
|
+
/* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "h-auto text-xs px-1.5 py-0.5", onClick: () => {
|
|
102
|
+
setHiddenTiles(/* @__PURE__ */ new Set());
|
|
103
|
+
removeLocalStorageKey("om:dashboard-hidden-tiles");
|
|
104
|
+
}, children: t("customers.companies.dashboard.showAll", "Show all") })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-6 lg:grid-cols-[1fr_380px]", children: [
|
|
107
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
108
|
+
/* @__PURE__ */ jsx(UpcomingMeetingsWidget, { meetings: upcomingMeetings, t }),
|
|
109
|
+
/* @__PURE__ */ jsx(OpenTasksWidget, { tasks: openTasks, t, onViewAll: () => onTabChange("activity-log"), currentUserId: null })
|
|
110
|
+
] }),
|
|
111
|
+
/* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
112
|
+
/* @__PURE__ */ jsx(RelationshipHealthWidget, { health: healthScore, t }),
|
|
113
|
+
/* @__PURE__ */ jsx(ActiveDealWidget, { deals: activeDeals, t })
|
|
114
|
+
] })
|
|
115
|
+
] }),
|
|
116
|
+
/* @__PURE__ */ jsx(
|
|
117
|
+
InlineActivityComposer,
|
|
118
|
+
{
|
|
119
|
+
entityType: "company",
|
|
120
|
+
entityId: companyId,
|
|
121
|
+
onActivityCreated,
|
|
122
|
+
runGuardedMutation,
|
|
123
|
+
onScheduleRequested,
|
|
124
|
+
useCanonicalInteractions
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
/* @__PURE__ */ jsx(RecentActivityWidget, { interactions: recentActivity, t })
|
|
128
|
+
] });
|
|
129
|
+
}
|
|
130
|
+
export {
|
|
131
|
+
CompanyDashboardTab
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=CompanyDashboardTab.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/modules/customers/components/detail/CompanyDashboardTab.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { EyeOff } from 'lucide-react'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { KpiCard, type KpiTrend } from '@open-mercato/ui/backend/charts/KpiCard'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { IconButton } from '@open-mercato/ui/primitives/icon-button'\nimport { InlineActivityComposer } from './InlineActivityComposer'\nimport type { CompanyOverview } from '../formConfig'\nimport { formatCurrency } from './utils'\nimport { computeHealthScore } from './healthScoreUtils'\nimport {\n readJsonFromLocalStorage,\n writeJsonToLocalStorage,\n removeLocalStorageKey,\n} from '@open-mercato/shared/lib/browser/safeLocalStorage'\nimport {\n sumActiveDeals,\n getActiveDeals,\n getOpenTasks,\n getUpcomingMeetings,\n getRecentActivity,\n computeActivityTrend,\n computeDealTrend,\n} from './dashboard/helpers'\nimport { UpcomingMeetingsWidget } from './dashboard/UpcomingMeetingsWidget'\nimport { RelationshipHealthWidget } from './dashboard/RelationshipHealthWidget'\nimport { ActiveDealWidget } from './dashboard/ActiveDealWidget'\nimport { OpenTasksWidget } from './dashboard/OpenTasksWidget'\nimport { RecentActivityWidget } from './dashboard/RecentActivityWidget'\n\ntype GuardedMutationRunner = <T>(\n operation: () => Promise<T>,\n mutationPayload?: Record<string, unknown>,\n) => Promise<T>\n\ntype CompanyDashboardTabProps = {\n data: CompanyOverview\n companyId: string\n onTabChange: (tab: string) => void\n onActivityCreated?: () => void\n onScheduleRequested?: () => void\n runGuardedMutation?: GuardedMutationRunner\n useCanonicalInteractions?: boolean\n}\n\nexport function CompanyDashboardTab({ data, companyId, onTabChange, onActivityCreated, onScheduleRequested, runGuardedMutation, useCanonicalInteractions }: CompanyDashboardTabProps) {\n const t = useT()\n\n const activeDeals = React.useMemo(() => getActiveDeals(data.deals), [data.deals])\n const activeDealsValue = React.useMemo(() => sumActiveDeals(data.deals), [data.deals])\n const openTasks = React.useMemo(() => getOpenTasks(data.todos), [data.todos])\n const upcomingMeetings = React.useMemo(() => getUpcomingMeetings(data.interactions), [data.interactions])\n const recentActivity = React.useMemo(() => getRecentActivity(data.interactions), [data.interactions])\n\n const dealCurrency = activeDeals[0]?.valueCurrency ?? data.deals[0]?.valueCurrency ?? 'PLN'\n const activityTrend = React.useMemo(() => computeActivityTrend(data.interactions), [data.interactions])\n const dealTrend = React.useMemo(() => computeDealTrend(data.deals), [data.deals])\n const healthScore = React.useMemo(() => computeHealthScore(data.interactions), [data.interactions])\n\n const ltvValue = React.useMemo(() => {\n const wonDeals = data.deals.filter((d) => d.status === 'won')\n if (wonDeals.length === 0) return null\n return wonDeals.reduce((sum, d) => {\n const amt = typeof d.valueAmount === 'number' ? d.valueAmount : parseFloat(String(d.valueAmount ?? '0'))\n return sum + (Number.isFinite(amt) ? amt : 0)\n }, 0)\n }, [data.deals])\n\n const clientTenureYears = React.useMemo(() => {\n const allDates = data.interactions\n .map((i) => i.occurredAt ?? i.scheduledAt ?? i.createdAt)\n .filter(Boolean)\n .map((d) => new Date(d).getTime())\n if (allDates.length === 0) return null\n const earliest = Math.min(...allDates)\n return Math.floor((Date.now() - earliest) / (365.25 * 86_400_000))\n }, [data.interactions])\n\n const [hiddenTiles, setHiddenTiles] = React.useState<Set<string>>(\n () => new Set(readJsonFromLocalStorage<string[]>('om:dashboard-hidden-tiles', [])),\n )\n\n const toggleTile = React.useCallback((tileId: string) => {\n setHiddenTiles((prev) => {\n const next = new Set(prev)\n if (next.has(tileId)) next.delete(tileId)\n else next.add(tileId)\n writeJsonToLocalStorage('om:dashboard-hidden-tiles', [...next])\n return next\n })\n }, [])\n\n const kpiTiles: Array<{ id: string; title: string; value: number | null; trend?: KpiTrend; formatValue?: (v: number) => string; comparisonLabel: string }> = [\n { id: 'activeDeals', title: t('customers.companies.dashboard.kpi.activeDeals', 'ACTIVE DEALS'), value: activeDealsValue, trend: dealTrend, formatValue: (v: number) => formatCurrency(v, dealCurrency), comparisonLabel: `${activeDeals.length} ${activeDeals.length === 1 ? 'pipeline' : 'pipelines'}` },\n { id: 'activities', title: t('customers.companies.dashboard.kpi.activities', 'ACTIVITIES'), value: data.interactions.length, trend: activityTrend, comparisonLabel: t('customers.companies.dashboard.kpi.last12months', 'last 12 months') },\n { id: 'ltv', title: t('customers.companies.dashboard.kpi.ltv', 'CUSTOMER VALUE (LTV)'), value: ltvValue, formatValue: ltvValue !== null ? (v: number) => formatCurrency(v, dealCurrency) : undefined, comparisonLabel: ltvValue !== null ? t('customers.companies.dashboard.kpi.wonDeals', 'won deals total') : t('customers.companies.dashboard.kpi.noWonDeals', 'No won deals') },\n { id: 'clientSince', title: t('customers.companies.dashboard.kpi.clientSince', 'CLIENT SINCE'), value: clientTenureYears, formatValue: clientTenureYears !== null ? (v: number) => v < 1 ? `< 1 ${t('customers.companies.dashboard.kpi.year', 'year')}` : `${v} ${v === 1 ? t('customers.companies.dashboard.kpi.year', 'year') : t('customers.companies.dashboard.kpi.years', 'years')}` : undefined, comparisonLabel: clientTenureYears !== null ? `${data.deals.filter(d => d.status === 'won').length} ${t('customers.companies.dashboard.kpi.completedDeals', 'completed deals')}` : t('customers.companies.dashboard.kpi.noInteractions', 'No interactions yet') },\n ]\n\n return (\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 gap-4 lg:grid-cols-4\">\n {kpiTiles.filter((tile) => !hiddenTiles.has(tile.id)).map((tile) => (\n <div key={tile.id} className=\"relative group\">\n <KpiCard\n title={tile.title}\n value={tile.value}\n trend={tile.trend}\n formatValue={tile.formatValue}\n comparisonLabel={tile.comparisonLabel}\n />\n <IconButton\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => toggleTile(tile.id)}\n className=\"h-auto absolute top-2 right-2 opacity-0 group-hover:opacity-60 transition-opacity text-muted-foreground hover:text-foreground p-0\"\n aria-label={t('customers.companies.dashboard.hideTile', 'Hide tile')}\n >\n <EyeOff className=\"size-3.5\" />\n </IconButton>\n </div>\n ))}\n </div>\n {hiddenTiles.size > 0 && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">\n {t('customers.companies.dashboard.hiddenTiles', '{{count}} tiles hidden', { count: hiddenTiles.size })}\n </span>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-auto text-xs px-1.5 py-0.5\" onClick={() => { setHiddenTiles(new Set()); removeLocalStorageKey('om:dashboard-hidden-tiles') }}>\n {t('customers.companies.dashboard.showAll', 'Show all')}\n </Button>\n </div>\n )}\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-[1fr_380px]\">\n <div className=\"space-y-6\">\n <UpcomingMeetingsWidget meetings={upcomingMeetings} t={t} />\n <OpenTasksWidget tasks={openTasks} t={t} onViewAll={() => onTabChange('activity-log')} currentUserId={null} />\n </div>\n <div className=\"space-y-6\">\n <RelationshipHealthWidget health={healthScore} t={t} />\n <ActiveDealWidget deals={activeDeals} t={t} />\n </div>\n </div>\n\n <InlineActivityComposer\n entityType=\"company\"\n entityId={companyId}\n onActivityCreated={onActivityCreated}\n runGuardedMutation={runGuardedMutation}\n onScheduleRequested={onScheduleRequested}\n useCanonicalInteractions={useCanonicalInteractions}\n />\n\n <RecentActivityWidget interactions={recentActivity} t={t} />\n </div>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|