@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.
- package/LICENSE +183 -0
- package/dist/lib/data/entity-names.d.ts +29 -0
- package/dist/lib/data/entity-names.d.ts.map +1 -0
- package/dist/lib/data/entity-names.js +29 -0
- package/dist/lib/data/entity-names.js.map +1 -0
- package/dist/lib/data/provider.d.ts +44 -0
- package/dist/lib/data/provider.d.ts.map +1 -0
- package/dist/lib/data/provider.js +48 -0
- package/dist/lib/data/provider.js.map +1 -0
- package/dist/lib/directives/fk-navigate.directive.d.ts +63 -0
- package/dist/lib/directives/fk-navigate.directive.d.ts.map +1 -0
- package/dist/lib/directives/fk-navigate.directive.js +99 -0
- package/dist/lib/directives/fk-navigate.directive.js.map +1 -0
- package/dist/lib/form-panels/contract.panels.d.ts +124 -0
- package/dist/lib/form-panels/contract.panels.d.ts.map +1 -0
- package/dist/lib/form-panels/contract.panels.js +1167 -0
- package/dist/lib/form-panels/contract.panels.js.map +1 -0
- package/dist/lib/form-panels/organization.panels.d.ts +23 -0
- package/dist/lib/form-panels/organization.panels.d.ts.map +1 -0
- package/dist/lib/form-panels/organization.panels.js +118 -0
- package/dist/lib/form-panels/organization.panels.js.map +1 -0
- package/dist/lib/form-panels/record-files.panel.d.ts +151 -0
- package/dist/lib/form-panels/record-files.panel.d.ts.map +1 -0
- package/dist/lib/form-panels/record-files.panel.js +1046 -0
- package/dist/lib/form-panels/record-files.panel.js.map +1 -0
- package/dist/lib/form-panels/supersede.panel.d.ts +68 -0
- package/dist/lib/form-panels/supersede.panel.d.ts.map +1 -0
- package/dist/lib/form-panels/supersede.panel.js +415 -0
- package/dist/lib/form-panels/supersede.panel.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component.js +196 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component.js +120 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component.js +79 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component.js +79 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component.js +86 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component.js +100 -0
- package/dist/lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component.js.map +1 -0
- package/dist/lib/generated/generated-forms.module.d.ts +23 -0
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -0
- package/dist/lib/generated/generated-forms.module.js +78 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -0
- package/dist/lib/pages/configuration.page.d.ts +83 -0
- package/dist/lib/pages/configuration.page.d.ts.map +1 -0
- package/dist/lib/pages/configuration.page.js +240 -0
- package/dist/lib/pages/configuration.page.js.map +1 -0
- package/dist/lib/pages/contract-grid.page.d.ts +169 -0
- package/dist/lib/pages/contract-grid.page.d.ts.map +1 -0
- package/dist/lib/pages/contract-grid.page.js +487 -0
- package/dist/lib/pages/contract-grid.page.js.map +1 -0
- package/dist/lib/pages/contracts-dashboard.page.d.ts +56 -0
- package/dist/lib/pages/contracts-dashboard.page.d.ts.map +1 -0
- package/dist/lib/pages/contracts-dashboard.page.js +215 -0
- package/dist/lib/pages/contracts-dashboard.page.js.map +1 -0
- package/dist/lib/pages/modifications.page.d.ts +96 -0
- package/dist/lib/pages/modifications.page.d.ts.map +1 -0
- package/dist/lib/pages/modifications.page.js +243 -0
- package/dist/lib/pages/modifications.page.js.map +1 -0
- package/dist/lib/pages/templates.page.d.ts +120 -0
- package/dist/lib/pages/templates.page.d.ts.map +1 -0
- package/dist/lib/pages/templates.page.js +258 -0
- package/dist/lib/pages/templates.page.js.map +1 -0
- package/dist/lib/sections/contracts-sections.component.d.ts +112 -0
- package/dist/lib/sections/contracts-sections.component.d.ts.map +1 -0
- package/dist/lib/sections/contracts-sections.component.js +412 -0
- package/dist/lib/sections/contracts-sections.component.js.map +1 -0
- package/dist/lib/sections/section-nav.model.d.ts +78 -0
- package/dist/lib/sections/section-nav.model.d.ts.map +1 -0
- package/dist/lib/sections/section-nav.model.js +110 -0
- package/dist/lib/sections/section-nav.model.js.map +1 -0
- package/dist/lib/sections/section-shell.component.d.ts +73 -0
- package/dist/lib/sections/section-shell.component.d.ts.map +1 -0
- package/dist/lib/sections/section-shell.component.js +170 -0
- package/dist/lib/sections/section-shell.component.js.map +1 -0
- package/dist/public-api.d.ts +44 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +105 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `mjc-section-shell` — the frame every Contracts section renders inside.
|
|
3
|
+
*
|
|
4
|
+
* One of the three top-level sections occupies a tab in MJ Explorer; each owns a LEFT rail over its
|
|
5
|
+
* own sub-pages. This component is that frame: MJ's chrome trio plus `<mj-left-nav>`, with the active
|
|
6
|
+
* sub-page projected into the content pane.
|
|
7
|
+
*
|
|
8
|
+
* COMPOSITION RATHER THAN INHERITANCE, deliberately. Angular does not inherit templates, so a base
|
|
9
|
+
* *class* would force one copy of this markup per section — and three copies of a frame is three
|
|
10
|
+
* places for the frame to drift. Each section is a thin component that hands this one a rail and
|
|
11
|
+
* projects a page.
|
|
12
|
+
*
|
|
13
|
+
* Nothing here is bespoke chrome: header, body, rail and content pane all come from
|
|
14
|
+
* `@memberjunction/ng-ui-components`. A section with its own gradient header is a section that no
|
|
15
|
+
* longer looks like MJ.
|
|
16
|
+
*
|
|
17
|
+
* THREE TRAPS ORDERS PAID FOR, INHERITED HERE RATHER THAN REDISCOVERED — each is load-bearing and
|
|
18
|
+
* each looks like styling:
|
|
19
|
+
*
|
|
20
|
+
* 1. NO TOOLBAR SLOT. MJ hides its toolbar row when empty (`:empty` on
|
|
21
|
+
* `mj-page-header-row--toolbar`), but a wrapper `div` carrying the `toolbar` attribute is itself a
|
|
22
|
+
* child node, so the row stops counting as empty and renders its border plus padding on every
|
|
23
|
+
* section forever — orders measured 29px of dead space on all four. No section here projects a
|
|
24
|
+
* toolbar, so the slot would only ever cost height. A section that needs one must add the wrapper
|
|
25
|
+
* back AND guard it with an `@if`.
|
|
26
|
+
* 2. `mj-page-body-interior` IS REQUIRED FOR SCROLLING. `mj-left-nav-content` forces every DIRECT
|
|
27
|
+
* child to flex + `height:100%` + `overflow:hidden` via a `::ng-deep` child rule that outranks a
|
|
28
|
+
* page's own `:host { overflow:auto }`. Projected straight in, every page becomes a fixed-height
|
|
29
|
+
* box with its overflow hidden and anything past the fold is unreachable — a mouse wheel cannot
|
|
30
|
+
* scroll `overflow:hidden`. `mj-page-body-interior` is MJ's own answer: it is named in that rule's
|
|
31
|
+
* `:not()` exemption list and self-declares `flex:1 1 auto; overflow-y:auto`. Wrapping here fixes
|
|
32
|
+
* every section at once and keeps pages as grandchildren, so their own `:host` layout applies.
|
|
33
|
+
* 3. `ViewEncapsulation.None` + `styleUrls` IS HOW THE KIT SHIPS. `ngc` only compiles what a
|
|
34
|
+
* component references, so a standalone stylesheet nothing imports gets built into `dist` and
|
|
35
|
+
* never loaded by a real Explorer — the app renders as unstyled text while the mockups look
|
|
36
|
+
* perfect, because those `@import` it by hand. Referencing the kit from the shell every section
|
|
37
|
+
* renders inside means Angular carries it wherever the app is mounted. `None` is required, not
|
|
38
|
+
* lazy: these classes are used by DESCENDANT components, so scoping them breaks them.
|
|
39
|
+
*
|
|
40
|
+
* @module @mj-biz-apps/contracts-ng
|
|
41
|
+
*/
|
|
42
|
+
import { EventEmitter } from '@angular/core';
|
|
43
|
+
import { type MJLeftNavItem, type MJLeftNavSection } from '@memberjunction/ng-ui-components';
|
|
44
|
+
import * as i0 from "@angular/core";
|
|
45
|
+
export declare class MJCSectionShellComponent {
|
|
46
|
+
/** Section title — the identity of the whole tab, so sub-pages never restate it. */
|
|
47
|
+
Title: string;
|
|
48
|
+
/** Font Awesome class for the title. */
|
|
49
|
+
Icon: string;
|
|
50
|
+
/** One line saying what this section is for. */
|
|
51
|
+
Subtitle: string;
|
|
52
|
+
/** The rail, built by {@link BuildLeftNavSections} from the section's page list. */
|
|
53
|
+
NavSections: MJLeftNavSection[];
|
|
54
|
+
/** Which sub-page is showing. Drives the rail's active state. */
|
|
55
|
+
ActivePageId: string | null;
|
|
56
|
+
/** Rail width in pixels. 232 matches the mockups and orders. */
|
|
57
|
+
RailWidth: number;
|
|
58
|
+
/** Shows the content pane's built-in spinner instead of the projected page. */
|
|
59
|
+
Loading: boolean;
|
|
60
|
+
/** Shows the content pane's built-in error state. Null clears it. */
|
|
61
|
+
Error: string | null;
|
|
62
|
+
/**
|
|
63
|
+
* A rail item was chosen. Emits the page id.
|
|
64
|
+
*
|
|
65
|
+
* Emitted rather than acted on: this component does not know how the host loads a page, and a
|
|
66
|
+
* shell that routed would stop being reusable outside the one app that taught it how.
|
|
67
|
+
*/
|
|
68
|
+
PageSelected: EventEmitter<string>;
|
|
69
|
+
protected onItemClicked(item: MJLeftNavItem): void;
|
|
70
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MJCSectionShellComponent, never>;
|
|
71
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MJCSectionShellComponent, "mjc-section-shell", never, { "Title": { "alias": "Title"; "required": false; }; "Icon": { "alias": "Icon"; "required": false; }; "Subtitle": { "alias": "Subtitle"; "required": false; }; "NavSections": { "alias": "NavSections"; "required": false; }; "ActivePageId": { "alias": "ActivePageId"; "required": false; }; "RailWidth": { "alias": "RailWidth"; "required": false; }; "Loading": { "alias": "Loading"; "required": false; }; "Error": { "alias": "Error"; "required": false; }; }, { "PageSelected": "PageSelected"; }, never, ["[meta]", "[actions]", "*"], true, never>;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=section-shell.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-shell.component.d.ts","sourceRoot":"","sources":["../../../src/lib/sections/section-shell.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAa,YAAY,EAAoC,MAAM,eAAe,CAAC;AAE1F,OAAO,EAOH,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACxB,MAAM,kCAAkC,CAAC;;AAE1C,qBAwCa,wBAAwB;IACjC,oFAAoF;IAC3E,KAAK,SAAM;IAEpB,wCAAwC;IAC/B,IAAI,SAAM;IAEnB,gDAAgD;IACvC,QAAQ,SAAM;IAEvB,oFAAoF;IAC3E,WAAW,EAAE,gBAAgB,EAAE,CAAM;IAE9C,iEAAiE;IACxD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE5C,gEAAgE;IACvD,SAAS,SAAO;IAEzB,+EAA+E;IACtE,OAAO,UAAS;IAEzB,qEAAqE;IAC5D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAErC;;;;;OAKG;IACO,YAAY,uBAA8B;IAEpD,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;yCAjCzC,wBAAwB;2CAAxB,wBAAwB;CAwCpC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `mjc-section-shell` — the frame every Contracts section renders inside.
|
|
3
|
+
*
|
|
4
|
+
* One of the three top-level sections occupies a tab in MJ Explorer; each owns a LEFT rail over its
|
|
5
|
+
* own sub-pages. This component is that frame: MJ's chrome trio plus `<mj-left-nav>`, with the active
|
|
6
|
+
* sub-page projected into the content pane.
|
|
7
|
+
*
|
|
8
|
+
* COMPOSITION RATHER THAN INHERITANCE, deliberately. Angular does not inherit templates, so a base
|
|
9
|
+
* *class* would force one copy of this markup per section — and three copies of a frame is three
|
|
10
|
+
* places for the frame to drift. Each section is a thin component that hands this one a rail and
|
|
11
|
+
* projects a page.
|
|
12
|
+
*
|
|
13
|
+
* Nothing here is bespoke chrome: header, body, rail and content pane all come from
|
|
14
|
+
* `@memberjunction/ng-ui-components`. A section with its own gradient header is a section that no
|
|
15
|
+
* longer looks like MJ.
|
|
16
|
+
*
|
|
17
|
+
* THREE TRAPS ORDERS PAID FOR, INHERITED HERE RATHER THAN REDISCOVERED — each is load-bearing and
|
|
18
|
+
* each looks like styling:
|
|
19
|
+
*
|
|
20
|
+
* 1. NO TOOLBAR SLOT. MJ hides its toolbar row when empty (`:empty` on
|
|
21
|
+
* `mj-page-header-row--toolbar`), but a wrapper `div` carrying the `toolbar` attribute is itself a
|
|
22
|
+
* child node, so the row stops counting as empty and renders its border plus padding on every
|
|
23
|
+
* section forever — orders measured 29px of dead space on all four. No section here projects a
|
|
24
|
+
* toolbar, so the slot would only ever cost height. A section that needs one must add the wrapper
|
|
25
|
+
* back AND guard it with an `@if`.
|
|
26
|
+
* 2. `mj-page-body-interior` IS REQUIRED FOR SCROLLING. `mj-left-nav-content` forces every DIRECT
|
|
27
|
+
* child to flex + `height:100%` + `overflow:hidden` via a `::ng-deep` child rule that outranks a
|
|
28
|
+
* page's own `:host { overflow:auto }`. Projected straight in, every page becomes a fixed-height
|
|
29
|
+
* box with its overflow hidden and anything past the fold is unreachable — a mouse wheel cannot
|
|
30
|
+
* scroll `overflow:hidden`. `mj-page-body-interior` is MJ's own answer: it is named in that rule's
|
|
31
|
+
* `:not()` exemption list and self-declares `flex:1 1 auto; overflow-y:auto`. Wrapping here fixes
|
|
32
|
+
* every section at once and keeps pages as grandchildren, so their own `:host` layout applies.
|
|
33
|
+
* 3. `ViewEncapsulation.None` + `styleUrls` IS HOW THE KIT SHIPS. `ngc` only compiles what a
|
|
34
|
+
* component references, so a standalone stylesheet nothing imports gets built into `dist` and
|
|
35
|
+
* never loaded by a real Explorer — the app renders as unstyled text while the mockups look
|
|
36
|
+
* perfect, because those `@import` it by hand. Referencing the kit from the shell every section
|
|
37
|
+
* renders inside means Angular carries it wherever the app is mounted. `None` is required, not
|
|
38
|
+
* lazy: these classes are used by DESCENDANT components, so scoping them breaks them.
|
|
39
|
+
*
|
|
40
|
+
* @module @mj-biz-apps/contracts-ng
|
|
41
|
+
*/
|
|
42
|
+
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
|
|
43
|
+
import { CommonModule } from '@angular/common';
|
|
44
|
+
import { MJLeftNavComponent, MJLeftNavContentComponent, MJPageBodyComponent, MJPageBodyInteriorComponent, MJPageHeaderComponent, MJPageLayoutComponent, } from '@memberjunction/ng-ui-components';
|
|
45
|
+
import * as i0 from "@angular/core";
|
|
46
|
+
const _c0 = [[["", "meta", ""]], [["", "actions", ""]], "*"];
|
|
47
|
+
const _c1 = ["[meta]", "[actions]", "*"];
|
|
48
|
+
export class MJCSectionShellComponent {
|
|
49
|
+
/** Section title — the identity of the whole tab, so sub-pages never restate it. */
|
|
50
|
+
Title = '';
|
|
51
|
+
/** Font Awesome class for the title. */
|
|
52
|
+
Icon = '';
|
|
53
|
+
/** One line saying what this section is for. */
|
|
54
|
+
Subtitle = '';
|
|
55
|
+
/** The rail, built by {@link BuildLeftNavSections} from the section's page list. */
|
|
56
|
+
NavSections = [];
|
|
57
|
+
/** Which sub-page is showing. Drives the rail's active state. */
|
|
58
|
+
ActivePageId = null;
|
|
59
|
+
/** Rail width in pixels. 232 matches the mockups and orders. */
|
|
60
|
+
RailWidth = 232;
|
|
61
|
+
/** Shows the content pane's built-in spinner instead of the projected page. */
|
|
62
|
+
Loading = false;
|
|
63
|
+
/** Shows the content pane's built-in error state. Null clears it. */
|
|
64
|
+
Error = null;
|
|
65
|
+
/**
|
|
66
|
+
* A rail item was chosen. Emits the page id.
|
|
67
|
+
*
|
|
68
|
+
* Emitted rather than acted on: this component does not know how the host loads a page, and a
|
|
69
|
+
* shell that routed would stop being reusable outside the one app that taught it how.
|
|
70
|
+
*/
|
|
71
|
+
PageSelected = new EventEmitter();
|
|
72
|
+
onItemClicked(item) {
|
|
73
|
+
if (item.disabled)
|
|
74
|
+
return;
|
|
75
|
+
// Re-selecting the current page is a no-op rather than a reload — people click the rail item
|
|
76
|
+
// they are already on surprisingly often.
|
|
77
|
+
if (item.id === this.ActivePageId)
|
|
78
|
+
return;
|
|
79
|
+
this.PageSelected.emit(item.id);
|
|
80
|
+
}
|
|
81
|
+
static ɵfac = function MJCSectionShellComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJCSectionShellComponent)(); };
|
|
82
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJCSectionShellComponent, selectors: [["mjc-section-shell"]], inputs: { Title: "Title", Icon: "Icon", Subtitle: "Subtitle", NavSections: "NavSections", ActivePageId: "ActivePageId", RailWidth: "RailWidth", Loading: "Loading", Error: "Error" }, outputs: { PageSelected: "PageSelected" }, ngContentSelectors: _c1, decls: 11, vars: 12, consts: [[3, "Title", "Icon", "Subtitle"], ["meta", ""], ["actions", ""], ["Direction", "row", 3, "Flex", "Padding"], [3, "ItemClicked", "Sections", "ActiveId", "Width", "MobileTitle"], [3, "Loading", "Error"], [3, "Padding"]], template: function MJCSectionShellComponent_Template(rf, ctx) { if (rf & 1) {
|
|
83
|
+
i0.ɵɵprojectionDef(_c0);
|
|
84
|
+
i0.ɵɵelementStart(0, "mj-page-layout")(1, "mj-page-header", 0)(2, "div", 1);
|
|
85
|
+
i0.ɵɵprojection(3);
|
|
86
|
+
i0.ɵɵelementEnd();
|
|
87
|
+
i0.ɵɵelementStart(4, "div", 2);
|
|
88
|
+
i0.ɵɵprojection(5, 1);
|
|
89
|
+
i0.ɵɵelementEnd()();
|
|
90
|
+
i0.ɵɵelementStart(6, "mj-page-body", 3)(7, "mj-left-nav", 4);
|
|
91
|
+
i0.ɵɵlistener("ItemClicked", function MJCSectionShellComponent_Template_mj_left_nav_ItemClicked_7_listener($event) { return ctx.onItemClicked($event); });
|
|
92
|
+
i0.ɵɵelementEnd();
|
|
93
|
+
i0.ɵɵelementStart(8, "mj-left-nav-content", 5)(9, "mj-page-body-interior", 6);
|
|
94
|
+
i0.ɵɵprojection(10, 2);
|
|
95
|
+
i0.ɵɵelementEnd()()()();
|
|
96
|
+
} if (rf & 2) {
|
|
97
|
+
i0.ɵɵadvance();
|
|
98
|
+
i0.ɵɵproperty("Title", ctx.Title)("Icon", ctx.Icon)("Subtitle", ctx.Subtitle);
|
|
99
|
+
i0.ɵɵadvance(5);
|
|
100
|
+
i0.ɵɵproperty("Flex", true)("Padding", false);
|
|
101
|
+
i0.ɵɵadvance();
|
|
102
|
+
i0.ɵɵproperty("Sections", ctx.NavSections)("ActiveId", ctx.ActivePageId)("Width", ctx.RailWidth)("MobileTitle", ctx.Title);
|
|
103
|
+
i0.ɵɵadvance();
|
|
104
|
+
i0.ɵɵproperty("Loading", ctx.Loading)("Error", ctx.Error);
|
|
105
|
+
i0.ɵɵadvance();
|
|
106
|
+
i0.ɵɵproperty("Padding", false);
|
|
107
|
+
} }, dependencies: [CommonModule,
|
|
108
|
+
MJPageLayoutComponent,
|
|
109
|
+
MJPageHeaderComponent,
|
|
110
|
+
MJPageBodyComponent,
|
|
111
|
+
MJLeftNavComponent,
|
|
112
|
+
MJLeftNavContentComponent,
|
|
113
|
+
MJPageBodyInteriorComponent], styles: ["/**\n * contracts-kit.css \u2014 ported from design-docs/ui-design/mockups-v2/tokens.css.\n *\n * \u26A0 SEMANTIC TOKENS ONLY. MJ's design-token rule is explicit: *\"NEVER use primitive tokens\n * (`--mj-color-neutral-*`, `--mj-color-brand-*`) in component CSS. Primitives don't adapt to dark\n * mode.\"* An earlier version of this file used twelve of them, because the mockup did \u2014 and in a\n * standalone mockup page that is harmless, since there is no dark mode to adapt to. Ported into a real\n * component stylesheet it means every tinted surface, chip and clause box keeps its LIGHT colour when\n * the app is themed dark. That is the theming break, and it is invisible until someone switches theme.\n *\n * The mapping applied: neutral-50 \u2192 bg-surface-sunken, neutral-100 \u2192 border-subtle, neutral-300 \u2192\n * border-strong, success/error/warning-50 \u2192 status-*-bg, success/error-700 \u2192 status-*-text, brand-50 \u2192\n * status-info-bg, brand-100 \u2192 status-info-border, brand-700/900 \u2192 status-info-text. `#fff` on a brand\n * fill \u2192 `--mj-brand-on-primary`.\n *\n * THE MOCKUPS ARE THE SPEC, and this file exists to keep them so. An earlier version of this kit was\n * written from MEMORY of them, and it was wrong in a way that is invisible in source and obvious on\n * screen: it used token names that do not exist. `--mj-font-size-sm`, `--mj-text-tertiary`,\n * `--mj-color-warning-text`, `--mj-color-success-border` and four others are not MJ tokens (the real\n * names are `--mj-text-sm`, `--mj-status-warning-text`, `--mj-status-success`, \u2026). Every one of those\n * resolved to NOTHING \u2014 so font sizes fell back to browser defaults and the state chips rendered with\n * no colour at all. That is most of what \"looks bad\" was.\n *\n * So: class names and rules below are the mockup's, verbatim where possible, and **every token used\n * here has been checked to exist in MJ's `_tokens.scss`.** If you add a rule, check the token first \u2014\n * a missing custom property fails silently, which is the worst failure mode CSS has.\n *\n * SHIPPED VIA THE SECTION SHELL (`styleUrls` + `ViewEncapsulation.None`). `ngc` only compiles what a\n * component references, so a stylesheet nothing references is built into dist and never loaded.\n * `None` is required, not lazy: these classes are used by DESCENDANT components.\n *\n * Prefix note: the mockup used bare class names (`.panel`, `.chip`) because it was a standalone page.\n * Here everything is `mjc-` prefixed \u2014 bare `.panel` inside a real Explorer would collide with MJ's own\n * chrome, and `ViewEncapsulation.None` means these rules are global.\n */\n\n/* \u2500\u2500 Page frame \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-page {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-4);\n padding: var(--mj-space-5);\n}\n\n/* A grid page needs a DEFINITE height: mj-explorer-entity-data-grid is height:100% outside a related\n panel, and 100% of an auto-height parent is zero \u2014 the grid renders no rows while its toolbar still\n reports the count. MJ's own source documents that symptom. `min-height: 0` on the fill slot is\n mandatory: a flex child defaults to min-height:auto and refuses to shrink, so without it the grid\n pushes the page taller instead of scrolling inside itself. */\n.mjc-page--grid { height: 100%; min-height: 0; }\n.mjc-grid-fill { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }\n\n/* Intro prose. Constrained measure \u2014 text stops being readable much past this \u2014 and it is a real\n block with real spacing, not a bare text node floating between cards. */\n.mjc-page__intro {\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n line-height: 1.55;\n margin: 0;\n max-width: 78ch;\n}\n\n/* \u2500\u2500 Panel body helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Our panels are real `<mj-collapsible-panel>`s, so MJ paints the frame, the header and the spacing.\n These classes style only what goes INSIDE one. */\n\n.mjc-body { padding: var(--mj-space-4); }\n.mjc-body--flush { padding: 0; } /* a table fills the panel edge to edge */\n.mjc-body > * + * { margin-top: var(--mj-space-3); } /* nothing ever touches its neighbour */\n\n.mjc-note {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n line-height: 1.55;\n}\n\n/* A note under a flush table needs its own padding and a rule above it, or it reads as a table row. */\n.mjc-note--footer {\n padding: var(--mj-space-3) var(--mj-space-4);\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n/* \u2500\u2500 Hero (mockup 1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-hero {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-4);\n padding: var(--mj-space-4) var(--mj-space-5);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.mjc-hero__identity { display: flex; align-items: center; gap: var(--mj-space-4); min-width: 0; }\n\n.mjc-hero__avatar {\n flex: none;\n width: 52px; height: 52px;\n border-radius: var(--mj-radius-md);\n display: flex; align-items: center; justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-xl, 1.375rem);\n}\n\n.mjc-hero__copy { min-width: 0; flex: 1; }\n\n.mjc-hero__title-row {\n display: flex; align-items: center; flex-wrap: wrap;\n gap: var(--mj-space-2) var(--mj-space-3);\n}\n\n.mjc-hero__title {\n margin: 0;\n font-size: var(--mj-text-lg);\n font-weight: 700;\n line-height: 1.25;\n /* Long contract descriptions must not push the chips off the card. */\n overflow-wrap: anywhere;\n}\n\n.mjc-hero__meta {\n display: flex; flex-wrap: wrap;\n gap: var(--mj-space-3);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n margin-top: var(--mj-space-2);\n}\n\n/* auto-fit so five stats sit in a row on a wide screen and reflow on a laptop, rather than\n overflowing the card \u2014 which is what a fixed five-column grid did. */\n.mjc-hero__stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(8.5rem, 1fr));\n gap: var(--mj-space-3);\n}\n\n.mjc-stat {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: var(--mj-space-3);\n min-width: 0;\n}\n.mjc-stat__label {\n display: block; font-size: var(--mj-text-xs);\n text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted);\n}\n.mjc-stat__value {\n display: block; font-size: var(--mj-text-base); font-weight: 700; margin-top: 2px;\n overflow-wrap: anywhere;\n}\n.mjc-stat__sub { display: block; font-size: var(--mj-text-xs); color: var(--mj-text-muted); }\n\n/* \u2500\u2500 Chips \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-chip {\n display: inline-flex; align-items: center; gap: 4px;\n font-size: var(--mj-text-xs); font-weight: 600;\n padding: 2px 9px; border-radius: 999px;\n border: 1px solid transparent; white-space: nowrap;\n}\n.mjc-chip--ok { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); border-color: var(--mj-status-success); }\n.mjc-chip--warn { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); border-color: var(--mj-status-warning); }\n.mjc-chip--error { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); border-color: var(--mj-status-error); }\n.mjc-chip--info { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); border-color: var(--mj-status-info-border); }\n.mjc-chip--muted { background: var(--mj-border-subtle); color: var(--mj-text-secondary); border-color: var(--mj-border-default); }\n\n/* \u2500\u2500 Buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-btn {\n display: inline-flex; align-items: center; gap: 6px;\n font-size: var(--mj-text-sm); font-weight: 600;\n padding: 6px 12px;\n border-radius: var(--mj-radius-sm);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n.mjc-btn:disabled { opacity: .5; cursor: default; }\n.mjc-btn--primary { background: var(--mj-brand-primary); border-color: var(--mj-brand-primary); color: var(--mj-brand-on-primary); }\n.mjc-btn--flat { background: transparent; border-color: transparent; color: var(--mj-brand-primary); }\n.mjc-btn--sm { padding: 3px 9px; font-size: var(--mj-text-xs); }\n.mjc-btn--danger { color: var(--mj-status-error-text); border-color: transparent; background: transparent; }\n\n/* \u2500\u2500 Field grid \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-fields {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));\n gap: var(--mj-space-3) var(--mj-space-4);\n}\n.mjc-field > label {\n display: block; font-size: var(--mj-text-xs); color: var(--mj-text-muted);\n text-transform: uppercase; letter-spacing: .04em; margin-bottom: 3px;\n}\n.mjc-field .mjc-val {\n padding: 6px 9px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n min-height: 31px;\n overflow-wrap: anywhere;\n}\n.mjc-field .mjc-val--ro { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.mjc-hint { color: var(--mj-text-muted); font-size: var(--mj-text-xs); margin-top: 3px; }\n\n/* \u2500\u2500 Tables \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n The mockup renders modifications, documents and lineage as TABLES, not stacked cards. With three\n or more rows a table is scannable and a stack is a wall. */\n\ntable.mjc-grid { width: 100%; border-collapse: collapse; }\ntable.mjc-grid th {\n text-align: left; font-size: var(--mj-text-xs);\n text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700;\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1.5px solid var(--mj-border-default);\n}\ntable.mjc-grid td {\n padding: var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\ntable.mjc-grid tr:last-child td { border-bottom: 0; }\ntable.mjc-grid tbody tr:hover td { background: var(--mj-bg-surface-sunken); }\n.mjc-row--click { cursor: pointer; }\n\n.mjc-muted { color: var(--mj-text-muted); }\n.mjc-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: var(--mj-text-xs); }\n\n/* \u2500\u2500 The clause pair (mockups 1 and 2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n The standard clause and what this contract says instead, read side by side. This is the app's\n central idea rendered, so it gets real styling rather than two paragraphs. */\n\n.mjc-pair {\n display: grid; grid-template-columns: 1fr; gap: var(--mj-space-3);\n margin-top: var(--mj-space-2);\n}\n/* Side by side only when there is room \u2014 two 40ch columns on a laptop is worse than one readable one. */\n@media (min-width: 1100px) { .mjc-pair { grid-template-columns: 1fr 1fr; } }\n\n.mjc-pair__tag {\n display: block; font-size: var(--mj-text-xs); font-weight: 700;\n text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); margin-bottom: 3px;\n}\n.mjc-pair__tag--mod { color: var(--mj-status-warning-text); }\n\n.mjc-clause {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-left: 2px solid var(--mj-border-strong);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-radius: 0 var(--mj-radius-sm) var(--mj-radius-sm) 0;\n margin: 0;\n /* Clause text carries its own line breaks, and 9.1 is a single 1,100-character sentence in caps \u2014\n both must wrap inside the box rather than escaping it. */\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n.mjc-clause--mod {\n border-left-color: var(--mj-status-warning);\n background: var(--mj-status-warning-bg);\n color: var(--mj-text-primary);\n}\n\n.mjc-toggle {\n font-size: var(--mj-text-xs); color: var(--mj-brand-primary);\n font-weight: 600; margin-top: 4px; background: none; border: 0; padding: 0; cursor: pointer;\n}\n\n/* \u2500\u2500 Callout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-flag {\n background: var(--mj-status-warning-bg);\n border-left: 3px solid var(--mj-status-warning);\n padding: var(--mj-space-2) var(--mj-space-3);\n font-size: var(--mj-text-xs);\n color: var(--mj-status-warning-text);\n border-radius: 0 var(--mj-radius-sm) var(--mj-radius-sm) 0;\n line-height: 1.55;\n}\n\n/* \u2500\u2500 Invalid input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/* A required field the user has emptied. Border + ring only \u2014 no background change, because these\n are prose textareas and tinting the reading surface makes the text itself harder to read, which\n is the opposite of helpful when the point is \"write something here\". Tokens only, per the\n design-token gate. */\n.mjc-invalid {\n border-color: var(--mj-status-error) !important;\n box-shadow: 0 0 0 2px var(--mj-status-error-bg);\n outline: none;\n}\n\n/* \u2500\u2500 Filter pills (watchlist) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-pills { display: flex; flex-wrap: wrap; gap: var(--mj-space-2); align-items: center; }\n\n.mjc-pill {\n appearance: none; cursor: pointer;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-radius: 999px;\n padding: 3px var(--mj-space-3);\n font-size: var(--mj-text-sm);\n line-height: 1.6;\n display: inline-flex; align-items: center; gap: var(--mj-space-2);\n}\n.mjc-pill:hover { border-color: var(--mj-brand-primary); color: var(--mj-text-primary); }\n.mjc-pill:disabled { opacity: .5; cursor: default; }\n.mjc-pill--active {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-brand-primary);\n color: var(--mj-status-info-text);\n font-weight: 700;\n}\n.mjc-pill__count { font-variant-numeric: tabular-nums; opacity: .85; font-size: var(--mj-text-xs); }\n\n/* \u2500\u2500 Empty state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n A sentence in a bordered box, never a bare line of text in whitespace. */\n\n.mjc-empty {\n display: flex; align-items: center; gap: var(--mj-space-2); justify-content: center;\n padding: var(--mj-space-6);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n background: var(--mj-bg-surface-sunken);\n border: 1px dashed var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n text-align: center;\n}\n"], encapsulation: 2 });
|
|
114
|
+
}
|
|
115
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJCSectionShellComponent, [{
|
|
116
|
+
type: Component,
|
|
117
|
+
args: [{ selector: 'mjc-section-shell', standalone: true, encapsulation: ViewEncapsulation.None, imports: [
|
|
118
|
+
CommonModule,
|
|
119
|
+
MJPageLayoutComponent,
|
|
120
|
+
MJPageHeaderComponent,
|
|
121
|
+
MJPageBodyComponent,
|
|
122
|
+
MJLeftNavComponent,
|
|
123
|
+
MJLeftNavContentComponent,
|
|
124
|
+
MJPageBodyInteriorComponent,
|
|
125
|
+
], template: `
|
|
126
|
+
<mj-page-layout>
|
|
127
|
+
<mj-page-header [Title]="Title" [Icon]="Icon" [Subtitle]="Subtitle">
|
|
128
|
+
<div meta><ng-content select="[meta]"></ng-content></div>
|
|
129
|
+
<div actions><ng-content select="[actions]"></ng-content></div>
|
|
130
|
+
<!-- No toolbar slot — see trap 1 in the file header. -->
|
|
131
|
+
</mj-page-header>
|
|
132
|
+
|
|
133
|
+
<mj-page-body [Flex]="true" [Padding]="false" Direction="row">
|
|
134
|
+
<mj-left-nav
|
|
135
|
+
[Sections]="NavSections"
|
|
136
|
+
[ActiveId]="ActivePageId"
|
|
137
|
+
[Width]="RailWidth"
|
|
138
|
+
[MobileTitle]="Title"
|
|
139
|
+
(ItemClicked)="onItemClicked($event)" />
|
|
140
|
+
|
|
141
|
+
<mj-left-nav-content [Loading]="Loading" [Error]="Error">
|
|
142
|
+
<!-- Required for scrolling — see trap 2. Padding off; each page supplies its own. -->
|
|
143
|
+
<mj-page-body-interior [Padding]="false">
|
|
144
|
+
<ng-content></ng-content>
|
|
145
|
+
</mj-page-body-interior>
|
|
146
|
+
</mj-left-nav-content>
|
|
147
|
+
</mj-page-body>
|
|
148
|
+
</mj-page-layout>
|
|
149
|
+
`, styles: ["/**\n * contracts-kit.css \u2014 ported from design-docs/ui-design/mockups-v2/tokens.css.\n *\n * \u26A0 SEMANTIC TOKENS ONLY. MJ's design-token rule is explicit: *\"NEVER use primitive tokens\n * (`--mj-color-neutral-*`, `--mj-color-brand-*`) in component CSS. Primitives don't adapt to dark\n * mode.\"* An earlier version of this file used twelve of them, because the mockup did \u2014 and in a\n * standalone mockup page that is harmless, since there is no dark mode to adapt to. Ported into a real\n * component stylesheet it means every tinted surface, chip and clause box keeps its LIGHT colour when\n * the app is themed dark. That is the theming break, and it is invisible until someone switches theme.\n *\n * The mapping applied: neutral-50 \u2192 bg-surface-sunken, neutral-100 \u2192 border-subtle, neutral-300 \u2192\n * border-strong, success/error/warning-50 \u2192 status-*-bg, success/error-700 \u2192 status-*-text, brand-50 \u2192\n * status-info-bg, brand-100 \u2192 status-info-border, brand-700/900 \u2192 status-info-text. `#fff` on a brand\n * fill \u2192 `--mj-brand-on-primary`.\n *\n * THE MOCKUPS ARE THE SPEC, and this file exists to keep them so. An earlier version of this kit was\n * written from MEMORY of them, and it was wrong in a way that is invisible in source and obvious on\n * screen: it used token names that do not exist. `--mj-font-size-sm`, `--mj-text-tertiary`,\n * `--mj-color-warning-text`, `--mj-color-success-border` and four others are not MJ tokens (the real\n * names are `--mj-text-sm`, `--mj-status-warning-text`, `--mj-status-success`, \u2026). Every one of those\n * resolved to NOTHING \u2014 so font sizes fell back to browser defaults and the state chips rendered with\n * no colour at all. That is most of what \"looks bad\" was.\n *\n * So: class names and rules below are the mockup's, verbatim where possible, and **every token used\n * here has been checked to exist in MJ's `_tokens.scss`.** If you add a rule, check the token first \u2014\n * a missing custom property fails silently, which is the worst failure mode CSS has.\n *\n * SHIPPED VIA THE SECTION SHELL (`styleUrls` + `ViewEncapsulation.None`). `ngc` only compiles what a\n * component references, so a stylesheet nothing references is built into dist and never loaded.\n * `None` is required, not lazy: these classes are used by DESCENDANT components.\n *\n * Prefix note: the mockup used bare class names (`.panel`, `.chip`) because it was a standalone page.\n * Here everything is `mjc-` prefixed \u2014 bare `.panel` inside a real Explorer would collide with MJ's own\n * chrome, and `ViewEncapsulation.None` means these rules are global.\n */\n\n/* \u2500\u2500 Page frame \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-page {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-4);\n padding: var(--mj-space-5);\n}\n\n/* A grid page needs a DEFINITE height: mj-explorer-entity-data-grid is height:100% outside a related\n panel, and 100% of an auto-height parent is zero \u2014 the grid renders no rows while its toolbar still\n reports the count. MJ's own source documents that symptom. `min-height: 0` on the fill slot is\n mandatory: a flex child defaults to min-height:auto and refuses to shrink, so without it the grid\n pushes the page taller instead of scrolling inside itself. */\n.mjc-page--grid { height: 100%; min-height: 0; }\n.mjc-grid-fill { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; }\n\n/* Intro prose. Constrained measure \u2014 text stops being readable much past this \u2014 and it is a real\n block with real spacing, not a bare text node floating between cards. */\n.mjc-page__intro {\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n line-height: 1.55;\n margin: 0;\n max-width: 78ch;\n}\n\n/* \u2500\u2500 Panel body helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Our panels are real `<mj-collapsible-panel>`s, so MJ paints the frame, the header and the spacing.\n These classes style only what goes INSIDE one. */\n\n.mjc-body { padding: var(--mj-space-4); }\n.mjc-body--flush { padding: 0; } /* a table fills the panel edge to edge */\n.mjc-body > * + * { margin-top: var(--mj-space-3); } /* nothing ever touches its neighbour */\n\n.mjc-note {\n margin: 0;\n color: var(--mj-text-muted);\n font-size: var(--mj-text-xs);\n line-height: 1.55;\n}\n\n/* A note under a flush table needs its own padding and a rule above it, or it reads as a table row. */\n.mjc-note--footer {\n padding: var(--mj-space-3) var(--mj-space-4);\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n/* \u2500\u2500 Hero (mockup 1) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-hero {\n display: flex;\n flex-direction: column;\n gap: var(--mj-space-4);\n padding: var(--mj-space-4) var(--mj-space-5);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.mjc-hero__identity { display: flex; align-items: center; gap: var(--mj-space-4); min-width: 0; }\n\n.mjc-hero__avatar {\n flex: none;\n width: 52px; height: 52px;\n border-radius: var(--mj-radius-md);\n display: flex; align-items: center; justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-xl, 1.375rem);\n}\n\n.mjc-hero__copy { min-width: 0; flex: 1; }\n\n.mjc-hero__title-row {\n display: flex; align-items: center; flex-wrap: wrap;\n gap: var(--mj-space-2) var(--mj-space-3);\n}\n\n.mjc-hero__title {\n margin: 0;\n font-size: var(--mj-text-lg);\n font-weight: 700;\n line-height: 1.25;\n /* Long contract descriptions must not push the chips off the card. */\n overflow-wrap: anywhere;\n}\n\n.mjc-hero__meta {\n display: flex; flex-wrap: wrap;\n gap: var(--mj-space-3);\n color: var(--mj-text-secondary);\n font-size: var(--mj-text-sm);\n margin-top: var(--mj-space-2);\n}\n\n/* auto-fit so five stats sit in a row on a wide screen and reflow on a laptop, rather than\n overflowing the card \u2014 which is what a fixed five-column grid did. */\n.mjc-hero__stats {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(8.5rem, 1fr));\n gap: var(--mj-space-3);\n}\n\n.mjc-stat {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n padding: var(--mj-space-3);\n min-width: 0;\n}\n.mjc-stat__label {\n display: block; font-size: var(--mj-text-xs);\n text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted);\n}\n.mjc-stat__value {\n display: block; font-size: var(--mj-text-base); font-weight: 700; margin-top: 2px;\n overflow-wrap: anywhere;\n}\n.mjc-stat__sub { display: block; font-size: var(--mj-text-xs); color: var(--mj-text-muted); }\n\n/* \u2500\u2500 Chips \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-chip {\n display: inline-flex; align-items: center; gap: 4px;\n font-size: var(--mj-text-xs); font-weight: 600;\n padding: 2px 9px; border-radius: 999px;\n border: 1px solid transparent; white-space: nowrap;\n}\n.mjc-chip--ok { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); border-color: var(--mj-status-success); }\n.mjc-chip--warn { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); border-color: var(--mj-status-warning); }\n.mjc-chip--error { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); border-color: var(--mj-status-error); }\n.mjc-chip--info { background: var(--mj-status-info-bg); color: var(--mj-status-info-text); border-color: var(--mj-status-info-border); }\n.mjc-chip--muted { background: var(--mj-border-subtle); color: var(--mj-text-secondary); border-color: var(--mj-border-default); }\n\n/* \u2500\u2500 Buttons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-btn {\n display: inline-flex; align-items: center; gap: 6px;\n font-size: var(--mj-text-sm); font-weight: 600;\n padding: 6px 12px;\n border-radius: var(--mj-radius-sm);\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n.mjc-btn:disabled { opacity: .5; cursor: default; }\n.mjc-btn--primary { background: var(--mj-brand-primary); border-color: var(--mj-brand-primary); color: var(--mj-brand-on-primary); }\n.mjc-btn--flat { background: transparent; border-color: transparent; color: var(--mj-brand-primary); }\n.mjc-btn--sm { padding: 3px 9px; font-size: var(--mj-text-xs); }\n.mjc-btn--danger { color: var(--mj-status-error-text); border-color: transparent; background: transparent; }\n\n/* \u2500\u2500 Field grid \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-fields {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));\n gap: var(--mj-space-3) var(--mj-space-4);\n}\n.mjc-field > label {\n display: block; font-size: var(--mj-text-xs); color: var(--mj-text-muted);\n text-transform: uppercase; letter-spacing: .04em; margin-bottom: 3px;\n}\n.mjc-field .mjc-val {\n padding: 6px 9px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n min-height: 31px;\n overflow-wrap: anywhere;\n}\n.mjc-field .mjc-val--ro { background: var(--mj-bg-surface-sunken); color: var(--mj-text-secondary); }\n.mjc-hint { color: var(--mj-text-muted); font-size: var(--mj-text-xs); margin-top: 3px; }\n\n/* \u2500\u2500 Tables \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n The mockup renders modifications, documents and lineage as TABLES, not stacked cards. With three\n or more rows a table is scannable and a stack is a wall. */\n\ntable.mjc-grid { width: 100%; border-collapse: collapse; }\ntable.mjc-grid th {\n text-align: left; font-size: var(--mj-text-xs);\n text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); font-weight: 700;\n padding: var(--mj-space-2) var(--mj-space-3);\n border-bottom: 1.5px solid var(--mj-border-default);\n}\ntable.mjc-grid td {\n padding: var(--mj-space-3);\n border-bottom: 1px solid var(--mj-border-subtle);\n vertical-align: top;\n}\ntable.mjc-grid tr:last-child td { border-bottom: 0; }\ntable.mjc-grid tbody tr:hover td { background: var(--mj-bg-surface-sunken); }\n.mjc-row--click { cursor: pointer; }\n\n.mjc-muted { color: var(--mj-text-muted); }\n.mjc-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: var(--mj-text-xs); }\n\n/* \u2500\u2500 The clause pair (mockups 1 and 2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n The standard clause and what this contract says instead, read side by side. This is the app's\n central idea rendered, so it gets real styling rather than two paragraphs. */\n\n.mjc-pair {\n display: grid; grid-template-columns: 1fr; gap: var(--mj-space-3);\n margin-top: var(--mj-space-2);\n}\n/* Side by side only when there is room \u2014 two 40ch columns on a laptop is worse than one readable one. */\n@media (min-width: 1100px) { .mjc-pair { grid-template-columns: 1fr 1fr; } }\n\n.mjc-pair__tag {\n display: block; font-size: var(--mj-text-xs); font-weight: 700;\n text-transform: uppercase; letter-spacing: .04em;\n color: var(--mj-text-muted); margin-bottom: 3px;\n}\n.mjc-pair__tag--mod { color: var(--mj-status-warning-text); }\n\n.mjc-clause {\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-sunken);\n border-left: 2px solid var(--mj-border-strong);\n padding: var(--mj-space-2) var(--mj-space-3);\n border-radius: 0 var(--mj-radius-sm) var(--mj-radius-sm) 0;\n margin: 0;\n /* Clause text carries its own line breaks, and 9.1 is a single 1,100-character sentence in caps \u2014\n both must wrap inside the box rather than escaping it. */\n white-space: pre-wrap;\n overflow-wrap: anywhere;\n}\n.mjc-clause--mod {\n border-left-color: var(--mj-status-warning);\n background: var(--mj-status-warning-bg);\n color: var(--mj-text-primary);\n}\n\n.mjc-toggle {\n font-size: var(--mj-text-xs); color: var(--mj-brand-primary);\n font-weight: 600; margin-top: 4px; background: none; border: 0; padding: 0; cursor: pointer;\n}\n\n/* \u2500\u2500 Callout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-flag {\n background: var(--mj-status-warning-bg);\n border-left: 3px solid var(--mj-status-warning);\n padding: var(--mj-space-2) var(--mj-space-3);\n font-size: var(--mj-text-xs);\n color: var(--mj-status-warning-text);\n border-radius: 0 var(--mj-radius-sm) var(--mj-radius-sm) 0;\n line-height: 1.55;\n}\n\n/* \u2500\u2500 Invalid input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n/* A required field the user has emptied. Border + ring only \u2014 no background change, because these\n are prose textareas and tinting the reading surface makes the text itself harder to read, which\n is the opposite of helpful when the point is \"write something here\". Tokens only, per the\n design-token gate. */\n.mjc-invalid {\n border-color: var(--mj-status-error) !important;\n box-shadow: 0 0 0 2px var(--mj-status-error-bg);\n outline: none;\n}\n\n/* \u2500\u2500 Filter pills (watchlist) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n\n.mjc-pills { display: flex; flex-wrap: wrap; gap: var(--mj-space-2); align-items: center; }\n\n.mjc-pill {\n appearance: none; cursor: pointer;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n border-radius: 999px;\n padding: 3px var(--mj-space-3);\n font-size: var(--mj-text-sm);\n line-height: 1.6;\n display: inline-flex; align-items: center; gap: var(--mj-space-2);\n}\n.mjc-pill:hover { border-color: var(--mj-brand-primary); color: var(--mj-text-primary); }\n.mjc-pill:disabled { opacity: .5; cursor: default; }\n.mjc-pill--active {\n background: var(--mj-status-info-bg);\n border-color: var(--mj-brand-primary);\n color: var(--mj-status-info-text);\n font-weight: 700;\n}\n.mjc-pill__count { font-variant-numeric: tabular-nums; opacity: .85; font-size: var(--mj-text-xs); }\n\n/* \u2500\u2500 Empty state \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n A sentence in a bordered box, never a bare line of text in whitespace. */\n\n.mjc-empty {\n display: flex; align-items: center; gap: var(--mj-space-2); justify-content: center;\n padding: var(--mj-space-6);\n color: var(--mj-text-muted);\n font-size: var(--mj-text-sm);\n background: var(--mj-bg-surface-sunken);\n border: 1px dashed var(--mj-border-strong);\n border-radius: var(--mj-radius-md);\n text-align: center;\n}\n"] }]
|
|
150
|
+
}], null, { Title: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], Icon: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], Subtitle: [{
|
|
155
|
+
type: Input
|
|
156
|
+
}], NavSections: [{
|
|
157
|
+
type: Input
|
|
158
|
+
}], ActivePageId: [{
|
|
159
|
+
type: Input
|
|
160
|
+
}], RailWidth: [{
|
|
161
|
+
type: Input
|
|
162
|
+
}], Loading: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], Error: [{
|
|
165
|
+
type: Input
|
|
166
|
+
}], PageSelected: [{
|
|
167
|
+
type: Output
|
|
168
|
+
}] }); })();
|
|
169
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJCSectionShellComponent, { className: "MJCSectionShellComponent", filePath: "lib/sections/section-shell.component.ts", lineNumber: 95 }); })();
|
|
170
|
+
//# sourceMappingURL=section-shell.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-shell.component.js","sourceRoot":"","sources":["../../../src/lib/sections/section-shell.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACH,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,2BAA2B,EAC3B,qBAAqB,EACrB,qBAAqB,GAGxB,MAAM,kCAAkC,CAAC;;;;AA0C1C,MAAM,OAAO,wBAAwB;IACjC,oFAAoF;IAC3E,KAAK,GAAG,EAAE,CAAC;IAEpB,wCAAwC;IAC/B,IAAI,GAAG,EAAE,CAAC;IAEnB,gDAAgD;IACvC,QAAQ,GAAG,EAAE,CAAC;IAEvB,oFAAoF;IAC3E,WAAW,GAAuB,EAAE,CAAC;IAE9C,iEAAiE;IACxD,YAAY,GAAkB,IAAI,CAAC;IAE5C,gEAAgE;IACvD,SAAS,GAAG,GAAG,CAAC;IAEzB,+EAA+E;IACtE,OAAO,GAAG,KAAK,CAAC;IAEzB,qEAAqE;IAC5D,KAAK,GAAkB,IAAI,CAAC;IAErC;;;;;OAKG;IACO,YAAY,GAAG,IAAI,YAAY,EAAU,CAAC;IAE1C,aAAa,CAAC,IAAmB;QACvC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,6FAA6F;QAC7F,0CAA0C;QAC1C,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;kHAvCQ,wBAAwB;6DAAxB,wBAAwB;;YAvBrB,AADJ,AADJ,sCAAgB,wBACwD,aACtD;YAAA,kBAAyC;YAAA,iBAAM;YACzD,8BAAa;YAAA,qBAA4C;YAE7D,AAF6D,iBAAM,EAElD;YAGb,AADJ,uCAA8D,qBAMd;YAAxC,4HAAe,yBAAqB,IAAC;YALzC,iBAK4C;YAIxC,AAFJ,8CAAyD,+BAEZ;YACrC,sBAAyB;YAIzC,AADI,AADI,AADI,iBAAwB,EACN,EACX,EACF;;YArBG,cAAe;YAAe,AAAd,AAAhB,iCAAe,kBAAc,0BAAsB;YAMrD,eAAa;YAAC,AAAd,2BAAa,kBAAkB;YAErC,cAAwB;YAGxB,AADA,AADA,AADA,0CAAwB,8BACC,wBACN,0BACE;YAGJ,cAAmB;YAAC,AAApB,qCAAmB,oBAAgB;YAE7B,cAAiB;YAAjB,+BAAiB;4BA1BpD,YAAY;YACZ,qBAAqB;YACrB,qBAAqB;YACrB,mBAAmB;YACnB,kBAAkB;YAClB,yBAAyB;YACzB,2BAA2B;;iFA4BtB,wBAAwB;cAxCpC,SAAS;2BACI,mBAAmB,cACjB,IAAI,iBACD,iBAAiB,CAAC,IAAI,WAE5B;oBACL,YAAY;oBACZ,qBAAqB;oBACrB,qBAAqB;oBACrB,mBAAmB;oBACnB,kBAAkB;oBAClB,yBAAyB;oBACzB,2BAA2B;iBAC9B,YACS;;;;;;;;;;;;;;;;;;;;;;;;KAwBT;;kBAIA,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAQL,MAAM;;kFA/BE,wBAAwB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mj-biz-apps/contracts-ng — the CLIENT BOOTSTRAP package.
|
|
3
|
+
*
|
|
4
|
+
* This is the package named in mj-app.json under packages.client with role "bootstrap". When the app
|
|
5
|
+
* is installed (or dev-linked), MJExplorer's auto-generated open-app-bootstrap.generated.ts gains a
|
|
6
|
+
* static `import '@mj-biz-apps/contracts-ng';` — ESBuild bundles it and module evaluation fires the
|
|
7
|
+
* @RegisterClass decorators that make our components discoverable.
|
|
8
|
+
*
|
|
9
|
+
* WHAT LIVES HERE
|
|
10
|
+
* src/lib/generated/ — CodeGen Angular output (one form per entity; do not edit)
|
|
11
|
+
* src/lib/form-panels/ — BaseFormPanel contributions (plan §6.4) — our UX, layered onto the
|
|
12
|
+
* GENERATED forms rather than replacing them
|
|
13
|
+
* src/lib/custom/ — the few bespoke components (the modification editor, §6.4 / D-22)
|
|
14
|
+
* src/lib/pages/ — BaseResourceComponent surfaces the nav points at (list, watchlist, …)
|
|
15
|
+
*
|
|
16
|
+
* THE V2 SHAPE, AND WHY IT IS SMALLER THAN V1'S. v1 replaced the generated Contract form with a
|
|
17
|
+
* custom one at priority 2 and hand-rolled a workspace/tab shell around it. v2 keeps every generated
|
|
18
|
+
* form registered and contributes panels into its slots — orders' current direction, adopted
|
|
19
|
+
* wholesale (plan §6.4). A full form replacement is a last resort; contracts expects to need none.
|
|
20
|
+
*/
|
|
21
|
+
import '@mj-biz-apps/contracts-entities';
|
|
22
|
+
import './lib/generated/generated-forms.module';
|
|
23
|
+
export { GeneratedFormsModule } from './lib/generated/generated-forms.module';
|
|
24
|
+
export { mjBizAppsContractsContractFormComponent } from './lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component';
|
|
25
|
+
export { mjBizAppsContractsContractTemplateFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component';
|
|
26
|
+
export { mjBizAppsContractsContractTemplateModificationFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component';
|
|
27
|
+
export { mjBizAppsContractsContractTemplateProvisionFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component';
|
|
28
|
+
export { mjBizAppsContractsContractTemplateTypeFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component';
|
|
29
|
+
export { mjBizAppsContractsContractTypeFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component';
|
|
30
|
+
export { MJCSectionBaseComponent, ContractsSectionResource, ContractsTemplatesSectionResource, ContractsConfigurationSectionResource, } from './lib/sections/contracts-sections.component';
|
|
31
|
+
export { MJCSectionShellComponent } from './lib/sections/section-shell.component';
|
|
32
|
+
export * from './lib/sections/section-nav.model';
|
|
33
|
+
export * from './lib/data/entity-names';
|
|
34
|
+
export { RecordFilesPanelBase, ContractFilesPanel, ContractTemplateFilesPanel } from './lib/form-panels/record-files.panel';
|
|
35
|
+
export { MJCContractHeroPanel, MJCContractDatesPanel, MJCContractRenewalPanel, MJCContractLineagePanel, } from './lib/form-panels/contract.panels';
|
|
36
|
+
export { MJCContractSupersedePanel } from './lib/form-panels/supersede.panel';
|
|
37
|
+
export { MJCOrganizationAgreementsPanel } from './lib/form-panels/organization.panels';
|
|
38
|
+
export * from './lib/pages/contract-grid.page';
|
|
39
|
+
export { MJCModificationsPageComponent } from './lib/pages/modifications.page';
|
|
40
|
+
export { MJCContractsDashboardPageComponent } from './lib/pages/contracts-dashboard.page';
|
|
41
|
+
export { MJCAgreementVersionsPageComponent, MJCAllProvisionsPageComponent } from './lib/pages/templates.page';
|
|
42
|
+
export { MJCContractTypesPageComponent, MJCTemplateTypesPageComponent, } from './lib/pages/configuration.page';
|
|
43
|
+
export declare function LoadMjBizappsContractsClient(): void;
|
|
44
|
+
//# sourceMappingURL=public-api.d.ts.map
|
|
@@ -0,0 +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;AAiBxC,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAC5H,OAAO,EACH,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AAuBvF,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,CAqBnD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @mj-biz-apps/contracts-ng — the CLIENT BOOTSTRAP package.
|
|
3
|
+
*
|
|
4
|
+
* This is the package named in mj-app.json under packages.client with role "bootstrap". When the app
|
|
5
|
+
* is installed (or dev-linked), MJExplorer's auto-generated open-app-bootstrap.generated.ts gains a
|
|
6
|
+
* static `import '@mj-biz-apps/contracts-ng';` — ESBuild bundles it and module evaluation fires the
|
|
7
|
+
* @RegisterClass decorators that make our components discoverable.
|
|
8
|
+
*
|
|
9
|
+
* WHAT LIVES HERE
|
|
10
|
+
* src/lib/generated/ — CodeGen Angular output (one form per entity; do not edit)
|
|
11
|
+
* src/lib/form-panels/ — BaseFormPanel contributions (plan §6.4) — our UX, layered onto the
|
|
12
|
+
* GENERATED forms rather than replacing them
|
|
13
|
+
* src/lib/custom/ — the few bespoke components (the modification editor, §6.4 / D-22)
|
|
14
|
+
* src/lib/pages/ — BaseResourceComponent surfaces the nav points at (list, watchlist, …)
|
|
15
|
+
*
|
|
16
|
+
* THE V2 SHAPE, AND WHY IT IS SMALLER THAN V1'S. v1 replaced the generated Contract form with a
|
|
17
|
+
* custom one at priority 2 and hand-rolled a workspace/tab shell around it. v2 keeps every generated
|
|
18
|
+
* form registered and contributes panels into its slots — orders' current direction, adopted
|
|
19
|
+
* wholesale (plan §6.4). A full form replacement is a last resort; contracts expects to need none.
|
|
20
|
+
*/
|
|
21
|
+
/* ============================================================================
|
|
22
|
+
* GENERATED FORMS. The side-effect imports fire the @RegisterClass decorators; the re-exports are
|
|
23
|
+
* what MJExplorer's class-registration manifest imports BY NAME. Without these exports the Explorer
|
|
24
|
+
* bundle fails to compile with TS2305 'has no exported member'.
|
|
25
|
+
* ========================================================================== */
|
|
26
|
+
import '@mj-biz-apps/contracts-entities';
|
|
27
|
+
import './lib/generated/generated-forms.module';
|
|
28
|
+
import { GeneratedFormsModule } from './lib/generated/generated-forms.module';
|
|
29
|
+
export { GeneratedFormsModule } from './lib/generated/generated-forms.module';
|
|
30
|
+
export { mjBizAppsContractsContractFormComponent } from './lib/generated/Entities/mjBizAppsContractsContract/mjbizappscontractscontract.form.component';
|
|
31
|
+
export { mjBizAppsContractsContractTemplateFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractTemplate/mjbizappscontractscontracttemplate.form.component';
|
|
32
|
+
export { mjBizAppsContractsContractTemplateModificationFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractTemplateModification/mjbizappscontractscontracttemplatemodification.form.component';
|
|
33
|
+
export { mjBizAppsContractsContractTemplateProvisionFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractTemplateProvision/mjbizappscontractscontracttemplateprovision.form.component';
|
|
34
|
+
export { mjBizAppsContractsContractTemplateTypeFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractTemplateType/mjbizappscontractscontracttemplatetype.form.component';
|
|
35
|
+
export { mjBizAppsContractsContractTypeFormComponent } from './lib/generated/Entities/mjBizAppsContractsContractType/mjbizappscontractscontracttype.form.component';
|
|
36
|
+
/* ============================================================================
|
|
37
|
+
* EXPLORER SECTIONS — the three top-level tabs. Each @RegisterClass key must match a DriverClass in
|
|
38
|
+
* metadata/applications/.contracts-application.json; that pairing is the entire wiring, and both
|
|
39
|
+
* halves are required — metadata without a class renders a dead tab, a class without metadata never
|
|
40
|
+
* appears.
|
|
41
|
+
* ========================================================================== */
|
|
42
|
+
import { ContractsConfigurationSectionResource, ContractsSectionResource, ContractsTemplatesSectionResource, } from './lib/sections/contracts-sections.component';
|
|
43
|
+
export { MJCSectionBaseComponent, ContractsSectionResource, ContractsTemplatesSectionResource, ContractsConfigurationSectionResource, } from './lib/sections/contracts-sections.component';
|
|
44
|
+
export { MJCSectionShellComponent } from './lib/sections/section-shell.component';
|
|
45
|
+
export * from './lib/sections/section-nav.model';
|
|
46
|
+
export * from './lib/data/entity-names';
|
|
47
|
+
/* ============================================================================
|
|
48
|
+
* FORM PANELS — the app's UX, contributed onto the GENERATED forms (plan §6.4) rather than replacing
|
|
49
|
+
* them. Every one of these mounts itself: the slot host discovers registrations, so nothing here is
|
|
50
|
+
* referenced by a template. That is exactly why the anchors at the bottom are load-bearing.
|
|
51
|
+
* ========================================================================== */
|
|
52
|
+
import { ContractFilesPanel, ContractTemplateFilesPanel } from './lib/form-panels/record-files.panel';
|
|
53
|
+
import { MJCContractDatesPanel, MJCContractHeroPanel, MJCContractLineagePanel, MJCContractRenewalPanel, } from './lib/form-panels/contract.panels';
|
|
54
|
+
import { MJCContractSupersedePanel } from './lib/form-panels/supersede.panel';
|
|
55
|
+
import { MJCOrganizationAgreementsPanel } from './lib/form-panels/organization.panels';
|
|
56
|
+
export { RecordFilesPanelBase, ContractFilesPanel, ContractTemplateFilesPanel } from './lib/form-panels/record-files.panel';
|
|
57
|
+
export { MJCContractHeroPanel, MJCContractDatesPanel, MJCContractRenewalPanel, MJCContractLineagePanel, } from './lib/form-panels/contract.panels';
|
|
58
|
+
export { MJCContractSupersedePanel } from './lib/form-panels/supersede.panel';
|
|
59
|
+
export { MJCOrganizationAgreementsPanel } from './lib/form-panels/organization.panels';
|
|
60
|
+
/* ============================================================================
|
|
61
|
+
* THE ONE SHARED CUSTOM COMPONENT (D-22) — the modification editor, rendered inline by the contract's
|
|
62
|
+
* Modifications panel. It is NOT a form replacement: the modification's own form is the GENERATED one.
|
|
63
|
+
*
|
|
64
|
+
* It used to be both. A priority-2 `BaseFormComponent` replacement (`MJCModificationFormComponent`)
|
|
65
|
+
* rendered this editor as the modification's whole form, loading the PARENT contract first so the
|
|
66
|
+
* editor could work through `contract.Modifications`. Opening a modification then showed nothing but
|
|
67
|
+
* "Loading the contract this modification belongs to…" — the parent load never completed the render,
|
|
68
|
+
* so the form had no fields, no dropdowns and no way to save. Deleted rather than debugged, because
|
|
69
|
+
* the generated form is strictly better here: CodeGen already emits `ContractID` and
|
|
70
|
+
* `ContractTemplateProvisionID` as `LinkType="Record"` fields, which `mj-form-field` renders as
|
|
71
|
+
* SEARCHABLE FK dropdowns, plus a `Modification Details` section holding `ModificationText` and
|
|
72
|
+
* `Notes`. That is exactly the shape a modification wants, and it is the same shape as creating a
|
|
73
|
+
* provision — which is what makes the two feel like one app.
|
|
74
|
+
*
|
|
75
|
+
* The lesson: replacing a form costs you every generated affordance (FK search, section grouping,
|
|
76
|
+
* validation display). Reach for a PANEL unless you are replacing all of it deliberately.
|
|
77
|
+
* ========================================================================== */
|
|
78
|
+
/* Pages are exported so another app (or a dashboard) can host one directly; the sections resolve them
|
|
79
|
+
* internally, so nothing here depends on these being exported. */
|
|
80
|
+
export * from './lib/pages/contract-grid.page';
|
|
81
|
+
export { MJCModificationsPageComponent } from './lib/pages/modifications.page';
|
|
82
|
+
export { MJCContractsDashboardPageComponent } from './lib/pages/contracts-dashboard.page';
|
|
83
|
+
export { MJCAgreementVersionsPageComponent, MJCAllProvisionsPageComponent } from './lib/pages/templates.page';
|
|
84
|
+
export { MJCContractTypesPageComponent, MJCTemplateTypesPageComponent, } from './lib/pages/configuration.page';
|
|
85
|
+
export function LoadMjBizappsContractsClient() {
|
|
86
|
+
// Importing the modules above is what registers everything; the references below are
|
|
87
|
+
// ANTI-TREE-SHAKE ANCHORS. Without a live use, a production build can drop an import whose class is
|
|
88
|
+
// never referenced — and a dropped registration is a nav tab that mounts nothing, or a panel that
|
|
89
|
+
// silently never appears, with no error either way. One anchor per registration, every time.
|
|
90
|
+
void GeneratedFormsModule;
|
|
91
|
+
// Sections — each is a nav tab.
|
|
92
|
+
void ContractsSectionResource;
|
|
93
|
+
void ContractsTemplatesSectionResource;
|
|
94
|
+
void ContractsConfigurationSectionResource;
|
|
95
|
+
// Panels — none of these is referenced by any template, so they exist only because of this.
|
|
96
|
+
void ContractFilesPanel;
|
|
97
|
+
void ContractTemplateFilesPanel;
|
|
98
|
+
void MJCContractHeroPanel;
|
|
99
|
+
void MJCContractDatesPanel;
|
|
100
|
+
void MJCContractRenewalPanel;
|
|
101
|
+
void MJCContractLineagePanel;
|
|
102
|
+
void MJCContractSupersedePanel;
|
|
103
|
+
void MJCOrganizationAgreementsPanel;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=public-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;gFAIgF;AAChF,OAAO,iCAAiC,CAAC;AACzC,OAAO,wCAAwC,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,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;AAEpK;;;;;gFAKgF;AAChF,OAAO,EACH,qCAAqC,EACrC,wBAAwB,EACxB,iCAAiC,GACpC,MAAM,6CAA6C,CAAC;AACrD,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;AAExC;;;;gFAIgF;AAChF,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AACtG,OAAO,EACH,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AAEvF,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAC5H,OAAO,EACH,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,8BAA8B,EAAE,MAAM,uCAAuC,CAAC;AAEvF;;;;;;;;;;;;;;;;;gFAiBgF;AAEhF;kEACkE;AAClE,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,MAAM,UAAU,4BAA4B;IACxC,qFAAqF;IACrF,oGAAoG;IACpG,kGAAkG;IAClG,6FAA6F;IAC7F,KAAK,oBAAoB,CAAC;IAE1B,gCAAgC;IAChC,KAAK,wBAAwB,CAAC;IAC9B,KAAK,iCAAiC,CAAC;IACvC,KAAK,qCAAqC,CAAC;IAE3C,4FAA4F;IAC5F,KAAK,kBAAkB,CAAC;IACxB,KAAK,0BAA0B,CAAC;IAChC,KAAK,oBAAoB,CAAC;IAC1B,KAAK,qBAAqB,CAAC;IAC3B,KAAK,uBAAuB,CAAC;IAC7B,KAAK,uBAAuB,CAAC;IAC7B,KAAK,yBAAyB,CAAC;IAC/B,KAAK,8BAA8B,CAAC;AACxC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
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
|
+
"name": "@mj-biz-apps/contracts-ng",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "Client bootstrap package - Angular components loaded by MJExplorer via the generated open-app bootstrap import. TODO(template): rename.",
|
|
7
|
+
"main": "dist/public-api.js",
|
|
8
|
+
"types": "dist/public-api.d.ts",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "https://github.com/MemberJunction/bizapps-contracts"
|
|
12
|
+
},
|
|
13
|
+
"license": "BUSL-1.1",
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@mj-biz-apps/contracts-entities": "^0.1.0"
|
|
16
|
+
},
|
|
17
|
+
"peerDependencies": {
|
|
18
|
+
"@angular/common": ">=21.0.0 <22.0.0",
|
|
19
|
+
"@angular/core": ">=21.0.0 <22.0.0",
|
|
20
|
+
"@angular/forms": ">=21.0.0 <22.0.0",
|
|
21
|
+
"@memberjunction/core": "^6.1.0-edge.3",
|
|
22
|
+
"@memberjunction/core-entities": "^6.1.0-edge.3",
|
|
23
|
+
"@memberjunction/global": "^6.1.0-edge.3",
|
|
24
|
+
"@memberjunction/graphql-dataprovider": "^6.1.0-edge.3",
|
|
25
|
+
"@memberjunction/ng-base-forms": "^6.1.0-edge.3",
|
|
26
|
+
"@memberjunction/ng-entity-viewer": "^6.1.0-edge.3",
|
|
27
|
+
"@memberjunction/ng-file-storage": "^6.1.0-edge.3",
|
|
28
|
+
"@memberjunction/ng-hierarchy-tree": "^6.1.0-edge.3",
|
|
29
|
+
"@memberjunction/ng-link-directives": "^6.1.0-edge.3",
|
|
30
|
+
"@memberjunction/ng-shared": "^6.1.0-edge.3",
|
|
31
|
+
"@memberjunction/ng-ui-components": "^6.1.0-edge.3"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@angular/compiler": "21.1.3",
|
|
35
|
+
"@angular/compiler-cli": "21.1.3",
|
|
36
|
+
"typescript": "^5.9.3",
|
|
37
|
+
"vitest": "^4.0.18"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"/dist"
|
|
41
|
+
],
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "ngc",
|
|
47
|
+
"test": "vitest run --passWithNoTests",
|
|
48
|
+
"test:watch": "vitest"
|
|
49
|
+
}
|
|
50
|
+
}
|