@mj-biz-apps/contracts-ng 0.4.0 → 0.4.1

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.
@@ -25,5 +25,9 @@ export declare const MJC_FOREIGN_ENTITIES: {
25
25
  readonly Person: "MJ_BizApps_Common: People";
26
26
  /** MJ CORE's Company, not accounting's — verified against __mj.EntityRelationship. */
27
27
  readonly Company: "MJ: Companies";
28
+ /** MJ CORE's file storage: a file row, its category, and the polymorphic record↔file link (golive #213). */
29
+ readonly File: "MJ: Files";
30
+ readonly FileCategory: "MJ: File Categories";
31
+ readonly FileEntityRecordLink: "MJ: File Entity Record Links";
28
32
  };
29
33
  //# sourceMappingURL=entity-names.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity-names.d.ts","sourceRoot":"","sources":["../../../src/lib/data/entity-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kCAAkC;AAClC,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,iGAAiG;AACjG,eAAO,MAAM,oBAAoB;;;IAG7B,sFAAsF;;CAEhF,CAAC"}
1
+ {"version":3,"file":"entity-names.d.ts","sourceRoot":"","sources":["../../../src/lib/data/entity-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kCAAkC;AAClC,eAAO,MAAM,YAAY;;;;;;;CAOf,CAAC;AAEX,iGAAiG;AACjG,eAAO,MAAM,oBAAoB;;;IAG7B,sFAAsF;;IAEtF,4GAA4G;;;;CAItG,CAAC"}
@@ -25,5 +25,9 @@ export const MJC_FOREIGN_ENTITIES = {
25
25
  Person: 'MJ_BizApps_Common: People',
26
26
  /** MJ CORE's Company, not accounting's — verified against __mj.EntityRelationship. */
27
27
  Company: 'MJ: Companies',
28
+ /** MJ CORE's file storage: a file row, its category, and the polymorphic record↔file link (golive #213). */
29
+ File: 'MJ: Files',
30
+ FileCategory: 'MJ: File Categories',
31
+ FileEntityRecordLink: 'MJ: File Entity Record Links',
28
32
  };
29
33
  //# sourceMappingURL=entity-names.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity-names.js","sourceRoot":"","sources":["../../../src/lib/data/entity-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kCAAkC;AAClC,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,QAAQ,EAAE,iCAAiC;IAC3C,YAAY,EAAE,sCAAsC;IACpD,gBAAgB,EAAE,0CAA0C;IAC5D,oBAAoB,EAAE,+CAA+C;IACrE,yBAAyB,EAAE,oDAAoD;IAC/E,4BAA4B,EAAE,uDAAuD;CAC/E,CAAC;AAEX,iGAAiG;AACjG,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAChC,YAAY,EAAE,kCAAkC;IAChD,MAAM,EAAE,2BAA2B;IACnC,sFAAsF;IACtF,OAAO,EAAE,eAAe;CAClB,CAAC"}
1
+ {"version":3,"file":"entity-names.js","sourceRoot":"","sources":["../../../src/lib/data/entity-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kCAAkC;AAClC,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,QAAQ,EAAE,iCAAiC;IAC3C,YAAY,EAAE,sCAAsC;IACpD,gBAAgB,EAAE,0CAA0C;IAC5D,oBAAoB,EAAE,+CAA+C;IACrE,yBAAyB,EAAE,oDAAoD;IAC/E,4BAA4B,EAAE,uDAAuD;CAC/E,CAAC;AAEX,iGAAiG;AACjG,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAChC,YAAY,EAAE,kCAAkC;IAChD,MAAM,EAAE,2BAA2B;IACnC,sFAAsF;IACtF,OAAO,EAAE,eAAe;IACxB,4GAA4G;IAC5G,IAAI,EAAE,WAAW;IACjB,YAAY,EAAE,qBAAqB;IACnC,oBAAoB,EAAE,8BAA8B;CAC9C,CAAC"}
@@ -0,0 +1,85 @@
1
+ import type { MJFileEntity } from '@memberjunction/core-entities';
2
+ import { BaseFormPanel } from '@memberjunction/ng-base-forms';
3
+ import { ContractEntity } from '@mj-biz-apps/contracts-entities';
4
+ import * as i0 from "@angular/core";
5
+ /** One file linked to this contract, with the loaded entity so Mark/Unmark save exactly the row that was read. */
6
+ interface LinkedFile {
7
+ FileID: string;
8
+ Name: string;
9
+ CategoryName: string | null;
10
+ Entity: MJFileEntity;
11
+ }
12
+ export declare class MJCContractExecutedAgreementPanel extends BaseFormPanel<ContractEntity> {
13
+ private readonly cdr;
14
+ /** The category's display name, for copy. */
15
+ readonly CategoryName = "Executed Agreement";
16
+ /** The `MJ: File Categories` row named {@link EXECUTED_AGREEMENT_FILE_CATEGORY}, resolved per load; null when absent. */
17
+ CategoryID: string | null;
18
+ /** True after a successful load that found no category row — a database the migration has not reached. */
19
+ CategoryMissing: boolean;
20
+ Loading: boolean;
21
+ /** True while a Mark/Unmark is in flight, so a button cannot be double-fired. */
22
+ Busy: boolean;
23
+ /** Why the list is empty, when the reason is a failed read rather than genuinely nothing. */
24
+ LoadError: string;
25
+ ActionError: string;
26
+ /** Confirmation, so a working mark is never indistinguishable from a silent no-op. */
27
+ ActionOk: string;
28
+ /** Links whose file row did not come back — most likely no read permission on MJ: Files. */
29
+ Unreadable: number;
30
+ private _files;
31
+ /**
32
+ * WHICH contract the list was loaded for, not merely whether it was (the #28 item 23 lesson): the
33
+ * form reuses this instance when it navigates to another contract, and a boolean would keep the
34
+ * previous contract's files on screen.
35
+ */
36
+ private loadedFor;
37
+ /** The linked files. Loaded on first read; no EditMode gate, because the panel is always shown. */
38
+ get Files(): LinkedFile[];
39
+ /** Read-only while the form is editing or the contract has never been saved — the Re-papering rule. */
40
+ get ReadOnly(): boolean;
41
+ /** Whether the buttons render at all: writable, permitted, and a category row to point at. */
42
+ get CanMark(): boolean;
43
+ /**
44
+ * Whether this user may change a file's category — the `MJ: Files` entity's update permission, which
45
+ * is the platform's own allow/deny aggregation across the user's roles. FALSE on any doubt: a hidden
46
+ * button and a sentence saying why beat a button that fails.
47
+ */
48
+ get CanUpdateFiles(): boolean;
49
+ IsExecutedAgreement(file: LinkedFile): boolean;
50
+ /** The form's toolbar Refresh, or a refresh this panel triggered after a write: re-read the list. */
51
+ OnRecordRefreshed(): void;
52
+ /** The panel's own refresh button — the list only, since attaching a file does not change the record. */
53
+ Refresh(): Promise<void>;
54
+ Mark(file: LinkedFile): Promise<void>;
55
+ Unmark(file: LinkedFile): Promise<void>;
56
+ /** The host form's provider, so this panel reads and writes wherever the record it is showing came from. */
57
+ private get provider();
58
+ /**
59
+ * Write the category on the FILE, then re-read the RECORD. `Save()` does not throw; it returns false
60
+ * and leaves the reason on `LatestResult`. On failure the in-memory entity is reverted so the row
61
+ * does not claim a category the database refused.
62
+ */
63
+ private setCategory;
64
+ /**
65
+ * The header chip and the Overview read `IsAwaitingDocument` off the PERSISTED view column, so the
66
+ * record has to come back from the database. `RefreshRecord()` also notifies every panel through
67
+ * `OnRecordRefreshed`, which is how this list reloads; when it declines (editing, unsaved, or no
68
+ * form host) the list is reloaded directly so the row at least shows what was written.
69
+ */
70
+ private reReadRecord;
71
+ /** Category row, then links, then the files they name — three reads, the last two skipped when nothing is linked. */
72
+ private load;
73
+ /** The category the view resolves on, looked up the way the view does it: by Name. */
74
+ private resolveCategory;
75
+ /**
76
+ * The links for THIS record, then the files they name — through MJ's polymorphic
77
+ * `MJ: File Entity Record Links` (EntityID + RecordID), which is where the view looks too.
78
+ * `entity_object` on the files is load-bearing: Mark/Unmark save the very entity that was read.
79
+ */
80
+ private loadLinkedFiles;
81
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJCContractExecutedAgreementPanel, never>;
82
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJCContractExecutedAgreementPanel, "mjc-contract-executed-agreement-panel", never, {}, {}, never, never, true, never>;
83
+ }
84
+ export {};
85
+ //# sourceMappingURL=executed-agreement.panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executed-agreement.panel.d.ts","sourceRoot":"","sources":["../../../src/lib/form-panels/executed-agreement.panel.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAmB,MAAM,+BAA+B,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAoC,MAAM,iCAAiC,CAAC;;AAInG,kHAAkH;AAClH,UAAU,UAAU;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,YAAY,CAAC;CACxB;AAOD,qBA0Ia,iCAAkC,SAAQ,aAAa,CAAC,cAAc,CAAC;IAChF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,6CAA6C;IAC7C,SAAgB,YAAY,wBAAoC;IAChE,yHAAyH;IAClH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,0GAA0G;IACnG,eAAe,UAAS;IACxB,OAAO,UAAS;IACvB,iFAAiF;IAC1E,IAAI,UAAS;IACpB,6FAA6F;IACtF,SAAS,SAAM;IACf,WAAW,SAAM;IACxB,sFAAsF;IAC/E,QAAQ,SAAM;IACrB,4FAA4F;IACrF,UAAU,SAAK;IAEtB,OAAO,CAAC,MAAM,CAAoB;IAClC;;;;OAIG;IACH,OAAO,CAAC,SAAS,CAAuB;IAExC,mGAAmG;IACnG,IAAW,KAAK,IAAI,UAAU,EAAE,CAO/B;IAED,uGAAuG;IACvG,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAED,8FAA8F;IAC9F,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED;;;;OAIG;IACH,IAAW,cAAc,IAAI,OAAO,CAMnC;IAEM,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO;IAIrD,qGAAqG;IACrF,iBAAiB,IAAI,IAAI;IAIzC,yGAAyG;IAC5F,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKrC,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,4GAA4G;IAC5G,OAAO,KAAK,QAAQ,GAEnB;IAED;;;;OAIG;YACW,WAAW;IAoBzB;;;;;OAKG;YACW,YAAY;IAK1B,qHAAqH;YACvG,IAAI;IAsBlB,sFAAsF;YACxE,eAAe;IAY7B;;;;OAIG;YACW,eAAe;yCAxKpB,iCAAiC;2CAAjC,iCAAiC;CA+L7C"}
@@ -0,0 +1,581 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ /**
8
+ * @fileoverview Executed agreement — mark WHICH linked file is the signed contract (golive #213).
9
+ *
10
+ * WHY THIS PANEL EXISTS. Since contracts #36 (golive #203 item 16) `vwContracts.IsAwaitingDocument`
11
+ * clears only when a file linked to the contract carries MJ's file category named
12
+ * 'Executed Agreement'. Files themselves attach through MJ's stock Attachments panel on the form
13
+ * toolbar — but at 6.1.0-edge.4 that panel cannot set a file's category: its upload has no dialog to
14
+ * put a checkbox in, its Edit Details writes only name and description, and the form container
15
+ * passes it no default category. So the gate the migration introduced could never be satisfied from
16
+ * the UI, and a contract whose type requires an executed document read "Awaiting document" whatever
17
+ * was attached. This panel closes exactly that gap and nothing else: attach, remove and open stay
18
+ * with the stock panel.
19
+ *
20
+ * THE RE-PAPERING RULE, adopted deliberately (supersede.panel.ts): ALWAYS VISIBLE, not gated on
21
+ * EditMode. Marking writes the FILE, not this record, in its own save — it is not one of the form's
22
+ * fields, so it is available in read mode and shown read-only while the form is editing or the
23
+ * contract is unsaved. A contract with no primary key yet has nothing linked to mark.
24
+ *
25
+ * BY NAME, never by id, for the same reason the view and the migration do it that way: the category
26
+ * row is seeded per database, so a hardcoded UUID stops matching the first time an environment is
27
+ * rebuilt from zero. The one spelling lives in `@mj-biz-apps/contracts-entities` and a test pins it
28
+ * to the migration seed.
29
+ *
30
+ * WHAT "MARKED" MEANS HERE is what the VIEW means: the linked file's category NAME is
31
+ * 'Executed Agreement'. Mark sets `File.CategoryID` to that category's row; Unmark clears it to null
32
+ * (a previous category, if any, is not restored — the stock panel shows and never sets one, so there
33
+ * is nothing to restore in practice). After either write the form re-reads the record, because the
34
+ * header chip and the Overview health line read the PERSISTED view column rather than re-deriving it.
35
+ *
36
+ * @module @mj-biz-apps/contracts-ng
37
+ */
38
+ import { ChangeDetectorRef, Component, ViewEncapsulation, inject } from '@angular/core';
39
+ import { CommonModule } from '@angular/common';
40
+ import { EscapeSQLString, RegisterClassEx } from '@memberjunction/global';
41
+ import { Metadata } from '@memberjunction/core';
42
+ import { BaseFormPanel, BaseFormsModule } from '@memberjunction/ng-base-forms';
43
+ import { MJAlertComponent, MJButtonDirective, MJRefreshButtonComponent } from '@memberjunction/ng-ui-components';
44
+ import { EXECUTED_AGREEMENT_FILE_CATEGORY } from '@mj-biz-apps/contracts-entities';
45
+ import { MJC_ENTITIES, MJC_FOREIGN_ENTITIES } from '../data/entity-names';
46
+ import { ScopedRunView } from '../data/provider';
47
+ import * as i0 from "@angular/core";
48
+ import * as i1 from "@memberjunction/ng-base-forms";
49
+ const _forTrack0 = ($index, $item) => $item.FileID;
50
+ function MJCContractExecutedAgreementPanel_Conditional_5_Template(rf, ctx) { if (rf & 1) {
51
+ const _r1 = i0.ɵɵgetCurrentView();
52
+ i0.ɵɵelementStart(0, "mj-refresh-button", 10);
53
+ i0.ɵɵlistener("Clicked", function MJCContractExecutedAgreementPanel_Conditional_5_Template_mj_refresh_button_Clicked_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Refresh()); });
54
+ i0.ɵɵelementEnd();
55
+ } if (rf & 2) {
56
+ const ctx_r1 = i0.ɵɵnextContext();
57
+ i0.ɵɵproperty("ShowLabel", false)("Loading", ctx_r1.Loading)("Disabled", ctx_r1.Busy);
58
+ } }
59
+ function MJCContractExecutedAgreementPanel_Conditional_8_Template(rf, ctx) { if (rf & 1) {
60
+ i0.ɵɵelementStart(0, "div", 6);
61
+ i0.ɵɵtext(1, "Loading linked files\u2026");
62
+ i0.ɵɵelementEnd();
63
+ } }
64
+ function MJCContractExecutedAgreementPanel_Conditional_9_Template(rf, ctx) { if (rf & 1) {
65
+ i0.ɵɵelement(0, "mj-alert", 7);
66
+ } if (rf & 2) {
67
+ const ctx_r1 = i0.ɵɵnextContext();
68
+ i0.ɵɵproperty("Message", ctx_r1.LoadError);
69
+ } }
70
+ function MJCContractExecutedAgreementPanel_Conditional_10_Conditional_2_Template(rf, ctx) { if (rf & 1) {
71
+ i0.ɵɵelementStart(0, "div", 6);
72
+ i0.ɵɵtext(1, " No files are linked to this contract. Attach the signed PDF with the Attachments button on the toolbar, then mark it here. ");
73
+ i0.ɵɵelementEnd();
74
+ } }
75
+ function MJCContractExecutedAgreementPanel_Conditional_10_Template(rf, ctx) { if (rf & 1) {
76
+ i0.ɵɵelementStart(0, "span", 11);
77
+ i0.ɵɵtext(1, "\u2014");
78
+ i0.ɵɵelementEnd();
79
+ i0.ɵɵconditionalCreate(2, MJCContractExecutedAgreementPanel_Conditional_10_Conditional_2_Template, 2, 0, "div", 6);
80
+ } if (rf & 2) {
81
+ const ctx_r1 = i0.ɵɵnextContext();
82
+ i0.ɵɵadvance(2);
83
+ i0.ɵɵconditional(ctx_r1.Record.IsSaved ? 2 : -1);
84
+ } }
85
+ function MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_4_Template(rf, ctx) { if (rf & 1) {
86
+ i0.ɵɵelementStart(0, "span", 12);
87
+ i0.ɵɵelement(1, "i", 14);
88
+ i0.ɵɵtext(2, " Executed agreement ");
89
+ i0.ɵɵelementEnd();
90
+ } }
91
+ function MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_5_Template(rf, ctx) { if (rf & 1) {
92
+ i0.ɵɵelementStart(0, "span", 9);
93
+ i0.ɵɵtext(1);
94
+ i0.ɵɵelementEnd();
95
+ } if (rf & 2) {
96
+ const f_r3 = i0.ɵɵnextContext().$implicit;
97
+ i0.ɵɵadvance();
98
+ i0.ɵɵtextInterpolate(f_r3.CategoryName);
99
+ } }
100
+ function MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_6_Template(rf, ctx) { if (rf & 1) {
101
+ i0.ɵɵelementStart(0, "span", 13);
102
+ i0.ɵɵtext(1, "\u2014");
103
+ i0.ɵɵelementEnd();
104
+ } }
105
+ function MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_8_Conditional_0_Template(rf, ctx) { if (rf & 1) {
106
+ const _r4 = i0.ɵɵgetCurrentView();
107
+ i0.ɵɵelementStart(0, "button", 17);
108
+ i0.ɵɵlistener("click", function MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_8_Conditional_0_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const f_r3 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.Unmark(f_r3)); });
109
+ i0.ɵɵtext(1, " Unmark ");
110
+ i0.ɵɵelementEnd();
111
+ } if (rf & 2) {
112
+ const f_r3 = i0.ɵɵnextContext(2).$implicit;
113
+ const ctx_r1 = i0.ɵɵnextContext(2);
114
+ i0.ɵɵproperty("disabled", ctx_r1.Busy);
115
+ i0.ɵɵattribute("aria-label", "Unmark " + f_r3.Name + " as the executed agreement");
116
+ } }
117
+ function MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
118
+ const _r5 = i0.ɵɵgetCurrentView();
119
+ i0.ɵɵelementStart(0, "button", 18);
120
+ i0.ɵɵlistener("click", function MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_8_Conditional_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const f_r3 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.Mark(f_r3)); });
121
+ i0.ɵɵtext(1, " Mark as executed agreement ");
122
+ i0.ɵɵelementEnd();
123
+ } if (rf & 2) {
124
+ const f_r3 = i0.ɵɵnextContext(2).$implicit;
125
+ const ctx_r1 = i0.ɵɵnextContext(2);
126
+ i0.ɵɵproperty("disabled", ctx_r1.Busy || !ctx_r1.CategoryID);
127
+ i0.ɵɵattribute("aria-label", "Mark " + f_r3.Name + " as the executed agreement");
128
+ } }
129
+ function MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_8_Template(rf, ctx) { if (rf & 1) {
130
+ i0.ɵɵconditionalCreate(0, MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_8_Conditional_0_Template, 2, 2, "button", 15)(1, MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_8_Conditional_1_Template, 2, 2, "button", 16);
131
+ } if (rf & 2) {
132
+ const f_r3 = i0.ɵɵnextContext().$implicit;
133
+ const ctx_r1 = i0.ɵɵnextContext(2);
134
+ i0.ɵɵconditional(ctx_r1.IsExecutedAgreement(f_r3) ? 0 : 1);
135
+ } }
136
+ function MJCContractExecutedAgreementPanel_Conditional_11_For_10_Template(rf, ctx) { if (rf & 1) {
137
+ i0.ɵɵelementStart(0, "tr")(1, "td");
138
+ i0.ɵɵtext(2);
139
+ i0.ɵɵelementEnd();
140
+ i0.ɵɵelementStart(3, "td");
141
+ i0.ɵɵconditionalCreate(4, MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_4_Template, 3, 0, "span", 12)(5, MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_5_Template, 2, 1, "span", 9)(6, MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_6_Template, 2, 0, "span", 13);
142
+ i0.ɵɵelementEnd();
143
+ i0.ɵɵelementStart(7, "td");
144
+ i0.ɵɵconditionalCreate(8, MJCContractExecutedAgreementPanel_Conditional_11_For_10_Conditional_8_Template, 2, 1);
145
+ i0.ɵɵelementEnd()();
146
+ } if (rf & 2) {
147
+ const f_r3 = ctx.$implicit;
148
+ const ctx_r1 = i0.ɵɵnextContext(2);
149
+ i0.ɵɵadvance(2);
150
+ i0.ɵɵtextInterpolate(f_r3.Name);
151
+ i0.ɵɵadvance(2);
152
+ i0.ɵɵconditional(ctx_r1.IsExecutedAgreement(f_r3) ? 4 : f_r3.CategoryName ? 5 : 6);
153
+ i0.ɵɵadvance(4);
154
+ i0.ɵɵconditional(ctx_r1.CanMark ? 8 : -1);
155
+ } }
156
+ function MJCContractExecutedAgreementPanel_Conditional_11_Template(rf, ctx) { if (rf & 1) {
157
+ i0.ɵɵelementStart(0, "table", 8)(1, "thead")(2, "tr")(3, "th");
158
+ i0.ɵɵtext(4, "File");
159
+ i0.ɵɵelementEnd();
160
+ i0.ɵɵelementStart(5, "th");
161
+ i0.ɵɵtext(6, "Category");
162
+ i0.ɵɵelementEnd();
163
+ i0.ɵɵelement(7, "th");
164
+ i0.ɵɵelementEnd()();
165
+ i0.ɵɵelementStart(8, "tbody");
166
+ i0.ɵɵrepeaterCreate(9, MJCContractExecutedAgreementPanel_Conditional_11_For_10_Template, 9, 3, "tr", null, _forTrack0);
167
+ i0.ɵɵelementEnd()();
168
+ } if (rf & 2) {
169
+ i0.ɵɵnextContext();
170
+ const files_r6 = i0.ɵɵreadContextLet(7);
171
+ i0.ɵɵadvance(9);
172
+ i0.ɵɵrepeater(files_r6);
173
+ } }
174
+ function MJCContractExecutedAgreementPanel_Conditional_12_Template(rf, ctx) { if (rf & 1) {
175
+ i0.ɵɵelementStart(0, "span", 9);
176
+ i0.ɵɵtext(1);
177
+ i0.ɵɵelementEnd();
178
+ } if (rf & 2) {
179
+ const ctx_r1 = i0.ɵɵnextContext();
180
+ i0.ɵɵadvance();
181
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.Record.IsSaved ? "Finish editing to change" : "Save this contract first", " ");
182
+ } }
183
+ function MJCContractExecutedAgreementPanel_Conditional_13_Conditional_0_Template(rf, ctx) { if (rf & 1) {
184
+ i0.ɵɵelementStart(0, "div", 6);
185
+ i0.ɵɵtext(1, " Marking a file changes its category on MJ: Files, which your roles cannot update. Ask an administrator to grant update permission on MJ: Files. ");
186
+ i0.ɵɵelementEnd();
187
+ } }
188
+ function MJCContractExecutedAgreementPanel_Conditional_13_Conditional_1_Template(rf, ctx) { if (rf & 1) {
189
+ i0.ɵɵelement(0, "mj-alert", 7);
190
+ } if (rf & 2) {
191
+ const ctx_r1 = i0.ɵɵnextContext(2);
192
+ i0.ɵɵproperty("Message", "The file category named " + ctx_r1.CategoryName + " does not exist on this database, so nothing can be marked. The contracts migration V202609010100 seeds it.");
193
+ } }
194
+ function MJCContractExecutedAgreementPanel_Conditional_13_Conditional_2_Template(rf, ctx) { if (rf & 1) {
195
+ i0.ɵɵelementStart(0, "div", 6);
196
+ i0.ɵɵtext(1);
197
+ i0.ɵɵelementEnd();
198
+ } if (rf & 2) {
199
+ const ctx_r1 = i0.ɵɵnextContext(2);
200
+ i0.ɵɵadvance();
201
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.Unreadable, " linked file(s) could not be read and are not listed \u2014 reading MJ: Files needs read permission on that entity. ");
202
+ } }
203
+ function MJCContractExecutedAgreementPanel_Conditional_13_Conditional_3_Template(rf, ctx) { if (rf & 1) {
204
+ i0.ɵɵelement(0, "mj-alert", 19);
205
+ } if (rf & 2) {
206
+ const ctx_r1 = i0.ɵɵnextContext(2);
207
+ i0.ɵɵproperty("Message", ctx_r1.ActionError);
208
+ } }
209
+ function MJCContractExecutedAgreementPanel_Conditional_13_Conditional_4_Template(rf, ctx) { if (rf & 1) {
210
+ i0.ɵɵelement(0, "mj-alert", 20);
211
+ } if (rf & 2) {
212
+ const ctx_r1 = i0.ɵɵnextContext(2);
213
+ i0.ɵɵproperty("Message", ctx_r1.ActionOk);
214
+ } }
215
+ function MJCContractExecutedAgreementPanel_Conditional_13_Template(rf, ctx) { if (rf & 1) {
216
+ i0.ɵɵconditionalCreate(0, MJCContractExecutedAgreementPanel_Conditional_13_Conditional_0_Template, 2, 0, "div", 6)(1, MJCContractExecutedAgreementPanel_Conditional_13_Conditional_1_Template, 1, 1, "mj-alert", 7);
217
+ i0.ɵɵconditionalCreate(2, MJCContractExecutedAgreementPanel_Conditional_13_Conditional_2_Template, 2, 1, "div", 6);
218
+ i0.ɵɵconditionalCreate(3, MJCContractExecutedAgreementPanel_Conditional_13_Conditional_3_Template, 1, 1, "mj-alert", 19);
219
+ i0.ɵɵconditionalCreate(4, MJCContractExecutedAgreementPanel_Conditional_13_Conditional_4_Template, 1, 1, "mj-alert", 20);
220
+ } if (rf & 2) {
221
+ const ctx_r1 = i0.ɵɵnextContext();
222
+ i0.ɵɵconditional(!ctx_r1.CanUpdateFiles ? 0 : ctx_r1.CategoryMissing ? 1 : -1);
223
+ i0.ɵɵadvance(2);
224
+ i0.ɵɵconditional(ctx_r1.Unreadable ? 2 : -1);
225
+ i0.ɵɵadvance();
226
+ i0.ɵɵconditional(ctx_r1.ActionError ? 3 : -1);
227
+ i0.ɵɵadvance();
228
+ i0.ɵɵconditional(ctx_r1.ActionOk ? 4 : -1);
229
+ } }
230
+ /** The view's predicate, in TypeScript: `fc.Name = 'Executed Agreement'` under a case-insensitive collation. */
231
+ function isExecutedAgreementCategory(categoryName) {
232
+ return (categoryName ?? '').trim().toLowerCase() === EXECUTED_AGREEMENT_FILE_CATEGORY.toLowerCase();
233
+ }
234
+ let MJCContractExecutedAgreementPanel = class MJCContractExecutedAgreementPanel extends BaseFormPanel {
235
+ cdr = inject(ChangeDetectorRef);
236
+ /** The category's display name, for copy. */
237
+ CategoryName = EXECUTED_AGREEMENT_FILE_CATEGORY;
238
+ /** The `MJ: File Categories` row named {@link EXECUTED_AGREEMENT_FILE_CATEGORY}, resolved per load; null when absent. */
239
+ CategoryID = null;
240
+ /** True after a successful load that found no category row — a database the migration has not reached. */
241
+ CategoryMissing = false;
242
+ Loading = false;
243
+ /** True while a Mark/Unmark is in flight, so a button cannot be double-fired. */
244
+ Busy = false;
245
+ /** Why the list is empty, when the reason is a failed read rather than genuinely nothing. */
246
+ LoadError = '';
247
+ ActionError = '';
248
+ /** Confirmation, so a working mark is never indistinguishable from a silent no-op. */
249
+ ActionOk = '';
250
+ /** Links whose file row did not come back — most likely no read permission on MJ: Files. */
251
+ Unreadable = 0;
252
+ _files = [];
253
+ /**
254
+ * WHICH contract the list was loaded for, not merely whether it was (the #28 item 23 lesson): the
255
+ * form reuses this instance when it navigates to another contract, and a boolean would keep the
256
+ * previous contract's files on screen.
257
+ */
258
+ loadedFor = null;
259
+ /** The linked files. Loaded on first read; no EditMode gate, because the panel is always shown. */
260
+ get Files() {
261
+ const id = this.Record?.ID;
262
+ if (id && this.loadedFor !== id) {
263
+ this.loadedFor = id;
264
+ void this.load();
265
+ }
266
+ return this._files;
267
+ }
268
+ /** Read-only while the form is editing or the contract has never been saved — the Re-papering rule. */
269
+ get ReadOnly() {
270
+ return this.EditMode || !this.Record?.IsSaved;
271
+ }
272
+ /** Whether the buttons render at all: writable, permitted, and a category row to point at. */
273
+ get CanMark() {
274
+ return !this.ReadOnly && this.CanUpdateFiles && !this.LoadError;
275
+ }
276
+ /**
277
+ * Whether this user may change a file's category — the `MJ: Files` entity's update permission, which
278
+ * is the platform's own allow/deny aggregation across the user's roles. FALSE on any doubt: a hidden
279
+ * button and a sentence saying why beat a button that fails.
280
+ */
281
+ get CanUpdateFiles() {
282
+ const provider = this.provider;
283
+ const user = provider.CurrentUser;
284
+ if (!user)
285
+ return false;
286
+ const files = provider.EntityByName(MJC_FOREIGN_ENTITIES.File);
287
+ return files?.GetUserPermisions(user).CanUpdate === true;
288
+ }
289
+ IsExecutedAgreement(file) {
290
+ return isExecutedAgreementCategory(file.CategoryName);
291
+ }
292
+ /** The form's toolbar Refresh, or a refresh this panel triggered after a write: re-read the list. */
293
+ OnRecordRefreshed() {
294
+ void this.load();
295
+ }
296
+ /** The panel's own refresh button — the list only, since attaching a file does not change the record. */
297
+ async Refresh() {
298
+ this.ActionOk = '';
299
+ this.ActionError = '';
300
+ await this.load();
301
+ }
302
+ async Mark(file) {
303
+ if (!this.CategoryID)
304
+ return;
305
+ await this.setCategory(file, this.CategoryID, `Marked — ${file.Name} is the executed agreement.`);
306
+ }
307
+ async Unmark(file) {
308
+ await this.setCategory(file, null, `Unmarked — ${file.Name} is no longer the executed agreement.`);
309
+ }
310
+ /** The host form's provider, so this panel reads and writes wherever the record it is showing came from. */
311
+ get provider() {
312
+ return this.FormComponent?.ProviderToUse ?? Metadata.Provider;
313
+ }
314
+ /**
315
+ * Write the category on the FILE, then re-read the RECORD. `Save()` does not throw; it returns false
316
+ * and leaves the reason on `LatestResult`. On failure the in-memory entity is reverted so the row
317
+ * does not claim a category the database refused.
318
+ */
319
+ async setCategory(file, categoryID, okMessage) {
320
+ this.Busy = true;
321
+ this.ActionError = '';
322
+ this.ActionOk = '';
323
+ try {
324
+ file.Entity.CategoryID = categoryID;
325
+ if (!(await file.Entity.Save())) {
326
+ file.Entity.Revert();
327
+ throw new Error(file.Entity.LatestResult?.CompleteMessage || 'The file could not be saved.');
328
+ }
329
+ this.ActionOk = okMessage;
330
+ await this.reReadRecord();
331
+ }
332
+ catch (e) {
333
+ this.ActionError = e instanceof Error ? e.message : String(e);
334
+ }
335
+ finally {
336
+ this.Busy = false;
337
+ this.cdr.detectChanges();
338
+ }
339
+ }
340
+ /**
341
+ * The header chip and the Overview read `IsAwaitingDocument` off the PERSISTED view column, so the
342
+ * record has to come back from the database. `RefreshRecord()` also notifies every panel through
343
+ * `OnRecordRefreshed`, which is how this list reloads; when it declines (editing, unsaved, or no
344
+ * form host) the list is reloaded directly so the row at least shows what was written.
345
+ */
346
+ async reReadRecord() {
347
+ const refreshed = this.FormComponent ? await this.FormComponent.RefreshRecord() : false;
348
+ if (!refreshed)
349
+ await this.load();
350
+ }
351
+ /** Category row, then links, then the files they name — three reads, the last two skipped when nothing is linked. */
352
+ async load() {
353
+ if (!this.Record?.IsSaved)
354
+ return;
355
+ this.Loading = true;
356
+ try {
357
+ const rv = ScopedRunView(this.FormComponent?.ProviderToUse);
358
+ await this.resolveCategory(rv);
359
+ this._files = await this.loadLinkedFiles(rv);
360
+ // A later success clears an earlier failure, and clears it HERE rather than at the top of the
361
+ // try, so a reload does not blank the explanation while it is in flight.
362
+ this.LoadError = '';
363
+ }
364
+ catch (e) {
365
+ // Do NOT swallow this: an empty list and a failed read look identical on screen, and the
366
+ // difference is the whole diagnosis.
367
+ this._files = [];
368
+ this.LoadError = `Could not read the files linked to this contract: ${e instanceof Error ? e.message : String(e)}`;
369
+ this.loadedFor = null; // let the next read retry
370
+ }
371
+ finally {
372
+ this.Loading = false;
373
+ this.cdr.detectChanges();
374
+ }
375
+ }
376
+ /** The category the view resolves on, looked up the way the view does it: by Name. */
377
+ async resolveCategory(rv) {
378
+ const r = await rv.RunView({
379
+ EntityName: MJC_FOREIGN_ENTITIES.FileCategory,
380
+ Fields: ['ID', 'Name'],
381
+ ExtraFilter: `Name = '${EscapeSQLString(EXECUTED_AGREEMENT_FILE_CATEGORY)}'`,
382
+ ResultType: 'simple',
383
+ });
384
+ if (!r?.Success)
385
+ throw new Error(r?.ErrorMessage || 'file categories could not be read');
386
+ this.CategoryID = r.Results[0]?.ID ?? null;
387
+ this.CategoryMissing = !this.CategoryID;
388
+ }
389
+ /**
390
+ * The links for THIS record, then the files they name — through MJ's polymorphic
391
+ * `MJ: File Entity Record Links` (EntityID + RecordID), which is where the view looks too.
392
+ * `entity_object` on the files is load-bearing: Mark/Unmark save the very entity that was read.
393
+ */
394
+ async loadLinkedFiles(rv) {
395
+ const entityID = this.Record.EntityInfo.ID;
396
+ const links = await rv.RunView({
397
+ EntityName: MJC_FOREIGN_ENTITIES.FileEntityRecordLink,
398
+ Fields: ['ID', 'FileID'],
399
+ ExtraFilter: `EntityID = '${EscapeSQLString(entityID)}' AND RecordID = '${EscapeSQLString(this.Record.ID)}'`,
400
+ ResultType: 'simple',
401
+ });
402
+ if (!links?.Success)
403
+ throw new Error(links?.ErrorMessage || 'file links could not be read');
404
+ this.Unreadable = 0;
405
+ if (!links.Results.length)
406
+ return [];
407
+ const ids = links.Results.map((l) => `'${EscapeSQLString(l.FileID)}'`).join(',');
408
+ const files = await rv.RunView({
409
+ EntityName: MJC_FOREIGN_ENTITIES.File,
410
+ ExtraFilter: `ID IN (${ids})`,
411
+ OrderBy: 'Name ASC',
412
+ ResultType: 'entity_object',
413
+ });
414
+ if (!files?.Success)
415
+ throw new Error(files?.ErrorMessage || 'file details could not be read');
416
+ this.Unreadable = Math.max(0, links.Results.length - files.Results.length);
417
+ return files.Results.map((f) => ({ FileID: f.ID, Name: f.Name, CategoryName: f.Category, Entity: f }));
418
+ }
419
+ static ɵfac = /*@__PURE__*/ (() => { let ɵMJCContractExecutedAgreementPanel_BaseFactory; return function MJCContractExecutedAgreementPanel_Factory(__ngFactoryType__) { return (ɵMJCContractExecutedAgreementPanel_BaseFactory || (ɵMJCContractExecutedAgreementPanel_BaseFactory = i0.ɵɵgetInheritedFactory(MJCContractExecutedAgreementPanel)))(__ngFactoryType__ || MJCContractExecutedAgreementPanel); }; })();
420
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJCContractExecutedAgreementPanel, selectors: [["mjc-contract-executed-agreement-panel"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 16, vars: 6, consts: [["SectionKey", "executedAgreement", "SectionName", "Executed agreement", "Icon", "fa-solid fa-file-circle-check", 3, "Form", "FormContext"], [1, "mj-forms-field"], [1, "mjc-exec-head"], [1, "mj-forms-field-label"], ["Variant", "flat", "Size", "sm", "Title", "Reload the linked files", 3, "ShowLabel", "Loading", "Disabled"], [1, "mj-forms-field-control"], [1, "mjc-hint"], ["Variant", "warning", "Size", "sm", 3, "Message"], [1, "mjc-grid"], [1, "mjc-chip", "mjc-chip--muted"], ["Variant", "flat", "Size", "sm", "Title", "Reload the linked files", 3, "Clicked", "ShowLabel", "Loading", "Disabled"], [1, "mj-forms-field-value"], [1, "mjc-chip", "mjc-chip--ok"], [1, "mjc-muted"], ["aria-hidden", "true", 1, "fa-solid", "fa-file-circle-check"], ["mjButton", "", "variant", "flat", "size", "sm", "type", "button", 3, "disabled"], ["mjButton", "", "variant", "primary", "size", "sm", "type", "button", 3, "disabled"], ["mjButton", "", "variant", "flat", "size", "sm", "type", "button", 3, "click", "disabled"], ["mjButton", "", "variant", "primary", "size", "sm", "type", "button", 3, "click", "disabled"], ["Variant", "error", "Size", "sm", 3, "Message"], ["Variant", "success", "Size", "sm", 3, "Message"]], template: function MJCContractExecutedAgreementPanel_Template(rf, ctx) { if (rf & 1) {
421
+ i0.ɵɵelementStart(0, "mj-collapsible-panel", 0)(1, "div", 1)(2, "div", 2)(3, "label", 3);
422
+ i0.ɵɵtext(4, "Executed agreement");
423
+ i0.ɵɵelementEnd();
424
+ i0.ɵɵconditionalCreate(5, MJCContractExecutedAgreementPanel_Conditional_5_Template, 1, 3, "mj-refresh-button", 4);
425
+ i0.ɵɵelementEnd();
426
+ i0.ɵɵelementStart(6, "div", 5);
427
+ i0.ɵɵdeclareLet(7);
428
+ i0.ɵɵconditionalCreate(8, MJCContractExecutedAgreementPanel_Conditional_8_Template, 2, 0, "div", 6)(9, MJCContractExecutedAgreementPanel_Conditional_9_Template, 1, 1, "mj-alert", 7)(10, MJCContractExecutedAgreementPanel_Conditional_10_Template, 3, 1)(11, MJCContractExecutedAgreementPanel_Conditional_11_Template, 11, 0, "table", 8);
429
+ i0.ɵɵconditionalCreate(12, MJCContractExecutedAgreementPanel_Conditional_12_Template, 2, 1, "span", 9)(13, MJCContractExecutedAgreementPanel_Conditional_13_Template, 5, 4);
430
+ i0.ɵɵelementStart(14, "div", 6);
431
+ i0.ɵɵtext(15, " \u201CAwaiting document\u201D clears when a linked file is marked as the executed agreement. Attaching, removing and opening files stays with the Attachments button on the toolbar. ");
432
+ i0.ɵɵelementEnd()()()();
433
+ } if (rf & 2) {
434
+ i0.ɵɵproperty("Form", ctx.FormComponent)("FormContext", ctx.FormContext);
435
+ i0.ɵɵadvance(5);
436
+ i0.ɵɵconditional(ctx.Record.IsSaved ? 5 : -1);
437
+ i0.ɵɵadvance(2);
438
+ const files_r7 = i0.ɵɵstoreLet(ctx.Files);
439
+ i0.ɵɵadvance();
440
+ i0.ɵɵconditional(ctx.Loading ? 8 : ctx.LoadError ? 9 : !files_r7.length ? 10 : 11);
441
+ i0.ɵɵadvance(4);
442
+ i0.ɵɵconditional(ctx.ReadOnly ? 12 : 13);
443
+ } }, dependencies: [CommonModule, BaseFormsModule, i1.MjCollapsiblePanelComponent, MJButtonDirective, MJAlertComponent, MJRefreshButtonComponent], styles: ["\n .mjc-exec-head { display: flex; align-items: center; justify-content: space-between; gap: var(--mj-space-2); }\n "], encapsulation: 2 });
444
+ };
445
+ MJCContractExecutedAgreementPanel = __decorate([
446
+ RegisterClassEx(BaseFormPanel, {
447
+ key: 'contracts:executed-agreement',
448
+ skipNullKeyWarning: true,
449
+ metadata: {
450
+ entity: MJC_ENTITIES.Contract,
451
+ // `after-fields` puts this in the FIELD-panel band, which the left-nav chrome collapses into the
452
+ // single "Details" rail item, next to Re-papering (sortKey 40; higher sorts earlier).
453
+ slot: 'after-fields',
454
+ sortKey: 45,
455
+ // MUST equal the panel's SectionKey — the container resolves chrome by this and builds rail
456
+ // groups from that (see metadata/entities/.entities.json).
457
+ contributionKey: 'executedAgreement',
458
+ },
459
+ })
460
+ ], MJCContractExecutedAgreementPanel);
461
+ export { MJCContractExecutedAgreementPanel };
462
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJCContractExecutedAgreementPanel, [{
463
+ type: Component,
464
+ args: [{ selector: 'mjc-contract-executed-agreement-panel', standalone: true, encapsulation: ViewEncapsulation.None, imports: [CommonModule, BaseFormsModule, MJButtonDirective, MJAlertComponent, MJRefreshButtonComponent], template: `
465
+ <mj-collapsible-panel
466
+ SectionKey="executedAgreement"
467
+ SectionName="Executed agreement"
468
+ Icon="fa-solid fa-file-circle-check"
469
+ [Form]="FormComponent"
470
+ [FormContext]="FormContext">
471
+
472
+ <!-- Mirrors mj-form-field's markup so this reads as an ordinary form line. It cannot BE an
473
+ mj-form-field: the value it edits lives on MJ: Files, not on this record. -->
474
+ <div class="mj-forms-field">
475
+ <div class="mjc-exec-head">
476
+ <label class="mj-forms-field-label">Executed agreement</label>
477
+ <!-- Files attach through the toolbar's Attachments panel, which tells this panel nothing:
478
+ closing it refreshes only the toolbar count. Without this, a file attached a moment
479
+ ago is not listed until the record is reloaded. -->
480
+ @if (Record.IsSaved) {
481
+ <mj-refresh-button Variant="flat" Size="sm" [ShowLabel]="false"
482
+ Title="Reload the linked files"
483
+ [Loading]="Loading" [Disabled]="Busy"
484
+ (Clicked)="Refresh()" />
485
+ }
486
+ </div>
487
+ <div class="mj-forms-field-control">
488
+ @let files = Files;
489
+
490
+ @if (Loading) {
491
+ <div class="mjc-hint">Loading linked files…</div>
492
+ } @else if (LoadError) {
493
+ <mj-alert Variant="warning" Size="sm" [Message]="LoadError" />
494
+ } @else if (!files.length) {
495
+ <span class="mj-forms-field-value">—</span>
496
+ @if (Record.IsSaved) {
497
+ <div class="mjc-hint">
498
+ No files are linked to this contract. Attach the signed PDF with the Attachments
499
+ button on the toolbar, then mark it here.
500
+ </div>
501
+ }
502
+ } @else {
503
+ <table class="mjc-grid">
504
+ <thead>
505
+ <tr><th>File</th><th>Category</th><th></th></tr>
506
+ </thead>
507
+ <tbody>
508
+ @for (f of files; track f.FileID) {
509
+ <tr>
510
+ <td>{{ f.Name }}</td>
511
+ <td>
512
+ @if (IsExecutedAgreement(f)) {
513
+ <span class="mjc-chip mjc-chip--ok">
514
+ <i class="fa-solid fa-file-circle-check" aria-hidden="true"></i> Executed agreement
515
+ </span>
516
+ } @else if (f.CategoryName) {
517
+ <span class="mjc-chip mjc-chip--muted">{{ f.CategoryName }}</span>
518
+ } @else {
519
+ <span class="mjc-muted">—</span>
520
+ }
521
+ </td>
522
+ <td>
523
+ @if (CanMark) {
524
+ @if (IsExecutedAgreement(f)) {
525
+ <button mjButton variant="flat" size="sm" type="button" [disabled]="Busy"
526
+ (click)="Unmark(f)"
527
+ [attr.aria-label]="'Unmark ' + f.Name + ' as the executed agreement'">
528
+ Unmark
529
+ </button>
530
+ } @else {
531
+ <button mjButton variant="primary" size="sm" type="button"
532
+ [disabled]="Busy || !CategoryID"
533
+ (click)="Mark(f)"
534
+ [attr.aria-label]="'Mark ' + f.Name + ' as the executed agreement'">
535
+ Mark as executed agreement
536
+ </button>
537
+ }
538
+ }
539
+ </td>
540
+ </tr>
541
+ }
542
+ </tbody>
543
+ </table>
544
+ }
545
+
546
+ <!-- The Re-papering rule: read-only while editing or unsaved, with the same two chips. -->
547
+ @if (ReadOnly) {
548
+ <span class="mjc-chip mjc-chip--muted">
549
+ {{ Record.IsSaved ? 'Finish editing to change' : 'Save this contract first' }}
550
+ </span>
551
+ } @else {
552
+ @if (!CanUpdateFiles) {
553
+ <div class="mjc-hint">
554
+ Marking a file changes its category on MJ: Files, which your roles cannot update.
555
+ Ask an administrator to grant update permission on MJ: Files.
556
+ </div>
557
+ } @else if (CategoryMissing) {
558
+ <mj-alert Variant="warning" Size="sm"
559
+ [Message]="'The file category named ' + CategoryName + ' does not exist on this database, so nothing can be marked. The contracts migration V202609010100 seeds it.'" />
560
+ }
561
+ @if (Unreadable) {
562
+ <div class="mjc-hint">
563
+ {{ Unreadable }} linked file(s) could not be read and are not listed — reading MJ: Files needs
564
+ read permission on that entity.
565
+ </div>
566
+ }
567
+ @if (ActionError) { <mj-alert Variant="error" Size="sm" [Message]="ActionError" /> }
568
+ @if (ActionOk) { <mj-alert Variant="success" Size="sm" [Message]="ActionOk" /> }
569
+ }
570
+
571
+ <div class="mjc-hint">
572
+ “Awaiting document” clears when a linked file is marked as the executed agreement. Attaching,
573
+ removing and opening files stays with the Attachments button on the toolbar.
574
+ </div>
575
+ </div>
576
+ </div>
577
+ </mj-collapsible-panel>
578
+ `, styles: ["\n .mjc-exec-head { display: flex; align-items: center; justify-content: space-between; gap: var(--mj-space-2); }\n "] }]
579
+ }], null, null); })();
580
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCContractExecutedAgreementPanel, { className: "MJCContractExecutedAgreementPanel", filePath: "lib/form-panels/executed-agreement.panel.ts", lineNumber: 194 }); })();
581
+ //# sourceMappingURL=executed-agreement.panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executed-agreement.panel.js","sourceRoot":"","sources":["../../../src/lib/form-panels/executed-agreement.panel.ts"],"names":[],"mappings":"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"}
@@ -33,6 +33,7 @@ export * from './lib/sections/section-nav.model';
33
33
  export * from './lib/data/entity-names';
34
34
  export { MJCContractHeroPanel, MJCContractDatesPanel, MJCContractRenewalPanel, MJCContractLineagePanel, } from './lib/form-panels/contract.panels';
35
35
  export { MJCContractSupersedePanel } from './lib/form-panels/supersede.panel';
36
+ export { MJCContractExecutedAgreementPanel } from './lib/form-panels/executed-agreement.panel';
36
37
  export { ContractFormPolicy } from './lib/form-panels/contract-form.policy';
37
38
  export { MJCContractOverviewPanel, MJCContractAgreementPanel, MJCContractPartiesPanel, MJCContractNotesPanel, MJCContractProvenanceFieldsPanel, MJCContractLifecyclePanel, MJCContractModificationsPanel, } from './lib/form-panels/contract-form.panels';
38
39
  export { MJCOrganizationAgreementsPanel } from './lib/form-panels/organization.panels';
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,OAAO,iCAAiC,CAAC;AACzC,OAAO,wCAAwC,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,uCAAuC,EAAE,MAAM,+FAA+F,CAAC;AACxJ,OAAO,EAAE,+CAA+C,EAAE,MAAM,+GAA+G,CAAC;AAChL,OAAO,EAAE,2DAA2D,EAAE,MAAM,uIAAuI,CAAC;AACpN,OAAO,EAAE,wDAAwD,EAAE,MAAM,iIAAiI,CAAC;AAC3M,OAAO,EAAE,mDAAmD,EAAE,MAAM,uHAAuH,CAAC;AAC5L,OAAO,EAAE,2CAA2C,EAAE,MAAM,uGAAuG,CAAC;AAapK,OAAO,EACH,uBAAuB,EACvB,wBAAwB,EACxB,iCAAiC,EACjC,qCAAqC,GACxC,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AA2BxC,OAAO,EACH,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EACH,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,gCAAgC,EAChC,yBAAyB,EACzB,6BAA6B,GAChC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAuB3E,cAAc,gCAAgC,CAAC;AAC/C,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,iCAAiC,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAC9G,OAAO,EACH,6BAA6B,EAC7B,6BAA6B,GAChC,MAAM,gCAAgC,CAAC;AAExC,wBAAgB,4BAA4B,IAAI,IAAI,CA4BnD"}
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,OAAO,iCAAiC,CAAC;AACzC,OAAO,wCAAwC,CAAC;AAEhD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,uCAAuC,EAAE,MAAM,+FAA+F,CAAC;AACxJ,OAAO,EAAE,+CAA+C,EAAE,MAAM,+GAA+G,CAAC;AAChL,OAAO,EAAE,2DAA2D,EAAE,MAAM,uIAAuI,CAAC;AACpN,OAAO,EAAE,wDAAwD,EAAE,MAAM,iIAAiI,CAAC;AAC3M,OAAO,EAAE,mDAAmD,EAAE,MAAM,uHAAuH,CAAC;AAC5L,OAAO,EAAE,2CAA2C,EAAE,MAAM,uGAAuG,CAAC;AAapK,OAAO,EACH,uBAAuB,EACvB,wBAAwB,EACxB,iCAAiC,EACjC,qCAAqC,GACxC,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,cAAc,kCAAkC,CAAC;AACjD,cAAc,yBAAyB,CAAC;AA4BxC,OAAO,EACH,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,iCAAiC,EAAE,MAAM,4CAA4C,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EACH,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,gCAAgC,EAChC,yBAAyB,EACzB,6BAA6B,GAChC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAuB3E,cAAc,gCAAgC,CAAC;AAC/C,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,EAAE,iCAAiC,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAC9G,OAAO,EACH,6BAA6B,EAC7B,6BAA6B,GAChC,MAAM,gCAAgC,CAAC;AAExC,wBAAgB,4BAA4B,IAAI,IAAI,CA6BnD"}
@@ -51,12 +51,14 @@ export * from './lib/data/entity-names';
51
51
  * ========================================================================== */
52
52
  import { MJCContractDatesPanel, MJCContractHeroPanel, MJCContractLineagePanel, MJCContractRenewalPanel, } from './lib/form-panels/contract.panels';
53
53
  import { MJCContractSupersedePanel } from './lib/form-panels/supersede.panel';
54
+ import { MJCContractExecutedAgreementPanel } from './lib/form-panels/executed-agreement.panel';
54
55
  import { ContractFormPolicy } from './lib/form-panels/contract-form.policy';
55
56
  import { MJCContractAgreementPanel, MJCContractLifecyclePanel, MJCContractModificationsPanel, MJCContractNotesPanel, MJCContractOverviewPanel, MJCContractPartiesPanel, MJCContractProvenanceFieldsPanel, } from './lib/form-panels/contract-form.panels';
56
57
  import { MJCOrganizationAgreementsPanel } from './lib/form-panels/organization.panels';
57
58
  import { MJCPersonAgreementsPanel } from './lib/form-panels/person.panels';
58
59
  export { MJCContractHeroPanel, MJCContractDatesPanel, MJCContractRenewalPanel, MJCContractLineagePanel, } from './lib/form-panels/contract.panels';
59
60
  export { MJCContractSupersedePanel } from './lib/form-panels/supersede.panel';
61
+ export { MJCContractExecutedAgreementPanel } from './lib/form-panels/executed-agreement.panel';
60
62
  export { ContractFormPolicy } from './lib/form-panels/contract-form.policy';
61
63
  export { MJCContractOverviewPanel, MJCContractAgreementPanel, MJCContractPartiesPanel, MJCContractNotesPanel, MJCContractProvenanceFieldsPanel, MJCContractLifecyclePanel, MJCContractModificationsPanel, } from './lib/form-panels/contract-form.panels';
62
64
  export { MJCOrganizationAgreementsPanel } from './lib/form-panels/organization.panels';
@@ -110,6 +112,7 @@ export function LoadMjBizappsContractsClient() {
110
112
  void MJCContractRenewalPanel;
111
113
  void MJCContractLineagePanel;
112
114
  void MJCContractSupersedePanel;
115
+ void MJCContractExecutedAgreementPanel;
113
116
  void MJCOrganizationAgreementsPanel;
114
117
  void MJCPersonAgreementsPanel;
115
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mjdevManaged": "MJDEV-MANAGED: mjdev owns parts of this file — the \"packages/dev-apps/*\" workspaces glob, any dev-linked open-app dependencies (e.g. \"@mj-biz-apps/*\"), and the Angular \"overrides\" pin set. Do not hand-edit those; the tool wires and reverts them. They are left visible in git status, but the git-tree guard blocks committing them. See .mjdev-docs/MANAGED-FILES.md; revert with `mjdev git:stage-clean <slug> package.json`.",
3
3
  "name": "@mj-biz-apps/contracts-ng",
4
- "version": "0.4.0",
4
+ "version": "0.4.1",
5
5
  "type": "module",
6
6
  "description": "Client bootstrap package - Angular components loaded by MJExplorer via the generated open-app bootstrap import. TODO(template): rename.",
7
7
  "main": "dist/public-api.js",
@@ -12,7 +12,7 @@
12
12
  },
13
13
  "license": "BUSL-1.1",
14
14
  "dependencies": {
15
- "@mj-biz-apps/contracts-entities": "^0.4.0"
15
+ "@mj-biz-apps/contracts-entities": "^0.4.1"
16
16
  },
17
17
  "peerDependencies": {
18
18
  "@angular/common": ">=21.0.0 <22.0.0",