@mj-biz-apps/sales-ng 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +183 -0
- package/dist/lib/activities/deal-activity-timeline.component.d.ts +104 -0
- package/dist/lib/activities/deal-activity-timeline.component.d.ts.map +1 -0
- package/dist/lib/activities/deal-activity-timeline.component.js +580 -0
- package/dist/lib/activities/deal-activity-timeline.component.js.map +1 -0
- package/dist/lib/board/deal-board.component.d.ts +194 -0
- package/dist/lib/board/deal-board.component.d.ts.map +1 -0
- package/dist/lib/board/deal-board.component.js +626 -0
- package/dist/lib/board/deal-board.component.js.map +1 -0
- package/dist/lib/custom/custom-forms.module.d.ts +14 -0
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -0
- package/dist/lib/custom/custom-forms.module.js +38 -0
- package/dist/lib/custom/custom-forms.module.js.map +1 -0
- package/dist/lib/custom/deal-form.component.d.ts +38 -0
- package/dist/lib/custom/deal-form.component.d.ts.map +1 -0
- package/dist/lib/custom/deal-form.component.js +346 -0
- package/dist/lib/custom/deal-form.component.js.map +1 -0
- package/dist/lib/custom/deal-line-form.component.d.ts +22 -0
- package/dist/lib/custom/deal-line-form.component.d.ts.map +1 -0
- package/dist/lib/custom/deal-line-form.component.js +129 -0
- package/dist/lib/custom/deal-line-form.component.js.map +1 -0
- package/dist/lib/custom/deal-stage-event-form.component.d.ts +26 -0
- package/dist/lib/custom/deal-stage-event-form.component.d.ts.map +1 -0
- package/dist/lib/custom/deal-stage-event-form.component.js +112 -0
- package/dist/lib/custom/deal-stage-event-form.component.js.map +1 -0
- package/dist/lib/custom/server-owned-fields.d.ts +47 -0
- package/dist/lib/custom/server-owned-fields.d.ts.map +1 -0
- package/dist/lib/custom/server-owned-fields.js +31 -0
- package/dist/lib/custom/server-owned-fields.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesAccountType/mjbizappssalesaccounttype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesAccountType/mjbizappssalesaccounttype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesAccountType/mjbizappssalesaccounttype.form.component.js +90 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesAccountType/mjbizappssalesaccounttype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesBuyingRoleType/mjbizappssalesbuyingroletype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesBuyingRoleType/mjbizappssalesbuyingroletype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesBuyingRoleType/mjbizappssalesbuyingroletype.form.component.js +108 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesBuyingRoleType/mjbizappssalesbuyingroletype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDeal/mjbizappssalesdeal.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDeal/mjbizappssalesdeal.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDeal/mjbizappssalesdeal.form.component.js +216 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDeal/mjbizappssalesdeal.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealContactRole/mjbizappssalesdealcontactrole.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealContactRole/mjbizappssalesdealcontactrole.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealContactRole/mjbizappssalesdealcontactrole.form.component.js +65 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealContactRole/mjbizappssalesdealcontactrole.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealLine/mjbizappssalesdealline.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealLine/mjbizappssalesdealline.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealLine/mjbizappssalesdealline.form.component.js +95 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealLine/mjbizappssalesdealline.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealLineType/mjbizappssalesdeallinetype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealLineType/mjbizappssalesdeallinetype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealLineType/mjbizappssalesdeallinetype.form.component.js +86 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealLineType/mjbizappssalesdeallinetype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealPaymentSchedule/mjbizappssalesdealpaymentschedule.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealPaymentSchedule/mjbizappssalesdealpaymentschedule.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealPaymentSchedule/mjbizappssalesdealpaymentschedule.form.component.js +65 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealPaymentSchedule/mjbizappssalesdealpaymentschedule.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealRole/mjbizappssalesdealrole.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealRole/mjbizappssalesdealrole.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealRole/mjbizappssalesdealrole.form.component.js +92 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealRole/mjbizappssalesdealrole.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealSequence/mjbizappssalesdealsequence.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealSequence/mjbizappssalesdealsequence.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealSequence/mjbizappssalesdealsequence.form.component.js +57 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealSequence/mjbizappssalesdealsequence.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealStageEvent/mjbizappssalesdealstageevent.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealStageEvent/mjbizappssalesdealstageevent.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealStageEvent/mjbizappssalesdealstageevent.form.component.js +77 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealStageEvent/mjbizappssalesdealstageevent.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealStatusType/mjbizappssalesdealstatustype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealStatusType/mjbizappssalesdealstatustype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealStatusType/mjbizappssalesdealstatustype.form.component.js +148 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealStatusType/mjbizappssalesdealstatustype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealTeamMember/mjbizappssalesdealteammember.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealTeamMember/mjbizappssalesdealteammember.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealTeamMember/mjbizappssalesdealteammember.form.component.js +73 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealTeamMember/mjbizappssalesdealteammember.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealType/mjbizappssalesdealtype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealType/mjbizappssalesdealtype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealType/mjbizappssalesdealtype.form.component.js +108 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesDealType/mjbizappssalesdealtype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesForecastCategoryType/mjbizappssalesforecastcategorytype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesForecastCategoryType/mjbizappssalesforecastcategorytype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesForecastCategoryType/mjbizappssalesforecastcategorytype.form.component.js +126 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesForecastCategoryType/mjbizappssalesforecastcategorytype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesForecastSnapshot/mjbizappssalesforecastsnapshot.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesForecastSnapshot/mjbizappssalesforecastsnapshot.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesForecastSnapshot/mjbizappssalesforecastsnapshot.form.component.js +77 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesForecastSnapshot/mjbizappssalesforecastsnapshot.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLeadSourceType/mjbizappssalesleadsourcetype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLeadSourceType/mjbizappssalesleadsourcetype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLeadSourceType/mjbizappssalesleadsourcetype.form.component.js +126 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLeadSourceType/mjbizappssalesleadsourcetype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLifecycleStageType/mjbizappssaleslifecyclestagetype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLifecycleStageType/mjbizappssaleslifecyclestagetype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLifecycleStageType/mjbizappssaleslifecyclestagetype.form.component.js +108 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLifecycleStageType/mjbizappssaleslifecyclestagetype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLossReason/mjbizappssaleslossreason.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLossReason/mjbizappssaleslossreason.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLossReason/mjbizappssaleslossreason.form.component.js +90 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesLossReason/mjbizappssaleslossreason.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesPipeline/mjbizappssalespipeline.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesPipeline/mjbizappssalespipeline.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesPipeline/mjbizappssalespipeline.form.component.js +150 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesPipeline/mjbizappssalespipeline.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesPipelineStage/mjbizappssalespipelinestage.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesPipelineStage/mjbizappssalespipelinestage.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesPipelineStage/mjbizappssalespipelinestage.form.component.js +138 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesPipelineStage/mjbizappssalespipelinestage.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesSalesAccount/mjbizappssalessalesaccount.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesSalesAccount/mjbizappssalessalesaccount.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesSalesAccount/mjbizappssalessalesaccount.form.component.js +124 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesSalesAccount/mjbizappssalessalesaccount.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesSalesContact/mjbizappssalessalescontact.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesSalesContact/mjbizappssalessalescontact.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesSalesContact/mjbizappssalessalescontact.form.component.js +156 -0
- package/dist/lib/generated/Entities/mjBizAppsSalesSalesContact/mjbizappssalessalescontact.form.component.js.map +1 -0
- package/dist/lib/generated/class-registrations-manifest.d.ts +20 -0
- package/dist/lib/generated/class-registrations-manifest.d.ts.map +1 -0
- package/dist/lib/generated/class-registrations-manifest.js +20 -0
- package/dist/lib/generated/class-registrations-manifest.js.map +1 -0
- package/dist/lib/generated/generated-forms.module.d.ts +37 -0
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -0
- package/dist/lib/generated/generated-forms.module.js +120 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -0
- package/dist/lib/nav/sales-nav.model.d.ts +93 -0
- package/dist/lib/nav/sales-nav.model.d.ts.map +1 -0
- package/dist/lib/nav/sales-nav.model.js +126 -0
- package/dist/lib/nav/sales-nav.model.js.map +1 -0
- package/dist/lib/sections/sales-section.component.d.ts +213 -0
- package/dist/lib/sections/sales-section.component.d.ts.map +1 -0
- package/dist/lib/sections/sales-section.component.js +905 -0
- package/dist/lib/sections/sales-section.component.js.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-card.component.d.ts +55 -0
- package/dist/lib/vendored/workspace-tabs/workspace-card.component.d.ts.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-card.component.js +243 -0
- package/dist/lib/vendored/workspace-tabs/workspace-card.component.js.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tab-store.d.ts +47 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tab-store.d.ts.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tab-store.js +112 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tab-store.js.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tab-strip.component.d.ts +36 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tab-strip.component.d.ts.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tab-strip.component.js +179 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tab-strip.component.js.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tabs.types.d.ts +36 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tabs.types.d.ts.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tabs.types.js +9 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tabs.types.js.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tip.directive.d.ts +35 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tip.directive.d.ts.map +1 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tip.directive.js +124 -0
- package/dist/lib/vendored/workspace-tabs/workspace-tip.directive.js.map +1 -0
- package/dist/lib/workspace/deal-workspace.component.d.ts +706 -0
- package/dist/lib/workspace/deal-workspace.component.d.ts.map +1 -0
- package/dist/lib/workspace/deal-workspace.component.js +2749 -0
- package/dist/lib/workspace/deal-workspace.component.js.map +1 -0
- package/dist/lib/workspace/deal-workspace.dates.d.ts +40 -0
- package/dist/lib/workspace/deal-workspace.dates.d.ts.map +1 -0
- package/dist/lib/workspace/deal-workspace.dates.js +60 -0
- package/dist/lib/workspace/deal-workspace.dates.js.map +1 -0
- package/dist/lib/workspace/deal-workspace.products.d.ts +61 -0
- package/dist/lib/workspace/deal-workspace.products.d.ts.map +1 -0
- package/dist/lib/workspace/deal-workspace.products.js +58 -0
- package/dist/lib/workspace/deal-workspace.products.js.map +1 -0
- package/dist/lib/workspace/deal-workspace.service.d.ts +207 -0
- package/dist/lib/workspace/deal-workspace.service.d.ts.map +1 -0
- package/dist/lib/workspace/deal-workspace.service.js +501 -0
- package/dist/lib/workspace/deal-workspace.service.js.map +1 -0
- package/dist/lib/workspace/deal-workspace.types.d.ts +101 -0
- package/dist/lib/workspace/deal-workspace.types.d.ts.map +1 -0
- package/dist/lib/workspace/deal-workspace.types.js +35 -0
- package/dist/lib/workspace/deal-workspace.types.js.map +1 -0
- package/dist/lib/workspace/deal-workspace.validation.d.ts +174 -0
- package/dist/lib/workspace/deal-workspace.validation.d.ts.map +1 -0
- package/dist/lib/workspace/deal-workspace.validation.js +288 -0
- package/dist/lib/workspace/deal-workspace.validation.js.map +1 -0
- package/dist/public-api.d.ts +63 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +96 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview S-US9's surface — a deal's activities in chronological order, plus logging one.
|
|
3
|
+
*
|
|
4
|
+
* ── WHY THIS IS NOT A WORKSPACE PANE ────────────────────────────────────────────────────────────
|
|
5
|
+
*
|
|
6
|
+
* `DEAL_WORKSPACE_PANES` keys are `DealWorkspaceSection` values, and that union is what
|
|
7
|
+
* `ProjectValidation()` tags issues with so a pane can badge its own error count. An activity timeline
|
|
8
|
+
* has no validation state — it is a record of what happened, not a part of the draft being composed — so
|
|
9
|
+
* adding `'activity'` to that union would mean widening a type the whole validation layer reads in order
|
|
10
|
+
* to describe a section that can never carry an issue.
|
|
11
|
+
*
|
|
12
|
+
* It is a standalone component instead, which also keeps the merge surface to one line in the
|
|
13
|
+
* workspace template. That was a constraint worth designing around rather than working against: another
|
|
14
|
+
* instance is editing `deal-workspace.*` in the same window.
|
|
15
|
+
*
|
|
16
|
+
* ── AND WHY IT READS FOR ITSELF ─────────────────────────────────────────────────────────────────
|
|
17
|
+
*
|
|
18
|
+
* `ActivityReader` lives in `sales-core-entities-server`, and an Angular component must not import a
|
|
19
|
+
* server package — that is the layering, and it is also how a server-only dependency ends up in a
|
|
20
|
+
* browser bundle. The two reads here are the same shape as the reader's, deliberately, so the surface and
|
|
21
|
+
* the API agree about what a timeline is. `deal-workspace.service.ts` reads its own data the same way;
|
|
22
|
+
* there is no shared read layer in this app to reuse.
|
|
23
|
+
*
|
|
24
|
+
* @module @mj-biz-apps/sales-ng
|
|
25
|
+
*/
|
|
26
|
+
import { CommonModule } from '@angular/common';
|
|
27
|
+
import { ChangeDetectorRef, Component, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
28
|
+
import { FormsModule } from '@angular/forms';
|
|
29
|
+
import { Metadata, RunView } from '@memberjunction/core';
|
|
30
|
+
import { GraphQLActionClient } from '@memberjunction/graphql-dataprovider';
|
|
31
|
+
/** For `<mj-loading>` — the house rule is that spinner and no other. */
|
|
32
|
+
import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
|
|
33
|
+
import * as i0 from "@angular/core";
|
|
34
|
+
import * as i1 from "@angular/forms";
|
|
35
|
+
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
36
|
+
import * as i3 from "@angular/common";
|
|
37
|
+
const _forTrack0 = ($index, $item) => $item.ID;
|
|
38
|
+
function DealActivityTimelineComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
39
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
40
|
+
i0.ɵɵelementStart(0, "button", 8);
|
|
41
|
+
i0.ɵɵlistener("click", function DealActivityTimelineComponent_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.StartAdd()); });
|
|
42
|
+
i0.ɵɵelement(1, "i", 9);
|
|
43
|
+
i0.ɵɵtext(2, " Log activity ");
|
|
44
|
+
i0.ɵɵelementEnd();
|
|
45
|
+
} if (rf & 2) {
|
|
46
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
47
|
+
i0.ɵɵproperty("disabled", !ctx_r1.DealID);
|
|
48
|
+
} }
|
|
49
|
+
function DealActivityTimelineComponent_Conditional_6_For_6_Template(rf, ctx) { if (rf & 1) {
|
|
50
|
+
i0.ɵɵelementStart(0, "option", 13);
|
|
51
|
+
i0.ɵɵtext(1);
|
|
52
|
+
i0.ɵɵelementEnd();
|
|
53
|
+
} if (rf & 2) {
|
|
54
|
+
const code_r4 = ctx.$implicit;
|
|
55
|
+
i0.ɵɵproperty("value", code_r4);
|
|
56
|
+
i0.ɵɵadvance();
|
|
57
|
+
i0.ɵɵtextInterpolate(code_r4);
|
|
58
|
+
} }
|
|
59
|
+
function DealActivityTimelineComponent_Conditional_6_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
60
|
+
i0.ɵɵelementStart(0, "p", 18);
|
|
61
|
+
i0.ɵɵtext(1);
|
|
62
|
+
i0.ɵɵelementEnd();
|
|
63
|
+
} if (rf & 2) {
|
|
64
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
65
|
+
i0.ɵɵadvance();
|
|
66
|
+
i0.ɵɵtextInterpolate(ctx_r1.Error);
|
|
67
|
+
} }
|
|
68
|
+
function DealActivityTimelineComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
69
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
70
|
+
i0.ɵɵelementStart(0, "form", 10);
|
|
71
|
+
i0.ɵɵlistener("ngSubmit", function DealActivityTimelineComponent_Conditional_6_Template_form_ngSubmit_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Save()); });
|
|
72
|
+
i0.ɵɵelementStart(1, "label", 11)(2, "span");
|
|
73
|
+
i0.ɵɵtext(3, "Type");
|
|
74
|
+
i0.ɵɵelementEnd();
|
|
75
|
+
i0.ɵɵelementStart(4, "select", 12);
|
|
76
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DealActivityTimelineComponent_Conditional_6_Template_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DraftTypeCode, $event) || (ctx_r1.DraftTypeCode = $event); return i0.ɵɵresetView($event); });
|
|
77
|
+
i0.ɵɵrepeaterCreate(5, DealActivityTimelineComponent_Conditional_6_For_6_Template, 2, 2, "option", 13, i0.ɵɵrepeaterTrackByIdentity);
|
|
78
|
+
i0.ɵɵelementEnd()();
|
|
79
|
+
i0.ɵɵelementStart(7, "label", 14)(8, "span");
|
|
80
|
+
i0.ɵɵtext(9, "Subject");
|
|
81
|
+
i0.ɵɵelementEnd();
|
|
82
|
+
i0.ɵɵelementStart(10, "input", 15);
|
|
83
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DealActivityTimelineComponent_Conditional_6_Template_input_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DraftTitle, $event) || (ctx_r1.DraftTitle = $event); return i0.ɵɵresetView($event); });
|
|
84
|
+
i0.ɵɵelementEnd()();
|
|
85
|
+
i0.ɵɵelementStart(11, "label", 14)(12, "span");
|
|
86
|
+
i0.ɵɵtext(13, "Notes");
|
|
87
|
+
i0.ɵɵelementEnd();
|
|
88
|
+
i0.ɵɵelementStart(14, "textarea", 16);
|
|
89
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DealActivityTimelineComponent_Conditional_6_Template_textarea_ngModelChange_14_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DraftNotes, $event) || (ctx_r1.DraftNotes = $event); return i0.ɵɵresetView($event); });
|
|
90
|
+
i0.ɵɵelementEnd()();
|
|
91
|
+
i0.ɵɵelementStart(15, "label", 11)(16, "span");
|
|
92
|
+
i0.ɵɵtext(17, "When");
|
|
93
|
+
i0.ɵɵelementEnd();
|
|
94
|
+
i0.ɵɵelementStart(18, "input", 17);
|
|
95
|
+
i0.ɵɵtwoWayListener("ngModelChange", function DealActivityTimelineComponent_Conditional_6_Template_input_ngModelChange_18_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.DraftWhen, $event) || (ctx_r1.DraftWhen = $event); return i0.ɵɵresetView($event); });
|
|
96
|
+
i0.ɵɵelementEnd()();
|
|
97
|
+
i0.ɵɵconditionalCreate(19, DealActivityTimelineComponent_Conditional_6_Conditional_19_Template, 2, 1, "p", 18);
|
|
98
|
+
i0.ɵɵelementStart(20, "div", 19)(21, "button", 20);
|
|
99
|
+
i0.ɵɵtext(22);
|
|
100
|
+
i0.ɵɵelementEnd();
|
|
101
|
+
i0.ɵɵelementStart(23, "button", 21);
|
|
102
|
+
i0.ɵɵlistener("click", function DealActivityTimelineComponent_Conditional_6_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CancelAdd()); });
|
|
103
|
+
i0.ɵɵtext(24, " Cancel ");
|
|
104
|
+
i0.ɵɵelementEnd()()();
|
|
105
|
+
} if (rf & 2) {
|
|
106
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
107
|
+
i0.ɵɵadvance(4);
|
|
108
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.DraftTypeCode);
|
|
109
|
+
i0.ɵɵadvance();
|
|
110
|
+
i0.ɵɵrepeater(ctx_r1.Codes);
|
|
111
|
+
i0.ɵɵadvance(5);
|
|
112
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.DraftTitle);
|
|
113
|
+
i0.ɵɵadvance(4);
|
|
114
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.DraftNotes);
|
|
115
|
+
i0.ɵɵadvance(4);
|
|
116
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.DraftWhen);
|
|
117
|
+
i0.ɵɵadvance();
|
|
118
|
+
i0.ɵɵconditional(ctx_r1.Error ? 19 : -1);
|
|
119
|
+
i0.ɵɵadvance(2);
|
|
120
|
+
i0.ɵɵproperty("disabled", ctx_r1.Saving || !ctx_r1.DraftTitle.trim());
|
|
121
|
+
i0.ɵɵadvance();
|
|
122
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.Saving ? "Saving\u2026" : "Log it", " ");
|
|
123
|
+
i0.ɵɵadvance();
|
|
124
|
+
i0.ɵɵproperty("disabled", ctx_r1.Saving);
|
|
125
|
+
} }
|
|
126
|
+
function DealActivityTimelineComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
127
|
+
i0.ɵɵelement(0, "mj-loading");
|
|
128
|
+
} }
|
|
129
|
+
function DealActivityTimelineComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
130
|
+
i0.ɵɵelementStart(0, "p", 6);
|
|
131
|
+
i0.ɵɵtext(1, "Nothing logged on this deal yet.");
|
|
132
|
+
i0.ɵɵelementEnd();
|
|
133
|
+
} }
|
|
134
|
+
function DealActivityTimelineComponent_Conditional_9_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
135
|
+
i0.ɵɵelementStart(0, "span", 27);
|
|
136
|
+
i0.ɵɵelement(1, "i", 31);
|
|
137
|
+
i0.ɵɵtext(2);
|
|
138
|
+
i0.ɵɵelementEnd();
|
|
139
|
+
} if (rf & 2) {
|
|
140
|
+
const row_r5 = i0.ɵɵnextContext().$implicit;
|
|
141
|
+
i0.ɵɵproperty("title", "Ingested automatically from " + row_r5.SourceSystem);
|
|
142
|
+
i0.ɵɵadvance(2);
|
|
143
|
+
i0.ɵɵtextInterpolate1(" ", row_r5.SourceSystem, " ");
|
|
144
|
+
} }
|
|
145
|
+
function DealActivityTimelineComponent_Conditional_9_For_2_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
146
|
+
i0.ɵɵelementStart(0, "span", 28);
|
|
147
|
+
i0.ɵɵelement(1, "i", 32);
|
|
148
|
+
i0.ɵɵtext(2, " logged ");
|
|
149
|
+
i0.ɵɵelementEnd();
|
|
150
|
+
} }
|
|
151
|
+
function DealActivityTimelineComponent_Conditional_9_For_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
152
|
+
i0.ɵɵelementStart(0, "p", 30);
|
|
153
|
+
i0.ɵɵtext(1);
|
|
154
|
+
i0.ɵɵelementEnd();
|
|
155
|
+
} if (rf & 2) {
|
|
156
|
+
const row_r5 = i0.ɵɵnextContext().$implicit;
|
|
157
|
+
i0.ɵɵadvance();
|
|
158
|
+
i0.ɵɵtextInterpolate(row_r5.Description);
|
|
159
|
+
} }
|
|
160
|
+
function DealActivityTimelineComponent_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
161
|
+
i0.ɵɵelementStart(0, "li", 22)(1, "div", 23);
|
|
162
|
+
i0.ɵɵtext(2);
|
|
163
|
+
i0.ɵɵpipe(3, "date");
|
|
164
|
+
i0.ɵɵelementEnd();
|
|
165
|
+
i0.ɵɵelementStart(4, "div", 24)(5, "div", 25)(6, "span", 26);
|
|
166
|
+
i0.ɵɵtext(7);
|
|
167
|
+
i0.ɵɵelementEnd();
|
|
168
|
+
i0.ɵɵconditionalCreate(8, DealActivityTimelineComponent_Conditional_9_For_2_Conditional_8_Template, 3, 2, "span", 27)(9, DealActivityTimelineComponent_Conditional_9_For_2_Conditional_9_Template, 3, 0, "span", 28);
|
|
169
|
+
i0.ɵɵelementEnd();
|
|
170
|
+
i0.ɵɵelementStart(10, "div", 29);
|
|
171
|
+
i0.ɵɵtext(11);
|
|
172
|
+
i0.ɵɵelementEnd();
|
|
173
|
+
i0.ɵɵconditionalCreate(12, DealActivityTimelineComponent_Conditional_9_For_2_Conditional_12_Template, 2, 1, "p", 30);
|
|
174
|
+
i0.ɵɵelementEnd()();
|
|
175
|
+
} if (rf & 2) {
|
|
176
|
+
const row_r5 = ctx.$implicit;
|
|
177
|
+
i0.ɵɵadvance(2);
|
|
178
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind3(3, 5, row_r5.StartedAt, "medium", "UTC"));
|
|
179
|
+
i0.ɵɵadvance(5);
|
|
180
|
+
i0.ɵɵtextInterpolate(row_r5.TypeName);
|
|
181
|
+
i0.ɵɵadvance();
|
|
182
|
+
i0.ɵɵconditional(row_r5.SourceSystem ? 8 : 9);
|
|
183
|
+
i0.ɵɵadvance(3);
|
|
184
|
+
i0.ɵɵtextInterpolate(row_r5.Title);
|
|
185
|
+
i0.ɵɵadvance();
|
|
186
|
+
i0.ɵɵconditional(row_r5.Description ? 12 : -1);
|
|
187
|
+
} }
|
|
188
|
+
function DealActivityTimelineComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
189
|
+
i0.ɵɵelementStart(0, "ol", 7);
|
|
190
|
+
i0.ɵɵrepeaterCreate(1, DealActivityTimelineComponent_Conditional_9_For_2_Template, 13, 9, "li", 22, _forTrack0);
|
|
191
|
+
i0.ɵɵelementEnd();
|
|
192
|
+
} if (rf & 2) {
|
|
193
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
194
|
+
i0.ɵɵadvance();
|
|
195
|
+
i0.ɵɵrepeater(ctx_r1.Rows);
|
|
196
|
+
} }
|
|
197
|
+
/** Common's entity names. Strings, because sales must not import contracts' or common's classes here. */
|
|
198
|
+
const E_ACTIVITY = 'MJ_BizApps_Common: Activities';
|
|
199
|
+
const E_ACTIVITY_LINK = 'MJ_BizApps_Common: Activity Links';
|
|
200
|
+
const E_DEAL = 'MJ_BizApps_Sales: Deals';
|
|
201
|
+
/** The seeded Action this pane calls. Its display Name, which is what `Action.Name` holds. */
|
|
202
|
+
const LOG_ACTIVITY_ACTION = 'Log Activity';
|
|
203
|
+
/** The four codes a person can log by hand. Meetings arrive from the calendar, not from this form. */
|
|
204
|
+
const LOGGABLE_CODES = ['Call', 'Meeting', 'Note', 'Email'];
|
|
205
|
+
export class DealActivityTimelineComponent {
|
|
206
|
+
cdr = inject(ChangeDetectorRef);
|
|
207
|
+
/** Setting this loads the timeline. Null means no deal is open, so there is nothing to show. */
|
|
208
|
+
set DealID(value) {
|
|
209
|
+
this.dealID = value;
|
|
210
|
+
void this.Load();
|
|
211
|
+
}
|
|
212
|
+
get DealID() {
|
|
213
|
+
return this.dealID;
|
|
214
|
+
}
|
|
215
|
+
dealID = null;
|
|
216
|
+
/** Raised after a successful log, so a host can refresh anything that counts activities. */
|
|
217
|
+
Logged = new EventEmitter();
|
|
218
|
+
Rows = [];
|
|
219
|
+
Loading = false;
|
|
220
|
+
Adding = false;
|
|
221
|
+
Saving = false;
|
|
222
|
+
Error = null;
|
|
223
|
+
Codes = LOGGABLE_CODES;
|
|
224
|
+
DraftTypeCode = 'Call';
|
|
225
|
+
DraftTitle = '';
|
|
226
|
+
DraftNotes = '';
|
|
227
|
+
DraftWhen = '';
|
|
228
|
+
StartAdd() {
|
|
229
|
+
this.Adding = true;
|
|
230
|
+
this.Error = null;
|
|
231
|
+
this.DraftTitle = '';
|
|
232
|
+
this.DraftNotes = '';
|
|
233
|
+
this.DraftTypeCode = 'Call';
|
|
234
|
+
/**
|
|
235
|
+
* Prefilled with NOW, in the local zone, because `datetime-local` has no zone and a browser will
|
|
236
|
+
* not accept a UTC string here. It is converted back on save — everything persisted is UTC.
|
|
237
|
+
*/
|
|
238
|
+
this.DraftWhen = localInputValue(new Date());
|
|
239
|
+
this.cdr.detectChanges();
|
|
240
|
+
}
|
|
241
|
+
CancelAdd() {
|
|
242
|
+
this.Adding = false;
|
|
243
|
+
this.Error = null;
|
|
244
|
+
this.cdr.detectChanges();
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Logs the activity by calling `Sales.LogActivity`. This component composes NOTHING.
|
|
248
|
+
*
|
|
249
|
+
* ── WHAT THIS REPLACED, AND WHY IT WAS NOT A MISSING FIELD ──
|
|
250
|
+
*
|
|
251
|
+
* The previous version wrote the `Activity` and its `ActivityLink` here, by hand. It never set
|
|
252
|
+
* `LoggedByUserID`, which is NOT NULL with no default, so **every attempt to log an activity from
|
|
253
|
+
* this pane failed at the database** with a raw constraint error the rep could do nothing with. The
|
|
254
|
+
* feature had never worked.
|
|
255
|
+
*
|
|
256
|
+
* Adding the field would have fixed the error and left the real defect: two independent saves, so a
|
|
257
|
+
* link failure committed an activity no surface could ever reach, and a second copy of a composition
|
|
258
|
+
* that `ActivityWriterService`'s own header had already predicted would drift. It drifted in exactly
|
|
259
|
+
* the way that header warned about.
|
|
260
|
+
*
|
|
261
|
+
* So the composition is gone from here. The service stamps the user, resolves the deal's account and
|
|
262
|
+
* primary contact as participants, and wraps the activity and every link in ONE transaction — which
|
|
263
|
+
* a browser cannot open at all, and which is the strongest reason this could never have been correct
|
|
264
|
+
* client-side.
|
|
265
|
+
*
|
|
266
|
+
* ── WHY AN ACTION CALL AND NOT A REMOTE OPERATION ──
|
|
267
|
+
*
|
|
268
|
+
* `GraphQLActionClient.RunAction` is the browser-reachable path, and the one MJ's own
|
|
269
|
+
* `interactive-form-apply.service.ts` uses. A remote operation would read better beside
|
|
270
|
+
* `Sales.CloseDeal`, but operation shells are CodeGen output and CodeGen is not run here to close a
|
|
271
|
+
* gap — see `docs/CODEGEN-PARTIAL-RUNS.md`.
|
|
272
|
+
*/
|
|
273
|
+
async Save() {
|
|
274
|
+
if (!this.dealID || !this.DraftTitle.trim()) {
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
this.Saving = true;
|
|
278
|
+
this.Error = null;
|
|
279
|
+
this.cdr.detectChanges();
|
|
280
|
+
try {
|
|
281
|
+
const provider = Metadata.Provider;
|
|
282
|
+
const client = this.actionClient(provider);
|
|
283
|
+
if (!client) {
|
|
284
|
+
this.Error = 'Logging an activity needs a GraphQL connection, which this session does not have.';
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const actionID = await this.logActivityActionID(provider);
|
|
288
|
+
if (!actionID) {
|
|
289
|
+
this.Error =
|
|
290
|
+
'The Log Activity action is not installed in this deployment. It is seeded from '
|
|
291
|
+
+ 'metadata/actions/; run `mj sync push --dir metadata`.';
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
const result = await client.RunAction(actionID, [
|
|
295
|
+
{ Name: 'DealID', Value: this.dealID, Type: 'Input' },
|
|
296
|
+
{ Name: 'TypeCode', Value: this.DraftTypeCode, Type: 'Input' },
|
|
297
|
+
{ Name: 'Title', Value: this.DraftTitle.trim(), Type: 'Input' },
|
|
298
|
+
{ Name: 'Notes', Value: this.DraftNotes.trim(), Type: 'Input' },
|
|
299
|
+
/**
|
|
300
|
+
* SENT AS AN INSTANT, not as the `datetime-local` text. That input carries no zone, so
|
|
301
|
+
* handing its string to the server would have it read in the server's zone — everything
|
|
302
|
+
* stored here is UTC and the shift would be invisible.
|
|
303
|
+
*/
|
|
304
|
+
{
|
|
305
|
+
Name: 'StartedAt',
|
|
306
|
+
Value: (this.DraftWhen ? new Date(this.DraftWhen) : new Date()).toISOString(),
|
|
307
|
+
Type: 'Input',
|
|
308
|
+
},
|
|
309
|
+
]);
|
|
310
|
+
if (result?.Success !== true) {
|
|
311
|
+
/**
|
|
312
|
+
* The action's own message is shown verbatim. It names the actual refusal — a bad type
|
|
313
|
+
* code, an unreadable date, a missing deal — which is worth more to a rep than anything
|
|
314
|
+
* this component could paraphrase.
|
|
315
|
+
*/
|
|
316
|
+
this.Error = actionMessage(result) ?? 'The activity could not be logged.';
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
this.Adding = false;
|
|
320
|
+
this.Logged.emit(this.dealID);
|
|
321
|
+
await this.Load();
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
this.Error = `The activity could not be logged: ${String(err)}`;
|
|
325
|
+
}
|
|
326
|
+
finally {
|
|
327
|
+
this.Saving = false;
|
|
328
|
+
this.cdr.detectChanges();
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* The action client, or null when this provider cannot reach one.
|
|
333
|
+
*
|
|
334
|
+
* Duck-checked on `ExecuteGQL` rather than by `instanceof`: the provider is typed as
|
|
335
|
+
* `IMetadataProvider` and only the GraphQL one can run an action, so the test has to be about the
|
|
336
|
+
* capability rather than the class.
|
|
337
|
+
*/
|
|
338
|
+
actionClient(provider) {
|
|
339
|
+
const gql = provider;
|
|
340
|
+
if (typeof gql?.ExecuteGQL !== 'function') {
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
return new GraphQLActionClient(gql);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Resolve the action's ID by NAME, with a RunView against `MJ: Actions`.
|
|
347
|
+
*
|
|
348
|
+
* THIS READ `provider.Actions` AND THAT PROPERTY DOES NOT EXIST. `IMetadataProvider` exposes no
|
|
349
|
+
* `Actions` member, so the cast produced `undefined`, `?? []` turned that into an empty array, and
|
|
350
|
+
* the lookup returned null on every call. The component then reported
|
|
351
|
+
*
|
|
352
|
+
* The Log Activity action is not installed in this deployment.
|
|
353
|
+
*
|
|
354
|
+
* which is a specific, actionable and completely wrong diagnosis: measured 2026-08-25, the action
|
|
355
|
+
* row is present, Active, in the Sales category, with DriverClass Sales.LogActivity, and identical
|
|
356
|
+
* to the row on a freshly seeded database. Anyone following that message ran `mj sync push` -- as I
|
|
357
|
+
* did -- and changed nothing, because nothing was missing. `?? []` is what made a missing property
|
|
358
|
+
* indistinguishable from a missing row.
|
|
359
|
+
*
|
|
360
|
+
* The pattern here is MJ's own, from `interactive-form-apply.service.ts`, the same service this
|
|
361
|
+
* component's docblock already cites for using GraphQLActionClient: "Falls back to a direct RunView
|
|
362
|
+
* against the Action entity when ActionEngine isn't loaded." ActionEngineBase would also work, but
|
|
363
|
+
* it needs Config() and is not initialised on this surface -- which is precisely the case MJ's
|
|
364
|
+
* fallback exists for.
|
|
365
|
+
*/
|
|
366
|
+
async logActivityActionID(provider) {
|
|
367
|
+
try {
|
|
368
|
+
const rv = RunView.FromMetadataProvider(provider);
|
|
369
|
+
const result = await rv.RunView({
|
|
370
|
+
EntityName: 'MJ: Actions',
|
|
371
|
+
ExtraFilter: `Name='${LOG_ACTIVITY_ACTION.replace(/'/g, "''")}'`,
|
|
372
|
+
Fields: ['ID'],
|
|
373
|
+
MaxRows: 1,
|
|
374
|
+
ResultType: 'simple',
|
|
375
|
+
});
|
|
376
|
+
return result.Success ? (result.Results?.[0]?.ID ?? null) : null;
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return null;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
/** Newest first, by when it HAPPENED rather than when it was filed. */
|
|
383
|
+
async Load() {
|
|
384
|
+
if (!this.dealID) {
|
|
385
|
+
this.Rows = [];
|
|
386
|
+
this.cdr.detectChanges();
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
this.Loading = true;
|
|
390
|
+
this.cdr.detectChanges();
|
|
391
|
+
try {
|
|
392
|
+
const md = new Metadata();
|
|
393
|
+
if (!md.Entities.some((e) => e.Name === E_ACTIVITY)) {
|
|
394
|
+
// Common is not installed here. An empty timeline says that perfectly well.
|
|
395
|
+
this.Rows = [];
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
const dealEntityID = md.Entities.find((e) => e.Name === E_DEAL)?.ID;
|
|
399
|
+
if (!dealEntityID) {
|
|
400
|
+
this.Rows = [];
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const anchors = await new RunView().RunView({
|
|
404
|
+
EntityName: E_ACTIVITY_LINK,
|
|
405
|
+
ExtraFilter: `EntityID = '${escape(dealEntityID)}' AND RecordID = '${escape(this.dealID)}'`,
|
|
406
|
+
ResultType: 'simple',
|
|
407
|
+
Fields: ['ActivityID'],
|
|
408
|
+
});
|
|
409
|
+
const ids = anchors.Success
|
|
410
|
+
? [...new Set((anchors.Results ?? []).map((r) => String(r.ActivityID)))]
|
|
411
|
+
: [];
|
|
412
|
+
if (ids.length === 0) {
|
|
413
|
+
this.Rows = [];
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
const list = ids.map((id) => `'${escape(id)}'`).join(', ');
|
|
417
|
+
const found = await new RunView().RunView({
|
|
418
|
+
EntityName: E_ACTIVITY,
|
|
419
|
+
ExtraFilter: `ID IN (${list})`,
|
|
420
|
+
OrderBy: 'StartedAt DESC',
|
|
421
|
+
ResultType: 'simple',
|
|
422
|
+
});
|
|
423
|
+
this.Rows = (found.Success ? (found.Results ?? []) : []).map((row) => ({
|
|
424
|
+
ID: row.ID,
|
|
425
|
+
TypeName: row.ActivityType ?? '—',
|
|
426
|
+
Title: row.Title,
|
|
427
|
+
Description: row.Description ?? null,
|
|
428
|
+
StartedAt: row.StartedAt,
|
|
429
|
+
Direction: row.Direction,
|
|
430
|
+
SourceSystem: row.SourceSystem ?? null,
|
|
431
|
+
Source: row.Source,
|
|
432
|
+
}));
|
|
433
|
+
}
|
|
434
|
+
finally {
|
|
435
|
+
this.Loading = false;
|
|
436
|
+
this.cdr.detectChanges();
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
static ɵfac = function DealActivityTimelineComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DealActivityTimelineComponent)(); };
|
|
440
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DealActivityTimelineComponent, selectors: [["mjs-deal-activity-timeline"]], inputs: { DealID: "DealID" }, outputs: { Logged: "Logged" }, decls: 10, vars: 3, consts: [[1, "dat"], [1, "dat__head"], [1, "dat__title"], ["aria-hidden", "true", 1, "fa-solid", "fa-clock-rotate-left"], ["type", "button", 1, "dat__add", 3, "disabled"], [1, "dat__form"], [1, "dat__empty"], [1, "dat__list"], ["type", "button", 1, "dat__add", 3, "click", "disabled"], ["aria-hidden", "true", 1, "fa-solid", "fa-plus"], [1, "dat__form", 3, "ngSubmit"], [1, "dat__field"], ["name", "type", 3, "ngModelChange", "ngModel"], [3, "value"], [1, "dat__field", "dat__field--wide"], ["type", "text", "name", "title", "maxlength", "500", 3, "ngModelChange", "ngModel"], ["name", "notes", "rows", "3", 3, "ngModelChange", "ngModel"], ["type", "datetime-local", "name", "when", 3, "ngModelChange", "ngModel"], [1, "dat__error"], [1, "dat__actions"], ["type", "submit", 1, "dat__save", 3, "disabled"], ["type", "button", 1, "dat__cancel", 3, "click", "disabled"], [1, "dat__item"], [1, "dat__when"], [1, "dat__body"], [1, "dat__row"], [1, "dat__type"], [1, "dat__badge", "dat__badge--sync", 3, "title"], ["title", "Logged by a person", 1, "dat__badge"], [1, "dat__subject"], [1, "dat__notes"], ["aria-hidden", "true", 1, "fa-solid", "fa-inbox"], ["aria-hidden", "true", 1, "fa-solid", "fa-pen"]], template: function DealActivityTimelineComponent_Template(rf, ctx) { if (rf & 1) {
|
|
441
|
+
i0.ɵɵelementStart(0, "section", 0)(1, "header", 1)(2, "h3", 2);
|
|
442
|
+
i0.ɵɵelement(3, "i", 3);
|
|
443
|
+
i0.ɵɵtext(4, " Activity ");
|
|
444
|
+
i0.ɵɵelementEnd();
|
|
445
|
+
i0.ɵɵconditionalCreate(5, DealActivityTimelineComponent_Conditional_5_Template, 3, 1, "button", 4);
|
|
446
|
+
i0.ɵɵelementEnd();
|
|
447
|
+
i0.ɵɵconditionalCreate(6, DealActivityTimelineComponent_Conditional_6_Template, 25, 8, "form", 5);
|
|
448
|
+
i0.ɵɵconditionalCreate(7, DealActivityTimelineComponent_Conditional_7_Template, 1, 0, "mj-loading")(8, DealActivityTimelineComponent_Conditional_8_Template, 2, 0, "p", 6)(9, DealActivityTimelineComponent_Conditional_9_Template, 3, 0, "ol", 7);
|
|
449
|
+
i0.ɵɵelementEnd();
|
|
450
|
+
} if (rf & 2) {
|
|
451
|
+
i0.ɵɵadvance(5);
|
|
452
|
+
i0.ɵɵconditional(!ctx.Adding ? 5 : -1);
|
|
453
|
+
i0.ɵɵadvance();
|
|
454
|
+
i0.ɵɵconditional(ctx.Adding ? 6 : -1);
|
|
455
|
+
i0.ɵɵadvance();
|
|
456
|
+
i0.ɵɵconditional(ctx.Loading ? 7 : ctx.Rows.length === 0 ? 8 : 9);
|
|
457
|
+
} }, dependencies: [CommonModule, FormsModule, i1.ɵNgNoValidate, i1.NgSelectOption, i1.ɵNgSelectMultipleOption, i1.DefaultValueAccessor, i1.SelectControlValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.MaxLengthValidator, i1.NgModel, i1.NgForm, SharedGenericModule, i2.LoadingComponent, i3.DatePipe], styles: [".dat[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 12px; }\n .dat__head[_ngcontent-%COMP%] { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n .dat__title[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px; margin: 0;\n font-size: 0.9375rem; color: var(--mj-text-primary);\n }\n .dat__add[_ngcontent-%COMP%], .dat__save[_ngcontent-%COMP%], .dat__cancel[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-color); border-radius: 4px;\n background: var(--mj-surface-raised); color: var(--mj-text-primary);\n padding: 5px 11px; font-size: 0.8125rem; cursor: pointer;\n }\n .dat__save[_ngcontent-%COMP%] { background: var(--mj-accent-primary); color: var(--mj-text-inverse); border-color: transparent; }\n .dat__add[_ngcontent-%COMP%]:disabled, .dat__save[_ngcontent-%COMP%]:disabled, .dat__cancel[_ngcontent-%COMP%]:disabled { opacity: 0.55; cursor: default; }\n .dat__form[_ngcontent-%COMP%] {\n display: flex; flex-wrap: wrap; gap: 10px;\n border: 1px solid var(--mj-border-color); border-radius: 4px;\n padding: 12px; background: var(--mj-surface-sunken);\n }\n .dat__field[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 4px; font-size: 0.75rem; flex: 1 1 160px; }\n .dat__field--wide[_ngcontent-%COMP%] { flex: 1 1 100%; }\n .dat__field[_ngcontent-%COMP%] span[_ngcontent-%COMP%] { color: var(--mj-text-secondary); }\n .dat__field[_ngcontent-%COMP%] input[_ngcontent-%COMP%], .dat__field[_ngcontent-%COMP%] select[_ngcontent-%COMP%], .dat__field[_ngcontent-%COMP%] textarea[_ngcontent-%COMP%] {\n border: 1px solid var(--mj-border-color); border-radius: 3px;\n background: var(--mj-surface-raised); color: var(--mj-text-primary);\n padding: 5px 7px; font: inherit; font-size: 0.8125rem;\n }\n .dat__actions[_ngcontent-%COMP%] { display: flex; gap: 8px; flex: 1 1 100%; }\n .dat__error[_ngcontent-%COMP%] { flex: 1 1 100%; margin: 0; color: var(--mj-status-error); font-size: 0.8125rem; }\n .dat__empty[_ngcontent-%COMP%] { margin: 0; color: var(--mj-text-muted); font-size: 0.8125rem; }\n .dat__list[_ngcontent-%COMP%] { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }\n .dat__item[_ngcontent-%COMP%] {\n display: flex; gap: 12px;\n border-left: 2px solid var(--mj-border-color); padding-left: 12px;\n }\n .dat__when[_ngcontent-%COMP%] {\n flex: 0 0 auto; font-size: 0.75rem; color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums; min-width: 11ch;\n }\n .dat__body[_ngcontent-%COMP%] { display: flex; flex-direction: column; gap: 3px; min-width: 0; }\n .dat__row[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n .dat__type[_ngcontent-%COMP%] { font-size: 0.75rem; color: var(--mj-text-secondary); text-transform: uppercase; letter-spacing: 0.06em; }\n .dat__badge[_ngcontent-%COMP%] { font-size: 0.6875rem; color: var(--mj-text-muted); display: inline-flex; align-items: center; gap: 4px; }\n .dat__badge--sync[_ngcontent-%COMP%] { color: var(--mj-accent-primary); }\n .dat__subject[_ngcontent-%COMP%] { font-size: 0.875rem; color: var(--mj-text-primary); }\n .dat__notes[_ngcontent-%COMP%] { margin: 0; font-size: 0.8125rem; color: var(--mj-text-secondary); white-space: pre-wrap; }"] });
|
|
458
|
+
}
|
|
459
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DealActivityTimelineComponent, [{
|
|
460
|
+
type: Component,
|
|
461
|
+
args: [{ selector: 'mjs-deal-activity-timeline', standalone: true, imports: [CommonModule, FormsModule, SharedGenericModule], template: `
|
|
462
|
+
<section class="dat">
|
|
463
|
+
<header class="dat__head">
|
|
464
|
+
<h3 class="dat__title">
|
|
465
|
+
<i class="fa-solid fa-clock-rotate-left" aria-hidden="true"></i>
|
|
466
|
+
Activity
|
|
467
|
+
</h3>
|
|
468
|
+
@if (!Adding) {
|
|
469
|
+
<button type="button" class="dat__add" (click)="StartAdd()" [disabled]="!DealID">
|
|
470
|
+
<i class="fa-solid fa-plus" aria-hidden="true"></i> Log activity
|
|
471
|
+
</button>
|
|
472
|
+
}
|
|
473
|
+
</header>
|
|
474
|
+
|
|
475
|
+
@if (Adding) {
|
|
476
|
+
<!--
|
|
477
|
+
CONFIRM LEFT, CANCEL RIGHT — the house rule. The type list is the four things a person
|
|
478
|
+
logs by hand; a meeting ingested from a calendar is not entered here.
|
|
479
|
+
-->
|
|
480
|
+
<form class="dat__form" (ngSubmit)="Save()">
|
|
481
|
+
<label class="dat__field">
|
|
482
|
+
<span>Type</span>
|
|
483
|
+
<select [(ngModel)]="DraftTypeCode" name="type">
|
|
484
|
+
@for (code of Codes; track code) {
|
|
485
|
+
<option [value]="code">{{ code }}</option>
|
|
486
|
+
}
|
|
487
|
+
</select>
|
|
488
|
+
</label>
|
|
489
|
+
<label class="dat__field dat__field--wide">
|
|
490
|
+
<span>Subject</span>
|
|
491
|
+
<input type="text" [(ngModel)]="DraftTitle" name="title" maxlength="500" />
|
|
492
|
+
</label>
|
|
493
|
+
<label class="dat__field dat__field--wide">
|
|
494
|
+
<span>Notes</span>
|
|
495
|
+
<textarea [(ngModel)]="DraftNotes" name="notes" rows="3"></textarea>
|
|
496
|
+
</label>
|
|
497
|
+
<label class="dat__field">
|
|
498
|
+
<span>When</span>
|
|
499
|
+
<input type="datetime-local" [(ngModel)]="DraftWhen" name="when" />
|
|
500
|
+
</label>
|
|
501
|
+
@if (Error) {
|
|
502
|
+
<p class="dat__error">{{ Error }}</p>
|
|
503
|
+
}
|
|
504
|
+
<div class="dat__actions">
|
|
505
|
+
<button type="submit" class="dat__save" [disabled]="Saving || !DraftTitle.trim()">
|
|
506
|
+
{{ Saving ? 'Saving…' : 'Log it' }}
|
|
507
|
+
</button>
|
|
508
|
+
<button type="button" class="dat__cancel" (click)="CancelAdd()" [disabled]="Saving">
|
|
509
|
+
Cancel
|
|
510
|
+
</button>
|
|
511
|
+
</div>
|
|
512
|
+
</form>
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
@if (Loading) {
|
|
516
|
+
<mj-loading></mj-loading>
|
|
517
|
+
} @else if (Rows.length === 0) {
|
|
518
|
+
<p class="dat__empty">Nothing logged on this deal yet.</p>
|
|
519
|
+
} @else {
|
|
520
|
+
<ol class="dat__list">
|
|
521
|
+
@for (row of Rows; track row.ID) {
|
|
522
|
+
<li class="dat__item">
|
|
523
|
+
<div class="dat__when">{{ row.StartedAt | date: 'medium' : 'UTC' }}</div>
|
|
524
|
+
<div class="dat__body">
|
|
525
|
+
<div class="dat__row">
|
|
526
|
+
<span class="dat__type">{{ row.TypeName }}</span>
|
|
527
|
+
<!--
|
|
528
|
+
BOTH PROVENANCES ARE MARKED. An ingested activity and a hand-logged
|
|
529
|
+
one are different kinds of fact, and marking only one would leave the
|
|
530
|
+
other identified by an absence nobody reads.
|
|
531
|
+
-->
|
|
532
|
+
@if (row.SourceSystem) {
|
|
533
|
+
<span class="dat__badge dat__badge--sync"
|
|
534
|
+
[title]="'Ingested automatically from ' + row.SourceSystem">
|
|
535
|
+
<i class="fa-solid fa-inbox" aria-hidden="true"></i> {{ row.SourceSystem }}
|
|
536
|
+
</span>
|
|
537
|
+
} @else {
|
|
538
|
+
<span class="dat__badge" title="Logged by a person">
|
|
539
|
+
<i class="fa-solid fa-pen" aria-hidden="true"></i> logged
|
|
540
|
+
</span>
|
|
541
|
+
}
|
|
542
|
+
</div>
|
|
543
|
+
<div class="dat__subject">{{ row.Title }}</div>
|
|
544
|
+
@if (row.Description) {
|
|
545
|
+
<p class="dat__notes">{{ row.Description }}</p>
|
|
546
|
+
}
|
|
547
|
+
</div>
|
|
548
|
+
</li>
|
|
549
|
+
}
|
|
550
|
+
</ol>
|
|
551
|
+
}
|
|
552
|
+
</section>
|
|
553
|
+
`, styles: ["\n .dat { display: flex; flex-direction: column; gap: 12px; }\n .dat__head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }\n .dat__title {\n display: flex; align-items: center; gap: 8px; margin: 0;\n font-size: 0.9375rem; color: var(--mj-text-primary);\n }\n .dat__add, .dat__save, .dat__cancel {\n border: 1px solid var(--mj-border-color); border-radius: 4px;\n background: var(--mj-surface-raised); color: var(--mj-text-primary);\n padding: 5px 11px; font-size: 0.8125rem; cursor: pointer;\n }\n .dat__save { background: var(--mj-accent-primary); color: var(--mj-text-inverse); border-color: transparent; }\n .dat__add:disabled, .dat__save:disabled, .dat__cancel:disabled { opacity: 0.55; cursor: default; }\n .dat__form {\n display: flex; flex-wrap: wrap; gap: 10px;\n border: 1px solid var(--mj-border-color); border-radius: 4px;\n padding: 12px; background: var(--mj-surface-sunken);\n }\n .dat__field { display: flex; flex-direction: column; gap: 4px; font-size: 0.75rem; flex: 1 1 160px; }\n .dat__field--wide { flex: 1 1 100%; }\n .dat__field span { color: var(--mj-text-secondary); }\n .dat__field input, .dat__field select, .dat__field textarea {\n border: 1px solid var(--mj-border-color); border-radius: 3px;\n background: var(--mj-surface-raised); color: var(--mj-text-primary);\n padding: 5px 7px; font: inherit; font-size: 0.8125rem;\n }\n .dat__actions { display: flex; gap: 8px; flex: 1 1 100%; }\n .dat__error { flex: 1 1 100%; margin: 0; color: var(--mj-status-error); font-size: 0.8125rem; }\n .dat__empty { margin: 0; color: var(--mj-text-muted); font-size: 0.8125rem; }\n .dat__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }\n .dat__item {\n display: flex; gap: 12px;\n border-left: 2px solid var(--mj-border-color); padding-left: 12px;\n }\n .dat__when {\n flex: 0 0 auto; font-size: 0.75rem; color: var(--mj-text-muted);\n font-variant-numeric: tabular-nums; min-width: 11ch;\n }\n .dat__body { display: flex; flex-direction: column; gap: 3px; min-width: 0; }\n .dat__row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n .dat__type { font-size: 0.75rem; color: var(--mj-text-secondary); text-transform: uppercase; letter-spacing: 0.06em; }\n .dat__badge { font-size: 0.6875rem; color: var(--mj-text-muted); display: inline-flex; align-items: center; gap: 4px; }\n .dat__badge--sync { color: var(--mj-accent-primary); }\n .dat__subject { font-size: 0.875rem; color: var(--mj-text-primary); }\n .dat__notes { margin: 0; font-size: 0.8125rem; color: var(--mj-text-secondary); white-space: pre-wrap; }\n "] }]
|
|
554
|
+
}], null, { DealID: [{
|
|
555
|
+
type: Input
|
|
556
|
+
}], Logged: [{
|
|
557
|
+
type: Output
|
|
558
|
+
}] }); })();
|
|
559
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DealActivityTimelineComponent, { className: "DealActivityTimelineComponent", filePath: "lib/activities/deal-activity-timeline.component.ts", lineNumber: 211 }); })();
|
|
560
|
+
function escape(value) {
|
|
561
|
+
return String(value).replace(/'/g, "''");
|
|
562
|
+
}
|
|
563
|
+
/** A `Date` as `datetime-local` wants it: local wall time, no zone, minutes precision. */
|
|
564
|
+
function localInputValue(when) {
|
|
565
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
566
|
+
return (`${when.getFullYear()}-${pad(when.getMonth() + 1)}-${pad(when.getDate())}`
|
|
567
|
+
+ `T${pad(when.getHours())}:${pad(when.getMinutes())}`);
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* The message off an action result, whatever shape it came back in.
|
|
571
|
+
*
|
|
572
|
+
* `ActionResult` does not expose `Message` or `ResultCode` at the top level — MJ's own caller reaches
|
|
573
|
+
* through `Result` for the code — so this reads defensively rather than asserting a shape that is not
|
|
574
|
+
* guaranteed. Returning null lets the caller supply its own fallback rather than showing "undefined".
|
|
575
|
+
*/
|
|
576
|
+
function actionMessage(result) {
|
|
577
|
+
const r = result;
|
|
578
|
+
return r?.Message ?? r?.Result?.Message ?? r?.Result?.ResultCode ?? null;
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=deal-activity-timeline.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deal-activity-timeline.component.js","sourceRoot":"","sources":["../../../src/lib/activities/deal-activity-timeline.component.ts"],"names":[],"mappings":"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"}
|