@mj-biz-apps/contracts-ng 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +183 -0
  2. package/dist/lib/data/entity-names.d.ts +29 -0
  3. package/dist/lib/data/entity-names.d.ts.map +1 -0
  4. package/dist/lib/data/entity-names.js +29 -0
  5. package/dist/lib/data/entity-names.js.map +1 -0
  6. package/dist/lib/data/provider.d.ts +44 -0
  7. package/dist/lib/data/provider.d.ts.map +1 -0
  8. package/dist/lib/data/provider.js +48 -0
  9. package/dist/lib/data/provider.js.map +1 -0
  10. package/dist/lib/directives/fk-navigate.directive.d.ts +63 -0
  11. package/dist/lib/directives/fk-navigate.directive.d.ts.map +1 -0
  12. package/dist/lib/directives/fk-navigate.directive.js +99 -0
  13. package/dist/lib/directives/fk-navigate.directive.js.map +1 -0
  14. package/dist/lib/form-panels/contract.panels.d.ts +124 -0
  15. package/dist/lib/form-panels/contract.panels.d.ts.map +1 -0
  16. package/dist/lib/form-panels/contract.panels.js +1167 -0
  17. package/dist/lib/form-panels/contract.panels.js.map +1 -0
  18. package/dist/lib/form-panels/organization.panels.d.ts +23 -0
  19. package/dist/lib/form-panels/organization.panels.d.ts.map +1 -0
  20. package/dist/lib/form-panels/organization.panels.js +118 -0
  21. package/dist/lib/form-panels/organization.panels.js.map +1 -0
  22. package/dist/lib/form-panels/record-files.panel.d.ts +151 -0
  23. package/dist/lib/form-panels/record-files.panel.d.ts.map +1 -0
  24. package/dist/lib/form-panels/record-files.panel.js +1046 -0
  25. package/dist/lib/form-panels/record-files.panel.js.map +1 -0
  26. package/dist/lib/form-panels/supersede.panel.d.ts +68 -0
  27. package/dist/lib/form-panels/supersede.panel.d.ts.map +1 -0
  28. package/dist/lib/form-panels/supersede.panel.js +415 -0
  29. package/dist/lib/form-panels/supersede.panel.js.map +1 -0
  30. package/dist/lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component.d.ts +10 -0
  31. package/dist/lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component.d.ts.map +1 -0
  32. package/dist/lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component.js +196 -0
  33. package/dist/lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component.js.map +1 -0
  34. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component.d.ts +10 -0
  35. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component.d.ts.map +1 -0
  36. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component.js +120 -0
  37. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component.js.map +1 -0
  38. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component.d.ts +10 -0
  39. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component.d.ts.map +1 -0
  40. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component.js +79 -0
  41. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component.js.map +1 -0
  42. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component.d.ts +10 -0
  43. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component.d.ts.map +1 -0
  44. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component.js +79 -0
  45. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component.js.map +1 -0
  46. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component.d.ts +10 -0
  47. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component.d.ts.map +1 -0
  48. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component.js +86 -0
  49. package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component.js.map +1 -0
  50. package/dist/lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component.d.ts +10 -0
  51. package/dist/lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component.d.ts.map +1 -0
  52. package/dist/lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component.js +100 -0
  53. package/dist/lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component.js.map +1 -0
  54. package/dist/lib/generated/generated-forms.module.d.ts +23 -0
  55. package/dist/lib/generated/generated-forms.module.d.ts.map +1 -0
  56. package/dist/lib/generated/generated-forms.module.js +78 -0
  57. package/dist/lib/generated/generated-forms.module.js.map +1 -0
  58. package/dist/lib/pages/configuration.page.d.ts +83 -0
  59. package/dist/lib/pages/configuration.page.d.ts.map +1 -0
  60. package/dist/lib/pages/configuration.page.js +240 -0
  61. package/dist/lib/pages/configuration.page.js.map +1 -0
  62. package/dist/lib/pages/contract-grid.page.d.ts +169 -0
  63. package/dist/lib/pages/contract-grid.page.d.ts.map +1 -0
  64. package/dist/lib/pages/contract-grid.page.js +487 -0
  65. package/dist/lib/pages/contract-grid.page.js.map +1 -0
  66. package/dist/lib/pages/contracts-dashboard.page.d.ts +56 -0
  67. package/dist/lib/pages/contracts-dashboard.page.d.ts.map +1 -0
  68. package/dist/lib/pages/contracts-dashboard.page.js +215 -0
  69. package/dist/lib/pages/contracts-dashboard.page.js.map +1 -0
  70. package/dist/lib/pages/modifications.page.d.ts +96 -0
  71. package/dist/lib/pages/modifications.page.d.ts.map +1 -0
  72. package/dist/lib/pages/modifications.page.js +243 -0
  73. package/dist/lib/pages/modifications.page.js.map +1 -0
  74. package/dist/lib/pages/templates.page.d.ts +120 -0
  75. package/dist/lib/pages/templates.page.d.ts.map +1 -0
  76. package/dist/lib/pages/templates.page.js +258 -0
  77. package/dist/lib/pages/templates.page.js.map +1 -0
  78. package/dist/lib/sections/contracts-sections.component.d.ts +112 -0
  79. package/dist/lib/sections/contracts-sections.component.d.ts.map +1 -0
  80. package/dist/lib/sections/contracts-sections.component.js +412 -0
  81. package/dist/lib/sections/contracts-sections.component.js.map +1 -0
  82. package/dist/lib/sections/section-nav.model.d.ts +78 -0
  83. package/dist/lib/sections/section-nav.model.d.ts.map +1 -0
  84. package/dist/lib/sections/section-nav.model.js +110 -0
  85. package/dist/lib/sections/section-nav.model.js.map +1 -0
  86. package/dist/lib/sections/section-shell.component.d.ts +73 -0
  87. package/dist/lib/sections/section-shell.component.d.ts.map +1 -0
  88. package/dist/lib/sections/section-shell.component.js +170 -0
  89. package/dist/lib/sections/section-shell.component.js.map +1 -0
  90. package/dist/public-api.d.ts +44 -0
  91. package/dist/public-api.d.ts.map +1 -0
  92. package/dist/public-api.js +105 -0
  93. package/dist/public-api.js.map +1 -0
  94. package/package.json +50 -0
@@ -0,0 +1,240 @@
1
+ /**
2
+ * @fileoverview Configuration — the small vocabularies every contract inherits (item 6).
3
+ *
4
+ * MOSTLY FREE, AND THAT IS THE DESIGN. The generated entity forms already cover creating and editing a
5
+ * contract type or a template type; what was missing was a place to FIND them. So these pages are
6
+ * grids over the generated base views plus one sentence of context each — no custom form, no bespoke
7
+ * editor. Item 6's "done" is "confirm each generated form opens clean", not "build CRUD".
8
+ *
9
+ * The sentences matter more than they look. `RequiresExecutedDocument` is the only rule column in the
10
+ * whole app, and a business user retiring a type by flipping `Status` needs to know old contracts keep
11
+ * resolving. Neither fact is visible from a grid of columns.
12
+ *
13
+ * @module @mj-biz-apps/contracts-ng
14
+ */
15
+ import { ChangeDetectorRef, Component, ViewEncapsulation, inject } from '@angular/core';
16
+ import { CommonModule } from '@angular/common';
17
+ import { NavigationService } from '@memberjunction/ng-shared';
18
+ import { BaseFormsModule } from '@memberjunction/ng-base-forms';
19
+ import { MJC_ENTITIES } from '../data/entity-names';
20
+ import { MJCFkNavigateDirective } from '../directives/fk-navigate.directive';
21
+ import * as i0 from "@angular/core";
22
+ import * as i1 from "@memberjunction/ng-base-forms";
23
+ /** Shared skeleton: one intro sentence, one stock grid. */
24
+ class MJCConfigPageBase {
25
+ cdr = inject(ChangeDetectorRef);
26
+ navigation = inject(NavigationService);
27
+ Params = null;
28
+ /**
29
+ * Toolbar affordances that actually work, and one that does not.
30
+ *
31
+ * ⚠ `showFilterToggle` IS A NO-OP, and this comment used to claim the opposite. It is declared on
32
+ * `GridToolbarConfig` (`grid-types.ts:249`) and documented in the entity-viewer README, and it is
33
+ * **read nowhere in MJ** — no template branch renders a filter button. Three sibling hooks are dead
34
+ * the same way: the `AllowColumnFilters` input stores `_allowColumnFilters` and nothing reads it,
35
+ * `_filterState` is declared and never touched, and `defaultColDef.filter` is hardcoded `false`, so
36
+ * AG Grid's per-column filters are off with no input to turn them on. It is left set to `true` here
37
+ * because it costs nothing and is the flag to keep passing if MJ ever wires it up.
38
+ *
39
+ * So the ONLY filtering this page has beyond the pills is `showSearch` — which sets AG Grid's
40
+ * `quickFilterText`, a client-side substring match over the rows already loaded. It is not
41
+ * structured and not server-side. Filtering by date range / category / derived State needs a real
42
+ * filter popover (see `design-docs/ui-design/mockups-v2/renewal-watchlist.html`), which is ours to
43
+ * build; the pills stay regardless, because they encode the QUESTIONS people ask rather than
44
+ * predicates a user would assemble by hand.
45
+ */
46
+ GridToolbar = {
47
+ showSearch: true,
48
+ showFilterToggle: true,
49
+ showColumnChooser: true,
50
+ showRefresh: true,
51
+ showExport: true,
52
+ showRowCount: true,
53
+ };
54
+ /**
55
+ * Open the double-clicked record.
56
+ *
57
+ * THE GRID DOES NOT NAVIGATE ITSELF. `NavigateOnDoubleClick` only controls whether it EMITS
58
+ * `Navigate`; acting on it is the HOST's job. Without this, a double-click merely selected the row
59
+ * — measured in a real browser, where it looked exactly like the grid being broken. Explorer's own
60
+ * host wires this for generated forms; a page hosting the grid inside a BaseResourceComponent must
61
+ * do it itself.
62
+ */
63
+ OnNavigate(event) {
64
+ if (!event?.EntityName)
65
+ return;
66
+ if (event.Kind === 'record' && event.PrimaryKey) {
67
+ this.navigation.OpenEntityRecord(event.EntityName, event.PrimaryKey);
68
+ return;
69
+ }
70
+ if (event.Kind === 'new-record') {
71
+ // TWO kinds, and missing this one meant the toolbar's New button did NOTHING on every grid
72
+ // page — found in the browser, after the double-click bug had already taught me the same
73
+ // lesson about this component. Handling only 'record' silently dropped it.
74
+ //
75
+ // ⚠ `event.DefaultValues` is DISCARDED here, and it has nowhere to go: NavigationOptions
76
+ // carries no default-values field, so `OpenNewEntityRecord` cannot pre-populate. Harmless on
77
+ // these pages (nothing sets NewRecordValues), but it means the Organization agreements
78
+ // panel's pre-linking to the customer will NOT survive a New click routed through here —
79
+ // that panel needs its own affordance, or MJ needs the option. Written down rather than
80
+ // discovered later as "New forgets the customer".
81
+ this.navigation.OpenNewEntityRecord(event.EntityName);
82
+ }
83
+ }
84
+ get orderBy() {
85
+ return 'Name ASC';
86
+ }
87
+ ngOnInit() {
88
+ this.Params = { EntityName: this.entityName, OrderBy: this.orderBy };
89
+ this.cdr.detectChanges();
90
+ }
91
+ static ɵfac = function MJCConfigPageBase_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCConfigPageBase)(); };
92
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJCConfigPageBase, selectors: [["ng-component"]], decls: 0, vars: 0, template: function MJCConfigPageBase_Template(rf, ctx) { }, encapsulation: 2 });
93
+ }
94
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJCConfigPageBase, [{
95
+ type: Component,
96
+ args: [{ template: '' }]
97
+ }], null, null); })();
98
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCConfigPageBase, { className: "MJCConfigPageBase", filePath: "lib/pages/configuration.page.ts", lineNumber: 27 }); })();
99
+ const CONFIG_TEMPLATE = `
100
+ <div class="mjc-page mjc-page--grid">
101
+ <p class="mjc-page__intro"><ng-content /></p>
102
+ <div class="mjc-grid-fill">
103
+ <mj-explorer-entity-data-grid mjcFkNavigate [Params]="Params" [ShowToolbar]="true" [ToolbarConfig]="GridToolbar" [NavigateOnDoubleClick]="true"
104
+ (Navigate)="OnNavigate($event)" />
105
+ </div>
106
+ </div>
107
+ `;
108
+ export class MJCContractTypesPageComponent extends MJCConfigPageBase {
109
+ get entityName() {
110
+ return MJC_ENTITIES.ContractType;
111
+ }
112
+ static ɵfac = /*@__PURE__*/ (() => { let ɵMJCContractTypesPageComponent_BaseFactory; return function MJCContractTypesPageComponent_Factory(__ngFactoryType__) { return (ɵMJCContractTypesPageComponent_BaseFactory || (ɵMJCContractTypesPageComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MJCContractTypesPageComponent)))(__ngFactoryType__ || MJCContractTypesPageComponent); }; })();
113
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJCContractTypesPageComponent, selectors: [["mjc-contract-types-page"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 28, vars: 4, consts: [[1, "mjc-page", "mjc-page--grid"], [1, "mjc-page__intro"], [1, "mjc-grid-fill"], ["mjcFkNavigate", "", 3, "Navigate", "Params", "ShowToolbar", "ToolbarConfig", "NavigateOnDoubleClick"]], template: function MJCContractTypesPageComponent_Template(rf, ctx) { if (rf & 1) {
114
+ i0.ɵɵelementStart(0, "div", 0)(1, "p", 1);
115
+ i0.ɵɵtext(2, " What kind of document a contract is. Two columns here carry rules, and the rest is labelling. ");
116
+ i0.ɵɵelementStart(3, "strong");
117
+ i0.ɵɵtext(4, "Requires Executed Document");
118
+ i0.ɵɵelementEnd();
119
+ i0.ɵɵtext(5, " is what makes a contract appear on the ");
120
+ i0.ɵɵelementStart(6, "em");
121
+ i0.ɵɵtext(7, "Awaiting documents");
122
+ i0.ɵɵelementEnd();
123
+ i0.ɵɵtext(8, " worklist, so a Payment Link \u2014 where nobody signs anything \u2014 never reports as missing paper. ");
124
+ i0.ɵɵelementStart(9, "strong");
125
+ i0.ɵɵtext(10, "Parent status requirement");
126
+ i0.ɵɵelementEnd();
127
+ i0.ɵɵtext(11, " decides whether a contract of this type must name the agreement it changes (");
128
+ i0.ɵɵelementStart(12, "em");
129
+ i0.ɵɵtext(13, "Required");
130
+ i0.ɵɵelementEnd();
131
+ i0.ɵɵtext(14, " \u2014 a Change Order amends something, so it has to say what), must not (");
132
+ i0.ɵɵelementStart(15, "em");
133
+ i0.ɵɵtext(16, "Prohibited");
134
+ i0.ɵɵelementEnd();
135
+ i0.ɵɵtext(17, " \u2014 it stands on its own), or may do either when left blank. Both are enforced when a contract is saved, and neither is decided from the type's NAME. ");
136
+ i0.ɵɵelementEnd();
137
+ i0.ɵɵelementStart(18, "p", 1);
138
+ i0.ɵɵtext(19, " Retire a type by setting its ");
139
+ i0.ɵɵelementStart(20, "strong");
140
+ i0.ɵɵtext(21, "Status");
141
+ i0.ɵɵelementEnd();
142
+ i0.ɵɵtext(22, " to ");
143
+ i0.ɵɵelementStart(23, "em");
144
+ i0.ɵɵtext(24, "Inactive");
145
+ i0.ɵɵelementEnd();
146
+ i0.ɵɵtext(25, " rather than deleting it: it stops being offered for new contracts, and every contract already referencing it keeps resolving. ");
147
+ i0.ɵɵelementEnd();
148
+ i0.ɵɵelementStart(26, "div", 2)(27, "mj-explorer-entity-data-grid", 3);
149
+ i0.ɵɵlistener("Navigate", function MJCContractTypesPageComponent_Template_mj_explorer_entity_data_grid_Navigate_27_listener($event) { return ctx.OnNavigate($event); });
150
+ i0.ɵɵelementEnd()()();
151
+ } if (rf & 2) {
152
+ i0.ɵɵadvance(27);
153
+ i0.ɵɵproperty("Params", ctx.Params)("ShowToolbar", true)("ToolbarConfig", ctx.GridToolbar)("NavigateOnDoubleClick", true);
154
+ } }, dependencies: [CommonModule, BaseFormsModule, i1.ExplorerEntityDataGridComponent, MJCFkNavigateDirective], encapsulation: 2 });
155
+ }
156
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJCContractTypesPageComponent, [{
157
+ type: Component,
158
+ args: [{
159
+ selector: 'mjc-contract-types-page',
160
+ standalone: true,
161
+ encapsulation: ViewEncapsulation.None,
162
+ imports: [CommonModule, BaseFormsModule, MJCFkNavigateDirective],
163
+ template: `
164
+ <div class="mjc-page mjc-page--grid">
165
+ <p class="mjc-page__intro">
166
+ What kind of document a contract is. Two columns here carry rules, and the rest is
167
+ labelling. <strong>Requires Executed Document</strong> is what makes a contract appear on
168
+ the <em>Awaiting documents</em> worklist, so a Payment Link — where nobody signs anything
169
+ — never reports as missing paper. <strong>Parent status requirement</strong> decides
170
+ whether a contract of this type must name the agreement it changes
171
+ (<em>Required</em> — a Change Order amends something, so it has to say what), must not
172
+ (<em>Prohibited</em> — it stands on its own), or may do either when left blank. Both are
173
+ enforced when a contract is saved, and neither is decided from the type's NAME.
174
+ </p>
175
+ <p class="mjc-page__intro">
176
+ Retire a type by setting its <strong>Status</strong> to <em>Inactive</em> rather than
177
+ deleting it: it stops being offered for new contracts, and every contract already
178
+ referencing it keeps resolving.
179
+ </p>
180
+ <div class="mjc-grid-fill">
181
+ <mj-explorer-entity-data-grid mjcFkNavigate [Params]="Params" [ShowToolbar]="true" [ToolbarConfig]="GridToolbar" [NavigateOnDoubleClick]="true"
182
+ (Navigate)="OnNavigate($event)" />
183
+ </div>
184
+ </div>
185
+ `,
186
+ }]
187
+ }], null, null); })();
188
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCContractTypesPageComponent, { className: "MJCContractTypesPageComponent", filePath: "lib/pages/configuration.page.ts", lineNumber: 146 }); })();
189
+ export class MJCTemplateTypesPageComponent extends MJCConfigPageBase {
190
+ get entityName() {
191
+ return MJC_ENTITIES.ContractTemplateType;
192
+ }
193
+ static ɵfac = /*@__PURE__*/ (() => { let ɵMJCTemplateTypesPageComponent_BaseFactory; return function MJCTemplateTypesPageComponent_Factory(__ngFactoryType__) { return (ɵMJCTemplateTypesPageComponent_BaseFactory || (ɵMJCTemplateTypesPageComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MJCTemplateTypesPageComponent)))(__ngFactoryType__ || MJCTemplateTypesPageComponent); }; })();
194
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJCTemplateTypesPageComponent, selectors: [["mjc-template-types-page"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 11, vars: 4, consts: [[1, "mjc-page", "mjc-page--grid"], [1, "mjc-page__intro"], [1, "mjc-grid-fill"], ["mjcFkNavigate", "", 3, "Navigate", "Params", "ShowToolbar", "ToolbarConfig", "NavigateOnDoubleClick"]], template: function MJCTemplateTypesPageComponent_Template(rf, ctx) { if (rf & 1) {
195
+ i0.ɵɵelementStart(0, "div", 0)(1, "p", 1);
196
+ i0.ɵɵtext(2, " What kind of standard-terms document a version belongs to. Two rows today, and only one has a real template behind it: ");
197
+ i0.ɵɵelementStart(3, "strong");
198
+ i0.ɵɵtext(4, "Master Agreement");
199
+ i0.ɵɵelementEnd();
200
+ i0.ɵɵtext(5, " is the versioned, numbered-provision document every Order Form incorporates. ");
201
+ i0.ɵɵelementStart(6, "strong");
202
+ i0.ɵɵtext(7, "Statement of Work");
203
+ i0.ɵɵelementEnd();
204
+ i0.ɵɵtext(8, " exists so the type is available \u2014 the business has standard SOW language but does not version it, so no template is registered against it. That absence is a fact about the business, not a gap in the data. ");
205
+ i0.ɵɵelementEnd();
206
+ i0.ɵɵelementStart(9, "div", 2)(10, "mj-explorer-entity-data-grid", 3);
207
+ i0.ɵɵlistener("Navigate", function MJCTemplateTypesPageComponent_Template_mj_explorer_entity_data_grid_Navigate_10_listener($event) { return ctx.OnNavigate($event); });
208
+ i0.ɵɵelementEnd()()();
209
+ } if (rf & 2) {
210
+ i0.ɵɵadvance(10);
211
+ i0.ɵɵproperty("Params", ctx.Params)("ShowToolbar", true)("ToolbarConfig", ctx.GridToolbar)("NavigateOnDoubleClick", true);
212
+ } }, dependencies: [CommonModule, BaseFormsModule, i1.ExplorerEntityDataGridComponent, MJCFkNavigateDirective], encapsulation: 2 });
213
+ }
214
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJCTemplateTypesPageComponent, [{
215
+ type: Component,
216
+ args: [{
217
+ selector: 'mjc-template-types-page',
218
+ standalone: true,
219
+ encapsulation: ViewEncapsulation.None,
220
+ imports: [CommonModule, BaseFormsModule, MJCFkNavigateDirective],
221
+ template: `
222
+ <div class="mjc-page mjc-page--grid">
223
+ <p class="mjc-page__intro">
224
+ What kind of standard-terms document a version belongs to. Two rows today, and only one
225
+ has a real template behind it: <strong>Master Agreement</strong> is the versioned,
226
+ numbered-provision document every Order Form incorporates.
227
+ <strong>Statement of Work</strong> exists so the type is available — the business has
228
+ standard SOW language but does not version it, so no template is registered against it.
229
+ That absence is a fact about the business, not a gap in the data.
230
+ </p>
231
+ <div class="mjc-grid-fill">
232
+ <mj-explorer-entity-data-grid mjcFkNavigate [Params]="Params" [ShowToolbar]="true" [ToolbarConfig]="GridToolbar" [NavigateOnDoubleClick]="true"
233
+ (Navigate)="OnNavigate($event)" />
234
+ </div>
235
+ </div>
236
+ `,
237
+ }]
238
+ }], null, null); })();
239
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCTemplateTypesPageComponent, { className: "MJCTemplateTypesPageComponent", filePath: "lib/pages/configuration.page.ts", lineNumber: 174 }); })();
240
+ //# sourceMappingURL=configuration.page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.page.js","sourceRoot":"","sources":["../../../src/lib/pages/configuration.page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * @fileoverview The contract list, and the two worklists that are the same list with a filter.
3
+ *
4
+ * ONE BASE, THREE PAGES. "All contracts", "Renewals & expiry" and "Awaiting documents" are the same
5
+ * grid over the same view with different `ExtraFilter`s and different default pills. Three separate
6
+ * implementations would be three places to fix a column, and they would drift — this is exactly the
7
+ * 2-to-4-locations-of-similar-logic case the workspace guide says to unify, parameterised by context
8
+ * (Template Method: shared skeleton, overridden hooks).
9
+ *
10
+ * THE GRID IS MJ'S OWN (`mj-explorer-entity-data-grid`), not a bespoke table. D-21 ruled the watchlist
11
+ * deliberately thin — stock grid plus filter pills, no saved views — and D-23 requires selecting the
12
+ * BASE VIEW so foreign keys render as names. Both are satisfied by construction here: `vwContracts` is
13
+ * what the entity's `BaseView` resolves to, and it already carries `ContractType`, `Company`,
14
+ * `CustomerOrganization`, `ContractTemplate` and `ParentContract` as joined name columns, plus the six
15
+ * derived columns from the layered wrapper. Showing a UUID would take extra work.
16
+ *
17
+ * WHY THE FILTERS ARE VIEW COLUMNS AND NOT DATE ARITHMETIC IN TYPESCRIPT. `RenewalNoticeDeadline`,
18
+ * `DaysToEnd`, `IsAwaitingDocument` and `State` are computed in the wrapper view (item 12), so a filter
19
+ * here is a comparison against a column rather than a re-derivation. That is the whole payoff of
20
+ * deriving them in SQL: the rule renders once, and a worklist cannot disagree with a form.
21
+ *
22
+ * @module @mj-biz-apps/contracts-ng
23
+ */
24
+ import { ChangeDetectorRef, OnInit } from '@angular/core';
25
+ import { NavigationService } from '@memberjunction/ng-shared';
26
+ import type { CompositeKey } from '@memberjunction/core';
27
+ import type { RunViewParams } from '@memberjunction/core';
28
+ import * as i0 from "@angular/core";
29
+ /** One filter pill: a label, the SQL it contributes, and a live count. */
30
+ export interface MJCFilterPill {
31
+ Id: string;
32
+ Label: string;
33
+ /** SQL fragment ANDed into the grid's ExtraFilter. Empty means "no restriction". */
34
+ Filter: string;
35
+ /** Populated by a count query; omitted from the UI when zero or unknown. */
36
+ Count?: number;
37
+ /** One line explaining what the pill means, for its title attribute. */
38
+ Hint?: string;
39
+ }
40
+ /**
41
+ * Shared skeleton. A concrete page supplies its title, its pills, and which pill starts active.
42
+ *
43
+ * `standalone: false` is wrong for these — they are created dynamically by the section via
44
+ * `createComponent`, so they must be standalone and self-sufficient in their imports.
45
+ */
46
+ export declare abstract class MJCContractGridPageBase implements OnInit {
47
+ protected readonly cdr: ChangeDetectorRef;
48
+ protected readonly navigation: NavigationService;
49
+ /** Pills for this page, in display order. The first is the default. */
50
+ Pills: MJCFilterPill[];
51
+ /** Which pill is active. Null means "no pill" — the unfiltered list. */
52
+ ActivePillId: string | null;
53
+ /** What the grid runs. Rebuilt whenever the active pill changes. */
54
+ Params: RunViewParams | null;
55
+ IsLoading: boolean;
56
+ LoadError: string | null;
57
+ /** Free-text restriction the user typed, ANDed with the pill. */
58
+ SearchText: string;
59
+ /**
60
+ * Toolbar affordances that actually work, and one that does not.
61
+ *
62
+ * ⚠ `showFilterToggle` IS A NO-OP, and this comment used to claim the opposite. It is declared on
63
+ * `GridToolbarConfig` (`grid-types.ts:249`) and documented in the entity-viewer README, and it is
64
+ * **read nowhere in MJ** — no template branch renders a filter button. Three sibling hooks are dead
65
+ * the same way: the `AllowColumnFilters` input stores `_allowColumnFilters` and nothing reads it,
66
+ * `_filterState` is declared and never touched, and `defaultColDef.filter` is hardcoded `false`, so
67
+ * AG Grid's per-column filters are off with no input to turn them on. It is left set to `true` here
68
+ * because it costs nothing and is the flag to keep passing if MJ ever wires it up.
69
+ *
70
+ * So the ONLY filtering this page has beyond the pills is `showSearch` — which sets AG Grid's
71
+ * `quickFilterText`, a client-side substring match over the rows already loaded. It is not
72
+ * structured and not server-side. Filtering by date range / category / derived State needs a real
73
+ * filter popover (see `design-docs/ui-design/mockups-v2/renewal-watchlist.html`), which is ours to
74
+ * build; the pills stay regardless, because they encode the QUESTIONS people ask rather than
75
+ * predicates a user would assemble by hand.
76
+ */
77
+ readonly GridToolbar: {
78
+ showSearch: boolean;
79
+ showFilterToggle: boolean;
80
+ showColumnChooser: boolean;
81
+ showRefresh: boolean;
82
+ showExport: boolean;
83
+ showRowCount: boolean;
84
+ };
85
+ /**
86
+ * Open the double-clicked record.
87
+ *
88
+ * THE GRID DOES NOT NAVIGATE ITSELF. `NavigateOnDoubleClick` only controls whether it EMITS
89
+ * `Navigate`; acting on it is the HOST's job. Without this, a double-click merely selected the row
90
+ * — measured in a real browser, where it looked exactly like the grid being broken. Explorer's own
91
+ * host wires this for generated forms; a page hosting the grid inside a BaseResourceComponent must
92
+ * do it itself.
93
+ */
94
+ OnNavigate(event: {
95
+ Kind?: string;
96
+ EntityName?: string;
97
+ PrimaryKey?: CompositeKey;
98
+ DefaultValues?: Record<string, unknown>;
99
+ }): void;
100
+ protected abstract get pills(): MJCFilterPill[];
101
+ /**
102
+ * A restriction that applies to EVERY pill on this page — what makes a worklist a worklist.
103
+ *
104
+ * Kept separate from the pills rather than baked into each one: the page-level scope is the
105
+ * page's identity ("contracts awaiting documents"), while a pill narrows within it. Merging them
106
+ * would mean repeating the scope in every pill and being able to forget it in one.
107
+ */
108
+ protected get pageFilter(): string;
109
+ ngOnInit(): void;
110
+ /** Pill click. Re-selecting the active pill CLEARS it, which is how a user gets back to unfiltered. */
111
+ SelectPill(id: string): void;
112
+ ApplySearch(text: string): void;
113
+ /** Compose page scope + active pill + search into one ExtraFilter. */
114
+ protected rebuild(): void;
115
+ /** Default ordering. Worklists override — a worklist sorts by urgency, not by identity. */
116
+ protected get orderBy(): string;
117
+ /**
118
+ * Count each pill, so the rail and the pills agree about how much work there is.
119
+ *
120
+ * One `RunView` per pill with `MaxRows: 1` — the count comes from `TotalRowCount`, so nothing is
121
+ * transferred. Failures are swallowed to a null count rather than surfaced: a missing badge is a
122
+ * cosmetic loss, and a page that refuses to render because a count query failed is not.
123
+ */
124
+ protected refreshCounts(): Promise<void>;
125
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJCContractGridPageBase, never>;
126
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJCContractGridPageBase, "ng-component", never, {}, {}, never, never, true, never>;
127
+ }
128
+ /** Every contract, newest number first. */
129
+ export declare class MJCAllContractsPageComponent extends MJCContractGridPageBase {
130
+ Intro: string;
131
+ protected get pills(): MJCFilterPill[];
132
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJCAllContractsPageComponent, never>;
133
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJCAllContractsPageComponent, "mjc-all-contracts-page", never, {}, {}, never, never, true, never>;
134
+ }
135
+ /**
136
+ * Renewals & expiry — item 12's screen.
137
+ *
138
+ * Sorted by `RenewalNoticeDeadline`, not `EndDate`, because the date that matters is when our chance to
139
+ * act ends rather than when the contract does. Nulls last: a contract with no notice period recorded
140
+ * has no deadline to miss, so it should not head a list of deadlines.
141
+ *
142
+ * The four defaults are exactly D-21's, and there is deliberately no Save-as-view: users drive filters
143
+ * in-session, and persisting custom watchlists is phase 2 or never.
144
+ */
145
+ export declare class MJCRenewalsPageComponent extends MJCContractGridPageBase {
146
+ Intro: string;
147
+ /** Only live agreements can be renewed or allowed to expire. */
148
+ protected get pageFilter(): string;
149
+ protected get orderBy(): string;
150
+ protected get pills(): MJCFilterPill[];
151
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJCRenewalsPageComponent, never>;
152
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJCRenewalsPageComponent, "mjc-renewals-page", never, {}, {}, never, never, true, never>;
153
+ }
154
+ /**
155
+ * Awaiting documents — the other half of item 12's work group.
156
+ *
157
+ * `IsAwaitingDocument` is derived (the contract TYPE expects paper and no file is linked), which is why
158
+ * this page is a filter rather than a stored worklist: a Payment Link never appears here, because its
159
+ * type says paper was never expected. Nothing has to remember to clear a flag.
160
+ */
161
+ export declare class MJCAwaitingDocumentsPageComponent extends MJCContractGridPageBase {
162
+ Intro: string;
163
+ protected get pageFilter(): string;
164
+ protected get orderBy(): string;
165
+ protected get pills(): MJCFilterPill[];
166
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJCAwaitingDocumentsPageComponent, never>;
167
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJCAwaitingDocumentsPageComponent, "mjc-awaiting-documents-page", never, {}, {}, never, never, true, never>;
168
+ }
169
+ //# sourceMappingURL=contract-grid.page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-grid.page.d.ts","sourceRoot":"","sources":["../../../src/lib/pages/contract-grid.page.ts"],"names":[],"mappings":"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"}