@mj-biz-apps/contracts-ng 0.2.0 → 0.3.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.
Files changed (38) hide show
  1. package/dist/lib/form-panels/contract-form.panels.d.ts +77 -0
  2. package/dist/lib/form-panels/contract-form.panels.d.ts.map +1 -0
  3. package/dist/lib/form-panels/contract-form.panels.js +955 -0
  4. package/dist/lib/form-panels/contract-form.panels.js.map +1 -0
  5. package/dist/lib/form-panels/contract-form.policy.d.ts +5 -0
  6. package/dist/lib/form-panels/contract-form.policy.d.ts.map +1 -0
  7. package/dist/lib/form-panels/contract-form.policy.js +33 -0
  8. package/dist/lib/form-panels/contract-form.policy.js.map +1 -0
  9. package/dist/lib/form-panels/contract.panels.d.ts +7 -1
  10. package/dist/lib/form-panels/contract.panels.d.ts.map +1 -1
  11. package/dist/lib/form-panels/contract.panels.js +395 -236
  12. package/dist/lib/form-panels/contract.panels.js.map +1 -1
  13. package/dist/lib/form-panels/organization.panels.d.ts +4 -13
  14. package/dist/lib/form-panels/organization.panels.d.ts.map +1 -1
  15. package/dist/lib/form-panels/organization.panels.js +54 -62
  16. package/dist/lib/form-panels/organization.panels.js.map +1 -1
  17. package/dist/lib/form-panels/person.panels.d.ts +14 -0
  18. package/dist/lib/form-panels/person.panels.d.ts.map +1 -0
  19. package/dist/lib/form-panels/person.panels.js +108 -0
  20. package/dist/lib/form-panels/person.panels.js.map +1 -0
  21. package/dist/lib/form-panels/supersede.panel.d.ts +11 -2
  22. package/dist/lib/form-panels/supersede.panel.d.ts.map +1 -1
  23. package/dist/lib/form-panels/supersede.panel.js +44 -13
  24. package/dist/lib/form-panels/supersede.panel.js.map +1 -1
  25. package/dist/lib/pages/contracts-dashboard.page.d.ts +37 -17
  26. package/dist/lib/pages/contracts-dashboard.page.d.ts.map +1 -1
  27. package/dist/lib/pages/contracts-dashboard.page.js +365 -63
  28. package/dist/lib/pages/contracts-dashboard.page.js.map +1 -1
  29. package/dist/lib/sections/section-shell.component.js +2 -2
  30. package/dist/public-api.d.ts +3 -1
  31. package/dist/public-api.d.ts.map +1 -1
  32. package/dist/public-api.js +15 -4
  33. package/dist/public-api.js.map +1 -1
  34. package/package.json +2 -3
  35. package/dist/lib/form-panels/record-files.panel.d.ts +0 -151
  36. package/dist/lib/form-panels/record-files.panel.d.ts.map +0 -1
  37. package/dist/lib/form-panels/record-files.panel.js +0 -1046
  38. package/dist/lib/form-panels/record-files.panel.js.map +0 -1
@@ -1,57 +1,152 @@
1
1
  /**
2
- * @fileoverview The Contracts dashboard — "what needs attention", not "how are we doing".
2
+ * @fileoverview The Contracts dashboard — obligation command center.
3
3
  *
4
- * DELIBERATELY NOT A CHART. This app tracks obligations; the useful question on opening it is which
5
- * agreements need a person this quarter, and the honest answer is four numbers and the lists behind
6
- * them. A revenue chart would be a chart about orders' data drawn on contracts' screen, and it would
7
- * invite reading it as authoritative about money — which contracts explicitly is not (plan §1).
4
+ * NOT A REVENUE CHART. Plan §1: contracts is not money. Every number here is a COUNT or a date.
5
+ * Tiles are counted from the layered view's DERIVED columns (`IsAwaitingDocument`,
6
+ * `RenewalNoticeDeadline`, `DaysToEnd`, `HasModifications`, `State`) with `TotalRowCount`, so they
7
+ * cannot disagree with the worklists. Charts read the same columns off a roster; they do not
8
+ * re-derive "expiring soon".
8
9
  *
9
- * Every number is a count over the layered base view's DERIVED columns, so the dashboard cannot
10
- * disagree with the worklists: both read `IsAwaitingDocument`, `RenewalNoticeDeadline` and `State`
11
- * from the same view. A dashboard computing its own version of "expiring soon" is how a summary and a
12
- * worklist end up giving different answers to the same question.
10
+ * A hot-list row is `NavigationService.OpenEntityRecord`. A tile click still jumps to the matching
11
+ * rail worklist.
13
12
  *
14
13
  * @module @mj-biz-apps/contracts-ng
15
14
  */
16
15
  import { ChangeDetectorRef, Component, EventEmitter, Output, ViewEncapsulation, inject } from '@angular/core';
17
16
  import { CommonModule } from '@angular/common';
17
+ import { CompositeKey, Metadata } from '@memberjunction/core';
18
+ import { NavigationService } from '@memberjunction/ng-shared';
19
+ import { EntityViewerModule } from '@memberjunction/ng-entity-viewer';
20
+ import { CONTRACT_STATES } from '@mj-biz-apps/contracts-entities';
18
21
  import { MJC_ENTITIES } from '../data/entity-names';
19
22
  import { ScopedRunView } from '../data/provider';
20
23
  import * as i0 from "@angular/core";
24
+ import * as i1 from "@memberjunction/ng-entity-viewer";
21
25
  const _forTrack0 = ($index, $item) => $item.Id;
26
+ const _forTrack1 = ($index, $item) => $item.Label;
27
+ const _forTrack2 = ($index, $item) => $item.State;
22
28
  function MJCContractsDashboardPageComponent_For_5_Template(rf, ctx) { if (rf & 1) {
23
29
  const _r1 = i0.ɵɵgetCurrentView();
24
- i0.ɵɵdomElementStart(0, "button", 7);
25
- i0.ɵɵdomListener("click", function MJCContractsDashboardPageComponent_For_5_Template_button_click_0_listener() { const tile_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.Open(tile_r2)); });
26
- i0.ɵɵtext(1);
27
- i0.ɵɵdomElementStart(2, "span", 8);
28
- i0.ɵɵtext(3);
29
- i0.ɵɵdomElementEnd()();
30
+ i0.ɵɵelementStart(0, "button", 15);
31
+ i0.ɵɵlistener("click", function MJCContractsDashboardPageComponent_For_5_Template_button_click_0_listener() { const tile_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.Open(tile_r2)); });
32
+ i0.ɵɵelementStart(1, "div", 16);
33
+ i0.ɵɵtext(2);
34
+ i0.ɵɵelementEnd();
35
+ i0.ɵɵelementStart(3, "div", 17);
36
+ i0.ɵɵtext(4);
37
+ i0.ɵɵelementEnd();
38
+ i0.ɵɵelementStart(5, "div", 18);
39
+ i0.ɵɵtext(6);
40
+ i0.ɵɵelementEnd()();
30
41
  } if (rf & 2) {
31
42
  const tile_r2 = ctx.$implicit;
32
- i0.ɵɵclassProp("mjc-pill--active", tile_r2.Count !== null && tile_r2.Count > 0);
33
- i0.ɵɵdomProperty("title", tile_r2.Hint)("disabled", !tile_r2.GoTo);
34
- i0.ɵɵadvance();
35
- i0.ɵɵtextInterpolate1(" ", tile_r2.Label, " ");
43
+ i0.ɵɵclassProp("mjc-kpi--alert", tile_r2.Count !== null && tile_r2.Count > 0 && (tile_r2.Id === "in-force-no-paper" || tile_r2.Id === "notice-window"));
44
+ i0.ɵɵproperty("title", tile_r2.Hint)("disabled", !tile_r2.GoTo);
45
+ i0.ɵɵadvance(2);
46
+ i0.ɵɵtextInterpolate(tile_r2.Label);
36
47
  i0.ɵɵadvance(2);
37
48
  i0.ɵɵtextInterpolate(tile_r2.Count === null ? "\u2014" : tile_r2.Count);
49
+ i0.ɵɵadvance(2);
50
+ i0.ɵɵtextInterpolate(tile_r2.Hint);
38
51
  } }
39
52
  function MJCContractsDashboardPageComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
40
- i0.ɵɵdomElementStart(0, "p", 4);
53
+ i0.ɵɵelementStart(0, "p", 4);
41
54
  i0.ɵɵtext(1);
42
- i0.ɵɵdomElementEnd();
55
+ i0.ɵɵelementEnd();
43
56
  } if (rf & 2) {
44
57
  const ctx_r2 = i0.ɵɵnextContext();
45
58
  i0.ɵɵadvance();
46
59
  i0.ɵɵtextInterpolate(ctx_r2.LoadError);
47
60
  } }
61
+ function MJCContractsDashboardPageComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
62
+ i0.ɵɵelementStart(0, "p", 4);
63
+ i0.ɵɵtext(1, "No contracts to mix.");
64
+ i0.ɵɵelementEnd();
65
+ } }
66
+ function MJCContractsDashboardPageComponent_Conditional_18_For_1_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelementStart(0, "div", 19)(1, "b");
68
+ i0.ɵɵtext(2);
69
+ i0.ɵɵelementEnd();
70
+ i0.ɵɵelementStart(3, "div", 20);
71
+ i0.ɵɵelement(4, "div", 21);
72
+ i0.ɵɵelementEnd();
73
+ i0.ɵɵelementStart(5, "span", 22);
74
+ i0.ɵɵtext(6);
75
+ i0.ɵɵelementEnd()();
76
+ } if (rf & 2) {
77
+ const bar_r4 = ctx.$implicit;
78
+ const ctx_r2 = i0.ɵɵnextContext(2);
79
+ i0.ɵɵadvance(2);
80
+ i0.ɵɵtextInterpolate(bar_r4.State);
81
+ i0.ɵɵadvance(2);
82
+ i0.ɵɵstyleProp("width", ctx_r2.BarPct(bar_r4.Count));
83
+ i0.ɵɵadvance(2);
84
+ i0.ɵɵtextInterpolate(bar_r4.Count);
85
+ } }
86
+ function MJCContractsDashboardPageComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
87
+ i0.ɵɵrepeaterCreate(0, MJCContractsDashboardPageComponent_Conditional_18_For_1_Template, 7, 4, "div", 19, _forTrack2);
88
+ } if (rf & 2) {
89
+ const ctx_r2 = i0.ɵɵnextContext();
90
+ i0.ɵɵrepeater(ctx_r2.StateBars);
91
+ } }
92
+ function MJCContractsDashboardPageComponent_For_26_Template(rf, ctx) { if (rf & 1) {
93
+ i0.ɵɵelementStart(0, "div", 10)(1, "div", 23);
94
+ i0.ɵɵtext(2);
95
+ i0.ɵɵelementEnd();
96
+ i0.ɵɵelement(3, "div", 24);
97
+ i0.ɵɵelementStart(4, "div", 25);
98
+ i0.ɵɵtext(5);
99
+ i0.ɵɵelementEnd()();
100
+ } if (rf & 2) {
101
+ const tile_r5 = ctx.$implicit;
102
+ const ctx_r2 = i0.ɵɵnextContext();
103
+ i0.ɵɵadvance(2);
104
+ i0.ɵɵtextInterpolate(tile_r5.Count === null ? "\u2014" : tile_r5.Count);
105
+ i0.ɵɵadvance();
106
+ i0.ɵɵstyleProp("height", ctx_r2.FunnelHeight(tile_r5.Count));
107
+ i0.ɵɵadvance(2);
108
+ i0.ɵɵtextInterpolate(ctx_r2.ShortLabel(tile_r5.Id));
109
+ } }
110
+ function MJCContractsDashboardPageComponent_For_36_Template(rf, ctx) { if (rf & 1) {
111
+ i0.ɵɵelementStart(0, "div", 12)(1, "div", 16);
112
+ i0.ɵɵtext(2);
113
+ i0.ɵɵelementEnd();
114
+ i0.ɵɵelementStart(3, "div", 17);
115
+ i0.ɵɵtext(4);
116
+ i0.ɵɵelementEnd()();
117
+ } if (rf & 2) {
118
+ const b_r6 = ctx.$implicit;
119
+ i0.ɵɵadvance(2);
120
+ i0.ɵɵtextInterpolate(b_r6.Label);
121
+ i0.ɵɵadvance(2);
122
+ i0.ɵɵtextInterpolate(b_r6.Count);
123
+ } }
124
+ function MJCContractsDashboardPageComponent_Conditional_43_Template(rf, ctx) { if (rf & 1) {
125
+ const _r7 = i0.ɵɵgetCurrentView();
126
+ i0.ɵɵelementStart(0, "mj-entity-viewer", 26);
127
+ i0.ɵɵlistener("RecordOpened", function MJCContractsDashboardPageComponent_Conditional_43_Template_mj_entity_viewer_RecordOpened_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnRecordOpened($event)); });
128
+ i0.ɵɵelementEnd();
129
+ } if (rf & 2) {
130
+ const ctx_r2 = i0.ɵɵnextContext();
131
+ i0.ɵɵproperty("Entity", ctx_r2.ContractEntityInfo)("ViewEntity", ctx_r2.HotView);
132
+ } }
133
+ function MJCContractsDashboardPageComponent_Conditional_44_Template(rf, ctx) { if (rf & 1) {
134
+ i0.ɵɵelementStart(0, "p", 4);
135
+ i0.ɵɵtext(1, "Contract entity metadata is not loaded.");
136
+ i0.ɵɵelementEnd();
137
+ } }
48
138
  export class MJCContractsDashboardPageComponent {
49
139
  cdr = inject(ChangeDetectorRef);
140
+ navigation = inject(NavigationService);
50
141
  /** Asks the host section to switch rail pages. The dashboard does not route itself. */
51
142
  NavigateToPage = new EventEmitter();
52
143
  LoadError = null;
144
+ StateBars = [];
145
+ Horizon = [];
146
+ ContractEntityInfo = null;
147
+ HotView = null;
53
148
  /**
54
- * The four questions worth answering on open, in priority order.
149
+ * The questions worth answering on open, in priority order.
55
150
  *
56
151
  * "In force without paper" leads because it is the only one that is both an obligation we are
57
152
  * already performing and a document we cannot produce — the combination that hurts in a dispute.
@@ -100,6 +195,10 @@ export class MJCContractsDashboardPageComponent {
100
195
  Count: null,
101
196
  },
102
197
  ];
198
+ /** The four actionable tiles, in funnel order. Signed-not-started is informational, not a queue. */
199
+ get ChartTiles() {
200
+ return this.Tiles.filter((t) => t.Id !== 'signed-not-started');
201
+ }
103
202
  ngOnInit() {
104
203
  void this.refresh();
105
204
  }
@@ -107,13 +206,43 @@ export class MJCContractsDashboardPageComponent {
107
206
  if (tile.GoTo)
108
207
  this.NavigateToPage.emit(tile.GoTo);
109
208
  }
209
+ OpenRecord(id) {
210
+ this.navigation.OpenEntityRecord(MJC_ENTITIES.Contract, CompositeKey.FromID(id));
211
+ }
212
+ OnRecordOpened(event) {
213
+ const id = (event.compositeKey?.GetValueByFieldName('ID') ?? event.record?.['ID']);
214
+ if (id)
215
+ this.OpenRecord(id);
216
+ }
217
+ BarPct(count) {
218
+ const max = Math.max(1, ...this.StateBars.map((b) => b.Count));
219
+ return `${Math.round((count / max) * 100)}%`;
220
+ }
221
+ FunnelHeight(count) {
222
+ const values = this.ChartTiles.map((t) => t.Count ?? 0);
223
+ const max = Math.max(1, ...values);
224
+ const n = count ?? 0;
225
+ return `${Math.max(8, Math.round((n / max) * 100))}%`;
226
+ }
227
+ ShortLabel(id) {
228
+ switch (id) {
229
+ case 'in-force-no-paper':
230
+ return 'No paper';
231
+ case 'notice-window':
232
+ return 'Notice';
233
+ case 'ends-120':
234
+ return 'Ending';
235
+ case 'modified':
236
+ return 'Modified';
237
+ default:
238
+ return id;
239
+ }
240
+ }
110
241
  /**
111
- * Count every tile concurrently.
242
+ * Count every tile concurrently, then load the roster used for mix / horizon / hot list.
112
243
  *
113
- * `MaxRows: 1` and read `TotalRowCount` — the count comes back without transferring rows. A tile
114
- * whose query fails shows an em dash rather than a zero: "we do not know" and "there are none" are
115
- * different answers, and showing 0 for the first is the kind of quiet lie a dashboard should never
116
- * tell. One shared error line explains it once rather than five times.
244
+ * `MaxRows: 1` and read `TotalRowCount` for tiles — the count comes back without transferring
245
+ * rows. A tile whose query fails shows an em dash rather than a zero.
117
246
  */
118
247
  async refresh() {
119
248
  const rv = ScopedRunView();
@@ -132,36 +261,141 @@ export class MJCContractsDashboardPageComponent {
132
261
  failures += 1;
133
262
  }
134
263
  }));
264
+ try {
265
+ const roster = await rv.RunView({
266
+ EntityName: MJC_ENTITIES.Contract,
267
+ ResultType: 'simple',
268
+ MaxRows: 500,
269
+ Fields: [
270
+ 'ID',
271
+ 'Name',
272
+ 'ContractNumber',
273
+ 'State',
274
+ 'CustomerOrganization',
275
+ 'DaysToEnd',
276
+ 'IsAwaitingDocument',
277
+ 'HasModifications',
278
+ 'RenewalNoticeDeadline',
279
+ 'EndDate',
280
+ ],
281
+ });
282
+ const rows = roster?.Success ? (roster.Results ?? []) : [];
283
+ this.StateBars = this.mixStates(rows);
284
+ this.Horizon = this.horizon(rows);
285
+ this.ContractEntityInfo = new Metadata().Entities.find((e) => e.Name === MJC_ENTITIES.Contract) ?? null;
286
+ this.HotView = this.ContractEntityInfo
287
+ ? {
288
+ EntityID: this.ContractEntityInfo.ID,
289
+ Entity: this.ContractEntityInfo.Name,
290
+ WhereClause: HOT_WHERE,
291
+ ID: 'contracts-hot',
292
+ Name: 'Needs a person',
293
+ }
294
+ : null;
295
+ }
296
+ catch {
297
+ failures += 1;
298
+ }
135
299
  this.LoadError = failures
136
- ? `${failures} of ${this.Tiles.length} counts could not be read — the tiles showing “—” are unknown, not zero.`
300
+ ? `${failures} count(s) could not be read — tiles showing “—” are unknown, not zero.`
137
301
  : null;
138
302
  this.cdr.detectChanges();
139
303
  }
304
+ mixStates(rows) {
305
+ const map = new Map();
306
+ for (const s of CONTRACT_STATES)
307
+ map.set(s, 0);
308
+ for (const r of rows) {
309
+ const s = r.State || '—';
310
+ map.set(s, (map.get(s) ?? 0) + 1);
311
+ }
312
+ return [...map.entries()]
313
+ .filter(([, n]) => n > 0)
314
+ .map(([State, Count]) => ({ State, Count }));
315
+ }
316
+ horizon(rows) {
317
+ const buckets = [
318
+ { Label: '0–30 days', Count: 0 },
319
+ { Label: '31–60 days', Count: 0 },
320
+ { Label: '61–90 days', Count: 0 },
321
+ { Label: '91–120 days', Count: 0 },
322
+ ];
323
+ for (const r of rows) {
324
+ const d = Number(r.DaysToEnd);
325
+ if (!Number.isFinite(d) || d < 0 || d > 120)
326
+ continue;
327
+ if (d <= 30)
328
+ buckets[0].Count += 1;
329
+ else if (d <= 60)
330
+ buckets[1].Count += 1;
331
+ else if (d <= 90)
332
+ buckets[2].Count += 1;
333
+ else
334
+ buckets[3].Count += 1;
335
+ }
336
+ return buckets;
337
+ }
140
338
  static ɵfac = function MJCContractsDashboardPageComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCContractsDashboardPageComponent)(); };
141
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJCContractsDashboardPageComponent, selectors: [["mjc-contracts-dashboard-page"]], outputs: { NavigateToPage: "NavigateToPage" }, decls: 15, vars: 1, consts: [[1, "mjc-page"], [1, "mjc-page__intro"], [1, "mjc-pills"], ["type", "button", 1, "mjc-pill", 3, "mjc-pill--active", "title", "disabled"], [1, "mjc-empty"], [1, "mjc-card"], [1, "mjc-card__title"], ["type", "button", 1, "mjc-pill", 3, "click", "title", "disabled"], [1, "mjc-pill__count"]], template: function MJCContractsDashboardPageComponent_Template(rf, ctx) { if (rf & 1) {
142
- i0.ɵɵdomElementStart(0, "div", 0)(1, "p", 1);
143
- i0.ɵɵtext(2, " What needs a person. Every number below is counted from the same view the worklists read, so this page and those pages cannot disagree. ");
144
- i0.ɵɵdomElementEnd();
145
- i0.ɵɵdomElementStart(3, "div", 2);
146
- i0.ɵɵrepeaterCreate(4, MJCContractsDashboardPageComponent_For_5_Template, 4, 6, "button", 3, _forTrack0);
147
- i0.ɵɵdomElementEnd();
339
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJCContractsDashboardPageComponent, selectors: [["mjc-contracts-dashboard-page"]], outputs: { NavigateToPage: "NavigateToPage" }, decls: 45, vars: 3, consts: [[1, "mjc-page"], [1, "mjc-page__intro"], [1, "mjc-kpis"], ["type", "button", 1, "mjc-kpi", 3, "mjc-kpi--alert", "title", "disabled"], [1, "mjc-empty"], [1, "mjc-dash-split"], [1, "mjc-dash-card"], [1, "mjc-dash-card__h"], [1, "mjc-barlist"], [1, "mjc-funnel"], [1, "mjc-funnel__col"], [1, "mjc-buckets"], [1, "mjc-bucket"], [1, "mjc-viewer-host"], [3, "Entity", "ViewEntity"], ["type", "button", 1, "mjc-kpi", 3, "click", "title", "disabled"], [1, "mjc-kpi__l"], [1, "mjc-kpi__v"], [1, "mjc-kpi__f"], [1, "mjc-barrow"], [1, "mjc-track"], [1, "mjc-fill"], [1, "mjc-num"], [1, "mjc-funnel__n"], [1, "mjc-funnel__bar"], [1, "mjc-funnel__lab"], [3, "RecordOpened", "Entity", "ViewEntity"]], template: function MJCContractsDashboardPageComponent_Template(rf, ctx) { if (rf & 1) {
340
+ i0.ɵɵelementStart(0, "div", 0)(1, "p", 1);
341
+ i0.ɵɵtext(2, " What needs a person. Tile counts come from the same view the worklists read. Charts are counts and dates \u2014 never dollars. ");
342
+ i0.ɵɵelementEnd();
343
+ i0.ɵɵelementStart(3, "div", 2);
344
+ i0.ɵɵrepeaterCreate(4, MJCContractsDashboardPageComponent_For_5_Template, 7, 7, "button", 3, _forTrack0);
345
+ i0.ɵɵelementEnd();
148
346
  i0.ɵɵconditionalCreate(6, MJCContractsDashboardPageComponent_Conditional_6_Template, 2, 1, "p", 4);
149
- i0.ɵɵdomElementStart(7, "div", 5)(8, "h3", 6);
150
- i0.ɵɵtext(9, "What this app is, and is not");
151
- i0.ɵɵdomElementEnd();
152
- i0.ɵɵdomElementStart(10, "p", 1);
153
- i0.ɵɵtext(11, " Contracts is the record of ");
154
- i0.ɵɵdomElementStart(12, "strong");
155
- i0.ɵɵtext(13, "what we agreed");
156
- i0.ɵɵdomElementEnd();
157
- i0.ɵɵtext(14, ": the agreement, the standard terms it incorporates, the provisions negotiated away from those terms, and the executed paper. It does not bill and it does not price \u2014 orders does that, and a number here is never a number about money owed. ");
158
- i0.ɵɵdomElementEnd()()();
347
+ i0.ɵɵelementStart(7, "div", 5)(8, "div", 6)(9, "div", 7);
348
+ i0.ɵɵtext(10, " State mix ");
349
+ i0.ɵɵelementStart(11, "span");
350
+ i0.ɵɵtext(12, "layered-view ");
351
+ i0.ɵɵelementStart(13, "code");
352
+ i0.ɵɵtext(14, "State");
353
+ i0.ɵɵelementEnd();
354
+ i0.ɵɵtext(15, " \u2014 not re-derived");
355
+ i0.ɵɵelementEnd()();
356
+ i0.ɵɵelementStart(16, "div", 8);
357
+ i0.ɵɵconditionalCreate(17, MJCContractsDashboardPageComponent_Conditional_17_Template, 2, 0, "p", 4)(18, MJCContractsDashboardPageComponent_Conditional_18_Template, 2, 0);
358
+ i0.ɵɵelementEnd()();
359
+ i0.ɵɵelementStart(19, "div", 6)(20, "div", 7);
360
+ i0.ɵɵtext(21, " Attention ");
361
+ i0.ɵɵelementStart(22, "span");
362
+ i0.ɵɵtext(23, "same counts as the tiles");
363
+ i0.ɵɵelementEnd()();
364
+ i0.ɵɵelementStart(24, "div", 9);
365
+ i0.ɵɵrepeaterCreate(25, MJCContractsDashboardPageComponent_For_26_Template, 6, 4, "div", 10, _forTrack0);
366
+ i0.ɵɵelementEnd()()();
367
+ i0.ɵɵelementStart(27, "div", 6)(28, "div", 7);
368
+ i0.ɵɵtext(29, " Days to end ");
369
+ i0.ɵɵelementStart(30, "span");
370
+ i0.ɵɵtext(31, "0\u2013120 day horizon \u00B7 ");
371
+ i0.ɵɵelementStart(32, "code");
372
+ i0.ɵɵtext(33, "DaysToEnd");
373
+ i0.ɵɵelementEnd()()();
374
+ i0.ɵɵelementStart(34, "div", 11);
375
+ i0.ɵɵrepeaterCreate(35, MJCContractsDashboardPageComponent_For_36_Template, 5, 2, "div", 12, _forTrack1);
376
+ i0.ɵɵelementEnd()();
377
+ i0.ɵɵelementStart(37, "div", 6)(38, "div", 7);
378
+ i0.ɵɵtext(39, " Hot list ");
379
+ i0.ɵɵelementStart(40, "span");
380
+ i0.ɵɵtext(41, "paper, notice, or ending \u00B7 click \u2192 Explorer tab");
381
+ i0.ɵɵelementEnd()();
382
+ i0.ɵɵelementStart(42, "div", 13);
383
+ i0.ɵɵconditionalCreate(43, MJCContractsDashboardPageComponent_Conditional_43_Template, 1, 2, "mj-entity-viewer", 14)(44, MJCContractsDashboardPageComponent_Conditional_44_Template, 2, 0, "p", 4);
384
+ i0.ɵɵelementEnd()()();
159
385
  } if (rf & 2) {
160
386
  i0.ɵɵadvance(4);
161
387
  i0.ɵɵrepeater(ctx.Tiles);
162
388
  i0.ɵɵadvance(2);
163
389
  i0.ɵɵconditional(ctx.LoadError ? 6 : -1);
164
- } }, dependencies: [CommonModule], encapsulation: 2 });
390
+ i0.ɵɵadvance(11);
391
+ i0.ɵɵconditional(!ctx.StateBars.length ? 17 : 18);
392
+ i0.ɵɵadvance(8);
393
+ i0.ɵɵrepeater(ctx.ChartTiles);
394
+ i0.ɵɵadvance(10);
395
+ i0.ɵɵrepeater(ctx.Horizon);
396
+ i0.ɵɵadvance(8);
397
+ i0.ɵɵconditional(ctx.ContractEntityInfo ? 43 : 44);
398
+ } }, dependencies: [CommonModule, EntityViewerModule, i1.EntityViewerComponent], encapsulation: 2 });
165
399
  }
166
400
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJCContractsDashboardPageComponent, [{
167
401
  type: Component,
@@ -169,25 +403,26 @@ export class MJCContractsDashboardPageComponent {
169
403
  selector: 'mjc-contracts-dashboard-page',
170
404
  standalone: true,
171
405
  encapsulation: ViewEncapsulation.None,
172
- imports: [CommonModule],
406
+ imports: [CommonModule, EntityViewerModule],
173
407
  template: `
174
408
  <div class="mjc-page">
175
409
  <p class="mjc-page__intro">
176
- What needs a person. Every number below is counted from the same view the worklists read,
177
- so this page and those pages cannot disagree.
410
+ What needs a person. Tile counts come from the same view the worklists read. Charts
411
+ are counts and dates — never dollars.
178
412
  </p>
179
413
 
180
- <div class="mjc-pills">
414
+ <div class="mjc-kpis">
181
415
  @for (tile of Tiles; track tile.Id) {
182
416
  <button
183
417
  type="button"
184
- class="mjc-pill"
185
- [class.mjc-pill--active]="tile.Count !== null && tile.Count > 0"
418
+ class="mjc-kpi"
419
+ [class.mjc-kpi--alert]="tile.Count !== null && tile.Count > 0 && (tile.Id === 'in-force-no-paper' || tile.Id === 'notice-window')"
186
420
  [title]="tile.Hint"
187
421
  [disabled]="!tile.GoTo"
188
422
  (click)="Open(tile)">
189
- {{ tile.Label }}
190
- <span class="mjc-pill__count">{{ tile.Count === null ? '—' : tile.Count }}</span>
423
+ <div class="mjc-kpi__l">{{ tile.Label }}</div>
424
+ <div class="mjc-kpi__v">{{ tile.Count === null ? '—' : tile.Count }}</div>
425
+ <div class="mjc-kpi__f">{{ tile.Hint }}</div>
191
426
  </button>
192
427
  }
193
428
  </div>
@@ -196,14 +431,76 @@ export class MJCContractsDashboardPageComponent {
196
431
  <p class="mjc-empty">{{ LoadError }}</p>
197
432
  }
198
433
 
199
- <div class="mjc-card">
200
- <h3 class="mjc-card__title">What this app is, and is not</h3>
201
- <p class="mjc-page__intro">
202
- Contracts is the record of <strong>what we agreed</strong>: the agreement, the standard
203
- terms it incorporates, the provisions negotiated away from those terms, and the
204
- executed paper. It does not bill and it does not price — orders does that, and a number
205
- here is never a number about money owed.
206
- </p>
434
+ <div class="mjc-dash-split">
435
+ <div class="mjc-dash-card">
436
+ <div class="mjc-dash-card__h">
437
+ State mix
438
+ <span>layered-view <code>State</code> — not re-derived</span>
439
+ </div>
440
+ <div class="mjc-barlist">
441
+ @if (!StateBars.length) {
442
+ <p class="mjc-empty">No contracts to mix.</p>
443
+ } @else {
444
+ @for (bar of StateBars; track bar.State) {
445
+ <div class="mjc-barrow">
446
+ <b>{{ bar.State }}</b>
447
+ <div class="mjc-track">
448
+ <div class="mjc-fill" [style.width]="BarPct(bar.Count)"></div>
449
+ </div>
450
+ <span class="mjc-num">{{ bar.Count }}</span>
451
+ </div>
452
+ }
453
+ }
454
+ </div>
455
+ </div>
456
+ <div class="mjc-dash-card">
457
+ <div class="mjc-dash-card__h">
458
+ Attention
459
+ <span>same counts as the tiles</span>
460
+ </div>
461
+ <div class="mjc-funnel">
462
+ @for (tile of ChartTiles; track tile.Id) {
463
+ <div class="mjc-funnel__col">
464
+ <div class="mjc-funnel__n">{{ tile.Count === null ? '—' : tile.Count }}</div>
465
+ <div class="mjc-funnel__bar" [style.height]="FunnelHeight(tile.Count)"></div>
466
+ <div class="mjc-funnel__lab">{{ ShortLabel(tile.Id) }}</div>
467
+ </div>
468
+ }
469
+ </div>
470
+ </div>
471
+ </div>
472
+
473
+ <div class="mjc-dash-card">
474
+ <div class="mjc-dash-card__h">
475
+ Days to end
476
+ <span>0–120 day horizon · <code>DaysToEnd</code></span>
477
+ </div>
478
+ <div class="mjc-buckets">
479
+ @for (b of Horizon; track b.Label) {
480
+ <div class="mjc-bucket">
481
+ <div class="mjc-kpi__l">{{ b.Label }}</div>
482
+ <div class="mjc-kpi__v">{{ b.Count }}</div>
483
+ </div>
484
+ }
485
+ </div>
486
+ </div>
487
+
488
+ <div class="mjc-dash-card">
489
+ <div class="mjc-dash-card__h">
490
+ Hot list
491
+ <span>paper, notice, or ending · click → Explorer tab</span>
492
+ </div>
493
+ <div class="mjc-viewer-host">
494
+ @if (ContractEntityInfo) {
495
+ <mj-entity-viewer
496
+ [Entity]="ContractEntityInfo"
497
+ [ViewEntity]="HotView"
498
+ (RecordOpened)="OnRecordOpened($event)">
499
+ </mj-entity-viewer>
500
+ } @else {
501
+ <p class="mjc-empty">Contract entity metadata is not loaded.</p>
502
+ }
503
+ </div>
207
504
  </div>
208
505
  </div>
209
506
  `,
@@ -211,5 +508,10 @@ export class MJCContractsDashboardPageComponent {
211
508
  }], null, { NavigateToPage: [{
212
509
  type: Output
213
510
  }] }); })();
214
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCContractsDashboardPageComponent, { className: "MJCContractsDashboardPageComponent", filePath: "lib/pages/contracts-dashboard.page.ts", lineNumber: 76 }); })();
511
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCContractsDashboardPageComponent, { className: "MJCContractsDashboardPageComponent", filePath: "lib/pages/contracts-dashboard.page.ts", lineNumber: 164 }); })();
512
+ const HOT_WHERE = `(State = 'Active' AND IsAwaitingDocument = 1)` +
513
+ ` OR (RenewalNoticeDeadline IS NOT NULL` +
514
+ ` AND RenewalNoticeDeadline >= CAST(GETUTCDATE() AS date)` +
515
+ ` AND RenewalNoticeDeadline <= DATEADD(day, 60, CAST(GETUTCDATE() AS date)))` +
516
+ ` OR (DaysToEnd IS NOT NULL AND DaysToEnd BETWEEN 0 AND 120)`;
215
517
  //# sourceMappingURL=contracts-dashboard.page.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contracts-dashboard.page.js","sourceRoot":"","sources":["../../../src/lib/pages/contracts-dashboard.page.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contracts-dashboard.page.js","sourceRoot":"","sources":["../../../src/lib/pages/contracts-dashboard.page.ts"],"names":[],"mappings":"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"}