@mj-biz-apps/contracts-ng 0.2.0 → 0.4.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/dist/lib/form-panels/contract-form.panels.d.ts +111 -0
- package/dist/lib/form-panels/contract-form.panels.d.ts.map +1 -0
- package/dist/lib/form-panels/contract-form.panels.js +1002 -0
- package/dist/lib/form-panels/contract-form.panels.js.map +1 -0
- package/dist/lib/form-panels/contract-form.policy.d.ts +5 -0
- package/dist/lib/form-panels/contract-form.policy.d.ts.map +1 -0
- package/dist/lib/form-panels/contract-form.policy.js +33 -0
- package/dist/lib/form-panels/contract-form.policy.js.map +1 -0
- package/dist/lib/form-panels/contract.panels.d.ts +55 -3
- package/dist/lib/form-panels/contract.panels.d.ts.map +1 -1
- package/dist/lib/form-panels/contract.panels.js +619 -362
- package/dist/lib/form-panels/contract.panels.js.map +1 -1
- package/dist/lib/form-panels/organization.panels.d.ts +4 -13
- package/dist/lib/form-panels/organization.panels.d.ts.map +1 -1
- package/dist/lib/form-panels/organization.panels.js +54 -62
- package/dist/lib/form-panels/organization.panels.js.map +1 -1
- package/dist/lib/form-panels/person.panels.d.ts +14 -0
- package/dist/lib/form-panels/person.panels.d.ts.map +1 -0
- package/dist/lib/form-panels/person.panels.js +108 -0
- package/dist/lib/form-panels/person.panels.js.map +1 -0
- package/dist/lib/form-panels/supersede.panel.d.ts +29 -3
- package/dist/lib/form-panels/supersede.panel.d.ts.map +1 -1
- package/dist/lib/form-panels/supersede.panel.js +81 -23
- package/dist/lib/form-panels/supersede.panel.js.map +1 -1
- package/dist/lib/pages/contracts-dashboard.page.d.ts +37 -17
- package/dist/lib/pages/contracts-dashboard.page.d.ts.map +1 -1
- package/dist/lib/pages/contracts-dashboard.page.js +365 -63
- package/dist/lib/pages/contracts-dashboard.page.js.map +1 -1
- package/dist/lib/sections/section-shell.component.js +2 -2
- package/dist/public-api.d.ts +3 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +15 -4
- package/dist/public-api.js.map +1 -1
- package/package.json +2 -3
- package/dist/lib/form-panels/record-files.panel.d.ts +0 -151
- package/dist/lib/form-panels/record-files.panel.d.ts.map +0 -1
- package/dist/lib/form-panels/record-files.panel.js +0 -1046
- package/dist/lib/form-panels/record-files.panel.js.map +0 -1
|
@@ -32,6 +32,7 @@ import { FormsModule } from '@angular/forms';
|
|
|
32
32
|
import { RegisterClassEx } from '@memberjunction/global';
|
|
33
33
|
import { BaseFormPanel, BaseFormsModule } from '@memberjunction/ng-base-forms';
|
|
34
34
|
import { MJComboboxComponent, MJButtonDirective, MJAlertComponent } from '@memberjunction/ng-ui-components';
|
|
35
|
+
import { ContractOptionLabel, SameCustomerClause } from '@mj-biz-apps/contracts-entities';
|
|
35
36
|
import { MJC_ENTITIES } from '../data/entity-names';
|
|
36
37
|
import * as i0 from "@angular/core";
|
|
37
38
|
import * as i1 from "@angular/forms";
|
|
@@ -65,7 +66,7 @@ function MJCContractSupersedePanel_Conditional_5_Template(rf, ctx) { if (rf & 1)
|
|
|
65
66
|
i0.ɵɵadvance();
|
|
66
67
|
i0.ɵɵconditional(ctx_r3.Supersedes.length ? 1 : 2);
|
|
67
68
|
i0.ɵɵadvance(3);
|
|
68
|
-
i0.ɵɵtextInterpolate1(" ", (ctx_r3.Record == null ? null : ctx_r3.Record.IsSaved) ? "
|
|
69
|
+
i0.ɵɵtextInterpolate1(" ", (ctx_r3.Record == null ? null : ctx_r3.Record.IsSaved) ? "Finish editing to change" : "Save this contract first", " ");
|
|
69
70
|
} }
|
|
70
71
|
function MJCContractSupersedePanel_Conditional_6_For_4_Template(rf, ctx) { if (rf & 1) {
|
|
71
72
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
@@ -107,7 +108,7 @@ function MJCContractSupersedePanel_Conditional_6_Conditional_10_Template(rf, ctx
|
|
|
107
108
|
function MJCContractSupersedePanel_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
108
109
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
109
110
|
i0.ɵɵelementStart(0, "mj-combobox", 6);
|
|
110
|
-
i0.ɵɵ
|
|
111
|
+
i0.ɵɵlistener("ngModelChange", function MJCContractSupersedePanel_Conditional_6_Template_mj_combobox_ngModelChange_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.PickPredecessor($event)); });
|
|
111
112
|
i0.ɵɵelementEnd();
|
|
112
113
|
i0.ɵɵelementStart(1, "button", 7);
|
|
113
114
|
i0.ɵɵlistener("click", function MJCContractSupersedePanel_Conditional_6_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.LinkSupersedes()); });
|
|
@@ -123,8 +124,7 @@ function MJCContractSupersedePanel_Conditional_6_Template(rf, ctx) { if (rf & 1)
|
|
|
123
124
|
i0.ɵɵconditionalCreate(10, MJCContractSupersedePanel_Conditional_6_Conditional_10_Template, 2, 0, "div", 9);
|
|
124
125
|
} if (rf & 2) {
|
|
125
126
|
const ctx_r3 = i0.ɵɵnextContext();
|
|
126
|
-
i0.ɵɵproperty("Data", ctx_r3.Candidates)("ValuePrimitive", true)("Filterable", true)("Disabled", ctx_r3.Busy);
|
|
127
|
-
i0.ɵɵtwoWayProperty("ngModel", ctx_r3.PickedPredecessorID);
|
|
127
|
+
i0.ɵɵproperty("Data", ctx_r3.Candidates)("ValuePrimitive", true)("Filterable", true)("Disabled", ctx_r3.Busy)("ngModel", ctx_r3.PickedPredecessorID);
|
|
128
128
|
i0.ɵɵadvance();
|
|
129
129
|
i0.ɵɵproperty("disabled", ctx_r3.Busy || !ctx_r3.PickedPredecessorID);
|
|
130
130
|
i0.ɵɵadvance();
|
|
@@ -154,15 +154,37 @@ let MJCContractSupersedePanel = class MJCContractSupersedePanel extends BaseForm
|
|
|
154
154
|
LoadError = '';
|
|
155
155
|
Supersedes = [];
|
|
156
156
|
_candidates = [];
|
|
157
|
-
|
|
157
|
+
/**
|
|
158
|
+
* WHICH contract the candidate list was loaded for, not merely whether it was (issue #28 item 23).
|
|
159
|
+
*
|
|
160
|
+
* A boolean belongs to the panel, and the panel outlives the record: the form reuses the same
|
|
161
|
+
* component instance when it navigates to another contract, so the flag stayed true and the picker
|
|
162
|
+
* went on offering the PREVIOUS contract's candidates — filtered to the previous customer and the
|
|
163
|
+
* previous level, which is a WRONG list rather than a stale one.
|
|
164
|
+
*/
|
|
165
|
+
loadedFor = null;
|
|
158
166
|
/** Eligible predecessors. Loaded on first read; no EditMode gate, because the panel is always shown. */
|
|
159
167
|
get Candidates() {
|
|
160
|
-
|
|
161
|
-
|
|
168
|
+
const id = this.Record?.ID;
|
|
169
|
+
if (id && this.loadedFor !== id) {
|
|
170
|
+
this.loadedFor = id;
|
|
162
171
|
void this.load();
|
|
163
172
|
}
|
|
164
173
|
return this._candidates;
|
|
165
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Take a new selection, and drop the outcome of the last one (issue #28 item 23).
|
|
177
|
+
*
|
|
178
|
+
* A `[(ngModel)]` two-way binding was enough to hold the value and is not enough here: the success
|
|
179
|
+
* and error banners sat until the next click, so "Linked — that contract is now superseded by this
|
|
180
|
+
* agreement." stayed on screen while the user picked a DIFFERENT contract, appearing to describe
|
|
181
|
+
* the new selection. A stale success is worse than no message; it reports an action nobody took.
|
|
182
|
+
*/
|
|
183
|
+
PickPredecessor(id) {
|
|
184
|
+
this.PickedPredecessorID = id ?? '';
|
|
185
|
+
this.LinkOk = '';
|
|
186
|
+
this.LinkError = '';
|
|
187
|
+
}
|
|
166
188
|
/**
|
|
167
189
|
* Re-paper: ask the SERVER to point this agreement at the contract it replaces.
|
|
168
190
|
*
|
|
@@ -181,13 +203,24 @@ let MJCContractSupersedePanel = class MJCContractSupersedePanel extends BaseForm
|
|
|
181
203
|
* longer maintains its own cached idea of what the contract supersedes.
|
|
182
204
|
*/
|
|
183
205
|
async LinkSupersedes() {
|
|
184
|
-
|
|
206
|
+
if (!this.PickedPredecessorID)
|
|
207
|
+
return;
|
|
208
|
+
await this.invoke({ PredecessorID: this.PickedPredecessorID }, 'Linked — that contract is now superseded by this agreement.');
|
|
185
209
|
}
|
|
186
|
-
/**
|
|
187
|
-
|
|
188
|
-
|
|
210
|
+
/**
|
|
211
|
+
* Release exactly the contract whose button was clicked.
|
|
212
|
+
*
|
|
213
|
+
* THE ARGUMENT USED TO BE DISCARDED. The template has always passed `p.ID`; this method took it as
|
|
214
|
+
* `_predecessorID` and called the operation with `null`, which meant "release EVERY predecessor".
|
|
215
|
+
* On a contract superseding one agreement that looks correct, which is why it survived — on a
|
|
216
|
+
* consolidation, clicking "Unlink CTR-0001" also unlinked CTR-0002 (contracts#28 item 9).
|
|
217
|
+
*/
|
|
218
|
+
async UnlinkSupersedes(predecessorID) {
|
|
219
|
+
if (!predecessorID)
|
|
220
|
+
return;
|
|
221
|
+
await this.invoke({ ReleasePredecessorID: predecessorID }, 'Unlinked — that agreement is no longer superseded by this one.');
|
|
189
222
|
}
|
|
190
|
-
async invoke(
|
|
223
|
+
async invoke(what, okMessage) {
|
|
191
224
|
if (!this.Record?.ID)
|
|
192
225
|
return;
|
|
193
226
|
this.Busy = true;
|
|
@@ -201,7 +234,7 @@ let MJCContractSupersedePanel = class MJCContractSupersedePanel extends BaseForm
|
|
|
201
234
|
if (typeof provider?.RouteOperation !== 'function') {
|
|
202
235
|
throw new Error('This provider cannot route remote operations, so re-papering is unavailable here.');
|
|
203
236
|
}
|
|
204
|
-
const result = await provider.RouteOperation(SUPERSEDE_OP, { SuccessorID: this.Record.ID,
|
|
237
|
+
const result = await provider.RouteOperation(SUPERSEDE_OP, { SuccessorID: this.Record.ID, ...what });
|
|
205
238
|
if (!result?.Success) {
|
|
206
239
|
throw new Error(result?.ErrorMessage || 'The server did not complete the request.');
|
|
207
240
|
}
|
|
@@ -212,7 +245,9 @@ let MJCContractSupersedePanel = class MJCContractSupersedePanel extends BaseForm
|
|
|
212
245
|
this.LinkError = out.Refused;
|
|
213
246
|
}
|
|
214
247
|
else {
|
|
215
|
-
|
|
248
|
+
// No "Released ..." suffix (item 10). Linking no longer releases anything, so the only
|
|
249
|
+
// call that fills `Released` is an unlink — where the message already names what went.
|
|
250
|
+
this.LinkOk = okMessage;
|
|
216
251
|
this.PickedPredecessorID = '';
|
|
217
252
|
}
|
|
218
253
|
await this.loadCandidates();
|
|
@@ -268,17 +303,37 @@ let MJCContractSupersedePanel = class MJCContractSupersedePanel extends BaseForm
|
|
|
268
303
|
try {
|
|
269
304
|
const parentID = this.Record?.ParentContractID ?? null;
|
|
270
305
|
const sameLevel = parentID === null ? 'ParentContractID IS NULL' : `ParentContractID = '${parentID}'`;
|
|
306
|
+
/**
|
|
307
|
+
* SAME CUSTOMER, and this is the rule the picker was missing (#28 item 4).
|
|
308
|
+
*
|
|
309
|
+
* Re-papering replaces one customer's agreement with another agreement for THAT customer.
|
|
310
|
+
* Offering another customer's contract is not merely untidy: linking it would point one
|
|
311
|
+
* organisation's lineage at another's, and the successor's terms would read as governing a
|
|
312
|
+
* party that never signed them.
|
|
313
|
+
*
|
|
314
|
+
* `CustomerOrganizationID` is NOT NULL on this table, so there is no "customer unknown" case
|
|
315
|
+
* to widen for — an absent value here means the record could not be read, and offering the
|
|
316
|
+
* whole book because of that is exactly the failure this rule exists to stop. So a missing
|
|
317
|
+
* value yields NO candidates rather than all of them.
|
|
318
|
+
*/
|
|
319
|
+
const sameCustomer = SameCustomerClause(this.Record?.CustomerOrganizationID);
|
|
271
320
|
const r = await rv.RunView({
|
|
272
321
|
EntityName: MJC_ENTITIES.Contract,
|
|
273
|
-
Fields: ['ID', 'ContractNumber', 'ContractType'],
|
|
274
|
-
ExtraFilter: `${
|
|
322
|
+
Fields: ['ID', 'ContractNumber', 'ContractType', 'Description'],
|
|
323
|
+
ExtraFilter: `${sameCustomer} AND ${sameLevel} ` +
|
|
324
|
+
`AND SupersededByContractID IS NULL AND ID <> '${me}'`,
|
|
275
325
|
OrderBy: 'ContractNumber ASC',
|
|
276
326
|
ResultType: 'simple',
|
|
277
327
|
});
|
|
278
328
|
this._candidates = (r?.Success ? r.Results : []).map((c) => ({
|
|
279
329
|
...c,
|
|
280
|
-
Label:
|
|
330
|
+
Label: ContractOptionLabel(c),
|
|
281
331
|
}));
|
|
332
|
+
// A LATER SUCCESS CLEARS AN EARLIER FAILURE (#28 item 23). Without this the warning from a
|
|
333
|
+
// read that failed stayed on screen over a list that had since loaded, so the panel showed
|
|
334
|
+
// candidates and told the reader it could not read any. Cleared HERE rather than at the top
|
|
335
|
+
// of the try, so a reload does not blank the explanation while it is in flight.
|
|
336
|
+
this.LoadError = '';
|
|
282
337
|
}
|
|
283
338
|
catch (e) {
|
|
284
339
|
// Do NOT swallow this. An empty list and a failed read look identical in the UI, and the
|
|
@@ -286,7 +341,7 @@ let MJCContractSupersedePanel = class MJCContractSupersedePanel extends BaseForm
|
|
|
286
341
|
// simply sat greyed out with nothing to explain it.
|
|
287
342
|
this._candidates = [];
|
|
288
343
|
this.LoadError = `Could not read eligible contracts: ${e instanceof Error ? e.message : String(e)}`;
|
|
289
|
-
this.
|
|
344
|
+
this.loadedFor = null; // let the next read retry
|
|
290
345
|
}
|
|
291
346
|
finally {
|
|
292
347
|
this.CandidatesLoading = false;
|
|
@@ -294,7 +349,7 @@ let MJCContractSupersedePanel = class MJCContractSupersedePanel extends BaseForm
|
|
|
294
349
|
}
|
|
295
350
|
}
|
|
296
351
|
static ɵfac = /*@__PURE__*/ (() => { let ɵMJCContractSupersedePanel_BaseFactory; return function MJCContractSupersedePanel_Factory(__ngFactoryType__) { return (ɵMJCContractSupersedePanel_BaseFactory || (ɵMJCContractSupersedePanel_BaseFactory = i0.ɵɵgetInheritedFactory(MJCContractSupersedePanel)))(__ngFactoryType__ || MJCContractSupersedePanel); }; })();
|
|
297
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJCContractSupersedePanel, selectors: [["mjc-contract-supersede-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 7, vars: 3, consts: [["SectionKey", "
|
|
352
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJCContractSupersedePanel, selectors: [["mjc-contract-supersede-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 7, vars: 3, consts: [["SectionKey", "supersede", "SectionName", "Re-papering", "Icon", "fa-solid fa-arrow-right-arrow-left", 3, "Form", "FormContext"], [1, "mj-forms-field"], [1, "mj-forms-field-label"], [1, "mj-forms-field-control"], [1, "mj-forms-field-value"], [1, "mjc-chip", "mjc-chip--muted"], ["TextField", "Label", "ValueField", "ID", "Placeholder", "Search contracts at this level\u2026", 3, "ngModelChange", "Data", "ValuePrimitive", "Filterable", "Disabled", "ngModel"], ["mjButton", "", "variant", "primary", "size", "sm", "type", "button", 3, "click", "disabled"], ["mjButton", "", "variant", "flat", "size", "sm", "type", "button", 3, "disabled"], [1, "mjc-hint"], ["Variant", "warning", "Size", "sm", 3, "Message"], ["Variant", "error", "Size", "sm", 3, "Message"], ["Variant", "success", "Size", "sm", 3, "Message"], ["mjButton", "", "variant", "flat", "size", "sm", "type", "button", 3, "click", "disabled"]], template: function MJCContractSupersedePanel_Template(rf, ctx) { if (rf & 1) {
|
|
298
353
|
i0.ɵɵelementStart(0, "mj-collapsible-panel", 0)(1, "div", 1)(2, "label", 2);
|
|
299
354
|
i0.ɵɵtext(3, "Supersedes");
|
|
300
355
|
i0.ɵɵelementEnd();
|
|
@@ -319,6 +374,8 @@ MJCContractSupersedePanel = __decorate([
|
|
|
319
374
|
slot: 'after-fields',
|
|
320
375
|
sortKey: 40,
|
|
321
376
|
contributionKey: 'supersede',
|
|
377
|
+
relatedEntity: MJC_ENTITIES.Contract,
|
|
378
|
+
relatedJoinField: 'SupersededByContractID',
|
|
322
379
|
},
|
|
323
380
|
})
|
|
324
381
|
], MJCContractSupersedePanel);
|
|
@@ -332,7 +389,7 @@ export { MJCContractSupersedePanel };
|
|
|
332
389
|
imports: [CommonModule, FormsModule, BaseFormsModule, MJComboboxComponent, MJButtonDirective, MJAlertComponent],
|
|
333
390
|
template: `
|
|
334
391
|
<mj-collapsible-panel
|
|
335
|
-
SectionKey="
|
|
392
|
+
SectionKey="supersede"
|
|
336
393
|
SectionName="Re-papering"
|
|
337
394
|
Icon="fa-solid fa-arrow-right-arrow-left"
|
|
338
395
|
[Form]="FormComponent"
|
|
@@ -362,7 +419,7 @@ export { MJCContractSupersedePanel };
|
|
|
362
419
|
—
|
|
363
420
|
}
|
|
364
421
|
<span class="mjc-chip mjc-chip--muted">
|
|
365
|
-
{{ Record?.IsSaved ? '
|
|
422
|
+
{{ Record?.IsSaved ? 'Finish editing to change' : 'Save this contract first' }}
|
|
366
423
|
</span>
|
|
367
424
|
</span>
|
|
368
425
|
} @else {
|
|
@@ -374,7 +431,8 @@ export { MJCContractSupersedePanel };
|
|
|
374
431
|
[Filterable]="true"
|
|
375
432
|
[Disabled]="Busy"
|
|
376
433
|
Placeholder="Search contracts at this level…"
|
|
377
|
-
[
|
|
434
|
+
[ngModel]="PickedPredecessorID"
|
|
435
|
+
(ngModelChange)="PickPredecessor($event)" />
|
|
378
436
|
|
|
379
437
|
<button mjButton variant="primary" size="sm" type="button"
|
|
380
438
|
[disabled]="Busy || !PickedPredecessorID"
|
|
@@ -411,5 +469,5 @@ export { MJCContractSupersedePanel };
|
|
|
411
469
|
`,
|
|
412
470
|
}]
|
|
413
471
|
}], null, null); })();
|
|
414
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCContractSupersedePanel, { className: "MJCContractSupersedePanel", filePath: "lib/form-panels/supersede.panel.ts", lineNumber:
|
|
472
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCContractSupersedePanel, { className: "MJCContractSupersedePanel", filePath: "lib/form-panels/supersede.panel.ts", lineNumber: 147 }); })();
|
|
415
473
|
//# sourceMappingURL=supersede.panel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supersede.panel.js","sourceRoot":"","sources":["../../../src/lib/form-panels/supersede.panel.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAG5G,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;;;;;;
|
|
1
|
+
{"version":3,"file":"supersede.panel.js","sourceRoot":"","sources":["../../../src/lib/form-panels/supersede.panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,54 +1,74 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview The Contracts dashboard —
|
|
2
|
+
* @fileoverview The Contracts dashboard — obligation command center.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
-
*
|
|
10
|
-
*
|
|
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 { EventEmitter, OnInit } from '@angular/core';
|
|
16
|
+
import { type EntityInfo } from '@memberjunction/core';
|
|
17
|
+
import { type RecordOpenedEvent } from '@memberjunction/ng-entity-viewer';
|
|
18
|
+
import type { MJUserViewEntityExtended } from '@memberjunction/core-entities';
|
|
17
19
|
import * as i0 from "@angular/core";
|
|
18
20
|
/** One headline number, and where clicking it goes. */
|
|
19
21
|
interface AttentionTile {
|
|
20
22
|
Id: string;
|
|
21
23
|
Label: string;
|
|
22
|
-
/** What the number means, in a sentence — shown as the tile's title. */
|
|
23
24
|
Hint: string;
|
|
24
25
|
Filter: string;
|
|
25
|
-
/** Rail page id to open. Null means the tile is informational only. */
|
|
26
26
|
GoTo: string | null;
|
|
27
27
|
Count: number | null;
|
|
28
28
|
}
|
|
29
|
+
interface StateBar {
|
|
30
|
+
State: string;
|
|
31
|
+
Count: number;
|
|
32
|
+
}
|
|
33
|
+
interface HorizonBucket {
|
|
34
|
+
Label: string;
|
|
35
|
+
Count: number;
|
|
36
|
+
}
|
|
29
37
|
export declare class MJCContractsDashboardPageComponent implements OnInit {
|
|
30
38
|
private readonly cdr;
|
|
39
|
+
private readonly navigation;
|
|
31
40
|
/** Asks the host section to switch rail pages. The dashboard does not route itself. */
|
|
32
41
|
NavigateToPage: EventEmitter<string>;
|
|
33
42
|
LoadError: string | null;
|
|
43
|
+
StateBars: StateBar[];
|
|
44
|
+
Horizon: HorizonBucket[];
|
|
45
|
+
ContractEntityInfo: EntityInfo | null;
|
|
46
|
+
HotView: MJUserViewEntityExtended | null;
|
|
34
47
|
/**
|
|
35
|
-
* The
|
|
48
|
+
* The questions worth answering on open, in priority order.
|
|
36
49
|
*
|
|
37
50
|
* "In force without paper" leads because it is the only one that is both an obligation we are
|
|
38
51
|
* already performing and a document we cannot produce — the combination that hurts in a dispute.
|
|
39
52
|
*/
|
|
40
53
|
Tiles: AttentionTile[];
|
|
54
|
+
/** The four actionable tiles, in funnel order. Signed-not-started is informational, not a queue. */
|
|
55
|
+
get ChartTiles(): AttentionTile[];
|
|
41
56
|
ngOnInit(): void;
|
|
42
57
|
Open(tile: AttentionTile): void;
|
|
58
|
+
OpenRecord(id: string): void;
|
|
59
|
+
OnRecordOpened(event: RecordOpenedEvent): void;
|
|
60
|
+
BarPct(count: number): string;
|
|
61
|
+
FunnelHeight(count: number | null): string;
|
|
62
|
+
ShortLabel(id: string): string;
|
|
43
63
|
/**
|
|
44
|
-
* Count every tile concurrently.
|
|
64
|
+
* Count every tile concurrently, then load the roster used for mix / horizon / hot list.
|
|
45
65
|
*
|
|
46
|
-
* `MaxRows: 1` and read `TotalRowCount` — the count comes back without transferring
|
|
47
|
-
* whose query fails shows an em dash rather than a zero
|
|
48
|
-
* different answers, and showing 0 for the first is the kind of quiet lie a dashboard should never
|
|
49
|
-
* tell. One shared error line explains it once rather than five times.
|
|
66
|
+
* `MaxRows: 1` and read `TotalRowCount` for tiles — the count comes back without transferring
|
|
67
|
+
* rows. A tile whose query fails shows an em dash rather than a zero.
|
|
50
68
|
*/
|
|
51
69
|
private refresh;
|
|
70
|
+
private mixStates;
|
|
71
|
+
private horizon;
|
|
52
72
|
static ɵfac: i0.ɵɵFactoryDeclaration<MJCContractsDashboardPageComponent, never>;
|
|
53
73
|
static ɵcmp: i0.ɵɵComponentDeclaration<MJCContractsDashboardPageComponent, "mjc-contracts-dashboard-page", never, {}, { "NavigateToPage": "NavigateToPage"; }, never, never, true, never>;
|
|
54
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts-dashboard.page.d.ts","sourceRoot":"","sources":["../../../src/lib/pages/contracts-dashboard.page.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"contracts-dashboard.page.d.ts","sourceRoot":"","sources":["../../../src/lib/pages/contracts-dashboard.page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAgC,YAAY,EAAE,MAAM,EAAqC,MAAM,eAAe,CAAC;AAEtH,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAsB,KAAK,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC9F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;;AAK9E,uDAAuD;AACvD,UAAU,aAAa;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,UAAU,QAAQ;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB;AAeD,qBA0Ga,kCAAmC,YAAW,MAAM;IAC7D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IAExD,uFAAuF;IAC7E,cAAc,uBAA8B;IAE/C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAChC,SAAS,EAAE,QAAQ,EAAE,CAAM;IAC3B,OAAO,EAAE,aAAa,EAAE,CAAM;IAC9B,kBAAkB,EAAE,UAAU,GAAG,IAAI,CAAQ;IAC7C,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAQ;IAEvD;;;;;OAKG;IACI,KAAK,EAAE,aAAa,EAAE,CA4C3B;IAEF,oGAAoG;IACpG,IAAW,UAAU,IAAI,aAAa,EAAE,CAEvC;IAEM,QAAQ,IAAI,IAAI;IAIhB,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI/B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI5B,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAK9C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK7B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAO1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAerC;;;;;OAKG;YACW,OAAO;IA4DrB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,OAAO;yCAhMN,kCAAkC;2CAAlC,kCAAkC;CAkN9C"}
|